diff --git a/conf.py b/conf.py index 958eeed17..b1689a931 100644 --- a/conf.py +++ b/conf.py @@ -93,7 +93,8 @@ extension_dir = Path('extensions') sys.path.insert(0, str(extension_dir.absolute())) # Search for the directory of odoo sources to know whether autodoc should be used on the dev doc -odoo_sources_candidate_dirs = (Path('Odoo18'), Path('../Odoo18')) +# odoo_sources_candidate_dirs = (Path('Odoo18'), Path('../Odoo18')) +odoo_sources_candidate_dirs = (Path('odoo'), Path('../odoo')) odoo_sources_dirs = [ d for d in odoo_sources_candidate_dirs if d.is_dir() and (d / 'odoo-bin').exists() ] diff --git a/content/administration.rst b/content-rst/administration.rst similarity index 100% rename from content/administration.rst rename to content-rst/administration.rst diff --git a/content/administration/hosting.rst b/content-rst/administration/hosting.rst similarity index 100% rename from content/administration/hosting.rst rename to content-rst/administration/hosting.rst diff --git a/content/administration/mobile.rst b/content-rst/administration/mobile.rst similarity index 100% rename from content/administration/mobile.rst rename to content-rst/administration/mobile.rst diff --git a/content/administration/neutralized_database.rst b/content-rst/administration/neutralized_database.rst similarity index 100% rename from content/administration/neutralized_database.rst rename to content-rst/administration/neutralized_database.rst diff --git a/content/administration/odoo_accounts.rst b/content-rst/administration/odoo_accounts.rst similarity index 100% rename from content/administration/odoo_accounts.rst rename to content-rst/administration/odoo_accounts.rst diff --git a/content-rst/administration/odoo_accounts/delete-account.png b/content-rst/administration/odoo_accounts/delete-account.png new file mode 100644 index 000000000..0e179f0f9 Binary files /dev/null and b/content-rst/administration/odoo_accounts/delete-account.png differ diff --git a/content/administration/odoo_online.rst b/content-rst/administration/odoo_online.rst similarity index 100% rename from content/administration/odoo_online.rst rename to content-rst/administration/odoo_online.rst diff --git a/content-rst/administration/odoo_online/database-manager.png b/content-rst/administration/odoo_online/database-manager.png new file mode 100644 index 000000000..a3254d29a Binary files /dev/null and b/content-rst/administration/odoo_online/database-manager.png differ diff --git a/content-rst/administration/odoo_online/delete.png b/content-rst/administration/odoo_online/delete.png new file mode 100644 index 000000000..fb4a83687 Binary files /dev/null and b/content-rst/administration/odoo_online/delete.png differ diff --git a/content-rst/administration/odoo_online/invite-users.png b/content-rst/administration/odoo_online/invite-users.png new file mode 100644 index 000000000..73270d05e Binary files /dev/null and b/content-rst/administration/odoo_online/invite-users.png differ diff --git a/content/administration/odoo_sh.rst b/content-rst/administration/odoo_sh.rst similarity index 100% rename from content/administration/odoo_sh.rst rename to content-rst/administration/odoo_sh.rst diff --git a/content/administration/odoo_sh/advanced.rst b/content-rst/administration/odoo_sh/advanced.rst similarity index 100% rename from content/administration/odoo_sh/advanced.rst rename to content-rst/administration/odoo_sh/advanced.rst diff --git a/content/administration/odoo_sh/advanced/containers.rst b/content-rst/administration/odoo_sh/advanced/containers.rst similarity index 100% rename from content/administration/odoo_sh/advanced/containers.rst rename to content-rst/administration/odoo_sh/advanced/containers.rst diff --git a/content-rst/administration/odoo_sh/advanced/containers/pdb_sh.png b/content-rst/administration/odoo_sh/advanced/containers/pdb_sh.png new file mode 100644 index 000000000..aecb6c4af Binary files /dev/null and b/content-rst/administration/odoo_sh/advanced/containers/pdb_sh.png differ diff --git a/content/administration/odoo_sh/advanced/frequent_technical_questions.rst b/content-rst/administration/odoo_sh/advanced/frequent_technical_questions.rst similarity index 100% rename from content/administration/odoo_sh/advanced/frequent_technical_questions.rst rename to content-rst/administration/odoo_sh/advanced/frequent_technical_questions.rst diff --git a/content/administration/odoo_sh/advanced/submodules.rst b/content-rst/administration/odoo_sh/advanced/submodules.rst similarity index 100% rename from content/administration/odoo_sh/advanced/submodules.rst rename to content-rst/administration/odoo_sh/advanced/submodules.rst diff --git a/content-rst/administration/odoo_sh/advanced/submodules/advanced-submodules-button.png b/content-rst/administration/odoo_sh/advanced/submodules/advanced-submodules-button.png new file mode 100644 index 000000000..d884b0346 Binary files /dev/null and b/content-rst/administration/odoo_sh/advanced/submodules/advanced-submodules-button.png differ diff --git a/content-rst/administration/odoo_sh/advanced/submodules/advanced-submodules-dialog.png b/content-rst/administration/odoo_sh/advanced/submodules/advanced-submodules-dialog.png new file mode 100644 index 000000000..3a15d9098 Binary files /dev/null and b/content-rst/administration/odoo_sh/advanced/submodules/advanced-submodules-dialog.png differ diff --git a/content-rst/administration/odoo_sh/advanced/submodules/advanced-submodules-github-sshurl.png b/content-rst/administration/odoo_sh/advanced/submodules/advanced-submodules-github-sshurl.png new file mode 100644 index 000000000..9fd3bdc23 Binary files /dev/null and b/content-rst/administration/odoo_sh/advanced/submodules/advanced-submodules-github-sshurl.png differ diff --git a/content/administration/odoo_sh/getting_started.rst b/content-rst/administration/odoo_sh/getting_started.rst similarity index 100% rename from content/administration/odoo_sh/getting_started.rst rename to content-rst/administration/odoo_sh/getting_started.rst diff --git a/content/administration/odoo_sh/getting_started/branches.rst b/content-rst/administration/odoo_sh/getting_started/branches.rst similarity index 100% rename from content/administration/odoo_sh/getting_started/branches.rst rename to content-rst/administration/odoo_sh/getting_started/branches.rst diff --git a/content-rst/administration/odoo_sh/getting_started/branches/SSH-key-appearing.png b/content-rst/administration/odoo_sh/getting_started/branches/SSH-key-appearing.png new file mode 100644 index 000000000..d56cd2b34 Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/branches/SSH-key-appearing.png differ diff --git a/content-rst/administration/odoo_sh/getting_started/branches/SSH-key-pasting.png b/content-rst/administration/odoo_sh/getting_started/branches/SSH-key-pasting.png new file mode 100644 index 000000000..b32d403c4 Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/branches/SSH-key-pasting.png differ diff --git a/content-rst/administration/odoo_sh/getting_started/branches/SSH-panel.png b/content-rst/administration/odoo_sh/getting_started/branches/SSH-panel.png new file mode 100644 index 000000000..de4ee214a Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/branches/SSH-panel.png differ diff --git a/content-rst/administration/odoo_sh/getting_started/branches/interface-branches-backups.png b/content-rst/administration/odoo_sh/getting_started/branches/interface-branches-backups.png new file mode 100644 index 000000000..839aee3bc Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/branches/interface-branches-backups.png differ diff --git a/content-rst/administration/odoo_sh/getting_started/branches/interface-branches-editor.png b/content-rst/administration/odoo_sh/getting_started/branches/interface-branches-editor.png new file mode 100644 index 000000000..db98c80aa Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/branches/interface-branches-editor.png differ diff --git a/content-rst/administration/odoo_sh/getting_started/branches/interface-branches-history.png b/content-rst/administration/odoo_sh/getting_started/branches/interface-branches-history.png new file mode 100644 index 000000000..9bd0cda0e Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/branches/interface-branches-history.png differ diff --git a/content-rst/administration/odoo_sh/getting_started/branches/interface-branches-logs.png b/content-rst/administration/odoo_sh/getting_started/branches/interface-branches-logs.png new file mode 100644 index 000000000..0088a1f80 Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/branches/interface-branches-logs.png differ diff --git a/content-rst/administration/odoo_sh/getting_started/branches/interface-branches-mails.png b/content-rst/administration/odoo_sh/getting_started/branches/interface-branches-mails.png new file mode 100644 index 000000000..287bb8cf4 Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/branches/interface-branches-mails.png differ diff --git a/content-rst/administration/odoo_sh/getting_started/branches/interface-branches-merge.png b/content-rst/administration/odoo_sh/getting_started/branches/interface-branches-merge.png new file mode 100644 index 000000000..1f1958466 Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/branches/interface-branches-merge.png differ diff --git a/content-rst/administration/odoo_sh/getting_started/branches/interface-branches-monitoring.png b/content-rst/administration/odoo_sh/getting_started/branches/interface-branches-monitoring.png new file mode 100644 index 000000000..add60f9ff Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/branches/interface-branches-monitoring.png differ diff --git a/content-rst/administration/odoo_sh/getting_started/branches/interface-branches-settings.jpg b/content-rst/administration/odoo_sh/getting_started/branches/interface-branches-settings.jpg new file mode 100644 index 000000000..948a508fa Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/branches/interface-branches-settings.jpg differ diff --git a/content-rst/administration/odoo_sh/getting_started/branches/interface-branches-shell.png b/content-rst/administration/odoo_sh/getting_started/branches/interface-branches-shell.png new file mode 100644 index 000000000..92bebfc1c Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/branches/interface-branches-shell.png differ diff --git a/content-rst/administration/odoo_sh/getting_started/branches/interface-branches-shellcommands.png b/content-rst/administration/odoo_sh/getting_started/branches/interface-branches-shellcommands.png new file mode 100644 index 000000000..5cfb89d12 Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/branches/interface-branches-shellcommands.png differ diff --git a/content-rst/administration/odoo_sh/getting_started/branches/interface-branches-stagechange.png b/content-rst/administration/odoo_sh/getting_started/branches/interface-branches-stagechange.png new file mode 100644 index 000000000..61f5e7d89 Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/branches/interface-branches-stagechange.png differ diff --git a/content-rst/administration/odoo_sh/getting_started/branches/interface-branches.png b/content-rst/administration/odoo_sh/getting_started/branches/interface-branches.png new file mode 100644 index 000000000..156a2ed4f Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/branches/interface-branches.png differ diff --git a/content-rst/administration/odoo_sh/getting_started/branches/interface-settings-modulesinstallation.png b/content-rst/administration/odoo_sh/getting_started/branches/interface-settings-modulesinstallation.png new file mode 100644 index 000000000..ef4e3cec6 Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/branches/interface-settings-modulesinstallation.png differ diff --git a/content/administration/odoo_sh/getting_started/builds.rst b/content-rst/administration/odoo_sh/getting_started/builds.rst similarity index 100% rename from content/administration/odoo_sh/getting_started/builds.rst rename to content-rst/administration/odoo_sh/getting_started/builds.rst diff --git a/content-rst/administration/odoo_sh/getting_started/builds/interface-builds-branches.png b/content-rst/administration/odoo_sh/getting_started/builds/interface-builds-branches.png new file mode 100644 index 000000000..a2fc04077 Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/builds/interface-builds-branches.png differ diff --git a/content-rst/administration/odoo_sh/getting_started/builds/interface-builds-build-dropdown.png b/content-rst/administration/odoo_sh/getting_started/builds/interface-builds-build-dropdown.png new file mode 100644 index 000000000..17300a857 Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/builds/interface-builds-build-dropdown.png differ diff --git a/content-rst/administration/odoo_sh/getting_started/builds/interface-builds-build.png b/content-rst/administration/odoo_sh/getting_started/builds/interface-builds-build.png new file mode 100644 index 000000000..afb1ec653 Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/builds/interface-builds-build.png differ diff --git a/content-rst/administration/odoo_sh/getting_started/builds/interface-builds.png b/content-rst/administration/odoo_sh/getting_started/builds/interface-builds.png new file mode 100644 index 000000000..b82859595 Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/builds/interface-builds.png differ diff --git a/content/administration/odoo_sh/getting_started/create.rst b/content-rst/administration/odoo_sh/getting_started/create.rst similarity index 100% rename from content/administration/odoo_sh/getting_started/create.rst rename to content-rst/administration/odoo_sh/getting_started/create.rst diff --git a/content-rst/administration/odoo_sh/getting_started/create/create-import-online-backup.png b/content-rst/administration/odoo_sh/getting_started/create/create-import-online-backup.png new file mode 100644 index 000000000..5c45e213b Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/create/create-import-online-backup.png differ diff --git a/content-rst/administration/odoo_sh/getting_started/create/create-import-onpremise-backup-dialog.png b/content-rst/administration/odoo_sh/getting_started/create/create-import-onpremise-backup-dialog.png new file mode 100644 index 000000000..95d51ba91 Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/create/create-import-onpremise-backup-dialog.png differ diff --git a/content-rst/administration/odoo_sh/getting_started/create/create-import-onpremise-backup.png b/content-rst/administration/odoo_sh/getting_started/create/create-import-onpremise-backup.png new file mode 100644 index 000000000..a3cadc2a3 Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/create/create-import-onpremise-backup.png differ diff --git a/content-rst/administration/odoo_sh/getting_started/create/create-import-production-done.png b/content-rst/administration/odoo_sh/getting_started/create/create-import-production-done.png new file mode 100644 index 000000000..c327f04c1 Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/create/create-import-production-done.png differ diff --git a/content-rst/administration/odoo_sh/getting_started/create/create-import-production.png b/content-rst/administration/odoo_sh/getting_started/create/create-import-production.png new file mode 100644 index 000000000..6f560be84 Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/create/create-import-production.png differ diff --git a/content-rst/administration/odoo_sh/getting_started/create/deploy-done.png b/content-rst/administration/odoo_sh/getting_started/create/deploy-done.png new file mode 100644 index 000000000..e85fa58d8 Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/create/deploy-done.png differ diff --git a/content-rst/administration/odoo_sh/getting_started/create/deploy-form.png b/content-rst/administration/odoo_sh/getting_started/create/deploy-form.png new file mode 100644 index 000000000..2cb2c2451 Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/create/deploy-form.png differ diff --git a/content-rst/administration/odoo_sh/getting_started/create/deploy.png b/content-rst/administration/odoo_sh/getting_started/create/deploy.png new file mode 100644 index 000000000..84c21323f Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/create/deploy.png differ diff --git a/content-rst/administration/odoo_sh/getting_started/create/github-authorize.png b/content-rst/administration/odoo_sh/getting_started/create/github-authorize.png new file mode 100644 index 000000000..398a96d41 Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/create/github-authorize.png differ diff --git a/content-rst/administration/odoo_sh/getting_started/create/github-signin.png b/content-rst/administration/odoo_sh/getting_started/create/github-signin.png new file mode 100644 index 000000000..b06441707 Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/create/github-signin.png differ diff --git a/content/administration/odoo_sh/getting_started/first_module.rst b/content-rst/administration/odoo_sh/getting_started/first_module.rst similarity index 100% rename from content/administration/odoo_sh/getting_started/first_module.rst rename to content-rst/administration/odoo_sh/getting_started/first_module.rst diff --git a/content-rst/administration/odoo_sh/getting_started/first_module/firstmodule-development-+.png b/content-rst/administration/odoo_sh/getting_started/first_module/firstmodule-development-+.png new file mode 100644 index 000000000..501f19b83 Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/first_module/firstmodule-development-+.png differ diff --git a/content-rst/administration/odoo_sh/getting_started/first_module/firstmodule-development-editor-interface.png b/content-rst/administration/odoo_sh/getting_started/first_module/firstmodule-development-editor-interface.png new file mode 100644 index 000000000..bb059fbdb Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/first_module/firstmodule-development-editor-interface.png differ diff --git a/content-rst/administration/odoo_sh/getting_started/first_module/firstmodule-development-editor.png b/content-rst/administration/odoo_sh/getting_started/first_module/firstmodule-development-editor.png new file mode 100644 index 000000000..9ec91c61a Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/first_module/firstmodule-development-editor.png differ diff --git a/content-rst/administration/odoo_sh/getting_started/first_module/firstmodule-development-fork.png b/content-rst/administration/odoo_sh/getting_started/first_module/firstmodule-development-fork.png new file mode 100644 index 000000000..b243f538a Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/first_module/firstmodule-development-fork.png differ diff --git a/content-rst/administration/odoo_sh/getting_started/first_module/firstmodule-test-addachange-build.png b/content-rst/administration/odoo_sh/getting_started/first_module/firstmodule-test-addachange-build.png new file mode 100644 index 000000000..25a6e78aa Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/first_module/firstmodule-test-addachange-build.png differ diff --git a/content-rst/administration/odoo_sh/getting_started/first_module/firstmodule-test-branch-history.png b/content-rst/administration/odoo_sh/getting_started/first_module/firstmodule-test-branch-history.png new file mode 100644 index 000000000..497de1534 Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/first_module/firstmodule-test-branch-history.png differ diff --git a/content-rst/administration/odoo_sh/getting_started/first_module/firstmodule-test-branch.png b/content-rst/administration/odoo_sh/getting_started/first_module/firstmodule-test-branch.png new file mode 100644 index 000000000..cb4f403a5 Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/first_module/firstmodule-test-branch.png differ diff --git a/content-rst/administration/odoo_sh/getting_started/first_module/firstmodule-test-database.png b/content-rst/administration/odoo_sh/getting_started/first_module/firstmodule-test-database.png new file mode 100644 index 000000000..c76d39839 Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/first_module/firstmodule-test-database.png differ diff --git a/content-rst/administration/odoo_sh/getting_started/first_module/firstmodule-test-devinstaging.png b/content-rst/administration/odoo_sh/getting_started/first_module/firstmodule-test-devinstaging.png new file mode 100644 index 000000000..df1c80236 Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/first_module/firstmodule-test-devinstaging.png differ diff --git a/content-rst/administration/odoo_sh/getting_started/first_module/firstmodule-test-devtostaging.png b/content-rst/administration/odoo_sh/getting_started/first_module/firstmodule-test-devtostaging.png new file mode 100644 index 000000000..64b420e8f Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/first_module/firstmodule-test-devtostaging.png differ diff --git a/content-rst/administration/odoo_sh/getting_started/first_module/firstmodule-test-mergedinproduction.png b/content-rst/administration/odoo_sh/getting_started/first_module/firstmodule-test-mergedinproduction.png new file mode 100644 index 000000000..3d74a6870 Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/first_module/firstmodule-test-mergedinproduction.png differ diff --git a/content-rst/administration/odoo_sh/getting_started/first_module/firstmodule-test-mergedinstaging.png b/content-rst/administration/odoo_sh/getting_started/first_module/firstmodule-test-mergedinstaging.png new file mode 100644 index 000000000..1836e9799 Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/first_module/firstmodule-test-mergedinstaging.png differ diff --git a/content-rst/administration/odoo_sh/getting_started/first_module/firstmodule-test-mergeinproduction.png b/content-rst/administration/odoo_sh/getting_started/first_module/firstmodule-test-mergeinproduction.png new file mode 100644 index 000000000..13b12b80c Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/first_module/firstmodule-test-mergeinproduction.png differ diff --git a/content-rst/administration/odoo_sh/getting_started/first_module/firstmodule-test-mymoduleinapps.png b/content-rst/administration/odoo_sh/getting_started/first_module/firstmodule-test-mymoduleinapps.png new file mode 100644 index 000000000..f40584ed7 Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/first_module/firstmodule-test-mymoduleinapps.png differ diff --git a/content-rst/administration/odoo_sh/getting_started/first_module/firstmodule-test-updateappslist.png b/content-rst/administration/odoo_sh/getting_started/first_module/firstmodule-test-updateappslist.png new file mode 100644 index 000000000..acf5e3350 Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/first_module/firstmodule-test-updateappslist.png differ diff --git a/content-rst/administration/odoo_sh/getting_started/first_module/my_module.zip b/content-rst/administration/odoo_sh/getting_started/first_module/my_module.zip new file mode 100644 index 000000000..bea2d9223 Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/first_module/my_module.zip differ diff --git a/content/administration/odoo_sh/getting_started/online-editor.rst b/content-rst/administration/odoo_sh/getting_started/online-editor.rst similarity index 100% rename from content/administration/odoo_sh/getting_started/online-editor.rst rename to content-rst/administration/odoo_sh/getting_started/online-editor.rst diff --git a/content-rst/administration/odoo_sh/getting_started/online-editor/interface-editor-automaticreload.gif b/content-rst/administration/odoo_sh/getting_started/online-editor/interface-editor-automaticreload.gif new file mode 100644 index 000000000..36be2420c Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/online-editor/interface-editor-automaticreload.gif differ diff --git a/content-rst/administration/odoo_sh/getting_started/online-editor/interface-editor-commit-push.png b/content-rst/administration/odoo_sh/getting_started/online-editor/interface-editor-commit-push.png new file mode 100644 index 000000000..110c7ae34 Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/online-editor/interface-editor-commit-push.png differ diff --git a/content-rst/administration/odoo_sh/getting_started/online-editor/interface-editor-console-odoo-graph.png b/content-rst/administration/odoo_sh/getting_started/online-editor/interface-editor-console-odoo-graph.png new file mode 100644 index 000000000..dda714d3e Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/online-editor/interface-editor-console-odoo-graph.png differ diff --git a/content-rst/administration/odoo_sh/getting_started/online-editor/interface-editor-console-odoo-pretty.png b/content-rst/administration/odoo_sh/getting_started/online-editor/interface-editor-console-odoo-pretty.png new file mode 100644 index 000000000..0b545aff4 Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/online-editor/interface-editor-console-odoo-pretty.png differ diff --git a/content-rst/administration/odoo_sh/getting_started/online-editor/interface-editor-console-python-read-csv.png b/content-rst/administration/odoo_sh/getting_started/online-editor/interface-editor-console-python-read-csv.png new file mode 100644 index 000000000..264af9cf1 Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/online-editor/interface-editor-console-python-read-csv.png differ diff --git a/content-rst/administration/odoo_sh/getting_started/online-editor/interface-editor-open-file.png b/content-rst/administration/odoo_sh/getting_started/online-editor/interface-editor-open-file.png new file mode 100644 index 000000000..7719c8ef8 Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/online-editor/interface-editor-open-file.png differ diff --git a/content-rst/administration/odoo_sh/getting_started/online-editor/interface-editor-save-file.png b/content-rst/administration/odoo_sh/getting_started/online-editor/interface-editor-save-file.png new file mode 100644 index 000000000..d0e22eceb Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/online-editor/interface-editor-save-file.png differ diff --git a/content-rst/administration/odoo_sh/getting_started/online-editor/interface-editor-update-current-module.png b/content-rst/administration/odoo_sh/getting_started/online-editor/interface-editor-update-current-module.png new file mode 100644 index 000000000..c57472afa Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/online-editor/interface-editor-update-current-module.png differ diff --git a/content-rst/administration/odoo_sh/getting_started/online-editor/interface-editor.png b/content-rst/administration/odoo_sh/getting_started/online-editor/interface-editor.png new file mode 100644 index 000000000..ed51e596c Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/online-editor/interface-editor.png differ diff --git a/content/administration/odoo_sh/getting_started/settings.rst b/content-rst/administration/odoo_sh/getting_started/settings.rst similarity index 100% rename from content/administration/odoo_sh/getting_started/settings.rst rename to content-rst/administration/odoo_sh/getting_started/settings.rst diff --git a/content-rst/administration/odoo_sh/getting_started/settings/interface-settings-activation.png b/content-rst/administration/odoo_sh/getting_started/settings/interface-settings-activation.png new file mode 100644 index 000000000..362edfc8c Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/settings/interface-settings-activation.png differ diff --git a/content-rst/administration/odoo_sh/getting_started/settings/interface-settings-collaborators.png b/content-rst/administration/odoo_sh/getting_started/settings/interface-settings-collaborators.png new file mode 100644 index 000000000..3c0f07eab Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/settings/interface-settings-collaborators.png differ diff --git a/content-rst/administration/odoo_sh/getting_started/settings/interface-settings-projectname.png b/content-rst/administration/odoo_sh/getting_started/settings/interface-settings-projectname.png new file mode 100644 index 000000000..2ef44eaf1 Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/settings/interface-settings-projectname.png differ diff --git a/content-rst/administration/odoo_sh/getting_started/settings/interface-settings-public.png b/content-rst/administration/odoo_sh/getting_started/settings/interface-settings-public.png new file mode 100644 index 000000000..7bf144b7c Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/settings/interface-settings-public.png differ diff --git a/content-rst/administration/odoo_sh/getting_started/settings/interface-settings-staging-branches.png b/content-rst/administration/odoo_sh/getting_started/settings/interface-settings-staging-branches.png new file mode 100644 index 000000000..378c8eefd Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/settings/interface-settings-staging-branches.png differ diff --git a/content-rst/administration/odoo_sh/getting_started/settings/interface-settings-storage.png b/content-rst/administration/odoo_sh/getting_started/settings/interface-settings-storage.png new file mode 100644 index 000000000..91d62d6cd Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/settings/interface-settings-storage.png differ diff --git a/content-rst/administration/odoo_sh/getting_started/settings/interface-settings-submodules.png b/content-rst/administration/odoo_sh/getting_started/settings/interface-settings-submodules.png new file mode 100644 index 000000000..5d1453e07 Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/settings/interface-settings-submodules.png differ diff --git a/content-rst/administration/odoo_sh/getting_started/settings/interface-settings-workers.png b/content-rst/administration/odoo_sh/getting_started/settings/interface-settings-workers.png new file mode 100644 index 000000000..c5cb00a70 Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/settings/interface-settings-workers.png differ diff --git a/content-rst/administration/odoo_sh/getting_started/settings/interface-settings.png b/content-rst/administration/odoo_sh/getting_started/settings/interface-settings.png new file mode 100644 index 000000000..f6d830c60 Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/settings/interface-settings.png differ diff --git a/content/administration/odoo_sh/getting_started/status.rst b/content-rst/administration/odoo_sh/getting_started/status.rst similarity index 100% rename from content/administration/odoo_sh/getting_started/status.rst rename to content-rst/administration/odoo_sh/getting_started/status.rst diff --git a/content-rst/administration/odoo_sh/getting_started/status/interface-status.png b/content-rst/administration/odoo_sh/getting_started/status/interface-status.png new file mode 100644 index 000000000..010b7a470 Binary files /dev/null and b/content-rst/administration/odoo_sh/getting_started/status/interface-status.png differ diff --git a/content/administration/odoo_sh/overview.rst b/content-rst/administration/odoo_sh/overview.rst similarity index 100% rename from content/administration/odoo_sh/overview.rst rename to content-rst/administration/odoo_sh/overview.rst diff --git a/content/administration/odoo_sh/overview/introduction.rst b/content-rst/administration/odoo_sh/overview/introduction.rst similarity index 100% rename from content/administration/odoo_sh/overview/introduction.rst rename to content-rst/administration/odoo_sh/overview/introduction.rst diff --git a/content/administration/on_premise.rst b/content-rst/administration/on_premise.rst similarity index 100% rename from content/administration/on_premise.rst rename to content-rst/administration/on_premise.rst diff --git a/content-rst/administration/on_premise/add-more-users.png b/content-rst/administration/on_premise/add-more-users.png new file mode 100644 index 000000000..a6c607cd7 Binary files /dev/null and b/content-rst/administration/on_premise/add-more-users.png differ diff --git a/content/administration/on_premise/community_to_enterprise.rst b/content-rst/administration/on_premise/community_to_enterprise.rst similarity index 100% rename from content/administration/on_premise/community_to_enterprise.rst rename to content-rst/administration/on_premise/community_to_enterprise.rst diff --git a/content-rst/administration/on_premise/community_to_enterprise/db_manager.png b/content-rst/administration/on_premise/community_to_enterprise/db_manager.png new file mode 100644 index 000000000..9204fd4fd Binary files /dev/null and b/content-rst/administration/on_premise/community_to_enterprise/db_manager.png differ diff --git a/content-rst/administration/on_premise/community_to_enterprise/enterprise_code.png b/content-rst/administration/on_premise/community_to_enterprise/enterprise_code.png new file mode 100644 index 000000000..0ce3cca90 Binary files /dev/null and b/content-rst/administration/on_premise/community_to_enterprise/enterprise_code.png differ diff --git a/content-rst/administration/on_premise/community_to_enterprise/windows_setup.png b/content-rst/administration/on_premise/community_to_enterprise/windows_setup.png new file mode 100644 index 000000000..6926bd3a4 Binary files /dev/null and b/content-rst/administration/on_premise/community_to_enterprise/windows_setup.png differ diff --git a/content-rst/administration/on_premise/community_to_enterprise/windows_uninstall.png b/content-rst/administration/on_premise/community_to_enterprise/windows_uninstall.png new file mode 100644 index 000000000..e2a0cf421 Binary files /dev/null and b/content-rst/administration/on_premise/community_to_enterprise/windows_uninstall.png differ diff --git a/content-rst/administration/on_premise/database-expired.png b/content-rst/administration/on_premise/database-expired.png new file mode 100644 index 000000000..87075026a Binary files /dev/null and b/content-rst/administration/on_premise/database-expired.png differ diff --git a/content/administration/on_premise/deploy.rst b/content-rst/administration/on_premise/deploy.rst similarity index 100% rename from content/administration/on_premise/deploy.rst rename to content-rst/administration/on_premise/deploy.rst diff --git a/content/administration/on_premise/email_gateway.rst b/content-rst/administration/on_premise/email_gateway.rst similarity index 100% rename from content/administration/on_premise/email_gateway.rst rename to content-rst/administration/on_premise/email_gateway.rst diff --git a/content-rst/administration/on_premise/error-message-sub-code.png b/content-rst/administration/on_premise/error-message-sub-code.png new file mode 100644 index 000000000..b8c102362 Binary files /dev/null and b/content-rst/administration/on_premise/error-message-sub-code.png differ diff --git a/content/administration/on_premise/geo_ip.rst b/content-rst/administration/on_premise/geo_ip.rst similarity index 100% rename from content/administration/on_premise/geo_ip.rst rename to content-rst/administration/on_premise/geo_ip.rst diff --git a/content/administration/on_premise/packages.rst b/content-rst/administration/on_premise/packages.rst similarity index 100% rename from content/administration/on_premise/packages.rst rename to content-rst/administration/on_premise/packages.rst diff --git a/content/administration/on_premise/source.rst b/content-rst/administration/on_premise/source.rst similarity index 100% rename from content/administration/on_premise/source.rst rename to content-rst/administration/on_premise/source.rst diff --git a/content-rst/administration/on_premise/unlink-db-name-collision.png b/content-rst/administration/on_premise/unlink-db-name-collision.png new file mode 100644 index 000000000..a718162ef Binary files /dev/null and b/content-rst/administration/on_premise/unlink-db-name-collision.png differ diff --git a/content/administration/on_premise/update.rst b/content-rst/administration/on_premise/update.rst similarity index 100% rename from content/administration/on_premise/update.rst rename to content-rst/administration/on_premise/update.rst diff --git a/content/administration/supported_versions.rst b/content-rst/administration/supported_versions.rst similarity index 100% rename from content/administration/supported_versions.rst rename to content-rst/administration/supported_versions.rst diff --git a/content/administration/upgrade.rst b/content-rst/administration/upgrade.rst similarity index 100% rename from content/administration/upgrade.rst rename to content-rst/administration/upgrade.rst diff --git a/content-rst/administration/upgrade/access-upgraded-db.png b/content-rst/administration/upgrade/access-upgraded-db.png new file mode 100644 index 000000000..a6dfcc518 Binary files /dev/null and b/content-rst/administration/upgrade/access-upgraded-db.png differ diff --git a/content-rst/administration/upgrade/databases-page.png b/content-rst/administration/upgrade/databases-page.png new file mode 100644 index 000000000..1105fd1d3 Binary files /dev/null and b/content-rst/administration/upgrade/databases-page.png differ diff --git a/content-rst/administration/upgrade/odoo-sh-message.png b/content-rst/administration/upgrade/odoo-sh-message.png new file mode 100644 index 000000000..db8c7ec48 Binary files /dev/null and b/content-rst/administration/upgrade/odoo-sh-message.png differ diff --git a/content-rst/administration/upgrade/odoo-sh-prod.png b/content-rst/administration/upgrade/odoo-sh-prod.png new file mode 100644 index 000000000..1ce8eb1ba Binary files /dev/null and b/content-rst/administration/upgrade/odoo-sh-prod.png differ diff --git a/content-rst/administration/upgrade/odoo-sh-staging.png b/content-rst/administration/upgrade/odoo-sh-staging.png new file mode 100644 index 000000000..4dbe83d87 Binary files /dev/null and b/content-rst/administration/upgrade/odoo-sh-staging.png differ diff --git a/content-rst/administration/upgrade/rr-upgrade-message.png b/content-rst/administration/upgrade/rr-upgrade-message.png new file mode 100644 index 000000000..c906c8c4e Binary files /dev/null and b/content-rst/administration/upgrade/rr-upgrade-message.png differ diff --git a/content-rst/administration/upgrade/upgrade-popup.png b/content-rst/administration/upgrade/upgrade-popup.png new file mode 100644 index 000000000..8be275bef Binary files /dev/null and b/content-rst/administration/upgrade/upgrade-popup.png differ diff --git a/content/applications.rst b/content-rst/applications.rst similarity index 100% rename from content/applications.rst rename to content-rst/applications.rst diff --git a/content/applications/essentials.rst b/content-rst/applications/essentials.rst similarity index 100% rename from content/applications/essentials.rst rename to content-rst/applications/essentials.rst diff --git a/content/applications/essentials/activities.rst b/content-rst/applications/essentials/activities.rst similarity index 100% rename from content/applications/essentials/activities.rst rename to content-rst/applications/essentials/activities.rst diff --git a/content-rst/applications/essentials/activities/activities-menu.png b/content-rst/applications/essentials/activities/activities-menu.png new file mode 100644 index 000000000..6a0f7fc7d Binary files /dev/null and b/content-rst/applications/essentials/activities/activities-menu.png differ diff --git a/content-rst/applications/essentials/activities/activities.png b/content-rst/applications/essentials/activities/activities.png new file mode 100644 index 000000000..e73c420ab Binary files /dev/null and b/content-rst/applications/essentials/activities/activities.png differ diff --git a/content-rst/applications/essentials/activities/activity-list.png b/content-rst/applications/essentials/activities/activity-list.png new file mode 100644 index 000000000..7f550b65b Binary files /dev/null and b/content-rst/applications/essentials/activities/activity-list.png differ diff --git a/content-rst/applications/essentials/activities/activity-view.png b/content-rst/applications/essentials/activities/activity-view.png new file mode 100644 index 000000000..2ea04829d Binary files /dev/null and b/content-rst/applications/essentials/activities/activity-view.png differ diff --git a/content-rst/applications/essentials/activities/chatter.png b/content-rst/applications/essentials/activities/chatter.png new file mode 100644 index 000000000..53d791845 Binary files /dev/null and b/content-rst/applications/essentials/activities/chatter.png differ diff --git a/content-rst/applications/essentials/activities/new-activity.png b/content-rst/applications/essentials/activities/new-activity.png new file mode 100644 index 000000000..1ba2c3c12 Binary files /dev/null and b/content-rst/applications/essentials/activities/new-activity.png differ diff --git a/content-rst/applications/essentials/activities/request-doc.png b/content-rst/applications/essentials/activities/request-doc.png new file mode 100644 index 000000000..aa4911d29 Binary files /dev/null and b/content-rst/applications/essentials/activities/request-doc.png differ diff --git a/content-rst/applications/essentials/activities/schedule-kanban-activity.png b/content-rst/applications/essentials/activities/schedule-kanban-activity.png new file mode 100644 index 000000000..2b607de14 Binary files /dev/null and b/content-rst/applications/essentials/activities/schedule-kanban-activity.png differ diff --git a/content-rst/applications/essentials/activities/schedule-list-activity.png b/content-rst/applications/essentials/activities/schedule-list-activity.png new file mode 100644 index 000000000..a37879ebe Binary files /dev/null and b/content-rst/applications/essentials/activities/schedule-list-activity.png differ diff --git a/content-rst/applications/essentials/activities/schedule-pop-up.png b/content-rst/applications/essentials/activities/schedule-pop-up.png new file mode 100644 index 000000000..efea36d3d Binary files /dev/null and b/content-rst/applications/essentials/activities/schedule-pop-up.png differ diff --git a/content-rst/applications/essentials/activities/settings-activities-types.png b/content-rst/applications/essentials/activities/settings-activities-types.png new file mode 100644 index 000000000..c146d3c3e Binary files /dev/null and b/content-rst/applications/essentials/activities/settings-activities-types.png differ diff --git a/content/applications/essentials/contacts.rst b/content-rst/applications/essentials/contacts.rst similarity index 100% rename from content/applications/essentials/contacts.rst rename to content-rst/applications/essentials/contacts.rst diff --git a/content-rst/applications/essentials/contacts/contact-form-add-address.png b/content-rst/applications/essentials/contacts/contact-form-add-address.png new file mode 100644 index 000000000..0e20afd02 Binary files /dev/null and b/content-rst/applications/essentials/contacts/contact-form-add-address.png differ diff --git a/content-rst/applications/essentials/contacts/create-contact-window.png b/content-rst/applications/essentials/contacts/create-contact-window.png new file mode 100644 index 000000000..9a289c2dd Binary files /dev/null and b/content-rst/applications/essentials/contacts/create-contact-window.png differ diff --git a/content/applications/essentials/contacts/merge.rst b/content-rst/applications/essentials/contacts/merge.rst similarity index 100% rename from content/applications/essentials/contacts/merge.rst rename to content-rst/applications/essentials/contacts/merge.rst diff --git a/content-rst/applications/essentials/contacts/merge/merge-menu.png b/content-rst/applications/essentials/contacts/merge/merge-menu.png new file mode 100644 index 000000000..e2206426b Binary files /dev/null and b/content-rst/applications/essentials/contacts/merge/merge-menu.png differ diff --git a/content-rst/applications/essentials/contacts/merge/merge-window.png b/content-rst/applications/essentials/contacts/merge/merge-window.png new file mode 100644 index 000000000..a82d92efc Binary files /dev/null and b/content-rst/applications/essentials/contacts/merge/merge-window.png differ diff --git a/content/applications/essentials/export_import_data.rst b/content-rst/applications/essentials/export_import_data.rst similarity index 100% rename from content/applications/essentials/export_import_data.rst rename to content-rst/applications/essentials/export_import_data.rst diff --git a/content-rst/applications/essentials/export_import_data/External_id_3rd_party_application_product_categories.csv b/content-rst/applications/essentials/export_import_data/External_id_3rd_party_application_product_categories.csv new file mode 100644 index 000000000..541cb39c5 --- /dev/null +++ b/content-rst/applications/essentials/export_import_data/External_id_3rd_party_application_product_categories.csv @@ -0,0 +1,6 @@ +External ID,Name,Parent Category/External ID +a1,Expenses,product.product_category_all +a2,Other Products,product.product_category_all +a3,Sellable Products,product.product_category_all +a4,Tables,a1 +a5,Seating furniture,a2 diff --git a/content-rst/applications/essentials/export_import_data/External_id_3rd_party_application_products.csv b/content-rst/applications/essentials/export_import_data/External_id_3rd_party_application_products.csv new file mode 100644 index 000000000..3cac68e9e --- /dev/null +++ b/content-rst/applications/essentials/export_import_data/External_id_3rd_party_application_products.csv @@ -0,0 +1,6 @@ +External ID,Name,Internal Reference,Category/External ID,Can be Expensed,Can be Purchased,Can be Sold,Sale Price,Cost,Supply Method,Product Type,Procurement Method +a6,Aluminum Stool,ALS,a5,False,True,True,49.00,25.00,Buy,Stockable Product,Make to Stock +a7,Chair,CHR,a5,False,True,True,89.00,40.00,Buy,Stockable Product,Make to Stock +a8,Table,TBL,a4,False,True,True,169.00,100.00,Buy,Stockable Product,Make to Stock +a9,Software Book Tutorial,SBT,a2,False,True,False,19.00,8.00,Buy,Consumable,Make to Stock +a10,Fuel,FL,a1,True,False,False,0.30,0.25,Buy,Service,Make to Stock diff --git a/content-rst/applications/essentials/export_import_data/advanced-import.png b/content-rst/applications/essentials/export_import_data/advanced-import.png new file mode 100644 index 000000000..763e5659b Binary files /dev/null and b/content-rst/applications/essentials/export_import_data/advanced-import.png differ diff --git a/content-rst/applications/essentials/export_import_data/database_import_test.sql b/content-rst/applications/essentials/export_import_data/database_import_test.sql new file mode 100644 index 000000000..4890c0682 --- /dev/null +++ b/content-rst/applications/essentials/export_import_data/database_import_test.sql @@ -0,0 +1,154 @@ +-- +-- PostgreSQL database dump +-- + +SET statement_timeout = 0; +SET client_encoding = 'UTF8'; +SET standard_conforming_strings = off; +SET check_function_bodies = false; +SET client_min_messages = warning; +SET escape_string_warning = off; + +SET search_path = public, pg_catalog; + +SET default_tablespace = ''; + +SET default_with_oids = false; + +-- +-- Name: companies; Type: TABLE; Schema: public; Owner: fp; Tablespace: +-- + +CREATE TABLE companies ( + id integer NOT NULL, + company_name character varying +); + + +ALTER TABLE public.companies OWNER TO fp; + +-- +-- Name: companies_id_seq; Type: SEQUENCE; Schema: public; Owner: fp +-- + +CREATE SEQUENCE companies_id_seq + START WITH 1 + INCREMENT BY 1 + NO MAXVALUE + NO MINVALUE + CACHE 1; + + +ALTER TABLE public.companies_id_seq OWNER TO fp; + +-- +-- Name: companies_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: fp +-- + +ALTER SEQUENCE companies_id_seq OWNED BY companies.id; + + +-- +-- Name: companies_id_seq; Type: SEQUENCE SET; Schema: public; Owner: fp +-- + +SELECT pg_catalog.setval('companies_id_seq', 3, true); + + +-- +-- Name: persons; Type: TABLE; Schema: public; Owner: fp; Tablespace: +-- + +CREATE TABLE persons ( + id integer NOT NULL, + company_id integer, + person_name character varying +); + + +ALTER TABLE public.persons OWNER TO fp; + +-- +-- Name: persons_id_seq; Type: SEQUENCE; Schema: public; Owner: fp +-- + +CREATE SEQUENCE persons_id_seq + START WITH 1 + INCREMENT BY 1 + NO MAXVALUE + NO MINVALUE + CACHE 1; + + +ALTER TABLE public.persons_id_seq OWNER TO fp; + +-- +-- Name: persons_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: fp +-- + +ALTER SEQUENCE persons_id_seq OWNED BY persons.id; + + +-- +-- Name: persons_id_seq; Type: SEQUENCE SET; Schema: public; Owner: fp +-- + +SELECT pg_catalog.setval('persons_id_seq', 4, true); + + +-- +-- Name: id; Type: DEFAULT; Schema: public; Owner: fp +-- + +ALTER TABLE ONLY companies ALTER COLUMN id SET DEFAULT nextval('companies_id_seq'::regclass); + + +-- +-- Name: id; Type: DEFAULT; Schema: public; Owner: fp +-- + +ALTER TABLE ONLY persons ALTER COLUMN id SET DEFAULT nextval('persons_id_seq'::regclass); + + +-- +-- Data for Name: companies; Type: TABLE DATA; Schema: public; Owner: fp +-- + +COPY companies (id, company_name) FROM stdin; +1 Bigees +2 Organi +3 Boum +\. + + +-- +-- Data for Name: persons; Type: TABLE DATA; Schema: public; Owner: fp +-- + +COPY persons (id, company_id, person_name) FROM stdin; +1 1 Fabien +2 1 Laurence +3 2 Eric +4 3 Ramsy +\. + + +-- +-- Name: companies_pkey; Type: CONSTRAINT; Schema: public; Owner: fp; Tablespace: +-- + +ALTER TABLE ONLY companies + ADD CONSTRAINT companies_pkey PRIMARY KEY (id); + + +-- +-- Name: persons_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: fp +-- + +ALTER TABLE ONLY persons + ADD CONSTRAINT persons_company_id_fkey FOREIGN KEY (company_id) REFERENCES companies(id); + + +-- +-- PostgreSQL database dump complete +-- diff --git a/content-rst/applications/essentials/export_import_data/dragdown.gif b/content-rst/applications/essentials/export_import_data/dragdown.gif new file mode 100644 index 000000000..edfb7decd Binary files /dev/null and b/content-rst/applications/essentials/export_import_data/dragdown.gif differ diff --git a/content-rst/applications/essentials/export_import_data/export-data-overview.png b/content-rst/applications/essentials/export_import_data/export-data-overview.png new file mode 100644 index 000000000..faac491ee Binary files /dev/null and b/content-rst/applications/essentials/export_import_data/export-data-overview.png differ diff --git a/content-rst/applications/essentials/export_import_data/field_list.png b/content-rst/applications/essentials/export_import_data/field_list.png new file mode 100644 index 000000000..19fccbbb9 Binary files /dev/null and b/content-rst/applications/essentials/export_import_data/field_list.png differ diff --git a/content-rst/applications/essentials/export_import_data/import-button.png b/content-rst/applications/essentials/export_import_data/import-button.png new file mode 100644 index 000000000..f1bdf18aa Binary files /dev/null and b/content-rst/applications/essentials/export_import_data/import-button.png differ diff --git a/content-rst/applications/essentials/export_import_data/list-view-export.png b/content-rst/applications/essentials/export_import_data/list-view-export.png new file mode 100644 index 000000000..58f9dcb06 Binary files /dev/null and b/content-rst/applications/essentials/export_import_data/list-view-export.png differ diff --git a/content-rst/applications/essentials/export_import_data/m2m_customers_tags.csv b/content-rst/applications/essentials/export_import_data/m2m_customers_tags.csv new file mode 100644 index 000000000..c8384315b --- /dev/null +++ b/content-rst/applications/essentials/export_import_data/m2m_customers_tags.csv @@ -0,0 +1,6 @@ +Name,Reference,Tags,Customer,Street,City,Country +Credit & Leasing,3,Services,True,Central Avenue 814,Johannesburg,South Africa +Services & Finance,5,"Consultancy Services,IT Services",True,Grove Road 5,London,United Kingdom +Hydra Supplies,6,"Manufacturer,Retailer",True,Palm Street 9,Los Angeles,United States +Bolts & Screws,8,"Wholesaler,Components Buyer",True,Rua Américo 1000,Campinas,Brazil +National Parts & Supplies,18,"Manufacturer,Wholesaler",True,Guangdong Way 20,Shenzen,China diff --git a/content-rst/applications/essentials/export_import_data/o2m_customers_contacts.csv b/content-rst/applications/essentials/export_import_data/o2m_customers_contacts.csv new file mode 100644 index 000000000..bf142142d --- /dev/null +++ b/content-rst/applications/essentials/export_import_data/o2m_customers_contacts.csv @@ -0,0 +1,9 @@ +Name,Is a company,Related company,Address type,Customer,Supplier,Street,ZIP,City,State,Country +Aurora Shelves,1,,,1,0,25 Pacific Road,95101,San José,CA,United States +Roger Martins,0,Aurora Shelves,Invoice address,1,0,27 Pacific Road,95102,San José,CA,United States +House Sales Direct,1,,,1,0,104 Saint Mary Avenue,94059,Redwood,CA,United States +Yvan Holiday,0,House Sales Direct,Contact,1,0,104 Saint Mary Avenue,94060,Redwood,CA,United States +Jack Unsworth,0,House Sales Direct,Invoice address,1,0,227 Jackson Road,94061,Redwood,CA,United States +Michael Mason,0,,,1,0,16 5th Avenue,94104,San Francisco,CA,United States +International Wood,1,,,1,0,748 White House Boulevard,20004,Washington,DC,United States +Sharon Pecker,0,International Wood,Invoice address,1,0,755 White House Boulevard,20005,Washington,DC,United States diff --git a/content-rst/applications/essentials/export_import_data/o2m_purchase_order_lines.csv b/content-rst/applications/essentials/export_import_data/o2m_purchase_order_lines.csv new file mode 100644 index 000000000..8cc140075 --- /dev/null +++ b/content-rst/applications/essentials/export_import_data/o2m_purchase_order_lines.csv @@ -0,0 +1,10 @@ +Order Date,Order Reference,Supplier,Destination,Pricelist,Order Lines / Product,Order Lines / Quantity +2012-12-15,PO00008,ASUSTeK,Stock,Default Purchase Pricelist,ADPT,20 +,,,,,CARD,30 +,,,,,C-Case,40 +2012-12-15,PO00009,Axelor,Stock,Default Purchase Pricelist,CD,5 +,,,,,CPUa8,15 +2012-12-15,PO000010,China Export,Stock,Default Purchase Pricelist,HDD SH-1,10 +,,,,,HDD SH-2,20 +,,,,,LAP-CUS,35 +,,,,,LAP-E5,40 diff --git a/content-rst/applications/essentials/export_import_data/purchase.order_functional_error_line_cant_adpat.csv b/content-rst/applications/essentials/export_import_data/purchase.order_functional_error_line_cant_adpat.csv new file mode 100644 index 000000000..1de118c6a --- /dev/null +++ b/content-rst/applications/essentials/export_import_data/purchase.order_functional_error_line_cant_adpat.csv @@ -0,0 +1,6 @@ +"Order Reference","Supplier","Destination","Pricelist","Order Lines / Product","Order Lines / Quantity" +"PO000020","ASUSTeK","Stock","Default Purchase Pricelist","ADPT",20 +,,,,"CARD",30 +,,,,"C-Case",40 +"PO000021","Axelor","Stock","Default Purchase Pricelist","CD",5 +,,,,"CPUa8",15 diff --git a/content/applications/essentials/in_app_purchase.rst b/content-rst/applications/essentials/in_app_purchase.rst similarity index 100% rename from content/applications/essentials/in_app_purchase.rst rename to content-rst/applications/essentials/in_app_purchase.rst diff --git a/content-rst/applications/essentials/in_app_purchase/buy-pack.png b/content-rst/applications/essentials/in_app_purchase/buy-pack.png new file mode 100644 index 000000000..36f789f35 Binary files /dev/null and b/content-rst/applications/essentials/in_app_purchase/buy-pack.png differ diff --git a/content-rst/applications/essentials/in_app_purchase/iap.png b/content-rst/applications/essentials/in_app_purchase/iap.png new file mode 100644 index 000000000..1a0749dc5 Binary files /dev/null and b/content-rst/applications/essentials/in_app_purchase/iap.png differ diff --git a/content-rst/applications/essentials/in_app_purchase/packs.png b/content-rst/applications/essentials/in_app_purchase/packs.png new file mode 100644 index 000000000..55672e636 Binary files /dev/null and b/content-rst/applications/essentials/in_app_purchase/packs.png differ diff --git a/content-rst/applications/essentials/in_app_purchase/sms-icon.png b/content-rst/applications/essentials/in_app_purchase/sms-icon.png new file mode 100644 index 000000000..a9a7a3a7a Binary files /dev/null and b/content-rst/applications/essentials/in_app_purchase/sms-icon.png differ diff --git a/content-rst/applications/essentials/in_app_purchase/view-services.png b/content-rst/applications/essentials/in_app_purchase/view-services.png new file mode 100644 index 000000000..b245e372e Binary files /dev/null and b/content-rst/applications/essentials/in_app_purchase/view-services.png differ diff --git a/content/applications/essentials/keyboard_shortcuts.rst b/content-rst/applications/essentials/keyboard_shortcuts.rst similarity index 100% rename from content/applications/essentials/keyboard_shortcuts.rst rename to content-rst/applications/essentials/keyboard_shortcuts.rst diff --git a/content-rst/applications/essentials/keyboard_shortcuts/command-palete.png b/content-rst/applications/essentials/keyboard_shortcuts/command-palete.png new file mode 100644 index 000000000..30b8857e7 Binary files /dev/null and b/content-rst/applications/essentials/keyboard_shortcuts/command-palete.png differ diff --git a/content-rst/applications/essentials/keyboard_shortcuts/menu-shortcuts.png b/content-rst/applications/essentials/keyboard_shortcuts/menu-shortcuts.png new file mode 100644 index 000000000..0c0699ee1 Binary files /dev/null and b/content-rst/applications/essentials/keyboard_shortcuts/menu-shortcuts.png differ diff --git a/content/applications/essentials/reporting.rst b/content-rst/applications/essentials/reporting.rst similarity index 100% rename from content/applications/essentials/reporting.rst rename to content-rst/applications/essentials/reporting.rst diff --git a/content-rst/applications/essentials/reporting/bar.png b/content-rst/applications/essentials/reporting/bar.png new file mode 100644 index 000000000..6729de048 Binary files /dev/null and b/content-rst/applications/essentials/reporting/bar.png differ diff --git a/content-rst/applications/essentials/reporting/comparison.png b/content-rst/applications/essentials/reporting/comparison.png new file mode 100644 index 000000000..d89b2fd6b Binary files /dev/null and b/content-rst/applications/essentials/reporting/comparison.png differ diff --git a/content-rst/applications/essentials/reporting/cumulative.png b/content-rst/applications/essentials/reporting/cumulative.png new file mode 100644 index 000000000..614c74dfe Binary files /dev/null and b/content-rst/applications/essentials/reporting/cumulative.png differ diff --git a/content-rst/applications/essentials/reporting/graph-button.png b/content-rst/applications/essentials/reporting/graph-button.png new file mode 100644 index 000000000..23ce036f8 Binary files /dev/null and b/content-rst/applications/essentials/reporting/graph-button.png differ diff --git a/content-rst/applications/essentials/reporting/line.png b/content-rst/applications/essentials/reporting/line.png new file mode 100644 index 000000000..46cd00c66 Binary files /dev/null and b/content-rst/applications/essentials/reporting/line.png differ diff --git a/content-rst/applications/essentials/reporting/measures.png b/content-rst/applications/essentials/reporting/measures.png new file mode 100644 index 000000000..c8f5c1375 Binary files /dev/null and b/content-rst/applications/essentials/reporting/measures.png differ diff --git a/content-rst/applications/essentials/reporting/multiple-groups.png b/content-rst/applications/essentials/reporting/multiple-groups.png new file mode 100644 index 000000000..0c62ebd8f Binary files /dev/null and b/content-rst/applications/essentials/reporting/multiple-groups.png differ diff --git a/content-rst/applications/essentials/reporting/non-cumulative.png b/content-rst/applications/essentials/reporting/non-cumulative.png new file mode 100644 index 000000000..601be36dd Binary files /dev/null and b/content-rst/applications/essentials/reporting/non-cumulative.png differ diff --git a/content-rst/applications/essentials/reporting/non-stacked-bar.png b/content-rst/applications/essentials/reporting/non-stacked-bar.png new file mode 100644 index 000000000..d0312e415 Binary files /dev/null and b/content-rst/applications/essentials/reporting/non-stacked-bar.png differ diff --git a/content-rst/applications/essentials/reporting/non-stacked-line.png b/content-rst/applications/essentials/reporting/non-stacked-line.png new file mode 100644 index 000000000..23edf4482 Binary files /dev/null and b/content-rst/applications/essentials/reporting/non-stacked-line.png differ diff --git a/content-rst/applications/essentials/reporting/pie.png b/content-rst/applications/essentials/reporting/pie.png new file mode 100644 index 000000000..d86b810ab Binary files /dev/null and b/content-rst/applications/essentials/reporting/pie.png differ diff --git a/content-rst/applications/essentials/reporting/pivot-button.png b/content-rst/applications/essentials/reporting/pivot-button.png new file mode 100644 index 000000000..7da35aad1 Binary files /dev/null and b/content-rst/applications/essentials/reporting/pivot-button.png differ diff --git a/content-rst/applications/essentials/reporting/single-group.png b/content-rst/applications/essentials/reporting/single-group.png new file mode 100644 index 000000000..ad068555c Binary files /dev/null and b/content-rst/applications/essentials/reporting/single-group.png differ diff --git a/content-rst/applications/essentials/reporting/stacked-bar.png b/content-rst/applications/essentials/reporting/stacked-bar.png new file mode 100644 index 000000000..9f85a57a7 Binary files /dev/null and b/content-rst/applications/essentials/reporting/stacked-bar.png differ diff --git a/content-rst/applications/essentials/reporting/stacked-line.png b/content-rst/applications/essentials/reporting/stacked-line.png new file mode 100644 index 000000000..926d03909 Binary files /dev/null and b/content-rst/applications/essentials/reporting/stacked-line.png differ diff --git a/content/applications/essentials/search.rst b/content-rst/applications/essentials/search.rst similarity index 100% rename from content/applications/essentials/search.rst rename to content-rst/applications/essentials/search.rst diff --git a/content-rst/applications/essentials/search/comparison-section.png b/content-rst/applications/essentials/search/comparison-section.png new file mode 100644 index 000000000..5f390bcc3 Binary files /dev/null and b/content-rst/applications/essentials/search/comparison-section.png differ diff --git a/content-rst/applications/essentials/search/comparison.png b/content-rst/applications/essentials/search/comparison.png new file mode 100644 index 000000000..b524fae9e Binary files /dev/null and b/content-rst/applications/essentials/search/comparison.png differ diff --git a/content-rst/applications/essentials/search/custom-filter-example.png b/content-rst/applications/essentials/search/custom-filter-example.png new file mode 100644 index 000000000..d4a363d65 Binary files /dev/null and b/content-rst/applications/essentials/search/custom-filter-example.png differ diff --git a/content-rst/applications/essentials/search/custom-filter.png b/content-rst/applications/essentials/search/custom-filter.png new file mode 100644 index 000000000..7ec7fc9b8 Binary files /dev/null and b/content-rst/applications/essentials/search/custom-filter.png differ diff --git a/content-rst/applications/essentials/search/favorites.png b/content-rst/applications/essentials/search/favorites.png new file mode 100644 index 000000000..e9a73b526 Binary files /dev/null and b/content-rst/applications/essentials/search/favorites.png differ diff --git a/content-rst/applications/essentials/search/group.png b/content-rst/applications/essentials/search/group.png new file mode 100644 index 000000000..02a10abc9 Binary files /dev/null and b/content-rst/applications/essentials/search/group.png differ diff --git a/content-rst/applications/essentials/search/preconfigured-filters.png b/content-rst/applications/essentials/search/preconfigured-filters.png new file mode 100644 index 000000000..cdc835b3b Binary files /dev/null and b/content-rst/applications/essentials/search/preconfigured-filters.png differ diff --git a/content-rst/applications/essentials/search/search-values.png b/content-rst/applications/essentials/search/search-values.png new file mode 100644 index 000000000..0cea538cd Binary files /dev/null and b/content-rst/applications/essentials/search/search-values.png differ diff --git a/content/applications/finance.rst b/content-rst/applications/finance.rst similarity index 100% rename from content/applications/finance.rst rename to content-rst/applications/finance.rst diff --git a/content/applications/finance/accounting.rst b/content-rst/applications/finance/accounting.rst similarity index 100% rename from content/applications/finance/accounting.rst rename to content-rst/applications/finance/accounting.rst diff --git a/content/applications/finance/accounting/bank.rst b/content-rst/applications/finance/accounting/bank.rst similarity index 100% rename from content/applications/finance/accounting/bank.rst rename to content-rst/applications/finance/accounting/bank.rst diff --git a/content-rst/applications/finance/accounting/bank/bank-account-number.png b/content-rst/applications/finance/accounting/bank/bank-account-number.png new file mode 100644 index 000000000..84e2b0a0a Binary files /dev/null and b/content-rst/applications/finance/accounting/bank/bank-account-number.png differ diff --git a/content-rst/applications/finance/accounting/bank/bank-journal-config.png b/content-rst/applications/finance/accounting/bank/bank-journal-config.png new file mode 100644 index 000000000..e60972fc1 Binary files /dev/null and b/content-rst/applications/finance/accounting/bank/bank-journal-config.png differ diff --git a/content/applications/finance/accounting/bank/bank_synchronization.rst b/content-rst/applications/finance/accounting/bank/bank_synchronization.rst similarity index 100% rename from content/applications/finance/accounting/bank/bank_synchronization.rst rename to content-rst/applications/finance/accounting/bank/bank_synchronization.rst diff --git a/content/applications/finance/accounting/bank/bank_synchronization/enablebanking.rst b/content-rst/applications/finance/accounting/bank/bank_synchronization/enablebanking.rst similarity index 100% rename from content/applications/finance/accounting/bank/bank_synchronization/enablebanking.rst rename to content-rst/applications/finance/accounting/bank/bank_synchronization/enablebanking.rst diff --git a/content-rst/applications/finance/accounting/bank/bank_synchronization/enablebanking/enablebanking.png b/content-rst/applications/finance/accounting/bank/bank_synchronization/enablebanking/enablebanking.png new file mode 100644 index 000000000..80680dc23 Binary files /dev/null and b/content-rst/applications/finance/accounting/bank/bank_synchronization/enablebanking/enablebanking.png differ diff --git a/content-rst/applications/finance/accounting/bank/bank_synchronization/enablebanking/enablebankingauth.png b/content-rst/applications/finance/accounting/bank/bank_synchronization/enablebanking/enablebankingauth.png new file mode 100644 index 000000000..32c19f3a5 Binary files /dev/null and b/content-rst/applications/finance/accounting/bank/bank_synchronization/enablebanking/enablebankingauth.png differ diff --git a/content/applications/finance/accounting/bank/bank_synchronization/ponto.rst b/content-rst/applications/finance/accounting/bank/bank_synchronization/ponto.rst similarity index 100% rename from content/applications/finance/accounting/bank/bank_synchronization/ponto.rst rename to content-rst/applications/finance/accounting/bank/bank_synchronization/ponto.rst diff --git a/content-rst/applications/finance/accounting/bank/bank_synchronization/ponto/ponto-add-account.png b/content-rst/applications/finance/accounting/bank/bank_synchronization/ponto/ponto-add-account.png new file mode 100644 index 000000000..e3c08979b Binary files /dev/null and b/content-rst/applications/finance/accounting/bank/bank_synchronization/ponto/ponto-add-account.png differ diff --git a/content-rst/applications/finance/accounting/bank/bank_synchronization/ponto/ponto-organization.png b/content-rst/applications/finance/accounting/bank/bank_synchronization/ponto/ponto-organization.png new file mode 100644 index 000000000..b261eda8c Binary files /dev/null and b/content-rst/applications/finance/accounting/bank/bank_synchronization/ponto/ponto-organization.png differ diff --git a/content-rst/applications/finance/accounting/bank/bank_synchronization/ponto/ponto-select-accounts.png b/content-rst/applications/finance/accounting/bank/bank_synchronization/ponto/ponto-select-accounts.png new file mode 100644 index 000000000..9258a2674 Binary files /dev/null and b/content-rst/applications/finance/accounting/bank/bank_synchronization/ponto/ponto-select-accounts.png differ diff --git a/content/applications/finance/accounting/bank/bank_synchronization/saltedge.rst b/content-rst/applications/finance/accounting/bank/bank_synchronization/saltedge.rst similarity index 100% rename from content/applications/finance/accounting/bank/bank_synchronization/saltedge.rst rename to content-rst/applications/finance/accounting/bank/bank_synchronization/saltedge.rst diff --git a/content-rst/applications/finance/accounting/bank/bank_synchronization/saltedge/saltedge-contact-email.png b/content-rst/applications/finance/accounting/bank/bank_synchronization/saltedge/saltedge-contact-email.png new file mode 100644 index 000000000..7103631d5 Binary files /dev/null and b/content-rst/applications/finance/accounting/bank/bank_synchronization/saltedge/saltedge-contact-email.png differ diff --git a/content-rst/applications/finance/accounting/bank/bank_synchronization/saltedge/saltedge-give-consent.png b/content-rst/applications/finance/accounting/bank/bank_synchronization/saltedge/saltedge-give-consent.png new file mode 100644 index 000000000..683e2637a Binary files /dev/null and b/content-rst/applications/finance/accounting/bank/bank_synchronization/saltedge/saltedge-give-consent.png differ diff --git a/content-rst/applications/finance/accounting/bank/bank_synchronization/saltedge/saltedge-login-page.png b/content-rst/applications/finance/accounting/bank/bank_synchronization/saltedge/saltedge-login-page.png new file mode 100644 index 000000000..65930d968 Binary files /dev/null and b/content-rst/applications/finance/accounting/bank/bank_synchronization/saltedge/saltedge-login-page.png differ diff --git a/content-rst/applications/finance/accounting/bank/card.png b/content-rst/applications/finance/accounting/bank/card.png new file mode 100644 index 000000000..3026f913d Binary files /dev/null and b/content-rst/applications/finance/accounting/bank/card.png differ diff --git a/content/applications/finance/accounting/bank/foreign_currency.rst b/content-rst/applications/finance/accounting/bank/foreign_currency.rst similarity index 100% rename from content/applications/finance/accounting/bank/foreign_currency.rst rename to content-rst/applications/finance/accounting/bank/foreign_currency.rst diff --git a/content-rst/applications/finance/accounting/bank/foreign_currency/foreign-adjustment.png b/content-rst/applications/finance/accounting/bank/foreign_currency/foreign-adjustment.png new file mode 100644 index 000000000..532884ed2 Binary files /dev/null and b/content-rst/applications/finance/accounting/bank/foreign_currency/foreign-adjustment.png differ diff --git a/content-rst/applications/finance/accounting/bank/foreign_currency/foreign-bill-currency.png b/content-rst/applications/finance/accounting/bank/foreign_currency/foreign-bill-currency.png new file mode 100644 index 000000000..ab8b94760 Binary files /dev/null and b/content-rst/applications/finance/accounting/bank/foreign_currency/foreign-bill-currency.png differ diff --git a/content-rst/applications/finance/accounting/bank/foreign_currency/foreign-exchange-rates.png b/content-rst/applications/finance/accounting/bank/foreign_currency/foreign-exchange-rates.png new file mode 100644 index 000000000..fb3889ddc Binary files /dev/null and b/content-rst/applications/finance/accounting/bank/foreign_currency/foreign-exchange-rates.png differ diff --git a/content-rst/applications/finance/accounting/bank/foreign_currency/foreign-gains-losses.png b/content-rst/applications/finance/accounting/bank/foreign_currency/foreign-gains-losses.png new file mode 100644 index 000000000..098dc3b3e Binary files /dev/null and b/content-rst/applications/finance/accounting/bank/foreign_currency/foreign-gains-losses.png differ diff --git a/content-rst/applications/finance/accounting/bank/foreign_currency/foreign-journal.png b/content-rst/applications/finance/accounting/bank/foreign_currency/foreign-journal.png new file mode 100644 index 000000000..677cbb7a0 Binary files /dev/null and b/content-rst/applications/finance/accounting/bank/foreign_currency/foreign-journal.png differ diff --git a/content-rst/applications/finance/accounting/bank/foreign_currency/foreign-reset-rates.png b/content-rst/applications/finance/accounting/bank/foreign_currency/foreign-reset-rates.png new file mode 100644 index 000000000..93c666e06 Binary files /dev/null and b/content-rst/applications/finance/accounting/bank/foreign_currency/foreign-reset-rates.png differ diff --git a/content/applications/finance/accounting/bank/internal_transfers.rst b/content-rst/applications/finance/accounting/bank/internal_transfers.rst similarity index 100% rename from content/applications/finance/accounting/bank/internal_transfers.rst rename to content-rst/applications/finance/accounting/bank/internal_transfers.rst diff --git a/content/applications/finance/accounting/bank/loans.rst b/content-rst/applications/finance/accounting/bank/loans.rst similarity index 100% rename from content/applications/finance/accounting/bank/loans.rst rename to content-rst/applications/finance/accounting/bank/loans.rst diff --git a/content/applications/finance/accounting/bank/reconciliation.rst b/content-rst/applications/finance/accounting/bank/reconciliation.rst similarity index 100% rename from content/applications/finance/accounting/bank/reconciliation.rst rename to content-rst/applications/finance/accounting/bank/reconciliation.rst diff --git a/content-rst/applications/finance/accounting/bank/reconciliation/bank-card.png b/content-rst/applications/finance/accounting/bank/reconciliation/bank-card.png new file mode 100644 index 000000000..4121744ae Binary files /dev/null and b/content-rst/applications/finance/accounting/bank/reconciliation/bank-card.png differ diff --git a/content-rst/applications/finance/accounting/bank/reconciliation/fully-paid.png b/content-rst/applications/finance/accounting/bank/reconciliation/fully-paid.png new file mode 100644 index 000000000..bcb2ed327 Binary files /dev/null and b/content-rst/applications/finance/accounting/bank/reconciliation/fully-paid.png differ diff --git a/content-rst/applications/finance/accounting/bank/reconciliation/user-interface.png b/content-rst/applications/finance/accounting/bank/reconciliation/user-interface.png new file mode 100644 index 000000000..b0ac51996 Binary files /dev/null and b/content-rst/applications/finance/accounting/bank/reconciliation/user-interface.png differ diff --git a/content/applications/finance/accounting/bank/reconciliation_models.rst b/content-rst/applications/finance/accounting/bank/reconciliation_models.rst similarity index 100% rename from content/applications/finance/accounting/bank/reconciliation_models.rst rename to content-rst/applications/finance/accounting/bank/reconciliation_models.rst diff --git a/content-rst/applications/finance/accounting/bank/reconciliation_models/bank-fees.png b/content-rst/applications/finance/accounting/bank/reconciliation_models/bank-fees.png new file mode 100644 index 000000000..d373879bb Binary files /dev/null and b/content-rst/applications/finance/accounting/bank/reconciliation_models/bank-fees.png differ diff --git a/content-rst/applications/finance/accounting/bank/reconciliation_models/invoices-bills-perfect-match.png b/content-rst/applications/finance/accounting/bank/reconciliation_models/invoices-bills-perfect-match.png new file mode 100644 index 000000000..865d14bb5 Binary files /dev/null and b/content-rst/applications/finance/accounting/bank/reconciliation_models/invoices-bills-perfect-match.png differ diff --git a/content-rst/applications/finance/accounting/bank/reconciliation_models/list-view.png b/content-rst/applications/finance/accounting/bank/reconciliation_models/list-view.png new file mode 100644 index 000000000..a06772b81 Binary files /dev/null and b/content-rst/applications/finance/accounting/bank/reconciliation_models/list-view.png differ diff --git a/content-rst/applications/finance/accounting/bank/reconciliation_models/partial-match.png b/content-rst/applications/finance/accounting/bank/reconciliation_models/partial-match.png new file mode 100644 index 000000000..a9a5ed71e Binary files /dev/null and b/content-rst/applications/finance/accounting/bank/reconciliation_models/partial-match.png differ diff --git a/content-rst/applications/finance/accounting/bank/reconciliation_models/partner-mapping.png b/content-rst/applications/finance/accounting/bank/reconciliation_models/partner-mapping.png new file mode 100644 index 000000000..0c01df0c0 Binary files /dev/null and b/content-rst/applications/finance/accounting/bank/reconciliation_models/partner-mapping.png differ diff --git a/content-rst/applications/finance/accounting/bank/reconciliation_models/regex.png b/content-rst/applications/finance/accounting/bank/reconciliation_models/regex.png new file mode 100644 index 000000000..1237b6b58 Binary files /dev/null and b/content-rst/applications/finance/accounting/bank/reconciliation_models/regex.png differ diff --git a/content/applications/finance/accounting/bank/transactions.rst b/content-rst/applications/finance/accounting/bank/transactions.rst similarity index 100% rename from content/applications/finance/accounting/bank/transactions.rst rename to content-rst/applications/finance/accounting/bank/transactions.rst diff --git a/content-rst/applications/finance/accounting/bank/transactions/statements-kanban.png b/content-rst/applications/finance/accounting/bank/transactions/statements-kanban.png new file mode 100644 index 000000000..050a4f40f Binary files /dev/null and b/content-rst/applications/finance/accounting/bank/transactions/statements-kanban.png differ diff --git a/content/applications/finance/accounting/customer_invoices.rst b/content-rst/applications/finance/accounting/customer_invoices.rst similarity index 100% rename from content/applications/finance/accounting/customer_invoices.rst rename to content-rst/applications/finance/accounting/customer_invoices.rst diff --git a/content/applications/finance/accounting/customer_invoices/cash_discounts.rst b/content-rst/applications/finance/accounting/customer_invoices/cash_discounts.rst similarity index 100% rename from content/applications/finance/accounting/customer_invoices/cash_discounts.rst rename to content-rst/applications/finance/accounting/customer_invoices/cash_discounts.rst diff --git a/content-rst/applications/finance/accounting/customer_invoices/cash_discounts/invoice-journal-entry.png b/content-rst/applications/finance/accounting/customer_invoices/cash_discounts/invoice-journal-entry.png new file mode 100644 index 000000000..e3667b230 Binary files /dev/null and b/content-rst/applications/finance/accounting/customer_invoices/cash_discounts/invoice-journal-entry.png differ diff --git a/content-rst/applications/finance/accounting/customer_invoices/cash_discounts/invoice-print.png b/content-rst/applications/finance/accounting/customer_invoices/cash_discounts/invoice-print.png new file mode 100644 index 000000000..62bd2fc5e Binary files /dev/null and b/content-rst/applications/finance/accounting/customer_invoices/cash_discounts/invoice-print.png differ diff --git a/content-rst/applications/finance/accounting/customer_invoices/cash_discounts/payment-terms.png b/content-rst/applications/finance/accounting/customer_invoices/cash_discounts/payment-terms.png new file mode 100644 index 000000000..1931f6ce8 Binary files /dev/null and b/content-rst/applications/finance/accounting/customer_invoices/cash_discounts/payment-terms.png differ diff --git a/content/applications/finance/accounting/customer_invoices/cash_rounding.rst b/content-rst/applications/finance/accounting/customer_invoices/cash_rounding.rst similarity index 100% rename from content/applications/finance/accounting/customer_invoices/cash_rounding.rst rename to content-rst/applications/finance/accounting/customer_invoices/cash_rounding.rst diff --git a/content-rst/applications/finance/accounting/customer_invoices/cash_rounding/cash_rounding01.png b/content-rst/applications/finance/accounting/customer_invoices/cash_rounding/cash_rounding01.png new file mode 100644 index 000000000..a286bef4a Binary files /dev/null and b/content-rst/applications/finance/accounting/customer_invoices/cash_rounding/cash_rounding01.png differ diff --git a/content/applications/finance/accounting/customer_invoices/credit_notes.rst b/content-rst/applications/finance/accounting/customer_invoices/credit_notes.rst similarity index 100% rename from content/applications/finance/accounting/customer_invoices/credit_notes.rst rename to content-rst/applications/finance/accounting/customer_invoices/credit_notes.rst diff --git a/content-rst/applications/finance/accounting/customer_invoices/credit_notes/credit_notes02.png b/content-rst/applications/finance/accounting/customer_invoices/credit_notes/credit_notes02.png new file mode 100644 index 000000000..f1d240f63 Binary files /dev/null and b/content-rst/applications/finance/accounting/customer_invoices/credit_notes/credit_notes02.png differ diff --git a/content-rst/applications/finance/accounting/customer_invoices/credit_notes/credit_notes03.png b/content-rst/applications/finance/accounting/customer_invoices/credit_notes/credit_notes03.png new file mode 100644 index 000000000..57d595136 Binary files /dev/null and b/content-rst/applications/finance/accounting/customer_invoices/credit_notes/credit_notes03.png differ diff --git a/content-rst/applications/finance/accounting/customer_invoices/credit_notes/credit_notes04.png b/content-rst/applications/finance/accounting/customer_invoices/credit_notes/credit_notes04.png new file mode 100644 index 000000000..629e0a172 Binary files /dev/null and b/content-rst/applications/finance/accounting/customer_invoices/credit_notes/credit_notes04.png differ diff --git a/content/applications/finance/accounting/customer_invoices/customer_addresses.rst b/content-rst/applications/finance/accounting/customer_invoices/customer_addresses.rst similarity index 100% rename from content/applications/finance/accounting/customer_invoices/customer_addresses.rst rename to content-rst/applications/finance/accounting/customer_invoices/customer_addresses.rst diff --git a/content/applications/finance/accounting/customer_invoices/deferred_revenues.rst b/content-rst/applications/finance/accounting/customer_invoices/deferred_revenues.rst similarity index 100% rename from content/applications/finance/accounting/customer_invoices/deferred_revenues.rst rename to content-rst/applications/finance/accounting/customer_invoices/deferred_revenues.rst diff --git a/content-rst/applications/finance/accounting/customer_invoices/deferred_revenues/deferred_revenue_report.png b/content-rst/applications/finance/accounting/customer_invoices/deferred_revenues/deferred_revenue_report.png new file mode 100644 index 000000000..c3e756f8f Binary files /dev/null and b/content-rst/applications/finance/accounting/customer_invoices/deferred_revenues/deferred_revenue_report.png differ diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing.rst b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing.rst similarity index 100% rename from content/applications/finance/accounting/customer_invoices/electronic_invoicing.rst rename to content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing.rst diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/argentina.rst b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/argentina.rst similarity index 100% rename from content/applications/finance/accounting/customer_invoices/electronic_invoicing/argentina.rst rename to content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/argentina.rst diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/austria.rst b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/austria.rst similarity index 100% rename from content/applications/finance/accounting/customer_invoices/electronic_invoicing/austria.rst rename to content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/austria.rst diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/basque_country.rst b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/basque_country.rst similarity index 100% rename from content/applications/finance/accounting/customer_invoices/electronic_invoicing/basque_country.rst rename to content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/basque_country.rst diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/belgium.rst b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/belgium.rst similarity index 100% rename from content/applications/finance/accounting/customer_invoices/electronic_invoicing/belgium.rst rename to content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/belgium.rst diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/brazil.rst b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/brazil.rst similarity index 100% rename from content/applications/finance/accounting/customer_invoices/electronic_invoicing/brazil.rst rename to content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/brazil.rst diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/chile.rst b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/chile.rst similarity index 100% rename from content/applications/finance/accounting/customer_invoices/electronic_invoicing/chile.rst rename to content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/chile.rst diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/colombia.rst b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/colombia.rst similarity index 100% rename from content/applications/finance/accounting/customer_invoices/electronic_invoicing/colombia.rst rename to content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/colombia.rst diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/croatia.rst b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/croatia.rst similarity index 100% rename from content/applications/finance/accounting/customer_invoices/electronic_invoicing/croatia.rst rename to content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/croatia.rst diff --git a/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/customer-form.png b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/customer-form.png new file mode 100644 index 000000000..bdd7ed5fa Binary files /dev/null and b/content-rst/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-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/denmark.rst similarity index 100% rename from content/applications/finance/accounting/customer_invoices/electronic_invoicing/denmark.rst rename to content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/denmark.rst diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/ecuador.rst b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/ecuador.rst similarity index 100% rename from content/applications/finance/accounting/customer_invoices/electronic_invoicing/ecuador.rst rename to content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/ecuador.rst diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/estonia.rst b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/estonia.rst similarity index 100% rename from content/applications/finance/accounting/customer_invoices/electronic_invoicing/estonia.rst rename to content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/estonia.rst diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/finland.rst b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/finland.rst similarity index 100% rename from content/applications/finance/accounting/customer_invoices/electronic_invoicing/finland.rst rename to content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/finland.rst diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/france.rst b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/france.rst similarity index 100% rename from content/applications/finance/accounting/customer_invoices/electronic_invoicing/france.rst rename to content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/france.rst diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/germany.rst b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/germany.rst similarity index 100% rename from content/applications/finance/accounting/customer_invoices/electronic_invoicing/germany.rst rename to content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/germany.rst diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/hungary.rst b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/hungary.rst similarity index 100% rename from content/applications/finance/accounting/customer_invoices/electronic_invoicing/hungary.rst rename to content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/hungary.rst diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/ireland.rst b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/ireland.rst similarity index 100% rename from content/applications/finance/accounting/customer_invoices/electronic_invoicing/ireland.rst rename to content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/ireland.rst diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/italy.rst b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/italy.rst similarity index 100% rename from content/applications/finance/accounting/customer_invoices/electronic_invoicing/italy.rst rename to content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/italy.rst diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/latvia.rst b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/latvia.rst similarity index 100% rename from content/applications/finance/accounting/customer_invoices/electronic_invoicing/latvia.rst rename to content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/latvia.rst diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/lithuania.rst b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/lithuania.rst similarity index 100% rename from content/applications/finance/accounting/customer_invoices/electronic_invoicing/lithuania.rst rename to content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/lithuania.rst diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/luxembourg.rst b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/luxembourg.rst similarity index 100% rename from content/applications/finance/accounting/customer_invoices/electronic_invoicing/luxembourg.rst rename to content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/luxembourg.rst diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/mexico.rst b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/mexico.rst similarity index 100% rename from content/applications/finance/accounting/customer_invoices/electronic_invoicing/mexico.rst rename to content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/mexico.rst diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/netherlands.rst b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/netherlands.rst similarity index 100% rename from content/applications/finance/accounting/customer_invoices/electronic_invoicing/netherlands.rst rename to content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/netherlands.rst diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/norway.rst b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/norway.rst similarity index 100% rename from content/applications/finance/accounting/customer_invoices/electronic_invoicing/norway.rst rename to content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/norway.rst diff --git a/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-contact-verify.png b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-contact-verify.png new file mode 100644 index 000000000..e84a35c55 Binary files /dev/null and b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-contact-verify.png differ diff --git a/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-fetch-bills.png b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-fetch-bills.png new file mode 100644 index 000000000..2a2188d48 Binary files /dev/null and b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-fetch-bills.png differ diff --git a/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-fetch-message-status.png b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-fetch-message-status.png new file mode 100644 index 000000000..db0571a42 Binary files /dev/null and b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-fetch-message-status.png differ diff --git a/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-message-processing.png b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-message-processing.png new file mode 100644 index 000000000..16baddc5f Binary files /dev/null and b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-message-processing.png differ diff --git a/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-participant-format.png b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-participant-format.png new file mode 100644 index 000000000..e5d28c1a7 Binary files /dev/null and b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-participant-format.png differ diff --git a/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-phone-verification.png b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-phone-verification.png new file mode 100644 index 000000000..3d5e65fac Binary files /dev/null and b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-phone-verification.png differ diff --git a/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-ready-invoices.png b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-ready-invoices.png new file mode 100644 index 000000000..9e1b3b590 Binary files /dev/null and b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-ready-invoices.png differ diff --git a/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-receive-bills.png b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-receive-bills.png new file mode 100644 index 000000000..cc5ac2859 Binary files /dev/null and b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-receive-bills.png differ diff --git a/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-receiver.png b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-receiver.png new file mode 100644 index 000000000..2a3978234 Binary files /dev/null and b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-receiver.png differ diff --git a/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-registration-settings.png b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-registration-settings.png new file mode 100644 index 000000000..1f2a74d80 Binary files /dev/null and b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-registration-settings.png differ diff --git a/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-registration-wizard.png b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-registration-wizard.png new file mode 100644 index 000000000..6d8cead67 Binary files /dev/null and b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-registration-wizard.png differ diff --git a/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-send-print.png b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-send-print.png new file mode 100644 index 000000000..5a8b1fb0d Binary files /dev/null and b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-send-print.png differ diff --git a/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-system-parameter.png b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-system-parameter.png new file mode 100644 index 000000000..ae63e31cf Binary files /dev/null and b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/peppol-system-parameter.png differ diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/peru.rst b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/peru.rst similarity index 100% rename from content/applications/finance/accounting/customer_invoices/electronic_invoicing/peru.rst rename to content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/peru.rst diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/poland.rst b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/poland.rst similarity index 100% rename from content/applications/finance/accounting/customer_invoices/electronic_invoicing/poland.rst rename to content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/poland.rst diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/portugal.rst b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/portugal.rst similarity index 100% rename from content/applications/finance/accounting/customer_invoices/electronic_invoicing/portugal.rst rename to content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/portugal.rst diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/romania.rst b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/romania.rst similarity index 100% rename from content/applications/finance/accounting/customer_invoices/electronic_invoicing/romania.rst rename to content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/romania.rst diff --git a/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/send-window.png b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/send-window.png new file mode 100644 index 000000000..15186ebfc Binary files /dev/null and b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/send-window.png differ diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/slovenia.rst b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/slovenia.rst similarity index 100% rename from content/applications/finance/accounting/customer_invoices/electronic_invoicing/slovenia.rst rename to content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/slovenia.rst diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/spain.rst b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/spain.rst similarity index 100% rename from content/applications/finance/accounting/customer_invoices/electronic_invoicing/spain.rst rename to content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/spain.rst diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/uruguay.rst b/content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/uruguay.rst similarity index 100% rename from content/applications/finance/accounting/customer_invoices/electronic_invoicing/uruguay.rst rename to content-rst/applications/finance/accounting/customer_invoices/electronic_invoicing/uruguay.rst diff --git a/content/applications/finance/accounting/customer_invoices/epc_qr_code.rst b/content-rst/applications/finance/accounting/customer_invoices/epc_qr_code.rst similarity index 100% rename from content/applications/finance/accounting/customer_invoices/epc_qr_code.rst rename to content-rst/applications/finance/accounting/customer_invoices/epc_qr_code.rst diff --git a/content-rst/applications/finance/accounting/customer_invoices/epc_qr_code/bank-journal.png b/content-rst/applications/finance/accounting/customer_invoices/epc_qr_code/bank-journal.png new file mode 100644 index 000000000..d86dd6e54 Binary files /dev/null and b/content-rst/applications/finance/accounting/customer_invoices/epc_qr_code/bank-journal.png differ diff --git a/content-rst/applications/finance/accounting/customer_invoices/epc_qr_code/invoice-qr-code.png b/content-rst/applications/finance/accounting/customer_invoices/epc_qr_code/invoice-qr-code.png new file mode 100644 index 000000000..f2a402441 Binary files /dev/null and b/content-rst/applications/finance/accounting/customer_invoices/epc_qr_code/invoice-qr-code.png differ diff --git a/content/applications/finance/accounting/customer_invoices/incoterms.rst b/content-rst/applications/finance/accounting/customer_invoices/incoterms.rst similarity index 100% rename from content/applications/finance/accounting/customer_invoices/incoterms.rst rename to content-rst/applications/finance/accounting/customer_invoices/incoterms.rst diff --git a/content/applications/finance/accounting/customer_invoices/overview.rst b/content-rst/applications/finance/accounting/customer_invoices/overview.rst similarity index 100% rename from content/applications/finance/accounting/customer_invoices/overview.rst rename to content-rst/applications/finance/accounting/customer_invoices/overview.rst diff --git a/content/applications/finance/accounting/customer_invoices/payment_terms.rst b/content-rst/applications/finance/accounting/customer_invoices/payment_terms.rst similarity index 100% rename from content/applications/finance/accounting/customer_invoices/payment_terms.rst rename to content-rst/applications/finance/accounting/customer_invoices/payment_terms.rst diff --git a/content-rst/applications/finance/accounting/customer_invoices/payment_terms/configuration.png b/content-rst/applications/finance/accounting/customer_invoices/payment_terms/configuration.png new file mode 100644 index 000000000..2381104a5 Binary files /dev/null and b/content-rst/applications/finance/accounting/customer_invoices/payment_terms/configuration.png differ diff --git a/content-rst/applications/finance/accounting/customer_invoices/payment_terms/journal-entry.png b/content-rst/applications/finance/accounting/customer_invoices/payment_terms/journal-entry.png new file mode 100644 index 000000000..cb510814a Binary files /dev/null and b/content-rst/applications/finance/accounting/customer_invoices/payment_terms/journal-entry.png differ diff --git a/content/applications/finance/accounting/customer_invoices/sequence.rst b/content-rst/applications/finance/accounting/customer_invoices/sequence.rst similarity index 100% rename from content/applications/finance/accounting/customer_invoices/sequence.rst rename to content-rst/applications/finance/accounting/customer_invoices/sequence.rst diff --git a/content-rst/applications/finance/accounting/customer_invoices/sequence/invoice-sequencing.png b/content-rst/applications/finance/accounting/customer_invoices/sequence/invoice-sequencing.png new file mode 100644 index 000000000..c4d8445f1 Binary files /dev/null and b/content-rst/applications/finance/accounting/customer_invoices/sequence/invoice-sequencing.png differ diff --git a/content-rst/applications/finance/accounting/customer_invoices/sequence/reference-number.png b/content-rst/applications/finance/accounting/customer_invoices/sequence/reference-number.png new file mode 100644 index 000000000..e5ab954a3 Binary files /dev/null and b/content-rst/applications/finance/accounting/customer_invoices/sequence/reference-number.png differ diff --git a/content-rst/applications/finance/accounting/customer_invoices/sequence/sequence-dialog.png b/content-rst/applications/finance/accounting/customer_invoices/sequence/sequence-dialog.png new file mode 100644 index 000000000..085eacf63 Binary files /dev/null and b/content-rst/applications/finance/accounting/customer_invoices/sequence/sequence-dialog.png differ diff --git a/content/applications/finance/accounting/customer_invoices/snailmail.rst b/content-rst/applications/finance/accounting/customer_invoices/snailmail.rst similarity index 100% rename from content/applications/finance/accounting/customer_invoices/snailmail.rst rename to content-rst/applications/finance/accounting/customer_invoices/snailmail.rst diff --git a/content-rst/applications/finance/accounting/customer_invoices/snailmail/setup-snailmail.png b/content-rst/applications/finance/accounting/customer_invoices/snailmail/setup-snailmail.png new file mode 100644 index 000000000..6da072ea9 Binary files /dev/null and b/content-rst/applications/finance/accounting/customer_invoices/snailmail/setup-snailmail.png differ diff --git a/content-rst/applications/finance/accounting/customer_invoices/snailmail/snailmail-template.pdf b/content-rst/applications/finance/accounting/customer_invoices/snailmail/snailmail-template.pdf new file mode 100644 index 000000000..a68d818b2 --- /dev/null +++ b/content-rst/applications/finance/accounting/customer_invoices/snailmail/snailmail-template.pdf @@ -0,0 +1,3272 @@ +%PDF-1.7 +% +2 0 obj +<>/Resources<>/Font<>/XObject<>/ColorSpace<>/ProcSet[/Text/ImageC/ImageI/PDF/ImageB]>>/Length 29594>> +stream +q +/GSa gs +/CSp cs +/CSp CS +0.8 0 0 -0.8 20 728.4 cm +q +q +Q +Q +q +q +Q +Q +q +0 0 m +693.99999 0 l +693.99999 798.05997 l +0 798.05997 l +0 0 l +h +W* +n +q +/CSp cs +1 1 1 scn +/GSa gs +q +0.80046 0 0 0.80046 0 0 cm +0 0 867 701 re +f +Q +/CSp cs +0.87059 0.88627 0.90196 scn +/GSa gs +q +0.80046 0 0 0.80046 0 0 cm +15 375 454 1 re +f +Q +/CSp cs +0.87059 0.88627 0.90196 scn +/GSa gs +q +0.80046 0 0 0.80046 0 0 cm +15 408 454 1 re +f +Q +/CSp cs +0.87059 0.88627 0.90196 scn +/GSa gs +q +0.80046 0 0 0.80046 0 0 cm +469 375 86 1 re +f +Q +/CSp cs +0.87059 0.88627 0.90196 scn +/GSa gs +q +0.80046 0 0 0.80046 0 0 cm +469 408 86 1 re +f +Q +/CSp cs +0.87059 0.88627 0.90196 scn +/GSa gs +q +0.80046 0 0 0.80046 0 0 cm +555 375 96 1 re +f +Q +/CSp cs +0.87059 0.88627 0.90196 scn +/GSa gs +q +0.80046 0 0 0.80046 0 0 cm +555 408 96 1 re +f +Q +/CSp cs +0.87059 0.88627 0.90196 scn +/GSa gs +q +0.80046 0 0 0.80046 0 0 cm +651 375 75 1 re +f +Q +/CSp cs +0.87059 0.88627 0.90196 scn +/GSa gs +q +0.80046 0 0 0.80046 0 0 cm +651 408 75 1 re +f +Q +/CSp cs +0.87059 0.88627 0.90196 scn +/GSa gs +q +0.80046 0 0 0.80046 0 0 cm +726 375 126 1 re +f +Q +/CSp cs +0.87059 0.88627 0.90196 scn +/GSa gs +q +0.80046 0 0 0.80046 0 0 cm +726 408 126 1 re +f +Q +/CSp cs +0.87059 0.88627 0.90196 scn +/GSa gs +q +0.80046 0 0 0.80046 0 0 cm +15 408 454 1 re +f +Q +/CSp cs +0.87059 0.88627 0.90196 scn +/GSa gs +q +0.80046 0 0 0.80046 0 0 cm +15 465 454 1 re +f +Q +/CSp cs +0.87059 0.88627 0.90196 scn +/GSa gs +q +0.80046 0 0 0.80046 0 0 cm +469 408 86 1 re +f +Q +/CSp cs +0.87059 0.88627 0.90196 scn +/GSa gs +q +0.80046 0 0 0.80046 0 0 cm +469 465 86 1 re +f +Q +/CSp cs +0.87059 0.88627 0.90196 scn +/GSa gs +q +0.80046 0 0 0.80046 0 0 cm +555 408 96 1 re +f +Q +/CSp cs +0.87059 0.88627 0.90196 scn +/GSa gs +q +0.80046 0 0 0.80046 0 0 cm +555 465 96 1 re +f +Q +/CSp cs +0.87059 0.88627 0.90196 scn +/GSa gs +q +0.80046 0 0 0.80046 0 0 cm +651 408 75 1 re +f +Q +/CSp cs +0.87059 0.88627 0.90196 scn +/GSa gs +q +0.80046 0 0 0.80046 0 0 cm +651 465 75 1 re +f +Q +/CSp cs +0.87059 0.88627 0.90196 scn +/GSa gs +q +0.80046 0 0 0.80046 0 0 cm +726 408 126 1 re +f +Q +/CSp cs +0.87059 0.88627 0.90196 scn +/GSa gs +q +0.80046 0 0 0.80046 0 0 cm +726 465 126 1 re +f +Q +/CSp cs +0.87059 0.88627 0.90196 scn +/GSa gs +q +0.80046 0 0 0.80046 0 0 cm +15 465 454 1 re +f +Q +/CSp cs +0.87059 0.88627 0.90196 scn +/GSa gs +q +0.80046 0 0 0.80046 0 0 cm +469 465 86 1 re +f +Q +/CSp cs +0.87059 0.88627 0.90196 scn +/GSa gs +q +0.80046 0 0 0.80046 0 0 cm +555 465 96 1 re +f +Q +/CSp cs +0.87059 0.88627 0.90196 scn +/GSa gs +q +0.80046 0 0 0.80046 0 0 cm +651 465 75 1 re +f +Q +/CSp cs +0.87059 0.88627 0.90196 scn +/GSa gs +q +0.80046 0 0 0.80046 0 0 cm +726 465 126 1 re +f +Q +Q +q +0.80046 0 0 0.80046 0 0 cm +/CSp cs +0 0 0 scn +/GSa gs +0 0 0 SCN +0 w +2 J +2 j +[ ] 0 d +q +/CSp cs +0 0 0 scn +/GSa gs +BT +/F6 32 Tf +1 0 0 -1 0 0 Tm +15 -261 Td +<0001> Tj +9.04688 0 Td +<0002> Tj +17.875 0 Td +<0003> Tj +16.5625 0 Td +<0004> Tj +18.17188 0 Td +<0005> Tj +7.73438 0 Td +<0006> Tj +15.28125 0 Td +<0007> Tj +ET +Q +0 0 0 SCN +0 w +2 J +2 j +[ ] 0 d +q +/CSp cs +0 0 0 scn +/GSa gs +BT +/F6 32 Tf +1 0 0 -1 0 0 Tm +117 -261 Td +<0008> Tj +ET +Q +0 0 0 SCN +0 w +2 J +2 j +[ ] 0 d +q +/CSp cs +0 0 0 scn +/GSa gs +BT +/F6 32 Tf +1 0 0 -1 0 0 Tm +125 -261 Td +<0001> Tj +9.04688 0 Td +<0009> Tj +24.46875 0 Td +<000a> Tj +21.75 0 Td +<000b> Tj +14.51562 0 Td +<000c> Tj +18.54688 0 Td +<000d> Tj +18.54688 0 Td +<000c> Tj +18.54688 0 Td +<000c> Tj +18.54688 0 Td +<000b> Tj +14.51562 0 Td +<000e> Tj +18.54688 0 Td +<000c> Tj +18.54688 0 Td +<000b> Tj +14.51562 0 Td +<000d> Tj +18.54688 0 Td +<000d> Tj +18.54688 0 Td +<000d> Tj +18.54688 0 Td +<000f> Tj +ET +Q +0 0 0 SCN +0 w +2 J +2 j +[ ] 0 d +q +/CSp cs +0 0 0 scn +/GSa gs +BT +/F7 16 Tf +1 0 0 -1 0 0 Tm +19 -396 Td +<0001> Tj +12.15625 0 Td +<0002> Tj +8.53125 0 Td +<0003> Tj +7.03125 0 Td +<0004> Tj +7.70312 0 Td +<0005> Tj +5.95312 0 Td +<0006> Tj +4.0625 0 Td +<0007> Tj +9.07812 0 Td +<0008> Tj +5.9375 0 Td +<0006> Tj +4.0625 0 Td +<0009> Tj +9.1875 0 Td +<000a> Tj +ET +Q +0 0 0 SCN +0 w +2 J +2 j +[ ] 0 d +q +/CSp cs +0 0 0 scn +/GSa gs +BT +/F7 16 Tf +1 0 0 -1 0 0 Tm +488 -396 Td +<000b> Tj +12.92188 0 Td +<000c> Tj +9.01562 0 Td +<000d> Tj +8.10938 0 Td +<000a> Tj +9.01562 0 Td +<0008> Tj +5.9375 0 Td +<0006> Tj +4.0625 0 Td +<0008> Tj +5.9375 0 Td +<000e> Tj +ET +Q +0 0 0 SCN +0 w +2 J +2 j +[ ] 0 d +q +/CSp cs +0 0 0 scn +/GSa gs +BT +/F7 16 Tf +1 0 0 -1 0 0 Tm +576 -396 Td +<000f> Tj +11.875 0 Td +<000a> Tj +9.01562 0 Td +<0006> Tj +4.0625 0 Td +<0008> Tj +5.9375 0 Td +<0010> Tj +3.875 0 Td +<0011> Tj +9.89062 0 Td +<0005> Tj +5.95312 0 Td +<0006> Tj +4.0625 0 Td +<0004> Tj +7.70312 0 Td +<0002> Tj +ET +Q +0 0 0 SCN +0 w +2 J +2 j +[ ] 0 d +q +/CSp cs +0 0 0 scn +/GSa gs +BT +/F7 16 Tf +1 0 0 -1 0 0 Tm +655 -396 Td +<0012> Tj +9.59375 0 Td +<000d> Tj +8.10938 0 Td +<0013> Tj +8.34375 0 Td +<0002> Tj +8.53125 0 Td +<0003> Tj +ET +Q +0 0 0 SCN +0 w +2 J +2 j +[ ] 0 d +q +/CSp cs +0 0 0 scn +/GSa gs +BT +/F7 16 Tf +1 0 0 -1 0 0 Tm +790 -396 Td +<0014> Tj +11.10938 0 Td +<0015> Tj +13.39062 0 Td +<0009> Tj +9.1875 0 Td +<000c> Tj +9.01562 0 Td +<000a> Tj +9.01562 0 Td +<0008> Tj +ET +Q +/CSp cs +0.12941 0.1451 0.16078 scn +/GSa gs +0.12941 0.1451 0.16078 SCN +0 w +2 J +2 j +[ ] 0 d +q +/CSp cs +0.12941 0.1451 0.16078 scn +/GSa gs +BT +/F6 16 Tf +1 0 0 -1 0 0 Tm +19 -429 Td +<0010> Tj +4.90625 0 Td +<0011> Tj +9.04688 0 Td +<0012> Tj +11.78125 0 Td +<0013> Tj +10.0625 0 Td +<0009> Tj +12.23438 0 Td +<0014> Tj +7.35938 0 Td +<0015> Tj +9.26562 0 Td +<0016> Tj +9.26562 0 Td +<0016> Tj +9.26562 0 Td +<0016> Tj +9.26562 0 Td +<0017> Tj +4.90625 0 Td +<0008> Tj +4.04688 0 Td +<0018> Tj +9.46875 0 Td +<0019> Tj +8.9375 0 Td +<001a> Tj +5.84375 0 Td +<0007> Tj +8.45312 0 Td +<0007> Tj +8.45312 0 Td +<001b> Tj +5.9375 0 Td +<001c> Tj +8.6875 0 Td +<0007> Tj +8.45312 0 Td +<001d> Tj +7.96875 0 Td +<001e> Tj +5.76562 0 Td +<0008> Tj +4.04688 0 Td +<001c> Tj +8.6875 0 Td +<0004> Tj +9.07812 0 Td +<001f> Tj +5.60938 0 Td +<001d> Tj +ET +Q +0.12941 0.1451 0.16078 SCN +0 w +2 J +2 j +[ ] 0 d +q +/CSp cs +0.12941 0.1451 0.16078 scn +/GSa gs +BT +/F6 16 Tf +1 0 0 -1 0 0 Tm +19 -453 Td +<0018> Tj +9.46875 0 Td +<0019> Tj +8.9375 0 Td +<001a> Tj +5.84375 0 Td +<0007> Tj +8.45312 0 Td +<0007> Tj +8.45312 0 Td +<0008> Tj +4.04688 0 Td +<001c> Tj +8.6875 0 Td +<0007> Tj +8.45312 0 Td +<001d> Tj +7.96875 0 Td +<001e> Tj +5.76562 0 Td +<0007> Tj +8.45312 0 Td +<001a> Tj +5.84375 0 Td +<0008> Tj +4.04688 0 Td +<001c> Tj +8.6875 0 Td +<0004> Tj +9.07812 0 Td +<001f> Tj +5.60938 0 Td +<001d> Tj +7.96875 0 Td +<0008> Tj +4.04688 0 Td +<0020> Tj +12.59375 0 Td +<0005> Tj +3.85938 0 Td +<001e> Tj +5.76562 0 Td +<0019> Tj +8.9375 0 Td +<0008> Tj +4.04688 0 Td +<0021> Tj +8.21875 0 Td +<0004> Tj +9.07812 0 Td +<0022> Tj +8.92188 0 Td +<0002> Tj +8.9375 0 Td +<0023> Tj +8.34375 0 Td +<0007> Tj +8.45312 0 Td +<001a> Tj +5.84375 0 Td +<0008> Tj +4.04688 0 Td +<0005> Tj +3.85938 0 Td +<0002> Tj +8.9375 0 Td +<0008> Tj +4.04688 0 Td +<001c> Tj +8.6875 0 Td +<001e> Tj +5.76562 0 Td +<0007> Tj +8.45312 0 Td +<0007> Tj +8.45312 0 Td +<0024> Tj +3.79688 0 Td +<0008> Tj +4.04688 0 Td +<0025> Tj +11.65625 0 Td +<001a> Tj +5.84375 0 Td +<0007> Tj +8.45312 0 Td +<0026> Tj +8.26562 0 Td +<0008> Tj +4.04688 0 Td +<0027> Tj +10.65625 0 Td +<0004> Tj +9.07812 0 Td +<0024> Tj +3.79688 0 Td +<0004> Tj +9.07812 0 Td +<0022> Tj +8.92188 0 Td +<001a> Tj +ET +Q +0.12941 0.1451 0.16078 SCN +0 w +2 J +2 j +[ ] 0 d +q +/CSp cs +0.12941 0.1451 0.16078 scn +/GSa gs +BT +/F6 16 Tf +1 0 0 -1 0 0 Tm +519 -429 Td +<0028> Tj +9.26562 0 Td +<0029> Tj +3.76562 0 Td +<000d> Tj +9.26562 0 Td +<000d> Tj +ET +Q +0.12941 0.1451 0.16078 SCN +0 w +2 J +2 j +[ ] 0 d +q +/CSp cs +0.12941 0.1451 0.16078 scn +/GSa gs +BT +/F6 16 Tf +1 0 0 -1 0 0 Tm +584 -429 Td +<000e> Tj +9.26562 0 Td +<002a> Tj +3.64062 0 Td +<0028> Tj +9.26562 0 Td +<000d> Tj +9.26562 0 Td +<000d> Tj +9.26562 0 Td +<0029> Tj +3.76562 0 Td +<000d> Tj +9.26562 0 Td +<000d> Tj +ET +Q +0.12941 0.1451 0.16078 SCN +0 w +2 J +2 j +[ ] 0 d +q +/CSp cs +0.12941 0.1451 0.16078 scn +/GSa gs +BT +/F6 16 Tf +1 0 0 -1 0 0 Tm +655 -429 Td +<000e> Tj +9.26562 0 Td +<0028> Tj +9.26562 0 Td +<0029> Tj +3.76562 0 Td +<000d> Tj +9.26562 0 Td +<000d> Tj +9.26562 0 Td +<002b> Tj +ET +Q +0.12941 0.1451 0.16078 SCN +0 w +2 J +2 j +[ ] 0 d +q +/CSp cs +0.12941 0.1451 0.16078 scn +/GSa gs +BT +/F6 16 Tf +1 0 0 -1 0 0 Tm +772 -429 Td +<002c> Tj +9.26562 0 Td +<0008> Tj +ET +Q +0.12941 0.1451 0.16078 SCN +0 w +2 J +2 j +[ ] 0 d +q +/CSp cs +0.12941 0.1451 0.16078 scn +/GSa gs +BT +/F6 16 Tf +1 0 0 -1 0 0 Tm +785 -429 Td +<002d> Tj +9.26562 0 Td +<002a> Tj +3.64062 0 Td +<0028> Tj +9.26562 0 Td +<000d> Tj +9.26562 0 Td +<000d> Tj +9.26562 0 Td +<0029> Tj +3.76562 0 Td +<000d> Tj +9.26562 0 Td +<000d> Tj +ET +Q +0.12941 0.1451 0.16078 SCN +0 w +2 J +2 j +[ ] 0 d +q +/CSp cs +0.12941 0.1451 0.16078 scn +/GSa gs +BT +/F6 16 Tf +1 0 0 -1 0 0 Tm +19 -486 Td +<0010> Tj +4.90625 0 Td +<0011> Tj +9.04688 0 Td +<0012> Tj +11.78125 0 Td +<0013> Tj +10.0625 0 Td +<0009> Tj +12.23438 0 Td +<0014> Tj +7.35938 0 Td +<0015> Tj +9.26562 0 Td +<000c> Tj +9.26562 0 Td +<000c> Tj +9.26562 0 Td +<000d> Tj +9.26562 0 Td +<0017> Tj +4.90625 0 Td +<0008> Tj +4.04688 0 Td +<0011> Tj +9.04688 0 Td +<0004> Tj +9.07812 0 Td +<0022> Tj +8.92188 0 Td +<001a> Tj +5.84375 0 Td +<0008> Tj +4.04688 0 Td +<002e> Tj +9.64062 0 Td +<0007> Tj +8.45312 0 Td +<001a> Tj +5.84375 0 Td +<002f> Tj +6.9375 0 Td +<0004> Tj +9.07812 0 Td +<0002> Tj +8.9375 0 Td +<0008> Tj +4.04688 0 Td +<0030> Tj +12.15625 0 Td +<0007> Tj +8.45312 0 Td +<002f> Tj +6.9375 0 Td +<0031> Tj +ET +Q +0.12941 0.1451 0.16078 SCN +0 w +2 J +2 j +[ ] 0 d +q +/CSp cs +0.12941 0.1451 0.16078 scn +/GSa gs +BT +/F6 16 Tf +1 0 0 -1 0 0 Tm +19 -510 Td +<0011> Tj +9.04688 0 Td +<0004> Tj +9.07812 0 Td +<0022> Tj +8.92188 0 Td +<001a> Tj +5.84375 0 Td +<0008> Tj +4.04688 0 Td +<0032> Tj +8.98438 0 Td +<0007> Tj +8.45312 0 Td +<001a> Tj +5.84375 0 Td +<002f> Tj +6.9375 0 Td +<0004> Tj +9.07812 0 Td +<0002> Tj +8.9375 0 Td +<0008> Tj +4.04688 0 Td +<0033> Tj +13.1875 0 Td +<0004> Tj +9.07812 0 Td +<0034> Tj +8.96875 0 Td +<0007> Tj +8.45312 0 Td +<001a> Tj +5.84375 0 Td +<0002> Tj +8.9375 0 Td +<0008> Tj +4.04688 0 Td +<0004> Tj +9.07812 0 Td +<001f> Tj +5.60938 0 Td +<001f> Tj +5.60938 0 Td +<0005> Tj +3.85938 0 Td +<0006> Tj +7.64062 0 Td +<0007> Tj +8.45312 0 Td +<0008> Tj +4.04688 0 Td +<0020> Tj +12.59375 0 Td +<0004> Tj +9.07812 0 Td +<001a> Tj +5.84375 0 Td +<0031> Tj +8.1875 0 Td +<002f> Tj +6.9375 0 Td +<001e> Tj +5.76562 0 Td +<001d> Tj +7.96875 0 Td +<001e> Tj +5.76562 0 Td +<0005> Tj +3.85938 0 Td +<0004> Tj +9.07812 0 Td +<0002> Tj +ET +Q +0.12941 0.1451 0.16078 SCN +0 w +2 J +2 j +[ ] 0 d +q +/CSp cs +0.12941 0.1451 0.16078 scn +/GSa gs +BT +/F6 16 Tf +1 0 0 -1 0 0 Tm +519 -486 Td +<0028> Tj +9.26562 0 Td +<0029> Tj +3.76562 0 Td +<000d> Tj +9.26562 0 Td +<000d> Tj +ET +Q +0.12941 0.1451 0.16078 SCN +0 w +2 J +2 j +[ ] 0 d +q +/CSp cs +0.12941 0.1451 0.16078 scn +/GSa gs +BT +/F6 16 Tf +1 0 0 -1 0 0 Tm +575 -486 Td +<000c> Tj +9.26562 0 Td +<000f> Tj +9.26562 0 Td +<002a> Tj +3.64062 0 Td +<0028> Tj +9.26562 0 Td +<000d> Tj +9.26562 0 Td +<000d> Tj +9.26562 0 Td +<0029> Tj +3.76562 0 Td +<000d> Tj +9.26562 0 Td +<000d> Tj +ET +Q +0.12941 0.1451 0.16078 SCN +0 w +2 J +2 j +[ ] 0 d +q +/CSp cs +0.12941 0.1451 0.16078 scn +/GSa gs +BT +/F6 16 Tf +1 0 0 -1 0 0 Tm +655 -486 Td +<000e> Tj +9.26562 0 Td +<0028> Tj +9.26562 0 Td +<0029> Tj +3.76562 0 Td +<000d> Tj +9.26562 0 Td +<000d> Tj +9.26562 0 Td +<002b> Tj +ET +Q +0.12941 0.1451 0.16078 SCN +0 w +2 J +2 j +[ ] 0 d +q +/CSp cs +0.12941 0.1451 0.16078 scn +/GSa gs +BT +/F6 16 Tf +1 0 0 -1 0 0 Tm +753 -486 Td +<002c> Tj +9.26562 0 Td +<0008> Tj +ET +Q +0.12941 0.1451 0.16078 SCN +0 w +2 J +2 j +[ ] 0 d +q +/CSp cs +0.12941 0.1451 0.16078 scn +/GSa gs +BT +/F6 16 Tf +1 0 0 -1 0 0 Tm +766 -486 Td +<000e> Tj +9.26562 0 Td +<000e> Tj +9.26562 0 Td +<002d> Tj +9.26562 0 Td +<002a> Tj +3.64062 0 Td +<0028> Tj +9.26562 0 Td +<000d> Tj +9.26562 0 Td +<000d> Tj +9.26562 0 Td +<0029> Tj +3.76562 0 Td +<000d> Tj +9.26562 0 Td +<000d> Tj +ET +Q +/CSp cs +0 0 0 scn +/GSa gs +0 0 0 SCN +0 w +2 J +2 j +[ ] 0 d +q +/CSp cs +0 0 0 scn +/GSa gs +BT +/F6 16 Tf +1 0 0 -1 0 0 Tm +15 -653 Td +<002e> Tj +9.64062 0 Td +<0024> Tj +3.79688 0 Td +<0007> Tj +8.45312 0 Td +<001d> Tj +7.96875 0 Td +<002f> Tj +6.9375 0 Td +<0007> Tj +8.45312 0 Td +<0008> Tj +4.04688 0 Td +<0022> Tj +8.92188 0 Td +<002f> Tj +6.9375 0 Td +<0007> Tj +8.45312 0 Td +<0008> Tj +4.04688 0 Td +<001e> Tj +5.76562 0 Td +<0019> Tj +8.9375 0 Td +<0007> Tj +8.45312 0 Td +<0008> Tj +4.04688 0 Td +<001f> Tj +5.60938 0 Td +<0004> Tj +9.07812 0 Td +<0024> Tj +3.79688 0 Td +<0024> Tj +3.79688 0 Td +<0004> Tj +9.07812 0 Td +<0020> Tj +12.59375 0 Td +<0005> Tj +3.85938 0 Td +<0002> Tj +8.9375 0 Td +<0023> Tj +8.34375 0 Td +<0008> Tj +4.04688 0 Td +<0006> Tj +7.64062 0 Td +<0004> Tj +9.07812 0 Td +<0033> Tj +13.1875 0 Td +<0033> Tj +13.1875 0 Td +<0022> Tj +8.92188 0 Td +<0002> Tj +8.9375 0 Td +<0005> Tj +3.85938 0 Td +<0006> Tj +7.64062 0 Td +<001d> Tj +7.96875 0 Td +<001e> Tj +5.76562 0 Td +<0005> Tj +3.85938 0 Td +<0004> Tj +9.07812 0 Td +<0002> Tj +8.9375 0 Td +<0008> Tj +4.04688 0 Td +<001f> Tj +5.60938 0 Td +<0004> Tj +9.07812 0 Td +<001a> Tj +5.84375 0 Td +<0008> Tj +4.04688 0 Td +<0026> Tj +8.26562 0 Td +<0004> Tj +9.07812 0 Td +<0022> Tj +8.92188 0 Td +<001a> Tj +5.84375 0 Td +<0008> Tj +4.04688 0 Td +<0032> Tj +8.98438 0 Td +<001d> Tj +7.96875 0 Td +<0026> Tj +8.26562 0 Td +<0033> Tj +13.1875 0 Td +<0007> Tj +8.45312 0 Td +<0002> Tj +8.9375 0 Td +<001e> Tj +5.76562 0 Td +<0008> Tj +4.04688 0 Td +<0035> Tj +4.01562 0 Td +<0008> Tj +ET +Q +0 0 0 SCN +0 w +2 J +2 j +[ ] 0 d +q +/CSp cs +0 0 0 scn +/GSa gs +BT +/F7 16 Tf +1 0 0 -1 0 0 Tm +436 -653 Td +<0016> Tj +4.73438 0 Td +<0017> Tj +12.3125 0 Td +<0018> Tj +11.10938 0 Td +<0019> Tj +7.45312 0 Td +<001a> Tj +9.26562 0 Td +<001b> Tj +9.26562 0 Td +<001a> Tj +9.26562 0 Td +<001a> Tj +9.26562 0 Td +<0019> Tj +7.45312 0 Td +<001c> Tj +9.26562 0 Td +<001a> Tj +9.26562 0 Td +<0019> Tj +7.45312 0 Td +<001b> Tj +9.26562 0 Td +<001b> Tj +9.26562 0 Td +<001b> Tj +9.26562 0 Td +<001d> Tj +ET +Q +0 0 0 SCN +0 w +2 J +2 j +[ ] 0 d +q +/CSp cs +0 0 0 scn +/GSa gs +BT +/F6 16 Tf +1 0 0 -1 0 0 Tm +15 -693 Td +<002e> Tj +9.64062 0 Td +<001d> Tj +7.96875 0 Td +<0026> Tj +8.26562 0 Td +<0033> Tj +13.1875 0 Td +<0007> Tj +8.45312 0 Td +<0002> Tj +8.9375 0 Td +<001e> Tj +5.76562 0 Td +<0008> Tj +4.04688 0 Td +<001e> Tj +5.76562 0 Td +<0007> Tj +8.45312 0 Td +<001a> Tj +5.84375 0 Td +<0033> Tj +13.1875 0 Td +<002f> Tj +6.9375 0 Td +<0035> Tj +4.01562 0 Td +<0008> Tj +4.04688 0 Td +<000f> Tj +9.26562 0 Td +<000d> Tj +9.26562 0 Td +<0008> Tj +4.04688 0 Td +<0030> Tj +12.15625 0 Td +<001d> Tj +7.96875 0 Td +<0026> Tj +8.26562 0 Td +<002f> Tj +ET +Q +Q +q +/CSp cs +1 1 1 scn +/GSa gs +q +0.80046 0 0 0.80046 0 0 cm +489 -1 348 234 re +f +Q +Q +q +0.80046 0 0 0.80046 0 0 cm +/CSp cs +0 0 0 scn +/GSa gs +0 0 0 SCN +0 w +2 J +2 j +[ ] 0 d +q +/CSp cs +0 0 0 scn +/GSa gs +BT +/F6 17 Tf +1 0 0 -1 0 0 Tm +515 -118 Td +<0030> Tj +12.92188 0 Td +<0007> Tj +8.98438 0 Td +<0006> Tj +8.125 0 Td +<0004> Tj +9.64062 0 Td +<0008> Tj +4.29688 0 Td +<0036> Tj +11.54688 0 Td +<0034> Tj +9.53125 0 Td +<0034> Tj +9.53125 0 Td +<0005> Tj +4.10938 0 Td +<0006> Tj +8.125 0 Td +<001e> Tj +ET +Q +0 0 0 SCN +0 w +2 J +2 j +[ ] 0 d +q +/CSp cs +0 0 0 scn +/GSa gs +BT +/F6 17 Tf +1 0 0 -1 0 0 Tm +515 -135 Td +<002d> Tj +9.85938 0 Td +<002d> Tj +9.85938 0 Td +<0008> Tj +4.29688 0 Td +<001c> Tj +9.23438 0 Td +<001d> Tj +8.46875 0 Td +<0002> Tj +9.5 0 Td +<001e> Tj +6.125 0 Td +<001d> Tj +8.46875 0 Td +<0008> Tj +4.29688 0 Td +<0037> Tj +11.01562 0 Td +<001d> Tj +8.46875 0 Td +<001a> Tj +6.20312 0 Td +<0038> Tj +9.53125 0 Td +<001d> Tj +8.46875 0 Td +<001a> Tj +6.20312 0 Td +<001d> Tj +8.46875 0 Td +<0008> Tj +4.29688 0 Td +<0013> Tj +10.6875 0 Td +<0034> Tj +ET +Q +0 0 0 SCN +0 w +2 J +2 j +[ ] 0 d +q +/CSp cs +0 0 0 scn +/GSa gs +BT +/F6 17 Tf +1 0 0 -1 0 0 Tm +515 -152 Td +<002e> Tj +10.25 0 Td +<0024> Tj +4.03125 0 Td +<0007> Tj +8.98438 0 Td +<001d> Tj +8.46875 0 Td +<002f> Tj +7.375 0 Td +<001d> Tj +8.46875 0 Td +<0002> Tj +9.5 0 Td +<001e> Tj +6.125 0 Td +<0008> Tj +4.29688 0 Td +<0039> Tj +13 0 Td +<0005> Tj +4.10938 0 Td +<0024> Tj +4.03125 0 Td +<0024> Tj +4.03125 0 Td +<0008> Tj +4.29688 0 Td +<0027> Tj +11.32812 0 Td +<0036> Tj +11.54688 0 Td +<0008> Tj +4.29688 0 Td +<0016> Tj +9.85938 0 Td +<003a> Tj +9.85938 0 Td +<0028> Tj +9.85938 0 Td +<000c> Tj +9.85938 0 Td +<000f> Tj +ET +Q +0 0 0 SCN +0 w +2 J +2 j +[ ] 0 d +q +/CSp cs +0 0 0 scn +/GSa gs +BT +/F6 17 Tf +1 0 0 -1 0 0 Tm +515 -169 Td +<0012> Tj +12.51562 0 Td +<0002> Tj +9.5 0 Td +<0005> Tj +4.10938 0 Td +<001e> Tj +6.125 0 Td +<0007> Tj +8.98438 0 Td +<0034> Tj +9.53125 0 Td +<0008> Tj +4.29688 0 Td +<001c> Tj +9.23438 0 Td +<001e> Tj +6.125 0 Td +<001d> Tj +8.46875 0 Td +<001e> Tj +6.125 0 Td +<0007> Tj +8.98438 0 Td +<002f> Tj +7.375 0 Td +<0008> Tj +4.29688 0 Td +<0004> Tj +9.64062 0 Td +<001f> Tj +5.96875 0 Td +<0008> Tj +4.29688 0 Td +<0036> Tj +11.54688 0 Td +<0033> Tj +14.01562 0 Td +<0007> Tj +8.98438 0 Td +<001a> Tj +6.20312 0 Td +<0005> Tj +4.10938 0 Td +<0006> Tj +8.125 0 Td +<001d> Tj +ET +Q +0 0 0 SCN +0 w +2 J +2 j +[ ] 0 d +q +/CSp cs +0 0 0 scn +/GSa gs +BT +/F7 16 Tf +1 0 0 -1 0 0 Tm +15 -311 Td +<0016> Tj +4.73438 0 Td +<000a> Tj +9.01562 0 Td +<001e> Tj +8.4375 0 Td +<0009> Tj +9.1875 0 Td +<0006> Tj +4.0625 0 Td +<0004> Tj +7.70312 0 Td +<0002> Tj +8.53125 0 Td +<0010> Tj +3.875 0 Td +<0001> Tj +12.15625 0 Td +<000d> Tj +8.10938 0 Td +<0008> Tj +5.9375 0 Td +<0002> Tj +8.53125 0 Td +<001f> Tj +ET +Q +0 0 0 SCN +0 w +2 J +2 j +[ ] 0 d +q +/CSp cs +0 0 0 scn +/GSa gs +BT +/F6 16 Tf +1 0 0 -1 0 0 Tm +15 -335 Td +<000e> Tj +9.26562 0 Td +<000c> Tj +9.26562 0 Td +<000b> Tj +7.25 0 Td +<000d> Tj +9.26562 0 Td +<0015> Tj +9.26562 0 Td +<000b> Tj +7.25 0 Td +<000c> Tj +9.26562 0 Td +<000d> Tj +9.26562 0 Td +<000c> Tj +9.26562 0 Td +<000c> Tj +ET +Q +0 0 0 SCN +0 w +2 J +2 j +[ ] 0 d +q +/CSp cs +0 0 0 scn +/GSa gs +BT +/F7 16 Tf +1 0 0 -1 0 0 Tm +449 -311 Td +<0001> Tj +12.15625 0 Td +<000c> Tj +9.01562 0 Td +<0002> Tj +8.53125 0 Td +<0010> Tj +3.875 0 Td +<0001> Tj +12.15625 0 Td +<000d> Tj +8.10938 0 Td +<0008> Tj +5.9375 0 Td +<0002> Tj +8.53125 0 Td +<001f> Tj +ET +Q +0 0 0 SCN +0 w +2 J +2 j +[ ] 0 d +q +/CSp cs +0 0 0 scn +/GSa gs +BT +/F6 16 Tf +1 0 0 -1 0 0 Tm +449 -335 Td +<000d> Tj +9.26562 0 Td +<000e> Tj +9.26562 0 Td +<000b> Tj +7.25 0 Td +<000d> Tj +9.26562 0 Td +<002d> Tj +9.26562 0 Td +<000b> Tj +7.25 0 Td +<000c> Tj +9.26562 0 Td +<000d> Tj +9.26562 0 Td +<000c> Tj +9.26562 0 Td +<000f> Tj +ET +Q +Q +q +/CSp cs +0 0 0 scn +/GSa gs +q +0.80046 0 0 0.80046 0 0 cm +449 538 160 1 re +f +Q +/CSp cs +0 0 0 scn +/GSa gs +q +0.80046 0 0 0.80046 0 0 cm +609 538 243 1 re +f +Q +/CSp cs +0 0 0 scn +/GSa gs +q +0.80046 0 0 0.80046 0 0 cm +449 604 160 1 re +f +Q +/CSp cs +0 0 0 scn +/GSa gs +q +0.80046 0 0 0.80046 0 0 cm +609 604 243 1 re +f +Q +/CSp cs +0 0 0 scn +/GSa gs +q +0.80046 0 0 0.80046 0 0 cm +449 604 160 1 re +f +Q +/CSp cs +0 0 0 scn +/GSa gs +q +0.80046 0 0 0.80046 0 0 cm +609 604 243 1 re +f +Q +/CSp cs +0.87059 0.88627 0.90196 scn +/GSa gs +q +0.80046 0 0 0.80046 0 0 cm +449 571 160 1 re +f +Q +/CSp cs +0.87059 0.88627 0.90196 scn +/GSa gs +q +0.80046 0 0 0.80046 0 0 cm +609 571 243 1 re +f +Q +/CSp cs +0.87059 0.88627 0.90196 scn +/GSa gs +q +0.80046 0 0 0.80046 0 0 cm +449 571 160 1 re +f +Q +/CSp cs +0.87059 0.88627 0.90196 scn +/GSa gs +q +0.80046 0 0 0.80046 0 0 cm +609 571 243 1 re +f +Q +Q +q +0.80046 0 0 0.80046 0 0 cm +/CSp cs +0 0 0 scn +/GSa gs +0 0 0 SCN +0 w +2 J +2 j +[ ] 0 d +q +/CSp cs +0 0 0 scn +/GSa gs +BT +/F7 16 Tf +1 0 0 -1 0 0 Tm +453 -559 Td +<0020> Tj +8.76562 0 Td +<000c> Tj +9.01562 0 Td +<0021> Tj +9.07812 0 Td +<0008> Tj +5.9375 0 Td +<0009> Tj +9.1875 0 Td +<0008> Tj +5.9375 0 Td +<000d> Tj +8.10938 0 Td +<0022> Tj +ET +Q +/CSp cs +0.12941 0.1451 0.16078 scn +/GSa gs +0.12941 0.1451 0.16078 SCN +0 w +2 J +2 j +[ ] 0 d +q +/CSp cs +0.12941 0.1451 0.16078 scn +/GSa gs +BT +/F6 16 Tf +1 0 0 -1 0 0 Tm +753 -559 Td +<002c> Tj +9.26562 0 Td +<0008> Tj +ET +Q +0.12941 0.1451 0.16078 SCN +0 w +2 J +2 j +[ ] 0 d +q +/CSp cs +0.12941 0.1451 0.16078 scn +/GSa gs +BT +/F6 16 Tf +1 0 0 -1 0 0 Tm +766 -559 Td +<000e> Tj +9.26562 0 Td +<000c> Tj +9.26562 0 Td +<0028> Tj +9.26562 0 Td +<002a> Tj +3.64062 0 Td +<000d> Tj +9.26562 0 Td +<000d> Tj +9.26562 0 Td +<000d> Tj +9.26562 0 Td +<0029> Tj +3.76562 0 Td +<000d> Tj +9.26562 0 Td +<000d> Tj +ET +Q +0.12941 0.1451 0.16078 SCN +0 w +2 J +2 j +[ ] 0 d +q +/CSp cs +0.12941 0.1451 0.16078 scn +/GSa gs +BT +/F6 16 Tf +1 0 0 -1 0 0 Tm +453 -592 Td +<0018> Tj +9.46875 0 Td +<001d> Tj +7.96875 0 Td +<003b> Tj +8.03125 0 Td +<0008> Tj +4.04688 0 Td +<000e> Tj +9.26562 0 Td +<0028> Tj +9.26562 0 Td +<002b> Tj +ET +Q +0.12941 0.1451 0.16078 SCN +0 w +2 J +2 j +[ ] 0 d +q +/CSp cs +0.12941 0.1451 0.16078 scn +/GSa gs +BT +/F6 16 Tf +1 0 0 -1 0 0 Tm +762 -592 Td +<002c> Tj +9.26562 0 Td +<0008> Tj +4.04688 0 Td +<000e> Tj +9.26562 0 Td +<0015> Tj +9.26562 0 Td +<002a> Tj +3.64062 0 Td +<002d> Tj +9.26562 0 Td +<0028> Tj +9.26562 0 Td +<000d> Tj +9.26562 0 Td +<0029> Tj +3.76562 0 Td +<000d> Tj +9.26562 0 Td +<000d> Tj +ET +Q +/CSp cs +0 0 0 scn +/GSa gs +0 0 0 SCN +0 w +2 J +2 j +[ ] 0 d +q +/CSp cs +0 0 0 scn +/GSa gs +BT +/F7 16 Tf +1 0 0 -1 0 0 Tm +453 -625 Td +<0012> Tj +9.59375 0 Td +<0009> Tj +9.1875 0 Td +<0008> Tj +5.9375 0 Td +<000d> Tj +8.10938 0 Td +<0022> Tj +ET +Q +/CSp cs +0.12941 0.1451 0.16078 scn +/GSa gs +0.12941 0.1451 0.16078 SCN +0 w +2 J +2 j +[ ] 0 d +q +/CSp cs +0.12941 0.1451 0.16078 scn +/GSa gs +BT +/F6 16 Tf +1 0 0 -1 0 0 Tm +753 -625 Td +<002c> Tj +9.26562 0 Td +<0008> Tj +ET +Q +0.12941 0.1451 0.16078 SCN +0 w +2 J +2 j +[ ] 0 d +q +/CSp cs +0.12941 0.1451 0.16078 scn +/GSa gs +BT +/F6 16 Tf +1 0 0 -1 0 0 Tm +766 -625 Td +<000e> Tj +9.26562 0 Td +<003a> Tj +9.26562 0 Td +<000f> Tj +9.26562 0 Td +<002a> Tj +3.64062 0 Td +<002d> Tj +9.26562 0 Td +<0028> Tj +9.26562 0 Td +<000d> Tj +9.26562 0 Td +<0029> Tj +3.76562 0 Td +<000d> Tj +9.26562 0 Td +<000d> Tj +ET +Q +Q +Q +q +q +0 0 0 SCN +0 w +2 J +2 j +[ ] 0 d +Q +q +1 0 0 1 0 -124.13333 cm +/CSp cs +0 0 0 scn +/GSa gs +0 0 0 SCN +0 w +2 J +0 j +[ ] 0 d +Q +Q +q +0 -124.13333 m +693.99999 -124.13333 l +693.99999 929.27381 l +0 929.27381 l +0 -124.13333 l +h +W* +n +q +0.80046 0 0 0.80046 0 -124.13333 cm +/CSp cs +0 0 0 scn +/GSa gs +0 0 0 SCN +0 w +2 J +0 j +[ ] 0 d +Q +q +/CSp cs +1 1 1 scn +/GSa gs +q +0.80046 0 0 0.80046 0 -124.13333 cm +0 0 867 142 re +f +Q +Q +q +0.80046 0 0 0.80046 0 -124.13333 cm +/CSp cs +0 0 0 scn +/GSa gs +0 0 0 SCN +0 w +2 J +0 j +[ ] 0 d +q +/GSa gs +0.37333 0 0 0.375 15 0 cm +/CSp cs +0 0 0 scn +/GSa gs +450 0 0 -120 0 120 cm +/Im11 Do +Q +Q +q +/CSp cs +0 0 0 scn +/GSa gs +q +0.80046 0 0 0.80046 0 -124.13333 cm +15 45 837 1 re +f +Q +Q +q +0.80046 0 0 0.80046 0 -124.13333 cm +/CSp cs +0 0 0 scn +/GSa gs +0 0 0 SCN +0 w +2 J +2 j +[ ] 0 d +q +/CSp cs +0 0 0 scn +/GSa gs +BT +/F6 16 Tf +1 0 0 -1 0 0 Tm +15 -62 Td +<003c> Tj +10.04688 0 Td +<0004> Tj +9.07812 0 Td +<0022> Tj +8.92188 0 Td +<001a> Tj +5.84375 0 Td +<0027> Tj +10.65625 0 Td +<0004> Tj +9.07812 0 Td +<0033> Tj +13.1875 0 Td +<0032> Tj +8.98438 0 Td +<001d> Tj +7.96875 0 Td +<0002> Tj +8.9375 0 Td +<0026> Tj +ET +Q +0 0 0 SCN +0 w +2 J +2 j +[ ] 0 d +q +/CSp cs +0 0 0 scn +/GSa gs +BT +/F6 16 Tf +1 0 0 -1 0 0 Tm +15 -86 Td +<000c> Tj +9.26562 0 Td +<0028> Tj +9.26562 0 Td +<000d> Tj +9.26562 0 Td +<0008> Tj +4.04688 0 Td +<003d> Tj +9.21875 0 Td +<003b> Tj +8.03125 0 Td +<0007> Tj +8.45312 0 Td +<0006> Tj +7.64062 0 Td +<0022> Tj +8.92188 0 Td +<001e> Tj +5.76562 0 Td +<0005> Tj +3.85938 0 Td +<0003> Tj +8.28125 0 Td +<0007> Tj +8.45312 0 Td +<0008> Tj +4.04688 0 Td +<002e> Tj +9.64062 0 Td +<001d> Tj +7.96875 0 Td +<001a> Tj +5.84375 0 Td +<0031> Tj +8.1875 0 Td +<0008> Tj +4.04688 0 Td +<0037> Tj +10.375 0 Td +<0024> Tj +3.79688 0 Td +<0003> Tj +8.28125 0 Td +<0034> Tj +8.96875 0 Td +<002a> Tj +3.64062 0 Td +<0008> Tj +4.04688 0 Td +<001c> Tj +8.6875 0 Td +<0022> Tj +8.92188 0 Td +<0005> Tj +3.85938 0 Td +<001e> Tj +5.76562 0 Td +<0007> Tj +8.45312 0 Td +<0008> Tj +4.04688 0 Td +<000f> Tj +9.26562 0 Td +<003a> Tj +9.26562 0 Td +<000d> Tj +9.26562 0 Td +<000d> Tj +ET +Q +0 0 0 SCN +0 w +2 J +2 j +[ ] 0 d +q +/CSp cs +0 0 0 scn +/GSa gs +BT +/F6 16 Tf +1 0 0 -1 0 0 Tm +15 -110 Td +<001c> Tj +8.6875 0 Td +<001d> Tj +7.96875 0 Td +<0002> Tj +8.9375 0 Td +<0008> Tj +4.04688 0 Td +<0011> Tj +9.04688 0 Td +<001a> Tj +5.84375 0 Td +<001d> Tj +7.96875 0 Td +<0002> Tj +8.9375 0 Td +<0006> Tj +7.64062 0 Td +<0005> Tj +3.85938 0 Td +<002f> Tj +6.9375 0 Td +<0006> Tj +7.64062 0 Td +<0004> Tj +9.07812 0 Td +<0008> Tj +4.04688 0 Td +<0027> Tj +10.65625 0 Td +<0036> Tj +10.875 0 Td +<0008> Tj +4.04688 0 Td +<0016> Tj +9.26562 0 Td +<003a> Tj +9.26562 0 Td +<000e> Tj +9.26562 0 Td +<000f> Tj +9.26562 0 Td +<003a> Tj +ET +Q +0 0 0 SCN +0 w +2 J +2 j +[ ] 0 d +q +/CSp cs +0 0 0 scn +/GSa gs +BT +/F6 16 Tf +1 0 0 -1 0 0 Tm +15 -134 Td +<0012> Tj +11.78125 0 Td +<0002> Tj +8.9375 0 Td +<0005> Tj +3.85938 0 Td +<001e> Tj +5.76562 0 Td +<0007> Tj +8.45312 0 Td +<0034> Tj +8.96875 0 Td +<0008> Tj +4.04688 0 Td +<001c> Tj +8.6875 0 Td +<001e> Tj +5.76562 0 Td +<001d> Tj +7.96875 0 Td +<001e> Tj +5.76562 0 Td +<0007> Tj +8.45312 0 Td +<002f> Tj +6.9375 0 Td +<0008> Tj +4.04688 0 Td +<0004> Tj +9.07812 0 Td +<001f> Tj +5.60938 0 Td +<0008> Tj +4.04688 0 Td +<0036> Tj +10.875 0 Td +<0033> Tj +13.1875 0 Td +<0007> Tj +8.45312 0 Td +<001a> Tj +5.84375 0 Td +<0005> Tj +3.85938 0 Td +<0006> Tj +7.64062 0 Td +<001d> Tj +ET +Q +Q +Q +q +q +1 0 0 1 0 -124.13333 cm +/CSp cs +0 0 0 scn +/GSa gs +0 0 0 SCN +0 w +2 J +0 j +[ ] 0 d +Q +q +0 0 0 SCN +0 w +2 J +2 j +[ ] 0 d +Q +q +1 0 0 1 0 798 cm +/CSp cs +0 0 0 scn +/GSa gs +0 0 0 SCN +0 w +2 J +0 j +[ ] 0 d +Q +Q +q +0 798 m +693.99999 798 l +693.99999 1851.40713 l +0 1851.40713 l +0 798 l +h +W* +n +q +0.80046 0 0 0.80046 0 798 cm +/CSp cs +0 0 0 scn +/GSa gs +0 0 0 SCN +0 w +2 J +0 j +[ ] 0 d +Q +q +/CSp cs +1 1 1 scn +/GSa gs +q +0.80046 0 0 0.80046 0 798 cm +0 0 867 65 re +f +Q +Q +q +0.80046 0 0 0.80046 0 798 cm +/CSp cs +0 0 0 scn +/GSa gs +0 0 0 SCN +0 w +2 J +0 j +[ ] 0 d +Q +Q +q +0 798 m +693.99999 798 l +693.99999 1851.40713 l +0 1851.40713 l +0 798 l +h +W* +n +12.00692 798 m +648.37369 798 l +648.37369 850.02999 l +12.00692 850.02999 l +12.00692 798 l +h +W* +n +q +0.80046 0 0 0.80046 0 798 cm +/CSp cs +0 0 0 scn +/GSa gs +0 0 0 SCN +0 w +2 J +0 j +[ ] 0 d +Q +q +/CSp cs +0 0 0 scn +/GSa gs +q +0.80046 0 0 0.80046 0 798 cm +15 0 795 1 re +f +Q +Q +Q +q +q +/CSp cs +0 0 0 scn +/GSa gs +Q +Q +q +0 798 m +693.99999 798 l +693.99999 1851.40713 l +0 1851.40713 l +0 798 l +h +W* +n +q +/CSp cs +0 0 0 scn +/GSa gs +Q +q +0.80046 0 0 0.80046 0 798 cm +/CSp cs +0 0 0 scn +/GSa gs +0 0 0 SCN +0 w +2 J +0 j +[ ] 0 d +Q +Q +q +0 798 m +693.99999 798 l +693.99999 1851.40713 l +0 1851.40713 l +0 798 l +h +W* +n +12.00692 798 m +648.37369 798 l +648.37369 850.02999 l +12.00692 850.02999 l +12.00692 798 l +h +W* +n +q +0.80046 0 0 0.80046 0 798 cm +/CSp cs +0 0 0 scn +/GSa gs +0 0 0 SCN +0 w +2 J +0 j +[ ] 0 d +Q +Q +q +q +0.80046 0 0 0.80046 0 798 cm +/CSp cs +0 0 0 scn +/GSa gs +0 0 0 SCN +0 w +2 J +0 j +[ ] 0 d +Q +Q +q +0 798 m +693.99999 798 l +693.99999 1851.40713 l +0 1851.40713 l +0 798 l +h +W* +n +q +0.80046 0 0 0.80046 0 798 cm +/CSp cs +0 0 0 scn +/GSa gs +0 0 0 SCN +0 w +2 J +0 j +[ ] 0 d +Q +q +0.80046 0 0 0.80046 0 798 cm +/CSp cs +0 0 0 scn +/GSa gs +0 0 0 SCN +0 w +2 J +0 j +[ ] 0 d +Q +Q +q +0 798 m +693.99999 798 l +693.99999 1851.40713 l +0 1851.40713 l +0 798 l +h +W* +n +12.00692 798 m +648.37369 798 l +648.37369 850.02999 l +12.00692 850.02999 l +12.00692 798 l +h +W* +n +q +0.80046 0 0 0.80046 0 798 cm +/CSp cs +0 0 0 scn +/GSa gs +0 0 0 SCN +0 w +2 J +0 j +[ ] 0 d +0 0 0 SCN +0 w +2 J +2 j +[ ] 0 d +q +/CSp cs +0 0 0 scn +/GSa gs +BT +/F6 16 Tf +1 0 0 -1 0 0 Tm +157 -17 Td +<003e> Tj +9.26562 0 Td +<000e> Tj +9.26562 0 Td +<0008> Tj +4.04688 0 Td +<003f> Tj +4.28125 0 Td +<0040> Tj +9.26562 0 Td +<0028> Tj +9.26562 0 Td +<000d> Tj +9.26562 0 Td +<0041> Tj +4.28125 0 Td +<0008> Tj +4.04688 0 Td +<0028> Tj +9.26562 0 Td +<0028> Tj +9.26562 0 Td +<0028> Tj +9.26562 0 Td +<001b> Tj +5.9375 0 Td +<000d> Tj +9.26562 0 Td +<000e> Tj +9.26562 0 Td +<000e> Tj +9.26562 0 Td +<000e> Tj +9.26562 0 Td +<0008> Tj +ET +Q +0 0 0 SCN +0 w +2 J +2 j +[ ] 0 d +q +/CSp cs +0 0 0 scn +/GSa gs +BT +/F6 16 Tf +1 0 0 -1 0 0 Tm +303 -17 Td +<0005> Tj +3.85938 0 Td +<0002> Tj +8.9375 0 Td +<001f> Tj +5.60938 0 Td +<0004> Tj +9.07812 0 Td +<0042> Tj +13.39062 0 Td +<0026> Tj +8.26562 0 Td +<0004> Tj +9.07812 0 Td +<0022> Tj +8.92188 0 Td +<001a> Tj +5.84375 0 Td +<0006> Tj +7.64062 0 Td +<0004> Tj +9.07812 0 Td +<0033> Tj +13.1875 0 Td +<0032> Tj +8.98438 0 Td +<001d> Tj +7.96875 0 Td +<0002> Tj +8.9375 0 Td +<0026> Tj +8.26562 0 Td +<0029> Tj +3.76562 0 Td +<0006> Tj +7.64062 0 Td +<0004> Tj +9.07812 0 Td +<0033> Tj +ET +Q +0 0 0 SCN +0 w +2 J +2 j +[ ] 0 d +q +/CSp cs +0 0 0 scn +/GSa gs +BT +/F6 16 Tf +1 0 0 -1 0 0 Tm +482 -17 Td +<0008> Tj +ET +Q +0 0 0 SCN +0 w +2 J +2 j +[ ] 0 d +q +/CSp cs +0 0 0 scn +/GSa gs +BT +/F6 16 Tf +1 0 0 -1 0 0 Tm +486 -17 Td +<0019> Tj +8.9375 0 Td +<001e> Tj +5.76562 0 Td +<001e> Tj +5.76562 0 Td +<0032> Tj +8.98438 0 Td +<0035> Tj +4.01562 0 Td +<000b> Tj +7.25 0 Td +<000b> Tj +7.25 0 Td +<0020> Tj +12.59375 0 Td +<0020> Tj +12.59375 0 Td +<0020> Tj +12.59375 0 Td +<0029> Tj +3.76562 0 Td +<0007> Tj +8.45312 0 Td +<003b> Tj +8.03125 0 Td +<001d> Tj +7.96875 0 Td +<0033> Tj +13.1875 0 Td +<0032> Tj +8.98438 0 Td +<0024> Tj +3.79688 0 Td +<0007> Tj +8.45312 0 Td +<0029> Tj +3.76562 0 Td +<0006> Tj +7.64062 0 Td +<0004> Tj +9.07812 0 Td +<0033> Tj +ET +Q +/CSp cs +0.42353 0.45882 0.4902 scn +/GSa gs +0.42353 0.45882 0.4902 SCN +0 w +2 J +2 j +[ ] 0 d +q +/CSp cs +0.42353 0.45882 0.4902 scn +/GSa gs +BT +/F6 16 Tf +1 0 0 -1 0 0 Tm +375 -57 Td +<002e> Tj +9.64062 0 Td +<001d> Tj +7.96875 0 Td +<0023> Tj +8.34375 0 Td +<0007> Tj +8.45312 0 Td +<0035> Tj +4.01562 0 Td +<0008> Tj +ET +Q +0.42353 0.45882 0.4902 SCN +0 w +2 J +2 j +[ ] 0 d +q +/CSp cs +0.42353 0.45882 0.4902 scn +/GSa gs +BT +/F6 16 Tf +1 0 0 -1 0 0 Tm +417 -57 Td +<000e> Tj +ET +Q +0.42353 0.45882 0.4902 SCN +0 w +2 J +2 j +[ ] 0 d +q +/CSp cs +0.42353 0.45882 0.4902 scn +/GSa gs +BT +/F6 16 Tf +1 0 0 -1 0 0 Tm +426 -57 Td +<0008> Tj +4.04688 0 Td +<000b> Tj +7.25 0 Td +<0008> Tj +ET +Q +0.42353 0.45882 0.4902 SCN +0 w +2 J +2 j +[ ] 0 d +q +/CSp cs +0.42353 0.45882 0.4902 scn +/GSa gs +BT +/F6 16 Tf +1 0 0 -1 0 0 Tm +441 -57 Td +<000e> Tj +ET +Q +Q +Q +q +q +0.80046 0 0 0.80046 0 798 cm +/CSp cs +0.42353 0.45882 0.4902 scn +/GSa gs +0.42353 0.45882 0.4902 SCN +0 w +2 J +2 j +[ ] 0 d +Q +Q +q +0 798 m +693.99999 798 l +693.99999 1851.40713 l +0 1851.40713 l +0 798 l +h +W* +n +q +0.80046 0 0 0.80046 0 798 cm +/CSp cs +0.42353 0.45882 0.4902 scn +/GSa gs +0.42353 0.45882 0.4902 SCN +0 w +2 J +2 j +[ ] 0 d +Q +q +0.80046 0 0 0.80046 0 798 cm +/CSp cs +0 0 0 scn +/GSa gs +0 0 0 SCN +0 w +2 J +0 j +[ ] 0 d +Q +Q +q +0 798 m +693.99999 798 l +693.99999 1851.40713 l +0 1851.40713 l +0 798 l +h +W* +n +12.00692 798 m +648.37369 798 l +648.37369 850.02999 l +12.00692 850.02999 l +12.00692 798 l +h +W* +n +q +0.80046 0 0 0.80046 0 798 cm +/CSp cs +0 0 0 scn +/GSa gs +0 0 0 SCN +0 w +2 J +0 j +[ ] 0 d +Q +Q +q +q +0.80046 0 0 0.80046 0 798 cm +/CSp cs +0 0 0 scn +/GSa gs +0 0 0 SCN +0 w +2 J +0 j +[ ] 0 d +Q +Q +q +0 798 m +693.99999 798 l +693.99999 1851.40713 l +0 1851.40713 l +0 798 l +h +W* +n +q +0.80046 0 0 0.80046 0 798 cm +/CSp cs +0 0 0 scn +/GSa gs +0 0 0 SCN +0 w +2 J +0 j +[ ] 0 d +Q +q +0.80046 0 0 0.80046 0 798 cm +/CSp cs +0 0 0 scn +/GSa gs +0 0 0 SCN +0 w +2 J +0 j +[ ] 0 d +Q +Q +q +q +1 0 0 1 0 798 cm +/CSp cs +0 0 0 scn +/GSa gs +0 0 0 SCN +0 w +2 J +0 j +[ ] 0 d +Q +q +0 0 0 SCN +0 w +2 J +2 j +[ ] 0 d +Q +Q +Q +q +1 0 0 1 0 0 cm +BT +/F1 12 Tf +14.4 TL +ET +255 255 255 rg +n +0 0 595.2756 14.17323 re +f* +n +0 841.8898 595.2756 -14.17323 re +f* +n +0 0 14.17323 841.8898 re +f* +n +595.2756 0 -14.17323 841.8898 re +f* +n +0 0 42.51969 42.51969 re +f* +Q + +endstream +endobj +7 0 obj +<> +stream +xn8NN,dјE&qۉ4%'b:`icQ%e~2U99ݻw777㱮9g8Y)&4<52KdlYyVȜ^k8Y) 4<5252g  +_꺄)88-r5r]L޶.uւRszFnׄ9֨VZHq0]N~ shzE;窭w)1REq0apXs}"LB`R@i<[(յۧ8 g?l|L̵?) 8Ù~? =[#uQHqpSN5wE]q)&4t1) ֮Kѳ=Lq)&4NwH}) )8H8Shm9zQLHq0 ?Ӕ&[)GHq0ν@QguQHqpVz(&8I}ۮ[sߑ CHq0)pS\˝8`c,K8zm.S6REq0pk ̱>`R@ӆc[O# eQHq:-PeREq0#\F™:hh+&8y}SJq0)psOIu#ל.)l亘\,Ph}kDP` g5;VtQLHq0uyѝOQ#\3Rq2m.S&A8x8OF2(&8y9Χ_~]ުYp.zÇ_c/ g3%k7ʢGrQ( +,:pn|VrpJB7/#8߾}Eώ3Xt:i,j-w>8cێ嶲"y}}͞?ekS)S1n5}w>5թVϗs fXE]жBVNEqMƟcw詘E{DP)mFVVN-]}ZYt\\Uąa8@dMJpڍd.Wl'vx#5@75zɢDCƑS),5r+iܽ0|;vHXfq9593,'l\[)̢[)TbP%YԪ-#}a^jt`gN]v$b8Y=>>f/ô'r +q# ,I-8q$R%B{3qY"pD.)lFhTё7> CL %Z6a"pY"pR@kstkY) .gmvqp8Q;?o-ˍs1zH67I~ 9UrZ`9 7-fQG蘋5!]KlQͱV\Mg̢8Z8-%@t8cY}iM(vڗ/_8|G~݋͢{9+.92z׫.!tjɪIv"d0uW6p{$@ĿV6\#~/:Y3j:3jcumM@w(?:^yUѭI +h4:,Z +lr4PA5BɫdB ͕֙m܆8TtI +߭W.ωg*Go>06&T7_]pS2oօY2+P+m4J7!NJw+[?aF.O #=>`5D)Y4ZٲW(m] 膭;yy/o 1 _gY*.+%GR@zi#C=>j~S͗EQ8M=-iGO-2[ʨEsEJ~7j3,"u ?:QV?}š92);E6돊nW|Npo|om٢FakJsE]#Qno!Wz.}{,?:ME,҇6Zqãe^d\F+e}.dv-4*e辧3[n^Y8l7r&R{?:H0N!_ң]őe=OӲęEZx%@pdBSPv&5$/VM3gt ?I/@&WCdQ@DCB~tg~p 5pã\ߩёJʽÇXY{ORh,v]gا֙U[1WCC9__zT(xElQt9Nv09~Їem(b! br+ f|O>}DG'm٬1-v>dQp=0;lƪ(:if4 &yteEH ZS8"/rz1Ôi᭍(lY| le^|<*}!M +ECfoj!NE?l&[,dstVTYl|#٪DGl-Iʖ=OXPCNt 7:2qSv!!. g'I?~pDi #fiIt8T6iGKT6ѩMtAeΧ̶{V\a8^7r)8CG44.mDIZZ/ ]dR;~t82[t:4N®Ej冽*fӔ׭njc8y![tefKCȻwD4Il"k_SIoZ "wl}ہߓzilA][dyaspDeH qF"{Dz}X[Y8bǏ7VT2[k*b8`h8sqO5?CsmppD+nete/ 5-RhxH.їmĬlѾOy5hdoa5)]ܳ? .8r(qDeHޤ)(& HFa+3FKEMMTn/m(Mm ѺL/-ϸZ.WhD{a*Z_|B+)%N)[ 9p]7ܲJ ]N bs*[<+ͩlNe_!"f+O]ZAx_~٩6^?,<Dә _; 3 A^t}ZZ)^F6@nQ蓄h뽓1{ܽ;dΧ.)cy:9C{ugΞ6 Vxe ǏQ:f,V6ީ>~ QـqƗ.}a1q޽=*[9 gfLL +RH+)g=v,)'ÉTD6R[WfqTɢ/b5Tegxhmޡ76đ"gfkw׎ +VtZP.ۅ\(s S/&ez, tȢsl4wY,2,%2DN] +leփֺvMT\]~V!NeI5%"k&kFih87- Kil?lu?ϱ%t ܲdJhNy E`0.kteQ, S(b5vƴ~-R$YRh2#ٯdѩeGqˢ޸е1E{idjM[V% +y=0Z{w}YX0;25w;ޥbiES78,ZaR8M=sNM h1I.kl7`::6͢+N4c/-ohtggf,ddQ]v/k%Βn1u*x*T9PhU,0mF|ihѡ)͢)9(͢aek f^wDENE9>`^aaUt hE8F%0׼tDhtӊ(,JZ1@|i6r}rF-I|Pن[\2_e}Z]Qa[>7T̢.}f~gle ',݁lYRdsϟ?WTS7;a,2[OUpL;s=kf]stoHEE 4ŚNv>ULh$xd2kS81,\c4Rtr.їv#6G86qv?(j4Uϗ.Iqm~vB΂[tu{w{:+Hi8XJ,:S<<؄y8D#^__iTs] #Vw]$(l8˖qq]9rk (&嫨x758e[Oi8˖qڥPўpљ:ˑPeREq0-[u)x,:S1w8"-:/-w ^uK[KHq0]ND +ϚQLa1ӹ`F9Ur)qOѹf'E쨀Fs3\'H8.˥}Eg#` 4,B?;j5Ô)1REq0apm[uמ0)*805Aq0) 4N/}i) 83âg]q.)r 87w .8F[Fsbw>U@Hq0g}iKpQHq34?Z=a]q8R@pso +k}ia) 8R8F2xD7m [C(f8˕tku9nu_ZLIq)&k F25RLHq0 n5_őJq)pc|8`F3u𾴀`R@p\};*8.LG2tX[@q0#\3 gnS8`8kswORLᤚe|8.3 RLh> +stream +xyǧwv]a!(\`%)J@1FsEދQ(|DѨA0OEH}љ~u0=ꯙ|[dĊUO["&X17@ +Iƣ҄ۏ0IJCk` ר~3AVBg ABXBg A\\ pݜfZHq/J S !ot:<]HEUJhV,:03t€r{4vC`@ g8) QY©~A^B@k ~62i̾^"%秘r0DeJo;xzpоQ9e1Jhy+# SY +½l;SeT^Vw'lH[1` +n[QU~': 4b%ԈW OYDsA[#q;Go;2BLc(v t>C+拝x昑Ç@Y%$aਲ਼4A'b8~?a0tqp5es" T9GI{}@s. Z;ɬۺ|\2 8HmV +"0z]^] L+_W[{)5 ٧gΑCw,6IVNxvΔ6wӘgJ`{ٌ"j~uC!vbp?1v)MV$wŹ>vpҪn2H$(/Ә:Vu1= h +-u WJ?R^d)I\`隸]׃.6U!KIPmFjssZ1OcL׻A9 vgxȤHt3xM& +%; + :qn(usВ8/1 #B@ㅠ}`InĠ_^ܭn53YJ Ҷo m?ÑI + :ae Bd;)X'*;yq'q"B.$H&p0 828l|h7&P"MuB J{8:ǜ~m]D+TrARX0񷉞א kD_c ^;#nR `{rKo= Q8vCJلM4D6_ceIt8H_Pst QCؑpc+h%{xIV9AT1Y)u<+q_o8÷xK3,0L n5|վ;(@ 'q; XF ε܄?2' L nw88: Kxi J&3@L :$%aKğZ(iO4'A] +D8JmB7HCKOzuj5e+SӍtpCFᦐOueC;Qf@HozQBn(i)pzSR.Eq ?_Gm]9TRMujwI/9tC\&hIozH\SBnAJ +% "1 D*!jw߆wK/K8< )'\UvdC#!x~8#qpvCICoGYJ9I%dK-β?^  8ؙQ;܆Ñ8x* ) DA H*( + Z0J!e 8X(s$brc|P +1Jr39)hVŽ{!eJБRJѺ<=Éz;8mu1=RPRAoGA)4Ak0, w4-cwZp"\r~ tQw$dZq7 -c2-_/Gq^6 \@)p8js$eJwwVzӶ32+m.􅠣U^XGV%)_}h A"8HHV(&ޱ0}v&չ|2Z{3x~7r#p')RMW"w*cԑ@^m~M>|j2۸)Ͷ{IoD `ԑ@ +@HNj3_`.q7o25)_A:;Ź [-ŃLohȀoӿ<poN%!nwGHAn1 @ +Z4I}jP'N?\\~δZn(H<‹ϴD # i} 5w_x73 .URDO 1 Fɣ3 8*_^ܘW%EB췿G$4Wܐ{S[PDVK$4WJiU1_yEa u1d R9$|Ҥ')E^xxCB^g JH D +)b>=(3! m~ +endstream +endobj +12 0 obj +<> +stream +/CIDInit /ProcSet findresource begin +12 dict begin +begincmap +/CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def +/CMapName /Adobe-Identity-UCS def +/CMapType 2 def +1 begincodespacerange +<0000> +endcodespacerange +2 beginbfrange +<0000> <0000> <0000> +<0001> <0022> [<0044> <0065> <0073> <0063> <0072> <0069> <0070> <0074> <006F> <006E> <0051> <0075> <0061> <0079> <0055> <0020> <0050> <0054> <0078> <0041> <006D> <0049> <004E> <0056> <002F> <0032> <0030> <0031> <0033> <0076> <003A> <0053> <0062> <006C> ] +endbfrange +endcmap +CMapName currentdict /CMap defineresource pop +end +end + +endstream +endobj +14 0 obj +<> +stream +xXytWuoVh}44#ih}%*d;Nlf>I_<<BHBph@@GJN'PBh9'4֨-CBOG;{w߽=!jA 1BŒg0.,֗&:{W2-<ُ"dPϵ|zJvG? +Ndʹr!,>S޽B(;S?H"9%k$EHzԄ/-bE$I"h0ze(j?D)׸?(K$ȜD$}Zu{ZJyt +]{3BL}Ly)7h-w]A$B!_o`*lio.J~-.]+.岙Le?^h3f +=<^s7_.LN~M/. `be$h lkMMRƩ@+ GU4yUjF]ftSHmTo S:}fj:؉76vwGFtXq:%ݸ>q\ьFVmk5;,W`f.3Nw&dSPrUX:6ˬ]i]Aj0F{ɎSp*dv.l5h<V3v:C2t,(P6@0YX}X"+mm'TJU;Zm:Fӛ,Hd䶑h +`JV:cҠY6^VϓOvpb?xkr/&v{Vn0dn)+.*zS1 o<6>=nF&T~o{Jc^e1c\ehTǵaפ2[TDbv9?f +1n$XFFb]FIo$Ioŏu摣G3 [}h82{ݩОXa z WYD|=kyvv_gv8⍣g%rĬ6^2oGognL"B-,LNBm$`w&ά;:22z#c@= tLͱ8g{wS?q'O8DZԩC'e*Fނ-?p?%񉩹"mx?01paaq|FW%2xe'F€Hсƣ)=㑨ņ%|' 絗qlpMV??'~ +rGMT454sZ 雖mfqo4ZC`+3N}v_D熡06`PEѩdxo_$j4`U +A{bvtK%5z~RFϟL'^TOfςrLN䳍+qs?&I`U"1j<|^er1 .5xݡQ~_>gqs;u֗tzۿxc:Alpx…M飠MEZ8Ɠ%}Πw^_=&#6?%~5BGE h^D*J8n|NC!+ؙ̤͞tGSG湍`+(L^=l|.;Cv8#nlrD$vJәz@L3G5Dc5{svÊܗN=Π U6Ǵz#{{:9F˥=nͫ\Wl>_%'}о\Vggl`'R>` +X`fهNR󑇟}ODbw~gjۆF{FFlmpp'PPƣPe~o^_y+BbbD"W=W_{1^LOwɶnaۧL7]1%gXww3P;=64.jf]xӮbU?1zP׌l4A +ӕ_'HTgjP'̮{s}.nfz\P)ޮPw:ޮ7<׹]${+aI*8d/LڧO- VڪT ƙuŸ|<h<.Jyekq q<٦n&No1_*vzlҨTb}YmdmEBor~?VkLF.ZKu`"rcoltv}frrd4> mnWgWo(v≡x ~jKfR3:LZיlvlu#k4mv?|V4enY(\v`pǡ}hў!yh|=qYSf.d(:vL\Q\mxgԙpPV( 6*^jHTOFb|Z; kW50,>p:|+py? ي6ᑭQI;?>Ye4߇)utQԂ%UXhJ^toUEI$}ׁ]7ߐAe]2y H> F)>IIR(ɡ7whZtA >.,d^T,MJW+҆,!{Xq kr>hZ.H) (SJ!I 7}ܸ5  GZB-J%‰+-OٰEH?$hJJ5F_ +Ġ (H?yJE@Oh)J/ _h9ZL[PeVݲ.Jyc݊:@P^'jA=Dyu-ԘPIaיr![3g _rW[aUr3R9-@VF\-Ua^ʳ2f0VZXfJ+D4l=^.&2d(B}==sG{"=8,N lJ=x2lӥ\2J6LyM-č[bYR62K"WXgl[./z>!f5tl],f;Y=YP2D$UW:l L*v^`%([-CVˠJ˒\Tr5̬Vrs?՘J^3U-2\ N-UWAjeV *ob9@#zYyZȮe-pnB V l5́{rl`jZ 0{׸\փ*X`\m;ұ[rXe+JR,e(3VUW)DjenGP.eٳ_<?P&!5mf-[݅00Dr}y7_!rY* +5QTLQe\RSZ+T)ҝH0aY[ jR9j +KK;kEN +1\*c",K!O\[&+'Nra}uʬ ,h ̭B U&A\I@? u]f!iU8kl@~VH泇ǘՕr+j,JS=+co6̼jO3ԋT?o]?CoMMiڰpjr-gbM2ZE먂8VP 1ls~FT-ZVY#q aVEmr򛃑5|*|+<] RABFY+U:ݙadu JڝwK> +stream +/CIDInit /ProcSet findresource begin +12 dict begin +begincmap +/CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def +/CMapName /Adobe-Identity-UCS def +/CMapType 2 def +1 begincodespacerange +<0000> +endcodespacerange +2 beginbfrange +<0000> <0000> <0000> +<0001> <0042> [<0049> <006E> <0076> <006F> <0069> <0063> <0065> <0020> <004E> <0056> <002F> <0032> <0030> <0031> <0033> <005B> <0046> <0055> <0052> <005F> <0038> <0039> <005D> <0054> <0068> <0072> <002D> <0053> <0061> <0074> <0066> <0077> <004C> <0075> <0067> <006C> <0047> <0079> <0043> <0035> <002E> <002C> <0025> <0024> <0037> <0050> <0073> <0044> <006B> <0070> <006D> <0064> <003A> <0041> <0042> <0062> <0048> <0034> <0078> <0059> <0045> <002B> <0028> <0036> <0029> <0040> ] +endbfrange +endcmap +CMapName currentdict /CMap defineresource pop +end +end + +endstream +endobj +18 0 obj +<> +stream +xzyt#ygW>}t$HCrs3 Hpp.IcY%K#ʶؖoglGJ^6ȑ-9vvMlgwHr Qdc~] !&%xqhe9z#< +s+ j{KZes /oDkJ-a9b6sd4Ha+k(\ӫ玝!1kB@P0~yѯ<$瑼#ȭ/>Dq[Q^E} }&'2Oo$14q T2b4^'nEn/> ]~m7/;5W5>8x7{z`L&yRT vɤV!5`k +ܦՔAo6%HWJ-T?m]wCh'h&zV՘/{,V^3@aG"T.on25jT)CHV[ح{>,|]@3: +\!b07>M "C ڭT.@C S&O,J)p<wSA|" x]BŤ1#T=IVRQ"$>ħdrewR g' \BjT-{`(4^;=[nWL剱QFǞxrt Q>lC^B><sg0W`wkw~Hj{w7tIel heX2j5uO:BiѤI%:hZLZ ^hOmi@& +ה]F]mŘ3Ѹc{`c͈7/Ujl7}~u~29[ZQ6d*57=vtOKc}rP(məHق*FM!nrο͌ 4GG)b`2SGڈ5:3w3 ̛Gxfcc}$=&$OyTaf?efzzNZwl`m4 +`;/TԹpшԔFKq,9%`~ +yE +a15yęZJ oDs&ZuDyM 6@Njc\ +-:-fh!7iV-AȤr_Z?o +n*(m)_iU-PDz{ ]#V[,)_l2Z ? |ڑ٩ lMgXC3 V$Ϝ=r 9Иl>66;~D~a\ j]nc2Mf`hX&CV{<1>qnrhX8.F3hMz#aVQ*} +P;x0Z?9PwgC[S??Ǔn-KƑ F2FF߱ήp +p _u6o=1;c,g/ 8lk>Gk Kk  %Su<7G15g6Q+o`ُ#_<{)cC"(O[ӻ𮶛~0ͺblHF4pR +cG[^R#3}}F1p8 cU1I!@7,(}=*V[eppz8hk'Nkȑ6mQ7%:~c4L Hs=qj0͡Vî"'L  +iX ,Rzʤ?0Po qArȚ"6?3[ +z%/t +~.aM俜lX c+=2>xY-ᡧ ^޹zH0 +9Nszl,r8J#`e'Ce/߭`y}fcq!d +vtO;htǿ;h4LO? +n &߯55m~;DL2Gt:7ﹷ#2P oykx˷r!"n-n&h.Gx-o٬VV]7mW LNOy|hdJ[lOMBآ;K>0 >YjMA:H::ɤ}hv(Hv2-=}Hp:Z"*;xљScG/J'\>z1pjdanv.F/tF[{pK$bb\MHK8Lt`qk=fZ=8`Lq1sȑթѱV<}OrrVe7xTW:ڒ=rj1:#Bvk2q¹G{^r?ޞlM$[b%_y Z7Dc. X 4Ctg\ FEQؚ!I ( (0/at=,ETgƗ/@eC!_d]O!`EɿNjS(\|zc)yaTD>hB.s|p H(TRV[CClyFȻim]C*I>BfY7>]Qv 3?pDdsgRrm'2.9-ўޞh`\==3흱XcH)WTihKwwOOBh?vxjXZM@u:jo +v> %e2{\yXl0Zm5+k ج:^oC鹃FRFq&һ*n['q,Y׳u!QSx)D͑n0 1+_ngNd6}laTnDlBJtH$YîIѨܮDl-nr;;+Nƥw2eT3}E͌;`k" OkKYSjDJ˦l5.Uerj^G).d0vTZ{X(E|t6d6aڔ)x$f.kgQ \AwR@Vss?=b;26՟ +\?r`4_(EBVK({j{O65Dkخkܡ d;7%bH"_C:5—dP "ٟzꗞKV"񅰝1s|e@nPr @m{pMG~Tl6YLS>e7*xCd,z~|:K>O.+SC-j4/7JTSc4 F>|}7^ K>I~SW:b(׹'h"îRs;o;;Իk])v' \KI3 V=Gt9- L|xj4O7[b1h +!p$⣣Czd֨.F]@ +iJ/(Pm'V &ƆH|Pht'aycx"z3zidxwWdziѠTPTbgv^.tdp96X|$B!b(ЅA6G!&j&:,c3CDGݥ}YqT= ׮=ޛ[Hze3|Xoo*AMf ۻ&d;z}Pd&sG=r=;ɕ&t()VVF=\8?6 rJCr2p.' l]E,WhOR:fRjP" #rQKH +`$ 1"a@0ZI9oW_W+Owߟ|<'?z̐X"U,`wLqf{ҧO{-&/HPJ1ށ}sY. H5uZ#w=|~dCZi1E>֊"Np$f o'gb:IZ:2[s':;84['AW[^OKtp# +Ή{^"!7Z |G3iG06MT u ${1'+[8g;p_dRjF&AH"cF;\Vy\,`?Q}hE2Uׇe6j8lŒǣP*DR8Xzۅrjw[іfS"JjVk2 Iؽ[ +M^bX%{)VѾӥ76pXj[oG~r/,Ps{WpGgSlAP;:;:;!d<>'m4))&#y|RJ)-]Ҿ@a+&A&h +`K}pEI)*L҃6Hx0} HHd`D_s^:B}}ͦ6[8؇2֜R,|oGņD)~=!bdFY{]Z^S,1QIo[%o( Py8롹~~uhHPi͐kD|#v['KIJaVNtGt`sx!yN_Qq}JsЍ}iZξfR-щ2h6ĤJg֔-xR}j 0 +JVI6{fdW/U*m54V12tLZ +}K硆< +~ ?q׋h(IěO)ͦdT@7&L"@)nOw>={wA҃d_==M=}GAқSpf:;-,=rQoMهlZCڎ/ θZ)W &MFڡzxcǤƃ;IϜ]~M=? s ^_أAU?T?Z<1:lNg{Tl@ "m#cH]Hx0E.Wz }ge.;:؈ζj*g5zFh-zz.u~s'RWeЙ^5ŢNF/c٠Ti EgZ|ʟ5 ʅIQG(܆.w#m@qzuR B=NwWPeyj3R 'ɑXjGY@jx__kK[ҨՀ1!why>;2@V1@Z-o ݐӗڷG{pUjLHV;2[m&eM<[ZTTB07Fuax cٮ46+5]}4T&R :Y#E n^ mO0Y[[a &2s]m?R3uCg<@0XlG&Ae9jl{>Vo[G;~'ܴXᑓhqcH:hD~튄VzhT3jَXkz=uv`cީ#Oium` C1M->xz@ xz3|聆b޻vl/;y4W`ۿ}Eu:pao,j\ŸG>0U{c2$k+zגϑp_ID/hdHT?ic6-kP puSsļ{~oFL[H D&SznRP*>_2RE҈~#+)Tz);\ޣV(eէ(lm"@wzL˛?{ަVѠRei1ɡ!%Ұ j:#C5OS{ղ=v ?jy}@|=!cX5<(q'O :Y} L"8B'^3zukLHԚZE& 8&8x x 5?0sf©S}q]V7g%w76 CC ՖihFSS'z>H`Ζ2{`)t-0@5jkz1*\SF"O̔JE̩cDOҋ3^@򕻯]\XxA3Ջؓ,mI' jֿ={n)1:eoASbm]&98t;r +`w>sP"|N(BGn\k(xrG.^:q2֒L?rQ(G7t:3;>Lvk<62rBSG ["6pv٬tCf Cyqy^c]Og7Gnc^_=(?={}N BHS\(޿_$\ i OyRU.<)gNSO"'YJ_i"gW S5ebAL"$\ x??M§>7ssHgy_$|a& >kDJO4/ƒ0A x\װgN^&k > X +/4\ Ć{ D +"0v a0:򂏳 8 .cb h =~E_ȗx?Y? w K,?.~U%JRe (Q|Y/ʇQǨR[ꃪ[!j4&ϴN&+4Y'/=}~:& pSk~kឿ?B?\[DDb„|\[BPkKyϡ -#L!ז-V/sm%aja'a6" 4& $ӢE͇{εD\[H<-"Ή\[LDWpRQI\[FDTm\[N̫\[TȵD\3ŵUXVr{ŵ+RnH48=w\9\,dVUzj>75/+Kd+]C +}0]JjWs%FCk AXTWh8 +`6=ϯL RK8IvwPm#wLOCp&&"mmi&cH4M"ޞ/RV2tq-9m WckL6G/dV+|_\l5`WV# <];ǰLgJ̥\*I@ 5I+9paFӣ`=+Ӱl[X/2%l\qa+|d |_]Jb)_tBy˭uTW+.}\ci8Ls;s>_^+dʋL &_) *Ws0= d r9Jŵb/iXb_̗s\\)귘c +J%WZ(V5A3%z)SZ)^[Ȅ +;_*xB.w~Gb<9.v(nd*5])A-/.ax@dXB^*4{D9*|̪6wz!+`a-Rjp+"z^ap1g%3Tj`f\12cGcUyb)@{[/b͎E"MbR^ҭ\)X]v .k`UNAS39w +GiXRP%,%}Rq5j{_Tڛ/]ƚz8[\i~啛kwnzoѷ oL^-*p9_K͇`ayX#%"O,BQ!hBE-n q84u8 3 DX%gX'U +W'r0s ~+@&& q&*A4+B+trp_ή,e\dw{׽]Ecl4mbxR[۶]5IYWZ6齾Sq&aCͺܬ48/vsiK\ ,5[c> +ld&5ܗX Z K;E؝f[;~Ǽ2zg467sXy5Vo٨ 4wYtwJfTo +endstream +endobj +21 0 obj +<> +stream +xSIs0&̒?PEbmW\Ž6 >ON\םaOַS2{O"Q 8-?WeTD`0ZT~}܈q EqX'o*bs<9`8 _==RTJ 9Q +*pB$f2`<0D7o;{Ѥ0e>Jwҭi$9odʛX:a:BI,:0&MM+TF/lSwNꎎjѫ6q6m1G>y5xImKjX5+ ʩ6[F5q@ٰS /6 | s/0+ +o}3q)-U7' 7]9}q>ɂQWq8+qe08$^PYW-4u`258z8|&ӗ +endstream +endobj +20 0 obj +499 +endobj +29 0 obj +<> +endobj +32 0 obj +<> +stream +x]Rn0+|LI$d)FЇJ{z xA㤇ʹ fzi +NjоR~YEu*u^ht7ynb-(2n-cԷiPJ/`>։X >*%+m0,I/K(d2R C9==v#&҉gG g` ,84 J3|# pÓ;hU,pO|FxQ$䷝cNnnf] ~vk(81rg b +endstream +endobj +33 0 obj +332 +endobj +35 0 obj +<> +stream +xiPow-Y¾M-la ]QED\@EptXdQT\ +88*tMիW޿}nD0rŢ`_OzDd Ƀ9qi}wowܙ tTYPx .X@B<9;}ǼU$g\-1HV,I ̓q +p6Iib+eq|i&gJHQ6YbY>)BM8an! l>mmÞkd @-D9Cn@DNԀƀlp@ +"j @ +/K'~s A`@p"x"B p0F!*.Pb"q+@L|H|C"tI$i tt4BHV"Yh|IO~CP )(RGDyL Gc6U5˽'{ȯ_'_*VAPQؤPpNaHaZhXxRNP[tL(Eգ\6j 2uشDZ'Z/mJYIV9L9[BTbVIV)R92i4,_^u*_5_Qu@][-ImZ#ur,':/._xf XT#Xc1ӚZi5/iNjhk%jhuhMhS]%_Еdz>#ѩՙ5]ۨHԋ+қ_A^i`pཡaq#U#:zc7tj&XI!ۦii-3L`vȬch.46bLF=cBbEE+K}(˽=_쬒js۬1T]DYhEmlmQb`/opwqtbҘABUGfvǏNNb3N:3O:/6Z_\xEׅR"uƸuqܪݞkݟ{x$zxi)l|rbmduz|zWx{?] 7dsu)䀐KL-/ݷ2ee- /QQPzЯ˱˃W,l!'&dȻPТ+$+âއ{K#,#6F܈TDF¢jWzܿr,.:/zpѪUVN^}~Κ119jt,;2vJx|~1yK\qxK҄IKP.xx$}R`|JL90I؝ڗf&MwJߟ>% +f@2Z4GrSb,.tͬu6[1[}s]kYzz :n豱j)vSf͹Ƕn95io9V99ookݒ;w{}\(oh#;;;{w-up|^҂υ?XPݽEE` u{Xx]辥K%%oԶiْփ\P>PYXQ!ޡh)8*ߪjccǞՄVqquuu'5NSѧnSkQ48-9瘟:)ϸe_L} p6ev;bf6 k?#IeΎ*C8\>AO=@vT|! +{9AWwd^kǷXj5iP{2s1Vp(90q|_l5L y UH[߼-35mH bHȑuI;njTX I1#NE6sKAd#cξ1Wٙ/,PtJ# +endstream +endobj +34 0 obj +2567 +endobj +39 0 obj +<> +stream + + + + + uuid:2BB22C32-386D-E09B-5187-D700555C6E54 + uuid:01DB539D-576F-86BE-8B40-43B7294F4648 + + + 2023-02-20T11:00:19+01:00 + 2023-02-20T11:00:19+01:00 + + + PDFlib+PDI 10.0.1 (PHP/Linux-x64) + + + + +endstream +endobj +38 0 obj +939 +endobj +40 0 obj +<>>>/Pages 1 0 R/Metadata 39 0 R>> +endobj +9 0 obj +<> +stream +xWKoFW1Aa>$W-7I!@K+L +$$ˏ4rk켖;gFQ,PRFJaD|dEH9S/662BYi# zD([ЩK#Q +zBςqhj" WDJcxP5[C4*8|ɧ?yYNʢ|bZbAW]:Q4lV.Pm=-&kʃ~ gh geE(.ߋW; g~*$䣻 b^yXuSݽWPH/6Gz ׫2\ LJUSViEy:<~oCr9MTXY8sHn Bm.FcVضa(6~2ٿ[lz^N٢A(7d lO{b' .8PA: j-!E['2h|_IS@zfA=R}Px0D$ Mb,5ʁv +`KE X'H:P Xeo} 0  +h[jB^ڈ! +(I>MvS1|69 .b_7Ƈ<1F4DAAAD91D8A73855CA218F137F7ACD>]/DecodeParms<>/Length 197 >> +stream +xuαJayOt\" +@%\܊+hnpho̖RTKˏ9Gv&'a$cNNrO׾ֹ-h>s+$zρg!%~2]{WdwN-?b77W&EW鐱c.:y;wbaaC"4; +endstream +endobj +startxref +64178 +%%EOF diff --git a/content/applications/finance/accounting/customer_invoices/terms_conditions.rst b/content-rst/applications/finance/accounting/customer_invoices/terms_conditions.rst similarity index 100% rename from content/applications/finance/accounting/customer_invoices/terms_conditions.rst rename to content-rst/applications/finance/accounting/customer_invoices/terms_conditions.rst diff --git a/content-rst/applications/finance/accounting/customer_invoices/terms_conditions/terms-note.png b/content-rst/applications/finance/accounting/customer_invoices/terms_conditions/terms-note.png new file mode 100644 index 000000000..061aa8648 Binary files /dev/null and b/content-rst/applications/finance/accounting/customer_invoices/terms_conditions/terms-note.png differ diff --git a/content-rst/applications/finance/accounting/customer_invoices/terms_conditions/terms-webpage.png b/content-rst/applications/finance/accounting/customer_invoices/terms_conditions/terms-webpage.png new file mode 100644 index 000000000..8ee82a3d7 Binary files /dev/null and b/content-rst/applications/finance/accounting/customer_invoices/terms_conditions/terms-webpage.png differ diff --git a/content/applications/finance/accounting/get_started.rst b/content-rst/applications/finance/accounting/get_started.rst similarity index 100% rename from content/applications/finance/accounting/get_started.rst rename to content-rst/applications/finance/accounting/get_started.rst diff --git a/content-rst/applications/finance/accounting/get_started/accounting-onboarding-banner.png b/content-rst/applications/finance/accounting/get_started/accounting-onboarding-banner.png new file mode 100644 index 000000000..dc78e9972 Binary files /dev/null and b/content-rst/applications/finance/accounting/get_started/accounting-onboarding-banner.png differ diff --git a/content/applications/finance/accounting/get_started/avg_price_valuation.rst b/content-rst/applications/finance/accounting/get_started/avg_price_valuation.rst similarity index 100% rename from content/applications/finance/accounting/get_started/avg_price_valuation.rst rename to content-rst/applications/finance/accounting/get_started/avg_price_valuation.rst diff --git a/content-rst/applications/finance/accounting/get_started/avg_price_valuation/accounting-entry-8-tables.png b/content-rst/applications/finance/accounting/get_started/avg_price_valuation/accounting-entry-8-tables.png new file mode 100644 index 000000000..dde1cff5f Binary files /dev/null and b/content-rst/applications/finance/accounting/get_started/avg_price_valuation/accounting-entry-8-tables.png differ diff --git a/content-rst/applications/finance/accounting/get_started/avg_price_valuation/create-price-difference.png b/content-rst/applications/finance/accounting/get_started/avg_price_valuation/create-price-difference.png new file mode 100644 index 000000000..e8d3a3440 Binary files /dev/null and b/content-rst/applications/finance/accounting/get_started/avg_price_valuation/create-price-difference.png differ diff --git a/content-rst/applications/finance/accounting/get_started/avg_price_valuation/expensing-price-difference-account.png b/content-rst/applications/finance/accounting/get_started/avg_price_valuation/expensing-price-difference-account.png new file mode 100644 index 000000000..855f384a4 Binary files /dev/null and b/content-rst/applications/finance/accounting/get_started/avg_price_valuation/expensing-price-difference-account.png differ diff --git a/content-rst/applications/finance/accounting/get_started/avg_price_valuation/inventory-val-8-tables.png b/content-rst/applications/finance/accounting/get_started/avg_price_valuation/inventory-val-8-tables.png new file mode 100644 index 000000000..f71ac0854 Binary files /dev/null and b/content-rst/applications/finance/accounting/get_started/avg_price_valuation/inventory-val-8-tables.png differ diff --git a/content-rst/applications/finance/accounting/get_started/avg_price_valuation/inventory-val-send-10-tables.png b/content-rst/applications/finance/accounting/get_started/avg_price_valuation/inventory-val-send-10-tables.png new file mode 100644 index 000000000..fe9851782 Binary files /dev/null and b/content-rst/applications/finance/accounting/get_started/avg_price_valuation/inventory-val-send-10-tables.png differ diff --git a/content-rst/applications/finance/accounting/get_started/avg_price_valuation/inventory-valuation-return.png b/content-rst/applications/finance/accounting/get_started/avg_price_valuation/inventory-valuation-return.png new file mode 100644 index 000000000..5cadc6682 Binary files /dev/null and b/content-rst/applications/finance/accounting/get_started/avg_price_valuation/inventory-valuation-return.png differ diff --git a/content-rst/applications/finance/accounting/get_started/avg_price_valuation/receive-8-table-bill.png b/content-rst/applications/finance/accounting/get_started/avg_price_valuation/receive-8-table-bill.png new file mode 100644 index 000000000..dad32a8f9 Binary files /dev/null and b/content-rst/applications/finance/accounting/get_started/avg_price_valuation/receive-8-table-bill.png differ diff --git a/content-rst/applications/finance/accounting/get_started/avg_price_valuation/return-credit-note.png b/content-rst/applications/finance/accounting/get_started/avg_price_valuation/return-credit-note.png new file mode 100644 index 000000000..d0efef393 Binary files /dev/null and b/content-rst/applications/finance/accounting/get_started/avg_price_valuation/return-credit-note.png differ diff --git a/content-rst/applications/finance/accounting/get_started/avg_price_valuation/search-for-entry-of-tables.png b/content-rst/applications/finance/accounting/get_started/avg_price_valuation/search-for-entry-of-tables.png new file mode 100644 index 000000000..fe9e14e29 Binary files /dev/null and b/content-rst/applications/finance/accounting/get_started/avg_price_valuation/search-for-entry-of-tables.png differ diff --git a/content-rst/applications/finance/accounting/get_started/avg_price_valuation/sell-10-tables.png b/content-rst/applications/finance/accounting/get_started/avg_price_valuation/sell-10-tables.png new file mode 100644 index 000000000..fea3dec47 Binary files /dev/null and b/content-rst/applications/finance/accounting/get_started/avg_price_valuation/sell-10-tables.png differ diff --git a/content/applications/finance/accounting/get_started/chart_of_accounts.rst b/content-rst/applications/finance/accounting/get_started/chart_of_accounts.rst similarity index 100% rename from content/applications/finance/accounting/get_started/chart_of_accounts.rst rename to content-rst/applications/finance/accounting/get_started/chart_of_accounts.rst diff --git a/content-rst/applications/finance/accounting/get_started/chart_of_accounts/account-groups.png b/content-rst/applications/finance/accounting/get_started/chart_of_accounts/account-groups.png new file mode 100644 index 000000000..eb90e504d Binary files /dev/null and b/content-rst/applications/finance/accounting/get_started/chart_of_accounts/account-groups.png differ diff --git a/content-rst/applications/finance/accounting/get_started/chart_of_accounts/chart-of-accounts-groups.png b/content-rst/applications/finance/accounting/get_started/chart_of_accounts/chart-of-accounts-groups.png new file mode 100644 index 000000000..afd62629b Binary files /dev/null and b/content-rst/applications/finance/accounting/get_started/chart_of_accounts/chart-of-accounts-groups.png differ diff --git a/content-rst/applications/finance/accounting/get_started/chart_of_accounts/chart-of-accounts-reconciliation.png b/content-rst/applications/finance/accounting/get_started/chart_of_accounts/chart-of-accounts-reconciliation.png new file mode 100644 index 000000000..8e17776bb Binary files /dev/null and b/content-rst/applications/finance/accounting/get_started/chart_of_accounts/chart-of-accounts-reconciliation.png differ diff --git a/content-rst/applications/finance/accounting/get_started/chart_of_accounts/chart-of-accounts-sort.png b/content-rst/applications/finance/accounting/get_started/chart_of_accounts/chart-of-accounts-sort.png new file mode 100644 index 000000000..fa1de4264 Binary files /dev/null and b/content-rst/applications/finance/accounting/get_started/chart_of_accounts/chart-of-accounts-sort.png differ diff --git a/content-rst/applications/finance/accounting/get_started/chart_of_accounts/drop-down.png b/content-rst/applications/finance/accounting/get_started/chart_of_accounts/drop-down.png new file mode 100644 index 000000000..9d36fac0b Binary files /dev/null and b/content-rst/applications/finance/accounting/get_started/chart_of_accounts/drop-down.png differ diff --git a/content/applications/finance/accounting/get_started/cheat_sheet.rst b/content-rst/applications/finance/accounting/get_started/cheat_sheet.rst similarity index 100% rename from content/applications/finance/accounting/get_started/cheat_sheet.rst rename to content-rst/applications/finance/accounting/get_started/cheat_sheet.rst diff --git a/content-rst/applications/finance/accounting/get_started/invoicing-onboarding-banner.png b/content-rst/applications/finance/accounting/get_started/invoicing-onboarding-banner.png new file mode 100644 index 000000000..b3de5c4b8 Binary files /dev/null and b/content-rst/applications/finance/accounting/get_started/invoicing-onboarding-banner.png differ diff --git a/content/applications/finance/accounting/get_started/multi_currency.rst b/content-rst/applications/finance/accounting/get_started/multi_currency.rst similarity index 100% rename from content/applications/finance/accounting/get_started/multi_currency.rst rename to content-rst/applications/finance/accounting/get_started/multi_currency.rst diff --git a/content-rst/applications/finance/accounting/get_started/multi_currency/currency-field.png b/content-rst/applications/finance/accounting/get_started/multi_currency/currency-field.png new file mode 100644 index 000000000..5876ca179 Binary files /dev/null and b/content-rst/applications/finance/accounting/get_started/multi_currency/currency-field.png differ diff --git a/content-rst/applications/finance/accounting/get_started/multi_currency/enable-foreign-currencies.png b/content-rst/applications/finance/accounting/get_started/multi_currency/enable-foreign-currencies.png new file mode 100644 index 000000000..606ec2059 Binary files /dev/null and b/content-rst/applications/finance/accounting/get_started/multi_currency/enable-foreign-currencies.png differ diff --git a/content-rst/applications/finance/accounting/get_started/multi_currency/exchange-journal-currency.png b/content-rst/applications/finance/accounting/get_started/multi_currency/exchange-journal-currency.png new file mode 100644 index 000000000..b0fcfbcd5 Binary files /dev/null and b/content-rst/applications/finance/accounting/get_started/multi_currency/exchange-journal-currency.png differ diff --git a/content-rst/applications/finance/accounting/get_started/multi_currency/foreign-fields.png b/content-rst/applications/finance/accounting/get_started/multi_currency/foreign-fields.png new file mode 100644 index 000000000..c640d69c9 Binary files /dev/null and b/content-rst/applications/finance/accounting/get_started/multi_currency/foreign-fields.png differ diff --git a/content-rst/applications/finance/accounting/get_started/multi_currency/journal-currency.png b/content-rst/applications/finance/accounting/get_started/multi_currency/journal-currency.png new file mode 100644 index 000000000..8e708f32b Binary files /dev/null and b/content-rst/applications/finance/accounting/get_started/multi_currency/journal-currency.png differ diff --git a/content-rst/applications/finance/accounting/get_started/multi_currency/manual-rate-update.png b/content-rst/applications/finance/accounting/get_started/multi_currency/manual-rate-update.png new file mode 100644 index 000000000..bffe0e853 Binary files /dev/null and b/content-rst/applications/finance/accounting/get_started/multi_currency/manual-rate-update.png differ diff --git a/content-rst/applications/finance/accounting/get_started/multi_currency/register-payment.png b/content-rst/applications/finance/accounting/get_started/multi_currency/register-payment.png new file mode 100644 index 000000000..39c87d31d Binary files /dev/null and b/content-rst/applications/finance/accounting/get_started/multi_currency/register-payment.png differ diff --git a/content-rst/applications/finance/accounting/get_started/setup_chart_of_accounts.png b/content-rst/applications/finance/accounting/get_started/setup_chart_of_accounts.png new file mode 100644 index 000000000..01a2142f2 Binary files /dev/null and b/content-rst/applications/finance/accounting/get_started/setup_chart_of_accounts.png differ diff --git a/content/applications/finance/accounting/get_started/tax_units.rst b/content-rst/applications/finance/accounting/get_started/tax_units.rst similarity index 100% rename from content/applications/finance/accounting/get_started/tax_units.rst rename to content-rst/applications/finance/accounting/get_started/tax_units.rst diff --git a/content-rst/applications/finance/accounting/get_started/tax_units/fiscal-positions.png b/content-rst/applications/finance/accounting/get_started/tax_units/fiscal-positions.png new file mode 100644 index 000000000..5b76a9cc9 Binary files /dev/null and b/content-rst/applications/finance/accounting/get_started/tax_units/fiscal-positions.png differ diff --git a/content-rst/applications/finance/accounting/get_started/tax_units/report.png b/content-rst/applications/finance/accounting/get_started/tax_units/report.png new file mode 100644 index 000000000..3a1f87278 Binary files /dev/null and b/content-rst/applications/finance/accounting/get_started/tax_units/report.png differ diff --git a/content/applications/finance/accounting/payments.rst b/content-rst/applications/finance/accounting/payments.rst similarity index 100% rename from content/applications/finance/accounting/payments.rst rename to content-rst/applications/finance/accounting/payments.rst diff --git a/content-rst/applications/finance/accounting/payments/add-option.png b/content-rst/applications/finance/accounting/payments/add-option.png new file mode 100644 index 000000000..b345eed6c Binary files /dev/null and b/content-rst/applications/finance/accounting/payments/add-option.png differ diff --git a/content/applications/finance/accounting/payments/batch.rst b/content-rst/applications/finance/accounting/payments/batch.rst similarity index 100% rename from content/applications/finance/accounting/payments/batch.rst rename to content-rst/applications/finance/accounting/payments/batch.rst diff --git a/content-rst/applications/finance/accounting/payments/batch/batch-customer-payment.png b/content-rst/applications/finance/accounting/payments/batch/batch-customer-payment.png new file mode 100644 index 000000000..2e54bf3ff Binary files /dev/null and b/content-rst/applications/finance/accounting/payments/batch/batch-customer-payment.png differ diff --git a/content-rst/applications/finance/accounting/payments/batch/batch-lines-selection.png b/content-rst/applications/finance/accounting/payments/batch/batch-lines-selection.png new file mode 100644 index 000000000..5612e0f04 Binary files /dev/null and b/content-rst/applications/finance/accounting/payments/batch/batch-lines-selection.png differ diff --git a/content-rst/applications/finance/accounting/payments/batch/batch-payments.png b/content-rst/applications/finance/accounting/payments/batch/batch-payments.png new file mode 100644 index 000000000..b6dd7db35 Binary files /dev/null and b/content-rst/applications/finance/accounting/payments/batch/batch-payments.png differ diff --git a/content-rst/applications/finance/accounting/payments/batch/batch-reconciliation.png b/content-rst/applications/finance/accounting/payments/batch/batch-reconciliation.png new file mode 100644 index 000000000..a20d5503c Binary files /dev/null and b/content-rst/applications/finance/accounting/payments/batch/batch-reconciliation.png differ diff --git a/content/applications/finance/accounting/payments/batch_sdd.rst b/content-rst/applications/finance/accounting/payments/batch_sdd.rst similarity index 100% rename from content/applications/finance/accounting/payments/batch_sdd.rst rename to content-rst/applications/finance/accounting/payments/batch_sdd.rst diff --git a/content-rst/applications/finance/accounting/payments/batch_sdd/creditor-identifier.png b/content-rst/applications/finance/accounting/payments/batch_sdd/creditor-identifier.png new file mode 100644 index 000000000..4689e201e Binary files /dev/null and b/content-rst/applications/finance/accounting/payments/batch_sdd/creditor-identifier.png differ diff --git a/content-rst/applications/finance/accounting/payments/batch_sdd/xml.png b/content-rst/applications/finance/accounting/payments/batch_sdd/xml.png new file mode 100644 index 000000000..e03a23950 Binary files /dev/null and b/content-rst/applications/finance/accounting/payments/batch_sdd/xml.png differ diff --git a/content/applications/finance/accounting/payments/checks.rst b/content-rst/applications/finance/accounting/payments/checks.rst similarity index 100% rename from content/applications/finance/accounting/payments/checks.rst rename to content-rst/applications/finance/accounting/payments/checks.rst diff --git a/content-rst/applications/finance/accounting/payments/checks/outstanding-payment-accounts.png b/content-rst/applications/finance/accounting/payments/checks/outstanding-payment-accounts.png new file mode 100644 index 000000000..05703eba1 Binary files /dev/null and b/content-rst/applications/finance/accounting/payments/checks/outstanding-payment-accounts.png differ diff --git a/content-rst/applications/finance/accounting/payments/checks/payment-checks.png b/content-rst/applications/finance/accounting/payments/checks/payment-checks.png new file mode 100644 index 000000000..91930cc06 Binary files /dev/null and b/content-rst/applications/finance/accounting/payments/checks/payment-checks.png differ diff --git a/content/applications/finance/accounting/payments/follow_up.rst b/content-rst/applications/finance/accounting/payments/follow_up.rst similarity index 100% rename from content/applications/finance/accounting/payments/follow_up.rst rename to content-rst/applications/finance/accounting/payments/follow_up.rst diff --git a/content-rst/applications/finance/accounting/payments/follow_up/debtor-level.png b/content-rst/applications/finance/accounting/payments/follow_up/debtor-level.png new file mode 100644 index 000000000..7f628a1b6 Binary files /dev/null and b/content-rst/applications/finance/accounting/payments/follow_up/debtor-level.png differ diff --git a/content/applications/finance/accounting/payments/forecast.rst b/content-rst/applications/finance/accounting/payments/forecast.rst similarity index 100% rename from content/applications/finance/accounting/payments/forecast.rst rename to content-rst/applications/finance/accounting/payments/forecast.rst diff --git a/content-rst/applications/finance/accounting/payments/information-icon.png b/content-rst/applications/finance/accounting/payments/information-icon.png new file mode 100644 index 000000000..03528e90b Binary files /dev/null and b/content-rst/applications/finance/accounting/payments/information-icon.png differ diff --git a/content/applications/finance/accounting/payments/online.rst b/content-rst/applications/finance/accounting/payments/online.rst similarity index 100% rename from content/applications/finance/accounting/payments/online.rst rename to content-rst/applications/finance/accounting/payments/online.rst diff --git a/content/applications/finance/accounting/payments/online/install_portal_patch.rst b/content-rst/applications/finance/accounting/payments/online/install_portal_patch.rst similarity index 100% rename from content/applications/finance/accounting/payments/online/install_portal_patch.rst rename to content-rst/applications/finance/accounting/payments/online/install_portal_patch.rst diff --git a/content-rst/applications/finance/accounting/payments/online/online-payment-providers.png b/content-rst/applications/finance/accounting/payments/online/online-payment-providers.png new file mode 100644 index 000000000..200a4e164 Binary files /dev/null and b/content-rst/applications/finance/accounting/payments/online/online-payment-providers.png differ diff --git a/content-rst/applications/finance/accounting/payments/online/pay-now.png b/content-rst/applications/finance/accounting/payments/online/pay-now.png new file mode 100644 index 000000000..16bc53afb Binary files /dev/null and b/content-rst/applications/finance/accounting/payments/online/pay-now.png differ diff --git a/content-rst/applications/finance/accounting/payments/online/view-invoice.png b/content-rst/applications/finance/accounting/payments/online/view-invoice.png new file mode 100644 index 000000000..e11d7aa5e Binary files /dev/null and b/content-rst/applications/finance/accounting/payments/online/view-invoice.png differ diff --git a/content-rst/applications/finance/accounting/payments/partial-payment.png b/content-rst/applications/finance/accounting/payments/partial-payment.png new file mode 100644 index 000000000..51be06f2c Binary files /dev/null and b/content-rst/applications/finance/accounting/payments/partial-payment.png differ diff --git a/content/applications/finance/accounting/payments/pay_checks.rst b/content-rst/applications/finance/accounting/payments/pay_checks.rst similarity index 100% rename from content/applications/finance/accounting/payments/pay_checks.rst rename to content-rst/applications/finance/accounting/payments/pay_checks.rst diff --git a/content/applications/finance/accounting/payments/pay_sepa.rst b/content-rst/applications/finance/accounting/payments/pay_sepa.rst similarity index 100% rename from content/applications/finance/accounting/payments/pay_sepa.rst rename to content-rst/applications/finance/accounting/payments/pay_sepa.rst diff --git a/content-rst/applications/finance/accounting/payments/payments-journal.png b/content-rst/applications/finance/accounting/payments/payments-journal.png new file mode 100644 index 000000000..18f9dc5ca Binary files /dev/null and b/content-rst/applications/finance/accounting/payments/payments-journal.png differ diff --git a/content/applications/finance/accounting/payments/trusted_accounts.rst b/content-rst/applications/finance/accounting/payments/trusted_accounts.rst similarity index 100% rename from content/applications/finance/accounting/payments/trusted_accounts.rst rename to content-rst/applications/finance/accounting/payments/trusted_accounts.rst diff --git a/content-rst/applications/finance/accounting/payments/trusted_accounts/send-money-toggle.png b/content-rst/applications/finance/accounting/payments/trusted_accounts/send-money-toggle.png new file mode 100644 index 000000000..4ec2f9c20 Binary files /dev/null and b/content-rst/applications/finance/accounting/payments/trusted_accounts/send-money-toggle.png differ diff --git a/content/applications/finance/accounting/reporting.rst b/content-rst/applications/finance/accounting/reporting.rst similarity index 100% rename from content/applications/finance/accounting/reporting.rst rename to content-rst/applications/finance/accounting/reporting.rst diff --git a/content/applications/finance/accounting/reporting/analytic_accounting.rst b/content-rst/applications/finance/accounting/reporting/analytic_accounting.rst similarity index 100% rename from content/applications/finance/accounting/reporting/analytic_accounting.rst rename to content-rst/applications/finance/accounting/reporting/analytic_accounting.rst diff --git a/content-rst/applications/finance/accounting/reporting/analytic_accounting/analytic_distribution.png b/content-rst/applications/finance/accounting/reporting/analytic_accounting/analytic_distribution.png new file mode 100644 index 000000000..f965fc08d Binary files /dev/null and b/content-rst/applications/finance/accounting/reporting/analytic_accounting/analytic_distribution.png differ diff --git a/content-rst/applications/finance/accounting/reporting/analytic_accounting/analytic_plans.png b/content-rst/applications/finance/accounting/reporting/analytic_accounting/analytic_plans.png new file mode 100644 index 000000000..53a1bbeec Binary files /dev/null and b/content-rst/applications/finance/accounting/reporting/analytic_accounting/analytic_plans.png differ diff --git a/content/applications/finance/accounting/reporting/budget.rst b/content-rst/applications/finance/accounting/reporting/budget.rst similarity index 100% rename from content/applications/finance/accounting/reporting/budget.rst rename to content-rst/applications/finance/accounting/reporting/budget.rst diff --git a/content-rst/applications/finance/accounting/reporting/budget/budget.png b/content-rst/applications/finance/accounting/reporting/budget/budget.png new file mode 100644 index 000000000..b66465a7e Binary files /dev/null and b/content-rst/applications/finance/accounting/reporting/budget/budget.png differ diff --git a/content-rst/applications/finance/accounting/reporting/budget/generate-budgets.png b/content-rst/applications/finance/accounting/reporting/budget/generate-budgets.png new file mode 100644 index 000000000..6dc0fa342 Binary files /dev/null and b/content-rst/applications/finance/accounting/reporting/budget/generate-budgets.png differ diff --git a/content/applications/finance/accounting/reporting/customize.rst b/content-rst/applications/finance/accounting/reporting/customize.rst similarity index 100% rename from content/applications/finance/accounting/reporting/customize.rst rename to content-rst/applications/finance/accounting/reporting/customize.rst diff --git a/content-rst/applications/finance/accounting/reporting/customize/engine-accounting-reports.png b/content-rst/applications/finance/accounting/reporting/customize/engine-accounting-reports.png new file mode 100644 index 000000000..99f4c3030 Binary files /dev/null and b/content-rst/applications/finance/accounting/reporting/customize/engine-accounting-reports.png differ diff --git a/content-rst/applications/finance/accounting/reporting/customize/engine-columns.png b/content-rst/applications/finance/accounting/reporting/customize/engine-columns.png new file mode 100644 index 000000000..7ca640e6b Binary files /dev/null and b/content-rst/applications/finance/accounting/reporting/customize/engine-columns.png differ diff --git a/content-rst/applications/finance/accounting/reporting/customize/engine-create-menu-item.png b/content-rst/applications/finance/accounting/reporting/customize/engine-create-menu-item.png new file mode 100644 index 000000000..fa63dd485 Binary files /dev/null and b/content-rst/applications/finance/accounting/reporting/customize/engine-create-menu-item.png differ diff --git a/content-rst/applications/finance/accounting/reporting/customize/engine-expressions.png b/content-rst/applications/finance/accounting/reporting/customize/engine-expressions.png new file mode 100644 index 000000000..e26867842 Binary files /dev/null and b/content-rst/applications/finance/accounting/reporting/customize/engine-expressions.png differ diff --git a/content-rst/applications/finance/accounting/reporting/customize/engine-lines-options.png b/content-rst/applications/finance/accounting/reporting/customize/engine-lines-options.png new file mode 100644 index 000000000..5ba69f622 Binary files /dev/null and b/content-rst/applications/finance/accounting/reporting/customize/engine-lines-options.png differ diff --git a/content-rst/applications/finance/accounting/reporting/customize/engine-variant.png b/content-rst/applications/finance/accounting/reporting/customize/engine-variant.png new file mode 100644 index 000000000..3c366e16e Binary files /dev/null and b/content-rst/applications/finance/accounting/reporting/customize/engine-variant.png differ diff --git a/content/applications/finance/accounting/reporting/data_inalterability.rst b/content-rst/applications/finance/accounting/reporting/data_inalterability.rst similarity index 100% rename from content/applications/finance/accounting/reporting/data_inalterability.rst rename to content-rst/applications/finance/accounting/reporting/data_inalterability.rst diff --git a/content-rst/applications/finance/accounting/reporting/data_inalterability/data-consistency-check.png b/content-rst/applications/finance/accounting/reporting/data_inalterability/data-consistency-check.png new file mode 100644 index 000000000..c8b7ae893 Binary files /dev/null and b/content-rst/applications/finance/accounting/reporting/data_inalterability/data-consistency-check.png differ diff --git a/content-rst/applications/finance/accounting/reporting/data_inalterability/journal-overview.png b/content-rst/applications/finance/accounting/reporting/data_inalterability/journal-overview.png new file mode 100644 index 000000000..e50b795b9 Binary files /dev/null and b/content-rst/applications/finance/accounting/reporting/data_inalterability/journal-overview.png differ diff --git a/content/applications/finance/accounting/reporting/intrastat.rst b/content-rst/applications/finance/accounting/reporting/intrastat.rst similarity index 100% rename from content/applications/finance/accounting/reporting/intrastat.rst rename to content-rst/applications/finance/accounting/reporting/intrastat.rst diff --git a/content-rst/applications/finance/accounting/reporting/intrastat/intrastat-column.png b/content-rst/applications/finance/accounting/reporting/intrastat/intrastat-column.png new file mode 100644 index 000000000..b1f350a26 Binary files /dev/null and b/content-rst/applications/finance/accounting/reporting/intrastat/intrastat-column.png differ diff --git a/content-rst/applications/finance/accounting/reporting/intrastat/warehouse-region.png b/content-rst/applications/finance/accounting/reporting/intrastat/warehouse-region.png new file mode 100644 index 000000000..e9f4bea8e Binary files /dev/null and b/content-rst/applications/finance/accounting/reporting/intrastat/warehouse-region.png differ diff --git a/content-rst/applications/finance/accounting/reporting/reporting-annotate.png b/content-rst/applications/finance/accounting/reporting/reporting-annotate.png new file mode 100644 index 000000000..4288bc62d Binary files /dev/null and b/content-rst/applications/finance/accounting/reporting/reporting-annotate.png differ diff --git a/content-rst/applications/finance/accounting/reporting/reporting-comparison.png b/content-rst/applications/finance/accounting/reporting/reporting-comparison.png new file mode 100644 index 000000000..f92b3bc7f Binary files /dev/null and b/content-rst/applications/finance/accounting/reporting/reporting-comparison.png differ diff --git a/content/applications/finance/accounting/reporting/silverfin.rst b/content-rst/applications/finance/accounting/reporting/silverfin.rst similarity index 100% rename from content/applications/finance/accounting/reporting/silverfin.rst rename to content-rst/applications/finance/accounting/reporting/silverfin.rst diff --git a/content-rst/applications/finance/accounting/reporting/silverfin/api-key-db.png b/content-rst/applications/finance/accounting/reporting/silverfin/api-key-db.png new file mode 100644 index 000000000..c8568f78a Binary files /dev/null and b/content-rst/applications/finance/accounting/reporting/silverfin/api-key-db.png differ diff --git a/content-rst/applications/finance/accounting/reporting/silverfin/api-key-user.png b/content-rst/applications/finance/accounting/reporting/silverfin/api-key-user.png new file mode 100644 index 000000000..be2fea141 Binary files /dev/null and b/content-rst/applications/finance/accounting/reporting/silverfin/api-key-user.png differ diff --git a/content/applications/finance/accounting/reporting/tax_carryover.rst b/content-rst/applications/finance/accounting/reporting/tax_carryover.rst similarity index 100% rename from content/applications/finance/accounting/reporting/tax_carryover.rst rename to content-rst/applications/finance/accounting/reporting/tax_carryover.rst diff --git a/content-rst/applications/finance/accounting/reporting/tax_carryover/belgian-example.png b/content-rst/applications/finance/accounting/reporting/tax_carryover/belgian-example.png new file mode 100644 index 000000000..9d7b2e02a Binary files /dev/null and b/content-rst/applications/finance/accounting/reporting/tax_carryover/belgian-example.png differ diff --git a/content-rst/applications/finance/accounting/reporting/tax_carryover/pop-up.png b/content-rst/applications/finance/accounting/reporting/tax_carryover/pop-up.png new file mode 100644 index 000000000..9e782ee8d Binary files /dev/null and b/content-rst/applications/finance/accounting/reporting/tax_carryover/pop-up.png differ diff --git a/content-rst/applications/finance/accounting/reporting/tax_carryover/tax-return.png b/content-rst/applications/finance/accounting/reporting/tax_carryover/tax-return.png new file mode 100644 index 000000000..d70f8ab65 Binary files /dev/null and b/content-rst/applications/finance/accounting/reporting/tax_carryover/tax-return.png differ diff --git a/content/applications/finance/accounting/reporting/tax_returns.rst b/content-rst/applications/finance/accounting/reporting/tax_returns.rst similarity index 100% rename from content/applications/finance/accounting/reporting/tax_returns.rst rename to content-rst/applications/finance/accounting/reporting/tax_returns.rst diff --git a/content-rst/applications/finance/accounting/reporting/tax_returns/tax_return_grids.png b/content-rst/applications/finance/accounting/reporting/tax_returns/tax_return_grids.png new file mode 100644 index 000000000..878791897 Binary files /dev/null and b/content-rst/applications/finance/accounting/reporting/tax_returns/tax_return_grids.png differ diff --git a/content/applications/finance/accounting/reporting/year_end.rst b/content-rst/applications/finance/accounting/reporting/year_end.rst similarity index 100% rename from content/applications/finance/accounting/reporting/year_end.rst rename to content-rst/applications/finance/accounting/reporting/year_end.rst diff --git a/content/applications/finance/accounting/taxes.rst b/content-rst/applications/finance/accounting/taxes.rst similarity index 100% rename from content/applications/finance/accounting/taxes.rst rename to content-rst/applications/finance/accounting/taxes.rst diff --git a/content/applications/finance/accounting/taxes/B2B_B2C.rst b/content-rst/applications/finance/accounting/taxes/B2B_B2C.rst similarity index 100% rename from content/applications/finance/accounting/taxes/B2B_B2C.rst rename to content-rst/applications/finance/accounting/taxes/B2B_B2C.rst diff --git a/content-rst/applications/finance/accounting/taxes/B2B_B2C/price_B2C_B2B01.png b/content-rst/applications/finance/accounting/taxes/B2B_B2C/price_B2C_B2B01.png new file mode 100644 index 000000000..df278739e Binary files /dev/null and b/content-rst/applications/finance/accounting/taxes/B2B_B2C/price_B2C_B2B01.png differ diff --git a/content-rst/applications/finance/accounting/taxes/B2B_B2C/price_B2C_B2B02.png b/content-rst/applications/finance/accounting/taxes/B2B_B2C/price_B2C_B2B02.png new file mode 100644 index 000000000..214849fec Binary files /dev/null and b/content-rst/applications/finance/accounting/taxes/B2B_B2C/price_B2C_B2B02.png differ diff --git a/content-rst/applications/finance/accounting/taxes/B2B_B2C/price_B2C_B2B03.png b/content-rst/applications/finance/accounting/taxes/B2B_B2C/price_B2C_B2B03.png new file mode 100644 index 000000000..e2d28824c Binary files /dev/null and b/content-rst/applications/finance/accounting/taxes/B2B_B2C/price_B2C_B2B03.png differ diff --git a/content-rst/applications/finance/accounting/taxes/B2B_B2C/price_B2C_B2B04.png b/content-rst/applications/finance/accounting/taxes/B2B_B2C/price_B2C_B2B04.png new file mode 100644 index 000000000..ffb9c6d6c Binary files /dev/null and b/content-rst/applications/finance/accounting/taxes/B2B_B2C/price_B2C_B2B04.png differ diff --git a/content-rst/applications/finance/accounting/taxes/B2B_B2C/price_B2C_B2B05.png b/content-rst/applications/finance/accounting/taxes/B2B_B2C/price_B2C_B2B05.png new file mode 100644 index 000000000..baa745f23 Binary files /dev/null and b/content-rst/applications/finance/accounting/taxes/B2B_B2C/price_B2C_B2B05.png differ diff --git a/content/applications/finance/accounting/taxes/avatax.rst b/content-rst/applications/finance/accounting/taxes/avatax.rst similarity index 100% rename from content/applications/finance/accounting/taxes/avatax.rst rename to content-rst/applications/finance/accounting/taxes/avatax.rst diff --git a/content/applications/finance/accounting/taxes/avatax/avalara_portal.rst b/content-rst/applications/finance/accounting/taxes/avatax/avalara_portal.rst similarity index 100% rename from content/applications/finance/accounting/taxes/avatax/avalara_portal.rst rename to content-rst/applications/finance/accounting/taxes/avatax/avalara_portal.rst diff --git a/content-rst/applications/finance/accounting/taxes/avatax/avalara_portal/avalara-portal.png b/content-rst/applications/finance/accounting/taxes/avatax/avalara_portal/avalara-portal.png new file mode 100644 index 000000000..618cea06f Binary files /dev/null and b/content-rst/applications/finance/accounting/taxes/avatax/avalara_portal/avalara-portal.png differ diff --git a/content-rst/applications/finance/accounting/taxes/avatax/avalara_portal/avalara-returns.png b/content-rst/applications/finance/accounting/taxes/avatax/avalara_portal/avalara-returns.png new file mode 100644 index 000000000..204c9e331 Binary files /dev/null and b/content-rst/applications/finance/accounting/taxes/avatax/avalara_portal/avalara-returns.png differ diff --git a/content-rst/applications/finance/accounting/taxes/avatax/avalara_portal/avalara-transactions.png b/content-rst/applications/finance/accounting/taxes/avatax/avalara_portal/avalara-transactions.png new file mode 100644 index 000000000..dbdf911c7 Binary files /dev/null and b/content-rst/applications/finance/accounting/taxes/avatax/avalara_portal/avalara-transactions.png differ diff --git a/content-rst/applications/finance/accounting/taxes/avatax/avalara_portal/transactions.png b/content-rst/applications/finance/accounting/taxes/avatax/avalara_portal/transactions.png new file mode 100644 index 000000000..1e31eca4d Binary files /dev/null and b/content-rst/applications/finance/accounting/taxes/avatax/avalara_portal/transactions.png differ diff --git a/content-rst/applications/finance/accounting/taxes/avatax/avalara_portal/where-you-collect-tax.png b/content-rst/applications/finance/accounting/taxes/avatax/avalara_portal/where-you-collect-tax.png new file mode 100644 index 000000000..27f1fe591 Binary files /dev/null and b/content-rst/applications/finance/accounting/taxes/avatax/avalara_portal/where-you-collect-tax.png differ diff --git a/content-rst/applications/finance/accounting/taxes/avatax/avatax-category.png b/content-rst/applications/finance/accounting/taxes/avatax/avatax-category.png new file mode 100644 index 000000000..10f2b9618 Binary files /dev/null and b/content-rst/applications/finance/accounting/taxes/avatax/avatax-category.png differ diff --git a/content-rst/applications/finance/accounting/taxes/avatax/avatax-configuration-settings.png b/content-rst/applications/finance/accounting/taxes/avatax/avatax-configuration-settings.png new file mode 100644 index 000000000..b69294b2d Binary files /dev/null and b/content-rst/applications/finance/accounting/taxes/avatax/avatax-configuration-settings.png differ diff --git a/content/applications/finance/accounting/taxes/avatax/avatax_use.rst b/content-rst/applications/finance/accounting/taxes/avatax/avatax_use.rst similarity index 100% rename from content/applications/finance/accounting/taxes/avatax/avatax_use.rst rename to content-rst/applications/finance/accounting/taxes/avatax/avatax_use.rst diff --git a/content-rst/applications/finance/accounting/taxes/avatax/avatax_use/calculate-avatax.png b/content-rst/applications/finance/accounting/taxes/avatax/avatax_use/calculate-avatax.png new file mode 100644 index 000000000..d7a2a5228 Binary files /dev/null and b/content-rst/applications/finance/accounting/taxes/avatax/avatax_use/calculate-avatax.png differ diff --git a/content-rst/applications/finance/accounting/taxes/avatax/avatax_use/journal-items.png b/content-rst/applications/finance/accounting/taxes/avatax/avatax_use/journal-items.png new file mode 100644 index 000000000..e8d46443b Binary files /dev/null and b/content-rst/applications/finance/accounting/taxes/avatax/avatax_use/journal-items.png differ diff --git a/content-rst/applications/finance/accounting/taxes/avatax/avatax_use/logging.png b/content-rst/applications/finance/accounting/taxes/avatax/avatax_use/logging.png new file mode 100644 index 000000000..72ef4c4fe Binary files /dev/null and b/content-rst/applications/finance/accounting/taxes/avatax/avatax_use/logging.png differ diff --git a/content-rst/applications/finance/accounting/taxes/avatax/company-code.png b/content-rst/applications/finance/accounting/taxes/avatax/company-code.png new file mode 100644 index 000000000..ab937ba0c Binary files /dev/null and b/content-rst/applications/finance/accounting/taxes/avatax/company-code.png differ diff --git a/content-rst/applications/finance/accounting/taxes/avatax/override-avatax-product-category.png b/content-rst/applications/finance/accounting/taxes/avatax/override-avatax-product-category.png new file mode 100644 index 000000000..8fb89036d Binary files /dev/null and b/content-rst/applications/finance/accounting/taxes/avatax/override-avatax-product-category.png differ diff --git a/content-rst/applications/finance/accounting/taxes/avatax/validate-address.png b/content-rst/applications/finance/accounting/taxes/avatax/validate-address.png new file mode 100644 index 000000000..db1e75569 Binary files /dev/null and b/content-rst/applications/finance/accounting/taxes/avatax/validate-address.png differ diff --git a/content/applications/finance/accounting/taxes/cash_basis.rst b/content-rst/applications/finance/accounting/taxes/cash_basis.rst similarity index 100% rename from content/applications/finance/accounting/taxes/cash_basis.rst rename to content-rst/applications/finance/accounting/taxes/cash_basis.rst diff --git a/content-rst/applications/finance/accounting/taxes/cash_basis/account_column.png b/content-rst/applications/finance/accounting/taxes/cash_basis/account_column.png new file mode 100644 index 000000000..cd0121dd8 Binary files /dev/null and b/content-rst/applications/finance/accounting/taxes/cash_basis/account_column.png differ diff --git a/content-rst/applications/finance/accounting/taxes/cash_basis/advanced_options.png b/content-rst/applications/finance/accounting/taxes/cash_basis/advanced_options.png new file mode 100644 index 000000000..2b22bcfbd Binary files /dev/null and b/content-rst/applications/finance/accounting/taxes/cash_basis/advanced_options.png differ diff --git a/content-rst/applications/finance/accounting/taxes/cash_basis/customer_invoice_with_cbt.png b/content-rst/applications/finance/accounting/taxes/cash_basis/customer_invoice_with_cbt.png new file mode 100644 index 000000000..122a8b94f Binary files /dev/null and b/content-rst/applications/finance/accounting/taxes/cash_basis/customer_invoice_with_cbt.png differ diff --git a/content-rst/applications/finance/accounting/taxes/cash_basis/tax_cash_basis_journal.png b/content-rst/applications/finance/accounting/taxes/cash_basis/tax_cash_basis_journal.png new file mode 100644 index 000000000..d0b7db6a8 Binary files /dev/null and b/content-rst/applications/finance/accounting/taxes/cash_basis/tax_cash_basis_journal.png differ diff --git a/content-rst/applications/finance/accounting/taxes/default-configuration.png b/content-rst/applications/finance/accounting/taxes/default-configuration.png new file mode 100644 index 000000000..8ed466904 Binary files /dev/null and b/content-rst/applications/finance/accounting/taxes/default-configuration.png differ diff --git a/content-rst/applications/finance/accounting/taxes/default-taxes.png b/content-rst/applications/finance/accounting/taxes/default-taxes.png new file mode 100644 index 000000000..f6825a2a2 Binary files /dev/null and b/content-rst/applications/finance/accounting/taxes/default-taxes.png differ diff --git a/content-rst/applications/finance/accounting/taxes/definition.png b/content-rst/applications/finance/accounting/taxes/definition.png new file mode 100644 index 000000000..8cdbb5250 Binary files /dev/null and b/content-rst/applications/finance/accounting/taxes/definition.png differ diff --git a/content-rst/applications/finance/accounting/taxes/ecotax.png b/content-rst/applications/finance/accounting/taxes/ecotax.png new file mode 100644 index 000000000..f07468fb4 Binary files /dev/null and b/content-rst/applications/finance/accounting/taxes/ecotax.png differ diff --git a/content-rst/applications/finance/accounting/taxes/edit.png b/content-rst/applications/finance/accounting/taxes/edit.png new file mode 100644 index 000000000..e67c8fd10 Binary files /dev/null and b/content-rst/applications/finance/accounting/taxes/edit.png differ diff --git a/content/applications/finance/accounting/taxes/eu_distance_selling.rst b/content-rst/applications/finance/accounting/taxes/eu_distance_selling.rst similarity index 100% rename from content/applications/finance/accounting/taxes/eu_distance_selling.rst rename to content-rst/applications/finance/accounting/taxes/eu_distance_selling.rst diff --git a/content-rst/applications/finance/accounting/taxes/eu_distance_selling/enable-feature.png b/content-rst/applications/finance/accounting/taxes/eu_distance_selling/enable-feature.png new file mode 100644 index 000000000..34bec4370 Binary files /dev/null and b/content-rst/applications/finance/accounting/taxes/eu_distance_selling/enable-feature.png differ diff --git a/content-rst/applications/finance/accounting/taxes/eu_distance_selling/oss-report.png b/content-rst/applications/finance/accounting/taxes/eu_distance_selling/oss-report.png new file mode 100644 index 000000000..52618cdc4 Binary files /dev/null and b/content-rst/applications/finance/accounting/taxes/eu_distance_selling/oss-report.png differ diff --git a/content/applications/finance/accounting/taxes/fiscal_positions.rst b/content-rst/applications/finance/accounting/taxes/fiscal_positions.rst similarity index 100% rename from content/applications/finance/accounting/taxes/fiscal_positions.rst rename to content-rst/applications/finance/accounting/taxes/fiscal_positions.rst diff --git a/content-rst/applications/finance/accounting/taxes/fiscal_positions/fiscal-positions-account-mapping.png b/content-rst/applications/finance/accounting/taxes/fiscal_positions/fiscal-positions-account-mapping.png new file mode 100644 index 000000000..8e43b8af9 Binary files /dev/null and b/content-rst/applications/finance/accounting/taxes/fiscal_positions/fiscal-positions-account-mapping.png differ diff --git a/content-rst/applications/finance/accounting/taxes/fiscal_positions/fiscal-positions-automatic.png b/content-rst/applications/finance/accounting/taxes/fiscal_positions/fiscal-positions-automatic.png new file mode 100644 index 000000000..e9594d36f Binary files /dev/null and b/content-rst/applications/finance/accounting/taxes/fiscal_positions/fiscal-positions-automatic.png differ diff --git a/content-rst/applications/finance/accounting/taxes/fiscal_positions/fiscal-positions-customer.png b/content-rst/applications/finance/accounting/taxes/fiscal_positions/fiscal-positions-customer.png new file mode 100644 index 000000000..4ead42199 Binary files /dev/null and b/content-rst/applications/finance/accounting/taxes/fiscal_positions/fiscal-positions-customer.png differ diff --git a/content-rst/applications/finance/accounting/taxes/fiscal_positions/fiscal-positions-manual.png b/content-rst/applications/finance/accounting/taxes/fiscal_positions/fiscal-positions-manual.png new file mode 100644 index 000000000..507b666c9 Binary files /dev/null and b/content-rst/applications/finance/accounting/taxes/fiscal_positions/fiscal-positions-manual.png differ diff --git a/content-rst/applications/finance/accounting/taxes/fiscal_positions/fiscal-positions-tax-mapping.png b/content-rst/applications/finance/accounting/taxes/fiscal_positions/fiscal-positions-tax-mapping.png new file mode 100644 index 000000000..ace6efff7 Binary files /dev/null and b/content-rst/applications/finance/accounting/taxes/fiscal_positions/fiscal-positions-tax-mapping.png differ diff --git a/content-rst/applications/finance/accounting/taxes/invoice-label.png b/content-rst/applications/finance/accounting/taxes/invoice-label.png new file mode 100644 index 000000000..8e195d4db Binary files /dev/null and b/content-rst/applications/finance/accounting/taxes/invoice-label.png differ diff --git a/content-rst/applications/finance/accounting/taxes/invoice-tax-group.png b/content-rst/applications/finance/accounting/taxes/invoice-tax-group.png new file mode 100644 index 000000000..7dd2151a2 Binary files /dev/null and b/content-rst/applications/finance/accounting/taxes/invoice-tax-group.png differ diff --git a/content-rst/applications/finance/accounting/taxes/list-sequence.png b/content-rst/applications/finance/accounting/taxes/list-sequence.png new file mode 100644 index 000000000..66621e5c1 Binary files /dev/null and b/content-rst/applications/finance/accounting/taxes/list-sequence.png differ diff --git a/content-rst/applications/finance/accounting/taxes/list.png b/content-rst/applications/finance/accounting/taxes/list.png new file mode 100644 index 000000000..560ff77f1 Binary files /dev/null and b/content-rst/applications/finance/accounting/taxes/list.png differ diff --git a/content/applications/finance/accounting/taxes/retention.rst b/content-rst/applications/finance/accounting/taxes/retention.rst similarity index 100% rename from content/applications/finance/accounting/taxes/retention.rst rename to content-rst/applications/finance/accounting/taxes/retention.rst diff --git a/content-rst/applications/finance/accounting/taxes/retention/invoice-tax.png b/content-rst/applications/finance/accounting/taxes/retention/invoice-tax.png new file mode 100644 index 000000000..ed8782713 Binary files /dev/null and b/content-rst/applications/finance/accounting/taxes/retention/invoice-tax.png differ diff --git a/content-rst/applications/finance/accounting/taxes/retention/negative-amount.png b/content-rst/applications/finance/accounting/taxes/retention/negative-amount.png new file mode 100644 index 000000000..661191b58 Binary files /dev/null and b/content-rst/applications/finance/accounting/taxes/retention/negative-amount.png differ diff --git a/content-rst/applications/finance/accounting/taxes/retention/tax-group.png b/content-rst/applications/finance/accounting/taxes/retention/tax-group.png new file mode 100644 index 000000000..05cdec316 Binary files /dev/null and b/content-rst/applications/finance/accounting/taxes/retention/tax-group.png differ diff --git a/content-rst/applications/finance/accounting/taxes/subsequent-line.png b/content-rst/applications/finance/accounting/taxes/subsequent-line.png new file mode 100644 index 000000000..47e2067ce Binary files /dev/null and b/content-rst/applications/finance/accounting/taxes/subsequent-line.png differ diff --git a/content-rst/applications/finance/accounting/taxes/toggle-button.png b/content-rst/applications/finance/accounting/taxes/toggle-button.png new file mode 100644 index 000000000..525446dae Binary files /dev/null and b/content-rst/applications/finance/accounting/taxes/toggle-button.png differ diff --git a/content/applications/finance/accounting/taxes/vat_verification.rst b/content-rst/applications/finance/accounting/taxes/vat_verification.rst similarity index 100% rename from content/applications/finance/accounting/taxes/vat_verification.rst rename to content-rst/applications/finance/accounting/taxes/vat_verification.rst diff --git a/content-rst/applications/finance/accounting/taxes/vat_verification/intra-community-valid.png b/content-rst/applications/finance/accounting/taxes/vat_verification/intra-community-valid.png new file mode 100644 index 000000000..a38eaed4f Binary files /dev/null and b/content-rst/applications/finance/accounting/taxes/vat_verification/intra-community-valid.png differ diff --git a/content/applications/finance/accounting/vendor_bills.rst b/content-rst/applications/finance/accounting/vendor_bills.rst similarity index 100% rename from content/applications/finance/accounting/vendor_bills.rst rename to content-rst/applications/finance/accounting/vendor_bills.rst diff --git a/content/applications/finance/accounting/vendor_bills/assets.rst b/content-rst/applications/finance/accounting/vendor_bills/assets.rst similarity index 100% rename from content/applications/finance/accounting/vendor_bills/assets.rst rename to content-rst/applications/finance/accounting/vendor_bills/assets.rst diff --git a/content-rst/applications/finance/accounting/vendor_bills/assets/assets01.png b/content-rst/applications/finance/accounting/vendor_bills/assets/assets01.png new file mode 100644 index 000000000..4d03db3b5 Binary files /dev/null and b/content-rst/applications/finance/accounting/vendor_bills/assets/assets01.png differ diff --git a/content-rst/applications/finance/accounting/vendor_bills/assets/assets02.png b/content-rst/applications/finance/accounting/vendor_bills/assets/assets02.png new file mode 100644 index 000000000..db35d459a Binary files /dev/null and b/content-rst/applications/finance/accounting/vendor_bills/assets/assets02.png differ diff --git a/content-rst/applications/finance/accounting/vendor_bills/assets/assets03.png b/content-rst/applications/finance/accounting/vendor_bills/assets/assets03.png new file mode 100644 index 000000000..ac502f19f Binary files /dev/null and b/content-rst/applications/finance/accounting/vendor_bills/assets/assets03.png differ diff --git a/content-rst/applications/finance/accounting/vendor_bills/assets/assets04.png b/content-rst/applications/finance/accounting/vendor_bills/assets/assets04.png new file mode 100644 index 000000000..4884c45c0 Binary files /dev/null and b/content-rst/applications/finance/accounting/vendor_bills/assets/assets04.png differ diff --git a/content-rst/applications/finance/accounting/vendor_bills/assets/assets05.png b/content-rst/applications/finance/accounting/vendor_bills/assets/assets05.png new file mode 100644 index 000000000..d69a7b866 Binary files /dev/null and b/content-rst/applications/finance/accounting/vendor_bills/assets/assets05.png differ diff --git a/content-rst/applications/finance/accounting/vendor_bills/assets/assets06.png b/content-rst/applications/finance/accounting/vendor_bills/assets/assets06.png new file mode 100644 index 000000000..12261b961 Binary files /dev/null and b/content-rst/applications/finance/accounting/vendor_bills/assets/assets06.png differ diff --git a/content-rst/applications/finance/accounting/vendor_bills/assets/assets07.png b/content-rst/applications/finance/accounting/vendor_bills/assets/assets07.png new file mode 100644 index 000000000..17e2d8da9 Binary files /dev/null and b/content-rst/applications/finance/accounting/vendor_bills/assets/assets07.png differ diff --git a/content-rst/applications/finance/accounting/vendor_bills/assets/assets08.png b/content-rst/applications/finance/accounting/vendor_bills/assets/assets08.png new file mode 100644 index 000000000..6af72771c Binary files /dev/null and b/content-rst/applications/finance/accounting/vendor_bills/assets/assets08.png differ diff --git a/content-rst/applications/finance/accounting/vendor_bills/assets/assets09.png b/content-rst/applications/finance/accounting/vendor_bills/assets/assets09.png new file mode 100644 index 000000000..64b8ff825 Binary files /dev/null and b/content-rst/applications/finance/accounting/vendor_bills/assets/assets09.png differ diff --git a/content-rst/applications/finance/accounting/vendor_bills/assets/assets10.png b/content-rst/applications/finance/accounting/vendor_bills/assets/assets10.png new file mode 100644 index 000000000..63c87c418 Binary files /dev/null and b/content-rst/applications/finance/accounting/vendor_bills/assets/assets10.png differ diff --git a/content-rst/applications/finance/accounting/vendor_bills/assets/assets11.png b/content-rst/applications/finance/accounting/vendor_bills/assets/assets11.png new file mode 100644 index 000000000..3420c953f Binary files /dev/null and b/content-rst/applications/finance/accounting/vendor_bills/assets/assets11.png differ diff --git a/content-rst/applications/finance/accounting/vendor_bills/bill-completion.png b/content-rst/applications/finance/accounting/vendor_bills/bill-completion.png new file mode 100644 index 000000000..bebb9879c Binary files /dev/null and b/content-rst/applications/finance/accounting/vendor_bills/bill-completion.png differ diff --git a/content/applications/finance/accounting/vendor_bills/deferred_expenses.rst b/content-rst/applications/finance/accounting/vendor_bills/deferred_expenses.rst similarity index 100% rename from content/applications/finance/accounting/vendor_bills/deferred_expenses.rst rename to content-rst/applications/finance/accounting/vendor_bills/deferred_expenses.rst diff --git a/content-rst/applications/finance/accounting/vendor_bills/deferred_expenses/deferred_expense_report.png b/content-rst/applications/finance/accounting/vendor_bills/deferred_expenses/deferred_expense_report.png new file mode 100644 index 000000000..5d57ce2bc Binary files /dev/null and b/content-rst/applications/finance/accounting/vendor_bills/deferred_expenses/deferred_expense_report.png differ diff --git a/content/applications/finance/accounting/vendor_bills/invoice_digitization.rst b/content-rst/applications/finance/accounting/vendor_bills/invoice_digitization.rst similarity index 100% rename from content/applications/finance/accounting/vendor_bills/invoice_digitization.rst rename to content-rst/applications/finance/accounting/vendor_bills/invoice_digitization.rst diff --git a/content-rst/applications/finance/accounting/vendor_bills/partial-payment.png b/content-rst/applications/finance/accounting/vendor_bills/partial-payment.png new file mode 100644 index 000000000..51be06f2c Binary files /dev/null and b/content-rst/applications/finance/accounting/vendor_bills/partial-payment.png differ diff --git a/content/applications/finance/expenses.rst b/content-rst/applications/finance/expenses.rst similarity index 100% rename from content/applications/finance/expenses.rst rename to content-rst/applications/finance/expenses.rst diff --git a/content/applications/finance/expenses/approve_expenses.rst b/content-rst/applications/finance/expenses/approve_expenses.rst similarity index 100% rename from content/applications/finance/expenses/approve_expenses.rst rename to content-rst/applications/finance/expenses/approve_expenses.rst diff --git a/content-rst/applications/finance/expenses/approve_expenses/approve-report.png b/content-rst/applications/finance/expenses/approve_expenses/approve-report.png new file mode 100644 index 000000000..7ab74ae95 Binary files /dev/null and b/content-rst/applications/finance/expenses/approve_expenses/approve-report.png differ diff --git a/content-rst/applications/finance/expenses/approve_expenses/chatter.png b/content-rst/applications/finance/expenses/approve_expenses/chatter.png new file mode 100644 index 000000000..23b22d872 Binary files /dev/null and b/content-rst/applications/finance/expenses/approve_expenses/chatter.png differ diff --git a/content-rst/applications/finance/expenses/approve_expenses/expense-reports-list.png b/content-rst/applications/finance/expenses/approve_expenses/expense-reports-list.png new file mode 100644 index 000000000..4f2cf7a40 Binary files /dev/null and b/content-rst/applications/finance/expenses/approve_expenses/expense-reports-list.png differ diff --git a/content-rst/applications/finance/expenses/approve_expenses/my-team-filter.png b/content-rst/applications/finance/expenses/approve_expenses/my-team-filter.png new file mode 100644 index 000000000..817ab2a73 Binary files /dev/null and b/content-rst/applications/finance/expenses/approve_expenses/my-team-filter.png differ diff --git a/content-rst/applications/finance/expenses/approve_expenses/refuse-expense.png b/content-rst/applications/finance/expenses/approve_expenses/refuse-expense.png new file mode 100644 index 000000000..3ac968793 Binary files /dev/null and b/content-rst/applications/finance/expenses/approve_expenses/refuse-expense.png differ diff --git a/content-rst/applications/finance/expenses/categories.png b/content-rst/applications/finance/expenses/categories.png new file mode 100644 index 000000000..d4f05cec6 Binary files /dev/null and b/content-rst/applications/finance/expenses/categories.png differ diff --git a/content/applications/finance/expenses/expense_reports.rst b/content-rst/applications/finance/expenses/expense_reports.rst similarity index 100% rename from content/applications/finance/expenses/expense_reports.rst rename to content-rst/applications/finance/expenses/expense_reports.rst diff --git a/content-rst/applications/finance/expenses/expense_reports/add-an-expense-line.png b/content-rst/applications/finance/expenses/expense_reports/add-an-expense-line.png new file mode 100644 index 000000000..073eaae1c Binary files /dev/null and b/content-rst/applications/finance/expenses/expense_reports/add-an-expense-line.png differ diff --git a/content-rst/applications/finance/expenses/expense_reports/create-report.png b/content-rst/applications/finance/expenses/expense_reports/create-report.png new file mode 100644 index 000000000..5dfc76afc Binary files /dev/null and b/content-rst/applications/finance/expenses/expense_reports/create-report.png differ diff --git a/content-rst/applications/finance/expenses/expense_reports/expense-report-summary.png b/content-rst/applications/finance/expenses/expense_reports/expense-report-summary.png new file mode 100644 index 000000000..4fe9e2c52 Binary files /dev/null and b/content-rst/applications/finance/expenses/expense_reports/expense-report-summary.png differ diff --git a/content-rst/applications/finance/expenses/expense_reports/expense-status.png b/content-rst/applications/finance/expenses/expense_reports/expense-status.png new file mode 100644 index 000000000..ae684259a Binary files /dev/null and b/content-rst/applications/finance/expenses/expense_reports/expense-status.png differ diff --git a/content/applications/finance/expenses/log_expenses.rst b/content-rst/applications/finance/expenses/log_expenses.rst similarity index 100% rename from content/applications/finance/expenses/log_expenses.rst rename to content-rst/applications/finance/expenses/log_expenses.rst diff --git a/content-rst/applications/finance/expenses/log_expenses/alias-email.png b/content-rst/applications/finance/expenses/log_expenses/alias-email.png new file mode 100644 index 000000000..dab5cd8af Binary files /dev/null and b/content-rst/applications/finance/expenses/log_expenses/alias-email.png differ diff --git a/content-rst/applications/finance/expenses/log_expenses/authenticated-email-address.png b/content-rst/applications/finance/expenses/log_expenses/authenticated-email-address.png new file mode 100644 index 000000000..6080bcc30 Binary files /dev/null and b/content-rst/applications/finance/expenses/log_expenses/authenticated-email-address.png differ diff --git a/content-rst/applications/finance/expenses/log_expenses/email-alias.png b/content-rst/applications/finance/expenses/log_expenses/email-alias.png new file mode 100644 index 000000000..981229cb6 Binary files /dev/null and b/content-rst/applications/finance/expenses/log_expenses/email-alias.png differ diff --git a/content-rst/applications/finance/expenses/log_expenses/expense-filled-in.png b/content-rst/applications/finance/expenses/log_expenses/expense-filled-in.png new file mode 100644 index 000000000..8e75674cb Binary files /dev/null and b/content-rst/applications/finance/expenses/log_expenses/expense-filled-in.png differ diff --git a/content-rst/applications/finance/expenses/log_expenses/mileage-internal-reference.png b/content-rst/applications/finance/expenses/log_expenses/mileage-internal-reference.png new file mode 100644 index 000000000..3614e99e0 Binary files /dev/null and b/content-rst/applications/finance/expenses/log_expenses/mileage-internal-reference.png differ diff --git a/content-rst/applications/finance/expenses/log_expenses/receipt-icon.png b/content-rst/applications/finance/expenses/log_expenses/receipt-icon.png new file mode 100644 index 000000000..16bfbebd4 Binary files /dev/null and b/content-rst/applications/finance/expenses/log_expenses/receipt-icon.png differ diff --git a/content-rst/applications/finance/expenses/log_expenses/ref.png b/content-rst/applications/finance/expenses/log_expenses/ref.png new file mode 100644 index 000000000..c2a91b6b2 Binary files /dev/null and b/content-rst/applications/finance/expenses/log_expenses/ref.png differ diff --git a/content-rst/applications/finance/expenses/log_expenses/upload.png b/content-rst/applications/finance/expenses/log_expenses/upload.png new file mode 100644 index 000000000..fa43d49b9 Binary files /dev/null and b/content-rst/applications/finance/expenses/log_expenses/upload.png differ diff --git a/content-rst/applications/finance/expenses/new-expense-product.png b/content-rst/applications/finance/expenses/new-expense-product.png new file mode 100644 index 000000000..065a94c90 Binary files /dev/null and b/content-rst/applications/finance/expenses/new-expense-product.png differ diff --git a/content/applications/finance/expenses/post_expenses.rst b/content-rst/applications/finance/expenses/post_expenses.rst similarity index 100% rename from content/applications/finance/expenses/post_expenses.rst rename to content-rst/applications/finance/expenses/post_expenses.rst diff --git a/content-rst/applications/finance/expenses/post_expenses/post-entries.png b/content-rst/applications/finance/expenses/post_expenses/post-entries.png new file mode 100644 index 000000000..a3841f8ef Binary files /dev/null and b/content-rst/applications/finance/expenses/post_expenses/post-entries.png differ diff --git a/content-rst/applications/finance/expenses/post_expenses/post-reports.png b/content-rst/applications/finance/expenses/post_expenses/post-reports.png new file mode 100644 index 000000000..4c4841bf4 Binary files /dev/null and b/content-rst/applications/finance/expenses/post_expenses/post-reports.png differ diff --git a/content/applications/finance/expenses/reimburse.rst b/content-rst/applications/finance/expenses/reimburse.rst similarity index 100% rename from content/applications/finance/expenses/reimburse.rst rename to content-rst/applications/finance/expenses/reimburse.rst diff --git a/content-rst/applications/finance/expenses/reimburse/multiple-reports.png b/content-rst/applications/finance/expenses/reimburse/multiple-reports.png new file mode 100644 index 000000000..683dcfafe Binary files /dev/null and b/content-rst/applications/finance/expenses/reimburse/multiple-reports.png differ diff --git a/content-rst/applications/finance/expenses/reimburse/pay-via-payslip.png b/content-rst/applications/finance/expenses/reimburse/pay-via-payslip.png new file mode 100644 index 000000000..160ac0259 Binary files /dev/null and b/content-rst/applications/finance/expenses/reimburse/pay-via-payslip.png differ diff --git a/content-rst/applications/finance/expenses/reimburse/payment.png b/content-rst/applications/finance/expenses/reimburse/payment.png new file mode 100644 index 000000000..18c453ac7 Binary files /dev/null and b/content-rst/applications/finance/expenses/reimburse/payment.png differ diff --git a/content-rst/applications/finance/expenses/reimburse/register.png b/content-rst/applications/finance/expenses/reimburse/register.png new file mode 100644 index 000000000..a75a44ed3 Binary files /dev/null and b/content-rst/applications/finance/expenses/reimburse/register.png differ diff --git a/content/applications/finance/expenses/reinvoice_expenses.rst b/content-rst/applications/finance/expenses/reinvoice_expenses.rst similarity index 100% rename from content/applications/finance/expenses/reinvoice_expenses.rst rename to content-rst/applications/finance/expenses/reinvoice_expenses.rst diff --git a/content-rst/applications/finance/expenses/reinvoice_expenses/analytic-dist.png b/content-rst/applications/finance/expenses/reinvoice_expenses/analytic-dist.png new file mode 100644 index 000000000..0317ccab7 Binary files /dev/null and b/content-rst/applications/finance/expenses/reinvoice_expenses/analytic-dist.png differ diff --git a/content-rst/applications/finance/expenses/reinvoice_expenses/reinvoice-expense.png b/content-rst/applications/finance/expenses/reinvoice_expenses/reinvoice-expense.png new file mode 100644 index 000000000..7a595b6f6 Binary files /dev/null and b/content-rst/applications/finance/expenses/reinvoice_expenses/reinvoice-expense.png differ diff --git a/content-rst/applications/finance/expenses/reinvoice_expenses/so-details.png b/content-rst/applications/finance/expenses/reinvoice_expenses/so-details.png new file mode 100644 index 000000000..b7aa586b0 Binary files /dev/null and b/content-rst/applications/finance/expenses/reinvoice_expenses/so-details.png differ diff --git a/content/applications/finance/fiscal_localizations.rst b/content-rst/applications/finance/fiscal_localizations.rst similarity index 100% rename from content/applications/finance/fiscal_localizations.rst rename to content-rst/applications/finance/fiscal_localizations.rst diff --git a/content/applications/finance/fiscal_localizations/argentina.rst b/content-rst/applications/finance/fiscal_localizations/argentina.rst similarity index 100% rename from content/applications/finance/fiscal_localizations/argentina.rst rename to content-rst/applications/finance/fiscal_localizations/argentina.rst diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/afip-auth-rejected.png b/content-rst/applications/finance/fiscal_localizations/argentina/afip-auth-rejected.png new file mode 100644 index 000000000..79ccad337 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/afip-auth-rejected.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/afip-status.png b/content-rst/applications/finance/fiscal_localizations/argentina/afip-status.png new file mode 100644 index 000000000..678fb7787 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/afip-status.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/auto-cash-account.png b/content-rst/applications/finance/fiscal_localizations/argentina/auto-cash-account.png new file mode 100644 index 000000000..9c581eeee Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/auto-cash-account.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/auto-payment-methods.png b/content-rst/applications/finance/fiscal_localizations/argentina/auto-payment-methods.png new file mode 100644 index 000000000..8c3497653 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/auto-payment-methods.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/automatic-tax-configuration.png b/content-rst/applications/finance/fiscal_localizations/argentina/automatic-tax-configuration.png new file mode 100644 index 000000000..7ae2413e0 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/automatic-tax-configuration.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/bank-account-relation-error.png b/content-rst/applications/finance/fiscal_localizations/argentina/bank-account-relation-error.png new file mode 100644 index 000000000..a2457c3ce Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/bank-account-relation-error.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/bank-journal-conf.png b/content-rst/applications/finance/fiscal_localizations/argentina/bank-journal-conf.png new file mode 100644 index 000000000..ffa56ecfd Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/bank-journal-conf.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/changing-journal-document-type.png b/content-rst/applications/finance/fiscal_localizations/argentina/changing-journal-document-type.png new file mode 100644 index 000000000..8689e7b80 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/changing-journal-document-type.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/check-menu-list-vendorbill.png b/content-rst/applications/finance/fiscal_localizations/argentina/check-menu-list-vendorbill.png new file mode 100644 index 000000000..b6137c353 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/check-menu-list-vendorbill.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/check-operations-menulist.png b/content-rst/applications/finance/fiscal_localizations/argentina/check-operations-menulist.png new file mode 100644 index 000000000..cfe9959db Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/check-operations-menulist.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/checks-menu-vendorbill.png b/content-rst/applications/finance/fiscal_localizations/argentina/checks-menu-vendorbill.png new file mode 100644 index 000000000..43734658b Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/checks-menu-vendorbill.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/consult-invoice-in-afip-details.png b/content-rst/applications/finance/fiscal_localizations/argentina/consult-invoice-in-afip-details.png new file mode 100644 index 000000000..18fa016b0 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/consult-invoice-in-afip-details.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/consult-invoice-in-afip.png b/content-rst/applications/finance/fiscal_localizations/argentina/consult-invoice-in-afip.png new file mode 100644 index 000000000..3f6c09a73 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/consult-invoice-in-afip.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/consult-last-invoice-number.png b/content-rst/applications/finance/fiscal_localizations/argentina/consult-last-invoice-number.png new file mode 100644 index 000000000..8da1750b9 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/consult-last-invoice-number.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/credit-debit-notes-button.png b/content-rst/applications/finance/fiscal_localizations/argentina/credit-debit-notes-button.png new file mode 100644 index 000000000..5a41bb1ea Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/credit-debit-notes-button.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/default-document-type-info.png b/content-rst/applications/finance/fiscal_localizations/argentina/default-document-type-info.png new file mode 100644 index 000000000..24ce681e6 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/default-document-type-info.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/document-types-grouped-by-letters.png b/content-rst/applications/finance/fiscal_localizations/argentina/document-types-grouped-by-letters.png new file mode 100644 index 000000000..b775e1b78 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/document-types-grouped-by-letters.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/empty-check-button.png b/content-rst/applications/finance/fiscal_localizations/argentina/empty-check-button.png new file mode 100644 index 000000000..a9c2eede7 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/empty-check-button.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/enter-perception-amount.png b/content-rst/applications/finance/fiscal_localizations/argentina/enter-perception-amount.png new file mode 100644 index 000000000..b64f4c13e Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/enter-perception-amount.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/existing-third-party-popup.png b/content-rst/applications/finance/fiscal_localizations/argentina/existing-third-party-popup.png new file mode 100644 index 000000000..2c06f2161 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/existing-third-party-popup.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/exporation-journal.png b/content-rst/applications/finance/fiscal_localizations/argentina/exporation-journal.png new file mode 100644 index 000000000..d6d348cd8 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/exporation-journal.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/export-invoice-incoterm.png b/content-rst/applications/finance/fiscal_localizations/argentina/export-invoice-incoterm.png new file mode 100644 index 000000000..59c8fa4f8 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/export-invoice-incoterm.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/export-invoice.png b/content-rst/applications/finance/fiscal_localizations/argentina/export-invoice.png new file mode 100644 index 000000000..e76b99ae7 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/export-invoice.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/fce-es-cancelation.png b/content-rst/applications/finance/fiscal_localizations/argentina/fce-es-cancelation.png new file mode 100644 index 000000000..c4136fcf4 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/fce-es-cancelation.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/identification-types.png b/content-rst/applications/finance/fiscal_localizations/argentina/identification-types.png new file mode 100644 index 000000000..bcf686938 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/identification-types.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/iibb-purchases-jurisdiction.png b/content-rst/applications/finance/fiscal_localizations/argentina/iibb-purchases-jurisdiction.png new file mode 100644 index 000000000..1e6a46bf9 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/iibb-purchases-jurisdiction.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/iibb-sales-jurisdiction.png b/content-rst/applications/finance/fiscal_localizations/argentina/iibb-sales-jurisdiction.png new file mode 100644 index 000000000..cb6021234 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/iibb-sales-jurisdiction.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/invoice-printed-report.png b/content-rst/applications/finance/fiscal_localizations/argentina/invoice-printed-report.png new file mode 100644 index 000000000..84e8355cb Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/invoice-printed-report.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/invoices-for-services.png b/content-rst/applications/finance/fiscal_localizations/argentina/invoices-for-services.png new file mode 100644 index 000000000..c86bd6cf5 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/invoices-for-services.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/l10n-ar-earnings.png b/content-rst/applications/finance/fiscal_localizations/argentina/l10n-ar-earnings.png new file mode 100644 index 000000000..39f1d662d Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/l10n-ar-earnings.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/l10n-ar-outstanding-payments.png b/content-rst/applications/finance/fiscal_localizations/argentina/l10n-ar-outstanding-payments.png new file mode 100644 index 000000000..b288c5654 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/l10n-ar-outstanding-payments.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/l10n-ar-payment-registered.png b/content-rst/applications/finance/fiscal_localizations/argentina/l10n-ar-payment-registered.png new file mode 100644 index 000000000..9de865285 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/l10n-ar-payment-registered.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/l10n-ar-payment.png b/content-rst/applications/finance/fiscal_localizations/argentina/l10n-ar-payment.png new file mode 100644 index 000000000..d00e52a7c Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/l10n-ar-payment.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/l10n-ar-purchase-journal.png b/content-rst/applications/finance/fiscal_localizations/argentina/l10n-ar-purchase-journal.png new file mode 100644 index 000000000..22761d856 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/l10n-ar-purchase-journal.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/l10n-ar-sales-journal.png b/content-rst/applications/finance/fiscal_localizations/argentina/l10n-ar-sales-journal.png new file mode 100644 index 000000000..ea91aceaf Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/l10n-ar-sales-journal.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/l10n-latam-check-module.png b/content-rst/applications/finance/fiscal_localizations/argentina/l10n-latam-check-module.png new file mode 100644 index 000000000..88856a0f7 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/l10n-latam-check-module.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/l10nar-automatic-invoicing-ecommerce.png b/content-rst/applications/finance/fiscal_localizations/argentina/l10nar-automatic-invoicing-ecommerce.png new file mode 100644 index 000000000..29c6cf349 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/l10nar-automatic-invoicing-ecommerce.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/l10nar-fiscal-fields-ar-ecommerce.png b/content-rst/applications/finance/fiscal_localizations/argentina/l10nar-fiscal-fields-ar-ecommerce.png new file mode 100644 index 000000000..e2895ad64 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/l10nar-fiscal-fields-ar-ecommerce.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/local-testing.png b/content-rst/applications/finance/fiscal_localizations/argentina/local-testing.png new file mode 100644 index 000000000..f31f030e9 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/local-testing.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/payment-popup-vendorbill.png b/content-rst/applications/finance/fiscal_localizations/argentina/payment-popup-vendorbill.png new file mode 100644 index 000000000..97fc5f311 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/payment-popup-vendorbill.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/prefix-a-invoice-for-customer.png b/content-rst/applications/finance/fiscal_localizations/argentina/prefix-a-invoice-for-customer.png new file mode 100644 index 000000000..03e704e86 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/prefix-a-invoice-for-customer.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/prefix-b-invoice-for-end-customer.png b/content-rst/applications/finance/fiscal_localizations/argentina/prefix-b-invoice-for-end-customer.png new file mode 100644 index 000000000..e666cfed8 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/prefix-b-invoice-for-end-customer.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/prefix-e-exporation-invoice.png b/content-rst/applications/finance/fiscal_localizations/argentina/prefix-e-exporation-invoice.png new file mode 100644 index 000000000..e74746387 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/prefix-e-exporation-invoice.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/request-certificate.png b/content-rst/applications/finance/fiscal_localizations/argentina/request-certificate.png new file mode 100644 index 000000000..9d6848cac Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/request-certificate.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/sales-journal.png b/content-rst/applications/finance/fiscal_localizations/argentina/sales-journal.png new file mode 100644 index 000000000..bfb299399 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/sales-journal.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/select-afip-responsibility-type.png b/content-rst/applications/finance/fiscal_localizations/argentina/select-afip-responsibility-type.png new file mode 100644 index 000000000..e07f15441 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/select-afip-responsibility-type.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/select-environment.png b/content-rst/applications/finance/fiscal_localizations/argentina/select-environment.png new file mode 100644 index 000000000..b854d184a Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/select-environment.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/select-fiscal-package.png b/content-rst/applications/finance/fiscal_localizations/argentina/select-fiscal-package.png new file mode 100644 index 000000000..ab7767c24 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/select-fiscal-package.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/select-responsibility-type.png b/content-rst/applications/finance/fiscal_localizations/argentina/select-responsibility-type.png new file mode 100644 index 000000000..126d29aae Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/select-responsibility-type.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/service-dates.png b/content-rst/applications/finance/fiscal_localizations/argentina/service-dates.png new file mode 100644 index 000000000..57fd43dc5 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/service-dates.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/special-inactive-taxes.png b/content-rst/applications/finance/fiscal_localizations/argentina/special-inactive-taxes.png new file mode 100644 index 000000000..e921a1826 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/special-inactive-taxes.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/tax-amount-excluded.png b/content-rst/applications/finance/fiscal_localizations/argentina/tax-amount-excluded.png new file mode 100644 index 000000000..b86eccbf7 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/tax-amount-excluded.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/tax-amount-included.png b/content-rst/applications/finance/fiscal_localizations/argentina/tax-amount-included.png new file mode 100644 index 000000000..02d97f941 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/tax-amount-included.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/third-party-payment-popup.png b/content-rst/applications/finance/fiscal_localizations/argentina/third-party-payment-popup.png new file mode 100644 index 000000000..02127b458 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/third-party-payment-popup.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/transmission-mode-on-invoice.png b/content-rst/applications/finance/fiscal_localizations/argentina/transmission-mode-on-invoice.png new file mode 100644 index 000000000..5babac0af Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/transmission-mode-on-invoice.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/transmission-mode.png b/content-rst/applications/finance/fiscal_localizations/argentina/transmission-mode.png new file mode 100644 index 000000000..6e81d7a4a Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/transmission-mode.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/upload-certificate-private-key.png b/content-rst/applications/finance/fiscal_localizations/argentina/upload-certificate-private-key.png new file mode 100644 index 000000000..99cf76643 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/upload-certificate-private-key.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/vat-exempt.png b/content-rst/applications/finance/fiscal_localizations/argentina/vat-exempt.png new file mode 100644 index 000000000..a8395eac1 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/vat-exempt.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/vendor-bill-document-number.png b/content-rst/applications/finance/fiscal_localizations/argentina/vendor-bill-document-number.png new file mode 100644 index 000000000..031d1e215 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/vendor-bill-document-number.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/verify-on-afip.png b/content-rst/applications/finance/fiscal_localizations/argentina/verify-on-afip.png new file mode 100644 index 000000000..7139bf360 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/verify-on-afip.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/verify-vendor-bills.png b/content-rst/applications/finance/fiscal_localizations/argentina/verify-vendor-bills.png new file mode 100644 index 000000000..afffba070 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/verify-vendor-bills.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/argentina/web-services.png b/content-rst/applications/finance/fiscal_localizations/argentina/web-services.png new file mode 100644 index 000000000..30c94a082 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/argentina/web-services.png differ diff --git a/content/applications/finance/fiscal_localizations/australia.rst b/content-rst/applications/finance/fiscal_localizations/australia.rst similarity index 100% rename from content/applications/finance/fiscal_localizations/australia.rst rename to content-rst/applications/finance/fiscal_localizations/australia.rst diff --git a/content-rst/applications/finance/fiscal_localizations/australia/bas-accounts.png b/content-rst/applications/finance/fiscal_localizations/australia/bas-accounts.png new file mode 100644 index 000000000..beac6da09 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/bas-accounts.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/bas-report.png b/content-rst/applications/finance/fiscal_localizations/australia/bas-report.png new file mode 100644 index 000000000..a8fad8351 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/bas-report.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/bas-taxes.png b/content-rst/applications/finance/fiscal_localizations/australia/bas-taxes.png new file mode 100644 index 000000000..23f34f146 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/bas-taxes.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/default-taxes.png b/content-rst/applications/finance/fiscal_localizations/australia/default-taxes.png new file mode 100644 index 000000000..265d79cdb Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/default-taxes.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/dgst-balance-credit.png b/content-rst/applications/finance/fiscal_localizations/australia/dgst-balance-credit.png new file mode 100644 index 000000000..8be02afbc Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/dgst-balance-credit.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/dgst-po-tax.png b/content-rst/applications/finance/fiscal_localizations/australia/dgst-po-tax.png new file mode 100644 index 000000000..752bccc62 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/dgst-po-tax.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/dgst-tax-grids.png b/content-rst/applications/finance/fiscal_localizations/australia/dgst-tax-grids.png new file mode 100644 index 000000000..262c8b5bb Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/dgst-tax-grids.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/gst-grids.png b/content-rst/applications/finance/fiscal_localizations/australia/gst-grids.png new file mode 100644 index 000000000..050fcd094 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/gst-grids.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/partner-einvoicing.png b/content-rst/applications/finance/fiscal_localizations/australia/partner-einvoicing.png new file mode 100644 index 000000000..03daeaea0 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/partner-einvoicing.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/payg.png b/content-rst/applications/finance/fiscal_localizations/australia/payg.png new file mode 100644 index 000000000..d60b04182 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/payg.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/payroll-accounting-entry.png b/content-rst/applications/finance/fiscal_localizations/australia/payroll-accounting-entry.png new file mode 100644 index 000000000..9dda379af Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/payroll-accounting-entry.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/payroll-bas.png b/content-rst/applications/finance/fiscal_localizations/australia/payroll-bas.png new file mode 100644 index 000000000..94409148d Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/payroll-bas.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/payroll-contract-australia.png b/content-rst/applications/finance/fiscal_localizations/australia/payroll-contract-australia.png new file mode 100644 index 000000000..cc1371fc7 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/payroll-contract-australia.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/payroll-contract-flow.png b/content-rst/applications/finance/fiscal_localizations/australia/payroll-contract-flow.png new file mode 100644 index 000000000..40b852acd Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/payroll-contract-flow.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/payroll-contract-run.png b/content-rst/applications/finance/fiscal_localizations/australia/payroll-contract-run.png new file mode 100644 index 000000000..e433d4954 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/payroll-contract-run.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/payroll-employee-private.png b/content-rst/applications/finance/fiscal_localizations/australia/payroll-employee-private.png new file mode 100644 index 000000000..98389ee56 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/payroll-employee-private.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/payroll-employee-settings.png b/content-rst/applications/finance/fiscal_localizations/australia/payroll-employee-settings.png new file mode 100644 index 000000000..cc1371fc7 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/payroll-employee-settings.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/payroll-employment-hero-accounts.png b/content-rst/applications/finance/fiscal_localizations/australia/payroll-employment-hero-accounts.png new file mode 100644 index 000000000..fc1423221 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/payroll-employment-hero-accounts.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/payroll-employment-hero-api-key.png b/content-rst/applications/finance/fiscal_localizations/australia/payroll-employment-hero-api-key.png new file mode 100644 index 000000000..f489e9e4a Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/payroll-employment-hero-api-key.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/payroll-employment-hero-business-id.png b/content-rst/applications/finance/fiscal_localizations/australia/payroll-employment-hero-business-id.png new file mode 100644 index 000000000..a894121a2 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/payroll-employment-hero-business-id.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/payroll-employment-hero-journal.png b/content-rst/applications/finance/fiscal_localizations/australia/payroll-employment-hero-journal.png new file mode 100644 index 000000000..ce26ec9a5 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/payroll-employment-hero-journal.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/payroll-employment-hero-settings.png b/content-rst/applications/finance/fiscal_localizations/australia/payroll-employment-hero-settings.png new file mode 100644 index 000000000..4891c7051 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/payroll-employment-hero-settings.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/payroll-expenses-journal.png b/content-rst/applications/finance/fiscal_localizations/australia/payroll-expenses-journal.png new file mode 100644 index 000000000..d6e46bafb Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/payroll-expenses-journal.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/payroll-expenses-payslip.png b/content-rst/applications/finance/fiscal_localizations/australia/payroll-expenses-payslip.png new file mode 100644 index 000000000..d274f461c Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/payroll-expenses-payslip.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/payroll-expenses-reimburse.png b/content-rst/applications/finance/fiscal_localizations/australia/payroll-expenses-reimburse.png new file mode 100644 index 000000000..8f426330d Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/payroll-expenses-reimburse.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/payroll-other-input-types.png b/content-rst/applications/finance/fiscal_localizations/australia/payroll-other-input-types.png new file mode 100644 index 000000000..ec9cd8e17 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/payroll-other-input-types.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/payroll-paid-batch.png b/content-rst/applications/finance/fiscal_localizations/australia/payroll-paid-batch.png new file mode 100644 index 000000000..3e199a5fa Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/payroll-paid-batch.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/payroll-payment-method.png b/content-rst/applications/finance/fiscal_localizations/australia/payroll-payment-method.png new file mode 100644 index 000000000..e352e2292 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/payroll-payment-method.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/payroll-payslip-salary.png b/content-rst/applications/finance/fiscal_localizations/australia/payroll-payslip-salary.png new file mode 100644 index 000000000..2d8d4af3c Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/payroll-payslip-salary.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/payroll-payslips-generation.png b/content-rst/applications/finance/fiscal_localizations/australia/payroll-payslips-generation.png new file mode 100644 index 000000000..a300c742e Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/payroll-payslips-generation.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/payroll-payslips-inputs.png b/content-rst/applications/finance/fiscal_localizations/australia/payroll-payslips-inputs.png new file mode 100644 index 000000000..dfcb5a878 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/payroll-payslips-inputs.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/payroll-reconciliation.png b/content-rst/applications/finance/fiscal_localizations/australia/payroll-reconciliation.png new file mode 100644 index 000000000..2ee805b18 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/payroll-reconciliation.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/payroll-stp-amend.png b/content-rst/applications/finance/fiscal_localizations/australia/payroll-stp-amend.png new file mode 100644 index 000000000..d669dd856 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/payroll-stp-amend.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/payroll-stp-eofy-finalisation.png b/content-rst/applications/finance/fiscal_localizations/australia/payroll-stp-eofy-finalisation.png new file mode 100644 index 000000000..dc2f50ab3 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/payroll-stp-eofy-finalisation.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/payroll-stp-eofy-list.png b/content-rst/applications/finance/fiscal_localizations/australia/payroll-stp-eofy-list.png new file mode 100644 index 000000000..1814e04ae Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/payroll-stp-eofy-list.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/payroll-stp-individual.png b/content-rst/applications/finance/fiscal_localizations/australia/payroll-stp-individual.png new file mode 100644 index 000000000..dc8cbaa38 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/payroll-stp-individual.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/payroll-stp-record.png b/content-rst/applications/finance/fiscal_localizations/australia/payroll-stp-record.png new file mode 100644 index 000000000..ca2a0245e Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/payroll-stp-record.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/payroll-stp-reset-payslips.png b/content-rst/applications/finance/fiscal_localizations/australia/payroll-stp-reset-payslips.png new file mode 100644 index 000000000..11fe3923a Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/payroll-stp-reset-payslips.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/payroll-stp-resubmit.png b/content-rst/applications/finance/fiscal_localizations/australia/payroll-stp-resubmit.png new file mode 100644 index 000000000..9a4831401 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/payroll-stp-resubmit.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/payroll-stp-zero-out.png b/content-rst/applications/finance/fiscal_localizations/australia/payroll-stp-zero-out.png new file mode 100644 index 000000000..e36b4c2fe Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/payroll-stp-zero-out.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/payroll-super-account.png b/content-rst/applications/finance/fiscal_localizations/australia/payroll-super-account.png new file mode 100644 index 000000000..a03eb7588 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/payroll-super-account.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/payroll-super-fund.png b/content-rst/applications/finance/fiscal_localizations/australia/payroll-super-fund.png new file mode 100644 index 000000000..878e7cdfb Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/payroll-super-fund.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/payroll-superfile-payment.png b/content-rst/applications/finance/fiscal_localizations/australia/payroll-superfile-payment.png new file mode 100644 index 000000000..5372b8538 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/payroll-superfile-payment.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/payroll-superfile.png b/content-rst/applications/finance/fiscal_localizations/australia/payroll-superfile.png new file mode 100644 index 000000000..0a8b0425e Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/payroll-superfile.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/payroll-termination-etp.png b/content-rst/applications/finance/fiscal_localizations/australia/payroll-termination-etp.png new file mode 100644 index 000000000..925b1836d Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/payroll-termination-etp.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/payroll-termination-payslip.png b/content-rst/applications/finance/fiscal_localizations/australia/payroll-termination-payslip.png new file mode 100644 index 000000000..05b6f8d2d Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/payroll-termination-payslip.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/payroll-termination.png b/content-rst/applications/finance/fiscal_localizations/australia/payroll-termination.png new file mode 100644 index 000000000..9dcc55959 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/payroll-termination.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/payroll-time-off.png b/content-rst/applications/finance/fiscal_localizations/australia/payroll-time-off.png new file mode 100644 index 000000000..e657333b7 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/payroll-time-off.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/payroll-waiting-payslips.png b/content-rst/applications/finance/fiscal_localizations/australia/payroll-waiting-payslips.png new file mode 100644 index 000000000..4cc5bc4e8 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/payroll-waiting-payslips.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/payroll-work-entry-types-configuration.png b/content-rst/applications/finance/fiscal_localizations/australia/payroll-work-entry-types-configuration.png new file mode 100644 index 000000000..b2f36f677 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/payroll-work-entry-types-configuration.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/payroll-work-entry-types.png b/content-rst/applications/finance/fiscal_localizations/australia/payroll-work-entry-types.png new file mode 100644 index 000000000..b51927ac1 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/payroll-work-entry-types.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/payroll-ytd-basic-rule.png b/content-rst/applications/finance/fiscal_localizations/australia/payroll-ytd-basic-rule.png new file mode 100644 index 000000000..74ab027b2 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/payroll-ytd-basic-rule.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/payroll-ytd-button.png b/content-rst/applications/finance/fiscal_localizations/australia/payroll-ytd-button.png new file mode 100644 index 000000000..b9da05d92 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/payroll-ytd-button.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/payroll-ytd-final.png b/content-rst/applications/finance/fiscal_localizations/australia/payroll-ytd-final.png new file mode 100644 index 000000000..5f620f31e Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/payroll-ytd-final.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/payroll-ytd-import.png b/content-rst/applications/finance/fiscal_localizations/australia/payroll-ytd-import.png new file mode 100644 index 000000000..fad51e332 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/payroll-ytd-import.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/payroll-ytd-salary-rules.png b/content-rst/applications/finance/fiscal_localizations/australia/payroll-ytd-salary-rules.png new file mode 100644 index 000000000..592346715 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/payroll-ytd-salary-rules.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/remittance.png b/content-rst/applications/finance/fiscal_localizations/australia/remittance.png new file mode 100644 index 000000000..ce57d1f1f Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/remittance.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/tpar-fiscal-positions.png b/content-rst/applications/finance/fiscal_localizations/australia/tpar-fiscal-positions.png new file mode 100644 index 000000000..064e772b0 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/tpar-fiscal-positions.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/australia/tpar-vendor-bill-tax.png b/content-rst/applications/finance/fiscal_localizations/australia/tpar-vendor-bill-tax.png new file mode 100644 index 000000000..be29bc74a Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/australia/tpar-vendor-bill-tax.png differ diff --git a/content/applications/finance/fiscal_localizations/austria.rst b/content-rst/applications/finance/fiscal_localizations/austria.rst similarity index 100% rename from content/applications/finance/fiscal_localizations/austria.rst rename to content-rst/applications/finance/fiscal_localizations/austria.rst diff --git a/content-rst/applications/finance/fiscal_localizations/austria/austria-saft-button.png b/content-rst/applications/finance/fiscal_localizations/austria/austria-saft-button.png new file mode 100644 index 000000000..9f977fad1 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/austria/austria-saft-button.png differ diff --git a/content/applications/finance/fiscal_localizations/belgium.rst b/content-rst/applications/finance/fiscal_localizations/belgium.rst similarity index 100% rename from content/applications/finance/fiscal_localizations/belgium.rst rename to content-rst/applications/finance/fiscal_localizations/belgium.rst diff --git a/content-rst/applications/finance/fiscal_localizations/belgium/281-50.png b/content-rst/applications/finance/fiscal_localizations/belgium/281-50.png new file mode 100644 index 000000000..07f726b25 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/belgium/281-50.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/belgium/325-form.png b/content-rst/applications/finance/fiscal_localizations/belgium/325-form.png new file mode 100644 index 000000000..84aea5e3e Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/belgium/325-form.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/belgium/be-modules.png b/content-rst/applications/finance/fiscal_localizations/belgium/be-modules.png new file mode 100644 index 000000000..f4589837a Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/belgium/be-modules.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/belgium/belgian-reports.png b/content-rst/applications/finance/fiscal_localizations/belgium/belgian-reports.png new file mode 100644 index 000000000..86dbddc89 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/belgium/belgian-reports.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/belgium/bis-number.png b/content-rst/applications/finance/fiscal_localizations/belgium/bis-number.png new file mode 100644 index 000000000..2835699e2 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/belgium/bis-number.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/belgium/car-bill.png b/content-rst/applications/finance/fiscal_localizations/belgium/car-bill.png new file mode 100644 index 000000000..1acbe6be6 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/belgium/car-bill.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/belgium/coda-import.png b/content-rst/applications/finance/fiscal_localizations/belgium/coda-import.png new file mode 100644 index 000000000..597fad093 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/belgium/coda-import.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/belgium/codabox_configuration_coda_journal.png b/content-rst/applications/finance/fiscal_localizations/belgium/codabox_configuration_coda_journal.png new file mode 100644 index 000000000..d592058a4 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/belgium/codabox_configuration_coda_journal.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/belgium/codabox_configuration_soda_setting.png b/content-rst/applications/finance/fiscal_localizations/belgium/codabox_configuration_soda_setting.png new file mode 100644 index 000000000..7ce94d767 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/belgium/codabox_configuration_soda_setting.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/belgium/deductible-tax.png b/content-rst/applications/finance/fiscal_localizations/belgium/deductible-tax.png new file mode 100644 index 000000000..aa51422e5 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/belgium/deductible-tax.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/belgium/iot-devices.png b/content-rst/applications/finance/fiscal_localizations/belgium/iot-devices.png new file mode 100644 index 000000000..be9a765f4 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/belgium/iot-devices.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/belgium/restaurant-expenses.png b/content-rst/applications/finance/fiscal_localizations/belgium/restaurant-expenses.png new file mode 100644 index 000000000..0e18a1861 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/belgium/restaurant-expenses.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/belgium/soda-import.png b/content-rst/applications/finance/fiscal_localizations/belgium/soda-import.png new file mode 100644 index 000000000..82a118bac Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/belgium/soda-import.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/belgium/vehicle-split.png b/content-rst/applications/finance/fiscal_localizations/belgium/vehicle-split.png new file mode 100644 index 000000000..02d24895f Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/belgium/vehicle-split.png differ diff --git a/content/applications/finance/fiscal_localizations/brazil.rst b/content-rst/applications/finance/fiscal_localizations/brazil.rst similarity index 100% rename from content/applications/finance/fiscal_localizations/brazil.rst rename to content-rst/applications/finance/fiscal_localizations/brazil.rst diff --git a/content-rst/applications/finance/fiscal_localizations/brazil/avatax-account-configuration.png b/content-rst/applications/finance/fiscal_localizations/brazil/avatax-account-configuration.png new file mode 100644 index 000000000..92f77c306 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/brazil/avatax-account-configuration.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/brazil/contact-configuration.png b/content-rst/applications/finance/fiscal_localizations/brazil/contact-configuration.png new file mode 100644 index 000000000..71faca94d Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/brazil/contact-configuration.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/brazil/contact-fiscal-configuration-nfse.png b/content-rst/applications/finance/fiscal_localizations/brazil/contact-fiscal-configuration-nfse.png new file mode 100644 index 000000000..63077d95d Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/brazil/contact-fiscal-configuration-nfse.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/brazil/contact-fiscal-configuration.png b/content-rst/applications/finance/fiscal_localizations/brazil/contact-fiscal-configuration.png new file mode 100644 index 000000000..837d48e0d Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/brazil/contact-fiscal-configuration.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/brazil/correction-letter.png b/content-rst/applications/finance/fiscal_localizations/brazil/correction-letter.png new file mode 100644 index 000000000..3a371488b Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/brazil/correction-letter.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/brazil/fiscal-position-configuration.png b/content-rst/applications/finance/fiscal_localizations/brazil/fiscal-position-configuration.png new file mode 100644 index 000000000..967a324cf Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/brazil/fiscal-position-configuration.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/brazil/invoice-cancellation.png b/content-rst/applications/finance/fiscal_localizations/brazil/invoice-cancellation.png new file mode 100644 index 000000000..41cb17218 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/brazil/invoice-cancellation.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/brazil/invoice-info-needed.png b/content-rst/applications/finance/fiscal_localizations/brazil/invoice-info-needed.png new file mode 100644 index 000000000..524097914 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/brazil/invoice-info-needed.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/brazil/journal-configuration.png b/content-rst/applications/finance/fiscal_localizations/brazil/journal-configuration.png new file mode 100644 index 000000000..b2ec85fd8 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/brazil/journal-configuration.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/brazil/process-electronic-invoice.png b/content-rst/applications/finance/fiscal_localizations/brazil/process-electronic-invoice.png new file mode 100644 index 000000000..773a985e3 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/brazil/process-electronic-invoice.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/brazil/product-configuration.png b/content-rst/applications/finance/fiscal_localizations/brazil/product-configuration.png new file mode 100644 index 000000000..92c09d7d5 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/brazil/product-configuration.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/brazil/range-number-invalidation-wizard.png b/content-rst/applications/finance/fiscal_localizations/brazil/range-number-invalidation-wizard.png new file mode 100644 index 000000000..994d0a65a Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/brazil/range-number-invalidation-wizard.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/brazil/range-number-invalidation.png b/content-rst/applications/finance/fiscal_localizations/brazil/range-number-invalidation.png new file mode 100644 index 000000000..01213dee7 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/brazil/range-number-invalidation.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/brazil/transfer-api-credentials.png b/content-rst/applications/finance/fiscal_localizations/brazil/transfer-api-credentials.png new file mode 100644 index 000000000..891799598 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/brazil/transfer-api-credentials.png differ diff --git a/content/applications/finance/fiscal_localizations/canada.rst b/content-rst/applications/finance/fiscal_localizations/canada.rst similarity index 100% rename from content/applications/finance/fiscal_localizations/canada.rst rename to content-rst/applications/finance/fiscal_localizations/canada.rst diff --git a/content-rst/applications/finance/fiscal_localizations/canada/l10n-ca-balance-sheet.png b/content-rst/applications/finance/fiscal_localizations/canada/l10n-ca-balance-sheet.png new file mode 100644 index 000000000..fcf11b5d5 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/canada/l10n-ca-balance-sheet.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/canada/l10n-ca-fiscal-positions.png b/content-rst/applications/finance/fiscal_localizations/canada/l10n-ca-fiscal-positions.png new file mode 100644 index 000000000..0d5e9368d Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/canada/l10n-ca-fiscal-positions.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/canada/l10n-ca-profit-loss.png b/content-rst/applications/finance/fiscal_localizations/canada/l10n-ca-profit-loss.png new file mode 100644 index 000000000..2b3c30a63 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/canada/l10n-ca-profit-loss.png differ diff --git a/content/applications/finance/fiscal_localizations/chile.rst b/content-rst/applications/finance/fiscal_localizations/chile.rst similarity index 100% rename from content/applications/finance/fiscal_localizations/chile.rst rename to content-rst/applications/finance/fiscal_localizations/chile.rst diff --git a/content-rst/applications/finance/fiscal_localizations/chile/8-col-fiscal-balance-report.png b/content-rst/applications/finance/fiscal_localizations/chile/8-col-fiscal-balance-report.png new file mode 100644 index 000000000..79e82b8fe Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/chile/8-col-fiscal-balance-report.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/chile/accept-vendor-bill-btn.png b/content-rst/applications/finance/fiscal_localizations/chile/accept-vendor-bill-btn.png new file mode 100644 index 000000000..84415aff9 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/chile/accept-vendor-bill-btn.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/chile/accepted-invoice-fiscal-information.png b/content-rst/applications/finance/fiscal_localizations/chile/accepted-invoice-fiscal-information.png new file mode 100644 index 000000000..de9bf8501 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/chile/accepted-invoice-fiscal-information.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/chile/accepted-invoice.png b/content-rst/applications/finance/fiscal_localizations/chile/accepted-invoice.png new file mode 100644 index 000000000..171ca501c Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/chile/accepted-invoice.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/chile/auto-ref-debit-note.png b/content-rst/applications/finance/fiscal_localizations/chile/auto-ref-debit-note.png new file mode 100644 index 000000000..1996b0ab3 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/chile/auto-ref-debit-note.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/chile/available-in-pos-product.png b/content-rst/applications/finance/fiscal_localizations/chile/available-in-pos-product.png new file mode 100644 index 000000000..baf005712 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/chile/available-in-pos-product.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/chile/chatter-delivery-guide.png b/content-rst/applications/finance/fiscal_localizations/chile/chatter-delivery-guide.png new file mode 100644 index 000000000..379c6cebe Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/chile/chatter-delivery-guide.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/chile/chatter-internal-statuses.png b/content-rst/applications/finance/fiscal_localizations/chile/chatter-internal-statuses.png new file mode 100644 index 000000000..7817ecec6 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/chile/chatter-internal-statuses.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/chile/chilean-custom-fields.png b/content-rst/applications/finance/fiscal_localizations/chile/chilean-custom-fields.png new file mode 100644 index 000000000..3000bf6f5 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/chile/chilean-custom-fields.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/chile/chilean-document-types.png b/content-rst/applications/finance/fiscal_localizations/chile/chilean-document-types.png new file mode 100644 index 000000000..2bab013fa Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/chile/chilean-document-types.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/chile/claim-vendor-bill-btn.png b/content-rst/applications/finance/fiscal_localizations/chile/claim-vendor-bill-btn.png new file mode 100644 index 000000000..517e978e9 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/chile/claim-vendor-bill-btn.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/chile/contact-for-electronic-invoice.png b/content-rst/applications/finance/fiscal_localizations/chile/contact-for-electronic-invoice.png new file mode 100644 index 000000000..2fca39f48 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/chile/contact-for-electronic-invoice.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/chile/credit-note-cancel-ref-doc.png b/content-rst/applications/finance/fiscal_localizations/chile/credit-note-cancel-ref-doc.png new file mode 100644 index 000000000..24f58ca07 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/chile/credit-note-cancel-ref-doc.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/chile/credit-note-correct-amount.png b/content-rst/applications/finance/fiscal_localizations/chile/credit-note-correct-amount.png new file mode 100644 index 000000000..068ca3ffd Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/chile/credit-note-correct-amount.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/chile/credit-note-correct-text.png b/content-rst/applications/finance/fiscal_localizations/chile/credit-note-correct-text.png new file mode 100644 index 000000000..4a4aee1ad Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/chile/credit-note-correct-text.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/chile/credit-note-document-type.png b/content-rst/applications/finance/fiscal_localizations/chile/credit-note-document-type.png new file mode 100644 index 000000000..8d3831572 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/chile/credit-note-document-type.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/chile/cross-reference-tab-registration.png b/content-rst/applications/finance/fiscal_localizations/chile/cross-reference-tab-registration.png new file mode 100644 index 000000000..56b13ed1e Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/chile/cross-reference-tab-registration.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/chile/customer-invoice-document-type.png b/content-rst/applications/finance/fiscal_localizations/chile/customer-invoice-document-type.png new file mode 100644 index 000000000..6ce2e6d5f Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/chile/customer-invoice-document-type.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/chile/debit-note-cancel-ref-doc.png b/content-rst/applications/finance/fiscal_localizations/chile/debit-note-cancel-ref-doc.png new file mode 100644 index 000000000..75fd4c1e2 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/chile/debit-note-cancel-ref-doc.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/chile/debit-note-correct-amount.png b/content-rst/applications/finance/fiscal_localizations/chile/debit-note-correct-amount.png new file mode 100644 index 000000000..29d93b3e2 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/chile/debit-note-correct-amount.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/chile/delivery-guide-creation-btn.png b/content-rst/applications/finance/fiscal_localizations/chile/delivery-guide-creation-btn.png new file mode 100644 index 000000000..f08219378 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/chile/delivery-guide-creation-btn.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/chile/delivery-guide-number-warning.png b/content-rst/applications/finance/fiscal_localizations/chile/delivery-guide-number-warning.png new file mode 100644 index 000000000..59c54695c Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/chile/delivery-guide-number-warning.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/chile/document-type-39.png b/content-rst/applications/finance/fiscal_localizations/chile/document-type-39.png new file mode 100644 index 000000000..f60447372 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/chile/document-type-39.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/chile/dte-email-electronic-invoice.png b/content-rst/applications/finance/fiscal_localizations/chile/dte-email-electronic-invoice.png new file mode 100644 index 000000000..0e2d7f125 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/chile/dte-email-electronic-invoice.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/chile/dte-incoming-email.png b/content-rst/applications/finance/fiscal_localizations/chile/dte-incoming-email.png new file mode 100644 index 000000000..4e176a5f9 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/chile/dte-incoming-email.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/chile/dte-status-flow.png b/content-rst/applications/finance/fiscal_localizations/chile/dte-status-flow.png new file mode 100644 index 000000000..644867ebc Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/chile/dte-status-flow.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/chile/dte-status-steps.png b/content-rst/applications/finance/fiscal_localizations/chile/dte-status-steps.png new file mode 100644 index 000000000..af2c07be7 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/chile/dte-status-steps.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/chile/ecommerce-module-chile.png b/content-rst/applications/finance/fiscal_localizations/chile/ecommerce-module-chile.png new file mode 100644 index 000000000..f700527a9 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/chile/ecommerce-module-chile.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/chile/electronic-invoice-data.png b/content-rst/applications/finance/fiscal_localizations/chile/electronic-invoice-data.png new file mode 100644 index 000000000..93201deb5 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/chile/electronic-invoice-data.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/chile/electronic-invoice-workflow.png b/content-rst/applications/finance/fiscal_localizations/chile/electronic-invoice-workflow.png new file mode 100644 index 000000000..c9529bce8 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/chile/electronic-invoice-workflow.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/chile/electronic-receipt-customer.png b/content-rst/applications/finance/fiscal_localizations/chile/electronic-receipt-customer.png new file mode 100644 index 000000000..b131c0efc Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/chile/electronic-receipt-customer.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/chile/electronic-receipt-ste-status.png b/content-rst/applications/finance/fiscal_localizations/chile/electronic-receipt-ste-status.png new file mode 100644 index 000000000..3dcd871bb Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/chile/electronic-receipt-ste-status.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/chile/f29-report.png b/content-rst/applications/finance/fiscal_localizations/chile/f29-report.png new file mode 100644 index 000000000..f51ac9bf5 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/chile/f29-report.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/chile/fiscal-fields-invoice-ecommerce.png b/content-rst/applications/finance/fiscal_localizations/chile/fiscal-fields-invoice-ecommerce.png new file mode 100644 index 000000000..56070b343 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/chile/fiscal-fields-invoice-ecommerce.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/chile/fiscal-required-pos-session.png b/content-rst/applications/finance/fiscal_localizations/chile/fiscal-required-pos-session.png new file mode 100644 index 000000000..a240bf6d0 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/chile/fiscal-required-pos-session.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/chile/invoice-option-at-payment.png b/content-rst/applications/finance/fiscal_localizations/chile/invoice-option-at-payment.png new file mode 100644 index 000000000..7fd749f94 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/chile/invoice-option-at-payment.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/chile/invoice-receipt-selection.png b/content-rst/applications/finance/fiscal_localizations/chile/invoice-receipt-selection.png new file mode 100644 index 000000000..1ff63c181 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/chile/invoice-receipt-selection.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/chile/locate-fiscal-balance-report.png b/content-rst/applications/finance/fiscal_localizations/chile/locate-fiscal-balance-report.png new file mode 100644 index 000000000..3b4ca3d68 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/chile/locate-fiscal-balance-report.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/chile/locate-propuesta-f29-report.png b/content-rst/applications/finance/fiscal_localizations/chile/locate-propuesta-f29-report.png new file mode 100644 index 000000000..4de8ebfbb Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/chile/locate-propuesta-f29-report.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/chile/manual-ppm-f29-report.png b/content-rst/applications/finance/fiscal_localizations/chile/manual-ppm-f29-report.png new file mode 100644 index 000000000..0e583d74a Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/chile/manual-ppm-f29-report.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/chile/new-certificate.png b/content-rst/applications/finance/fiscal_localizations/chile/new-certificate.png new file mode 100644 index 000000000..938fb7786 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/chile/new-certificate.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/chile/ordered-quantities-product.png b/content-rst/applications/finance/fiscal_localizations/chile/ordered-quantities-product.png new file mode 100644 index 000000000..3de6f5c8f Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/chile/ordered-quantities-product.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/chile/partner-dte-status.png b/content-rst/applications/finance/fiscal_localizations/chile/partner-dte-status.png new file mode 100644 index 000000000..59b1ee34d Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/chile/partner-dte-status.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/chile/pdf-report-section.png b/content-rst/applications/finance/fiscal_localizations/chile/pdf-report-section.png new file mode 100644 index 000000000..8572faaab Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/chile/pdf-report-section.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/chile/pos-edi-module-chile.png b/content-rst/applications/finance/fiscal_localizations/chile/pos-edi-module-chile.png new file mode 100644 index 000000000..058722a9f Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/chile/pos-edi-module-chile.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/chile/print-delivery-guide-btn.png b/content-rst/applications/finance/fiscal_localizations/chile/print-delivery-guide-btn.png new file mode 100644 index 000000000..509280e40 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/chile/print-delivery-guide-btn.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/chile/qr-code-ticket.png b/content-rst/applications/finance/fiscal_localizations/chile/qr-code-ticket.png new file mode 100644 index 000000000..fdcf0e359 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/chile/qr-code-ticket.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/chile/refund-order.png b/content-rst/applications/finance/fiscal_localizations/chile/refund-order.png new file mode 100644 index 000000000..a979f0211 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/chile/refund-order.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/chile/rejected-invoice.png b/content-rst/applications/finance/fiscal_localizations/chile/rejected-invoice.png new file mode 100644 index 000000000..7d416cee9 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/chile/rejected-invoice.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/chile/select-edi-docs-ecommerce.png b/content-rst/applications/finance/fiscal_localizations/chile/select-edi-docs-ecommerce.png new file mode 100644 index 000000000..8684f2dee Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/chile/select-edi-docs-ecommerce.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/chile/select-order-refund.png b/content-rst/applications/finance/fiscal_localizations/chile/select-order-refund.png new file mode 100644 index 000000000..097c76528 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/chile/select-order-refund.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/chile/taxpayer-type-export-goods.png b/content-rst/applications/finance/fiscal_localizations/chile/taxpayer-type-export-goods.png new file mode 100644 index 000000000..6f8d72ddb Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/chile/taxpayer-type-export-goods.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/chile/text-correction-label.png b/content-rst/applications/finance/fiscal_localizations/chile/text-correction-label.png new file mode 100644 index 000000000..dbada44ac Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/chile/text-correction-label.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/chile/website-configurations-ecommerce-chile.png b/content-rst/applications/finance/fiscal_localizations/chile/website-configurations-ecommerce-chile.png new file mode 100644 index 000000000..62ab691e8 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/chile/website-configurations-ecommerce-chile.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/chile/xml-creation.png b/content-rst/applications/finance/fiscal_localizations/chile/xml-creation.png new file mode 100644 index 000000000..549612ea0 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/chile/xml-creation.png differ diff --git a/content/applications/finance/fiscal_localizations/colombia.rst b/content-rst/applications/finance/fiscal_localizations/colombia.rst similarity index 100% rename from content/applications/finance/fiscal_localizations/colombia.rst rename to content-rst/applications/finance/fiscal_localizations/colombia.rst diff --git a/content-rst/applications/finance/fiscal_localizations/colombia/dian-credentials-configuration.png b/content-rst/applications/finance/fiscal_localizations/colombia/dian-credentials-configuration.png new file mode 100644 index 000000000..a54d7ea20 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/colombia/dian-credentials-configuration.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/colombia/dian-tab-electronic-document.png b/content-rst/applications/finance/fiscal_localizations/colombia/dian-tab-electronic-document.png new file mode 100644 index 000000000..7545ea579 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/colombia/dian-tab-electronic-document.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/colombia/dian-taxes-configuration.png b/content-rst/applications/finance/fiscal_localizations/colombia/dian-taxes-configuration.png new file mode 100644 index 000000000..96cdc0876 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/colombia/dian-taxes-configuration.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/colombia/rejected-invoice-error-message.png b/content-rst/applications/finance/fiscal_localizations/colombia/rejected-invoice-error-message.png new file mode 100644 index 000000000..8678882b1 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/colombia/rejected-invoice-error-message.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/colombia/reload-dian-configuration-button.png b/content-rst/applications/finance/fiscal_localizations/colombia/reload-dian-configuration-button.png new file mode 100644 index 000000000..d64605d86 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/colombia/reload-dian-configuration-button.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/colombia/retencion-fuente-dian.png b/content-rst/applications/finance/fiscal_localizations/colombia/retencion-fuente-dian.png new file mode 100644 index 000000000..8792c7ede Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/colombia/retencion-fuente-dian.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/colombia/retencion-ica-dian.png b/content-rst/applications/finance/fiscal_localizations/colombia/retencion-ica-dian.png new file mode 100644 index 000000000..e5bd8743e Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/colombia/retencion-ica-dian.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/colombia/retencion-iva-dian.png b/content-rst/applications/finance/fiscal_localizations/colombia/retencion-iva-dian.png new file mode 100644 index 000000000..47c39b69f Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/colombia/retencion-iva-dian.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/colombia/zip-xml-chatter-colombia.png b/content-rst/applications/finance/fiscal_localizations/colombia/zip-xml-chatter-colombia.png new file mode 100644 index 000000000..bd81fcb81 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/colombia/zip-xml-chatter-colombia.png differ diff --git a/content/applications/finance/fiscal_localizations/ecuador.rst b/content-rst/applications/finance/fiscal_localizations/ecuador.rst similarity index 100% rename from content/applications/finance/fiscal_localizations/ecuador.rst rename to content-rst/applications/finance/fiscal_localizations/ecuador.rst diff --git a/content-rst/applications/finance/fiscal_localizations/ecuador/103-form.png b/content-rst/applications/finance/fiscal_localizations/ecuador/103-form.png new file mode 100644 index 000000000..104153ad5 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/ecuador/103-form.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/ecuador/104-form.png b/content-rst/applications/finance/fiscal_localizations/ecuador/104-form.png new file mode 100644 index 000000000..acdd56b33 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/ecuador/104-form.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/ecuador/add-customer-credit-note.png b/content-rst/applications/finance/fiscal_localizations/ecuador/add-customer-credit-note.png new file mode 100644 index 000000000..fff34f68c Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/ecuador/add-customer-credit-note.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/ecuador/add-customer-debit-note.png b/content-rst/applications/finance/fiscal_localizations/ecuador/add-customer-debit-note.png new file mode 100644 index 000000000..f226bc45f Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/ecuador/add-customer-debit-note.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/ecuador/ats-report.png b/content-rst/applications/finance/fiscal_localizations/ecuador/ats-report.png new file mode 100644 index 000000000..afd80df56 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/ecuador/ats-report.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/ecuador/contacts.png b/content-rst/applications/finance/fiscal_localizations/ecuador/contacts.png new file mode 100644 index 000000000..c32cfecfb Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/ecuador/contacts.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/ecuador/contributor-type.png b/content-rst/applications/finance/fiscal_localizations/ecuador/contributor-type.png new file mode 100644 index 000000000..a311b7ec8 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/ecuador/contributor-type.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/ecuador/customer-credit-note.png b/content-rst/applications/finance/fiscal_localizations/ecuador/customer-credit-note.png new file mode 100644 index 000000000..2a67bd062 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/ecuador/customer-credit-note.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/ecuador/customer-debit-note.png b/content-rst/applications/finance/fiscal_localizations/ecuador/customer-debit-note.png new file mode 100644 index 000000000..b1e256894 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/ecuador/customer-debit-note.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/ecuador/customer-invoice.png b/content-rst/applications/finance/fiscal_localizations/ecuador/customer-invoice.png new file mode 100644 index 000000000..629f7b489 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/ecuador/customer-invoice.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/ecuador/customer-withhold.png b/content-rst/applications/finance/fiscal_localizations/ecuador/customer-withhold.png new file mode 100644 index 000000000..1050808d0 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/ecuador/customer-withhold.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/ecuador/document-types.png b/content-rst/applications/finance/fiscal_localizations/ecuador/document-types.png new file mode 100644 index 000000000..513c642a8 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/ecuador/document-types.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/ecuador/ecuador-company.png b/content-rst/applications/finance/fiscal_localizations/ecuador/ecuador-company.png new file mode 100644 index 000000000..e42b3b61d Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/ecuador/ecuador-company.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/ecuador/electronic-signature.png b/content-rst/applications/finance/fiscal_localizations/ecuador/electronic-signature.png new file mode 100644 index 000000000..a29147327 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/ecuador/electronic-signature.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/ecuador/l10n-ec-sri-payment-method.png b/content-rst/applications/finance/fiscal_localizations/ecuador/l10n-ec-sri-payment-method.png new file mode 100644 index 000000000..380d96f21 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/ecuador/l10n-ec-sri-payment-method.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/ecuador/printer-point.png b/content-rst/applications/finance/fiscal_localizations/ecuador/printer-point.png new file mode 100644 index 000000000..6742a0f46 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/ecuador/printer-point.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/ecuador/products.png b/content-rst/applications/finance/fiscal_localizations/ecuador/products.png new file mode 100644 index 000000000..1a888d988 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/ecuador/products.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/ecuador/purchase-invoice.png b/content-rst/applications/finance/fiscal_localizations/ecuador/purchase-invoice.png new file mode 100644 index 000000000..75a511f17 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/ecuador/purchase-invoice.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/ecuador/purchase-liqudations.png b/content-rst/applications/finance/fiscal_localizations/ecuador/purchase-liqudations.png new file mode 100644 index 000000000..0bf7374a1 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/ecuador/purchase-liqudations.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/ecuador/purchase-liquidation.png b/content-rst/applications/finance/fiscal_localizations/ecuador/purchase-liquidation.png new file mode 100644 index 000000000..bbd664d59 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/ecuador/purchase-liquidation.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/ecuador/purchase-withhold.png b/content-rst/applications/finance/fiscal_localizations/ecuador/purchase-withhold.png new file mode 100644 index 000000000..7543911e4 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/ecuador/purchase-withhold.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/ecuador/taxes-with-tax-support.png b/content-rst/applications/finance/fiscal_localizations/ecuador/taxes-with-tax-support.png new file mode 100644 index 000000000..309fc2ad2 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/ecuador/taxes-with-tax-support.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/ecuador/taxes.png b/content-rst/applications/finance/fiscal_localizations/ecuador/taxes.png new file mode 100644 index 000000000..585396bb2 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/ecuador/taxes.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/ecuador/website-checkout-form.png b/content-rst/applications/finance/fiscal_localizations/ecuador/website-checkout-form.png new file mode 100644 index 000000000..3c0dbeb24 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/ecuador/website-checkout-form.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/ecuador/withhold.png b/content-rst/applications/finance/fiscal_localizations/ecuador/withhold.png new file mode 100644 index 000000000..5b4576172 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/ecuador/withhold.png differ diff --git a/content/applications/finance/fiscal_localizations/egypt.rst b/content-rst/applications/finance/fiscal_localizations/egypt.rst similarity index 100% rename from content/applications/finance/fiscal_localizations/egypt.rst rename to content-rst/applications/finance/fiscal_localizations/egypt.rst diff --git a/content-rst/applications/finance/fiscal_localizations/egypt/add-erp-system.png b/content-rst/applications/finance/fiscal_localizations/egypt/add-erp-system.png new file mode 100644 index 000000000..feab51a50 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/egypt/add-erp-system.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/egypt/branch-journal.png b/content-rst/applications/finance/fiscal_localizations/egypt/branch-journal.png new file mode 100644 index 000000000..c3c4c9b67 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/egypt/branch-journal.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/egypt/eta-api-integration.png b/content-rst/applications/finance/fiscal_localizations/egypt/eta-api-integration.png new file mode 100644 index 000000000..7dbea8bd5 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/egypt/eta-api-integration.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/egypt/install-odoo-local-proxy.png b/content-rst/applications/finance/fiscal_localizations/egypt/install-odoo-local-proxy.png new file mode 100644 index 000000000..6db54771c Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/egypt/install-odoo-local-proxy.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/egypt/taxpayer-profile.png b/content-rst/applications/finance/fiscal_localizations/egypt/taxpayer-profile.png new file mode 100644 index 000000000..fcc3a4fde Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/egypt/taxpayer-profile.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/egypt/thumb-drive.png b/content-rst/applications/finance/fiscal_localizations/egypt/thumb-drive.png new file mode 100644 index 000000000..c2ed70c7e Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/egypt/thumb-drive.png differ diff --git a/content/applications/finance/fiscal_localizations/employment_hero.rst b/content-rst/applications/finance/fiscal_localizations/employment_hero.rst similarity index 100% rename from content/applications/finance/fiscal_localizations/employment_hero.rst rename to content-rst/applications/finance/fiscal_localizations/employment_hero.rst diff --git a/content-rst/applications/finance/fiscal_localizations/employment_hero/employment-hero-business-id.png b/content-rst/applications/finance/fiscal_localizations/employment_hero/employment-hero-business-id.png new file mode 100644 index 000000000..8004a1efe Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/employment_hero/employment-hero-business-id.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/employment_hero/employment-hero-chart-of-accounts.png b/content-rst/applications/finance/fiscal_localizations/employment_hero/employment-hero-chart-of-accounts.png new file mode 100644 index 000000000..38438920b Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/employment_hero/employment-hero-chart-of-accounts.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/employment_hero/employment-hero-integration.png b/content-rst/applications/finance/fiscal_localizations/employment_hero/employment-hero-integration.png new file mode 100644 index 000000000..91e94131e Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/employment_hero/employment-hero-integration.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/employment_hero/employment-hero-journal-entry.png b/content-rst/applications/finance/fiscal_localizations/employment_hero/employment-hero-journal-entry.png new file mode 100644 index 000000000..71a9ced75 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/employment_hero/employment-hero-journal-entry.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/employment_hero/employment-hero-myaccount.png b/content-rst/applications/finance/fiscal_localizations/employment_hero/employment-hero-myaccount.png new file mode 100644 index 000000000..61fc20268 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/employment_hero/employment-hero-myaccount.png differ diff --git a/content/applications/finance/fiscal_localizations/france.rst b/content-rst/applications/finance/fiscal_localizations/france.rst similarity index 100% rename from content/applications/finance/fiscal_localizations/france.rst rename to content-rst/applications/finance/fiscal_localizations/france.rst diff --git a/content/applications/finance/fiscal_localizations/germany.rst b/content-rst/applications/finance/fiscal_localizations/germany.rst similarity index 100% rename from content/applications/finance/fiscal_localizations/germany.rst rename to content-rst/applications/finance/fiscal_localizations/germany.rst diff --git a/content-rst/applications/finance/fiscal_localizations/germany/datev-export.png b/content-rst/applications/finance/fiscal_localizations/germany/datev-export.png new file mode 100644 index 000000000..1fb64dc17 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/germany/datev-export.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/germany/dsfinv-k-export.png b/content-rst/applications/finance/fiscal_localizations/germany/dsfinv-k-export.png new file mode 100644 index 000000000..312234790 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/germany/dsfinv-k-export.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/germany/fiskaly-registration.png b/content-rst/applications/finance/fiscal_localizations/germany/fiskaly-registration.png new file mode 100644 index 000000000..75b619f4c Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/germany/fiskaly-registration.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/germany/fiskaly-tss.png b/content-rst/applications/finance/fiscal_localizations/germany/fiskaly-tss.png new file mode 100644 index 000000000..15ebf7530 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/germany/fiskaly-tss.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/germany/pos-orders-menu.png b/content-rst/applications/finance/fiscal_localizations/germany/pos-orders-menu.png new file mode 100644 index 000000000..036ff8481 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/germany/pos-orders-menu.png differ diff --git a/content/applications/finance/fiscal_localizations/hong_kong.rst b/content-rst/applications/finance/fiscal_localizations/hong_kong.rst similarity index 100% rename from content/applications/finance/fiscal_localizations/hong_kong.rst rename to content-rst/applications/finance/fiscal_localizations/hong_kong.rst diff --git a/content-rst/applications/finance/fiscal_localizations/hong_kong/hk-adw.png b/content-rst/applications/finance/fiscal_localizations/hong_kong/hk-adw.png new file mode 100644 index 000000000..68c7bcba7 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/hong_kong/hk-adw.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/hong_kong/hk-apr-713.png b/content-rst/applications/finance/fiscal_localizations/hong_kong/hk-apr-713.png new file mode 100644 index 000000000..2805753a4 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/hong_kong/hk-apr-713.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/hong_kong/hk-attendance-payslip.png b/content-rst/applications/finance/fiscal_localizations/hong_kong/hk-attendance-payslip.png new file mode 100644 index 000000000..3ae6e03db Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/hong_kong/hk-attendance-payslip.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/hong_kong/hk-attendance-work-entry.png b/content-rst/applications/finance/fiscal_localizations/hong_kong/hk-attendance-work-entry.png new file mode 100644 index 000000000..e33743519 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/hong_kong/hk-attendance-work-entry.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/hong_kong/hk-bank-account-journal-setting.png b/content-rst/applications/finance/fiscal_localizations/hong_kong/hk-bank-account-journal-setting.png new file mode 100644 index 000000000..47a40bfdb Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/hong_kong/hk-bank-account-journal-setting.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/hong_kong/hk-contract.png b/content-rst/applications/finance/fiscal_localizations/hong_kong/hk-contract.png new file mode 100644 index 000000000..0fd073790 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/hong_kong/hk-contract.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/hong_kong/hk-fps-bank-setting.png b/content-rst/applications/finance/fiscal_localizations/hong_kong/hk-fps-bank-setting.png new file mode 100644 index 000000000..be387db93 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/hong_kong/hk-fps-bank-setting.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/hong_kong/hk-generate-autopay.png b/content-rst/applications/finance/fiscal_localizations/hong_kong/hk-generate-autopay.png new file mode 100644 index 000000000..a53ad7042 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/hong_kong/hk-generate-autopay.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/hong_kong/hk-ir56b.png b/content-rst/applications/finance/fiscal_localizations/hong_kong/hk-ir56b.png new file mode 100644 index 000000000..39b7525be Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/hong_kong/hk-ir56b.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/hong_kong/hk-manulife-sheet.png b/content-rst/applications/finance/fiscal_localizations/hong_kong/hk-manulife-sheet.png new file mode 100644 index 000000000..1f9ad008f Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/hong_kong/hk-manulife-sheet.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/hong_kong/hk-march-713.png b/content-rst/applications/finance/fiscal_localizations/hong_kong/hk-march-713.png new file mode 100644 index 000000000..52735c9c9 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/hong_kong/hk-march-713.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/hong_kong/hk-qr-code-invoice-setting.png b/content-rst/applications/finance/fiscal_localizations/hong_kong/hk-qr-code-invoice-setting.png new file mode 100644 index 000000000..6df1d5838 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/hong_kong/hk-qr-code-invoice-setting.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/hong_kong/hk-report-setup.png b/content-rst/applications/finance/fiscal_localizations/hong_kong/hk-report-setup.png new file mode 100644 index 000000000..f34ac529c Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/hong_kong/hk-report-setup.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/hong_kong/hk-salary-computation.png b/content-rst/applications/finance/fiscal_localizations/hong_kong/hk-salary-computation.png new file mode 100644 index 000000000..612671f1a Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/hong_kong/hk-salary-computation.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/hong_kong/hk-salary-rules.png b/content-rst/applications/finance/fiscal_localizations/hong_kong/hk-salary-rules.png new file mode 100644 index 000000000..a245fbb18 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/hong_kong/hk-salary-rules.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/hong_kong/hk-work-entry-type.png b/content-rst/applications/finance/fiscal_localizations/hong_kong/hk-work-entry-type.png new file mode 100644 index 000000000..927c83c3b Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/hong_kong/hk-work-entry-type.png differ diff --git a/content/applications/finance/fiscal_localizations/india.rst b/content-rst/applications/finance/fiscal_localizations/india.rst similarity index 100% rename from content/applications/finance/fiscal_localizations/india.rst rename to content-rst/applications/finance/fiscal_localizations/india.rst diff --git a/content-rst/applications/finance/fiscal_localizations/india/e-invoice-cancellation.png b/content-rst/applications/finance/fiscal_localizations/india/e-invoice-cancellation.png new file mode 100644 index 000000000..cd706ffd8 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/india/e-invoice-cancellation.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/india/e-invoice-process.png b/content-rst/applications/finance/fiscal_localizations/india/e-invoice-process.png new file mode 100644 index 000000000..c5d2c9a8e Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/india/e-invoice-process.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/india/e-invoice-setup.png b/content-rst/applications/finance/fiscal_localizations/india/e-invoice-setup.png new file mode 100644 index 000000000..b7fb682b7 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/india/e-invoice-setup.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/india/e-invoice-system-login.png b/content-rst/applications/finance/fiscal_localizations/india/e-invoice-system-login.png new file mode 100644 index 000000000..eb55d2d95 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/india/e-invoice-system-login.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/india/e-waybill-cancellation.png b/content-rst/applications/finance/fiscal_localizations/india/e-waybill-cancellation.png new file mode 100644 index 000000000..19fac49da Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/india/e-waybill-cancellation.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/india/e-waybill-configuration.png b/content-rst/applications/finance/fiscal_localizations/india/e-waybill-configuration.png new file mode 100644 index 000000000..13798aa6e Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/india/e-waybill-configuration.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/india/e-waybill-gsp-list.png b/content-rst/applications/finance/fiscal_localizations/india/e-waybill-gsp-list.png new file mode 100644 index 000000000..55b7ac895 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/india/e-waybill-gsp-list.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/india/e-waybill-invoice-report.png b/content-rst/applications/finance/fiscal_localizations/india/e-waybill-invoice-report.png new file mode 100644 index 000000000..2bb608454 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/india/e-waybill-invoice-report.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/india/e-waybill-process.png b/content-rst/applications/finance/fiscal_localizations/india/e-waybill-process.png new file mode 100644 index 000000000..96ef6a185 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/india/e-waybill-process.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/india/e-waybill-registration-details.png b/content-rst/applications/finance/fiscal_localizations/india/e-waybill-registration-details.png new file mode 100644 index 000000000..f28cc26dc Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/india/e-waybill-registration-details.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/india/e-waybill-send-button.png b/content-rst/applications/finance/fiscal_localizations/india/e-waybill-send-button.png new file mode 100644 index 000000000..9b4e6c718 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/india/e-waybill-send-button.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/india/gst-gstr-1-error-log.png b/content-rst/applications/finance/fiscal_localizations/india/gst-gstr-1-error-log.png new file mode 100644 index 000000000..40f80dca4 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/india/gst-gstr-1-error-log.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/india/gst-gstr-1-error.png b/content-rst/applications/finance/fiscal_localizations/india/gst-gstr-1-error.png new file mode 100644 index 000000000..0ed6d6ee9 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/india/gst-gstr-1-error.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/india/gst-gstr-1-filed.png b/content-rst/applications/finance/fiscal_localizations/india/gst-gstr-1-filed.png new file mode 100644 index 000000000..26dbd0052 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/india/gst-gstr-1-filed.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/india/gst-gstr-1-generate.png b/content-rst/applications/finance/fiscal_localizations/india/gst-gstr-1-generate.png new file mode 100644 index 000000000..3863899ac Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/india/gst-gstr-1-generate.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/india/gst-gstr-1-sale-report.png b/content-rst/applications/finance/fiscal_localizations/india/gst-gstr-1-sale-report.png new file mode 100644 index 000000000..5670b974a Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/india/gst-gstr-1-sale-report.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/india/gst-gstr-1-sending.png b/content-rst/applications/finance/fiscal_localizations/india/gst-gstr-1-sending.png new file mode 100644 index 000000000..5ad713ee9 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/india/gst-gstr-1-sending.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/india/gst-gstr-1-sent.png b/content-rst/applications/finance/fiscal_localizations/india/gst-gstr-1-sent.png new file mode 100644 index 000000000..2fbea470f Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/india/gst-gstr-1-sent.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/india/gst-gstr-1-spreadsheet-view.png b/content-rst/applications/finance/fiscal_localizations/india/gst-gstr-1-spreadsheet-view.png new file mode 100644 index 000000000..fade265e0 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/india/gst-gstr-1-spreadsheet-view.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/india/gst-gstr-1-waiting.png b/content-rst/applications/finance/fiscal_localizations/india/gst-gstr-1-waiting.png new file mode 100644 index 000000000..de5ad8ec2 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/india/gst-gstr-1-waiting.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/india/gst-gstr-2b-matched.png b/content-rst/applications/finance/fiscal_localizations/india/gst-gstr-2b-matched.png new file mode 100644 index 000000000..35d9c9995 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/india/gst-gstr-2b-matched.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/india/gst-gstr-2b-partially.png b/content-rst/applications/finance/fiscal_localizations/india/gst-gstr-2b-partially.png new file mode 100644 index 000000000..f83745555 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/india/gst-gstr-2b-partially.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/india/gst-gstr-2b-processed.png b/content-rst/applications/finance/fiscal_localizations/india/gst-gstr-2b-processed.png new file mode 100644 index 000000000..3fdcfcfe0 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/india/gst-gstr-2b-processed.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/india/gst-gstr-2b-reconcile.png b/content-rst/applications/finance/fiscal_localizations/india/gst-gstr-2b-reconcile.png new file mode 100644 index 000000000..75008dc18 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/india/gst-gstr-2b-reconcile.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/india/gst-gstr-2b-waiting.png b/content-rst/applications/finance/fiscal_localizations/india/gst-gstr-2b-waiting.png new file mode 100644 index 000000000..20b05a1c3 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/india/gst-gstr-2b-waiting.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/india/gst-gstr-3-filed.png b/content-rst/applications/finance/fiscal_localizations/india/gst-gstr-3-filed.png new file mode 100644 index 000000000..f4de90882 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/india/gst-gstr-3-filed.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/india/gst-gstr-3-post.png b/content-rst/applications/finance/fiscal_localizations/india/gst-gstr-3-post.png new file mode 100644 index 000000000..e26bacd9f Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/india/gst-gstr-3-post.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/india/gst-gstr-3-report.png b/content-rst/applications/finance/fiscal_localizations/india/gst-gstr-3-report.png new file mode 100644 index 000000000..89e4a9366 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/india/gst-gstr-3-report.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/india/gst-gstr-3.png b/content-rst/applications/finance/fiscal_localizations/india/gst-gstr-3.png new file mode 100644 index 000000000..2d7138aa4 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/india/gst-gstr-3.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/india/gst-portal-api-yes.png b/content-rst/applications/finance/fiscal_localizations/india/gst-portal-api-yes.png new file mode 100644 index 000000000..4a22ba52b Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/india/gst-portal-api-yes.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/india/gst-portal-my-profile.png b/content-rst/applications/finance/fiscal_localizations/india/gst-portal-my-profile.png new file mode 100644 index 000000000..3070d59ac Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/india/gst-portal-my-profile.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/india/gst-setup.png b/content-rst/applications/finance/fiscal_localizations/india/gst-setup.png new file mode 100644 index 000000000..441dafc8e Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/india/gst-setup.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/india/gstin-status-invoice.png b/content-rst/applications/finance/fiscal_localizations/india/gstin-status-invoice.png new file mode 100644 index 000000000..ed4a7aa60 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/india/gstin-status-invoice.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/india/india-modules.png b/content-rst/applications/finance/fiscal_localizations/india/india-modules.png new file mode 100644 index 000000000..c7c6b229c Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/india/india-modules.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/india/invoice-report.png b/content-rst/applications/finance/fiscal_localizations/india/invoice-report.png new file mode 100644 index 000000000..0e1769a98 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/india/invoice-report.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/india/profit-and-loss-report.png b/content-rst/applications/finance/fiscal_localizations/india/profit-and-loss-report.png new file mode 100644 index 000000000..9381abded Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/india/profit-and-loss-report.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/india/signed-invoice.png b/content-rst/applications/finance/fiscal_localizations/india/signed-invoice.png new file mode 100644 index 000000000..3797d7470 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/india/signed-invoice.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/india/submit-api-registration-details.png b/content-rst/applications/finance/fiscal_localizations/india/submit-api-registration-details.png new file mode 100644 index 000000000..104efc8ce Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/india/submit-api-registration-details.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/india/tcs-warning.png b/content-rst/applications/finance/fiscal_localizations/india/tcs-warning.png new file mode 100644 index 000000000..059f89617 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/india/tcs-warning.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/india/tds-apply.png b/content-rst/applications/finance/fiscal_localizations/india/tds-apply.png new file mode 100644 index 000000000..73cae1927 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/india/tds-apply.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/india/tds-tcs-section-modify.png b/content-rst/applications/finance/fiscal_localizations/india/tds-tcs-section-modify.png new file mode 100644 index 000000000..55d911fa2 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/india/tds-tcs-section-modify.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/india/verify-invoice.png b/content-rst/applications/finance/fiscal_localizations/india/verify-invoice.png new file mode 100644 index 000000000..5a447609a Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/india/verify-invoice.png differ diff --git a/content/applications/finance/fiscal_localizations/indonesia.rst b/content-rst/applications/finance/fiscal_localizations/indonesia.rst similarity index 100% rename from content/applications/finance/fiscal_localizations/indonesia.rst rename to content-rst/applications/finance/fiscal_localizations/indonesia.rst diff --git a/content-rst/applications/finance/fiscal_localizations/indonesia/indonesia-csv-created.png b/content-rst/applications/finance/fiscal_localizations/indonesia/indonesia-csv-created.png new file mode 100644 index 000000000..949bdd4da Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/indonesia/indonesia-csv-created.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/indonesia/indonesia-e-faktur-reset.png b/content-rst/applications/finance/fiscal_localizations/indonesia/indonesia-e-faktur-reset.png new file mode 100644 index 000000000..2cf5450fc Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/indonesia/indonesia-e-faktur-reset.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/indonesia/indonesia-e-faktur-sn.png b/content-rst/applications/finance/fiscal_localizations/indonesia/indonesia-e-faktur-sn.png new file mode 100644 index 000000000..af76116ff Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/indonesia/indonesia-e-faktur-sn.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/indonesia/indonesia-kode-transaksi.png b/content-rst/applications/finance/fiscal_localizations/indonesia/indonesia-kode-transaksi.png new file mode 100644 index 000000000..0a44e9614 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/indonesia/indonesia-kode-transaksi.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/indonesia/indonesia-partner-nik.png b/content-rst/applications/finance/fiscal_localizations/indonesia/indonesia-partner-nik.png new file mode 100644 index 000000000..7717ac608 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/indonesia/indonesia-partner-nik.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/indonesia/indonesia-replace-invoice.png b/content-rst/applications/finance/fiscal_localizations/indonesia/indonesia-replace-invoice.png new file mode 100644 index 000000000..7067aeca2 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/indonesia/indonesia-replace-invoice.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/indonesia/indonesia-sn-count.png b/content-rst/applications/finance/fiscal_localizations/indonesia/indonesia-sn-count.png new file mode 100644 index 000000000..433323d1e Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/indonesia/indonesia-sn-count.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/indonesia/invoice-qris.png b/content-rst/applications/finance/fiscal_localizations/indonesia/invoice-qris.png new file mode 100644 index 000000000..837ef47df Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/indonesia/invoice-qris.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/indonesia/journal-bank-config.png b/content-rst/applications/finance/fiscal_localizations/indonesia/journal-bank-config.png new file mode 100644 index 000000000..c24f00f45 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/indonesia/journal-bank-config.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/indonesia/qris-setup.png b/content-rst/applications/finance/fiscal_localizations/indonesia/qris-setup.png new file mode 100644 index 000000000..1f6742562 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/indonesia/qris-setup.png differ diff --git a/content/applications/finance/fiscal_localizations/italy.rst b/content-rst/applications/finance/fiscal_localizations/italy.rst similarity index 100% rename from content/applications/finance/fiscal_localizations/italy.rst rename to content-rst/applications/finance/fiscal_localizations/italy.rst diff --git a/content-rst/applications/finance/fiscal_localizations/italy/company.png b/content-rst/applications/finance/fiscal_localizations/italy/company.png new file mode 100644 index 000000000..3fb451334 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/italy/company.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/italy/edi-attachments.png b/content-rst/applications/finance/fiscal_localizations/italy/edi-attachments.png new file mode 100644 index 000000000..fbba2bb86 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/italy/edi-attachments.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/italy/edi-menu.png b/content-rst/applications/finance/fiscal_localizations/italy/edi-menu.png new file mode 100644 index 000000000..77346f4ac Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/italy/edi-menu.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/italy/edi-process.png b/content-rst/applications/finance/fiscal_localizations/italy/edi-process.png new file mode 100644 index 000000000..40038cb7e Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/italy/edi-process.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/italy/edi-processing.png b/content-rst/applications/finance/fiscal_localizations/italy/edi-processing.png new file mode 100644 index 000000000..8985c2107 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/italy/edi-processing.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/italy/edi-rejected.png b/content-rst/applications/finance/fiscal_localizations/italy/edi-rejected.png new file mode 100644 index 000000000..d342c9122 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/italy/edi-rejected.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/italy/edi-send-and-print.png b/content-rst/applications/finance/fiscal_localizations/italy/edi-send-and-print.png new file mode 100644 index 000000000..7451af04b Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/italy/edi-send-and-print.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/italy/edi-tax-integration-button.png b/content-rst/applications/finance/fiscal_localizations/italy/edi-tax-integration-button.png new file mode 100644 index 000000000..1093ab7ba Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/italy/edi-tax-integration-button.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/italy/edi.png b/content-rst/applications/finance/fiscal_localizations/italy/edi.png new file mode 100644 index 000000000..ccc289c26 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/italy/edi.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/italy/grids.png b/content-rst/applications/finance/fiscal_localizations/italy/grids.png new file mode 100644 index 000000000..ac20a9f1f Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/italy/grids.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/italy/riba-attachment.png b/content-rst/applications/finance/fiscal_localizations/italy/riba-attachment.png new file mode 100644 index 000000000..45c3d23f4 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/italy/riba-attachment.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/italy/sia-code.png b/content-rst/applications/finance/fiscal_localizations/italy/sia-code.png new file mode 100644 index 000000000..924840d5d Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/italy/sia-code.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/italy/tax-exemption.png b/content-rst/applications/finance/fiscal_localizations/italy/tax-exemption.png new file mode 100644 index 000000000..d2007b80b Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/italy/tax-exemption.png differ diff --git a/content/applications/finance/fiscal_localizations/kenya.rst b/content-rst/applications/finance/fiscal_localizations/kenya.rst similarity index 100% rename from content/applications/finance/fiscal_localizations/kenya.rst rename to content-rst/applications/finance/fiscal_localizations/kenya.rst diff --git a/content-rst/applications/finance/fiscal_localizations/kenya/oscu-codes.png b/content-rst/applications/finance/fiscal_localizations/kenya/oscu-codes.png new file mode 100644 index 000000000..fb4c66a98 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/kenya/oscu-codes.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/kenya/product-registration.png b/content-rst/applications/finance/fiscal_localizations/kenya/product-registration.png new file mode 100644 index 000000000..b0cafa111 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/kenya/product-registration.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/kenya/purchase-order-lines.png b/content-rst/applications/finance/fiscal_localizations/kenya/purchase-order-lines.png new file mode 100644 index 000000000..97b2d3220 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/kenya/purchase-order-lines.png differ diff --git a/content/applications/finance/fiscal_localizations/luxembourg.rst b/content-rst/applications/finance/fiscal_localizations/luxembourg.rst similarity index 100% rename from content/applications/finance/fiscal_localizations/luxembourg.rst rename to content-rst/applications/finance/fiscal_localizations/luxembourg.rst diff --git a/content-rst/applications/finance/fiscal_localizations/luxembourg/annual-tax-report.png b/content-rst/applications/finance/fiscal_localizations/luxembourg/annual-tax-report.png new file mode 100644 index 000000000..2a5842312 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/luxembourg/annual-tax-report.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/luxembourg/modules.png b/content-rst/applications/finance/fiscal_localizations/luxembourg/modules.png new file mode 100644 index 000000000..b5e01f663 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/luxembourg/modules.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/luxembourg/tax-report-types.png b/content-rst/applications/finance/fiscal_localizations/luxembourg/tax-report-types.png new file mode 100644 index 000000000..50e309240 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/luxembourg/tax-report-types.png differ diff --git a/content/applications/finance/fiscal_localizations/malaysia.rst b/content-rst/applications/finance/fiscal_localizations/malaysia.rst similarity index 100% rename from content/applications/finance/fiscal_localizations/malaysia.rst rename to content-rst/applications/finance/fiscal_localizations/malaysia.rst diff --git a/content-rst/applications/finance/fiscal_localizations/malaysia/myinvois-add-intermediary.png b/content-rst/applications/finance/fiscal_localizations/malaysia/myinvois-add-intermediary.png new file mode 100644 index 000000000..ca68b20c2 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/malaysia/myinvois-add-intermediary.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/malaysia/myinvois-intermediary-active.png b/content-rst/applications/finance/fiscal_localizations/malaysia/myinvois-intermediary-active.png new file mode 100644 index 000000000..1a2013729 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/malaysia/myinvois-intermediary-active.png differ diff --git a/content/applications/finance/fiscal_localizations/mexico.rst b/content-rst/applications/finance/fiscal_localizations/mexico.rst similarity index 100% rename from content/applications/finance/fiscal_localizations/mexico.rst rename to content-rst/applications/finance/fiscal_localizations/mexico.rst diff --git a/content-rst/applications/finance/fiscal_localizations/mexico/certificate.cer b/content-rst/applications/finance/fiscal_localizations/mexico/certificate.cer new file mode 100644 index 000000000..e0963d127 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/mexico/certificate.cer differ diff --git a/content-rst/applications/finance/fiscal_localizations/mexico/certificate.key b/content-rst/applications/finance/fiscal_localizations/mexico/certificate.key new file mode 100644 index 000000000..4f2d75daf Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/mexico/certificate.key differ diff --git a/content-rst/applications/finance/fiscal_localizations/mexico/mx-01-invoice-cancellation-substitute.png b/content-rst/applications/finance/fiscal_localizations/mexico/mx-01-invoice-cancellation-substitute.png new file mode 100644 index 000000000..6199b9b2b Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/mexico/mx-01-invoice-cancellation-substitute.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/mexico/mx-01-invoice-cancellation.png b/content-rst/applications/finance/fiscal_localizations/mexico/mx-01-invoice-cancellation.png new file mode 100644 index 000000000..a17ed136e Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/mexico/mx-01-invoice-cancellation.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/mexico/mx-certificates.png b/content-rst/applications/finance/fiscal_localizations/mexico/mx-certificates.png new file mode 100644 index 000000000..fe7a5b588 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/mexico/mx-certificates.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/mexico/mx-cfdi-to-public.png b/content-rst/applications/finance/fiscal_localizations/mexico/mx-cfdi-to-public.png new file mode 100644 index 000000000..f88a264c3 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/mexico/mx-cfdi-to-public.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/mexico/mx-company-info.png b/content-rst/applications/finance/fiscal_localizations/mexico/mx-company-info.png new file mode 100644 index 000000000..2dd200934 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/mexico/mx-company-info.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/mexico/mx-creating-credit-note.png b/content-rst/applications/finance/fiscal_localizations/mexico/mx-creating-credit-note.png new file mode 100644 index 000000000..34163b86c Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/mexico/mx-creating-credit-note.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/mexico/mx-delivery-guide-contacts.png b/content-rst/applications/finance/fiscal_localizations/mexico/mx-delivery-guide-contacts.png new file mode 100644 index 000000000..c277e2fb2 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/mexico/mx-delivery-guide-contacts.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/mexico/mx-delivery-guide-federal-transport.png b/content-rst/applications/finance/fiscal_localizations/mexico/mx-delivery-guide-federal-transport.png new file mode 100644 index 000000000..4310b3403 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/mexico/mx-delivery-guide-federal-transport.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/mexico/mx-delivery-guide-hazards-designation.png b/content-rst/applications/finance/fiscal_localizations/mexico/mx-delivery-guide-hazards-designation.png new file mode 100644 index 000000000..1daa32e5c Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/mexico/mx-delivery-guide-hazards-designation.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/mexico/mx-delivery-guide-hazards-environment.png b/content-rst/applications/finance/fiscal_localizations/mexico/mx-delivery-guide-hazards-environment.png new file mode 100644 index 000000000..d91beec23 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/mexico/mx-delivery-guide-hazards-environment.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/mexico/mx-delivery-guide-products.png b/content-rst/applications/finance/fiscal_localizations/mexico/mx-delivery-guide-products.png new file mode 100644 index 000000000..a880ea729 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/mexico/mx-delivery-guide-products.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/mexico/mx-delivery-guide-vehicle.png b/content-rst/applications/finance/fiscal_localizations/mexico/mx-delivery-guide-vehicle.png new file mode 100644 index 000000000..23637fc89 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/mexico/mx-delivery-guide-vehicle.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/mexico/mx-external-trade-customer-contact.png b/content-rst/applications/finance/fiscal_localizations/mexico/mx-external-trade-customer-contact.png new file mode 100644 index 000000000..9c4294441 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/mexico/mx-external-trade-customer-contact.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/mexico/mx-external-trade-other-info.png b/content-rst/applications/finance/fiscal_localizations/mexico/mx-external-trade-other-info.png new file mode 100644 index 000000000..6a7862f93 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/mexico/mx-external-trade-other-info.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/mexico/mx-external-trade-product.png b/content-rst/applications/finance/fiscal_localizations/mexico/mx-external-trade-product.png new file mode 100644 index 000000000..e38dd9dea Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/mexico/mx-external-trade-product.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/mexico/mx-external-trade-rescompany.png b/content-rst/applications/finance/fiscal_localizations/mexico/mx-external-trade-rescompany.png new file mode 100644 index 000000000..12e058fa7 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/mexico/mx-external-trade-rescompany.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/mexico/mx-factor-type.png b/content-rst/applications/finance/fiscal_localizations/mexico/mx-factor-type.png new file mode 100644 index 000000000..a71ed20b0 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/mexico/mx-factor-type.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/mexico/mx-fiscal-regime.png b/content-rst/applications/finance/fiscal_localizations/mexico/mx-fiscal-regime.png new file mode 100644 index 000000000..989779219 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/mexico/mx-fiscal-regime.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/mexico/mx-landing-configuration-category.png b/content-rst/applications/finance/fiscal_localizations/mexico/mx-landing-configuration-category.png new file mode 100644 index 000000000..9a73f72c4 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/mexico/mx-landing-configuration-category.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/mexico/mx-landing-configuration.png b/content-rst/applications/finance/fiscal_localizations/mexico/mx-landing-configuration.png new file mode 100644 index 000000000..05ba958bd Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/mexico/mx-landing-configuration.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/mexico/mx-landing-inventory.png b/content-rst/applications/finance/fiscal_localizations/mexico/mx-landing-inventory.png new file mode 100644 index 000000000..8c866deba Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/mexico/mx-landing-inventory.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/mexico/mx-landing-invoice.png b/content-rst/applications/finance/fiscal_localizations/mexico/mx-landing-invoice.png new file mode 100644 index 000000000..2fa720018 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/mexico/mx-landing-invoice.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/mexico/mx-multicurrency-1.png b/content-rst/applications/finance/fiscal_localizations/mexico/mx-multicurrency-1.png new file mode 100644 index 000000000..f1833de90 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/mexico/mx-multicurrency-1.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/mexico/mx-pac-account.png b/content-rst/applications/finance/fiscal_localizations/mexico/mx-pac-account.png new file mode 100644 index 000000000..c71116af8 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/mexico/mx-pac-account.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/mexico/mx-ppd-payment.png b/content-rst/applications/finance/fiscal_localizations/mexico/mx-ppd-payment.png new file mode 100644 index 000000000..1f6a64fb0 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/mexico/mx-ppd-payment.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/mexico/mx-pue-payment.png b/content-rst/applications/finance/fiscal_localizations/mexico/mx-pue-payment.png new file mode 100644 index 000000000..36d778133 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/mexico/mx-pue-payment.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/mexico/mx-reports-diot-contact.png b/content-rst/applications/finance/fiscal_localizations/mexico/mx-reports-diot-contact.png new file mode 100644 index 000000000..97fb8cd93 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/mexico/mx-reports-diot-contact.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/mexico/mx-reports-diot-example.png b/content-rst/applications/finance/fiscal_localizations/mexico/mx-reports-diot-example.png new file mode 100644 index 000000000..83ba6dcc7 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/mexico/mx-reports-diot-example.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/mexico/mx-reports-trial-balance-13-report.png b/content-rst/applications/finance/fiscal_localizations/mexico/mx-reports-trial-balance-13-report.png new file mode 100644 index 000000000..99fdc3d9f Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/mexico/mx-reports-trial-balance-13-report.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/mexico/mx-reports-trial-balance.png b/content-rst/applications/finance/fiscal_localizations/mexico/mx-reports-trial-balance.png new file mode 100644 index 000000000..0f2857b39 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/mexico/mx-reports-trial-balance.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/mexico/mx-signed-complement.png b/content-rst/applications/finance/fiscal_localizations/mexico/mx-signed-complement.png new file mode 100644 index 000000000..afaa5b158 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/mexico/mx-signed-complement.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/mexico/mx-tax-breakdown.png b/content-rst/applications/finance/fiscal_localizations/mexico/mx-tax-breakdown.png new file mode 100644 index 000000000..d77add1e7 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/mexico/mx-tax-breakdown.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/mexico/mx-taxes-config.png b/content-rst/applications/finance/fiscal_localizations/mexico/mx-taxes-config.png new file mode 100644 index 000000000..57fc49ed6 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/mexico/mx-taxes-config.png differ diff --git a/content/applications/finance/fiscal_localizations/netherlands.rst b/content-rst/applications/finance/fiscal_localizations/netherlands.rst similarity index 100% rename from content/applications/finance/fiscal_localizations/netherlands.rst rename to content-rst/applications/finance/fiscal_localizations/netherlands.rst diff --git a/content/applications/finance/fiscal_localizations/new_zealand.rst b/content-rst/applications/finance/fiscal_localizations/new_zealand.rst similarity index 100% rename from content/applications/finance/fiscal_localizations/new_zealand.rst rename to content-rst/applications/finance/fiscal_localizations/new_zealand.rst diff --git a/content/applications/finance/fiscal_localizations/peru.rst b/content-rst/applications/finance/fiscal_localizations/peru.rst similarity index 100% rename from content/applications/finance/fiscal_localizations/peru.rst rename to content-rst/applications/finance/fiscal_localizations/peru.rst diff --git a/content-rst/applications/finance/fiscal_localizations/peru/company-operator-configuration.png b/content-rst/applications/finance/fiscal_localizations/peru/company-operator-configuration.png new file mode 100644 index 000000000..b510c45b8 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/peru/company-operator-configuration.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/peru/generate-gre-transferview.png b/content-rst/applications/finance/fiscal_localizations/peru/generate-gre-transferview.png new file mode 100644 index 000000000..74b88560b Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/peru/generate-gre-transferview.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/peru/gre-delivery-slip.png b/content-rst/applications/finance/fiscal_localizations/peru/gre-delivery-slip.png new file mode 100644 index 000000000..5ce08e3b1 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/peru/gre-delivery-slip.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/peru/gre-fields-example.png b/content-rst/applications/finance/fiscal_localizations/peru/gre-fields-example.png new file mode 100644 index 000000000..82da7c373 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/peru/gre-fields-example.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/peru/l10n-pe-banksync-sunat.png b/content-rst/applications/finance/fiscal_localizations/peru/l10n-pe-banksync-sunat.png new file mode 100644 index 000000000..be0a90237 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/peru/l10n-pe-banksync-sunat.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/peru/l10n-ple-export-button.png b/content-rst/applications/finance/fiscal_localizations/peru/l10n-ple-export-button.png new file mode 100644 index 000000000..9923f4299 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/peru/l10n-ple-export-button.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/peru/operator-configuration.png b/content-rst/applications/finance/fiscal_localizations/peru/operator-configuration.png new file mode 100644 index 000000000..b48ff6582 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/peru/operator-configuration.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/peru/peru-Certificate.png b/content-rst/applications/finance/fiscal_localizations/peru/peru-Certificate.png new file mode 100644 index 000000000..ea4a87cc6 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/peru/peru-Certificate.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/peru/peru-Digiflow.png b/content-rst/applications/finance/fiscal_localizations/peru/peru-Digiflow.png new file mode 100644 index 000000000..ed94abf92 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/peru/peru-Digiflow.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/peru/peru-IAP.png b/content-rst/applications/finance/fiscal_localizations/peru/peru-IAP.png new file mode 100644 index 000000000..9e0e344d1 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/peru/peru-IAP.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/peru/peru-PDF.png b/content-rst/applications/finance/fiscal_localizations/peru/peru-PDF.png new file mode 100644 index 000000000..6d35040ff Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/peru/peru-PDF.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/peru/peru-cancellation-cdr.png b/content-rst/applications/finance/fiscal_localizations/peru/peru-cancellation-cdr.png new file mode 100644 index 000000000..62c8a1f96 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/peru/peru-cancellation-cdr.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/peru/peru-cancellation.png b/content-rst/applications/finance/fiscal_localizations/peru/peru-cancellation.png new file mode 100644 index 000000000..91f300936 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/peru/peru-cancellation.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/peru/peru-cancelled.png b/content-rst/applications/finance/fiscal_localizations/peru/peru-cancelled.png new file mode 100644 index 000000000..b6dc5cd02 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/peru/peru-cancelled.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/peru/peru-company.png b/content-rst/applications/finance/fiscal_localizations/peru/peru-company.png new file mode 100644 index 000000000..57d3099de Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/peru/peru-company.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/peru/peru-credit-note-document.png b/content-rst/applications/finance/fiscal_localizations/peru/peru-credit-note-document.png new file mode 100644 index 000000000..e913129d7 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/peru/peru-credit-note-document.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/peru/peru-credit-note.png b/content-rst/applications/finance/fiscal_localizations/peru/peru-credit-note.png new file mode 100644 index 000000000..60c1a2563 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/peru/peru-credit-note.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/peru/peru-credits-IAP.png b/content-rst/applications/finance/fiscal_localizations/peru/peru-credits-IAP.png new file mode 100644 index 000000000..498a62464 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/peru/peru-credits-IAP.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/peru/peru-detraction-invoice.png b/content-rst/applications/finance/fiscal_localizations/peru/peru-detraction-invoice.png new file mode 100644 index 000000000..46cbfbf9d Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/peru/peru-detraction-invoice.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/peru/peru-detraction.png b/content-rst/applications/finance/fiscal_localizations/peru/peru-detraction.png new file mode 100644 index 000000000..23c9f70ac Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/peru/peru-detraction.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/peru/peru-document-type.png b/content-rst/applications/finance/fiscal_localizations/peru/peru-document-type.png new file mode 100644 index 000000000..29946983b Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/peru/peru-document-type.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/peru/peru-errors.png b/content-rst/applications/finance/fiscal_localizations/peru/peru-errors.png new file mode 100644 index 000000000..0e382ebde Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/peru/peru-errors.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/peru/peru-exp-invoice.png b/content-rst/applications/finance/fiscal_localizations/peru/peru-exp-invoice.png new file mode 100644 index 000000000..457c4b0b6 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/peru/peru-exp-invoice.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/peru/peru-id-type.png b/content-rst/applications/finance/fiscal_localizations/peru/peru-id-type.png new file mode 100644 index 000000000..b17f2ce1e Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/peru/peru-id-type.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/peru/peru-invoice-document-type.png b/content-rst/applications/finance/fiscal_localizations/peru/peru-invoice-document-type.png new file mode 100644 index 000000000..6e05ec293 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/peru/peru-invoice-document-type.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/peru/peru-invoice-sent.png b/content-rst/applications/finance/fiscal_localizations/peru/peru-invoice-sent.png new file mode 100644 index 000000000..548eab8ed Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/peru/peru-invoice-sent.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/peru/peru-journal-edi.png b/content-rst/applications/finance/fiscal_localizations/peru/peru-journal-edi.png new file mode 100644 index 000000000..02843a106 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/peru/peru-journal-edi.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/peru/peru-modules.png b/content-rst/applications/finance/fiscal_localizations/peru/peru-modules.png new file mode 100644 index 000000000..73843850e Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/peru/peru-modules.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/peru/peru-operation-type.png b/content-rst/applications/finance/fiscal_localizations/peru/peru-operation-type.png new file mode 100644 index 000000000..ba508257c Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/peru/peru-operation-type.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/peru/peru-posted-invoice.png b/content-rst/applications/finance/fiscal_localizations/peru/peru-posted-invoice.png new file mode 100644 index 000000000..8fb3fcfda Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/peru/peru-posted-invoice.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/peru/peru-sent-manual.png b/content-rst/applications/finance/fiscal_localizations/peru/peru-sent-manual.png new file mode 100644 index 000000000..f019c5a7c Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/peru/peru-sent-manual.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/peru/peru-tax-affectation-reason.png b/content-rst/applications/finance/fiscal_localizations/peru/peru-tax-affectation-reason.png new file mode 100644 index 000000000..8702f831d Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/peru/peru-tax-affectation-reason.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/peru/peru-taxes-edi.png b/content-rst/applications/finance/fiscal_localizations/peru/peru-taxes-edi.png new file mode 100644 index 000000000..ce80bd7ff Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/peru/peru-taxes-edi.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/peru/peru-taxes.png b/content-rst/applications/finance/fiscal_localizations/peru/peru-taxes.png new file mode 100644 index 000000000..3f3db6981 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/peru/peru-taxes.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/peru/peru-unspc-code.png b/content-rst/applications/finance/fiscal_localizations/peru/peru-unspc-code.png new file mode 100644 index 000000000..7cc4352ac Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/peru/peru-unspc-code.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/peru/vehicle-not-m1-or-l-pe.png b/content-rst/applications/finance/fiscal_localizations/peru/vehicle-not-m1-or-l-pe.png new file mode 100644 index 000000000..e89fc4bca Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/peru/vehicle-not-m1-or-l-pe.png differ diff --git a/content/applications/finance/fiscal_localizations/philippines.rst b/content-rst/applications/finance/fiscal_localizations/philippines.rst similarity index 100% rename from content/applications/finance/fiscal_localizations/philippines.rst rename to content-rst/applications/finance/fiscal_localizations/philippines.rst diff --git a/content-rst/applications/finance/fiscal_localizations/philippines/2550Q.png b/content-rst/applications/finance/fiscal_localizations/philippines/2550Q.png new file mode 100644 index 000000000..3842bbc77 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/philippines/2550Q.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/philippines/philippines-atc-code.png b/content-rst/applications/finance/fiscal_localizations/philippines/philippines-atc-code.png new file mode 100644 index 000000000..10b08cf9e Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/philippines/philippines-atc-code.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/philippines/philippines-generate.png b/content-rst/applications/finance/fiscal_localizations/philippines/philippines-generate.png new file mode 100644 index 000000000..d12e6de6e Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/philippines/philippines-generate.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/philippines/philippines-multi-bill.png b/content-rst/applications/finance/fiscal_localizations/philippines/philippines-multi-bill.png new file mode 100644 index 000000000..25869f5c2 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/philippines/philippines-multi-bill.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/philippines/philippines-sawt.png b/content-rst/applications/finance/fiscal_localizations/philippines/philippines-sawt.png new file mode 100644 index 000000000..bb769fd08 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/philippines/philippines-sawt.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/philippines/slsp.png b/content-rst/applications/finance/fiscal_localizations/philippines/slsp.png new file mode 100644 index 000000000..d14e7f08c Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/philippines/slsp.png differ diff --git a/content/applications/finance/fiscal_localizations/romania.rst b/content-rst/applications/finance/fiscal_localizations/romania.rst similarity index 100% rename from content/applications/finance/fiscal_localizations/romania.rst rename to content-rst/applications/finance/fiscal_localizations/romania.rst diff --git a/content-rst/applications/finance/fiscal_localizations/romania/romania-dukintegrator.png b/content-rst/applications/finance/fiscal_localizations/romania/romania-dukintegrator.png new file mode 100644 index 000000000..ad7b1fe54 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/romania/romania-dukintegrator.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/romania/romania-modules.png b/content-rst/applications/finance/fiscal_localizations/romania/romania-modules.png new file mode 100644 index 000000000..6d90baffc Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/romania/romania-modules.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/romania/romania-saft-button.png b/content-rst/applications/finance/fiscal_localizations/romania/romania-saft-button.png new file mode 100644 index 000000000..c3a34467a Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/romania/romania-saft-button.png differ diff --git a/content/applications/finance/fiscal_localizations/saudi_arabia.rst b/content-rst/applications/finance/fiscal_localizations/saudi_arabia.rst similarity index 100% rename from content/applications/finance/fiscal_localizations/saudi_arabia.rst rename to content-rst/applications/finance/fiscal_localizations/saudi_arabia.rst diff --git a/content/applications/finance/fiscal_localizations/singapore.rst b/content-rst/applications/finance/fiscal_localizations/singapore.rst similarity index 100% rename from content/applications/finance/fiscal_localizations/singapore.rst rename to content-rst/applications/finance/fiscal_localizations/singapore.rst diff --git a/content-rst/applications/finance/fiscal_localizations/singapore/sg-bank-account-journal-setting.png b/content-rst/applications/finance/fiscal_localizations/singapore/sg-bank-account-journal-setting.png new file mode 100644 index 000000000..b2dc258b1 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/singapore/sg-bank-account-journal-setting.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/singapore/sg-paynow-bank-setting.png b/content-rst/applications/finance/fiscal_localizations/singapore/sg-paynow-bank-setting.png new file mode 100644 index 000000000..a87ec885b Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/singapore/sg-paynow-bank-setting.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/singapore/sg-qr-code-invoice-setting.png b/content-rst/applications/finance/fiscal_localizations/singapore/sg-qr-code-invoice-setting.png new file mode 100644 index 000000000..6df1d5838 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/singapore/sg-qr-code-invoice-setting.png differ diff --git a/content/applications/finance/fiscal_localizations/spain.rst b/content-rst/applications/finance/fiscal_localizations/spain.rst similarity index 100% rename from content/applications/finance/fiscal_localizations/spain.rst rename to content-rst/applications/finance/fiscal_localizations/spain.rst diff --git a/content-rst/applications/finance/fiscal_localizations/spain/administrative-center.png b/content-rst/applications/finance/fiscal_localizations/spain/administrative-center.png new file mode 100644 index 000000000..2a59d289d Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/spain/administrative-center.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/spain/modelo-reports.png b/content-rst/applications/finance/fiscal_localizations/spain/modelo-reports.png new file mode 100644 index 000000000..9efb35e72 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/spain/modelo-reports.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/spain/qr-code.png b/content-rst/applications/finance/fiscal_localizations/spain/qr-code.png new file mode 100644 index 000000000..ff78141d7 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/spain/qr-code.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/spain/ticketbai-invoice.png b/content-rst/applications/finance/fiscal_localizations/spain/ticketbai-invoice.png new file mode 100644 index 000000000..d7b4fa2c5 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/spain/ticketbai-invoice.png differ diff --git a/content/applications/finance/fiscal_localizations/switzerland.rst b/content-rst/applications/finance/fiscal_localizations/switzerland.rst similarity index 100% rename from content/applications/finance/fiscal_localizations/switzerland.rst rename to content-rst/applications/finance/fiscal_localizations/switzerland.rst diff --git a/content-rst/applications/finance/fiscal_localizations/switzerland/switzerland-isr-reference.png b/content-rst/applications/finance/fiscal_localizations/switzerland/switzerland-isr-reference.png new file mode 100644 index 000000000..c58938dc1 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/switzerland/switzerland-isr-reference.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/switzerland/switzerland00.png b/content-rst/applications/finance/fiscal_localizations/switzerland/switzerland00.png new file mode 100644 index 000000000..33dadaca3 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/switzerland/switzerland00.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/switzerland/switzerland01.png b/content-rst/applications/finance/fiscal_localizations/switzerland/switzerland01.png new file mode 100644 index 000000000..769400b03 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/switzerland/switzerland01.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/switzerland/switzerland02.png b/content-rst/applications/finance/fiscal_localizations/switzerland/switzerland02.png new file mode 100644 index 000000000..0ad5a2eb9 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/switzerland/switzerland02.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/switzerland/switzerland03.png b/content-rst/applications/finance/fiscal_localizations/switzerland/switzerland03.png new file mode 100644 index 000000000..84de16e8b Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/switzerland/switzerland03.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/switzerland/switzerland04.png b/content-rst/applications/finance/fiscal_localizations/switzerland/switzerland04.png new file mode 100644 index 000000000..cfddabf47 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/switzerland/switzerland04.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/switzerland/switzerland05.png b/content-rst/applications/finance/fiscal_localizations/switzerland/switzerland05.png new file mode 100644 index 000000000..f21ebe88f Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/switzerland/switzerland05.png differ diff --git a/content/applications/finance/fiscal_localizations/thailand.rst b/content-rst/applications/finance/fiscal_localizations/thailand.rst similarity index 100% rename from content/applications/finance/fiscal_localizations/thailand.rst rename to content-rst/applications/finance/fiscal_localizations/thailand.rst diff --git a/content-rst/applications/finance/fiscal_localizations/thailand/contact.png b/content-rst/applications/finance/fiscal_localizations/thailand/contact.png new file mode 100644 index 000000000..33ce0b412 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/thailand/contact.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/thailand/modules.png b/content-rst/applications/finance/fiscal_localizations/thailand/modules.png new file mode 100644 index 000000000..5b84487ba Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/thailand/modules.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/thailand/pnd-report.png b/content-rst/applications/finance/fiscal_localizations/thailand/pnd-report.png new file mode 100644 index 000000000..67ac8e796 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/thailand/pnd-report.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/thailand/pnd3-pnd53.png b/content-rst/applications/finance/fiscal_localizations/thailand/pnd3-pnd53.png new file mode 100644 index 000000000..42fcc81ff Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/thailand/pnd3-pnd53.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/thailand/qr-bank-journal.png b/content-rst/applications/finance/fiscal_localizations/thailand/qr-bank-journal.png new file mode 100644 index 000000000..9c380b6d2 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/thailand/qr-bank-journal.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/thailand/qr-code-invoice-emv.png b/content-rst/applications/finance/fiscal_localizations/thailand/qr-code-invoice-emv.png new file mode 100644 index 000000000..ef895786c Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/thailand/qr-code-invoice-emv.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/thailand/qr-promptpay-bank.png b/content-rst/applications/finance/fiscal_localizations/thailand/qr-promptpay-bank.png new file mode 100644 index 000000000..e9c3bf765 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/thailand/qr-promptpay-bank.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/thailand/tax-invoice.png b/content-rst/applications/finance/fiscal_localizations/thailand/tax-invoice.png new file mode 100644 index 000000000..38a648691 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/thailand/tax-invoice.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/thailand/tax-report.png b/content-rst/applications/finance/fiscal_localizations/thailand/tax-report.png new file mode 100644 index 000000000..49010ff9e Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/thailand/tax-report.png differ diff --git a/content/applications/finance/fiscal_localizations/united_arab_emirates.rst b/content-rst/applications/finance/fiscal_localizations/united_arab_emirates.rst similarity index 100% rename from content/applications/finance/fiscal_localizations/united_arab_emirates.rst rename to content-rst/applications/finance/fiscal_localizations/united_arab_emirates.rst diff --git a/content-rst/applications/finance/fiscal_localizations/united_arab_emirates/l10n-ae-modules.png b/content-rst/applications/finance/fiscal_localizations/united_arab_emirates/l10n-ae-modules.png new file mode 100644 index 000000000..e5ea06cfa Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/united_arab_emirates/l10n-ae-modules.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/united_arab_emirates/uae-localization-salary-rules.png b/content-rst/applications/finance/fiscal_localizations/united_arab_emirates/uae-localization-salary-rules.png new file mode 100644 index 000000000..ab46442e4 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/united_arab_emirates/uae-localization-salary-rules.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/united_arab_emirates/uae-localization-salary-structure.png b/content-rst/applications/finance/fiscal_localizations/united_arab_emirates/uae-localization-salary-structure.png new file mode 100644 index 000000000..5317f037f Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/united_arab_emirates/uae-localization-salary-structure.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/united_arab_emirates/uae-localization-taxes.png b/content-rst/applications/finance/fiscal_localizations/united_arab_emirates/uae-localization-taxes.png new file mode 100644 index 000000000..6d9baddf3 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/united_arab_emirates/uae-localization-taxes.png differ diff --git a/content/applications/finance/fiscal_localizations/united_kingdom.rst b/content-rst/applications/finance/fiscal_localizations/united_kingdom.rst similarity index 100% rename from content/applications/finance/fiscal_localizations/united_kingdom.rst rename to content-rst/applications/finance/fiscal_localizations/united_kingdom.rst diff --git a/content-rst/applications/finance/fiscal_localizations/united_kingdom/bacs-files.png b/content-rst/applications/finance/fiscal_localizations/united_kingdom/bacs-files.png new file mode 100644 index 000000000..597a498ee Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/united_kingdom/bacs-files.png differ diff --git a/content/applications/finance/fiscal_localizations/united_states.rst b/content-rst/applications/finance/fiscal_localizations/united_states.rst similarity index 100% rename from content/applications/finance/fiscal_localizations/united_states.rst rename to content-rst/applications/finance/fiscal_localizations/united_states.rst diff --git a/content-rst/applications/finance/fiscal_localizations/united_states/us-l10n-batch-file.png b/content-rst/applications/finance/fiscal_localizations/united_states/us-l10n-batch-file.png new file mode 100644 index 000000000..86b1b890f Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/united_states/us-l10n-batch-file.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/united_states/us-l10n-cash-flow-statement-tags.png b/content-rst/applications/finance/fiscal_localizations/united_states/us-l10n-cash-flow-statement-tags.png new file mode 100644 index 000000000..4420ca9b2 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/united_states/us-l10n-cash-flow-statement-tags.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/united_states/us-l10n-coa-account-types.png b/content-rst/applications/finance/fiscal_localizations/united_states/us-l10n-coa-account-types.png new file mode 100644 index 000000000..0c4032f81 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/united_states/us-l10n-coa-account-types.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/united_states/us-l10n-create-batch-payments.png b/content-rst/applications/finance/fiscal_localizations/united_states/us-l10n-create-batch-payments.png new file mode 100644 index 000000000..b870eefa9 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/united_states/us-l10n-create-batch-payments.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/united_states/us-l10n-generic-chart-template.png b/content-rst/applications/finance/fiscal_localizations/united_states/us-l10n-generic-chart-template.png new file mode 100644 index 000000000..683971796 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/united_states/us-l10n-generic-chart-template.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/united_states/us-l10n-nacha-dropdown.png b/content-rst/applications/finance/fiscal_localizations/united_states/us-l10n-nacha-dropdown.png new file mode 100644 index 000000000..38ae129e1 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/united_states/us-l10n-nacha-dropdown.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/united_states/us-l10n-nacha-settings.png b/content-rst/applications/finance/fiscal_localizations/united_states/us-l10n-nacha-settings.png new file mode 100644 index 000000000..b67ed48f7 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/united_states/us-l10n-nacha-settings.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/united_states/us-l10n-operating-expenses-example.png b/content-rst/applications/finance/fiscal_localizations/united_states/us-l10n-operating-expenses-example.png new file mode 100644 index 000000000..f0e59418d Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/united_states/us-l10n-operating-expenses-example.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/united_states/us-l1on-accounting-method-reporting-menu.png b/content-rst/applications/finance/fiscal_localizations/united_states/us-l1on-accounting-method-reporting-menu.png new file mode 100644 index 000000000..f61638931 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/united_states/us-l1on-accounting-method-reporting-menu.png differ diff --git a/content/applications/finance/fiscal_localizations/uruguay.rst b/content-rst/applications/finance/fiscal_localizations/uruguay.rst similarity index 100% rename from content/applications/finance/fiscal_localizations/uruguay.rst rename to content-rst/applications/finance/fiscal_localizations/uruguay.rst diff --git a/content-rst/applications/finance/fiscal_localizations/uruguay/document-types.png b/content-rst/applications/finance/fiscal_localizations/uruguay/document-types.png new file mode 100644 index 000000000..1c2eedb4d Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/uruguay/document-types.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/uruguay/electronic-invoice-data.png b/content-rst/applications/finance/fiscal_localizations/uruguay/electronic-invoice-data.png new file mode 100644 index 000000000..ab6837826 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/uruguay/electronic-invoice-data.png differ diff --git a/content-rst/applications/finance/fiscal_localizations/uruguay/taxes.png b/content-rst/applications/finance/fiscal_localizations/uruguay/taxes.png new file mode 100644 index 000000000..37211b049 Binary files /dev/null and b/content-rst/applications/finance/fiscal_localizations/uruguay/taxes.png differ diff --git a/content/applications/finance/fiscal_localizations/vietnam.rst b/content-rst/applications/finance/fiscal_localizations/vietnam.rst similarity index 100% rename from content/applications/finance/fiscal_localizations/vietnam.rst rename to content-rst/applications/finance/fiscal_localizations/vietnam.rst diff --git a/content/applications/finance/payment_providers.rst b/content-rst/applications/finance/payment_providers.rst similarity index 100% rename from content/applications/finance/payment_providers.rst rename to content-rst/applications/finance/payment_providers.rst diff --git a/content/applications/finance/payment_providers/adyen.rst b/content-rst/applications/finance/payment_providers/adyen.rst similarity index 100% rename from content/applications/finance/payment_providers/adyen.rst rename to content-rst/applications/finance/payment_providers/adyen.rst diff --git a/content-rst/applications/finance/payment_providers/adyen/adyen-add-webhook.png b/content-rst/applications/finance/payment_providers/adyen/adyen-add-webhook.png new file mode 100644 index 000000000..627bc83f2 Binary files /dev/null and b/content-rst/applications/finance/payment_providers/adyen/adyen-add-webhook.png differ diff --git a/content-rst/applications/finance/payment_providers/adyen/adyen-allowed-origins.png b/content-rst/applications/finance/payment_providers/adyen/adyen-allowed-origins.png new file mode 100644 index 000000000..d75f90d22 Binary files /dev/null and b/content-rst/applications/finance/payment_providers/adyen/adyen-allowed-origins.png differ diff --git a/content-rst/applications/finance/payment_providers/adyen/adyen-api-urls.png b/content-rst/applications/finance/payment_providers/adyen/adyen-api-urls.png new file mode 100644 index 000000000..39ccd37f8 Binary files /dev/null and b/content-rst/applications/finance/payment_providers/adyen/adyen-api-urls.png differ diff --git a/content-rst/applications/finance/payment_providers/adyen/adyen-hmac-key.png b/content-rst/applications/finance/payment_providers/adyen/adyen-hmac-key.png new file mode 100644 index 000000000..a7581ea31 Binary files /dev/null and b/content-rst/applications/finance/payment_providers/adyen/adyen-hmac-key.png differ diff --git a/content-rst/applications/finance/payment_providers/adyen/adyen-webhook-url.png b/content-rst/applications/finance/payment_providers/adyen/adyen-webhook-url.png new file mode 100644 index 000000000..98783df69 Binary files /dev/null and b/content-rst/applications/finance/payment_providers/adyen/adyen-webhook-url.png differ diff --git a/content-rst/applications/finance/payment_providers/adyen/adyen_capture_delay.png b/content-rst/applications/finance/payment_providers/adyen/adyen_capture_delay.png new file mode 100644 index 000000000..f1d11df28 Binary files /dev/null and b/content-rst/applications/finance/payment_providers/adyen/adyen_capture_delay.png differ diff --git a/content/applications/finance/payment_providers/amazon_payment_services.rst b/content-rst/applications/finance/payment_providers/amazon_payment_services.rst similarity index 100% rename from content/applications/finance/payment_providers/amazon_payment_services.rst rename to content-rst/applications/finance/payment_providers/amazon_payment_services.rst diff --git a/content/applications/finance/payment_providers/asiapay.rst b/content-rst/applications/finance/payment_providers/asiapay.rst similarity index 100% rename from content/applications/finance/payment_providers/asiapay.rst rename to content-rst/applications/finance/payment_providers/asiapay.rst diff --git a/content/applications/finance/payment_providers/authorize.rst b/content-rst/applications/finance/payment_providers/authorize.rst similarity index 100% rename from content/applications/finance/payment_providers/authorize.rst rename to content-rst/applications/finance/payment_providers/authorize.rst diff --git a/content-rst/applications/finance/payment_providers/authorize/authorize-chargeback-desc.png b/content-rst/applications/finance/payment_providers/authorize/authorize-chargeback-desc.png new file mode 100644 index 000000000..9b76b3147 Binary files /dev/null and b/content-rst/applications/finance/payment_providers/authorize/authorize-chargeback-desc.png differ diff --git a/content-rst/applications/finance/payment_providers/authorize/authorize-net-magic-sheet.xlsx b/content-rst/applications/finance/payment_providers/authorize/authorize-net-magic-sheet.xlsx new file mode 100644 index 000000000..584956ba0 Binary files /dev/null and b/content-rst/applications/finance/payment_providers/authorize/authorize-net-magic-sheet.xlsx differ diff --git a/content-rst/applications/finance/payment_providers/authorize/authorize-report1.png b/content-rst/applications/finance/payment_providers/authorize/authorize-report1.png new file mode 100644 index 000000000..a06e1f84c Binary files /dev/null and b/content-rst/applications/finance/payment_providers/authorize/authorize-report1.png differ diff --git a/content-rst/applications/finance/payment_providers/authorize/authorize-settlement-batch.png b/content-rst/applications/finance/payment_providers/authorize/authorize-settlement-batch.png new file mode 100644 index 000000000..42051fb9b Binary files /dev/null and b/content-rst/applications/finance/payment_providers/authorize/authorize-settlement-batch.png differ diff --git a/content-rst/applications/finance/payment_providers/bank_journal.png b/content-rst/applications/finance/payment_providers/bank_journal.png new file mode 100644 index 000000000..f13f84822 Binary files /dev/null and b/content-rst/applications/finance/payment_providers/bank_journal.png differ diff --git a/content/applications/finance/payment_providers/buckaroo.rst b/content-rst/applications/finance/payment_providers/buckaroo.rst similarity index 100% rename from content/applications/finance/payment_providers/buckaroo.rst rename to content-rst/applications/finance/payment_providers/buckaroo.rst diff --git a/content/applications/finance/payment_providers/demo.rst b/content-rst/applications/finance/payment_providers/demo.rst similarity index 100% rename from content/applications/finance/payment_providers/demo.rst rename to content-rst/applications/finance/payment_providers/demo.rst diff --git a/content-rst/applications/finance/payment_providers/demo/demo-payment-outcome.png b/content-rst/applications/finance/payment_providers/demo/demo-payment-outcome.png new file mode 100644 index 000000000..2c87383c8 Binary files /dev/null and b/content-rst/applications/finance/payment_providers/demo/demo-payment-outcome.png differ diff --git a/content-rst/applications/finance/payment_providers/demo/demo-view-form.png b/content-rst/applications/finance/payment_providers/demo/demo-view-form.png new file mode 100644 index 000000000..b032c3257 Binary files /dev/null and b/content-rst/applications/finance/payment_providers/demo/demo-view-form.png differ diff --git a/content/applications/finance/payment_providers/flutterwave.rst b/content-rst/applications/finance/payment_providers/flutterwave.rst similarity index 100% rename from content/applications/finance/payment_providers/flutterwave.rst rename to content-rst/applications/finance/payment_providers/flutterwave.rst diff --git a/content-rst/applications/finance/payment_providers/flutterwave/flutterwave-settings.png b/content-rst/applications/finance/payment_providers/flutterwave/flutterwave-settings.png new file mode 100644 index 000000000..3472c8a0d Binary files /dev/null and b/content-rst/applications/finance/payment_providers/flutterwave/flutterwave-settings.png differ diff --git a/content/applications/finance/payment_providers/mercado_pago.rst b/content-rst/applications/finance/payment_providers/mercado_pago.rst similarity index 100% rename from content/applications/finance/payment_providers/mercado_pago.rst rename to content-rst/applications/finance/payment_providers/mercado_pago.rst diff --git a/content-rst/applications/finance/payment_providers/mercado_pago/mp-credentials.png b/content-rst/applications/finance/payment_providers/mercado_pago/mp-credentials.png new file mode 100644 index 000000000..d62939b14 Binary files /dev/null and b/content-rst/applications/finance/payment_providers/mercado_pago/mp-credentials.png differ diff --git a/content/applications/finance/payment_providers/mollie.rst b/content-rst/applications/finance/payment_providers/mollie.rst similarity index 100% rename from content/applications/finance/payment_providers/mollie.rst rename to content-rst/applications/finance/payment_providers/mollie.rst diff --git a/content-rst/applications/finance/payment_providers/online-payment.png b/content-rst/applications/finance/payment_providers/online-payment.png new file mode 100644 index 000000000..d2c4ea075 Binary files /dev/null and b/content-rst/applications/finance/payment_providers/online-payment.png differ diff --git a/content/applications/finance/payment_providers/paypal.rst b/content-rst/applications/finance/payment_providers/paypal.rst similarity index 100% rename from content/applications/finance/payment_providers/paypal.rst rename to content-rst/applications/finance/payment_providers/paypal.rst diff --git a/content/applications/finance/payment_providers/razorpay.rst b/content-rst/applications/finance/payment_providers/razorpay.rst similarity index 100% rename from content/applications/finance/payment_providers/razorpay.rst rename to content-rst/applications/finance/payment_providers/razorpay.rst diff --git a/content/applications/finance/payment_providers/stripe.rst b/content-rst/applications/finance/payment_providers/stripe.rst similarity index 100% rename from content/applications/finance/payment_providers/stripe.rst rename to content-rst/applications/finance/payment_providers/stripe.rst diff --git a/content/applications/finance/payment_providers/wire_transfer.rst b/content-rst/applications/finance/payment_providers/wire_transfer.rst similarity index 100% rename from content/applications/finance/payment_providers/wire_transfer.rst rename to content-rst/applications/finance/payment_providers/wire_transfer.rst diff --git a/content-rst/applications/finance/payment_providers/wire_transfer/payment_instructions.png b/content-rst/applications/finance/payment_providers/wire_transfer/payment_instructions.png new file mode 100644 index 000000000..feb3d5808 Binary files /dev/null and b/content-rst/applications/finance/payment_providers/wire_transfer/payment_instructions.png differ diff --git a/content-rst/applications/finance/payment_providers/wire_transfer/payment_instructions_checkout.png b/content-rst/applications/finance/payment_providers/wire_transfer/payment_instructions_checkout.png new file mode 100644 index 000000000..257066b00 Binary files /dev/null and b/content-rst/applications/finance/payment_providers/wire_transfer/payment_instructions_checkout.png differ diff --git a/content-rst/applications/finance/payment_providers/wire_transfer/payment_instructions_portal.png b/content-rst/applications/finance/payment_providers/wire_transfer/payment_instructions_portal.png new file mode 100644 index 000000000..0884cc284 Binary files /dev/null and b/content-rst/applications/finance/payment_providers/wire_transfer/payment_instructions_portal.png differ diff --git a/content/applications/finance/payment_providers/worldline.rst b/content-rst/applications/finance/payment_providers/worldline.rst similarity index 100% rename from content/applications/finance/payment_providers/worldline.rst rename to content-rst/applications/finance/payment_providers/worldline.rst diff --git a/content/applications/finance/payment_providers/xendit.rst b/content-rst/applications/finance/payment_providers/xendit.rst similarity index 100% rename from content/applications/finance/payment_providers/xendit.rst rename to content-rst/applications/finance/payment_providers/xendit.rst diff --git a/content/applications/general.rst b/content-rst/applications/general.rst similarity index 100% rename from content/applications/general.rst rename to content-rst/applications/general.rst diff --git a/content/applications/general/apps_modules.rst b/content-rst/applications/general/apps_modules.rst similarity index 100% rename from content/applications/general/apps_modules.rst rename to content-rst/applications/general/apps_modules.rst diff --git a/content-rst/applications/general/apps_modules/apps-search-filter.png b/content-rst/applications/general/apps_modules/apps-search-filter.png new file mode 100644 index 000000000..5116a1a69 Binary files /dev/null and b/content-rst/applications/general/apps_modules/apps-search-filter.png differ diff --git a/content-rst/applications/general/apps_modules/uninstall.png b/content-rst/applications/general/apps_modules/uninstall.png new file mode 100644 index 000000000..f9fd54db4 Binary files /dev/null and b/content-rst/applications/general/apps_modules/uninstall.png differ diff --git a/content-rst/applications/general/apps_modules/uninstall_deps.png b/content-rst/applications/general/apps_modules/uninstall_deps.png new file mode 100644 index 000000000..2d84fe469 Binary files /dev/null and b/content-rst/applications/general/apps_modules/uninstall_deps.png differ diff --git a/content/applications/general/companies.rst b/content-rst/applications/general/companies.rst similarity index 100% rename from content/applications/general/companies.rst rename to content-rst/applications/general/companies.rst diff --git a/content-rst/applications/general/companies/access-rights-multi-companies.png b/content-rst/applications/general/companies/access-rights-multi-companies.png new file mode 100644 index 000000000..b42d9062c Binary files /dev/null and b/content-rst/applications/general/companies/access-rights-multi-companies.png differ diff --git a/content-rst/applications/general/companies/add-branch.png b/content-rst/applications/general/companies/add-branch.png new file mode 100644 index 000000000..550df91ef Binary files /dev/null and b/content-rst/applications/general/companies/add-branch.png differ diff --git a/content-rst/applications/general/companies/company-info.png b/content-rst/applications/general/companies/company-info.png new file mode 100644 index 000000000..c6e43bf70 Binary files /dev/null and b/content-rst/applications/general/companies/company-info.png differ diff --git a/content/applications/general/companies/digest_emails.rst b/content-rst/applications/general/companies/digest_emails.rst similarity index 100% rename from content/applications/general/companies/digest_emails.rst rename to content-rst/applications/general/companies/digest_emails.rst diff --git a/content-rst/applications/general/companies/digest_emails/digest-email-settings.png b/content-rst/applications/general/companies/digest_emails/digest-email-settings.png new file mode 100644 index 000000000..8313dba36 Binary files /dev/null and b/content-rst/applications/general/companies/digest_emails/digest-email-settings.png differ diff --git a/content-rst/applications/general/companies/digest_emails/oob-kpis.png b/content-rst/applications/general/companies/digest_emails/oob-kpis.png new file mode 100644 index 000000000..c039a0609 Binary files /dev/null and b/content-rst/applications/general/companies/digest_emails/oob-kpis.png differ diff --git a/content-rst/applications/general/companies/digest_emails/periodic-digest.png b/content-rst/applications/general/companies/digest_emails/periodic-digest.png new file mode 100644 index 000000000..9785b3ef0 Binary files /dev/null and b/content-rst/applications/general/companies/digest_emails/periodic-digest.png differ diff --git a/content-rst/applications/general/companies/document-layout.png b/content-rst/applications/general/companies/document-layout.png new file mode 100644 index 000000000..61a5bd216 Binary files /dev/null and b/content-rst/applications/general/companies/document-layout.png differ diff --git a/content/applications/general/companies/email_template.rst b/content-rst/applications/general/companies/email_template.rst similarity index 100% rename from content/applications/general/companies/email_template.rst rename to content-rst/applications/general/companies/email_template.rst diff --git a/content-rst/applications/general/companies/email_template/composer-mass-mailing.png b/content-rst/applications/general/companies/email_template/composer-mass-mailing.png new file mode 100644 index 000000000..8e1f41c93 Binary files /dev/null and b/content-rst/applications/general/companies/email_template/composer-mass-mailing.png differ diff --git a/content-rst/applications/general/companies/email_template/dynamic-placeholders.png b/content-rst/applications/general/companies/email_template/dynamic-placeholders.png new file mode 100644 index 000000000..29e20c3be Binary files /dev/null and b/content-rst/applications/general/companies/email_template/dynamic-placeholders.png differ diff --git a/content-rst/applications/general/companies/email_template/edit-language-template.png b/content-rst/applications/general/companies/email_template/edit-language-template.png new file mode 100644 index 000000000..ef37b66af Binary files /dev/null and b/content-rst/applications/general/companies/email_template/edit-language-template.png differ diff --git a/content-rst/applications/general/companies/email_template/html-code-editor.png b/content-rst/applications/general/companies/email_template/html-code-editor.png new file mode 100644 index 000000000..51594a186 Binary files /dev/null and b/content-rst/applications/general/companies/email_template/html-code-editor.png differ diff --git a/content-rst/applications/general/companies/email_template/powerbox-feature.png b/content-rst/applications/general/companies/email_template/powerbox-feature.png new file mode 100644 index 000000000..580e04667 Binary files /dev/null and b/content-rst/applications/general/companies/email_template/powerbox-feature.png differ diff --git a/content-rst/applications/general/companies/email_template/reply-to-template-sales.png b/content-rst/applications/general/companies/email_template/reply-to-template-sales.png new file mode 100644 index 000000000..d931e53f4 Binary files /dev/null and b/content-rst/applications/general/companies/email_template/reply-to-template-sales.png differ diff --git a/content-rst/applications/general/companies/email_template/reset.png b/content-rst/applications/general/companies/email_template/reset.png new file mode 100644 index 000000000..63d727d57 Binary files /dev/null and b/content-rst/applications/general/companies/email_template/reset.png differ diff --git a/content-rst/applications/general/companies/email_template/rich-text-editor.png b/content-rst/applications/general/companies/email_template/rich-text-editor.png new file mode 100644 index 000000000..d5db28c8c Binary files /dev/null and b/content-rst/applications/general/companies/email_template/rich-text-editor.png differ diff --git a/content-rst/applications/general/companies/email_template/translation-body.png b/content-rst/applications/general/companies/email_template/translation-body.png new file mode 100644 index 000000000..7feb3e6fd Binary files /dev/null and b/content-rst/applications/general/companies/email_template/translation-body.png differ diff --git a/content-rst/applications/general/companies/inter-company-transactions.png b/content-rst/applications/general/companies/inter-company-transactions.png new file mode 100644 index 000000000..d81790fcc Binary files /dev/null and b/content-rst/applications/general/companies/inter-company-transactions.png differ diff --git a/content-rst/applications/general/companies/multi-companies-menu-dashboard.png b/content-rst/applications/general/companies/multi-companies-menu-dashboard.png new file mode 100644 index 000000000..40c663812 Binary files /dev/null and b/content-rst/applications/general/companies/multi-companies-menu-dashboard.png differ diff --git a/content-rst/applications/general/companies/product-form-company.png b/content-rst/applications/general/companies/product-form-company.png new file mode 100644 index 000000000..675cb4915 Binary files /dev/null and b/content-rst/applications/general/companies/product-form-company.png differ diff --git a/content/applications/general/developer_mode.rst b/content-rst/applications/general/developer_mode.rst similarity index 100% rename from content/applications/general/developer_mode.rst rename to content-rst/applications/general/developer_mode.rst diff --git a/content-rst/applications/general/developer_mode/settings.png b/content-rst/applications/general/developer_mode/settings.png new file mode 100644 index 000000000..5d43936c7 Binary files /dev/null and b/content-rst/applications/general/developer_mode/settings.png differ diff --git a/content-rst/applications/general/developer_mode/technical.png b/content-rst/applications/general/developer_mode/technical.png new file mode 100644 index 000000000..fa65c682e Binary files /dev/null and b/content-rst/applications/general/developer_mode/technical.png differ diff --git a/content-rst/applications/general/developer_mode/tools.png b/content-rst/applications/general/developer_mode/tools.png new file mode 100644 index 000000000..b97fd8f83 Binary files /dev/null and b/content-rst/applications/general/developer_mode/tools.png differ diff --git a/content/applications/general/email_communication.rst b/content-rst/applications/general/email_communication.rst similarity index 100% rename from content/applications/general/email_communication.rst rename to content-rst/applications/general/email_communication.rst diff --git a/content/applications/general/email_communication/azure_oauth.rst b/content-rst/applications/general/email_communication/azure_oauth.rst similarity index 100% rename from content/applications/general/email_communication/azure_oauth.rst rename to content-rst/applications/general/email_communication/azure_oauth.rst diff --git a/content-rst/applications/general/email_communication/azure_oauth/application-id.png b/content-rst/applications/general/email_communication/azure_oauth/application-id.png new file mode 100644 index 000000000..9547afeda Binary files /dev/null and b/content-rst/applications/general/email_communication/azure_oauth/application-id.png differ diff --git a/content-rst/applications/general/email_communication/azure_oauth/from-name-remain.png b/content-rst/applications/general/email_communication/azure_oauth/from-name-remain.png new file mode 100644 index 000000000..3aa3052e4 Binary files /dev/null and b/content-rst/applications/general/email_communication/azure_oauth/from-name-remain.png differ diff --git a/content-rst/applications/general/email_communication/azure_oauth/managed-application.png b/content-rst/applications/general/email_communication/azure_oauth/managed-application.png new file mode 100644 index 000000000..d3fcfb53e Binary files /dev/null and b/content-rst/applications/general/email_communication/azure_oauth/managed-application.png differ diff --git a/content-rst/applications/general/email_communication/azure_oauth/outlook-token.png b/content-rst/applications/general/email_communication/azure_oauth/outlook-token.png new file mode 100644 index 000000000..88fb303a6 Binary files /dev/null and b/content-rst/applications/general/email_communication/azure_oauth/outlook-token.png differ diff --git a/content-rst/applications/general/email_communication/azure_oauth/outlookcreds.png b/content-rst/applications/general/email_communication/azure_oauth/outlookcreds.png new file mode 100644 index 000000000..eca8b122d Binary files /dev/null and b/content-rst/applications/general/email_communication/azure_oauth/outlookcreds.png differ diff --git a/content-rst/applications/general/email_communication/azure_oauth/permissions.png b/content-rst/applications/general/email_communication/azure_oauth/permissions.png new file mode 100644 index 000000000..a582a200c Binary files /dev/null and b/content-rst/applications/general/email_communication/azure_oauth/permissions.png differ diff --git a/content-rst/applications/general/email_communication/azure_oauth/secretvalue.png b/content-rst/applications/general/email_communication/azure_oauth/secretvalue.png new file mode 100644 index 000000000..b37bce3f9 Binary files /dev/null and b/content-rst/applications/general/email_communication/azure_oauth/secretvalue.png differ diff --git a/content-rst/applications/general/email_communication/azure_oauth/verify-outlook.png b/content-rst/applications/general/email_communication/azure_oauth/verify-outlook.png new file mode 100644 index 000000000..6e8fb4669 Binary files /dev/null and b/content-rst/applications/general/email_communication/azure_oauth/verify-outlook.png differ diff --git a/content/applications/general/email_communication/email_domain.rst b/content-rst/applications/general/email_communication/email_domain.rst similarity index 100% rename from content/applications/general/email_communication/email_domain.rst rename to content-rst/applications/general/email_communication/email_domain.rst diff --git a/content/applications/general/email_communication/email_servers_inbound.rst b/content-rst/applications/general/email_communication/email_servers_inbound.rst similarity index 100% rename from content/applications/general/email_communication/email_servers_inbound.rst rename to content-rst/applications/general/email_communication/email_servers_inbound.rst diff --git a/content-rst/applications/general/email_communication/email_servers_inbound/alias-domain-settings.png b/content-rst/applications/general/email_communication/email_servers_inbound/alias-domain-settings.png new file mode 100644 index 000000000..794e0768a Binary files /dev/null and b/content-rst/applications/general/email_communication/email_servers_inbound/alias-domain-settings.png differ diff --git a/content-rst/applications/general/email_communication/email_servers_inbound/allowed-domain.png b/content-rst/applications/general/email_communication/email_servers_inbound/allowed-domain.png new file mode 100644 index 000000000..22e7c5ed6 Binary files /dev/null and b/content-rst/applications/general/email_communication/email_servers_inbound/allowed-domain.png differ diff --git a/content-rst/applications/general/email_communication/email_servers_inbound/bounce-mail-loop.png b/content-rst/applications/general/email_communication/email_servers_inbound/bounce-mail-loop.png new file mode 100644 index 000000000..5dfe7d8a9 Binary files /dev/null and b/content-rst/applications/general/email_communication/email_servers_inbound/bounce-mail-loop.png differ diff --git a/content-rst/applications/general/email_communication/email_servers_inbound/custom-subdomain-sh.png b/content-rst/applications/general/email_communication/email_servers_inbound/custom-subdomain-sh.png new file mode 100644 index 000000000..f0a7ba764 Binary files /dev/null and b/content-rst/applications/general/email_communication/email_servers_inbound/custom-subdomain-sh.png differ diff --git a/content-rst/applications/general/email_communication/email_servers_inbound/diagram-mail-custom-domain.png b/content-rst/applications/general/email_communication/email_servers_inbound/diagram-mail-custom-domain.png new file mode 100644 index 000000000..7b38cd704 Binary files /dev/null and b/content-rst/applications/general/email_communication/email_servers_inbound/diagram-mail-custom-domain.png differ diff --git a/content-rst/applications/general/email_communication/email_servers_inbound/direct-mail-to-catchall.png b/content-rst/applications/general/email_communication/email_servers_inbound/direct-mail-to-catchall.png new file mode 100644 index 000000000..c15c4b72c Binary files /dev/null and b/content-rst/applications/general/email_communication/email_servers_inbound/direct-mail-to-catchall.png differ diff --git a/content-rst/applications/general/email_communication/email_servers_inbound/incoming-mail-server.png b/content-rst/applications/general/email_communication/email_servers_inbound/incoming-mail-server.png new file mode 100644 index 000000000..47c5852a1 Binary files /dev/null and b/content-rst/applications/general/email_communication/email_servers_inbound/incoming-mail-server.png differ diff --git a/content-rst/applications/general/email_communication/email_servers_inbound/mail-error-notif-navbar.png b/content-rst/applications/general/email_communication/email_servers_inbound/mail-error-notif-navbar.png new file mode 100644 index 000000000..dceaceff8 Binary files /dev/null and b/content-rst/applications/general/email_communication/email_servers_inbound/mail-error-notif-navbar.png differ diff --git a/content-rst/applications/general/email_communication/email_servers_inbound/red-envelope-info.png b/content-rst/applications/general/email_communication/email_servers_inbound/red-envelope-info.png new file mode 100644 index 000000000..c8351d42f Binary files /dev/null and b/content-rst/applications/general/email_communication/email_servers_inbound/red-envelope-info.png differ diff --git a/content-rst/applications/general/email_communication/email_servers_inbound/sales-team-alias-config.png b/content-rst/applications/general/email_communication/email_servers_inbound/sales-team-alias-config.png new file mode 100644 index 000000000..d4712745a Binary files /dev/null and b/content-rst/applications/general/email_communication/email_servers_inbound/sales-team-alias-config.png differ diff --git a/content/applications/general/email_communication/email_servers_outbound.rst b/content-rst/applications/general/email_communication/email_servers_outbound.rst similarity index 100% rename from content/applications/general/email_communication/email_servers_outbound.rst rename to content-rst/applications/general/email_communication/email_servers_outbound.rst diff --git a/content-rst/applications/general/email_communication/email_servers_outbound/command-line-interface-option-mail-server.png b/content-rst/applications/general/email_communication/email_servers_outbound/command-line-interface-option-mail-server.png new file mode 100644 index 000000000..d8eb91c3e Binary files /dev/null and b/content-rst/applications/general/email_communication/email_servers_outbound/command-line-interface-option-mail-server.png differ diff --git a/content-rst/applications/general/email_communication/email_servers_outbound/dedicated-mass-mail-server.png b/content-rst/applications/general/email_communication/email_servers_outbound/dedicated-mass-mail-server.png new file mode 100644 index 000000000..a5236e313 Binary files /dev/null and b/content-rst/applications/general/email_communication/email_servers_outbound/dedicated-mass-mail-server.png differ diff --git a/content-rst/applications/general/email_communication/email_servers_outbound/diagram-inbound-mailing-method.png b/content-rst/applications/general/email_communication/email_servers_outbound/diagram-inbound-mailing-method.png new file mode 100644 index 000000000..b9081ec62 Binary files /dev/null and b/content-rst/applications/general/email_communication/email_servers_outbound/diagram-inbound-mailing-method.png differ diff --git a/content-rst/applications/general/email_communication/email_servers_outbound/diagram-owned-domain-odoo-server.png b/content-rst/applications/general/email_communication/email_servers_outbound/diagram-owned-domain-odoo-server.png new file mode 100644 index 000000000..c5827dea4 Binary files /dev/null and b/content-rst/applications/general/email_communication/email_servers_outbound/diagram-owned-domain-odoo-server.png differ diff --git a/content-rst/applications/general/email_communication/email_servers_outbound/split-mail-servers.png b/content-rst/applications/general/email_communication/email_servers_outbound/split-mail-servers.png new file mode 100644 index 000000000..1947cd364 Binary files /dev/null and b/content-rst/applications/general/email_communication/email_servers_outbound/split-mail-servers.png differ diff --git a/content-rst/applications/general/email_communication/email_servers_outbound/split-transaction-massmail-mail-servers.png b/content-rst/applications/general/email_communication/email_servers_outbound/split-transaction-massmail-mail-servers.png new file mode 100644 index 000000000..4eac85650 Binary files /dev/null and b/content-rst/applications/general/email_communication/email_servers_outbound/split-transaction-massmail-mail-servers.png differ diff --git a/content/applications/general/email_communication/faq.rst b/content-rst/applications/general/email_communication/faq.rst similarity index 100% rename from content/applications/general/email_communication/faq.rst rename to content-rst/applications/general/email_communication/faq.rst diff --git a/content-rst/applications/general/email_communication/faq/email-limit.png b/content-rst/applications/general/email_communication/faq/email-limit.png new file mode 100644 index 000000000..cfd143466 Binary files /dev/null and b/content-rst/applications/general/email_communication/faq/email-limit.png differ diff --git a/content-rst/applications/general/email_communication/faq/email-marketing-asap-notice.png b/content-rst/applications/general/email_communication/faq/email-marketing-asap-notice.png new file mode 100644 index 000000000..19bdbca81 Binary files /dev/null and b/content-rst/applications/general/email_communication/faq/email-marketing-asap-notice.png differ diff --git a/content-rst/applications/general/email_communication/faq/email-marketing-order-queue-example.png b/content-rst/applications/general/email_communication/faq/email-marketing-order-queue-example.png new file mode 100644 index 000000000..674fd00f7 Binary files /dev/null and b/content-rst/applications/general/email_communication/faq/email-marketing-order-queue-example.png differ diff --git a/content-rst/applications/general/email_communication/faq/red-envelope.png b/content-rst/applications/general/email_communication/faq/red-envelope.png new file mode 100644 index 000000000..fc6697bfb Binary files /dev/null and b/content-rst/applications/general/email_communication/faq/red-envelope.png differ diff --git a/content-rst/applications/general/email_communication/faq/sending-failures.png b/content-rst/applications/general/email_communication/faq/sending-failures.png new file mode 100644 index 000000000..18a027799 Binary files /dev/null and b/content-rst/applications/general/email_communication/faq/sending-failures.png differ diff --git a/content-rst/applications/general/email_communication/faq/technical-menu-email-delivery-failed.png b/content-rst/applications/general/email_communication/faq/technical-menu-email-delivery-failed.png new file mode 100644 index 000000000..3817aa711 Binary files /dev/null and b/content-rst/applications/general/email_communication/faq/technical-menu-email-delivery-failed.png differ diff --git a/content/applications/general/email_communication/google_oauth.rst b/content-rst/applications/general/email_communication/google_oauth.rst similarity index 100% rename from content/applications/general/email_communication/google_oauth.rst rename to content-rst/applications/general/email_communication/google_oauth.rst diff --git a/content-rst/applications/general/email_communication/google_oauth/403-error.png b/content-rst/applications/general/email_communication/google_oauth/403-error.png new file mode 100644 index 000000000..dd2c972f7 Binary files /dev/null and b/content-rst/applications/general/email_communication/google_oauth/403-error.png differ diff --git a/content-rst/applications/general/email_communication/google_oauth/client-credentials.png b/content-rst/applications/general/email_communication/google_oauth/client-credentials.png new file mode 100644 index 000000000..5618ea5fb Binary files /dev/null and b/content-rst/applications/general/email_communication/google_oauth/client-credentials.png differ diff --git a/content-rst/applications/general/email_communication/google_oauth/error-400.png b/content-rst/applications/general/email_communication/google_oauth/error-400.png new file mode 100644 index 000000000..611d4d6ea Binary files /dev/null and b/content-rst/applications/general/email_communication/google_oauth/error-400.png differ diff --git a/content-rst/applications/general/email_communication/google_oauth/forbidden-error.png b/content-rst/applications/general/email_communication/google_oauth/forbidden-error.png new file mode 100644 index 000000000..3e2b175a9 Binary files /dev/null and b/content-rst/applications/general/email_communication/google_oauth/forbidden-error.png differ diff --git a/content-rst/applications/general/email_communication/google_oauth/green-token.png b/content-rst/applications/general/email_communication/google_oauth/green-token.png new file mode 100644 index 000000000..4f9310936 Binary files /dev/null and b/content-rst/applications/general/email_communication/google_oauth/green-token.png differ diff --git a/content-rst/applications/general/email_communication/google_oauth/new-project.png b/content-rst/applications/general/email_communication/google_oauth/new-project.png new file mode 100644 index 000000000..6a574aeb0 Binary files /dev/null and b/content-rst/applications/general/email_communication/google_oauth/new-project.png differ diff --git a/content-rst/applications/general/email_communication/google_oauth/outgoing-servers.png b/content-rst/applications/general/email_communication/google_oauth/outgoing-servers.png new file mode 100644 index 000000000..2da5afea3 Binary files /dev/null and b/content-rst/applications/general/email_communication/google_oauth/outgoing-servers.png differ diff --git a/content-rst/applications/general/email_communication/google_oauth/published-status.png b/content-rst/applications/general/email_communication/google_oauth/published-status.png new file mode 100644 index 000000000..ed0dbb6e8 Binary files /dev/null and b/content-rst/applications/general/email_communication/google_oauth/published-status.png differ diff --git a/content/applications/general/email_communication/mailjet_api.rst b/content-rst/applications/general/email_communication/mailjet_api.rst similarity index 100% rename from content/applications/general/email_communication/mailjet_api.rst rename to content-rst/applications/general/email_communication/mailjet_api.rst diff --git a/content-rst/applications/general/email_communication/mailjet_api/add-domain-email.png b/content-rst/applications/general/email_communication/mailjet_api/add-domain-email.png new file mode 100644 index 000000000..0f73b0a74 Binary files /dev/null and b/content-rst/applications/general/email_communication/mailjet_api/add-domain-email.png differ diff --git a/content-rst/applications/general/email_communication/mailjet_api/api-settings.png b/content-rst/applications/general/email_communication/mailjet_api/api-settings.png new file mode 100644 index 000000000..1ad61e15d Binary files /dev/null and b/content-rst/applications/general/email_communication/mailjet_api/api-settings.png differ diff --git a/content-rst/applications/general/email_communication/mailjet_api/authenticate.png b/content-rst/applications/general/email_communication/mailjet_api/authenticate.png new file mode 100644 index 000000000..1560f0525 Binary files /dev/null and b/content-rst/applications/general/email_communication/mailjet_api/authenticate.png differ diff --git a/content-rst/applications/general/email_communication/mailjet_api/check-dns.png b/content-rst/applications/general/email_communication/mailjet_api/check-dns.png new file mode 100644 index 000000000..399ec7078 Binary files /dev/null and b/content-rst/applications/general/email_communication/mailjet_api/check-dns.png differ diff --git a/content-rst/applications/general/email_communication/mailjet_api/host-value-dns.png b/content-rst/applications/general/email_communication/mailjet_api/host-value-dns.png new file mode 100644 index 000000000..2f1792c3b Binary files /dev/null and b/content-rst/applications/general/email_communication/mailjet_api/host-value-dns.png differ diff --git a/content-rst/applications/general/email_communication/mailjet_api/server-settings.png b/content-rst/applications/general/email_communication/mailjet_api/server-settings.png new file mode 100644 index 000000000..4ea068da2 Binary files /dev/null and b/content-rst/applications/general/email_communication/mailjet_api/server-settings.png differ diff --git a/content-rst/applications/general/email_communication/mailjet_api/smtp-config.png b/content-rst/applications/general/email_communication/mailjet_api/smtp-config.png new file mode 100644 index 000000000..74f50099e Binary files /dev/null and b/content-rst/applications/general/email_communication/mailjet_api/smtp-config.png differ diff --git a/content/applications/general/integrations.rst b/content-rst/applications/general/integrations.rst similarity index 100% rename from content/applications/general/integrations.rst rename to content-rst/applications/general/integrations.rst diff --git a/content/applications/general/integrations/barcodelookup.rst b/content-rst/applications/general/integrations/barcodelookup.rst similarity index 100% rename from content/applications/general/integrations/barcodelookup.rst rename to content-rst/applications/general/integrations/barcodelookup.rst diff --git a/content/applications/general/integrations/geolocation.rst b/content-rst/applications/general/integrations/geolocation.rst similarity index 100% rename from content/applications/general/integrations/geolocation.rst rename to content-rst/applications/general/integrations/geolocation.rst diff --git a/content-rst/applications/general/integrations/geolocation/contacts.png b/content-rst/applications/general/integrations/geolocation/contacts.png new file mode 100644 index 000000000..419f84170 Binary files /dev/null and b/content-rst/applications/general/integrations/geolocation/contacts.png differ diff --git a/content-rst/applications/general/integrations/geolocation/google-places-api-key.png b/content-rst/applications/general/integrations/geolocation/google-places-api-key.png new file mode 100644 index 000000000..cfedd8579 Binary files /dev/null and b/content-rst/applications/general/integrations/geolocation/google-places-api-key.png differ diff --git a/content/applications/general/integrations/google_translate.rst b/content-rst/applications/general/integrations/google_translate.rst similarity index 100% rename from content/applications/general/integrations/google_translate.rst rename to content-rst/applications/general/integrations/google_translate.rst diff --git a/content-rst/applications/general/integrations/google_translate/api-key.png b/content-rst/applications/general/integrations/google_translate/api-key.png new file mode 100644 index 000000000..3f4414007 Binary files /dev/null and b/content-rst/applications/general/integrations/google_translate/api-key.png differ diff --git a/content-rst/applications/general/integrations/google_translate/google-translate.png b/content-rst/applications/general/integrations/google_translate/google-translate.png new file mode 100644 index 000000000..d1e9f7fea Binary files /dev/null and b/content-rst/applications/general/integrations/google_translate/google-translate.png differ diff --git a/content-rst/applications/general/integrations/google_translate/new-project.png b/content-rst/applications/general/integrations/google_translate/new-project.png new file mode 100644 index 000000000..86a993363 Binary files /dev/null and b/content-rst/applications/general/integrations/google_translate/new-project.png differ diff --git a/content-rst/applications/general/integrations/google_translate/odoo-config.png b/content-rst/applications/general/integrations/google_translate/odoo-config.png new file mode 100644 index 000000000..e9142ead5 Binary files /dev/null and b/content-rst/applications/general/integrations/google_translate/odoo-config.png differ diff --git a/content/applications/general/integrations/mail_plugins.rst b/content-rst/applications/general/integrations/mail_plugins.rst similarity index 100% rename from content/applications/general/integrations/mail_plugins.rst rename to content-rst/applications/general/integrations/mail_plugins.rst diff --git a/content/applications/general/integrations/mail_plugins/gmail.rst b/content-rst/applications/general/integrations/mail_plugins/gmail.rst similarity index 100% rename from content/applications/general/integrations/mail_plugins/gmail.rst rename to content-rst/applications/general/integrations/mail_plugins/gmail.rst diff --git a/content-rst/applications/general/integrations/mail_plugins/gmail/authorize-access.png b/content-rst/applications/general/integrations/mail_plugins/gmail/authorize-access.png new file mode 100644 index 000000000..0da9ea619 Binary files /dev/null and b/content-rst/applications/general/integrations/mail_plugins/gmail/authorize-access.png differ diff --git a/content-rst/applications/general/integrations/mail_plugins/gmail/gh-download-zip.png b/content-rst/applications/general/integrations/mail_plugins/gmail/gh-download-zip.png new file mode 100644 index 000000000..f05989389 Binary files /dev/null and b/content-rst/applications/general/integrations/mail_plugins/gmail/gh-download-zip.png differ diff --git a/content-rst/applications/general/integrations/mail_plugins/gmail/gmail-side-panel.png b/content-rst/applications/general/integrations/mail_plugins/gmail/gmail-side-panel.png new file mode 100644 index 000000000..269d7f62e Binary files /dev/null and b/content-rst/applications/general/integrations/mail_plugins/gmail/gmail-side-panel.png differ diff --git a/content-rst/applications/general/integrations/mail_plugins/gmail/google-workspace-marketplace.png b/content-rst/applications/general/integrations/mail_plugins/gmail/google-workspace-marketplace.png new file mode 100644 index 000000000..82f1b42a5 Binary files /dev/null and b/content-rst/applications/general/integrations/mail_plugins/gmail/google-workspace-marketplace.png differ diff --git a/content-rst/applications/general/integrations/mail_plugins/gmail/mail-plugin-setting.png b/content-rst/applications/general/integrations/mail_plugins/gmail/mail-plugin-setting.png new file mode 100644 index 000000000..6d027520f Binary files /dev/null and b/content-rst/applications/general/integrations/mail_plugins/gmail/mail-plugin-setting.png differ diff --git a/content/applications/general/integrations/mail_plugins/outlook.rst b/content-rst/applications/general/integrations/mail_plugins/outlook.rst similarity index 100% rename from content/applications/general/integrations/mail_plugins/outlook.rst rename to content-rst/applications/general/integrations/mail_plugins/outlook.rst diff --git a/content-rst/applications/general/integrations/mail_plugins/outlook/add-in-warning.png b/content-rst/applications/general/integrations/mail_plugins/outlook/add-in-warning.png new file mode 100644 index 000000000..a1000e041 Binary files /dev/null and b/content-rst/applications/general/integrations/mail_plugins/outlook/add-in-warning.png differ diff --git a/content-rst/applications/general/integrations/mail_plugins/outlook/all-outlook-settings.png b/content-rst/applications/general/integrations/mail_plugins/outlook/all-outlook-settings.png new file mode 100644 index 000000000..cc589a9c8 Binary files /dev/null and b/content-rst/applications/general/integrations/mail_plugins/outlook/all-outlook-settings.png differ diff --git a/content-rst/applications/general/integrations/mail_plugins/outlook/custom-add-ins.png b/content-rst/applications/general/integrations/mail_plugins/outlook/custom-add-ins.png new file mode 100644 index 000000000..40aa5adf5 Binary files /dev/null and b/content-rst/applications/general/integrations/mail_plugins/outlook/custom-add-ins.png differ diff --git a/content-rst/applications/general/integrations/mail_plugins/outlook/customize-actions.png b/content-rst/applications/general/integrations/mail_plugins/outlook/customize-actions.png new file mode 100644 index 000000000..c60ae2ba4 Binary files /dev/null and b/content-rst/applications/general/integrations/mail_plugins/outlook/customize-actions.png differ diff --git a/content-rst/applications/general/integrations/mail_plugins/outlook/enter-database-url.png b/content-rst/applications/general/integrations/mail_plugins/outlook/enter-database-url.png new file mode 100644 index 000000000..fff286c65 Binary files /dev/null and b/content-rst/applications/general/integrations/mail_plugins/outlook/enter-database-url.png differ diff --git a/content-rst/applications/general/integrations/mail_plugins/outlook/more-actions.png b/content-rst/applications/general/integrations/mail_plugins/outlook/more-actions.png new file mode 100644 index 000000000..fd03823c3 Binary files /dev/null and b/content-rst/applications/general/integrations/mail_plugins/outlook/more-actions.png differ diff --git a/content-rst/applications/general/integrations/mail_plugins/outlook/my-add-ins.png b/content-rst/applications/general/integrations/mail_plugins/outlook/my-add-ins.png new file mode 100644 index 000000000..de5304d5f Binary files /dev/null and b/content-rst/applications/general/integrations/mail_plugins/outlook/my-add-ins.png differ diff --git a/content-rst/applications/general/integrations/mail_plugins/outlook/new-window-warning.png b/content-rst/applications/general/integrations/mail_plugins/outlook/new-window-warning.png new file mode 100644 index 000000000..438e9978e Binary files /dev/null and b/content-rst/applications/general/integrations/mail_plugins/outlook/new-window-warning.png differ diff --git a/content-rst/applications/general/integrations/mail_plugins/outlook/odoo-for-outlook.png b/content-rst/applications/general/integrations/mail_plugins/outlook/odoo-for-outlook.png new file mode 100644 index 000000000..b0cd29a43 Binary files /dev/null and b/content-rst/applications/general/integrations/mail_plugins/outlook/odoo-for-outlook.png differ diff --git a/content-rst/applications/general/integrations/mail_plugins/outlook/odoo-outlook-shortcut.png b/content-rst/applications/general/integrations/mail_plugins/outlook/odoo-outlook-shortcut.png new file mode 100644 index 000000000..9d705f008 Binary files /dev/null and b/content-rst/applications/general/integrations/mail_plugins/outlook/odoo-outlook-shortcut.png differ diff --git a/content-rst/applications/general/integrations/mail_plugins/outlook/odoo-permission.png b/content-rst/applications/general/integrations/mail_plugins/outlook/odoo-permission.png new file mode 100644 index 000000000..5e222cdff Binary files /dev/null and b/content-rst/applications/general/integrations/mail_plugins/outlook/odoo-permission.png differ diff --git a/content-rst/applications/general/integrations/mail_plugins/outlook/panel-login.png b/content-rst/applications/general/integrations/mail_plugins/outlook/panel-login.png new file mode 100644 index 000000000..6a07e6c5c Binary files /dev/null and b/content-rst/applications/general/integrations/mail_plugins/outlook/panel-login.png differ diff --git a/content/applications/general/integrations/unsplash.rst b/content-rst/applications/general/integrations/unsplash.rst similarity index 100% rename from content/applications/general/integrations/unsplash.rst rename to content-rst/applications/general/integrations/unsplash.rst diff --git a/content/applications/general/iot.rst b/content-rst/applications/general/iot.rst similarity index 100% rename from content/applications/general/iot.rst rename to content-rst/applications/general/iot.rst diff --git a/content/applications/general/iot/connect.rst b/content-rst/applications/general/iot/connect.rst similarity index 100% rename from content/applications/general/iot/connect.rst rename to content-rst/applications/general/iot/connect.rst diff --git a/content/applications/general/iot/devices.rst b/content-rst/applications/general/iot/devices.rst similarity index 100% rename from content/applications/general/iot/devices.rst rename to content-rst/applications/general/iot/devices.rst diff --git a/content/applications/general/iot/devices/camera.rst b/content-rst/applications/general/iot/devices/camera.rst similarity index 100% rename from content/applications/general/iot/devices/camera.rst rename to content-rst/applications/general/iot/devices/camera.rst diff --git a/content-rst/applications/general/iot/devices/camera/camera-dropdown.png b/content-rst/applications/general/iot/devices/camera/camera-dropdown.png new file mode 100644 index 000000000..4a5e60111 Binary files /dev/null and b/content-rst/applications/general/iot/devices/camera/camera-dropdown.png differ diff --git a/content-rst/applications/general/iot/devices/camera/control-point-device.png b/content-rst/applications/general/iot/devices/camera/control-point-device.png new file mode 100644 index 000000000..0d85f44f5 Binary files /dev/null and b/content-rst/applications/general/iot/devices/camera/control-point-device.png differ diff --git a/content-rst/applications/general/iot/devices/camera/serial-number-picture.png b/content-rst/applications/general/iot/devices/camera/serial-number-picture.png new file mode 100644 index 000000000..a101162ff Binary files /dev/null and b/content-rst/applications/general/iot/devices/camera/serial-number-picture.png differ diff --git a/content/applications/general/iot/devices/footswitch.rst b/content-rst/applications/general/iot/devices/footswitch.rst similarity index 100% rename from content/applications/general/iot/devices/footswitch.rst rename to content-rst/applications/general/iot/devices/footswitch.rst diff --git a/content-rst/applications/general/iot/devices/footswitch/footswitch-dropdown.png b/content-rst/applications/general/iot/devices/footswitch/footswitch-dropdown.png new file mode 100644 index 000000000..380954246 Binary files /dev/null and b/content-rst/applications/general/iot/devices/footswitch/footswitch-dropdown.png differ diff --git a/content-rst/applications/general/iot/devices/footswitch/footswitch-example.png b/content-rst/applications/general/iot/devices/footswitch/footswitch-example.png new file mode 100644 index 000000000..45fe58a92 Binary files /dev/null and b/content-rst/applications/general/iot/devices/footswitch/footswitch-example.png differ diff --git a/content/applications/general/iot/devices/measurement_tool.rst b/content-rst/applications/general/iot/devices/measurement_tool.rst similarity index 100% rename from content/applications/general/iot/devices/measurement_tool.rst rename to content-rst/applications/general/iot/devices/measurement_tool.rst diff --git a/content-rst/applications/general/iot/devices/measurement_tool/device-dropdown.png b/content-rst/applications/general/iot/devices/measurement_tool/device-dropdown.png new file mode 100644 index 000000000..fb00d9497 Binary files /dev/null and b/content-rst/applications/general/iot/devices/measurement_tool/device-dropdown.png differ diff --git a/content-rst/applications/general/iot/devices/measurement_tool/measurement-control-point.png b/content-rst/applications/general/iot/devices/measurement_tool/measurement-control-point.png new file mode 100644 index 000000000..fa9bfb832 Binary files /dev/null and b/content-rst/applications/general/iot/devices/measurement_tool/measurement-control-point.png differ diff --git a/content-rst/applications/general/iot/devices/measurement_tool/measurement-tool.png b/content-rst/applications/general/iot/devices/measurement_tool/measurement-tool.png new file mode 100644 index 000000000..343f51006 Binary files /dev/null and b/content-rst/applications/general/iot/devices/measurement_tool/measurement-tool.png differ diff --git a/content/applications/general/iot/devices/printer.rst b/content-rst/applications/general/iot/devices/printer.rst similarity index 100% rename from content/applications/general/iot/devices/printer.rst rename to content-rst/applications/general/iot/devices/printer.rst diff --git a/content-rst/applications/general/iot/devices/printer/add-printer-add.png b/content-rst/applications/general/iot/devices/printer/add-printer-add.png new file mode 100644 index 000000000..43bcb157f Binary files /dev/null and b/content-rst/applications/general/iot/devices/printer/add-printer-add.png differ diff --git a/content-rst/applications/general/iot/devices/printer/add-printer-filled.png b/content-rst/applications/general/iot/devices/printer/add-printer-filled.png new file mode 100644 index 000000000..8bc068aa9 Binary files /dev/null and b/content-rst/applications/general/iot/devices/printer/add-printer-filled.png differ diff --git a/content-rst/applications/general/iot/devices/printer/add-printer.png b/content-rst/applications/general/iot/devices/printer/add-printer.png new file mode 100644 index 000000000..28e87f861 Binary files /dev/null and b/content-rst/applications/general/iot/devices/printer/add-printer.png differ diff --git a/content-rst/applications/general/iot/devices/printer/choose-printer.png b/content-rst/applications/general/iot/devices/printer/choose-printer.png new file mode 100644 index 000000000..ac9e4c9c3 Binary files /dev/null and b/content-rst/applications/general/iot/devices/printer/choose-printer.png differ diff --git a/content-rst/applications/general/iot/devices/printer/clear-reports.png b/content-rst/applications/general/iot/devices/printer/clear-reports.png new file mode 100644 index 000000000..0146e9a53 Binary files /dev/null and b/content-rst/applications/general/iot/devices/printer/clear-reports.png differ diff --git a/content-rst/applications/general/iot/devices/printer/epson-compatibility-compare.png b/content-rst/applications/general/iot/devices/printer/epson-compatibility-compare.png new file mode 100644 index 000000000..8d781bd17 Binary files /dev/null and b/content-rst/applications/general/iot/devices/printer/epson-compatibility-compare.png differ diff --git a/content-rst/applications/general/iot/devices/printer/epson-tm-u220-specification.png b/content-rst/applications/general/iot/devices/printer/epson-tm-u220-specification.png new file mode 100644 index 000000000..3901e2492 Binary files /dev/null and b/content-rst/applications/general/iot/devices/printer/epson-tm-u220-specification.png differ diff --git a/content-rst/applications/general/iot/devices/printer/local-printer.png b/content-rst/applications/general/iot/devices/printer/local-printer.png new file mode 100644 index 000000000..f2ee841a2 Binary files /dev/null and b/content-rst/applications/general/iot/devices/printer/local-printer.png differ diff --git a/content-rst/applications/general/iot/devices/printer/main-modify.png b/content-rst/applications/general/iot/devices/printer/main-modify.png new file mode 100644 index 000000000..853f2f4f4 Binary files /dev/null and b/content-rst/applications/general/iot/devices/printer/main-modify.png differ diff --git a/content-rst/applications/general/iot/devices/printer/modify-printer.png b/content-rst/applications/general/iot/devices/printer/modify-printer.png new file mode 100644 index 000000000..4942f0244 Binary files /dev/null and b/content-rst/applications/general/iot/devices/printer/modify-printer.png differ diff --git a/content-rst/applications/general/iot/devices/printer/printer-detected.png b/content-rst/applications/general/iot/devices/printer/printer-detected.png new file mode 100644 index 000000000..3dd9b583c Binary files /dev/null and b/content-rst/applications/general/iot/devices/printer/printer-detected.png differ diff --git a/content-rst/applications/general/iot/devices/printer/printer-page.png b/content-rst/applications/general/iot/devices/printer/printer-page.png new file mode 100644 index 000000000..a48e8d7ea Binary files /dev/null and b/content-rst/applications/general/iot/devices/printer/printer-page.png differ diff --git a/content-rst/applications/general/iot/devices/printer/printer-reports.png b/content-rst/applications/general/iot/devices/printer/printer-reports.png new file mode 100644 index 000000000..c4e322399 Binary files /dev/null and b/content-rst/applications/general/iot/devices/printer/printer-reports.png differ diff --git a/content-rst/applications/general/iot/devices/printer/receipt-example.png b/content-rst/applications/general/iot/devices/printer/receipt-example.png new file mode 100644 index 000000000..f09fee21a Binary files /dev/null and b/content-rst/applications/general/iot/devices/printer/receipt-example.png differ diff --git a/content-rst/applications/general/iot/devices/printer/receipt-print-random-letters.png b/content-rst/applications/general/iot/devices/printer/receipt-print-random-letters.png new file mode 100644 index 000000000..a69d161d9 Binary files /dev/null and b/content-rst/applications/general/iot/devices/printer/receipt-print-random-letters.png differ diff --git a/content-rst/applications/general/iot/devices/printer/rename-printer.png b/content-rst/applications/general/iot/devices/printer/rename-printer.png new file mode 100644 index 000000000..8c0a7df82 Binary files /dev/null and b/content-rst/applications/general/iot/devices/printer/rename-printer.png differ diff --git a/content-rst/applications/general/iot/devices/printer/tm-u220-ldv-hdv-scale35.png b/content-rst/applications/general/iot/devices/printer/tm-u220-ldv-hdv-scale35.png new file mode 100644 index 000000000..fc2260e30 Binary files /dev/null and b/content-rst/applications/general/iot/devices/printer/tm-u220-ldv-hdv-scale35.png differ diff --git a/content-rst/applications/general/iot/devices/printer/tm-u220-ldv-hdv.png b/content-rst/applications/general/iot/devices/printer/tm-u220-ldv-hdv.png new file mode 100644 index 000000000..0a73ba80e Binary files /dev/null and b/content-rst/applications/general/iot/devices/printer/tm-u220-ldv-hdv.png differ diff --git a/content-rst/applications/general/iot/devices/printer/tm-u220-ldv-scale75.png b/content-rst/applications/general/iot/devices/printer/tm-u220-ldv-scale75.png new file mode 100644 index 000000000..8190999ae Binary files /dev/null and b/content-rst/applications/general/iot/devices/printer/tm-u220-ldv-scale75.png differ diff --git a/content-rst/applications/general/iot/devices/printer/tm-u220-ldv.png b/content-rst/applications/general/iot/devices/printer/tm-u220-ldv.png new file mode 100644 index 000000000..a9732f206 Binary files /dev/null and b/content-rst/applications/general/iot/devices/printer/tm-u220-ldv.png differ diff --git a/content/applications/general/iot/devices/scale.rst b/content-rst/applications/general/iot/devices/scale.rst similarity index 100% rename from content/applications/general/iot/devices/scale.rst rename to content-rst/applications/general/iot/devices/scale.rst diff --git a/content-rst/applications/general/iot/devices/scale/scale-view.png b/content-rst/applications/general/iot/devices/scale/scale-view.png new file mode 100644 index 000000000..49437b31a Binary files /dev/null and b/content-rst/applications/general/iot/devices/scale/scale-view.png differ diff --git a/content/applications/general/iot/devices/screen.rst b/content-rst/applications/general/iot/devices/screen.rst similarity index 100% rename from content/applications/general/iot/devices/screen.rst rename to content-rst/applications/general/iot/devices/screen.rst diff --git a/content-rst/applications/general/iot/devices/screen/screen-no-screen.png b/content-rst/applications/general/iot/devices/screen/screen-no-screen.png new file mode 100644 index 000000000..416fa35a0 Binary files /dev/null and b/content-rst/applications/general/iot/devices/screen/screen-no-screen.png differ diff --git a/content-rst/applications/general/iot/devices/screen/screen-pos-client-display-no-order.png b/content-rst/applications/general/iot/devices/screen/screen-pos-client-display-no-order.png new file mode 100644 index 000000000..f686317a9 Binary files /dev/null and b/content-rst/applications/general/iot/devices/screen/screen-pos-client-display-no-order.png differ diff --git a/content-rst/applications/general/iot/devices/screen/screen-pos-client-display.png b/content-rst/applications/general/iot/devices/screen/screen-pos-client-display.png new file mode 100644 index 000000000..3be1efd31 Binary files /dev/null and b/content-rst/applications/general/iot/devices/screen/screen-pos-client-display.png differ diff --git a/content-rst/applications/general/iot/devices/screen/screen-pos-icon.png b/content-rst/applications/general/iot/devices/screen/screen-pos-icon.png new file mode 100644 index 000000000..6142484c3 Binary files /dev/null and b/content-rst/applications/general/iot/devices/screen/screen-pos-icon.png differ diff --git a/content-rst/applications/general/iot/devices/screen/screen-pos-screen-config.png b/content-rst/applications/general/iot/devices/screen/screen-pos-screen-config.png new file mode 100644 index 000000000..27613f623 Binary files /dev/null and b/content-rst/applications/general/iot/devices/screen/screen-pos-screen-config.png differ diff --git a/content-rst/applications/general/iot/devices/screen/screen-screen-name-example.png b/content-rst/applications/general/iot/devices/screen/screen-screen-name-example.png new file mode 100644 index 000000000..9f3be2e95 Binary files /dev/null and b/content-rst/applications/general/iot/devices/screen/screen-screen-name-example.png differ diff --git a/content/applications/general/iot/iot_advanced.rst b/content-rst/applications/general/iot/iot_advanced.rst similarity index 100% rename from content/applications/general/iot/iot_advanced.rst rename to content-rst/applications/general/iot/iot_advanced.rst diff --git a/content/applications/general/iot/iot_advanced/https_certificate_iot.rst b/content-rst/applications/general/iot/iot_advanced/https_certificate_iot.rst similarity index 100% rename from content/applications/general/iot/iot_advanced/https_certificate_iot.rst rename to content-rst/applications/general/iot/iot_advanced/https_certificate_iot.rst diff --git a/content-rst/applications/general/iot/iot_advanced/https_certificate_iot/https-valid.png b/content-rst/applications/general/iot/iot_advanced/https_certificate_iot/https-valid.png new file mode 100644 index 000000000..352f26274 Binary files /dev/null and b/content-rst/applications/general/iot/iot_advanced/https_certificate_iot/https-valid.png differ diff --git a/content-rst/applications/general/iot/iot_advanced/https_certificate_iot/iot-new-domain.png b/content-rst/applications/general/iot/iot_advanced/https_certificate_iot/iot-new-domain.png new file mode 100644 index 000000000..8d8332e62 Binary files /dev/null and b/content-rst/applications/general/iot/iot_advanced/https_certificate_iot/iot-new-domain.png differ diff --git a/content/applications/general/iot/iot_advanced/ssh_connect.rst b/content-rst/applications/general/iot/iot_advanced/ssh_connect.rst similarity index 100% rename from content/applications/general/iot/iot_advanced/ssh_connect.rst rename to content-rst/applications/general/iot/iot_advanced/ssh_connect.rst diff --git a/content-rst/applications/general/iot/iot_advanced/ssh_connect/ssh-generate-password.png b/content-rst/applications/general/iot/iot_advanced/ssh_connect/ssh-generate-password.png new file mode 100644 index 000000000..8496487a5 Binary files /dev/null and b/content-rst/applications/general/iot/iot_advanced/ssh_connect/ssh-generate-password.png differ diff --git a/content/applications/general/iot/iot_advanced/updating_iot.rst b/content-rst/applications/general/iot/iot_advanced/updating_iot.rst similarity index 100% rename from content/applications/general/iot/iot_advanced/updating_iot.rst rename to content-rst/applications/general/iot/iot_advanced/updating_iot.rst diff --git a/content-rst/applications/general/iot/iot_advanced/updating_iot/etcher-flash.png b/content-rst/applications/general/iot/iot_advanced/updating_iot/etcher-flash.png new file mode 100644 index 000000000..6841fb17b Binary files /dev/null and b/content-rst/applications/general/iot/iot_advanced/updating_iot/etcher-flash.png differ diff --git a/content/applications/general/iot/iot_box.rst b/content-rst/applications/general/iot/iot_box.rst similarity index 100% rename from content/applications/general/iot/iot_box.rst rename to content-rst/applications/general/iot/iot_box.rst diff --git a/content-rst/applications/general/iot/iot_box/iot-homepage.png b/content-rst/applications/general/iot/iot_box/iot-homepage.png new file mode 100644 index 000000000..b4e91fa1e Binary files /dev/null and b/content-rst/applications/general/iot/iot_box/iot-homepage.png differ diff --git a/content-rst/applications/general/iot/iot_box/iot-pos-display.png b/content-rst/applications/general/iot/iot_box/iot-pos-display.png new file mode 100644 index 000000000..d1d87de7a Binary files /dev/null and b/content-rst/applications/general/iot/iot_box/iot-pos-display.png differ diff --git a/content/applications/general/iot/windows_iot.rst b/content-rst/applications/general/iot/windows_iot.rst similarity index 100% rename from content/applications/general/iot/windows_iot.rst rename to content-rst/applications/general/iot/windows_iot.rst diff --git a/content-rst/applications/general/iot/windows_iot/iot-windows-homepage.png b/content-rst/applications/general/iot/windows_iot/iot-windows-homepage.png new file mode 100644 index 000000000..7c02ba0c4 Binary files /dev/null and b/content-rst/applications/general/iot/windows_iot/iot-windows-homepage.png differ diff --git a/content/applications/general/multi_company.rst b/content-rst/applications/general/multi_company.rst similarity index 100% rename from content/applications/general/multi_company.rst rename to content-rst/applications/general/multi_company.rst diff --git a/content-rst/applications/general/multi_company/company-access.png b/content-rst/applications/general/multi_company/company-access.png new file mode 100644 index 000000000..c7dc98361 Binary files /dev/null and b/content-rst/applications/general/multi_company/company-access.png differ diff --git a/content/applications/general/users.rst b/content-rst/applications/general/users.rst similarity index 100% rename from content/applications/general/users.rst rename to content-rst/applications/general/users.rst diff --git a/content/applications/general/users/2fa.rst b/content-rst/applications/general/users/2fa.rst similarity index 100% rename from content/applications/general/users/2fa.rst rename to content-rst/applications/general/users/2fa.rst diff --git a/content-rst/applications/general/users/2fa/2FA-by-mail.png b/content-rst/applications/general/users/2fa/2FA-by-mail.png new file mode 100644 index 000000000..5fba6ed46 Binary files /dev/null and b/content-rst/applications/general/users/2fa/2FA-by-mail.png differ diff --git a/content-rst/applications/general/users/2fa/2fa-enabled.png b/content-rst/applications/general/users/2fa/2fa-enabled.png new file mode 100644 index 000000000..2233d9be4 Binary files /dev/null and b/content-rst/applications/general/users/2fa/2fa-enabled.png differ diff --git a/content-rst/applications/general/users/2fa/2fa-login.png b/content-rst/applications/general/users/2fa/2fa-login.png new file mode 100644 index 000000000..0b425269d Binary files /dev/null and b/content-rst/applications/general/users/2fa/2fa-login.png differ diff --git a/content-rst/applications/general/users/2fa/account-security.png b/content-rst/applications/general/users/2fa/account-security.png new file mode 100644 index 000000000..031673892 Binary files /dev/null and b/content-rst/applications/general/users/2fa/account-security.png differ diff --git a/content-rst/applications/general/users/2fa/authenticator.png b/content-rst/applications/general/users/2fa/authenticator.png new file mode 100644 index 000000000..1fa1b5d55 Binary files /dev/null and b/content-rst/applications/general/users/2fa/authenticator.png differ diff --git a/content-rst/applications/general/users/2fa/enforce-settings.png b/content-rst/applications/general/users/2fa/enforce-settings.png new file mode 100644 index 000000000..5badcb447 Binary files /dev/null and b/content-rst/applications/general/users/2fa/enforce-settings.png differ diff --git a/content-rst/applications/general/users/2fa/input-secret.png b/content-rst/applications/general/users/2fa/input-secret.png new file mode 100644 index 000000000..8b2184004 Binary files /dev/null and b/content-rst/applications/general/users/2fa/input-secret.png differ diff --git a/content-rst/applications/general/users/2fa/qr-code.png b/content-rst/applications/general/users/2fa/qr-code.png new file mode 100644 index 000000000..d4df3dabe Binary files /dev/null and b/content-rst/applications/general/users/2fa/qr-code.png differ diff --git a/content-rst/applications/general/users/2fa/secret-visible.png b/content-rst/applications/general/users/2fa/secret-visible.png new file mode 100644 index 000000000..e1b68a180 Binary files /dev/null and b/content-rst/applications/general/users/2fa/secret-visible.png differ diff --git a/content/applications/general/users/access_rights.rst b/content-rst/applications/general/users/access_rights.rst similarity index 100% rename from content/applications/general/users/access_rights.rst rename to content-rst/applications/general/users/access_rights.rst diff --git a/content-rst/applications/general/users/access_rights/click-users-and-companies.png b/content-rst/applications/general/users/access_rights/click-users-and-companies.png new file mode 100644 index 000000000..828c2255b Binary files /dev/null and b/content-rst/applications/general/users/access_rights/click-users-and-companies.png differ diff --git a/content-rst/applications/general/users/access_rights/groups-form.png b/content-rst/applications/general/users/access_rights/groups-form.png new file mode 100644 index 000000000..73585ba0b Binary files /dev/null and b/content-rst/applications/general/users/access_rights/groups-form.png differ diff --git a/content-rst/applications/general/users/access_rights/navigate-to-users-menu.png b/content-rst/applications/general/users/access_rights/navigate-to-users-menu.png new file mode 100644 index 000000000..b407ef8cf Binary files /dev/null and b/content-rst/applications/general/users/access_rights/navigate-to-users-menu.png differ diff --git a/content-rst/applications/general/users/access_rights/technical-info.png b/content-rst/applications/general/users/access_rights/technical-info.png new file mode 100644 index 000000000..54c497c24 Binary files /dev/null and b/content-rst/applications/general/users/access_rights/technical-info.png differ diff --git a/content-rst/applications/general/users/access_rights/user-permissions-dropdown-menu.png b/content-rst/applications/general/users/access_rights/user-permissions-dropdown-menu.png new file mode 100644 index 000000000..5616559b8 Binary files /dev/null and b/content-rst/applications/general/users/access_rights/user-permissions-dropdown-menu.png differ diff --git a/content-rst/applications/general/users/add-more-users.png b/content-rst/applications/general/users/add-more-users.png new file mode 100644 index 000000000..a6c607cd7 Binary files /dev/null and b/content-rst/applications/general/users/add-more-users.png differ diff --git a/content/applications/general/users/azure.rst b/content-rst/applications/general/users/azure.rst similarity index 100% rename from content/applications/general/users/azure.rst rename to content-rst/applications/general/users/azure.rst diff --git a/content-rst/applications/general/users/azure/accept-access.png b/content-rst/applications/general/users/azure/accept-access.png new file mode 100644 index 000000000..2b25035e1 Binary files /dev/null and b/content-rst/applications/general/users/azure/accept-access.png differ diff --git a/content-rst/applications/general/users/azure/authentication-tokens.png b/content-rst/applications/general/users/azure/authentication-tokens.png new file mode 100644 index 000000000..f12bd2e7c Binary files /dev/null and b/content-rst/applications/general/users/azure/authentication-tokens.png differ diff --git a/content-rst/applications/general/users/azure/login-next.png b/content-rst/applications/general/users/azure/login-next.png new file mode 100644 index 000000000..190791d12 Binary files /dev/null and b/content-rst/applications/general/users/azure/login-next.png differ diff --git a/content-rst/applications/general/users/azure/odoo-login.png b/content-rst/applications/general/users/azure/odoo-login.png new file mode 100644 index 000000000..fe4f73d37 Binary files /dev/null and b/content-rst/applications/general/users/azure/odoo-login.png differ diff --git a/content-rst/applications/general/users/azure/odoo-provider-settings.png b/content-rst/applications/general/users/azure/odoo-provider-settings.png new file mode 100644 index 000000000..e095758f2 Binary files /dev/null and b/content-rst/applications/general/users/azure/odoo-provider-settings.png differ diff --git a/content-rst/applications/general/users/azure/overview-azure-app.png b/content-rst/applications/general/users/azure/overview-azure-app.png new file mode 100644 index 000000000..eb121a024 Binary files /dev/null and b/content-rst/applications/general/users/azure/overview-azure-app.png differ diff --git a/content-rst/applications/general/users/change-password.png b/content-rst/applications/general/users/change-password.png new file mode 100644 index 000000000..c9c9536d5 Binary files /dev/null and b/content-rst/applications/general/users/change-password.png differ diff --git a/content/applications/general/users/facebook.rst b/content-rst/applications/general/users/facebook.rst similarity index 100% rename from content/applications/general/users/facebook.rst rename to content-rst/applications/general/users/facebook.rst diff --git a/content-rst/applications/general/users/facebook/app-id.png b/content-rst/applications/general/users/facebook/app-id.png new file mode 100644 index 000000000..b40d5aebe Binary files /dev/null and b/content-rst/applications/general/users/facebook/app-id.png differ diff --git a/content-rst/applications/general/users/facebook/app-requirements.png b/content-rst/applications/general/users/facebook/app-requirements.png new file mode 100644 index 000000000..77e3bd8bb Binary files /dev/null and b/content-rst/applications/general/users/facebook/app-requirements.png differ diff --git a/content-rst/applications/general/users/facebook/enable-oauth.png b/content-rst/applications/general/users/facebook/enable-oauth.png new file mode 100644 index 000000000..a5c027f78 Binary files /dev/null and b/content-rst/applications/general/users/facebook/enable-oauth.png differ diff --git a/content-rst/applications/general/users/facebook/facebook-graph.png b/content-rst/applications/general/users/facebook/facebook-graph.png new file mode 100644 index 000000000..452f5fe36 Binary files /dev/null and b/content-rst/applications/general/users/facebook/facebook-graph.png differ diff --git a/content/applications/general/users/google.rst b/content-rst/applications/general/users/google.rst similarity index 100% rename from content/applications/general/users/google.rst rename to content-rst/applications/general/users/google.rst diff --git a/content-rst/applications/general/users/google/client-id.png b/content-rst/applications/general/users/google/client-id.png new file mode 100644 index 000000000..6934ddabe Binary files /dev/null and b/content-rst/applications/general/users/google/client-id.png differ diff --git a/content-rst/applications/general/users/google/consent-selection.png b/content-rst/applications/general/users/google/consent-selection.png new file mode 100644 index 000000000..a92553c42 Binary files /dev/null and b/content-rst/applications/general/users/google/consent-selection.png differ diff --git a/content-rst/applications/general/users/google/consent.png b/content-rst/applications/general/users/google/consent.png new file mode 100644 index 000000000..07b16f3bd Binary files /dev/null and b/content-rst/applications/general/users/google/consent.png differ diff --git a/content-rst/applications/general/users/google/credentials-button.png b/content-rst/applications/general/users/google/credentials-button.png new file mode 100644 index 000000000..1ca2328e7 Binary files /dev/null and b/content-rst/applications/general/users/google/credentials-button.png differ diff --git a/content-rst/applications/general/users/google/first-login.png b/content-rst/applications/general/users/google/first-login.png new file mode 100644 index 000000000..148ed1e5b Binary files /dev/null and b/content-rst/applications/general/users/google/first-login.png differ diff --git a/content-rst/applications/general/users/google/new-project-details.png b/content-rst/applications/general/users/google/new-project-details.png new file mode 100644 index 000000000..d0d911e7e Binary files /dev/null and b/content-rst/applications/general/users/google/new-project-details.png differ diff --git a/content-rst/applications/general/users/google/odoo-client-id.png b/content-rst/applications/general/users/google/odoo-client-id.png new file mode 100644 index 000000000..6282e4a23 Binary files /dev/null and b/content-rst/applications/general/users/google/odoo-client-id.png differ diff --git a/content-rst/applications/general/users/google/secret-ids.png b/content-rst/applications/general/users/google/secret-ids.png new file mode 100644 index 000000000..d0f275cd6 Binary files /dev/null and b/content-rst/applications/general/users/google/secret-ids.png differ diff --git a/content-rst/applications/general/users/invitation-email.png b/content-rst/applications/general/users/invitation-email.png new file mode 100644 index 000000000..6b6050a98 Binary files /dev/null and b/content-rst/applications/general/users/invitation-email.png differ diff --git a/content/applications/general/users/language.rst b/content-rst/applications/general/users/language.rst similarity index 100% rename from content/applications/general/users/language.rst rename to content-rst/applications/general/users/language.rst diff --git a/content/applications/general/users/ldap.rst b/content-rst/applications/general/users/ldap.rst similarity index 100% rename from content/applications/general/users/ldap.rst rename to content-rst/applications/general/users/ldap.rst diff --git a/content-rst/applications/general/users/manage-users.png b/content-rst/applications/general/users/manage-users.png new file mode 100644 index 000000000..6956e57da Binary files /dev/null and b/content-rst/applications/general/users/manage-users.png differ diff --git a/content-rst/applications/general/users/minimum-password-length.png b/content-rst/applications/general/users/minimum-password-length.png new file mode 100644 index 000000000..3e700f9b4 Binary files /dev/null and b/content-rst/applications/general/users/minimum-password-length.png differ diff --git a/content-rst/applications/general/users/multi-companies.png b/content-rst/applications/general/users/multi-companies.png new file mode 100644 index 000000000..151b65e61 Binary files /dev/null and b/content-rst/applications/general/users/multi-companies.png differ diff --git a/content-rst/applications/general/users/new-user.png b/content-rst/applications/general/users/new-user.png new file mode 100644 index 000000000..3930ec200 Binary files /dev/null and b/content-rst/applications/general/users/new-user.png differ diff --git a/content-rst/applications/general/users/password-reset-email.png b/content-rst/applications/general/users/password-reset-email.png new file mode 100644 index 000000000..3fa57353c Binary files /dev/null and b/content-rst/applications/general/users/password-reset-email.png differ diff --git a/content-rst/applications/general/users/password-reset-login.png b/content-rst/applications/general/users/password-reset-login.png new file mode 100644 index 000000000..2fda1f173 Binary files /dev/null and b/content-rst/applications/general/users/password-reset-login.png differ diff --git a/content-rst/applications/general/users/password-reset.png b/content-rst/applications/general/users/password-reset.png new file mode 100644 index 000000000..bb898c147 Binary files /dev/null and b/content-rst/applications/general/users/password-reset.png differ diff --git a/content/applications/general/users/portal.rst b/content-rst/applications/general/users/portal.rst similarity index 100% rename from content/applications/general/users/portal.rst rename to content-rst/applications/general/users/portal.rst diff --git a/content-rst/applications/general/users/portal/add-contact-to-portal.png b/content-rst/applications/general/users/portal/add-contact-to-portal.png new file mode 100644 index 000000000..5ff41aa5f Binary files /dev/null and b/content-rst/applications/general/users/portal/add-contact-to-portal.png differ diff --git a/content-rst/applications/general/users/portal/grant-portal-access.png b/content-rst/applications/general/users/portal/grant-portal-access.png new file mode 100644 index 000000000..8e3374c3b Binary files /dev/null and b/content-rst/applications/general/users/portal/grant-portal-access.png differ diff --git a/content-rst/applications/general/users/user-type.png b/content-rst/applications/general/users/user-type.png new file mode 100644 index 000000000..79c1623c3 Binary files /dev/null and b/content-rst/applications/general/users/user-type.png differ diff --git a/content/applications/hr.rst b/content-rst/applications/hr.rst similarity index 100% rename from content/applications/hr.rst rename to content-rst/applications/hr.rst diff --git a/content/applications/hr/appraisals.rst b/content-rst/applications/hr/appraisals.rst similarity index 100% rename from content/applications/hr/appraisals.rst rename to content-rst/applications/hr/appraisals.rst diff --git a/content/applications/hr/appraisals/appraisal_analysis.rst b/content-rst/applications/hr/appraisals/appraisal_analysis.rst similarity index 100% rename from content/applications/hr/appraisals/appraisal_analysis.rst rename to content-rst/applications/hr/appraisals/appraisal_analysis.rst diff --git a/content-rst/applications/hr/appraisals/appraisal_analysis/analysis.png b/content-rst/applications/hr/appraisals/appraisal_analysis/analysis.png new file mode 100644 index 000000000..97b70de70 Binary files /dev/null and b/content-rst/applications/hr/appraisals/appraisal_analysis/analysis.png differ diff --git a/content-rst/applications/hr/appraisals/appraisal_analysis/by-status.png b/content-rst/applications/hr/appraisals/appraisal_analysis/by-status.png new file mode 100644 index 000000000..808b36282 Binary files /dev/null and b/content-rst/applications/hr/appraisals/appraisal_analysis/by-status.png differ diff --git a/content-rst/applications/hr/appraisals/appraisal_analysis/custom.png b/content-rst/applications/hr/appraisals/appraisal_analysis/custom.png new file mode 100644 index 000000000..fb26482c3 Binary files /dev/null and b/content-rst/applications/hr/appraisals/appraisal_analysis/custom.png differ diff --git a/content-rst/applications/hr/appraisals/appraisal_analysis/users-appraisals.png b/content-rst/applications/hr/appraisals/appraisal_analysis/users-appraisals.png new file mode 100644 index 000000000..f6690835f Binary files /dev/null and b/content-rst/applications/hr/appraisals/appraisal_analysis/users-appraisals.png differ diff --git a/content-rst/applications/hr/appraisals/appraisals-setting.png b/content-rst/applications/hr/appraisals/appraisals-setting.png new file mode 100644 index 000000000..82e068d80 Binary files /dev/null and b/content-rst/applications/hr/appraisals/appraisals-setting.png differ diff --git a/content-rst/applications/hr/appraisals/evaluation-scale.png b/content-rst/applications/hr/appraisals/evaluation-scale.png new file mode 100644 index 000000000..72278bf7c Binary files /dev/null and b/content-rst/applications/hr/appraisals/evaluation-scale.png differ diff --git a/content/applications/hr/appraisals/goals.rst b/content-rst/applications/hr/appraisals/goals.rst similarity index 100% rename from content/applications/hr/appraisals/goals.rst rename to content-rst/applications/hr/appraisals/goals.rst diff --git a/content-rst/applications/hr/appraisals/goals/goals.png b/content-rst/applications/hr/appraisals/goals/goals.png new file mode 100644 index 000000000..2bf009e01 Binary files /dev/null and b/content-rst/applications/hr/appraisals/goals/goals.png differ diff --git a/content-rst/applications/hr/appraisals/goals/new-goal.png b/content-rst/applications/hr/appraisals/goals/new-goal.png new file mode 100644 index 000000000..6e29f51fa Binary files /dev/null and b/content-rst/applications/hr/appraisals/goals/new-goal.png differ diff --git a/content/applications/hr/appraisals/new_appraisals.rst b/content-rst/applications/hr/appraisals/new_appraisals.rst similarity index 100% rename from content/applications/hr/appraisals/new_appraisals.rst rename to content-rst/applications/hr/appraisals/new_appraisals.rst diff --git a/content-rst/applications/hr/appraisals/new_appraisals/ask-feedback.png b/content-rst/applications/hr/appraisals/new_appraisals/ask-feedback.png new file mode 100644 index 000000000..11032d98b Binary files /dev/null and b/content-rst/applications/hr/appraisals/new_appraisals/ask-feedback.png differ diff --git a/content-rst/applications/hr/appraisals/new_appraisals/dashboard.png b/content-rst/applications/hr/appraisals/new_appraisals/dashboard.png new file mode 100644 index 000000000..5c40b6557 Binary files /dev/null and b/content-rst/applications/hr/appraisals/new_appraisals/dashboard.png differ diff --git a/content-rst/applications/hr/appraisals/new_appraisals/employee-feedback.png b/content-rst/applications/hr/appraisals/new_appraisals/employee-feedback.png new file mode 100644 index 000000000..e8595eb8d Binary files /dev/null and b/content-rst/applications/hr/appraisals/new_appraisals/employee-feedback.png differ diff --git a/content-rst/applications/hr/appraisals/new_appraisals/manager-feedback.png b/content-rst/applications/hr/appraisals/new_appraisals/manager-feedback.png new file mode 100644 index 000000000..a1e58c2e8 Binary files /dev/null and b/content-rst/applications/hr/appraisals/new_appraisals/manager-feedback.png differ diff --git a/content-rst/applications/hr/appraisals/new_appraisals/meeting.png b/content-rst/applications/hr/appraisals/new_appraisals/meeting.png new file mode 100644 index 000000000..b0ec9dfeb Binary files /dev/null and b/content-rst/applications/hr/appraisals/new_appraisals/meeting.png differ diff --git a/content-rst/applications/hr/appraisals/new_appraisals/skills.png b/content-rst/applications/hr/appraisals/new_appraisals/skills.png new file mode 100644 index 000000000..90ec2d06f Binary files /dev/null and b/content-rst/applications/hr/appraisals/new_appraisals/skills.png differ diff --git a/content/applications/hr/appraisals/skills_evolution.rst b/content-rst/applications/hr/appraisals/skills_evolution.rst similarity index 100% rename from content/applications/hr/appraisals/skills_evolution.rst rename to content-rst/applications/hr/appraisals/skills_evolution.rst diff --git a/content-rst/applications/hr/appraisals/skills_evolution/custom-filter.png b/content-rst/applications/hr/appraisals/skills_evolution/custom-filter.png new file mode 100644 index 000000000..0bc9069db Binary files /dev/null and b/content-rst/applications/hr/appraisals/skills_evolution/custom-filter.png differ diff --git a/content-rst/applications/hr/appraisals/skills_evolution/javascript.png b/content-rst/applications/hr/appraisals/skills_evolution/javascript.png new file mode 100644 index 000000000..066e64dc0 Binary files /dev/null and b/content-rst/applications/hr/appraisals/skills_evolution/javascript.png differ diff --git a/content-rst/applications/hr/appraisals/skills_evolution/largest-improvement.png b/content-rst/applications/hr/appraisals/skills_evolution/largest-improvement.png new file mode 100644 index 000000000..fa635fcfa Binary files /dev/null and b/content-rst/applications/hr/appraisals/skills_evolution/largest-improvement.png differ diff --git a/content-rst/applications/hr/appraisals/skills_evolution/results.png b/content-rst/applications/hr/appraisals/skills_evolution/results.png new file mode 100644 index 000000000..d17de7bf2 Binary files /dev/null and b/content-rst/applications/hr/appraisals/skills_evolution/results.png differ diff --git a/content-rst/applications/hr/appraisals/skills_evolution/skills-report.png b/content-rst/applications/hr/appraisals/skills_evolution/skills-report.png new file mode 100644 index 000000000..0ef468e75 Binary files /dev/null and b/content-rst/applications/hr/appraisals/skills_evolution/skills-report.png differ diff --git a/content-rst/applications/hr/appraisals/survey-list.png b/content-rst/applications/hr/appraisals/survey-list.png new file mode 100644 index 000000000..676ebecc6 Binary files /dev/null and b/content-rst/applications/hr/appraisals/survey-list.png differ diff --git a/content/applications/hr/attendances.rst b/content-rst/applications/hr/attendances.rst similarity index 100% rename from content/applications/hr/attendances.rst rename to content-rst/applications/hr/attendances.rst diff --git a/content/applications/hr/attendances/check_in_check_out.rst b/content-rst/applications/hr/attendances/check_in_check_out.rst similarity index 100% rename from content/applications/hr/attendances/check_in_check_out.rst rename to content-rst/applications/hr/attendances/check_in_check_out.rst diff --git a/content-rst/applications/hr/attendances/check_in_check_out/check-in-database-message.png b/content-rst/applications/hr/attendances/check_in_check_out/check-in-database-message.png new file mode 100644 index 000000000..57b3823d1 Binary files /dev/null and b/content-rst/applications/hr/attendances/check_in_check_out/check-in-database-message.png differ diff --git a/content-rst/applications/hr/attendances/check_in_check_out/check-in.png b/content-rst/applications/hr/attendances/check_in_check_out/check-in.png new file mode 100644 index 000000000..6c91aff65 Binary files /dev/null and b/content-rst/applications/hr/attendances/check_in_check_out/check-in.png differ diff --git a/content-rst/applications/hr/attendances/check_in_check_out/top-menu.png b/content-rst/applications/hr/attendances/check_in_check_out/top-menu.png new file mode 100644 index 000000000..50b758ed2 Binary files /dev/null and b/content-rst/applications/hr/attendances/check_in_check_out/top-menu.png differ diff --git a/content-rst/applications/hr/attendances/details.png b/content-rst/applications/hr/attendances/details.png new file mode 100644 index 000000000..af4c777a7 Binary files /dev/null and b/content-rst/applications/hr/attendances/details.png differ diff --git a/content-rst/applications/hr/attendances/errors.png b/content-rst/applications/hr/attendances/errors.png new file mode 100644 index 000000000..07ddc62f8 Binary files /dev/null and b/content-rst/applications/hr/attendances/errors.png differ diff --git a/content/applications/hr/attendances/hardware.rst b/content-rst/applications/hr/attendances/hardware.rst similarity index 100% rename from content/applications/hr/attendances/hardware.rst rename to content-rst/applications/hr/attendances/hardware.rst diff --git a/content-rst/applications/hr/attendances/hardware/badge.png b/content-rst/applications/hr/attendances/hardware/badge.png new file mode 100644 index 000000000..289dc49a6 Binary files /dev/null and b/content-rst/applications/hr/attendances/hardware/badge.png differ diff --git a/content-rst/applications/hr/attendances/hardware/rfid-reader.jpg b/content-rst/applications/hr/attendances/hardware/rfid-reader.jpg new file mode 100644 index 000000000..92e760b4f Binary files /dev/null and b/content-rst/applications/hr/attendances/hardware/rfid-reader.jpg differ diff --git a/content/applications/hr/attendances/kiosks.rst b/content-rst/applications/hr/attendances/kiosks.rst similarity index 100% rename from content/applications/hr/attendances/kiosks.rst rename to content-rst/applications/hr/attendances/kiosks.rst diff --git a/content-rst/applications/hr/attendances/kiosks/enter-pin.png b/content-rst/applications/hr/attendances/kiosks/enter-pin.png new file mode 100644 index 000000000..59382558b Binary files /dev/null and b/content-rst/applications/hr/attendances/kiosks/enter-pin.png differ diff --git a/content-rst/applications/hr/attendances/kiosks/goodbye-message.png b/content-rst/applications/hr/attendances/kiosks/goodbye-message.png new file mode 100644 index 000000000..fd688a9b4 Binary files /dev/null and b/content-rst/applications/hr/attendances/kiosks/goodbye-message.png differ diff --git a/content-rst/applications/hr/attendances/kiosks/kiosk-url.png b/content-rst/applications/hr/attendances/kiosks/kiosk-url.png new file mode 100644 index 000000000..d706f2ce4 Binary files /dev/null and b/content-rst/applications/hr/attendances/kiosks/kiosk-url.png differ diff --git a/content-rst/applications/hr/attendances/kiosks/scan-badge.png b/content-rst/applications/hr/attendances/kiosks/scan-badge.png new file mode 100644 index 000000000..2d819048f Binary files /dev/null and b/content-rst/applications/hr/attendances/kiosks/scan-badge.png differ diff --git a/content-rst/applications/hr/attendances/overview.png b/content-rst/applications/hr/attendances/overview.png new file mode 100644 index 000000000..eaf8a2a90 Binary files /dev/null and b/content-rst/applications/hr/attendances/overview.png differ diff --git a/content-rst/applications/hr/attendances/reporting.png b/content-rst/applications/hr/attendances/reporting.png new file mode 100644 index 000000000..6e5d797dc Binary files /dev/null and b/content-rst/applications/hr/attendances/reporting.png differ diff --git a/content/applications/hr/employees.rst b/content-rst/applications/hr/employees.rst similarity index 100% rename from content/applications/hr/employees.rst rename to content-rst/applications/hr/employees.rst diff --git a/content/applications/hr/employees/certifications.rst b/content-rst/applications/hr/employees/certifications.rst similarity index 100% rename from content/applications/hr/employees/certifications.rst rename to content-rst/applications/hr/employees/certifications.rst diff --git a/content-rst/applications/hr/employees/certifications/certifications.png b/content-rst/applications/hr/employees/certifications/certifications.png new file mode 100644 index 000000000..5e0c0200c Binary files /dev/null and b/content-rst/applications/hr/employees/certifications/certifications.png differ diff --git a/content-rst/applications/hr/employees/certifications/osha.png b/content-rst/applications/hr/employees/certifications/osha.png new file mode 100644 index 000000000..601463b61 Binary files /dev/null and b/content-rst/applications/hr/employees/certifications/osha.png differ diff --git a/content-rst/applications/hr/employees/certifications/status.png b/content-rst/applications/hr/employees/certifications/status.png new file mode 100644 index 000000000..c5e6ce186 Binary files /dev/null and b/content-rst/applications/hr/employees/certifications/status.png differ diff --git a/content/applications/hr/employees/departments.rst b/content-rst/applications/hr/employees/departments.rst similarity index 100% rename from content/applications/hr/employees/departments.rst rename to content-rst/applications/hr/employees/departments.rst diff --git a/content-rst/applications/hr/employees/departments/department-form.png b/content-rst/applications/hr/employees/departments/department-form.png new file mode 100644 index 000000000..ab79d504e Binary files /dev/null and b/content-rst/applications/hr/employees/departments/department-form.png differ diff --git a/content-rst/applications/hr/employees/departments/departments.png b/content-rst/applications/hr/employees/departments/departments.png new file mode 100644 index 000000000..95ffbd662 Binary files /dev/null and b/content-rst/applications/hr/employees/departments/departments.png differ diff --git a/content-rst/applications/hr/employees/departments/employee-list.png b/content-rst/applications/hr/employees/departments/employee-list.png new file mode 100644 index 000000000..d68742fb5 Binary files /dev/null and b/content-rst/applications/hr/employees/departments/employee-list.png differ diff --git a/content-rst/applications/hr/employees/departments/hierarchy.png b/content-rst/applications/hr/employees/departments/hierarchy.png new file mode 100644 index 000000000..5342d4b0c Binary files /dev/null and b/content-rst/applications/hr/employees/departments/hierarchy.png differ diff --git a/content-rst/applications/hr/employees/departments/list.png b/content-rst/applications/hr/employees/departments/list.png new file mode 100644 index 000000000..6fe3df7e1 Binary files /dev/null and b/content-rst/applications/hr/employees/departments/list.png differ diff --git a/content/applications/hr/employees/new_employee.rst b/content-rst/applications/hr/employees/new_employee.rst similarity index 100% rename from content/applications/hr/employees/new_employee.rst rename to content-rst/applications/hr/employees/new_employee.rst diff --git a/content-rst/applications/hr/employees/new_employee/documents.png b/content-rst/applications/hr/employees/new_employee/documents.png new file mode 100644 index 000000000..d16cda319 Binary files /dev/null and b/content-rst/applications/hr/employees/new_employee/documents.png differ diff --git a/content-rst/applications/hr/employees/new_employee/employee-new.png b/content-rst/applications/hr/employees/new_employee/employee-new.png new file mode 100644 index 000000000..056cf9b9e Binary files /dev/null and b/content-rst/applications/hr/employees/new_employee/employee-new.png differ diff --git a/content-rst/applications/hr/employees/new_employee/hr-settings.png b/content-rst/applications/hr/employees/new_employee/hr-settings.png new file mode 100644 index 000000000..6ab67b66c Binary files /dev/null and b/content-rst/applications/hr/employees/new_employee/hr-settings.png differ diff --git a/content-rst/applications/hr/employees/new_employee/job-description-fields.png b/content-rst/applications/hr/employees/new_employee/job-description-fields.png new file mode 100644 index 000000000..8636c4f64 Binary files /dev/null and b/content-rst/applications/hr/employees/new_employee/job-description-fields.png differ diff --git a/content-rst/applications/hr/employees/new_employee/location.png b/content-rst/applications/hr/employees/new_employee/location.png new file mode 100644 index 000000000..99ad31a4a Binary files /dev/null and b/content-rst/applications/hr/employees/new_employee/location.png differ diff --git a/content-rst/applications/hr/employees/new_employee/math-skills.png b/content-rst/applications/hr/employees/new_employee/math-skills.png new file mode 100644 index 000000000..d75dfd21e Binary files /dev/null and b/content-rst/applications/hr/employees/new_employee/math-skills.png differ diff --git a/content-rst/applications/hr/employees/new_employee/new-employee-form.png b/content-rst/applications/hr/employees/new_employee/new-employee-form.png new file mode 100644 index 000000000..16ba08e55 Binary files /dev/null and b/content-rst/applications/hr/employees/new_employee/new-employee-form.png differ diff --git a/content-rst/applications/hr/employees/new_employee/resume-lines.png b/content-rst/applications/hr/employees/new_employee/resume-lines.png new file mode 100644 index 000000000..ca225aa3d Binary files /dev/null and b/content-rst/applications/hr/employees/new_employee/resume-lines.png differ diff --git a/content-rst/applications/hr/employees/new_employee/select-skills.png b/content-rst/applications/hr/employees/new_employee/select-skills.png new file mode 100644 index 000000000..ee7ec1b3b Binary files /dev/null and b/content-rst/applications/hr/employees/new_employee/select-skills.png differ diff --git a/content/applications/hr/employees/offboarding.rst b/content-rst/applications/hr/employees/offboarding.rst similarity index 100% rename from content/applications/hr/employees/offboarding.rst rename to content-rst/applications/hr/employees/offboarding.rst diff --git a/content-rst/applications/hr/employees/offboarding/termination.png b/content-rst/applications/hr/employees/offboarding/termination.png new file mode 100644 index 000000000..22f82b58b Binary files /dev/null and b/content-rst/applications/hr/employees/offboarding/termination.png differ diff --git a/content/applications/hr/employees/retention_report.rst b/content-rst/applications/hr/employees/retention_report.rst similarity index 100% rename from content/applications/hr/employees/retention_report.rst rename to content-rst/applications/hr/employees/retention_report.rst diff --git a/content-rst/applications/hr/employees/retention_report/comparison-years.png b/content-rst/applications/hr/employees/retention_report/comparison-years.png new file mode 100644 index 000000000..3bc20b27a Binary files /dev/null and b/content-rst/applications/hr/employees/retention_report/comparison-years.png differ diff --git a/content-rst/applications/hr/employees/retention_report/department-totals.png b/content-rst/applications/hr/employees/retention_report/department-totals.png new file mode 100644 index 000000000..1c4abb9ed Binary files /dev/null and b/content-rst/applications/hr/employees/retention_report/department-totals.png differ diff --git a/content-rst/applications/hr/employees/retention_report/employees-analysis.png b/content-rst/applications/hr/employees/retention_report/employees-analysis.png new file mode 100644 index 000000000..f4a82c8ed Binary files /dev/null and b/content-rst/applications/hr/employees/retention_report/employees-analysis.png differ diff --git a/content-rst/applications/hr/employees/retention_report/pivot-departures.png b/content-rst/applications/hr/employees/retention_report/pivot-departures.png new file mode 100644 index 000000000..80aff5b0e Binary files /dev/null and b/content-rst/applications/hr/employees/retention_report/pivot-departures.png differ diff --git a/content/applications/hr/fleet.rst b/content-rst/applications/hr/fleet.rst similarity index 100% rename from content/applications/hr/fleet.rst rename to content-rst/applications/hr/fleet.rst diff --git a/content/applications/hr/fleet/accidents.rst b/content-rst/applications/hr/fleet/accidents.rst similarity index 100% rename from content/applications/hr/fleet/accidents.rst rename to content-rst/applications/hr/fleet/accidents.rst diff --git a/content-rst/applications/hr/fleet/accidents/custom-filters.png b/content-rst/applications/hr/fleet/accidents/custom-filters.png new file mode 100644 index 000000000..60846cf2c Binary files /dev/null and b/content-rst/applications/hr/fleet/accidents/custom-filters.png differ diff --git a/content-rst/applications/hr/fleet/accidents/drag-n-drop.png b/content-rst/applications/hr/fleet/accidents/drag-n-drop.png new file mode 100644 index 000000000..848de513d Binary files /dev/null and b/content-rst/applications/hr/fleet/accidents/drag-n-drop.png differ diff --git a/content-rst/applications/hr/fleet/accidents/fleet-pivot.png b/content-rst/applications/hr/fleet/accidents/fleet-pivot.png new file mode 100644 index 000000000..cffef235a Binary files /dev/null and b/content-rst/applications/hr/fleet/accidents/fleet-pivot.png differ diff --git a/content-rst/applications/hr/fleet/accidents/group-accidents.png b/content-rst/applications/hr/fleet/accidents/group-accidents.png new file mode 100644 index 000000000..03cb66482 Binary files /dev/null and b/content-rst/applications/hr/fleet/accidents/group-accidents.png differ diff --git a/content-rst/applications/hr/fleet/accidents/running.png b/content-rst/applications/hr/fleet/accidents/running.png new file mode 100644 index 000000000..e45e21aa1 Binary files /dev/null and b/content-rst/applications/hr/fleet/accidents/running.png differ diff --git a/content-rst/applications/hr/fleet/accidents/service-form.png b/content-rst/applications/hr/fleet/accidents/service-form.png new file mode 100644 index 000000000..de9c31e98 Binary files /dev/null and b/content-rst/applications/hr/fleet/accidents/service-form.png differ diff --git a/content-rst/applications/hr/fleet/accidents/total-costs.png b/content-rst/applications/hr/fleet/accidents/total-costs.png new file mode 100644 index 000000000..2b656035e Binary files /dev/null and b/content-rst/applications/hr/fleet/accidents/total-costs.png differ diff --git a/content-rst/applications/hr/fleet/fleet-settings.png b/content-rst/applications/hr/fleet/fleet-settings.png new file mode 100644 index 000000000..28f9f1396 Binary files /dev/null and b/content-rst/applications/hr/fleet/fleet-settings.png differ diff --git a/content-rst/applications/hr/fleet/manufacturer.png b/content-rst/applications/hr/fleet/manufacturer.png new file mode 100644 index 000000000..6a0e3071f Binary files /dev/null and b/content-rst/applications/hr/fleet/manufacturer.png differ diff --git a/content/applications/hr/fleet/models.rst b/content-rst/applications/hr/fleet/models.rst similarity index 100% rename from content/applications/hr/fleet/models.rst rename to content-rst/applications/hr/fleet/models.rst diff --git a/content-rst/applications/hr/fleet/models/categories.png b/content-rst/applications/hr/fleet/models/categories.png new file mode 100644 index 000000000..d738930a9 Binary files /dev/null and b/content-rst/applications/hr/fleet/models/categories.png differ diff --git a/content-rst/applications/hr/fleet/models/vendor.png b/content-rst/applications/hr/fleet/models/vendor.png new file mode 100644 index 000000000..e601ad722 Binary files /dev/null and b/content-rst/applications/hr/fleet/models/vendor.png differ diff --git a/content/applications/hr/fleet/new_vehicle.rst b/content-rst/applications/hr/fleet/new_vehicle.rst similarity index 100% rename from content/applications/hr/fleet/new_vehicle.rst rename to content-rst/applications/hr/fleet/new_vehicle.rst diff --git a/content-rst/applications/hr/fleet/new_vehicle/contacts-address.png b/content-rst/applications/hr/fleet/new_vehicle/contacts-address.png new file mode 100644 index 000000000..1ec4d8c7e Binary files /dev/null and b/content-rst/applications/hr/fleet/new_vehicle/contacts-address.png differ diff --git a/content-rst/applications/hr/fleet/new_vehicle/create-contact.png b/content-rst/applications/hr/fleet/new_vehicle/create-contact.png new file mode 100644 index 000000000..52b8935e4 Binary files /dev/null and b/content-rst/applications/hr/fleet/new_vehicle/create-contact.png differ diff --git a/content-rst/applications/hr/fleet/new_vehicle/create-driver.png b/content-rst/applications/hr/fleet/new_vehicle/create-driver.png new file mode 100644 index 000000000..50a3b097c Binary files /dev/null and b/content-rst/applications/hr/fleet/new_vehicle/create-driver.png differ diff --git a/content-rst/applications/hr/fleet/new_vehicle/model-tab.png b/content-rst/applications/hr/fleet/new_vehicle/model-tab.png new file mode 100644 index 000000000..265f026af Binary files /dev/null and b/content-rst/applications/hr/fleet/new_vehicle/model-tab.png differ diff --git a/content-rst/applications/hr/fleet/new_vehicle/model.png b/content-rst/applications/hr/fleet/new_vehicle/model.png new file mode 100644 index 000000000..e38b5af00 Binary files /dev/null and b/content-rst/applications/hr/fleet/new_vehicle/model.png differ diff --git a/content-rst/applications/hr/fleet/new_vehicle/new-vehicle-tax.png b/content-rst/applications/hr/fleet/new_vehicle/new-vehicle-tax.png new file mode 100644 index 000000000..87b2b9525 Binary files /dev/null and b/content-rst/applications/hr/fleet/new_vehicle/new-vehicle-tax.png differ diff --git a/content-rst/applications/hr/fleet/new_vehicle/new-vehicle-type.png b/content-rst/applications/hr/fleet/new_vehicle/new-vehicle-type.png new file mode 100644 index 000000000..ded83bd90 Binary files /dev/null and b/content-rst/applications/hr/fleet/new_vehicle/new-vehicle-type.png differ diff --git a/content/applications/hr/fleet/service.rst b/content-rst/applications/hr/fleet/service.rst similarity index 100% rename from content/applications/hr/fleet/service.rst rename to content-rst/applications/hr/fleet/service.rst diff --git a/content-rst/applications/hr/fleet/service/activity-view.png b/content-rst/applications/hr/fleet/service/activity-view.png new file mode 100644 index 000000000..be4fa8602 Binary files /dev/null and b/content-rst/applications/hr/fleet/service/activity-view.png differ diff --git a/content-rst/applications/hr/fleet/service/bar-chart.png b/content-rst/applications/hr/fleet/service/bar-chart.png new file mode 100644 index 000000000..432b6c258 Binary files /dev/null and b/content-rst/applications/hr/fleet/service/bar-chart.png differ diff --git a/content-rst/applications/hr/fleet/service/contact-tab.png b/content-rst/applications/hr/fleet/service/contact-tab.png new file mode 100644 index 000000000..cad578e36 Binary files /dev/null and b/content-rst/applications/hr/fleet/service/contact-tab.png differ diff --git a/content-rst/applications/hr/fleet/service/create-vendor.png b/content-rst/applications/hr/fleet/service/create-vendor.png new file mode 100644 index 000000000..03973be05 Binary files /dev/null and b/content-rst/applications/hr/fleet/service/create-vendor.png differ diff --git a/content-rst/applications/hr/fleet/service/kanban-status.png b/content-rst/applications/hr/fleet/service/kanban-status.png new file mode 100644 index 000000000..b15023215 Binary files /dev/null and b/content-rst/applications/hr/fleet/service/kanban-status.png differ diff --git a/content-rst/applications/hr/fleet/service/kanban.png b/content-rst/applications/hr/fleet/service/kanban.png new file mode 100644 index 000000000..20ee1243a Binary files /dev/null and b/content-rst/applications/hr/fleet/service/kanban.png differ diff --git a/content-rst/applications/hr/fleet/service/new-service.png b/content-rst/applications/hr/fleet/service/new-service.png new file mode 100644 index 000000000..79285e531 Binary files /dev/null and b/content-rst/applications/hr/fleet/service/new-service.png differ diff --git a/content-rst/applications/hr/fleet/service/pivot.png b/content-rst/applications/hr/fleet/service/pivot.png new file mode 100644 index 000000000..7ffb43ea5 Binary files /dev/null and b/content-rst/applications/hr/fleet/service/pivot.png differ diff --git a/content-rst/applications/hr/fleet/service/services.png b/content-rst/applications/hr/fleet/service/services.png new file mode 100644 index 000000000..bdc8986a3 Binary files /dev/null and b/content-rst/applications/hr/fleet/service/services.png differ diff --git a/content-rst/applications/hr/fleet/service/vendor-contact.png b/content-rst/applications/hr/fleet/service/vendor-contact.png new file mode 100644 index 000000000..f52f44f3c Binary files /dev/null and b/content-rst/applications/hr/fleet/service/vendor-contact.png differ diff --git a/content-rst/applications/hr/fleet/service/views.png b/content-rst/applications/hr/fleet/service/views.png new file mode 100644 index 000000000..b178dc5c2 Binary files /dev/null and b/content-rst/applications/hr/fleet/service/views.png differ diff --git a/content/applications/hr/frontdesk.rst b/content-rst/applications/hr/frontdesk.rst similarity index 100% rename from content/applications/hr/frontdesk.rst rename to content-rst/applications/hr/frontdesk.rst diff --git a/content-rst/applications/hr/frontdesk/espresso.png b/content-rst/applications/hr/frontdesk/espresso.png new file mode 100644 index 000000000..af98dec3a Binary files /dev/null and b/content-rst/applications/hr/frontdesk/espresso.png differ diff --git a/content-rst/applications/hr/frontdesk/station-form.png b/content-rst/applications/hr/frontdesk/station-form.png new file mode 100644 index 000000000..6b1814c48 Binary files /dev/null and b/content-rst/applications/hr/frontdesk/station-form.png differ diff --git a/content/applications/hr/frontdesk/visitors.rst b/content-rst/applications/hr/frontdesk/visitors.rst similarity index 100% rename from content/applications/hr/frontdesk/visitors.rst rename to content-rst/applications/hr/frontdesk/visitors.rst diff --git a/content-rst/applications/hr/frontdesk/visitors/visitors.png b/content-rst/applications/hr/frontdesk/visitors/visitors.png new file mode 100644 index 000000000..708c6b35b Binary files /dev/null and b/content-rst/applications/hr/frontdesk/visitors/visitors.png differ diff --git a/content/applications/hr/lunch.rst b/content-rst/applications/hr/lunch.rst similarity index 100% rename from content/applications/hr/lunch.rst rename to content-rst/applications/hr/lunch.rst diff --git a/content-rst/applications/hr/lunch/alert.png b/content-rst/applications/hr/lunch/alert.png new file mode 100644 index 000000000..b46223693 Binary files /dev/null and b/content-rst/applications/hr/lunch/alert.png differ diff --git a/content-rst/applications/hr/lunch/locations.png b/content-rst/applications/hr/lunch/locations.png new file mode 100644 index 000000000..4140198b6 Binary files /dev/null and b/content-rst/applications/hr/lunch/locations.png differ diff --git a/content/applications/hr/lunch/management.rst b/content-rst/applications/hr/lunch/management.rst similarity index 100% rename from content/applications/hr/lunch/management.rst rename to content-rst/applications/hr/lunch/management.rst diff --git a/content-rst/applications/hr/lunch/management/cancel.png b/content-rst/applications/hr/lunch/management/cancel.png new file mode 100644 index 000000000..736263318 Binary files /dev/null and b/content-rst/applications/hr/lunch/management/cancel.png differ diff --git a/content-rst/applications/hr/lunch/management/confirm.png b/content-rst/applications/hr/lunch/management/confirm.png new file mode 100644 index 000000000..5a1884a11 Binary files /dev/null and b/content-rst/applications/hr/lunch/management/confirm.png differ diff --git a/content-rst/applications/hr/lunch/management/control.png b/content-rst/applications/hr/lunch/management/control.png new file mode 100644 index 000000000..5e590432f Binary files /dev/null and b/content-rst/applications/hr/lunch/management/control.png differ diff --git a/content-rst/applications/hr/lunch/management/send.png b/content-rst/applications/hr/lunch/management/send.png new file mode 100644 index 000000000..a8e0de95d Binary files /dev/null and b/content-rst/applications/hr/lunch/management/send.png differ diff --git a/content-rst/applications/hr/lunch/management/today.png b/content-rst/applications/hr/lunch/management/today.png new file mode 100644 index 000000000..44e7a9eee Binary files /dev/null and b/content-rst/applications/hr/lunch/management/today.png differ diff --git a/content/applications/hr/lunch/orders.rst b/content-rst/applications/hr/lunch/orders.rst similarity index 100% rename from content/applications/hr/lunch/orders.rst rename to content-rst/applications/hr/lunch/orders.rst diff --git a/content-rst/applications/hr/lunch/orders/dashboard.png b/content-rst/applications/hr/lunch/orders/dashboard.png new file mode 100644 index 000000000..730e27d69 Binary files /dev/null and b/content-rst/applications/hr/lunch/orders/dashboard.png differ diff --git a/content-rst/applications/hr/lunch/orders/error.png b/content-rst/applications/hr/lunch/orders/error.png new file mode 100644 index 000000000..cc7cca3a5 Binary files /dev/null and b/content-rst/applications/hr/lunch/orders/error.png differ diff --git a/content-rst/applications/hr/lunch/orders/my-account.png b/content-rst/applications/hr/lunch/orders/my-account.png new file mode 100644 index 000000000..7e9a4aa82 Binary files /dev/null and b/content-rst/applications/hr/lunch/orders/my-account.png differ diff --git a/content-rst/applications/hr/lunch/orders/my-orders.png b/content-rst/applications/hr/lunch/orders/my-orders.png new file mode 100644 index 000000000..0a5179d83 Binary files /dev/null and b/content-rst/applications/hr/lunch/orders/my-orders.png differ diff --git a/content-rst/applications/hr/lunch/orders/pizza.png b/content-rst/applications/hr/lunch/orders/pizza.png new file mode 100644 index 000000000..9e56b68ec Binary files /dev/null and b/content-rst/applications/hr/lunch/orders/pizza.png differ diff --git a/content-rst/applications/hr/lunch/orders/your-order.png b/content-rst/applications/hr/lunch/orders/your-order.png new file mode 100644 index 000000000..66cd2ddea Binary files /dev/null and b/content-rst/applications/hr/lunch/orders/your-order.png differ diff --git a/content/applications/hr/lunch/products.rst b/content-rst/applications/hr/lunch/products.rst similarity index 100% rename from content/applications/hr/lunch/products.rst rename to content-rst/applications/hr/lunch/products.rst diff --git a/content-rst/applications/hr/lunch/products/category.png b/content-rst/applications/hr/lunch/products/category.png new file mode 100644 index 000000000..9bee324aa Binary files /dev/null and b/content-rst/applications/hr/lunch/products/category.png differ diff --git a/content-rst/applications/hr/lunch/products/product.png b/content-rst/applications/hr/lunch/products/product.png new file mode 100644 index 000000000..db7303733 Binary files /dev/null and b/content-rst/applications/hr/lunch/products/product.png differ diff --git a/content-rst/applications/hr/lunch/translation.png b/content-rst/applications/hr/lunch/translation.png new file mode 100644 index 000000000..c0706a55f Binary files /dev/null and b/content-rst/applications/hr/lunch/translation.png differ diff --git a/content/applications/hr/lunch/user-accounts.rst b/content-rst/applications/hr/lunch/user-accounts.rst similarity index 100% rename from content/applications/hr/lunch/user-accounts.rst rename to content-rst/applications/hr/lunch/user-accounts.rst diff --git a/content-rst/applications/hr/lunch/user-accounts/cash-move-form.png b/content-rst/applications/hr/lunch/user-accounts/cash-move-form.png new file mode 100644 index 000000000..9734c1e13 Binary files /dev/null and b/content-rst/applications/hr/lunch/user-accounts/cash-move-form.png differ diff --git a/content-rst/applications/hr/lunch/user-accounts/cash.png b/content-rst/applications/hr/lunch/user-accounts/cash.png new file mode 100644 index 000000000..6034b1fd1 Binary files /dev/null and b/content-rst/applications/hr/lunch/user-accounts/cash.png differ diff --git a/content-rst/applications/hr/lunch/user-accounts/control-accounts.png b/content-rst/applications/hr/lunch/user-accounts/control-accounts.png new file mode 100644 index 000000000..662f15d52 Binary files /dev/null and b/content-rst/applications/hr/lunch/user-accounts/control-accounts.png differ diff --git a/content/applications/hr/lunch/vendors.rst b/content-rst/applications/hr/lunch/vendors.rst similarity index 100% rename from content/applications/hr/lunch/vendors.rst rename to content-rst/applications/hr/lunch/vendors.rst diff --git a/content-rst/applications/hr/lunch/vendors/availability.png b/content-rst/applications/hr/lunch/vendors/availability.png new file mode 100644 index 000000000..aad21232b Binary files /dev/null and b/content-rst/applications/hr/lunch/vendors/availability.png differ diff --git a/content-rst/applications/hr/lunch/vendors/beverages.png b/content-rst/applications/hr/lunch/vendors/beverages.png new file mode 100644 index 000000000..809160dce Binary files /dev/null and b/content-rst/applications/hr/lunch/vendors/beverages.png differ diff --git a/content-rst/applications/hr/lunch/vendors/extras.png b/content-rst/applications/hr/lunch/vendors/extras.png new file mode 100644 index 000000000..60b46ad26 Binary files /dev/null and b/content-rst/applications/hr/lunch/vendors/extras.png differ diff --git a/content-rst/applications/hr/lunch/vendors/orders.png b/content-rst/applications/hr/lunch/vendors/orders.png new file mode 100644 index 000000000..8ca166247 Binary files /dev/null and b/content-rst/applications/hr/lunch/vendors/orders.png differ diff --git a/content-rst/applications/hr/lunch/vendors/vendor-info.png b/content-rst/applications/hr/lunch/vendors/vendor-info.png new file mode 100644 index 000000000..7905499cd Binary files /dev/null and b/content-rst/applications/hr/lunch/vendors/vendor-info.png differ diff --git a/content/applications/hr/payroll.rst b/content-rst/applications/hr/payroll.rst similarity index 100% rename from content/applications/hr/payroll.rst rename to content-rst/applications/hr/payroll.rst diff --git a/content-rst/applications/hr/payroll/benefits.png b/content-rst/applications/hr/payroll/benefits.png new file mode 100644 index 000000000..c90e9bbad Binary files /dev/null and b/content-rst/applications/hr/payroll/benefits.png differ diff --git a/content-rst/applications/hr/payroll/contract-template.png b/content-rst/applications/hr/payroll/contract-template.png new file mode 100644 index 000000000..b373b92d0 Binary files /dev/null and b/content-rst/applications/hr/payroll/contract-template.png differ diff --git a/content/applications/hr/payroll/contracts.rst b/content-rst/applications/hr/payroll/contracts.rst similarity index 100% rename from content/applications/hr/payroll/contracts.rst rename to content-rst/applications/hr/payroll/contracts.rst diff --git a/content-rst/applications/hr/payroll/contracts/contract-details.png b/content-rst/applications/hr/payroll/contracts/contract-details.png new file mode 100644 index 000000000..89eec27a9 Binary files /dev/null and b/content-rst/applications/hr/payroll/contracts/contract-details.png differ diff --git a/content-rst/applications/hr/payroll/contracts/contracts-overview.png b/content-rst/applications/hr/payroll/contracts/contracts-overview.png new file mode 100644 index 000000000..eaad0fcb6 Binary files /dev/null and b/content-rst/applications/hr/payroll/contracts/contracts-overview.png differ diff --git a/content-rst/applications/hr/payroll/contracts/garnishment.png b/content-rst/applications/hr/payroll/contracts/garnishment.png new file mode 100644 index 000000000..b5b78c3ed Binary files /dev/null and b/content-rst/applications/hr/payroll/contracts/garnishment.png differ diff --git a/content-rst/applications/hr/payroll/contracts/required-fields.png b/content-rst/applications/hr/payroll/contracts/required-fields.png new file mode 100644 index 000000000..648ab76bb Binary files /dev/null and b/content-rst/applications/hr/payroll/contracts/required-fields.png differ diff --git a/content-rst/applications/hr/payroll/contracts/salary-info.png b/content-rst/applications/hr/payroll/contracts/salary-info.png new file mode 100644 index 000000000..6e98b1e0a Binary files /dev/null and b/content-rst/applications/hr/payroll/contracts/salary-info.png differ diff --git a/content-rst/applications/hr/payroll/contracts/send-contract.png b/content-rst/applications/hr/payroll/contracts/send-contract.png new file mode 100644 index 000000000..3a0a2846d Binary files /dev/null and b/content-rst/applications/hr/payroll/contracts/send-contract.png differ diff --git a/content-rst/applications/hr/payroll/employment-types.png b/content-rst/applications/hr/payroll/employment-types.png new file mode 100644 index 000000000..f65f2ab29 Binary files /dev/null and b/content-rst/applications/hr/payroll/employment-types.png differ diff --git a/content-rst/applications/hr/payroll/input-type-new.png b/content-rst/applications/hr/payroll/input-type-new.png new file mode 100644 index 000000000..44cf9adb3 Binary files /dev/null and b/content-rst/applications/hr/payroll/input-type-new.png differ diff --git a/content-rst/applications/hr/payroll/job-positions.png b/content-rst/applications/hr/payroll/job-positions.png new file mode 100644 index 000000000..533ea6a64 Binary files /dev/null and b/content-rst/applications/hr/payroll/job-positions.png differ diff --git a/content-rst/applications/hr/payroll/new-benefit.png b/content-rst/applications/hr/payroll/new-benefit.png new file mode 100644 index 000000000..3d1e6ced0 Binary files /dev/null and b/content-rst/applications/hr/payroll/new-benefit.png differ diff --git a/content-rst/applications/hr/payroll/new-rule.png b/content-rst/applications/hr/payroll/new-rule.png new file mode 100644 index 000000000..e5d98ad52 Binary files /dev/null and b/content-rst/applications/hr/payroll/new-rule.png differ diff --git a/content-rst/applications/hr/payroll/new-structure.png b/content-rst/applications/hr/payroll/new-structure.png new file mode 100644 index 000000000..c3d02d38e Binary files /dev/null and b/content-rst/applications/hr/payroll/new-structure.png differ diff --git a/content-rst/applications/hr/payroll/new-work-entry-type.png b/content-rst/applications/hr/payroll/new-work-entry-type.png new file mode 100644 index 000000000..9f12c8b8b Binary files /dev/null and b/content-rst/applications/hr/payroll/new-work-entry-type.png differ diff --git a/content-rst/applications/hr/payroll/new-working-schedule.png b/content-rst/applications/hr/payroll/new-working-schedule.png new file mode 100644 index 000000000..4d43c660a Binary files /dev/null and b/content-rst/applications/hr/payroll/new-working-schedule.png differ diff --git a/content-rst/applications/hr/payroll/other-input.png b/content-rst/applications/hr/payroll/other-input.png new file mode 100644 index 000000000..89534b203 Binary files /dev/null and b/content-rst/applications/hr/payroll/other-input.png differ diff --git a/content/applications/hr/payroll/payslips.rst b/content-rst/applications/hr/payroll/payslips.rst similarity index 100% rename from content/applications/hr/payroll/payslips.rst rename to content-rst/applications/hr/payroll/payslips.rst diff --git a/content-rst/applications/hr/payroll/payslips/all-pay-slips.png b/content-rst/applications/hr/payroll/payslips/all-pay-slips.png new file mode 100644 index 000000000..1f99b48fe Binary files /dev/null and b/content-rst/applications/hr/payroll/payslips/all-pay-slips.png differ diff --git a/content-rst/applications/hr/payroll/payslips/all-payslips.png b/content-rst/applications/hr/payroll/payslips/all-payslips.png new file mode 100644 index 000000000..14ea99656 Binary files /dev/null and b/content-rst/applications/hr/payroll/payslips/all-payslips.png differ diff --git a/content-rst/applications/hr/payroll/payslips/banking.png b/content-rst/applications/hr/payroll/payslips/banking.png new file mode 100644 index 000000000..bc37ea68a Binary files /dev/null and b/content-rst/applications/hr/payroll/payslips/banking.png differ diff --git a/content-rst/applications/hr/payroll/payslips/batch-confirmed.png b/content-rst/applications/hr/payroll/payslips/batch-confirmed.png new file mode 100644 index 000000000..7a8daad89 Binary files /dev/null and b/content-rst/applications/hr/payroll/payslips/batch-confirmed.png differ diff --git a/content-rst/applications/hr/payroll/payslips/batch-done.png b/content-rst/applications/hr/payroll/payslips/batch-done.png new file mode 100644 index 000000000..c7d94a61c Binary files /dev/null and b/content-rst/applications/hr/payroll/payslips/batch-done.png differ diff --git a/content-rst/applications/hr/payroll/payslips/batch-new.png b/content-rst/applications/hr/payroll/payslips/batch-new.png new file mode 100644 index 000000000..cb8d43290 Binary files /dev/null and b/content-rst/applications/hr/payroll/payslips/batch-new.png differ diff --git a/content-rst/applications/hr/payroll/payslips/batch-paid-2.png b/content-rst/applications/hr/payroll/payslips/batch-paid-2.png new file mode 100644 index 000000000..eab1dd909 Binary files /dev/null and b/content-rst/applications/hr/payroll/payslips/batch-paid-2.png differ diff --git a/content-rst/applications/hr/payroll/payslips/batches.png b/content-rst/applications/hr/payroll/payslips/batches.png new file mode 100644 index 000000000..214647637 Binary files /dev/null and b/content-rst/applications/hr/payroll/payslips/batches.png differ diff --git a/content-rst/applications/hr/payroll/payslips/commission-details.png b/content-rst/applications/hr/payroll/payslips/commission-details.png new file mode 100644 index 000000000..366a67489 Binary files /dev/null and b/content-rst/applications/hr/payroll/payslips/commission-details.png differ diff --git a/content-rst/applications/hr/payroll/payslips/export-select.png b/content-rst/applications/hr/payroll/payslips/export-select.png new file mode 100644 index 000000000..ea9623362 Binary files /dev/null and b/content-rst/applications/hr/payroll/payslips/export-select.png differ diff --git a/content-rst/applications/hr/payroll/payslips/export.png b/content-rst/applications/hr/payroll/payslips/export.png new file mode 100644 index 000000000..50121bcd1 Binary files /dev/null and b/content-rst/applications/hr/payroll/payslips/export.png differ diff --git a/content-rst/applications/hr/payroll/payslips/new-batch-details.png b/content-rst/applications/hr/payroll/payslips/new-batch-details.png new file mode 100644 index 000000000..b5bff78e2 Binary files /dev/null and b/content-rst/applications/hr/payroll/payslips/new-batch-details.png differ diff --git a/content-rst/applications/hr/payroll/payslips/new-payslip.png b/content-rst/applications/hr/payroll/payslips/new-payslip.png new file mode 100644 index 000000000..496c1a46e Binary files /dev/null and b/content-rst/applications/hr/payroll/payslips/new-payslip.png differ diff --git a/content-rst/applications/hr/payroll/payslips/other-info-tab.png b/content-rst/applications/hr/payroll/payslips/other-info-tab.png new file mode 100644 index 000000000..006981898 Binary files /dev/null and b/content-rst/applications/hr/payroll/payslips/other-info-tab.png differ diff --git a/content-rst/applications/hr/payroll/payslips/payslip-chatter.png b/content-rst/applications/hr/payroll/payslips/payslip-chatter.png new file mode 100644 index 000000000..a4b9d4a43 Binary files /dev/null and b/content-rst/applications/hr/payroll/payslips/payslip-chatter.png differ diff --git a/content-rst/applications/hr/payroll/payslips/payslips.png b/content-rst/applications/hr/payroll/payslips/payslips.png new file mode 100644 index 000000000..25b9dc894 Binary files /dev/null and b/content-rst/applications/hr/payroll/payslips/payslips.png differ diff --git a/content-rst/applications/hr/payroll/payslips/salary-comp-tab.png b/content-rst/applications/hr/payroll/payslips/salary-comp-tab.png new file mode 100644 index 000000000..bf53868c9 Binary files /dev/null and b/content-rst/applications/hr/payroll/payslips/salary-comp-tab.png differ diff --git a/content-rst/applications/hr/payroll/payslips/warnings.png b/content-rst/applications/hr/payroll/payslips/warnings.png new file mode 100644 index 000000000..7012a2e7c Binary files /dev/null and b/content-rst/applications/hr/payroll/payslips/warnings.png differ diff --git a/content-rst/applications/hr/payroll/payslips/worked-days-tab.png b/content-rst/applications/hr/payroll/payslips/worked-days-tab.png new file mode 100644 index 000000000..7c5b463c2 Binary files /dev/null and b/content-rst/applications/hr/payroll/payslips/worked-days-tab.png differ diff --git a/content-rst/applications/hr/payroll/personal-info.png b/content-rst/applications/hr/payroll/personal-info.png new file mode 100644 index 000000000..c1ee3d379 Binary files /dev/null and b/content-rst/applications/hr/payroll/personal-info.png differ diff --git a/content-rst/applications/hr/payroll/personal-new.png b/content-rst/applications/hr/payroll/personal-new.png new file mode 100644 index 000000000..4c57ad4d8 Binary files /dev/null and b/content-rst/applications/hr/payroll/personal-new.png differ diff --git a/content/applications/hr/payroll/reporting.rst b/content-rst/applications/hr/payroll/reporting.rst similarity index 100% rename from content/applications/hr/payroll/reporting.rst rename to content-rst/applications/hr/payroll/reporting.rst diff --git a/content-rst/applications/hr/payroll/reporting/bar-chart.png b/content-rst/applications/hr/payroll/reporting/bar-chart.png new file mode 100644 index 000000000..f465eb46b Binary files /dev/null and b/content-rst/applications/hr/payroll/reporting/bar-chart.png differ diff --git a/content-rst/applications/hr/payroll/reporting/custom-filter.png b/content-rst/applications/hr/payroll/reporting/custom-filter.png new file mode 100644 index 000000000..2fd1098bc Binary files /dev/null and b/content-rst/applications/hr/payroll/reporting/custom-filter.png differ diff --git a/content-rst/applications/hr/payroll/reporting/line-chart.png b/content-rst/applications/hr/payroll/reporting/line-chart.png new file mode 100644 index 000000000..71d7885bf Binary files /dev/null and b/content-rst/applications/hr/payroll/reporting/line-chart.png differ diff --git a/content-rst/applications/hr/payroll/reporting/measures.png b/content-rst/applications/hr/payroll/reporting/measures.png new file mode 100644 index 000000000..6fdb88daf Binary files /dev/null and b/content-rst/applications/hr/payroll/reporting/measures.png differ diff --git a/content-rst/applications/hr/payroll/reporting/payroll-report.png b/content-rst/applications/hr/payroll/reporting/payroll-report.png new file mode 100644 index 000000000..7e0bce00f Binary files /dev/null and b/content-rst/applications/hr/payroll/reporting/payroll-report.png differ diff --git a/content-rst/applications/hr/payroll/reporting/pie-chart.png b/content-rst/applications/hr/payroll/reporting/pie-chart.png new file mode 100644 index 000000000..04fe2df25 Binary files /dev/null and b/content-rst/applications/hr/payroll/reporting/pie-chart.png differ diff --git a/content-rst/applications/hr/payroll/reporting/pivot.png b/content-rst/applications/hr/payroll/reporting/pivot.png new file mode 100644 index 000000000..e8c595409 Binary files /dev/null and b/content-rst/applications/hr/payroll/reporting/pivot.png differ diff --git a/content-rst/applications/hr/payroll/reporting/reports.png b/content-rst/applications/hr/payroll/reporting/reports.png new file mode 100644 index 000000000..250c321ab Binary files /dev/null and b/content-rst/applications/hr/payroll/reporting/reports.png differ diff --git a/content-rst/applications/hr/payroll/reporting/spreadsheet.png b/content-rst/applications/hr/payroll/reporting/spreadsheet.png new file mode 100644 index 000000000..006014946 Binary files /dev/null and b/content-rst/applications/hr/payroll/reporting/spreadsheet.png differ diff --git a/content-rst/applications/hr/payroll/reporting/xlsx.png b/content-rst/applications/hr/payroll/reporting/xlsx.png new file mode 100644 index 000000000..b064238a7 Binary files /dev/null and b/content-rst/applications/hr/payroll/reporting/xlsx.png differ diff --git a/content-rst/applications/hr/payroll/resume-net.png b/content-rst/applications/hr/payroll/resume-net.png new file mode 100644 index 000000000..d3ddd6153 Binary files /dev/null and b/content-rst/applications/hr/payroll/resume-net.png differ diff --git a/content-rst/applications/hr/payroll/salary-information.png b/content-rst/applications/hr/payroll/salary-information.png new file mode 100644 index 000000000..298d13d2b Binary files /dev/null and b/content-rst/applications/hr/payroll/salary-information.png differ diff --git a/content-rst/applications/hr/payroll/salary-structure.png b/content-rst/applications/hr/payroll/salary-structure.png new file mode 100644 index 000000000..6e41aa5e3 Binary files /dev/null and b/content-rst/applications/hr/payroll/salary-structure.png differ diff --git a/content/applications/hr/payroll/salary_attachment.rst b/content-rst/applications/hr/payroll/salary_attachment.rst similarity index 100% rename from content/applications/hr/payroll/salary_attachment.rst rename to content-rst/applications/hr/payroll/salary_attachment.rst diff --git a/content-rst/applications/hr/payroll/salary_attachment/comparison-attachment.png b/content-rst/applications/hr/payroll/salary_attachment/comparison-attachment.png new file mode 100644 index 000000000..d43e8d944 Binary files /dev/null and b/content-rst/applications/hr/payroll/salary_attachment/comparison-attachment.png differ diff --git a/content-rst/applications/hr/payroll/salary_attachment/salary-attachment.png b/content-rst/applications/hr/payroll/salary_attachment/salary-attachment.png new file mode 100644 index 000000000..cd6106c3e Binary files /dev/null and b/content-rst/applications/hr/payroll/salary_attachment/salary-attachment.png differ diff --git a/content/applications/hr/payroll/salary_attachments.rst b/content-rst/applications/hr/payroll/salary_attachments.rst similarity index 100% rename from content/applications/hr/payroll/salary_attachments.rst rename to content-rst/applications/hr/payroll/salary_attachments.rst diff --git a/content-rst/applications/hr/payroll/salary_attachments/attachment-types.png b/content-rst/applications/hr/payroll/salary_attachments/attachment-types.png new file mode 100644 index 000000000..455daca78 Binary files /dev/null and b/content-rst/applications/hr/payroll/salary_attachments/attachment-types.png differ diff --git a/content-rst/applications/hr/payroll/salary_attachments/salary-attachment-form.png b/content-rst/applications/hr/payroll/salary_attachments/salary-attachment-form.png new file mode 100644 index 000000000..e3aa05900 Binary files /dev/null and b/content-rst/applications/hr/payroll/salary_attachments/salary-attachment-form.png differ diff --git a/content-rst/applications/hr/payroll/structure-regular-pay-rules.png b/content-rst/applications/hr/payroll/structure-regular-pay-rules.png new file mode 100644 index 000000000..07f34b4af Binary files /dev/null and b/content-rst/applications/hr/payroll/structure-regular-pay-rules.png differ diff --git a/content-rst/applications/hr/payroll/structure-type.png b/content-rst/applications/hr/payroll/structure-type.png new file mode 100644 index 000000000..b3b96f18a Binary files /dev/null and b/content-rst/applications/hr/payroll/structure-type.png differ diff --git a/content-rst/applications/hr/payroll/work-entry-types.png b/content-rst/applications/hr/payroll/work-entry-types.png new file mode 100644 index 000000000..829ce9215 Binary files /dev/null and b/content-rst/applications/hr/payroll/work-entry-types.png differ diff --git a/content/applications/hr/payroll/work_entries.rst b/content-rst/applications/hr/payroll/work_entries.rst similarity index 100% rename from content/applications/hr/payroll/work_entries.rst rename to content-rst/applications/hr/payroll/work_entries.rst diff --git a/content-rst/applications/hr/payroll/work_entries/batch-defer.png b/content-rst/applications/hr/payroll/work_entries/batch-defer.png new file mode 100644 index 000000000..07b38e8c8 Binary files /dev/null and b/content-rst/applications/hr/payroll/work_entries/batch-defer.png differ diff --git a/content-rst/applications/hr/payroll/work_entries/conflict-details.png b/content-rst/applications/hr/payroll/work_entries/conflict-details.png new file mode 100644 index 000000000..6a64f5b61 Binary files /dev/null and b/content-rst/applications/hr/payroll/work_entries/conflict-details.png differ diff --git a/content-rst/applications/hr/payroll/work_entries/conflict-pop-up.png b/content-rst/applications/hr/payroll/work_entries/conflict-pop-up.png new file mode 100644 index 000000000..fab9235c7 Binary files /dev/null and b/content-rst/applications/hr/payroll/work_entries/conflict-pop-up.png differ diff --git a/content-rst/applications/hr/payroll/work_entries/create.png b/content-rst/applications/hr/payroll/work_entries/create.png new file mode 100644 index 000000000..58638b800 Binary files /dev/null and b/content-rst/applications/hr/payroll/work_entries/create.png differ diff --git a/content-rst/applications/hr/payroll/work_entries/generate-payslips.png b/content-rst/applications/hr/payroll/work_entries/generate-payslips.png new file mode 100644 index 000000000..05790e0c4 Binary files /dev/null and b/content-rst/applications/hr/payroll/work_entries/generate-payslips.png differ diff --git a/content-rst/applications/hr/payroll/work_entries/print-payslips.png b/content-rst/applications/hr/payroll/work_entries/print-payslips.png new file mode 100644 index 000000000..e2b6d1d63 Binary files /dev/null and b/content-rst/applications/hr/payroll/work_entries/print-payslips.png differ diff --git a/content-rst/applications/hr/payroll/work_entries/regenerate-details.png b/content-rst/applications/hr/payroll/work_entries/regenerate-details.png new file mode 100644 index 000000000..e3d316e8d Binary files /dev/null and b/content-rst/applications/hr/payroll/work_entries/regenerate-details.png differ diff --git a/content-rst/applications/hr/payroll/work_entries/single-defer.png b/content-rst/applications/hr/payroll/work_entries/single-defer.png new file mode 100644 index 000000000..8d2e35aeb Binary files /dev/null and b/content-rst/applications/hr/payroll/work_entries/single-defer.png differ diff --git a/content-rst/applications/hr/payroll/work_entries/time-off-details.png b/content-rst/applications/hr/payroll/work_entries/time-off-details.png new file mode 100644 index 000000000..23cf54486 Binary files /dev/null and b/content-rst/applications/hr/payroll/work_entries/time-off-details.png differ diff --git a/content-rst/applications/hr/payroll/work_entries/time-off-to-report.png b/content-rst/applications/hr/payroll/work_entries/time-off-to-report.png new file mode 100644 index 000000000..d9475dd71 Binary files /dev/null and b/content-rst/applications/hr/payroll/work_entries/time-off-to-report.png differ diff --git a/content-rst/applications/hr/payroll/work_entries/work-entries-overview.png b/content-rst/applications/hr/payroll/work_entries/work-entries-overview.png new file mode 100644 index 000000000..4bc836f68 Binary files /dev/null and b/content-rst/applications/hr/payroll/work_entries/work-entries-overview.png differ diff --git a/content/applications/hr/payroll/work_entry_analysis.rst b/content-rst/applications/hr/payroll/work_entry_analysis.rst similarity index 100% rename from content/applications/hr/payroll/work_entry_analysis.rst rename to content-rst/applications/hr/payroll/work_entry_analysis.rst diff --git a/content-rst/applications/hr/payroll/work_entry_analysis/variation.png b/content-rst/applications/hr/payroll/work_entry_analysis/variation.png new file mode 100644 index 000000000..51dba8875 Binary files /dev/null and b/content-rst/applications/hr/payroll/work_entry_analysis/variation.png differ diff --git a/content-rst/applications/hr/payroll/work_entry_analysis/work-entry-comparison.png b/content-rst/applications/hr/payroll/work_entry_analysis/work-entry-comparison.png new file mode 100644 index 000000000..169a8a099 Binary files /dev/null and b/content-rst/applications/hr/payroll/work_entry_analysis/work-entry-comparison.png differ diff --git a/content-rst/applications/hr/payroll/working-schedules.png b/content-rst/applications/hr/payroll/working-schedules.png new file mode 100644 index 000000000..e1c7e8a46 Binary files /dev/null and b/content-rst/applications/hr/payroll/working-schedules.png differ diff --git a/content/applications/hr/recruitment.rst b/content-rst/applications/hr/recruitment.rst similarity index 100% rename from content/applications/hr/recruitment.rst rename to content-rst/applications/hr/recruitment.rst diff --git a/content-rst/applications/hr/recruitment/add-column.png b/content-rst/applications/hr/recruitment/add-column.png new file mode 100644 index 000000000..32cc00556 Binary files /dev/null and b/content-rst/applications/hr/recruitment/add-column.png differ diff --git a/content/applications/hr/recruitment/add-new-applicants.rst b/content-rst/applications/hr/recruitment/add-new-applicants.rst similarity index 100% rename from content/applications/hr/recruitment/add-new-applicants.rst rename to content-rst/applications/hr/recruitment/add-new-applicants.rst diff --git a/content-rst/applications/hr/recruitment/add-new-applicants/new-applicant.png b/content-rst/applications/hr/recruitment/add-new-applicants/new-applicant.png new file mode 100644 index 000000000..71197b25e Binary files /dev/null and b/content-rst/applications/hr/recruitment/add-new-applicants/new-applicant.png differ diff --git a/content-rst/applications/hr/recruitment/add-new-applicants/quick-add.png b/content-rst/applications/hr/recruitment/add-new-applicants/quick-add.png new file mode 100644 index 000000000..7377f1340 Binary files /dev/null and b/content-rst/applications/hr/recruitment/add-new-applicants/quick-add.png differ diff --git a/content-rst/applications/hr/recruitment/cv-display.png b/content-rst/applications/hr/recruitment/cv-display.png new file mode 100644 index 000000000..c5bc3cb55 Binary files /dev/null and b/content-rst/applications/hr/recruitment/cv-display.png differ diff --git a/content-rst/applications/hr/recruitment/full-composer.png b/content-rst/applications/hr/recruitment/full-composer.png new file mode 100644 index 000000000..6d44c2f3e Binary files /dev/null and b/content-rst/applications/hr/recruitment/full-composer.png differ diff --git a/content-rst/applications/hr/recruitment/gear.png b/content-rst/applications/hr/recruitment/gear.png new file mode 100644 index 000000000..f33dd957e Binary files /dev/null and b/content-rst/applications/hr/recruitment/gear.png differ diff --git a/content-rst/applications/hr/recruitment/new-applicants-button.png b/content-rst/applications/hr/recruitment/new-applicants-button.png new file mode 100644 index 000000000..a9db03531 Binary files /dev/null and b/content-rst/applications/hr/recruitment/new-applicants-button.png differ diff --git a/content/applications/hr/recruitment/new_job.rst b/content-rst/applications/hr/recruitment/new_job.rst similarity index 100% rename from content/applications/hr/recruitment/new_job.rst rename to content-rst/applications/hr/recruitment/new_job.rst diff --git a/content-rst/applications/hr/recruitment/new_job/blank-interview-form.png b/content-rst/applications/hr/recruitment/new_job/blank-interview-form.png new file mode 100644 index 000000000..5ed5b6b56 Binary files /dev/null and b/content-rst/applications/hr/recruitment/new_job/blank-interview-form.png differ diff --git a/content-rst/applications/hr/recruitment/new_job/edit-job.png b/content-rst/applications/hr/recruitment/new_job/edit-job.png new file mode 100644 index 000000000..93d6c6961 Binary files /dev/null and b/content-rst/applications/hr/recruitment/new_job/edit-job.png differ diff --git a/content-rst/applications/hr/recruitment/new_job/job-title.png b/content-rst/applications/hr/recruitment/new_job/job-title.png new file mode 100644 index 000000000..15dcd0f4b Binary files /dev/null and b/content-rst/applications/hr/recruitment/new_job/job-title.png differ diff --git a/content-rst/applications/hr/recruitment/new_job/jobs.png b/content-rst/applications/hr/recruitment/new_job/jobs.png new file mode 100644 index 000000000..361d68d02 Binary files /dev/null and b/content-rst/applications/hr/recruitment/new_job/jobs.png differ diff --git a/content-rst/applications/hr/recruitment/new_job/recruitment-tab.png b/content-rst/applications/hr/recruitment/new_job/recruitment-tab.png new file mode 100644 index 000000000..75f237a0d Binary files /dev/null and b/content-rst/applications/hr/recruitment/new_job/recruitment-tab.png differ diff --git a/content/applications/hr/recruitment/offer_job_positions.rst b/content-rst/applications/hr/recruitment/offer_job_positions.rst similarity index 100% rename from content/applications/hr/recruitment/offer_job_positions.rst rename to content-rst/applications/hr/recruitment/offer_job_positions.rst diff --git a/content-rst/applications/hr/recruitment/offer_job_positions/hired.png b/content-rst/applications/hr/recruitment/offer_job_positions/hired.png new file mode 100644 index 000000000..1e60e2ff2 Binary files /dev/null and b/content-rst/applications/hr/recruitment/offer_job_positions/hired.png differ diff --git a/content-rst/applications/hr/recruitment/offer_job_positions/send-offer.png b/content-rst/applications/hr/recruitment/offer_job_positions/send-offer.png new file mode 100644 index 000000000..6e4cadc4d Binary files /dev/null and b/content-rst/applications/hr/recruitment/offer_job_positions/send-offer.png differ diff --git a/content/applications/hr/recruitment/recruitment-flow.rst b/content-rst/applications/hr/recruitment/recruitment-flow.rst similarity index 100% rename from content/applications/hr/recruitment/recruitment-flow.rst rename to content-rst/applications/hr/recruitment/recruitment-flow.rst diff --git a/content-rst/applications/hr/recruitment/recruitment-flow/move.png b/content-rst/applications/hr/recruitment/recruitment-flow/move.png new file mode 100644 index 000000000..e1b51993b Binary files /dev/null and b/content-rst/applications/hr/recruitment/recruitment-flow/move.png differ diff --git a/content-rst/applications/hr/recruitment/recruitment-flow/send-survey.png b/content-rst/applications/hr/recruitment/recruitment-flow/send-survey.png new file mode 100644 index 000000000..d78efc02e Binary files /dev/null and b/content-rst/applications/hr/recruitment/recruitment-flow/send-survey.png differ diff --git a/content-rst/applications/hr/recruitment/recruitment-flow/stage-change.png b/content-rst/applications/hr/recruitment/recruitment-flow/stage-change.png new file mode 100644 index 000000000..3f7e1462a Binary files /dev/null and b/content-rst/applications/hr/recruitment/recruitment-flow/stage-change.png differ diff --git a/content/applications/hr/recruitment/recruitment_analysis.rst b/content-rst/applications/hr/recruitment/recruitment_analysis.rst similarity index 100% rename from content/applications/hr/recruitment/recruitment_analysis.rst rename to content-rst/applications/hr/recruitment/recruitment_analysis.rst diff --git a/content-rst/applications/hr/recruitment/recruitment_analysis/line-chart.png b/content-rst/applications/hr/recruitment/recruitment_analysis/line-chart.png new file mode 100644 index 000000000..9fc43e9b2 Binary files /dev/null and b/content-rst/applications/hr/recruitment/recruitment_analysis/line-chart.png differ diff --git a/content-rst/applications/hr/recruitment/recruitment_analysis/pivot-view.png b/content-rst/applications/hr/recruitment/recruitment_analysis/pivot-view.png new file mode 100644 index 000000000..5d9f65f67 Binary files /dev/null and b/content-rst/applications/hr/recruitment/recruitment_analysis/pivot-view.png differ diff --git a/content-rst/applications/hr/recruitment/recruitment_analysis/referral.png b/content-rst/applications/hr/recruitment/recruitment_analysis/referral.png new file mode 100644 index 000000000..6ac01d7f3 Binary files /dev/null and b/content-rst/applications/hr/recruitment/recruitment_analysis/referral.png differ diff --git a/content-rst/applications/hr/recruitment/recruitment_analysis/state.png b/content-rst/applications/hr/recruitment/recruitment_analysis/state.png new file mode 100644 index 000000000..56eac63b4 Binary files /dev/null and b/content-rst/applications/hr/recruitment/recruitment_analysis/state.png differ diff --git a/content/applications/hr/recruitment/refuse_applicant.rst b/content-rst/applications/hr/recruitment/refuse_applicant.rst similarity index 100% rename from content/applications/hr/recruitment/refuse_applicant.rst rename to content-rst/applications/hr/recruitment/refuse_applicant.rst diff --git a/content-rst/applications/hr/recruitment/refuse_applicant/refuse-pop-up.png b/content-rst/applications/hr/recruitment/refuse_applicant/refuse-pop-up.png new file mode 100644 index 000000000..ee65b94e2 Binary files /dev/null and b/content-rst/applications/hr/recruitment/refuse_applicant/refuse-pop-up.png differ diff --git a/content-rst/applications/hr/recruitment/refuse_applicant/refuse.png b/content-rst/applications/hr/recruitment/refuse_applicant/refuse.png new file mode 100644 index 000000000..9194f3fd4 Binary files /dev/null and b/content-rst/applications/hr/recruitment/refuse_applicant/refuse.png differ diff --git a/content/applications/hr/recruitment/schedule_interviews.rst b/content-rst/applications/hr/recruitment/schedule_interviews.rst similarity index 100% rename from content/applications/hr/recruitment/schedule_interviews.rst rename to content-rst/applications/hr/recruitment/schedule_interviews.rst diff --git a/content-rst/applications/hr/recruitment/schedule_interviews/calendar.png b/content-rst/applications/hr/recruitment/schedule_interviews/calendar.png new file mode 100644 index 000000000..1f3c0f44f Binary files /dev/null and b/content-rst/applications/hr/recruitment/schedule_interviews/calendar.png differ diff --git a/content-rst/applications/hr/recruitment/schedule_interviews/confirmation.png b/content-rst/applications/hr/recruitment/schedule_interviews/confirmation.png new file mode 100644 index 000000000..d2b06695b Binary files /dev/null and b/content-rst/applications/hr/recruitment/schedule_interviews/confirmation.png differ diff --git a/content-rst/applications/hr/recruitment/schedule_interviews/edit-stage.png b/content-rst/applications/hr/recruitment/schedule_interviews/edit-stage.png new file mode 100644 index 000000000..524397f34 Binary files /dev/null and b/content-rst/applications/hr/recruitment/schedule_interviews/edit-stage.png differ diff --git a/content-rst/applications/hr/recruitment/schedule_interviews/email-event.png b/content-rst/applications/hr/recruitment/schedule_interviews/email-event.png new file mode 100644 index 000000000..1eb70b43a Binary files /dev/null and b/content-rst/applications/hr/recruitment/schedule_interviews/email-event.png differ diff --git a/content-rst/applications/hr/recruitment/schedule_interviews/interview-template.png b/content-rst/applications/hr/recruitment/schedule_interviews/interview-template.png new file mode 100644 index 000000000..04653f20b Binary files /dev/null and b/content-rst/applications/hr/recruitment/schedule_interviews/interview-template.png differ diff --git a/content-rst/applications/hr/recruitment/schedule_interviews/new-event.png b/content-rst/applications/hr/recruitment/schedule_interviews/new-event.png new file mode 100644 index 000000000..a5edc34a2 Binary files /dev/null and b/content-rst/applications/hr/recruitment/schedule_interviews/new-event.png differ diff --git a/content-rst/applications/hr/recruitment/schedule_interviews/select-date-time.png b/content-rst/applications/hr/recruitment/schedule_interviews/select-date-time.png new file mode 100644 index 000000000..0528ebcc2 Binary files /dev/null and b/content-rst/applications/hr/recruitment/schedule_interviews/select-date-time.png differ diff --git a/content-rst/applications/hr/recruitment/schedule_interviews/select-interviewer.png b/content-rst/applications/hr/recruitment/schedule_interviews/select-interviewer.png new file mode 100644 index 000000000..cd003f710 Binary files /dev/null and b/content-rst/applications/hr/recruitment/schedule_interviews/select-interviewer.png differ diff --git a/content-rst/applications/hr/recruitment/schedule_interviews/send-sms.png b/content-rst/applications/hr/recruitment/schedule_interviews/send-sms.png new file mode 100644 index 000000000..8797f677f Binary files /dev/null and b/content-rst/applications/hr/recruitment/schedule_interviews/send-sms.png differ diff --git a/content-rst/applications/hr/recruitment/send-survey.png b/content-rst/applications/hr/recruitment/send-survey.png new file mode 100644 index 000000000..d78efc02e Binary files /dev/null and b/content-rst/applications/hr/recruitment/send-survey.png differ diff --git a/content/applications/hr/recruitment/source_analysis.rst b/content-rst/applications/hr/recruitment/source_analysis.rst similarity index 100% rename from content/applications/hr/recruitment/source_analysis.rst rename to content-rst/applications/hr/recruitment/source_analysis.rst diff --git a/content-rst/applications/hr/recruitment/source_analysis/medium.png b/content-rst/applications/hr/recruitment/source_analysis/medium.png new file mode 100644 index 000000000..185ebc61d Binary files /dev/null and b/content-rst/applications/hr/recruitment/source_analysis/medium.png differ diff --git a/content-rst/applications/hr/recruitment/source_analysis/source-analysis.png b/content-rst/applications/hr/recruitment/source_analysis/source-analysis.png new file mode 100644 index 000000000..1fe4e6d0c Binary files /dev/null and b/content-rst/applications/hr/recruitment/source_analysis/source-analysis.png differ diff --git a/content-rst/applications/hr/recruitment/source_analysis/source-pivot.png b/content-rst/applications/hr/recruitment/source_analysis/source-pivot.png new file mode 100644 index 000000000..fbae5883c Binary files /dev/null and b/content-rst/applications/hr/recruitment/source_analysis/source-pivot.png differ diff --git a/content-rst/applications/hr/recruitment/stages.png b/content-rst/applications/hr/recruitment/stages.png new file mode 100644 index 000000000..d4a28d50f Binary files /dev/null and b/content-rst/applications/hr/recruitment/stages.png differ diff --git a/content-rst/applications/hr/recruitment/status-dots.png b/content-rst/applications/hr/recruitment/status-dots.png new file mode 100644 index 000000000..9b9e457c2 Binary files /dev/null and b/content-rst/applications/hr/recruitment/status-dots.png differ diff --git a/content/applications/hr/recruitment/team_performance.rst b/content-rst/applications/hr/recruitment/team_performance.rst similarity index 100% rename from content/applications/hr/recruitment/team_performance.rst rename to content-rst/applications/hr/recruitment/team_performance.rst diff --git a/content-rst/applications/hr/recruitment/team_performance/by-recruiter.png b/content-rst/applications/hr/recruitment/team_performance/by-recruiter.png new file mode 100644 index 000000000..b98b8b51f Binary files /dev/null and b/content-rst/applications/hr/recruitment/team_performance/by-recruiter.png differ diff --git a/content-rst/applications/hr/recruitment/team_performance/compare.png b/content-rst/applications/hr/recruitment/team_performance/compare.png new file mode 100644 index 000000000..2da27a820 Binary files /dev/null and b/content-rst/applications/hr/recruitment/team_performance/compare.png differ diff --git a/content-rst/applications/hr/recruitment/team_performance/team-perf-pivot.png b/content-rst/applications/hr/recruitment/team_performance/team-perf-pivot.png new file mode 100644 index 000000000..da295b01e Binary files /dev/null and b/content-rst/applications/hr/recruitment/team_performance/team-perf-pivot.png differ diff --git a/content-rst/applications/hr/recruitment/team_performance/team-performance.png b/content-rst/applications/hr/recruitment/team_performance/team-performance.png new file mode 100644 index 000000000..65cc58994 Binary files /dev/null and b/content-rst/applications/hr/recruitment/team_performance/team-performance.png differ diff --git a/content/applications/hr/recruitment/time_in_stage.rst b/content-rst/applications/hr/recruitment/time_in_stage.rst similarity index 100% rename from content/applications/hr/recruitment/time_in_stage.rst rename to content-rst/applications/hr/recruitment/time_in_stage.rst diff --git a/content-rst/applications/hr/recruitment/time_in_stage/bar-chart.png b/content-rst/applications/hr/recruitment/time_in_stage/bar-chart.png new file mode 100644 index 000000000..3360d02aa Binary files /dev/null and b/content-rst/applications/hr/recruitment/time_in_stage/bar-chart.png differ diff --git a/content-rst/applications/hr/recruitment/time_in_stage/time-dates.png b/content-rst/applications/hr/recruitment/time_in_stage/time-dates.png new file mode 100644 index 000000000..7f18b16f6 Binary files /dev/null and b/content-rst/applications/hr/recruitment/time_in_stage/time-dates.png differ diff --git a/content-rst/applications/hr/recruitment/time_in_stage/time-pivot.png b/content-rst/applications/hr/recruitment/time_in_stage/time-pivot.png new file mode 100644 index 000000000..734fa0af5 Binary files /dev/null and b/content-rst/applications/hr/recruitment/time_in_stage/time-pivot.png differ diff --git a/content/applications/hr/referrals.rst b/content-rst/applications/hr/referrals.rst similarity index 100% rename from content/applications/hr/referrals.rst rename to content-rst/applications/hr/referrals.rst diff --git a/content/applications/hr/referrals/alerts.rst b/content-rst/applications/hr/referrals/alerts.rst similarity index 100% rename from content/applications/hr/referrals/alerts.rst rename to content-rst/applications/hr/referrals/alerts.rst diff --git a/content-rst/applications/hr/referrals/alerts/alert-form.png b/content-rst/applications/hr/referrals/alerts/alert-form.png new file mode 100644 index 000000000..11576f4d5 Binary files /dev/null and b/content-rst/applications/hr/referrals/alerts/alert-form.png differ diff --git a/content-rst/applications/hr/referrals/alerts/alerts.png b/content-rst/applications/hr/referrals/alerts/alerts.png new file mode 100644 index 000000000..677ec8301 Binary files /dev/null and b/content-rst/applications/hr/referrals/alerts/alerts.png differ diff --git a/content-rst/applications/hr/referrals/avatars.png b/content-rst/applications/hr/referrals/avatars.png new file mode 100644 index 000000000..bc2b899f0 Binary files /dev/null and b/content-rst/applications/hr/referrals/avatars.png differ diff --git a/content-rst/applications/hr/referrals/edit-friend.png b/content-rst/applications/hr/referrals/edit-friend.png new file mode 100644 index 000000000..5dc7fe478 Binary files /dev/null and b/content-rst/applications/hr/referrals/edit-friend.png differ diff --git a/content-rst/applications/hr/referrals/edit-onboarding.png b/content-rst/applications/hr/referrals/edit-onboarding.png new file mode 100644 index 000000000..6bfafebff Binary files /dev/null and b/content-rst/applications/hr/referrals/edit-onboarding.png differ diff --git a/content-rst/applications/hr/referrals/level-up.png b/content-rst/applications/hr/referrals/level-up.png new file mode 100644 index 000000000..e3583d7d2 Binary files /dev/null and b/content-rst/applications/hr/referrals/level-up.png differ diff --git a/content-rst/applications/hr/referrals/levels.png b/content-rst/applications/hr/referrals/levels.png new file mode 100644 index 000000000..c6d61fb7b Binary files /dev/null and b/content-rst/applications/hr/referrals/levels.png differ diff --git a/content-rst/applications/hr/referrals/onboarding-reorder.png b/content-rst/applications/hr/referrals/onboarding-reorder.png new file mode 100644 index 000000000..88ce1880a Binary files /dev/null and b/content-rst/applications/hr/referrals/onboarding-reorder.png differ diff --git a/content-rst/applications/hr/referrals/onboarding.png b/content-rst/applications/hr/referrals/onboarding.png new file mode 100644 index 000000000..4cbe45040 Binary files /dev/null and b/content-rst/applications/hr/referrals/onboarding.png differ diff --git a/content/applications/hr/referrals/points.rst b/content-rst/applications/hr/referrals/points.rst similarity index 100% rename from content/applications/hr/referrals/points.rst rename to content-rst/applications/hr/referrals/points.rst diff --git a/content-rst/applications/hr/referrals/points/referrals.png b/content-rst/applications/hr/referrals/points/referrals.png new file mode 100644 index 000000000..8cfc8abd3 Binary files /dev/null and b/content-rst/applications/hr/referrals/points/referrals.png differ diff --git a/content/applications/hr/referrals/reporting.rst b/content-rst/applications/hr/referrals/reporting.rst similarity index 100% rename from content/applications/hr/referrals/reporting.rst rename to content-rst/applications/hr/referrals/reporting.rst diff --git a/content-rst/applications/hr/referrals/reporting/employee-counts.png b/content-rst/applications/hr/referrals/reporting/employee-counts.png new file mode 100644 index 000000000..08f2cde8c Binary files /dev/null and b/content-rst/applications/hr/referrals/reporting/employee-counts.png differ diff --git a/content-rst/applications/hr/referrals/reporting/employee-report.png b/content-rst/applications/hr/referrals/reporting/employee-report.png new file mode 100644 index 000000000..6c1001c93 Binary files /dev/null and b/content-rst/applications/hr/referrals/reporting/employee-report.png differ diff --git a/content/applications/hr/referrals/rewards.rst b/content-rst/applications/hr/referrals/rewards.rst similarity index 100% rename from content/applications/hr/referrals/rewards.rst rename to content-rst/applications/hr/referrals/rewards.rst diff --git a/content-rst/applications/hr/referrals/rewards/redeem-rewards.png b/content-rst/applications/hr/referrals/rewards/redeem-rewards.png new file mode 100644 index 000000000..69cd40f57 Binary files /dev/null and b/content-rst/applications/hr/referrals/rewards/redeem-rewards.png differ diff --git a/content-rst/applications/hr/referrals/rewards/rewards.png b/content-rst/applications/hr/referrals/rewards/rewards.png new file mode 100644 index 000000000..ac6c29afc Binary files /dev/null and b/content-rst/applications/hr/referrals/rewards/rewards.png differ diff --git a/content/applications/hr/referrals/share_jobs.rst b/content-rst/applications/hr/referrals/share_jobs.rst similarity index 100% rename from content/applications/hr/referrals/share_jobs.rst rename to content-rst/applications/hr/referrals/share_jobs.rst diff --git a/content-rst/applications/hr/referrals/share_jobs/email.png b/content-rst/applications/hr/referrals/share_jobs/email.png new file mode 100644 index 000000000..668639301 Binary files /dev/null and b/content-rst/applications/hr/referrals/share_jobs/email.png differ diff --git a/content-rst/applications/hr/referrals/share_jobs/jobs.png b/content-rst/applications/hr/referrals/share_jobs/jobs.png new file mode 100644 index 000000000..ac9a31326 Binary files /dev/null and b/content-rst/applications/hr/referrals/share_jobs/jobs.png differ diff --git a/content-rst/applications/hr/referrals/share_jobs/share.png b/content-rst/applications/hr/referrals/share_jobs/share.png new file mode 100644 index 000000000..3652d2405 Binary files /dev/null and b/content-rst/applications/hr/referrals/share_jobs/share.png differ diff --git a/content/applications/hr/time_off.rst b/content-rst/applications/hr/time_off.rst similarity index 100% rename from content/applications/hr/time_off.rst rename to content-rst/applications/hr/time_off.rst diff --git a/content-rst/applications/hr/time_off/accrual-plan-form.png b/content-rst/applications/hr/time_off/accrual-plan-form.png new file mode 100644 index 000000000..8eb1593bf Binary files /dev/null and b/content-rst/applications/hr/time_off/accrual-plan-form.png differ diff --git a/content/applications/hr/time_off/allocations.rst b/content-rst/applications/hr/time_off/allocations.rst similarity index 100% rename from content/applications/hr/time_off/allocations.rst rename to content-rst/applications/hr/time_off/allocations.rst diff --git a/content-rst/applications/hr/time_off/allocations/allocation-request.png b/content-rst/applications/hr/time_off/allocations/allocation-request.png new file mode 100644 index 000000000..ea0b85e1b Binary files /dev/null and b/content-rst/applications/hr/time_off/allocations/allocation-request.png differ diff --git a/content-rst/applications/hr/time_off/allocations/multiple-requests.png b/content-rst/applications/hr/time_off/allocations/multiple-requests.png new file mode 100644 index 000000000..3b34f88ec Binary files /dev/null and b/content-rst/applications/hr/time_off/allocations/multiple-requests.png differ diff --git a/content-rst/applications/hr/time_off/allocations/new-allocation.png b/content-rst/applications/hr/time_off/allocations/new-allocation.png new file mode 100644 index 000000000..ac38c86fa Binary files /dev/null and b/content-rst/applications/hr/time_off/allocations/new-allocation.png differ diff --git a/content-rst/applications/hr/time_off/bar-chart.png b/content-rst/applications/hr/time_off/bar-chart.png new file mode 100644 index 000000000..39a38106c Binary files /dev/null and b/content-rst/applications/hr/time_off/bar-chart.png differ diff --git a/content-rst/applications/hr/time_off/employee-report.png b/content-rst/applications/hr/time_off/employee-report.png new file mode 100644 index 000000000..55d646e15 Binary files /dev/null and b/content-rst/applications/hr/time_off/employee-report.png differ diff --git a/content-rst/applications/hr/time_off/holidays.png b/content-rst/applications/hr/time_off/holidays.png new file mode 100644 index 000000000..e10ffe4e6 Binary files /dev/null and b/content-rst/applications/hr/time_off/holidays.png differ diff --git a/content/applications/hr/time_off/management.rst b/content-rst/applications/hr/time_off/management.rst similarity index 100% rename from content/applications/hr/time_off/management.rst rename to content-rst/applications/hr/time_off/management.rst diff --git a/content-rst/applications/hr/time_off/management/allocations.png b/content-rst/applications/hr/time_off/management/allocations.png new file mode 100644 index 000000000..d4df92ada Binary files /dev/null and b/content-rst/applications/hr/time_off/management/allocations.png differ diff --git a/content-rst/applications/hr/time_off/management/time-off-requests.png b/content-rst/applications/hr/time_off/management/time-off-requests.png new file mode 100644 index 000000000..b2a24767a Binary files /dev/null and b/content-rst/applications/hr/time_off/management/time-off-requests.png differ diff --git a/content-rst/applications/hr/time_off/mandatory.png b/content-rst/applications/hr/time_off/mandatory.png new file mode 100644 index 000000000..2220be959 Binary files /dev/null and b/content-rst/applications/hr/time_off/mandatory.png differ diff --git a/content-rst/applications/hr/time_off/milestone.png b/content-rst/applications/hr/time_off/milestone.png new file mode 100644 index 000000000..8470176ea Binary files /dev/null and b/content-rst/applications/hr/time_off/milestone.png differ diff --git a/content/applications/hr/time_off/my_time.rst b/content-rst/applications/hr/time_off/my_time.rst similarity index 100% rename from content/applications/hr/time_off/my_time.rst rename to content-rst/applications/hr/time_off/my_time.rst diff --git a/content-rst/applications/hr/time_off/my_time/balance-details.png b/content-rst/applications/hr/time_off/my_time/balance-details.png new file mode 100644 index 000000000..b4b29a9bc Binary files /dev/null and b/content-rst/applications/hr/time_off/my_time/balance-details.png differ diff --git a/content-rst/applications/hr/time_off/my_time/dashboard.png b/content-rst/applications/hr/time_off/my_time/dashboard.png new file mode 100644 index 000000000..0e0f12458 Binary files /dev/null and b/content-rst/applications/hr/time_off/my_time/dashboard.png differ diff --git a/content-rst/applications/hr/time_off/overview.png b/content-rst/applications/hr/time_off/overview.png new file mode 100644 index 000000000..33cbd78c2 Binary files /dev/null and b/content-rst/applications/hr/time_off/overview.png differ diff --git a/content/applications/hr/time_off/request_time_off.rst b/content-rst/applications/hr/time_off/request_time_off.rst similarity index 100% rename from content/applications/hr/time_off/request_time_off.rst rename to content-rst/applications/hr/time_off/request_time_off.rst diff --git a/content-rst/applications/hr/time_off/request_time_off/time-off-request.png b/content-rst/applications/hr/time_off/request_time_off/time-off-request.png new file mode 100644 index 000000000..5c13230a0 Binary files /dev/null and b/content-rst/applications/hr/time_off/request_time_off/time-off-request.png differ diff --git a/content-rst/applications/hr/time_off/time-off-type-form-bottom.png b/content-rst/applications/hr/time_off/time-off-type-form-bottom.png new file mode 100644 index 000000000..2843929d9 Binary files /dev/null and b/content-rst/applications/hr/time_off/time-off-type-form-bottom.png differ diff --git a/content-rst/applications/hr/time_off/time-off-type-form-top.png b/content-rst/applications/hr/time_off/time-off-type-form-top.png new file mode 100644 index 000000000..329ebe12f Binary files /dev/null and b/content-rst/applications/hr/time_off/time-off-type-form-top.png differ diff --git a/content/applications/inventory_and_mrp.rst b/content-rst/applications/inventory_and_mrp.rst similarity index 100% rename from content/applications/inventory_and_mrp.rst rename to content-rst/applications/inventory_and_mrp.rst diff --git a/content/applications/inventory_and_mrp/barcode.rst b/content-rst/applications/inventory_and_mrp/barcode.rst similarity index 100% rename from content/applications/inventory_and_mrp/barcode.rst rename to content-rst/applications/inventory_and_mrp/barcode.rst diff --git a/content/applications/inventory_and_mrp/barcode/operations.rst b/content-rst/applications/inventory_and_mrp/barcode/operations.rst similarity index 100% rename from content/applications/inventory_and_mrp/barcode/operations.rst rename to content-rst/applications/inventory_and_mrp/barcode/operations.rst diff --git a/content/applications/inventory_and_mrp/barcode/operations/adjustments.rst b/content-rst/applications/inventory_and_mrp/barcode/operations/adjustments.rst similarity index 100% rename from content/applications/inventory_and_mrp/barcode/operations/adjustments.rst rename to content-rst/applications/inventory_and_mrp/barcode/operations/adjustments.rst diff --git a/content-rst/applications/inventory_and_mrp/barcode/operations/adjustments/adjustments-barcode-inventory-client-action.png b/content-rst/applications/inventory_and_mrp/barcode/operations/adjustments/adjustments-barcode-inventory-client-action.png new file mode 100644 index 000000000..82c29df5c Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/barcode/operations/adjustments/adjustments-barcode-inventory-client-action.png differ diff --git a/content-rst/applications/inventory_and_mrp/barcode/operations/adjustments/adjustments-barcode-scanner.png b/content-rst/applications/inventory_and_mrp/barcode/operations/adjustments/adjustments-barcode-scanner.png new file mode 100644 index 000000000..67ad17098 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/barcode/operations/adjustments/adjustments-barcode-scanner.png differ diff --git a/content-rst/applications/inventory_and_mrp/barcode/operations/adjustments/adjustments-barcode-setting.png b/content-rst/applications/inventory_and_mrp/barcode/operations/adjustments/adjustments-barcode-setting.png new file mode 100644 index 000000000..2702ab225 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/barcode/operations/adjustments/adjustments-barcode-setting.png differ diff --git a/content-rst/applications/inventory_and_mrp/barcode/operations/adjustments/adjustments-barcode-stock-sheets.png b/content-rst/applications/inventory_and_mrp/barcode/operations/adjustments/adjustments-barcode-stock-sheets.png new file mode 100644 index 000000000..5cbbc8b35 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/barcode/operations/adjustments/adjustments-barcode-stock-sheets.png differ diff --git a/content-rst/applications/inventory_and_mrp/barcode/operations/adjustments/adjustments-keypad.png b/content-rst/applications/inventory_and_mrp/barcode/operations/adjustments/adjustments-keypad.png new file mode 100644 index 000000000..f1dc7face Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/barcode/operations/adjustments/adjustments-keypad.png differ diff --git a/content/applications/inventory_and_mrp/barcode/operations/barcode_nomenclature.rst b/content-rst/applications/inventory_and_mrp/barcode/operations/barcode_nomenclature.rst similarity index 100% rename from content/applications/inventory_and_mrp/barcode/operations/barcode_nomenclature.rst rename to content-rst/applications/inventory_and_mrp/barcode/operations/barcode_nomenclature.rst diff --git a/content-rst/applications/inventory_and_mrp/barcode/operations/barcode_nomenclature/barcode-scan.png b/content-rst/applications/inventory_and_mrp/barcode/operations/barcode_nomenclature/barcode-scan.png new file mode 100644 index 000000000..6175962f3 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/barcode/operations/barcode_nomenclature/barcode-scan.png differ diff --git a/content-rst/applications/inventory_and_mrp/barcode/operations/barcode_nomenclature/barcode.png b/content-rst/applications/inventory_and_mrp/barcode/operations/barcode_nomenclature/barcode.png new file mode 100644 index 000000000..727a8127b Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/barcode/operations/barcode_nomenclature/barcode.png differ diff --git a/content-rst/applications/inventory_and_mrp/barcode/operations/barcode_nomenclature/enable-nomenclature.png b/content-rst/applications/inventory_and_mrp/barcode/operations/barcode_nomenclature/enable-nomenclature.png new file mode 100644 index 000000000..305fa69cc Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/barcode/operations/barcode_nomenclature/enable-nomenclature.png differ diff --git a/content-rst/applications/inventory_and_mrp/barcode/operations/barcode_nomenclature/rule-config.png b/content-rst/applications/inventory_and_mrp/barcode/operations/barcode_nomenclature/rule-config.png new file mode 100644 index 000000000..178b62fcb Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/barcode/operations/barcode_nomenclature/rule-config.png differ diff --git a/content-rst/applications/inventory_and_mrp/barcode/operations/barcode_nomenclature/weighted-barcode.png b/content-rst/applications/inventory_and_mrp/barcode/operations/barcode_nomenclature/weighted-barcode.png new file mode 100644 index 000000000..f883eaab5 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/barcode/operations/barcode_nomenclature/weighted-barcode.png differ diff --git a/content/applications/inventory_and_mrp/barcode/operations/gs1_nomenclature.rst b/content-rst/applications/inventory_and_mrp/barcode/operations/gs1_nomenclature.rst similarity index 100% rename from content/applications/inventory_and_mrp/barcode/operations/gs1_nomenclature.rst rename to content-rst/applications/inventory_and_mrp/barcode/operations/gs1_nomenclature.rst diff --git a/content-rst/applications/inventory_and_mrp/barcode/operations/gs1_nomenclature/setup-gs1-nomenclature.png b/content-rst/applications/inventory_and_mrp/barcode/operations/gs1_nomenclature/setup-gs1-nomenclature.png new file mode 100644 index 000000000..526086287 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/barcode/operations/gs1_nomenclature/setup-gs1-nomenclature.png differ diff --git a/content/applications/inventory_and_mrp/barcode/operations/gs1_usage.rst b/content-rst/applications/inventory_and_mrp/barcode/operations/gs1_usage.rst similarity index 100% rename from content/applications/inventory_and_mrp/barcode/operations/gs1_usage.rst rename to content-rst/applications/inventory_and_mrp/barcode/operations/gs1_usage.rst diff --git a/content-rst/applications/inventory_and_mrp/barcode/operations/gs1_usage/barcode-field.png b/content-rst/applications/inventory_and_mrp/barcode/operations/gs1_usage/barcode-field.png new file mode 100644 index 000000000..3cf580d48 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/barcode/operations/gs1_usage/barcode-field.png differ diff --git a/content-rst/applications/inventory_and_mrp/barcode/operations/gs1_usage/fuji-apples-barcode.png b/content-rst/applications/inventory_and_mrp/barcode/operations/gs1_usage/fuji-apples-barcode.png new file mode 100644 index 000000000..a92097529 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/barcode/operations/gs1_usage/fuji-apples-barcode.png differ diff --git a/content-rst/applications/inventory_and_mrp/barcode/operations/gs1_usage/peaches-barcode.png b/content-rst/applications/inventory_and_mrp/barcode/operations/gs1_usage/peaches-barcode.png new file mode 100644 index 000000000..583417c3f Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/barcode/operations/gs1_usage/peaches-barcode.png differ diff --git a/content-rst/applications/inventory_and_mrp/barcode/operations/gs1_usage/product-barcodes-page.png b/content-rst/applications/inventory_and_mrp/barcode/operations/gs1_usage/product-barcodes-page.png new file mode 100644 index 000000000..c1d53cb23 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/barcode/operations/gs1_usage/product-barcodes-page.png differ diff --git a/content-rst/applications/inventory_and_mrp/barcode/operations/gs1_usage/receive-50-apples.png b/content-rst/applications/inventory_and_mrp/barcode/operations/gs1_usage/receive-50-apples.png new file mode 100644 index 000000000..0a0aaf17f Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/barcode/operations/gs1_usage/receive-50-apples.png differ diff --git a/content-rst/applications/inventory_and_mrp/barcode/operations/gs1_usage/scan-barcode-peaches.png b/content-rst/applications/inventory_and_mrp/barcode/operations/gs1_usage/scan-barcode-peaches.png new file mode 100644 index 000000000..45073351f Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/barcode/operations/gs1_usage/scan-barcode-peaches.png differ diff --git a/content-rst/applications/inventory_and_mrp/barcode/operations/gs1_usage/stock-moves-peach.png b/content-rst/applications/inventory_and_mrp/barcode/operations/gs1_usage/stock-moves-peach.png new file mode 100644 index 000000000..567c565fd Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/barcode/operations/gs1_usage/stock-moves-peach.png differ diff --git a/content-rst/applications/inventory_and_mrp/barcode/operations/gs1_usage/track-by-lots.png b/content-rst/applications/inventory_and_mrp/barcode/operations/gs1_usage/track-by-lots.png new file mode 100644 index 000000000..47e30c073 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/barcode/operations/gs1_usage/track-by-lots.png differ diff --git a/content/applications/inventory_and_mrp/barcode/operations/process_transfers.rst b/content-rst/applications/inventory_and_mrp/barcode/operations/process_transfers.rst similarity index 100% rename from content/applications/inventory_and_mrp/barcode/operations/process_transfers.rst rename to content-rst/applications/inventory_and_mrp/barcode/operations/process_transfers.rst diff --git a/content-rst/applications/inventory_and_mrp/barcode/operations/process_transfers/batch-products.png b/content-rst/applications/inventory_and_mrp/barcode/operations/process_transfers/batch-products.png new file mode 100644 index 000000000..45af8b1cd Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/barcode/operations/process_transfers/batch-products.png differ diff --git a/content-rst/applications/inventory_and_mrp/barcode/operations/process_transfers/batch-transfer.png b/content-rst/applications/inventory_and_mrp/barcode/operations/process_transfers/batch-transfer.png new file mode 100644 index 000000000..b28fbaa1b Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/barcode/operations/process_transfers/batch-transfer.png differ diff --git a/content/applications/inventory_and_mrp/barcode/operations/receipts_deliveries.rst b/content-rst/applications/inventory_and_mrp/barcode/operations/receipts_deliveries.rst similarity index 100% rename from content/applications/inventory_and_mrp/barcode/operations/receipts_deliveries.rst rename to content-rst/applications/inventory_and_mrp/barcode/operations/receipts_deliveries.rst diff --git a/content-rst/applications/inventory_and_mrp/barcode/operations/receipts_deliveries/receipts-deliveries-barcode-scanner.png b/content-rst/applications/inventory_and_mrp/barcode/operations/receipts_deliveries/receipts-deliveries-barcode-scanner.png new file mode 100644 index 000000000..3ce0e3f7e Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/barcode/operations/receipts_deliveries/receipts-deliveries-barcode-scanner.png differ diff --git a/content-rst/applications/inventory_and_mrp/barcode/operations/receipts_deliveries/receipts-deliveries-barcode-setting.png b/content-rst/applications/inventory_and_mrp/barcode/operations/receipts_deliveries/receipts-deliveries-barcode-setting.png new file mode 100644 index 000000000..5cc02885f Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/barcode/operations/receipts_deliveries/receipts-deliveries-barcode-setting.png differ diff --git a/content-rst/applications/inventory_and_mrp/barcode/operations/receipts_deliveries/receipts-deliveries-operations-page.png b/content-rst/applications/inventory_and_mrp/barcode/operations/receipts_deliveries/receipts-deliveries-operations-page.png new file mode 100644 index 000000000..1bdddbeb0 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/barcode/operations/receipts_deliveries/receipts-deliveries-operations-page.png differ diff --git a/content-rst/applications/inventory_and_mrp/barcode/operations/receipts_deliveries/receipts-deliveries-product-line-editor.png b/content-rst/applications/inventory_and_mrp/barcode/operations/receipts_deliveries/receipts-deliveries-product-line-editor.png new file mode 100644 index 000000000..f90fc83c2 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/barcode/operations/receipts_deliveries/receipts-deliveries-product-line-editor.png differ diff --git a/content-rst/applications/inventory_and_mrp/barcode/operations/receipts_deliveries/receipts-deliveries-purchase-order.png b/content-rst/applications/inventory_and_mrp/barcode/operations/receipts_deliveries/receipts-deliveries-purchase-order.png new file mode 100644 index 000000000..94454d283 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/barcode/operations/receipts_deliveries/receipts-deliveries-purchase-order.png differ diff --git a/content-rst/applications/inventory_and_mrp/barcode/operations/receipts_deliveries/receipts-deliveries-sales-order.png b/content-rst/applications/inventory_and_mrp/barcode/operations/receipts_deliveries/receipts-deliveries-sales-order.png new file mode 100644 index 000000000..ccba3c431 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/barcode/operations/receipts_deliveries/receipts-deliveries-sales-order.png differ diff --git a/content-rst/applications/inventory_and_mrp/barcode/operations/receipts_deliveries/receipts-deliveries-scanner-overview.png b/content-rst/applications/inventory_and_mrp/barcode/operations/receipts_deliveries/receipts-deliveries-scanner-overview.png new file mode 100644 index 000000000..d935da13c Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/barcode/operations/receipts_deliveries/receipts-deliveries-scanner-overview.png differ diff --git a/content-rst/applications/inventory_and_mrp/barcode/operations/receipts_deliveries/receipts-deliveries-validate-delivery.png b/content-rst/applications/inventory_and_mrp/barcode/operations/receipts_deliveries/receipts-deliveries-validate-delivery.png new file mode 100644 index 000000000..c8e26fb42 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/barcode/operations/receipts_deliveries/receipts-deliveries-validate-delivery.png differ diff --git a/content-rst/applications/inventory_and_mrp/barcode/operations/receipts_deliveries/receipts-deliveries-validate-transfer.png b/content-rst/applications/inventory_and_mrp/barcode/operations/receipts_deliveries/receipts-deliveries-validate-transfer.png new file mode 100644 index 000000000..1cee82f91 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/barcode/operations/receipts_deliveries/receipts-deliveries-validate-transfer.png differ diff --git a/content/applications/inventory_and_mrp/barcode/operations/transfers_scratch.rst b/content-rst/applications/inventory_and_mrp/barcode/operations/transfers_scratch.rst similarity index 100% rename from content/applications/inventory_and_mrp/barcode/operations/transfers_scratch.rst rename to content-rst/applications/inventory_and_mrp/barcode/operations/transfers_scratch.rst diff --git a/content-rst/applications/inventory_and_mrp/barcode/operations/transfers_scratch/transfers-scratch-barcode-app.png b/content-rst/applications/inventory_and_mrp/barcode/operations/transfers_scratch/transfers-scratch-barcode-app.png new file mode 100644 index 000000000..3ce0e3f7e Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/barcode/operations/transfers_scratch/transfers-scratch-barcode-app.png differ diff --git a/content-rst/applications/inventory_and_mrp/barcode/operations/transfers_scratch/transfers-scratch-blank-product-editor.png b/content-rst/applications/inventory_and_mrp/barcode/operations/transfers_scratch/transfers-scratch-blank-product-editor.png new file mode 100644 index 000000000..60fefcca0 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/barcode/operations/transfers_scratch/transfers-scratch-blank-product-editor.png differ diff --git a/content-rst/applications/inventory_and_mrp/barcode/operations/transfers_scratch/transfers-scratch-demo-data.png b/content-rst/applications/inventory_and_mrp/barcode/operations/transfers_scratch/transfers-scratch-demo-data.png new file mode 100644 index 000000000..b59b04b6b Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/barcode/operations/transfers_scratch/transfers-scratch-demo-data.png differ diff --git a/content-rst/applications/inventory_and_mrp/barcode/operations/transfers_scratch/transfers-scratch-detailed-operations-popup.png b/content-rst/applications/inventory_and_mrp/barcode/operations/transfers_scratch/transfers-scratch-detailed-operations-popup.png new file mode 100644 index 000000000..8d01b4046 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/barcode/operations/transfers_scratch/transfers-scratch-detailed-operations-popup.png differ diff --git a/content-rst/applications/inventory_and_mrp/barcode/operations/transfers_scratch/transfers-scratch-enabled-barcode-setting.png b/content-rst/applications/inventory_and_mrp/barcode/operations/transfers_scratch/transfers-scratch-enabled-barcode-setting.png new file mode 100644 index 000000000..ceaa118b0 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/barcode/operations/transfers_scratch/transfers-scratch-enabled-barcode-setting.png differ diff --git a/content-rst/applications/inventory_and_mrp/barcode/operations/transfers_scratch/transfers-scratch-internal-transfer-form.png b/content-rst/applications/inventory_and_mrp/barcode/operations/transfers_scratch/transfers-scratch-internal-transfer-form.png new file mode 100644 index 000000000..97fd1e093 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/barcode/operations/transfers_scratch/transfers-scratch-internal-transfer-form.png differ diff --git a/content-rst/applications/inventory_and_mrp/barcode/operations/transfers_scratch/transfers-scratch-product-line-editor.png b/content-rst/applications/inventory_and_mrp/barcode/operations/transfers_scratch/transfers-scratch-product-line-editor.png new file mode 100644 index 000000000..08e4d12e8 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/barcode/operations/transfers_scratch/transfers-scratch-product-line-editor.png differ diff --git a/content-rst/applications/inventory_and_mrp/barcode/operations/transfers_scratch/transfers-scratch-receipts-overview.png b/content-rst/applications/inventory_and_mrp/barcode/operations/transfers_scratch/transfers-scratch-receipts-overview.png new file mode 100644 index 000000000..124289918 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/barcode/operations/transfers_scratch/transfers-scratch-receipts-overview.png differ diff --git a/content/applications/inventory_and_mrp/barcode/setup.rst b/content-rst/applications/inventory_and_mrp/barcode/setup.rst similarity index 100% rename from content/applications/inventory_and_mrp/barcode/setup.rst rename to content-rst/applications/inventory_and_mrp/barcode/setup.rst diff --git a/content/applications/inventory_and_mrp/barcode/setup/device_troubleshooting.rst b/content-rst/applications/inventory_and_mrp/barcode/setup/device_troubleshooting.rst similarity index 100% rename from content/applications/inventory_and_mrp/barcode/setup/device_troubleshooting.rst rename to content-rst/applications/inventory_and_mrp/barcode/setup/device_troubleshooting.rst diff --git a/content-rst/applications/inventory_and_mrp/barcode/setup/device_troubleshooting/device-troubleshooting-belgium-fr-key.png b/content-rst/applications/inventory_and_mrp/barcode/setup/device_troubleshooting/device-troubleshooting-belgium-fr-key.png new file mode 100644 index 000000000..94ecfe74b Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/barcode/setup/device_troubleshooting/device-troubleshooting-belgium-fr-key.png differ diff --git a/content-rst/applications/inventory_and_mrp/barcode/setup/device_troubleshooting/device-troubleshooting-keyboard-wedge-input.png b/content-rst/applications/inventory_and_mrp/barcode/setup/device_troubleshooting/device-troubleshooting-keyboard-wedge-input.png new file mode 100644 index 000000000..ef86841cc Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/barcode/setup/device_troubleshooting/device-troubleshooting-keyboard-wedge-input.png differ diff --git a/content-rst/applications/inventory_and_mrp/barcode/setup/device_troubleshooting/device-troubleshooting-munbyn-process-mode.png b/content-rst/applications/inventory_and_mrp/barcode/setup/device_troubleshooting/device-troubleshooting-munbyn-process-mode.png new file mode 100644 index 000000000..be425f178 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/barcode/setup/device_troubleshooting/device-troubleshooting-munbyn-process-mode.png differ diff --git a/content-rst/applications/inventory_and_mrp/barcode/setup/device_troubleshooting/device-troubleshooting-output-mode-popup.png b/content-rst/applications/inventory_and_mrp/barcode/setup/device_troubleshooting/device-troubleshooting-output-mode-popup.png new file mode 100644 index 000000000..4f809cf6e Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/barcode/setup/device_troubleshooting/device-troubleshooting-output-mode-popup.png differ diff --git a/content-rst/applications/inventory_and_mrp/barcode/setup/device_troubleshooting/device-troubleshooting-wedge-menu.png b/content-rst/applications/inventory_and_mrp/barcode/setup/device_troubleshooting/device-troubleshooting-wedge-menu.png new file mode 100644 index 000000000..ddb5c9268 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/barcode/setup/device_troubleshooting/device-troubleshooting-wedge-menu.png differ diff --git a/content-rst/applications/inventory_and_mrp/barcode/setup/device_troubleshooting/device-troubleshooting-zebra-settings.png b/content-rst/applications/inventory_and_mrp/barcode/setup/device_troubleshooting/device-troubleshooting-zebra-settings.png new file mode 100644 index 000000000..f91c89644 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/barcode/setup/device_troubleshooting/device-troubleshooting-zebra-settings.png differ diff --git a/content/applications/inventory_and_mrp/barcode/setup/hardware.rst b/content-rst/applications/inventory_and_mrp/barcode/setup/hardware.rst similarity index 100% rename from content/applications/inventory_and_mrp/barcode/setup/hardware.rst rename to content-rst/applications/inventory_and_mrp/barcode/setup/hardware.rst diff --git a/content-rst/applications/inventory_and_mrp/barcode/setup/hardware/barcode-scanner.png b/content-rst/applications/inventory_and_mrp/barcode/setup/hardware/barcode-scanner.png new file mode 100644 index 000000000..bb0474155 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/barcode/setup/hardware/barcode-scanner.png differ diff --git a/content-rst/applications/inventory_and_mrp/barcode/setup/hardware/enable-keystroke.png b/content-rst/applications/inventory_and_mrp/barcode/setup/hardware/enable-keystroke.png new file mode 100644 index 000000000..c0a95401f Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/barcode/setup/hardware/enable-keystroke.png differ diff --git a/content-rst/applications/inventory_and_mrp/barcode/setup/hardware/hardware-cipherlab-emulation.png b/content-rst/applications/inventory_and_mrp/barcode/setup/hardware/hardware-cipherlab-emulation.png new file mode 100644 index 000000000..d0c07042f Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/barcode/setup/hardware/hardware-cipherlab-emulation.png differ diff --git a/content-rst/applications/inventory_and_mrp/barcode/setup/hardware/hardware-cipherlab-settings.png b/content-rst/applications/inventory_and_mrp/barcode/setup/hardware/hardware-cipherlab-settings.png new file mode 100644 index 000000000..ddca2ebf9 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/barcode/setup/hardware/hardware-cipherlab-settings.png differ diff --git a/content-rst/applications/inventory_and_mrp/barcode/setup/hardware/hardware-honeywell-settings.png b/content-rst/applications/inventory_and_mrp/barcode/setup/hardware/hardware-honeywell-settings.png new file mode 100644 index 000000000..6c1281546 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/barcode/setup/hardware/hardware-honeywell-settings.png differ diff --git a/content-rst/applications/inventory_and_mrp/barcode/setup/hardware/keyboard-barcode.png b/content-rst/applications/inventory_and_mrp/barcode/setup/hardware/keyboard-barcode.png new file mode 100644 index 000000000..2c1ccfae2 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/barcode/setup/hardware/keyboard-barcode.png differ diff --git a/content/applications/inventory_and_mrp/barcode/setup/software.rst b/content-rst/applications/inventory_and_mrp/barcode/setup/software.rst similarity index 100% rename from content/applications/inventory_and_mrp/barcode/setup/software.rst rename to content-rst/applications/inventory_and_mrp/barcode/setup/software.rst diff --git a/content-rst/applications/inventory_and_mrp/barcode/setup/software/software_01.png b/content-rst/applications/inventory_and_mrp/barcode/setup/software/software_01.png new file mode 100644 index 000000000..a477f4933 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/barcode/setup/software/software_01.png differ diff --git a/content-rst/applications/inventory_and_mrp/barcode/setup/software/software_02.png b/content-rst/applications/inventory_and_mrp/barcode/setup/software/software_02.png new file mode 100644 index 000000000..68eb9aab6 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/barcode/setup/software/software_02.png differ diff --git a/content-rst/applications/inventory_and_mrp/barcode/setup/software/software_03.png b/content-rst/applications/inventory_and_mrp/barcode/setup/software/software_03.png new file mode 100644 index 000000000..3116b558b Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/barcode/setup/software/software_03.png differ diff --git a/content-rst/applications/inventory_and_mrp/barcode/setup/software/software_04.png b/content-rst/applications/inventory_and_mrp/barcode/setup/software/software_04.png new file mode 100644 index 000000000..6cca59b1c Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/barcode/setup/software/software_04.png differ diff --git a/content-rst/applications/inventory_and_mrp/barcode/setup/software/software_05.png b/content-rst/applications/inventory_and_mrp/barcode/setup/software/software_05.png new file mode 100644 index 000000000..7320ae080 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/barcode/setup/software/software_05.png differ diff --git a/content-rst/applications/inventory_and_mrp/barcode/setup/software/software_06.png b/content-rst/applications/inventory_and_mrp/barcode/setup/software/software_06.png new file mode 100644 index 000000000..271244ee6 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/barcode/setup/software/software_06.png differ diff --git a/content/applications/inventory_and_mrp/inventory.rst b/content-rst/applications/inventory_and_mrp/inventory.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory.rst rename to content-rst/applications/inventory_and_mrp/inventory.rst diff --git a/content/applications/inventory_and_mrp/inventory/product_management.rst b/content-rst/applications/inventory_and_mrp/inventory/product_management.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/product_management.rst rename to content-rst/applications/inventory_and_mrp/inventory/product_management.rst diff --git a/content/applications/inventory_and_mrp/inventory/product_management/configure.rst b/content-rst/applications/inventory_and_mrp/inventory/product_management/configure.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/product_management/configure.rst rename to content-rst/applications/inventory_and_mrp/inventory/product_management/configure.rst diff --git a/content/applications/inventory_and_mrp/inventory/product_management/configure/package.rst b/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/package.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/product_management/configure/package.rst rename to content-rst/applications/inventory_and_mrp/inventory/product_management/configure/package.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/package/destination-package.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/package/destination-package.png new file mode 100644 index 000000000..1c34f1811 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/package/destination-package.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/package/detailed-operations.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/package/detailed-operations.png new file mode 100644 index 000000000..8d292830d Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/package/detailed-operations.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/package/enable-batch.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/package/enable-batch.png new file mode 100644 index 000000000..ddc7a3439 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/package/enable-batch.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/package/enable-pack.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/package/enable-pack.png new file mode 100644 index 000000000..1928968e2 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/package/enable-pack.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/package/package-type.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/package/package-type.png new file mode 100644 index 000000000..3958ef7b8 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/package/package-type.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/package/package.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/package/package.png new file mode 100644 index 000000000..ce6d3a93f Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/package/package.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/package/packages-kanban.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/package/packages-kanban.png new file mode 100644 index 000000000..ed8edf0a7 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/package/packages-kanban.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/package/put-in-pack.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/package/put-in-pack.png new file mode 100644 index 000000000..db57a30be Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/package/put-in-pack.png differ diff --git a/content/applications/inventory_and_mrp/inventory/product_management/configure/packaging.rst b/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/packaging.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/product_management/configure/packaging.rst rename to content-rst/applications/inventory_and_mrp/inventory/product_management/configure/packaging.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/packaging/apply-route.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/packaging/apply-route.png new file mode 100644 index 000000000..d7a54fa4e Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/packaging/apply-route.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/packaging/create-product-packaging.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/packaging/create-product-packaging.png new file mode 100644 index 000000000..0eeac3467 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/packaging/create-product-packaging.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/packaging/enable-packagings.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/packaging/enable-packagings.png new file mode 100644 index 000000000..ba62fefc1 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/packaging/enable-packagings.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/packaging/packagings-sales-order.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/packaging/packagings-sales-order.png new file mode 100644 index 000000000..9e7ec1082 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/packaging/packagings-sales-order.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/packaging/packagings.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/packaging/packagings.png new file mode 100644 index 000000000..d94632481 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/packaging/packagings.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/packaging/reserve-packaging.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/packaging/reserve-packaging.png new file mode 100644 index 000000000..7f22ea4fc Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/packaging/reserve-packaging.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/packaging/route.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/packaging/route.png new file mode 100644 index 000000000..dc48883fe Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/packaging/route.png differ diff --git a/content/applications/inventory_and_mrp/inventory/product_management/configure/type.rst b/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/type.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/product_management/configure/type.rst rename to content-rst/applications/inventory_and_mrp/inventory/product_management/configure/type.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/type/package-content.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/type/package-content.png new file mode 100644 index 000000000..31c71c06f Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/type/package-content.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/type/product-form.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/type/product-form.png new file mode 100644 index 000000000..2d8ee5d3f Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/type/product-form.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/type/tracked.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/type/tracked.png new file mode 100644 index 000000000..8ed2820e1 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/type/tracked.png differ diff --git a/content/applications/inventory_and_mrp/inventory/product_management/configure/uom.rst b/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/uom.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/product_management/configure/uom.rst rename to content-rst/applications/inventory_and_mrp/inventory/product_management/configure/uom.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/uom/category.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/uom/category.png new file mode 100644 index 000000000..29b7b4281 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/uom/category.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/uom/convert-products-by-unit.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/uom/convert-products-by-unit.png new file mode 100644 index 000000000..2e1a7f779 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/uom/convert-products-by-unit.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/uom/on-po.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/uom/on-po.png new file mode 100644 index 000000000..87e65e878 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/uom/on-po.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/uom/on-receipt.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/uom/on-receipt.png new file mode 100644 index 000000000..351cadff3 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/uom/on-receipt.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/uom/replenish.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/uom/replenish.png new file mode 100644 index 000000000..08e65074e Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/uom/replenish.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/uom/uom-enable-setting.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/uom/uom-enable-setting.png new file mode 100644 index 000000000..01afeb37a Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/configure/uom/uom-enable-setting.png differ diff --git a/content/applications/inventory_and_mrp/inventory/product_management/inventory_valuation.rst b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/product_management/inventory_valuation.rst rename to content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation.rst diff --git a/content/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/inventory_valuation_config.rst b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/inventory_valuation_config.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/inventory_valuation_config.rst rename to content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/inventory_valuation_config.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/inventory_valuation_config/account-type.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/inventory_valuation_config/account-type.png new file mode 100644 index 000000000..f1e18d637 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/inventory_valuation_config/account-type.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/inventory_valuation_config/anglo-saxon.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/inventory_valuation_config/anglo-saxon.png new file mode 100644 index 000000000..e9317885a Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/inventory_valuation_config/anglo-saxon.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/inventory_valuation_config/auto-accounting.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/inventory_valuation_config/auto-accounting.png new file mode 100644 index 000000000..ced02e4ef Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/inventory_valuation_config/auto-accounting.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/inventory_valuation_config/automated-inventory-valuation.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/inventory_valuation_config/automated-inventory-valuation.png new file mode 100644 index 000000000..43e3f8a9a Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/inventory_valuation_config/automated-inventory-valuation.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/inventory_valuation_config/continental-stock-account.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/inventory_valuation_config/continental-stock-account.png new file mode 100644 index 000000000..152660e9d Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/inventory_valuation_config/continental-stock-account.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/inventory_valuation_config/external-link.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/inventory_valuation_config/external-link.png new file mode 100644 index 000000000..9acc040dc Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/inventory_valuation_config/external-link.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/inventory_valuation_config/inventory-valuation-fields.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/inventory_valuation_config/inventory-valuation-fields.png new file mode 100644 index 000000000..1d196bb1f Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/inventory_valuation_config/inventory-valuation-fields.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/inventory_valuation_config/journals.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/inventory_valuation_config/journals.png new file mode 100644 index 000000000..697bd9a01 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/inventory_valuation_config/journals.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/inventory_valuation_config/manual-anglo-saxon-expense.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/inventory_valuation_config/manual-anglo-saxon-expense.png new file mode 100644 index 000000000..3a95c3d4b Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/inventory_valuation_config/manual-anglo-saxon-expense.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/inventory_valuation_config/stock-balance-sheet.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/inventory_valuation_config/stock-balance-sheet.png new file mode 100644 index 000000000..5877c34e9 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/inventory_valuation_config/stock-balance-sheet.png differ diff --git a/content/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/landed_costs.rst b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/landed_costs.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/landed_costs.rst rename to content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/landed_costs.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/landed_costs/integrating-landed-costs-checkboxes.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/landed_costs/integrating-landed-costs-checkboxes.png new file mode 100644 index 000000000..e9b0049ef Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/landed_costs/integrating-landed-costs-checkboxes.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/landed_costs/integrating-landed-costs-create-button.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/landed_costs/integrating-landed-costs-create-button.png new file mode 100644 index 000000000..6254521fd Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/landed_costs/integrating-landed-costs-create-button.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/landed_costs/integrating-landed-costs-enabled-setting.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/landed_costs/integrating-landed-costs-enabled-setting.png new file mode 100644 index 000000000..8a97c2dbd Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/landed_costs/integrating-landed-costs-enabled-setting.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/landed_costs/integrating-landed-costs-journal-entry.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/landed_costs/integrating-landed-costs-journal-entry.png new file mode 100644 index 000000000..46f221f8e Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/landed_costs/integrating-landed-costs-journal-entry.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/landed_costs/integrating-landed-costs-landed-cost-product.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/landed_costs/integrating-landed-costs-landed-cost-product.png new file mode 100644 index 000000000..fad8f6449 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/landed_costs/integrating-landed-costs-landed-cost-product.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/landed_costs/integrating-landed-costs-transfers-menu.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/landed_costs/integrating-landed-costs-transfers-menu.png new file mode 100644 index 000000000..b968d2fc3 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/landed_costs/integrating-landed-costs-transfers-menu.png differ diff --git a/content/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/using_inventory_valuation.rst b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/using_inventory_valuation.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/using_inventory_valuation.rst rename to content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/using_inventory_valuation.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/using_inventory_valuation/add-manual-valuation.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/using_inventory_valuation/add-manual-valuation.png new file mode 100644 index 000000000..1ad0eb8df Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/using_inventory_valuation/add-manual-valuation.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/using_inventory_valuation/decreased-stock-valuation.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/using_inventory_valuation/decreased-stock-valuation.png new file mode 100644 index 000000000..e5230b738 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/using_inventory_valuation/decreased-stock-valuation.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/using_inventory_valuation/inventory-valuation-entry.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/using_inventory_valuation/inventory-valuation-entry.png new file mode 100644 index 000000000..c5e5ddb07 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/using_inventory_valuation/inventory-valuation-entry.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/using_inventory_valuation/inventory-valuation-products.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/using_inventory_valuation/inventory-valuation-products.png new file mode 100644 index 000000000..8123e1cce Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/using_inventory_valuation/inventory-valuation-products.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/using_inventory_valuation/product-revaluation.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/using_inventory_valuation/product-revaluation.png new file mode 100644 index 000000000..26d6bf781 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/using_inventory_valuation/product-revaluation.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/using_inventory_valuation/purchase-order.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/using_inventory_valuation/purchase-order.png new file mode 100644 index 000000000..ba1579c6e Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/using_inventory_valuation/purchase-order.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/using_inventory_valuation/stock-valuation-product.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/using_inventory_valuation/stock-valuation-product.png new file mode 100644 index 000000000..46bd6017f Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/using_inventory_valuation/stock-valuation-product.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/using_inventory_valuation/valuation-smart-button.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/using_inventory_valuation/valuation-smart-button.png new file mode 100644 index 000000000..90dea63ca Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/using_inventory_valuation/valuation-smart-button.png differ diff --git a/content/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/valuation_by_lots.rst b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/valuation_by_lots.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/valuation_by_lots.rst rename to content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/valuation_by_lots.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/valuation_by_lots/create-new.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/valuation_by_lots/create-new.png new file mode 100644 index 000000000..7721957dc Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/valuation_by_lots/create-new.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/valuation_by_lots/existing.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/valuation_by_lots/existing.png new file mode 100644 index 000000000..14826c7ad Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/valuation_by_lots/existing.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/valuation_by_lots/lip-gloss.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/valuation_by_lots/lip-gloss.png new file mode 100644 index 000000000..2db4e4817 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/valuation_by_lots/lip-gloss.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/valuation_by_lots/lot-stock-valuation.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/valuation_by_lots/lot-stock-valuation.png new file mode 100644 index 000000000..cbc88b2b9 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/valuation_by_lots/lot-stock-valuation.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/valuation_by_lots/lot.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/valuation_by_lots/lot.png new file mode 100644 index 000000000..4c0ac5d0d Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/valuation_by_lots/lot.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/valuation_by_lots/product-form.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/valuation_by_lots/product-form.png new file mode 100644 index 000000000..4643e2fc1 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/valuation_by_lots/product-form.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/valuation_by_lots/stock-valuation.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/valuation_by_lots/stock-valuation.png new file mode 100644 index 000000000..2be216ce0 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/valuation_by_lots/stock-valuation.png differ diff --git a/content/applications/inventory_and_mrp/inventory/product_management/product_tracking.rst b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/product_management/product_tracking.rst rename to content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/differences-enabled-setting.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/differences-enabled-setting.png new file mode 100644 index 000000000..a3b605ea5 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/differences-enabled-setting.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/differences-lot.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/differences-lot.png new file mode 100644 index 000000000..37aacb4d7 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/differences-lot.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/differences-serial-numbers.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/differences-serial-numbers.png new file mode 100644 index 000000000..175a0b800 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/differences-serial-numbers.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/differences-tracking.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/differences-tracking.png new file mode 100644 index 000000000..a3ea8ea80 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/differences-tracking.png differ diff --git a/content/applications/inventory_and_mrp/inventory/product_management/product_tracking/expiration_dates.rst b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/expiration_dates.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/product_management/product_tracking/expiration_dates.rst rename to content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/expiration_dates.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/expiration_dates/components-popup.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/expiration_dates/components-popup.png new file mode 100644 index 000000000..b1fe7d402 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/expiration_dates/components-popup.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/expiration_dates/expiration-dates-detailed-operations-popup.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/expiration_dates/expiration-dates-detailed-operations-popup.png new file mode 100644 index 000000000..d398ea646 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/expiration_dates/expiration-dates-detailed-operations-popup.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/expiration_dates/expiration-dates-enabled-settings.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/expiration_dates/expiration-dates-enabled-settings.png new file mode 100644 index 000000000..c8f031533 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/expiration_dates/expiration-dates-enabled-settings.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/expiration_dates/expiration-dates-expiration-alert.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/expiration_dates/expiration-dates-expiration-alert.png new file mode 100644 index 000000000..74ffc2e6d Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/expiration_dates/expiration-dates-expiration-alert.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/expiration_dates/expiration-dates-group-by-dates.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/expiration_dates/expiration-dates-group-by-dates.png new file mode 100644 index 000000000..2cb1c5d1d Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/expiration_dates/expiration-dates-group-by-dates.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/expiration_dates/expiration-dates-manufacturing-order.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/expiration_dates/expiration-dates-manufacturing-order.png new file mode 100644 index 000000000..ef5b1f55d Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/expiration_dates/expiration-dates-manufacturing-order.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/expiration_dates/expiration-dates-product-configuration.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/expiration_dates/expiration-dates-product-configuration.png new file mode 100644 index 000000000..353ea1c11 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/expiration_dates/expiration-dates-product-configuration.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/expiration_dates/expiration-dates-user-error-popup.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/expiration_dates/expiration-dates-user-error-popup.png new file mode 100644 index 000000000..a48a2141f Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/expiration_dates/expiration-dates-user-error-popup.png differ diff --git a/content/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots.rst b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots.rst rename to content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/add-properties.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/add-properties.png new file mode 100644 index 000000000..79bc45bb8 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/add-properties.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/assign-lots-popup.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/assign-lots-popup.png new file mode 100644 index 000000000..b3a9acaae Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/assign-lots-popup.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/bulk-sn.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/bulk-sn.png new file mode 100644 index 000000000..ef4c85e5e Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/bulk-sn.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/delivery-slip.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/delivery-slip.png new file mode 100644 index 000000000..422dd948d Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/delivery-slip.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/enabled-lots-setting.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/enabled-lots-setting.png new file mode 100644 index 000000000..43bb06ddb Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/enabled-lots-setting.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/group-by-number.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/group-by-number.png new file mode 100644 index 000000000..0c4ff4f89 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/group-by-number.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/inventory-adjustment.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/inventory-adjustment.png new file mode 100644 index 000000000..93730a798 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/inventory-adjustment.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/list-icon.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/list-icon.png new file mode 100644 index 000000000..611c485df Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/list-icon.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/lot-dashboard.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/lot-dashboard.png new file mode 100644 index 000000000..fd4619b09 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/lot-dashboard.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/lot-number.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/lot-number.png new file mode 100644 index 000000000..877d70f71 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/lot-number.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/lots-excel-spreadsheet.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/lots-excel-spreadsheet.png new file mode 100644 index 000000000..1a61585d5 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/lots-excel-spreadsheet.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/new-lot-number.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/new-lot-number.png new file mode 100644 index 000000000..08c88d4ae Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/new-lot-number.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/operation-type-form.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/operation-type-form.png new file mode 100644 index 000000000..fada50022 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/operation-type-form.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/pick-from-lots.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/pick-from-lots.png new file mode 100644 index 000000000..449080517 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/pick-from-lots.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/traceability-report.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/traceability-report.png new file mode 100644 index 000000000..480f76d24 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/traceability-report.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/tracking-product-form.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/tracking-product-form.png new file mode 100644 index 000000000..586dfb84f Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/tracking-product-form.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/user-error.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/user-error.png new file mode 100644 index 000000000..2f76c0075 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots/user-error.png differ diff --git a/content/applications/inventory_and_mrp/inventory/product_management/product_tracking/reassign.rst b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/reassign.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/product_management/product_tracking/reassign.rst rename to content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/reassign.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/reassign/adjustment.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/reassign/adjustment.png new file mode 100644 index 000000000..3c21332b6 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/reassign/adjustment.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/reassign/history.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/reassign/history.png new file mode 100644 index 000000000..99f050830 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/reassign/history.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/reassign/remove-quant.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/reassign/remove-quant.png new file mode 100644 index 000000000..c425a72fe Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/reassign/remove-quant.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/reassign/tracking.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/reassign/tracking.png new file mode 100644 index 000000000..7033a5569 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/reassign/tracking.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/reassign/update-quantity.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/reassign/update-quantity.png new file mode 100644 index 000000000..eda1e668d Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/reassign/update-quantity.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/reassign/warning.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/reassign/warning.png new file mode 100644 index 000000000..552fd41c6 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/reassign/warning.png differ diff --git a/content/applications/inventory_and_mrp/inventory/product_management/product_tracking/serial_numbers.rst b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/serial_numbers.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/product_management/product_tracking/serial_numbers.rst rename to content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/serial_numbers.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/serial_numbers/create-new-setting.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/serial_numbers/create-new-setting.png new file mode 100644 index 000000000..138114b35 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/serial_numbers/create-new-setting.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/serial_numbers/delivery-slip.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/serial_numbers/delivery-slip.png new file mode 100644 index 000000000..422dd948d Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/serial_numbers/delivery-slip.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/serial_numbers/enabled-setting.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/serial_numbers/enabled-setting.png new file mode 100644 index 000000000..cfee91334 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/serial_numbers/enabled-setting.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/serial_numbers/enter-in-field.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/serial_numbers/enter-in-field.png new file mode 100644 index 000000000..da533a1cc Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/serial_numbers/enter-in-field.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/serial_numbers/field-visible.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/serial_numbers/field-visible.png new file mode 100644 index 000000000..a87931bb5 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/serial_numbers/field-visible.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/serial_numbers/import-serial.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/serial_numbers/import-serial.png new file mode 100644 index 000000000..a6dbd56bc Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/serial_numbers/import-serial.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/serial_numbers/moves-button.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/serial_numbers/moves-button.png new file mode 100644 index 000000000..d5cf7d24f Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/serial_numbers/moves-button.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/serial_numbers/new-serial-number.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/serial_numbers/new-serial-number.png new file mode 100644 index 000000000..6db14ac36 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/serial_numbers/new-serial-number.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/serial_numbers/product-tracking.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/serial_numbers/product-tracking.png new file mode 100644 index 000000000..d8bf22602 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/serial_numbers/product-tracking.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/serial_numbers/serial-numbers-dashboard.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/serial_numbers/serial-numbers-dashboard.png new file mode 100644 index 000000000..35298b100 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/serial_numbers/serial-numbers-dashboard.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/serial_numbers/stock-move-add-line.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/serial_numbers/stock-move-add-line.png new file mode 100644 index 000000000..c50d357d7 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/serial_numbers/stock-move-add-line.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/serial_numbers/stock-move-generate-quantity-tip.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/serial_numbers/stock-move-generate-quantity-tip.png new file mode 100644 index 000000000..63cd35f3a Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/serial_numbers/stock-move-generate-quantity-tip.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/serial_numbers/stock-move-generate-serials.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/serial_numbers/stock-move-generate-serials.png new file mode 100644 index 000000000..0da6ced8b Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/serial_numbers/stock-move-generate-serials.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/serial_numbers/stock-move-import-serials.png b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/serial_numbers/stock-move-import-serials.png new file mode 100644 index 000000000..a67a2af00 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/product_management/product_tracking/serial_numbers/stock-move-import-serials.png differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving.rst b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/shipping_receiving.rst rename to content-rst/applications/inventory_and_mrp/inventory/shipping_receiving.rst diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations.rst b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations.rst rename to content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations.rst diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/cross_dock.rst b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/cross_dock.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/cross_dock.rst rename to content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/cross_dock.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/cross_dock/cross1.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/cross_dock/cross1.png new file mode 100644 index 000000000..cc485445b Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/cross_dock/cross1.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/cross_dock/cross10.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/cross_dock/cross10.png new file mode 100644 index 000000000..3a6c66de2 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/cross_dock/cross10.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/cross_dock/cross11.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/cross_dock/cross11.png new file mode 100644 index 000000000..116e12e5e Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/cross_dock/cross11.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/cross_dock/cross12.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/cross_dock/cross12.png new file mode 100644 index 000000000..7a8a7917f Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/cross_dock/cross12.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/cross_dock/cross13.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/cross_dock/cross13.png new file mode 100644 index 000000000..035e1155d Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/cross_dock/cross13.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/cross_dock/cross14.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/cross_dock/cross14.png new file mode 100644 index 000000000..aaf8966b5 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/cross_dock/cross14.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/cross_dock/cross2.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/cross_dock/cross2.png new file mode 100644 index 000000000..9259563c6 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/cross_dock/cross2.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/cross_dock/cross3.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/cross_dock/cross3.png new file mode 100644 index 000000000..bbbdbb2d9 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/cross_dock/cross3.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/cross_dock/cross4.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/cross_dock/cross4.png new file mode 100644 index 000000000..8988f4319 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/cross_dock/cross4.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/cross_dock/cross5.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/cross_dock/cross5.png new file mode 100644 index 000000000..2fd28c6a4 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/cross_dock/cross5.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/cross_dock/cross6.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/cross_dock/cross6.png new file mode 100644 index 000000000..0d6dbe84b Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/cross_dock/cross6.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/cross_dock/cross7.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/cross_dock/cross7.png new file mode 100644 index 000000000..de1e7655c Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/cross_dock/cross7.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/cross_dock/cross8.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/cross_dock/cross8.png new file mode 100644 index 000000000..035e1155d Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/cross_dock/cross8.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/cross_dock/cross9.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/cross_dock/cross9.png new file mode 100644 index 000000000..c3cea7c64 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/cross_dock/cross9.png differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/delivery_three_steps.rst b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/delivery_three_steps.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/delivery_three_steps.rst rename to content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/delivery_three_steps.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/delivery_three_steps/delivery-three-steps-delivery-order.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/delivery_three_steps/delivery-three-steps-delivery-order.png new file mode 100644 index 000000000..10ffe44fe Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/delivery_three_steps/delivery-three-steps-delivery-order.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/delivery_three_steps/delivery-three-steps-multi-step-routes.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/delivery_three_steps/delivery-three-steps-multi-step-routes.png new file mode 100644 index 000000000..241a233ec Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/delivery_three_steps/delivery-three-steps-multi-step-routes.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/delivery_three_steps/delivery-three-steps-outgoing-shipments.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/delivery_three_steps/delivery-three-steps-outgoing-shipments.png new file mode 100644 index 000000000..334bd705f Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/delivery_three_steps/delivery-three-steps-outgoing-shipments.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/delivery_three_steps/delivery-three-steps-packing-order.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/delivery_three_steps/delivery-three-steps-packing-order.png new file mode 100644 index 000000000..58d21c712 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/delivery_three_steps/delivery-three-steps-packing-order.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/delivery_three_steps/delivery-three-steps-picking-order.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/delivery_three_steps/delivery-three-steps-picking-order.png new file mode 100644 index 000000000..4e0bd2e16 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/delivery_three_steps/delivery-three-steps-picking-order.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/delivery_three_steps/delivery-three-steps-smart-button.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/delivery_three_steps/delivery-three-steps-smart-button.png new file mode 100644 index 000000000..c8733ab11 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/delivery_three_steps/delivery-three-steps-smart-button.png differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/dropshipping.rst b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/dropshipping.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/dropshipping.rst rename to content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/dropshipping.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/dropshipping/dropship-purchase-order.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/dropshipping/dropship-purchase-order.png new file mode 100644 index 000000000..d489731a6 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/dropshipping/dropship-purchase-order.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/dropshipping/dropship-sales-order.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/dropshipping/dropship-sales-order.png new file mode 100644 index 000000000..3b3d0aa73 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/dropshipping/dropship-sales-order.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/dropshipping/enable-dropship-route.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/dropshipping/enable-dropship-route.png new file mode 100644 index 000000000..e8b76ace3 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/dropshipping/enable-dropship-route.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/dropshipping/product-vendor-config.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/dropshipping/product-vendor-config.png new file mode 100644 index 000000000..67518e7f9 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/dropshipping/product-vendor-config.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/dropshipping/sold-purchased-checkboxes.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/dropshipping/sold-purchased-checkboxes.png new file mode 100644 index 000000000..a9fc75463 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/dropshipping/sold-purchased-checkboxes.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/dropshipping/validate-dropship-receipt.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/dropshipping/validate-dropship-receipt.png new file mode 100644 index 000000000..fc397fdff Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/dropshipping/validate-dropship-receipt.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/dropshipping/view-all-dropship-orders.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/dropshipping/view-all-dropship-orders.png new file mode 100644 index 000000000..fdcb86437 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/dropshipping/view-all-dropship-orders.png differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/owned_stock.rst b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/owned_stock.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/owned_stock.rst rename to content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/owned_stock.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/owned_stock/owned-stock-enable-consignment.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/owned_stock/owned-stock-enable-consignment.png new file mode 100644 index 000000000..d40292fe8 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/owned_stock/owned-stock-enable-consignment.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/owned_stock/owned-stock-moves-history.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/owned_stock/owned-stock-moves-history.png new file mode 100644 index 000000000..b1bfa2ad4 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/owned_stock/owned-stock-moves-history.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/owned_stock/owned-stock-receipt-fields.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/owned_stock/owned-stock-receipt-fields.png new file mode 100644 index 000000000..28fb3e7c7 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/owned_stock/owned-stock-receipt-fields.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/owned_stock/owned-stock-sales-order.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/owned_stock/owned-stock-sales-order.png new file mode 100644 index 000000000..00b3909bc Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/owned_stock/owned-stock-sales-order.png differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/putaway.rst b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/putaway.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/putaway.rst rename to content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/putaway.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/putaway/activate-multi-step-routes.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/putaway/activate-multi-step-routes.png new file mode 100644 index 000000000..9259563c6 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/putaway/activate-multi-step-routes.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/putaway/create-putaway-rules.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/putaway/create-putaway-rules.png new file mode 100644 index 000000000..f45934ebc Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/putaway/create-putaway-rules.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/putaway/putaway-example.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/putaway/putaway-example.png new file mode 100644 index 000000000..6e80b5cc1 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/putaway/putaway-example.png differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_one_step.rst b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_one_step.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_one_step.rst rename to content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_one_step.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_one_step/receipts-delivery-one-step-delivery-button.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_one_step/receipts-delivery-one-step-delivery-button.png new file mode 100644 index 000000000..77dbf07ea Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_one_step/receipts-delivery-one-step-delivery-button.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_one_step/receipts-delivery-one-step-done-delivery.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_one_step/receipts-delivery-one-step-done-delivery.png new file mode 100644 index 000000000..db12056fb Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_one_step/receipts-delivery-one-step-done-delivery.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_one_step/receipts-delivery-one-step-done-receipt.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_one_step/receipts-delivery-one-step-done-receipt.png new file mode 100644 index 000000000..10f25cbe8 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_one_step/receipts-delivery-one-step-done-receipt.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_one_step/receipts-delivery-one-step-new-rfq.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_one_step/receipts-delivery-one-step-new-rfq.png new file mode 100644 index 000000000..7dc43c2f3 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_one_step/receipts-delivery-one-step-new-rfq.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_one_step/receipts-delivery-one-step-new-sales-order.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_one_step/receipts-delivery-one-step-new-sales-order.png new file mode 100644 index 000000000..b760000af Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_one_step/receipts-delivery-one-step-new-sales-order.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_one_step/receipts-delivery-one-step-receipt-smart-button.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_one_step/receipts-delivery-one-step-receipt-smart-button.png new file mode 100644 index 000000000..aa84196df Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_one_step/receipts-delivery-one-step-receipt-smart-button.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_one_step/receipts-delivery-one-step-warehouse-settings.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_one_step/receipts-delivery-one-step-warehouse-settings.png new file mode 100644 index 000000000..6d8ff92e6 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_one_step/receipts-delivery-one-step-warehouse-settings.png differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_two_steps.rst b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_two_steps.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_two_steps.rst rename to content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_two_steps.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_two_steps/receipts-delivery-two-steps-delivery-button.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_two_steps/receipts-delivery-two-steps-delivery-button.png new file mode 100644 index 000000000..d65204f74 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_two_steps/receipts-delivery-two-steps-delivery-button.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_two_steps/receipts-delivery-two-steps-delivery-order.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_two_steps/receipts-delivery-two-steps-delivery-order.png new file mode 100644 index 000000000..21dc6ca40 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_two_steps/receipts-delivery-two-steps-delivery-order.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_two_steps/receipts-delivery-two-steps-internal-transfer.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_two_steps/receipts-delivery-two-steps-internal-transfer.png new file mode 100644 index 000000000..f7879a7c2 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_two_steps/receipts-delivery-two-steps-internal-transfer.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_two_steps/receipts-delivery-two-steps-new-rfq.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_two_steps/receipts-delivery-two-steps-new-rfq.png new file mode 100644 index 000000000..8a793eaf2 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_two_steps/receipts-delivery-two-steps-new-rfq.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_two_steps/receipts-delivery-two-steps-new-sales-order.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_two_steps/receipts-delivery-two-steps-new-sales-order.png new file mode 100644 index 000000000..aa3b2e143 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_two_steps/receipts-delivery-two-steps-new-sales-order.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_two_steps/receipts-delivery-two-steps-picking-form.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_two_steps/receipts-delivery-two-steps-picking-form.png new file mode 100644 index 000000000..4a4077719 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_two_steps/receipts-delivery-two-steps-picking-form.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_two_steps/receipts-delivery-two-steps-receipt-form.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_two_steps/receipts-delivery-two-steps-receipt-form.png new file mode 100644 index 000000000..b43fc4e30 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_two_steps/receipts-delivery-two-steps-receipt-form.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_two_steps/receipts-delivery-two-steps-settings.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_two_steps/receipts-delivery-two-steps-settings.png new file mode 100644 index 000000000..60ecea7ca Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_two_steps/receipts-delivery-two-steps-settings.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_two_steps/receipts-delivery-two-steps-shipments.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_two_steps/receipts-delivery-two-steps-shipments.png new file mode 100644 index 000000000..805289a4c Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_two_steps/receipts-delivery-two-steps-shipments.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_two_steps/receipts-delivery-two-steps-smart-button.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_two_steps/receipts-delivery-two-steps-smart-button.png new file mode 100644 index 000000000..e0bf7c2ed Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_two_steps/receipts-delivery-two-steps-smart-button.png differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_three_steps.rst b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_three_steps.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_three_steps.rst rename to content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_three_steps.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_three_steps/receipts-three-steps-incoming-shipments.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_three_steps/receipts-three-steps-incoming-shipments.png new file mode 100644 index 000000000..1d8093512 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_three_steps/receipts-three-steps-incoming-shipments.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_three_steps/receipts-three-steps-internal-transfer.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_three_steps/receipts-three-steps-internal-transfer.png new file mode 100644 index 000000000..e932a7af8 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_three_steps/receipts-three-steps-internal-transfer.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_three_steps/receipts-three-steps-multi-step-routes.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_three_steps/receipts-three-steps-multi-step-routes.png new file mode 100644 index 000000000..208b1557a Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_three_steps/receipts-three-steps-multi-step-routes.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_three_steps/receipts-three-steps-receipt-form.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_three_steps/receipts-three-steps-receipt-form.png new file mode 100644 index 000000000..eefc795c1 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_three_steps/receipts-three-steps-receipt-form.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_three_steps/receipts-three-steps-second-transfer.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_three_steps/receipts-three-steps-second-transfer.png new file mode 100644 index 000000000..b04f61927 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_three_steps/receipts-three-steps-second-transfer.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_three_steps/receipts-three-steps-smart-button.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_three_steps/receipts-three-steps-smart-button.png new file mode 100644 index 000000000..3ac4eedeb Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_three_steps/receipts-three-steps-smart-button.png differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/stock_warehouses.rst b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/stock_warehouses.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/stock_warehouses.rst rename to content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/stock_warehouses.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/stock_warehouses/configure-physical-wh.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/stock_warehouses/configure-physical-wh.png new file mode 100644 index 000000000..f4dd9b7ab Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/stock_warehouses/configure-physical-wh.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/stock_warehouses/delivery-order.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/stock_warehouses/delivery-order.png new file mode 100644 index 000000000..36b25c460 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/stock_warehouses/delivery-order.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/stock_warehouses/on-hand.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/stock_warehouses/on-hand.png new file mode 100644 index 000000000..f5b8814a7 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/stock_warehouses/on-hand.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/stock_warehouses/parent-location.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/stock_warehouses/parent-location.png new file mode 100644 index 000000000..dd1459e51 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/stock_warehouses/parent-location.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/stock_warehouses/set-location-type-view.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/stock_warehouses/set-location-type-view.png new file mode 100644 index 000000000..4b701cf01 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/stock_warehouses/set-location-type-view.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/stock_warehouses/set-virtual-wh.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/stock_warehouses/set-virtual-wh.png new file mode 100644 index 000000000..bcedf5211 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/stock_warehouses/set-virtual-wh.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/stock_warehouses/stock-warehouses-create-warehouse.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/stock_warehouses/stock-warehouses-create-warehouse.png new file mode 100644 index 000000000..bf473f04f Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/stock_warehouses/stock-warehouses-create-warehouse.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/stock_warehouses/stock-warehouses-employee-form.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/stock_warehouses/stock-warehouses-employee-form.png new file mode 100644 index 000000000..35c886fa8 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/stock_warehouses/stock-warehouses-employee-form.png differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/storage_category.rst b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/storage_category.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/storage_category.rst rename to content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/storage_category.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/storage_category/capacity-by-product.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/storage_category/capacity-by-product.png new file mode 100644 index 000000000..e27bccfc8 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/storage_category/capacity-by-product.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/storage_category/enable-categories.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/storage_category/enable-categories.png new file mode 100644 index 000000000..850dbae33 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/storage_category/enable-categories.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/storage_category/location-storage-category.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/storage_category/location-storage-category.png new file mode 100644 index 000000000..ed1ade0d4 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/storage_category/location-storage-category.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/storage_category/smart-putaways.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/storage_category/smart-putaways.png new file mode 100644 index 000000000..f3444102e Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/storage_category/smart-putaways.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/storage_category/storage-category.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/storage_category/storage-category.png new file mode 100644 index 000000000..2af94ec88 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/storage_category/storage-category.png differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes.rst b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes.rst rename to content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/add-new-rules.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/add-new-rules.png new file mode 100644 index 000000000..37f4affe7 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/add-new-rules.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/add-routes-to-sales-lines.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/add-routes-to-sales-lines.png new file mode 100644 index 000000000..2eae5d7e2 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/add-routes-to-sales-lines.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/advanced-custom-route.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/advanced-custom-route.png new file mode 100644 index 000000000..418f68372 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/advanced-custom-route.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/applicable-on-warehouse.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/applicable-on-warehouse.png new file mode 100644 index 000000000..82a8d81da Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/applicable-on-warehouse.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/detailed-operations-2.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/detailed-operations-2.png new file mode 100644 index 000000000..68861ce54 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/detailed-operations-2.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/detailed-operations-transfer.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/detailed-operations-transfer.png new file mode 100644 index 000000000..e0635cb1a Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/detailed-operations-transfer.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/example-preconfigured-warehouse.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/example-preconfigured-warehouse.png new file mode 100644 index 000000000..e0e9485d6 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/example-preconfigured-warehouse.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/multi-steps-routes-feature.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/multi-steps-routes-feature.png new file mode 100644 index 000000000..860e1f969 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/multi-steps-routes-feature.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/on-product-route.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/on-product-route.png new file mode 100644 index 000000000..a5ab31c6f Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/on-product-route.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/operations-on-transfers.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/operations-on-transfers.png new file mode 100644 index 000000000..c66f4007b Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/operations-on-transfers.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/preconfigured-routes.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/preconfigured-routes.png new file mode 100644 index 000000000..28bb9dc79 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/preconfigured-routes.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/pull-from-rule-example.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/pull-from-rule-example.png new file mode 100644 index 000000000..6de2bebeb Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/pull-from-rule-example.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/pull-from-rule-stock-to-packing.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/pull-from-rule-stock-to-packing.png new file mode 100644 index 000000000..71ca15d79 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/pull-from-rule-stock-to-packing.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/pull-rule.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/pull-rule.png new file mode 100644 index 000000000..37dbae92b Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/pull-rule.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/push-rule.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/push-rule.png new file mode 100644 index 000000000..78685fbc7 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/push-rule.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/push-to-rule-example.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/push-to-rule-example.png new file mode 100644 index 000000000..19fbc8e1d Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/push-to-rule-example.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/routes-example.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/routes-example.png new file mode 100644 index 000000000..c4e3cbb5d Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/routes-example.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/routes-logistic-section.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/routes-logistic-section.png new file mode 100644 index 000000000..300a56f2f Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/routes-logistic-section.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/rules-example.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/rules-example.png new file mode 100644 index 000000000..f49ba6475 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/rules-example.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/stock-example.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/stock-example.png new file mode 100644 index 000000000..3aeff653a Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/stock-example.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/transfers-overview.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/transfers-overview.png new file mode 100644 index 000000000..48c0936b1 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/transfers-overview.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/transfers-status.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/transfers-status.png new file mode 100644 index 000000000..934eaf41d Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/transfers-status.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/waiting-status.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/waiting-status.png new file mode 100644 index 000000000..87ef1db67 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes/waiting-status.png differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods.rst b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods.rst rename to content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods.rst diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/batch.rst b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/batch.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/batch.rst rename to content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/batch.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/batch/add-to-batch-window.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/batch/add-to-batch-window.png new file mode 100644 index 000000000..a5c69f4e2 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/batch/add-to-batch-window.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/batch/add-to-batch.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/batch/add-to-batch.png new file mode 100644 index 000000000..16f733e63 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/batch/add-to-batch.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/batch/add-transfers-window.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/batch/add-transfers-window.png new file mode 100644 index 000000000..02c8b5d4c Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/batch/add-transfers-window.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/batch/auto-batch-grouping.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/batch/auto-batch-grouping.png new file mode 100644 index 000000000..a286e643b Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/batch/auto-batch-grouping.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/batch/batch-transfer-checkbox.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/batch/batch-transfer-checkbox.png new file mode 100644 index 000000000..d9efcf92c Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/batch/batch-transfer-checkbox.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/batch/batch-transfer-form.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/batch/batch-transfer-form.png new file mode 100644 index 000000000..b0bc6906c Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/batch/batch-transfer-form.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/batch/create-backorder.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/batch/create-backorder.png new file mode 100644 index 000000000..346e18110 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/batch/create-backorder.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/batch/locations-routes-checkbox.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/batch/locations-routes-checkbox.png new file mode 100644 index 000000000..43bb56049 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/batch/locations-routes-checkbox.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/batch/operations-tab.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/batch/operations-tab.png new file mode 100644 index 000000000..f42bc9507 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/batch/operations-tab.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/batch/prepare-batch.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/batch/prepare-batch.png new file mode 100644 index 000000000..033564f8c Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/batch/prepare-batch.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/batch/process-batch-transfer.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/batch/process-batch-transfer.png new file mode 100644 index 000000000..4d9d18be5 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/batch/process-batch-transfer.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/batch/transfers-drop-down.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/batch/transfers-drop-down.png new file mode 100644 index 000000000..a4d87a05a Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/batch/transfers-drop-down.png differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/cluster.rst b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/cluster.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/cluster.rst rename to content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/cluster.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/cluster/add-to-batch-window.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/cluster/add-to-batch-window.png new file mode 100644 index 000000000..a5c69f4e2 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/cluster/add-to-batch-window.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/cluster/cluster-batch-example.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/cluster/cluster-batch-example.png new file mode 100644 index 000000000..0400c08dd Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/cluster/cluster-batch-example.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/cluster/cluster-example.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/cluster/cluster-example.png new file mode 100644 index 000000000..23faf4c91 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/cluster/cluster-example.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/cluster/cluster-package.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/cluster/cluster-package.png new file mode 100644 index 000000000..42be71af3 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/cluster/cluster-package.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/cluster/configs.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/cluster/configs.png new file mode 100644 index 000000000..60e0b201c Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/cluster/configs.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/cluster/locations-routes-checkbox.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/cluster/locations-routes-checkbox.png new file mode 100644 index 000000000..43bb56049 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/cluster/locations-routes-checkbox.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/cluster/select-picks.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/cluster/select-picks.png new file mode 100644 index 000000000..50578db68 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/cluster/select-picks.png differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/wave.rst b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/wave.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/wave.rst rename to content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/wave.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/wave/auto-wave-grouping.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/wave/auto-wave-grouping.png new file mode 100644 index 000000000..01c4a3cd1 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/wave/auto-wave-grouping.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/wave/list-of-operations.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/wave/list-of-operations.png new file mode 100644 index 000000000..d4ea863e1 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/wave/list-of-operations.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/wave/select-lines.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/wave/select-lines.png new file mode 100644 index 000000000..c2f11a39d Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/wave/select-lines.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/wave/wave-transfers-setting.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/wave/wave-transfers-setting.png new file mode 100644 index 000000000..3e74daadb Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/wave/wave-transfers-setting.png differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies.rst b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies.rst rename to content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies.rst diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/closest_location.rst b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/closest_location.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/closest_location.rst rename to content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/closest_location.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/closest_location/locations.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/closest_location/locations.png new file mode 100644 index 000000000..74da473f0 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/closest_location/locations.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/closest_location/on-hand-stock.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/closest_location/on-hand-stock.png new file mode 100644 index 000000000..cd3dab48c Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/closest_location/on-hand-stock.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/closest_location/stock-move-window.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/closest_location/stock-move-window.png new file mode 100644 index 000000000..c00e70b04 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/closest_location/stock-move-window.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/enable-expiration.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/enable-expiration.png new file mode 100644 index 000000000..a5514aa36 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/enable-expiration.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/enable-location.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/enable-location.png new file mode 100644 index 000000000..eb95d9544 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/enable-location.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/enable-lots.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/enable-lots.png new file mode 100644 index 000000000..fb9c5cb28 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/enable-lots.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/enable-pack.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/enable-pack.png new file mode 100644 index 000000000..b7245bec0 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/enable-pack.png differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/fefo.rst b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/fefo.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/fefo.rst rename to content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/fefo.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/fefo/eggs-picking.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/fefo/eggs-picking.png new file mode 100644 index 000000000..256e408c9 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/fefo/eggs-picking.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/fefo/removal-date.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/fefo/removal-date.png new file mode 100644 index 000000000..9dbb46d49 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/fefo/removal-date.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/fefo/user-set-date.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/fefo/user-set-date.png new file mode 100644 index 000000000..c96f47e5b Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/fefo/user-set-date.png differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/fifo.rst b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/fifo.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/fifo.rst rename to content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/fifo.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/fifo/created-on.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/fifo/created-on.png new file mode 100644 index 000000000..313f3b6fb Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/fifo/created-on.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/fifo/fifo-example.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/fifo/fifo-example.png new file mode 100644 index 000000000..f0787f391 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/fifo/fifo-example.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/fifo/white-shirt-picking.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/fifo/white-shirt-picking.png new file mode 100644 index 000000000..4f8e81275 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/fifo/white-shirt-picking.png differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/least_packages.rst b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/least_packages.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/least_packages.rst rename to content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/least_packages.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/least_packages/least-package.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/least_packages/least-package.png new file mode 100644 index 000000000..399be1b08 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/least_packages/least-package.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/least_packages/on-hand-flour.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/least_packages/on-hand-flour.png new file mode 100644 index 000000000..80f9b60ee Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/least_packages/on-hand-flour.png differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/lifo.rst b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/lifo.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/lifo.rst rename to content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/lifo.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/lifo/cinder-block-picking.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/lifo/cinder-block-picking.png new file mode 100644 index 000000000..926f6cd75 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/lifo/cinder-block-picking.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/navigate-location-category.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/navigate-location-category.png new file mode 100644 index 000000000..57613cb4f Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/navigate-location-category.png differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods.rst b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods.rst rename to content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods.rst diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/at_confirmation.rst b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/at_confirmation.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/at_confirmation.rst rename to content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/at_confirmation.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/at_confirmation/at-confirmation-availability-tooltip.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/at_confirmation/at-confirmation-availability-tooltip.png new file mode 100644 index 000000000..b2c5918cd Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/at_confirmation/at-confirmation-availability-tooltip.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/at_confirmation/at-confirmation-delivery-order.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/at_confirmation/at-confirmation-delivery-order.png new file mode 100644 index 000000000..90bb28f1d Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/at_confirmation/at-confirmation-delivery-order.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/at_confirmation/at-confirmation-forecasted-equation.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/at_confirmation/at-confirmation-forecasted-equation.png new file mode 100644 index 000000000..51bcfbdd6 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/at_confirmation/at-confirmation-forecasted-equation.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/at_confirmation/at-confirmation-operations-type.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/at_confirmation/at-confirmation-operations-type.png new file mode 100644 index 000000000..894f75b4b Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/at_confirmation/at-confirmation-operations-type.png differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/before_scheduled_date.rst b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/before_scheduled_date.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/before_scheduled_date.rst rename to content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/before_scheduled_date.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/before_scheduled_date/before-scheduled-date-availability-tooltip.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/before_scheduled_date/before-scheduled-date-availability-tooltip.png new file mode 100644 index 000000000..081955699 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/before_scheduled_date/before-scheduled-date-availability-tooltip.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/before_scheduled_date/before-scheduled-date-configuration.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/before_scheduled_date/before-scheduled-date-configuration.png new file mode 100644 index 000000000..88a2712a7 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/before_scheduled_date/before-scheduled-date-configuration.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/before_scheduled_date/before-scheduled-date-customer-lead-time.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/before_scheduled_date/before-scheduled-date-customer-lead-time.png new file mode 100644 index 000000000..7bd16a7e4 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/before_scheduled_date/before-scheduled-date-customer-lead-time.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/before_scheduled_date/before-scheduled-date-days-before.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/before_scheduled_date/before-scheduled-date-days-before.png new file mode 100644 index 000000000..4b1fff133 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/before_scheduled_date/before-scheduled-date-days-before.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/before_scheduled_date/before-scheduled-date-delivery-order-form.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/before_scheduled_date/before-scheduled-date-delivery-order-form.png new file mode 100644 index 000000000..c7e6c189e Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/before_scheduled_date/before-scheduled-date-delivery-order-form.png differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/manually.rst b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/manually.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/manually.rst rename to content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/manually.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/manually/manually-availability-tooltip.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/manually/manually-availability-tooltip.png new file mode 100644 index 000000000..9e6f80e96 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/manually/manually-availability-tooltip.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/manually/manually-check-availability.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/manually/manually-check-availability.png new file mode 100644 index 000000000..bfa98d829 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/manually/manually-check-availability.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/manually/manually-delivery-order-form.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/manually/manually-delivery-order-form.png new file mode 100644 index 000000000..b3293f641 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/manually/manually-delivery-order-form.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/manually/manually-delivery-orders-card.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/manually/manually-delivery-orders-card.png new file mode 100644 index 000000000..a2f8649b9 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/manually/manually-delivery-orders-card.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/manually/manually-operations-type.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/manually/manually-operations-type.png new file mode 100644 index 000000000..3bbce3752 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/manually/manually-operations-type.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/reservation-methods-before-scheduled-date.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/reservation-methods-before-scheduled-date.png new file mode 100644 index 000000000..faa239217 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/reservation-methods-before-scheduled-date.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/reservation-methods-operations-type-field.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/reservation-methods-operations-type-field.png new file mode 100644 index 000000000..4bf98d900 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/reservation-methods-operations-type-field.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/reservation-methods-operations-type-menu.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/reservation-methods-operations-type-menu.png new file mode 100644 index 000000000..1e4077dc5 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/reservation-methods-operations-type-menu.png differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration.rst b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration.rst rename to content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration.rst diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/bpost.rst b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/bpost.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/bpost.rst rename to content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/bpost.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/bpost/bpost.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/bpost/bpost.png new file mode 100644 index 000000000..096850226 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/bpost/bpost.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/bpost/credentials.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/bpost/credentials.png new file mode 100644 index 000000000..b78f35e4d Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/bpost/credentials.png differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/cancel.rst b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/cancel.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/cancel.rst rename to content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/cancel.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/cancel/cancel01.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/cancel/cancel01.png new file mode 100644 index 000000000..9032516d2 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/cancel/cancel01.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/cancel/cancel02.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/cancel/cancel02.png new file mode 100644 index 000000000..77261c940 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/cancel/cancel02.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/cancel/cancel03.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/cancel/cancel03.png new file mode 100644 index 000000000..5235c0a74 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/cancel/cancel03.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/delivery-order.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/delivery-order.png new file mode 100644 index 000000000..f8dbd9e0f Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/delivery-order.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/delivery-product.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/delivery-product.png new file mode 100644 index 000000000..60ee48bc0 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/delivery-product.png differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dhl_credentials.rst b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dhl_credentials.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dhl_credentials.rst rename to content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dhl_credentials.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dhl_credentials/dhl-form.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dhl_credentials/dhl-form.png new file mode 100644 index 000000000..4240b9f91 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dhl_credentials/dhl-form.png differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dispatch.rst b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dispatch.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dispatch.rst rename to content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dispatch.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dispatch/add-to-wave.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dispatch/add-to-wave.png new file mode 100644 index 000000000..22cd32956 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dispatch/add-to-wave.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dispatch/batch-form.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dispatch/batch-form.png new file mode 100644 index 000000000..36e348ee3 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dispatch/batch-form.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dispatch/categories.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dispatch/categories.png new file mode 100644 index 000000000..c796da8eb Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dispatch/categories.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dispatch/delivery-method.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dispatch/delivery-method.png new file mode 100644 index 000000000..9b5b01719 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dispatch/delivery-method.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dispatch/dock-location.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dispatch/dock-location.png new file mode 100644 index 000000000..11ad18b45 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dispatch/dock-location.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dispatch/google-map.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dispatch/google-map.png new file mode 100644 index 000000000..bc4a1dcf4 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dispatch/google-map.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dispatch/map.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dispatch/map.png new file mode 100644 index 000000000..05fc304b4 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dispatch/map.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dispatch/prepare-batch.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dispatch/prepare-batch.png new file mode 100644 index 000000000..3881bd60e Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dispatch/prepare-batch.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dispatch/set-carrier.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dispatch/set-carrier.png new file mode 100644 index 000000000..3c9800fd2 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dispatch/set-carrier.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dispatch/settings.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dispatch/settings.png new file mode 100644 index 000000000..ce6e78a4f Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dispatch/settings.png differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/fedex.rst b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/fedex.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/fedex.rst rename to content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/fedex.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/fedex/fedex-form.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/fedex/fedex-form.png new file mode 100644 index 000000000..9b7139c94 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/fedex/fedex-form.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/fedex/fsm-button.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/fedex/fsm-button.png new file mode 100644 index 000000000..707be4ae1 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/fedex/fsm-button.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/install-module.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/install-module.png new file mode 100644 index 000000000..cbae4d592 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/install-module.png differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/invoicing.rst b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/invoicing.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/invoicing.rst rename to content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/invoicing.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/invoicing/add-a-shipping-method.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/invoicing/add-a-shipping-method.png new file mode 100644 index 000000000..0fb54ce17 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/invoicing/add-a-shipping-method.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/invoicing/add-shipping.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/invoicing/add-shipping.png new file mode 100644 index 000000000..59feec69f Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/invoicing/add-shipping.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/invoicing/create-invoice.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/invoicing/create-invoice.png new file mode 100644 index 000000000..9d2fb2311 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/invoicing/create-invoice.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/invoicing/delivery-product.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/invoicing/delivery-product.png new file mode 100644 index 000000000..211eca6f3 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/invoicing/delivery-product.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/invoicing/enable-delivery.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/invoicing/enable-delivery.png new file mode 100644 index 000000000..477f56ffb Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/invoicing/enable-delivery.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/invoicing/invoice-cost.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/invoicing/invoice-cost.png new file mode 100644 index 000000000..8887136e4 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/invoicing/invoice-cost.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/invoicing/invoice-line.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/invoicing/invoice-line.png new file mode 100644 index 000000000..d7ed8b57b Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/invoicing/invoice-line.png differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/label_type.rst b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/label_type.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/label_type.rst rename to content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/label_type.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/label_type/full-page-fedex.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/label_type/full-page-fedex.png new file mode 100644 index 000000000..547f6174c Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/label_type/full-page-fedex.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/label_type/half-page-fedex.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/label_type/half-page-fedex.png new file mode 100644 index 000000000..4e015716d Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/label_type/half-page-fedex.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/label_type/label-type-dropdown.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/label_type/label-type-dropdown.png new file mode 100644 index 000000000..4b990a925 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/label_type/label-type-dropdown.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/label_type/shipping-italy-so.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/label_type/shipping-italy-so.png new file mode 100644 index 000000000..4f703bbb0 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/label_type/shipping-italy-so.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/label_type/shipping-options.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/label_type/shipping-options.png new file mode 100644 index 000000000..b0cfb1960 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/label_type/shipping-options.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/label_type/shipping-pdfs.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/label_type/shipping-pdfs.png new file mode 100644 index 000000000..ef0d45eab Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/label_type/shipping-pdfs.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/label_type/shipping-rate.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/label_type/shipping-rate.png new file mode 100644 index 000000000..21afb0179 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/label_type/shipping-rate.png differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/labels.rst b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/labels.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/labels.rst rename to content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/labels.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/labels/add-shipping-button.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/labels/add-shipping-button.png new file mode 100644 index 000000000..b2766a9df Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/labels/add-shipping-button.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/labels/additional-info-tab.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/labels/additional-info-tab.png new file mode 100644 index 000000000..8d24b3f39 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/labels/additional-info-tab.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/labels/get-rate.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/labels/get-rate.png new file mode 100644 index 000000000..da7bdd5ba Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/labels/get-rate.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/labels/integration-level.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/labels/integration-level.png new file mode 100644 index 000000000..0d99063e3 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/labels/integration-level.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/labels/pick-print-label.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/labels/pick-print-label.png new file mode 100644 index 000000000..cf6a8560d Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/labels/pick-print-label.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/labels/sample-label.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/labels/sample-label.png new file mode 100644 index 000000000..de115700f Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/labels/sample-label.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/labels/shipping-label.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/labels/shipping-label.png new file mode 100644 index 000000000..d09124d77 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/labels/shipping-label.png differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/multipack.rst b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/multipack.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/multipack.rst rename to content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/multipack.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/multipack/back-orders-button.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/multipack/back-orders-button.png new file mode 100644 index 000000000..a0b81a19f Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/multipack/back-orders-button.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/multipack/backorder-chatter.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/multipack/backorder-chatter.png new file mode 100644 index 000000000..362927b07 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/multipack/backorder-chatter.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/multipack/backorder-pop-up.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/multipack/backorder-pop-up.png new file mode 100644 index 000000000..7175ed398 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/multipack/backorder-pop-up.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/multipack/detailed-operations.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/multipack/detailed-operations.png new file mode 100644 index 000000000..15ba08987 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/multipack/detailed-operations.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/multipack/packages-setting.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/multipack/packages-setting.png new file mode 100644 index 000000000..2b7d4ea2a Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/multipack/packages-setting.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/multipack/packages-smart-button.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/multipack/packages-smart-button.png new file mode 100644 index 000000000..9d7a6f383 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/multipack/packages-smart-button.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/multipack/product-menu-icon.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/multipack/product-menu-icon.png new file mode 100644 index 000000000..d7b5e9996 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/multipack/product-menu-icon.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/multipack/put-in-pack.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/multipack/put-in-pack.png new file mode 100644 index 000000000..dfef666c4 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/multipack/put-in-pack.png differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/new_delivery_method.rst b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/new_delivery_method.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/new_delivery_method.rst rename to content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/new_delivery_method.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/new_delivery_method/delivery-cost-example.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/new_delivery_method/delivery-cost-example.png new file mode 100644 index 000000000..49762b9e3 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/new_delivery_method/delivery-cost-example.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/new_delivery_method/enable-delivery.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/new_delivery_method/enable-delivery.png new file mode 100644 index 000000000..b208dec1d Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/new_delivery_method/enable-delivery.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/new_delivery_method/new-shipping-method.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/new_delivery_method/new-shipping-method.png new file mode 100644 index 000000000..9521f10fb Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/new_delivery_method/new-shipping-method.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/new_delivery_method/pricing-rule.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/new_delivery_method/pricing-rule.png new file mode 100644 index 000000000..807a47253 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/new_delivery_method/pricing-rule.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/new_delivery_method/set-routes.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/new_delivery_method/set-routes.png new file mode 100644 index 000000000..c03b27e76 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/new_delivery_method/set-routes.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/new_delivery_method/shipping-route.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/new_delivery_method/shipping-route.png new file mode 100644 index 000000000..2b754a01b Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/new_delivery_method/shipping-route.png differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/print_on_validation.rst b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/print_on_validation.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/print_on_validation.rst rename to content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/print_on_validation.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/print_on_validation/delivery-slip.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/print_on_validation/delivery-slip.png new file mode 100644 index 000000000..064c68d03 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/print_on_validation/delivery-slip.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/print_on_validation/export-doc.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/print_on_validation/export-doc.png new file mode 100644 index 000000000..c83ed69a1 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/print_on_validation/export-doc.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/print_on_validation/fedex-carrier-label.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/print_on_validation/fedex-carrier-label.png new file mode 100644 index 000000000..c915a68db Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/print_on_validation/fedex-carrier-label.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/print_on_validation/four-seven.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/print_on_validation/four-seven.png new file mode 100644 index 000000000..86521b757 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/print_on_validation/four-seven.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/print_on_validation/four-twelve-lots.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/print_on_validation/four-twelve-lots.png new file mode 100644 index 000000000..10cbabe59 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/print_on_validation/four-twelve-lots.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/print_on_validation/four-twelve.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/print_on_validation/four-twelve.png new file mode 100644 index 000000000..3b9173bf7 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/print_on_validation/four-twelve.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/print_on_validation/label-type.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/print_on_validation/label-type.png new file mode 100644 index 000000000..e0f0ee923 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/print_on_validation/label-type.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/print_on_validation/package-barcode.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/print_on_validation/package-barcode.png new file mode 100644 index 000000000..7843ef2b4 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/print_on_validation/package-barcode.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/print_on_validation/package-content.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/print_on_validation/package-content.png new file mode 100644 index 000000000..f29506c1e Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/print_on_validation/package-content.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/print_on_validation/print-on-validation.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/print_on_validation/print-on-validation.png new file mode 100644 index 000000000..1e83adb99 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/print_on_validation/print-on-validation.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/print_on_validation/printer-report.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/print_on_validation/printer-report.png new file mode 100644 index 000000000..4a0e4d875 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/print_on_validation/printer-report.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/print_on_validation/return-slip.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/print_on_validation/return-slip.png new file mode 100644 index 000000000..d693a0a95 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/print_on_validation/return-slip.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/print_on_validation/select-printer.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/print_on_validation/select-printer.png new file mode 100644 index 000000000..6f6894dd9 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/print_on_validation/select-printer.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/print_on_validation/two-seven.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/print_on_validation/two-seven.png new file mode 100644 index 000000000..b2acce1f5 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/print_on_validation/two-seven.png differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/sendcloud_shipping.rst b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/sendcloud_shipping.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/sendcloud_shipping.rst rename to content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/sendcloud_shipping.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/sendcloud_shipping/contracts.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/sendcloud_shipping/contracts.png new file mode 100644 index 000000000..5b67131d0 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/sendcloud_shipping/contracts.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/sendcloud_shipping/enable-shipping-rules.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/sendcloud_shipping/enable-shipping-rules.png new file mode 100644 index 000000000..f2bd35650 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/sendcloud_shipping/enable-shipping-rules.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/sendcloud_shipping/price-csv.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/sendcloud_shipping/price-csv.png new file mode 100644 index 000000000..adb68df5f Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/sendcloud_shipping/price-csv.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/sendcloud_shipping/public-secret-keys.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/sendcloud_shipping/public-secret-keys.png new file mode 100644 index 000000000..73db318b8 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/sendcloud_shipping/public-secret-keys.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/sendcloud_shipping/sendcloud-example.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/sendcloud_shipping/sendcloud-example.png new file mode 100644 index 000000000..4c89a2306 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/sendcloud_shipping/sendcloud-example.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/sendcloud_shipping/sendcloud-mod.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/sendcloud_shipping/sendcloud-mod.png new file mode 100644 index 000000000..59b0518ff Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/sendcloud_shipping/sendcloud-mod.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/sendcloud_shipping/settings-shipping.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/sendcloud_shipping/settings-shipping.png new file mode 100644 index 000000000..706ae9085 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/sendcloud_shipping/settings-shipping.png differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/starshipit_shipping.rst b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/starshipit_shipping.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/starshipit_shipping.rst rename to content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/starshipit_shipping.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/starshipit_shipping/starshipit-app.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/starshipit_shipping/starshipit-app.png new file mode 100644 index 000000000..d5d13a5e8 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/starshipit_shipping/starshipit-app.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/starshipit_shipping/starshipit-checkout-rate.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/starshipit_shipping/starshipit-checkout-rate.png new file mode 100644 index 000000000..92aeb223d Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/starshipit_shipping/starshipit-checkout-rate.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/starshipit_shipping/starshipit-configuration.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/starshipit_shipping/starshipit-configuration.png new file mode 100644 index 000000000..49fd2cebc Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/starshipit_shipping/starshipit-configuration.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/starshipit_shipping/starshipit-rules.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/starshipit_shipping/starshipit-rules.png new file mode 100644 index 000000000..a50298b0e Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/starshipit_shipping/starshipit-rules.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/starshipit_shipping/starshipit-settings-address.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/starshipit_shipping/starshipit-settings-address.png new file mode 100644 index 000000000..a9b3f5945 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/starshipit_shipping/starshipit-settings-address.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/starshipit_shipping/starshipit-settings-api.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/starshipit_shipping/starshipit-settings-api.png new file mode 100644 index 000000000..85f0c0d48 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/starshipit_shipping/starshipit-settings-api.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/starshipit_shipping/starshipit-settings-couriers.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/starshipit_shipping/starshipit-settings-couriers.png new file mode 100644 index 000000000..3d20fec35 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/starshipit_shipping/starshipit-settings-couriers.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/starshipit_shipping/starshipit-shipping.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/starshipit_shipping/starshipit-shipping.png new file mode 100644 index 000000000..0a4cb2870 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/starshipit_shipping/starshipit-shipping.png differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/third_party_shipper.rst b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/third_party_shipper.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/third_party_shipper.rst rename to content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/third_party_shipper.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/third_party_shipper/add-shipping.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/third_party_shipper/add-shipping.png new file mode 100644 index 000000000..59feec69f Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/third_party_shipper/add-shipping.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/third_party_shipper/company.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/third_party_shipper/company.png new file mode 100644 index 000000000..73f2342ae Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/third_party_shipper/company.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/third_party_shipper/delivery-info.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/third_party_shipper/delivery-info.png new file mode 100644 index 000000000..16e91e842 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/third_party_shipper/delivery-info.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/third_party_shipper/fedex.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/third_party_shipper/fedex.png new file mode 100644 index 000000000..de6a33349 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/third_party_shipper/fedex.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/third_party_shipper/internal-link.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/third_party_shipper/internal-link.png new file mode 100644 index 000000000..6ae9eef15 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/third_party_shipper/internal-link.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/third_party_shipper/log.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/third_party_shipper/log.png new file mode 100644 index 000000000..497410a47 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/third_party_shipper/log.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/third_party_shipper/logging.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/third_party_shipper/logging.png new file mode 100644 index 000000000..6fbce9fe0 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/third_party_shipper/logging.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/third_party_shipper/no-debug.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/third_party_shipper/no-debug.png new file mode 100644 index 000000000..f0813620b Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/third_party_shipper/no-debug.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/third_party_shipper/product-weight.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/third_party_shipper/product-weight.png new file mode 100644 index 000000000..e49e289ba Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/third_party_shipper/product-weight.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/third_party_shipper/production.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/third_party_shipper/production.png new file mode 100644 index 000000000..af8e23684 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/third_party_shipper/production.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/third_party_shipper/shipping-connectors.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/third_party_shipper/shipping-connectors.png new file mode 100644 index 000000000..ad911f83b Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/third_party_shipper/shipping-connectors.png differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/ups_credentials.rst b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/ups_credentials.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/ups_credentials.rst rename to content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/ups_credentials.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/ups_credentials/account-number.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/ups_credentials/account-number.png new file mode 100644 index 000000000..aaf42d990 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/ups_credentials/account-number.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/ups_credentials/accounts-payment.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/ups_credentials/accounts-payment.png new file mode 100644 index 000000000..6c917a990 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/ups_credentials/accounts-payment.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/ups_credentials/add-app-development.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/ups_credentials/add-app-development.png new file mode 100644 index 000000000..5d4eec126 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/ups_credentials/add-app-development.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/ups_credentials/apps.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/ups_credentials/apps.png new file mode 100644 index 000000000..df702e6b0 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/ups_credentials/apps.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/ups_credentials/credentials.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/ups_credentials/credentials.png new file mode 100644 index 000000000..2c1a96c3a Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/ups_credentials/credentials.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/ups_credentials/developer-account-setup.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/ups_credentials/developer-account-setup.png new file mode 100644 index 000000000..984e8926f Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/ups_credentials/developer-account-setup.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/ups_credentials/my-apps.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/ups_credentials/my-apps.png new file mode 100644 index 000000000..98cd798d9 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/ups_credentials/my-apps.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/ups_credentials/new-account.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/ups_credentials/new-account.png new file mode 100644 index 000000000..dbd9cc790 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/ups_credentials/new-account.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/ups_credentials/payment-card.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/ups_credentials/payment-card.png new file mode 100644 index 000000000..9c5780cd3 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/ups_credentials/payment-card.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/ups_credentials/shipping-account.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/ups_credentials/shipping-account.png new file mode 100644 index 000000000..f06b910fe Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/ups_credentials/shipping-account.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/ups_credentials/ups-configuration.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/ups_credentials/ups-configuration.png new file mode 100644 index 000000000..a5ec17bf8 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/ups_credentials/ups-configuration.png differ diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/zebra.rst b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/zebra.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/zebra.rst rename to content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/zebra.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/zebra/architecture.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/zebra/architecture.png new file mode 100644 index 000000000..c89dcba11 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/zebra/architecture.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/zebra/default-margin.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/zebra/default-margin.png new file mode 100644 index 000000000..a7784cabb Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/zebra/default-margin.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/zebra/fixed-margin.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/zebra/fixed-margin.png new file mode 100644 index 000000000..40762739b Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/zebra/fixed-margin.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/zebra/lot.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/zebra/lot.png new file mode 100644 index 000000000..4d489afd7 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/zebra/lot.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/zebra/normal-barcode.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/zebra/normal-barcode.png new file mode 100644 index 000000000..5b94e0d93 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/zebra/normal-barcode.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/zebra/qweb-views.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/zebra/qweb-views.png new file mode 100644 index 000000000..2e8e8cff9 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/zebra/qweb-views.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/zebra/rotate.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/zebra/rotate.png new file mode 100644 index 000000000..b7bfb9f31 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/zebra/rotate.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/zebra/search.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/zebra/search.png new file mode 100644 index 000000000..a9e50c014 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/zebra/search.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/zebra/shrink-barcode.png b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/zebra/shrink-barcode.png new file mode 100644 index 000000000..b2009e24b Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/zebra/shrink-barcode.png differ diff --git a/content/applications/inventory_and_mrp/inventory/warehouses_storage.rst b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/warehouses_storage.rst rename to content-rst/applications/inventory_and_mrp/inventory/warehouses_storage.rst diff --git a/content/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management.rst b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management.rst rename to content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management.rst diff --git a/content/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/count_products.rst b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/count_products.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/count_products.rst rename to content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/count_products.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/count_products/adjustment-history.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/count_products/adjustment-history.png new file mode 100644 index 000000000..472eada56 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/count_products/adjustment-history.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/count_products/annual-inventory.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/count_products/annual-inventory.png new file mode 100644 index 000000000..867e52efd Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/count_products/annual-inventory.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/count_products/apply-inventory-adjustment.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/count_products/apply-inventory-adjustment.png new file mode 100644 index 000000000..831f70a50 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/count_products/apply-inventory-adjustment.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/count_products/count-popup.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/count_products/count-popup.png new file mode 100644 index 000000000..4afceff36 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/count_products/count-popup.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/count_products/difference-column.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/count_products/difference-column.png new file mode 100644 index 000000000..32df90ba0 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/count_products/difference-column.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/count_products/forecast-report.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/count_products/forecast-report.png new file mode 100644 index 000000000..0e0a09a8e Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/count_products/forecast-report.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/count_products/history-inventory-adjustments.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/count_products/history-inventory-adjustments.png new file mode 100644 index 000000000..920dc85c4 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/count_products/history-inventory-adjustments.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/count_products/inventory-adjustment-actions.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/count_products/inventory-adjustment-actions.png new file mode 100644 index 000000000..f1c1c8a39 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/count_products/inventory-adjustment-actions.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/count_products/inventory-adjustments-page.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/count_products/inventory-adjustments-page.png new file mode 100644 index 000000000..1934f59f1 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/count_products/inventory-adjustments-page.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/count_products/relocate-popup.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/count_products/relocate-popup.png new file mode 100644 index 000000000..bffd1ffa2 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/count_products/relocate-popup.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/count_products/reverted-adjustment.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/count_products/reverted-adjustment.png new file mode 100644 index 000000000..fe53b95d6 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/count_products/reverted-adjustment.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/count_products/zero-move.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/count_products/zero-move.png new file mode 100644 index 000000000..b19d4a7ad Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/count_products/zero-move.png differ diff --git a/content/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/cycle_counts.rst b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/cycle_counts.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/cycle_counts.rst rename to content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/cycle_counts.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/cycle_counts/cycle-counts-add-custom-filter.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/cycle_counts/cycle-counts-add-custom-filter.png new file mode 100644 index 000000000..76d3da913 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/cycle_counts/cycle-counts-add-custom-filter.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/cycle_counts/cycle-counts-enabled-setting.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/cycle_counts/cycle-counts-enabled-setting.png new file mode 100644 index 000000000..f390c6144 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/cycle_counts/cycle-counts-enabled-setting.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/cycle_counts/cycle-counts-filter-menu.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/cycle_counts/cycle-counts-filter-menu.png new file mode 100644 index 000000000..3c1887dcf Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/cycle_counts/cycle-counts-filter-menu.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/cycle_counts/cycle-counts-frequency-calendar.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/cycle_counts/cycle-counts-frequency-calendar.png new file mode 100644 index 000000000..770f3e5f4 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/cycle_counts/cycle-counts-frequency-calendar.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/cycle_counts/cycle-counts-frequency-value.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/cycle_counts/cycle-counts-frequency-value.png new file mode 100644 index 000000000..3a891e766 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/cycle_counts/cycle-counts-frequency-value.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/inventory-loss.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/inventory-loss.png new file mode 100644 index 000000000..c6f49c659 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/inventory-loss.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/locations.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/locations.png new file mode 100644 index 000000000..6ff91f2bc Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/locations.png differ diff --git a/content/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/product_catalog.rst b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/product_catalog.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/product_catalog.rst rename to content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/product_catalog.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/product_catalog/added-product.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/product_catalog/added-product.png new file mode 100644 index 000000000..377ccfe4d Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/product_catalog/added-product.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/product_catalog/catalog-button.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/product_catalog/catalog-button.png new file mode 100644 index 000000000..09bfa4562 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/product_catalog/catalog-button.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/product_catalog/filter-sidebar.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/product_catalog/filter-sidebar.png new file mode 100644 index 000000000..c94de41bd Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/product_catalog/filter-sidebar.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/product_catalog/product-card.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/product_catalog/product-card.png new file mode 100644 index 000000000..a438db18f Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/product_catalog/product-card.png differ diff --git a/content/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/scrap_inventory.rst b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/scrap_inventory.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/scrap_inventory.rst rename to content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/scrap_inventory.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/scrap_inventory/scrap-inventory-current-stock.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/scrap_inventory/scrap-inventory-current-stock.png new file mode 100644 index 000000000..be378830f Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/scrap_inventory/scrap-inventory-current-stock.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/scrap_inventory/scrap-inventory-new-scrap-order.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/scrap_inventory/scrap-inventory-new-scrap-order.png new file mode 100644 index 000000000..c384a3245 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/scrap_inventory/scrap-inventory-new-scrap-order.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/scrap_inventory/scrap-inventory-popup-window.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/scrap_inventory/scrap-inventory-popup-window.png new file mode 100644 index 000000000..564b09a48 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/scrap_inventory/scrap-inventory-popup-window.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/scrap_inventory/scrap-inventory-product-moves-button.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/scrap_inventory/scrap-inventory-product-moves-button.png new file mode 100644 index 000000000..fe2f949a2 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/scrap_inventory/scrap-inventory-product-moves-button.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/scrap_inventory/scrap-inventory-receipts-task-card.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/scrap_inventory/scrap-inventory-receipts-task-card.png new file mode 100644 index 000000000..17652e603 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/scrap_inventory/scrap-inventory-receipts-task-card.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/scrap_inventory/scrap-inventory-scraps-smart-button.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/scrap_inventory/scrap-inventory-scraps-smart-button.png new file mode 100644 index 000000000..83bce7a5e Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/scrap_inventory/scrap-inventory-scraps-smart-button.png differ diff --git a/content/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/use_locations.rst b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/use_locations.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/use_locations.rst rename to content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/use_locations.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/use_locations/current-stock.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/use_locations/current-stock.png new file mode 100644 index 000000000..420d89f33 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/use_locations/current-stock.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/use_locations/enable-location.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/use_locations/enable-location.png new file mode 100644 index 000000000..2fb2edfd3 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/use_locations/enable-location.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/use_locations/locations.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/use_locations/locations.png new file mode 100644 index 000000000..826315522 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/use_locations/locations.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/use_locations/new-location.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/use_locations/new-location.png new file mode 100644 index 000000000..f4f502731 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/use_locations/new-location.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/use_locations/scheduled-count.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/use_locations/scheduled-count.png new file mode 100644 index 000000000..8f3255c48 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/use_locations/scheduled-count.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/use_locations/use-locations-cyclic-counting.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/use_locations/use-locations-cyclic-counting.png new file mode 100644 index 000000000..352cb3eee Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/use_locations/use-locations-cyclic-counting.png differ diff --git a/content/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/warehouses.rst b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/warehouses.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/warehouses.rst rename to content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/warehouses.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/warehouses/warehouse-form.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/warehouses/warehouse-form.png new file mode 100644 index 000000000..e4eb9d06a Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/warehouses/warehouse-form.png differ diff --git a/content/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment.rst b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment.rst rename to content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment.rst diff --git a/content/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times.rst b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times.rst rename to content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times/all-lead-times.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times/all-lead-times.png new file mode 100644 index 000000000..b190d8b2a Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times/all-lead-times.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times/customer.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times/customer.png new file mode 100644 index 000000000..559569acb Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times/customer.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times/global-example.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times/global-example.png new file mode 100644 index 000000000..51d000e7b Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times/global-example.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times/manuf-lead-times.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times/manuf-lead-times.png new file mode 100644 index 000000000..173a1bd61 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times/manuf-lead-times.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times/manuf-security.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times/manuf-security.png new file mode 100644 index 000000000..a26ede560 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times/manuf-security.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times/receipt-date.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times/receipt-date.png new file mode 100644 index 000000000..60b738b42 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times/receipt-date.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times/sales-security.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times/sales-security.png new file mode 100644 index 000000000..188fe036c Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times/sales-security.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times/scheduled-date-receipt.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times/scheduled-date-receipt.png new file mode 100644 index 000000000..74a377f24 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times/scheduled-date-receipt.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times/scheduled-date.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times/scheduled-date.png new file mode 100644 index 000000000..770c1adad Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times/scheduled-date.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times/set-manufacturing.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times/set-manufacturing.png new file mode 100644 index 000000000..a781ee419 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times/set-manufacturing.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times/set-vendor.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times/set-vendor.png new file mode 100644 index 000000000..d9d331bf5 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times/set-vendor.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times/shipping-policy.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times/shipping-policy.png new file mode 100644 index 000000000..f617ba25f Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times/shipping-policy.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times/vendor-lead-times.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times/vendor-lead-times.png new file mode 100644 index 000000000..853f45127 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times/vendor-lead-times.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times/vendor-security.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times/vendor-security.png new file mode 100644 index 000000000..4d995384c Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times/vendor-security.png differ diff --git a/content/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/mto.rst b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/mto.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/mto.rst rename to content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/mto.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/mto/archived-filter.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/mto/archived-filter.png new file mode 100644 index 000000000..7b2439d3e Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/mto/archived-filter.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/mto/select-routes.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/mto/select-routes.png new file mode 100644 index 000000000..5a1c1b147 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/mto/select-routes.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/mto/unarchive-button.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/mto/unarchive-button.png new file mode 100644 index 000000000..4480460fc Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/mto/unarchive-button.png differ diff --git a/content/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/reordering_rules.rst b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/reordering_rules.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/reordering_rules.rst rename to content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/reordering_rules.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/reordering_rules/001-rule.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/reordering_rules/001-rule.png new file mode 100644 index 000000000..8bd7a66bf Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/reordering_rules/001-rule.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/reordering_rules/auto.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/reordering_rules/auto.png new file mode 100644 index 000000000..afc1cfc94 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/reordering_rules/auto.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/reordering_rules/counterexample.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/reordering_rules/counterexample.png new file mode 100644 index 000000000..ee19a4f8f Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/reordering_rules/counterexample.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/reordering_rules/five-forecast.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/reordering_rules/five-forecast.png new file mode 100644 index 000000000..c21f2287c Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/reordering_rules/five-forecast.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/reordering_rules/forecasted-date.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/reordering_rules/forecasted-date.png new file mode 100644 index 000000000..de774bd06 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/reordering_rules/forecasted-date.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/reordering_rules/manual.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/reordering_rules/manual.png new file mode 100644 index 000000000..7d0c80f18 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/reordering_rules/manual.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/reordering_rules/po-smartbutton.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/reordering_rules/po-smartbutton.png new file mode 100644 index 000000000..8bef2fba8 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/reordering_rules/po-smartbutton.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/reordering_rules/product-type.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/reordering_rules/product-type.png new file mode 100644 index 000000000..a33ce1853 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/reordering_rules/product-type.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/reordering_rules/reordering-rule-form.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/reordering_rules/reordering-rule-form.png new file mode 100644 index 000000000..4d867eefb Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/reordering_rules/reordering-rule-form.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/reordering_rules/replenishment-info.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/reordering_rules/replenishment-info.png new file mode 100644 index 000000000..a51425d8a Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/reordering_rules/replenishment-info.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/reordering_rules/select-preferred-route.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/reordering_rules/select-preferred-route.png new file mode 100644 index 000000000..30c6891ad Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/reordering_rules/select-preferred-route.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/reordering_rules/visibility-days.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/reordering_rules/visibility-days.png new file mode 100644 index 000000000..c96ee2f04 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/reordering_rules/visibility-days.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/reordering_rules/zero-forecast.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/reordering_rules/zero-forecast.png new file mode 100644 index 000000000..44edfaf6d Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/reordering_rules/zero-forecast.png differ diff --git a/content/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/report.rst b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/report.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/report.rst rename to content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/report.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/report/replenishment-dashboard.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/report/replenishment-dashboard.png new file mode 100644 index 000000000..cf39527cc Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/report/replenishment-dashboard.png differ diff --git a/content/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/resupply_warehouses.rst b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/resupply_warehouses.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/resupply_warehouses.rst rename to content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/resupply_warehouses.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/resupply_warehouses/reordering-rule.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/resupply_warehouses/reordering-rule.png new file mode 100644 index 000000000..d161b0ea8 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/resupply_warehouses/reordering-rule.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/resupply_warehouses/replenish.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/resupply_warehouses/replenish.png new file mode 100644 index 000000000..855efc0e9 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/resupply_warehouses/replenish.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/resupply_warehouses/resupply-route.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/resupply_warehouses/resupply-route.png new file mode 100644 index 000000000..842daba3a Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/resupply_warehouses/resupply-route.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/resupply_warehouses/storage-locations.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/resupply_warehouses/storage-locations.png new file mode 100644 index 000000000..d2dffc5d8 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/resupply_warehouses/storage-locations.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/resupply_warehouses/transfers.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/resupply_warehouses/transfers.png new file mode 100644 index 000000000..4dde5f145 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/resupply_warehouses/transfers.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/resupply_warehouses/warehouse-field.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/resupply_warehouses/warehouse-field.png new file mode 100644 index 000000000..9593d1f04 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/resupply_warehouses/warehouse-field.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/resupply_warehouses/warehouse.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/resupply_warehouses/warehouse.png new file mode 100644 index 000000000..ef6c1dcf8 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/resupply_warehouses/warehouse.png differ diff --git a/content/applications/inventory_and_mrp/inventory/warehouses_storage/reporting.rst b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/reporting.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/warehouses_storage/reporting.rst rename to content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/reporting.rst diff --git a/content/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/aging.rst b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/aging.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/aging.rst rename to content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/aging.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/aging/after-val-method-change.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/aging/after-val-method-change.png new file mode 100644 index 000000000..a46881fcc Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/aging/after-val-method-change.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/aging/before-val-method-change.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/aging/before-val-method-change.png new file mode 100644 index 000000000..9c741b652 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/aging/before-val-method-change.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/aging/remaining-val-quant.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/aging/remaining-val-quant.png new file mode 100644 index 000000000..aefe3ad61 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/aging/remaining-val-quant.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/aging/stock-aging-report.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/aging/stock-aging-report.png new file mode 100644 index 000000000..422ff58da Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/aging/stock-aging-report.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/aging/stock-valuation-report.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/aging/stock-valuation-report.png new file mode 100644 index 000000000..0812c8051 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/aging/stock-valuation-report.png differ diff --git a/content/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/locations.rst b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/locations.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/locations.rst rename to content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/locations.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/locations/dead-stock.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/locations/dead-stock.png new file mode 100644 index 000000000..fe3fab562 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/locations/dead-stock.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/locations/discrepancy.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/locations/discrepancy.png new file mode 100644 index 000000000..a8e9435e1 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/locations/discrepancy.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/locations/empty-locations.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/locations/empty-locations.png new file mode 100644 index 000000000..514daed0a Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/locations/empty-locations.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/locations/history.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/locations/history.png new file mode 100644 index 000000000..fe18deea5 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/locations/history.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/locations/reserved-products.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/locations/reserved-products.png new file mode 100644 index 000000000..b8ba3004c Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/locations/reserved-products.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/locations/search-input-location.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/locations/search-input-location.png new file mode 100644 index 000000000..81add763e Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/locations/search-input-location.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/locations/stranded-inventory.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/locations/stranded-inventory.png new file mode 100644 index 000000000..3454925fc Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/locations/stranded-inventory.png differ diff --git a/content/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/moves_history.rst b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/moves_history.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/moves_history.rst rename to content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/moves_history.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/moves_history/moves-history.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/moves_history/moves-history.png new file mode 100644 index 000000000..88bd04aa8 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/moves_history/moves-history.png differ diff --git a/content/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/stock.rst b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/stock.rst similarity index 100% rename from content/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/stock.rst rename to content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/stock.rst diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/stock/available-in-self-order.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/stock/available-in-self-order.png new file mode 100644 index 000000000..886e4650a Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/stock/available-in-self-order.png differ diff --git a/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/stock/stock-report.png b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/stock/stock-report.png new file mode 100644 index 000000000..eb812d437 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/stock/stock-report.png differ diff --git a/content/applications/inventory_and_mrp/maintenance.rst b/content-rst/applications/inventory_and_mrp/maintenance.rst similarity index 100% rename from content/applications/inventory_and_mrp/maintenance.rst rename to content-rst/applications/inventory_and_mrp/maintenance.rst diff --git a/content/applications/inventory_and_mrp/maintenance/add_new_equipment.rst b/content-rst/applications/inventory_and_mrp/maintenance/add_new_equipment.rst similarity index 100% rename from content/applications/inventory_and_mrp/maintenance/add_new_equipment.rst rename to content-rst/applications/inventory_and_mrp/maintenance/add_new_equipment.rst diff --git a/content-rst/applications/inventory_and_mrp/maintenance/add_new_equipment/new-equipment-form.png b/content-rst/applications/inventory_and_mrp/maintenance/add_new_equipment/new-equipment-form.png new file mode 100644 index 000000000..386654cc4 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/maintenance/add_new_equipment/new-equipment-form.png differ diff --git a/content-rst/applications/inventory_and_mrp/maintenance/add_new_equipment/new-equipment-maintenance.png b/content-rst/applications/inventory_and_mrp/maintenance/add_new_equipment/new-equipment-maintenance.png new file mode 100644 index 000000000..530b61cdc Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/maintenance/add_new_equipment/new-equipment-maintenance.png differ diff --git a/content-rst/applications/inventory_and_mrp/maintenance/add_new_equipment/new-equipment-product-information.png b/content-rst/applications/inventory_and_mrp/maintenance/add_new_equipment/new-equipment-product-information.png new file mode 100644 index 000000000..710d4ebc3 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/maintenance/add_new_equipment/new-equipment-product-information.png differ diff --git a/content/applications/inventory_and_mrp/maintenance/maintenance_calendar.rst b/content-rst/applications/inventory_and_mrp/maintenance/maintenance_calendar.rst similarity index 100% rename from content/applications/inventory_and_mrp/maintenance/maintenance_calendar.rst rename to content-rst/applications/inventory_and_mrp/maintenance/maintenance_calendar.rst diff --git a/content-rst/applications/inventory_and_mrp/maintenance/maintenance_calendar/maintenance-calendar-activity-view-type.png b/content-rst/applications/inventory_and_mrp/maintenance/maintenance_calendar/maintenance-calendar-activity-view-type.png new file mode 100644 index 000000000..b0306e096 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/maintenance/maintenance_calendar/maintenance-calendar-activity-view-type.png differ diff --git a/content-rst/applications/inventory_and_mrp/maintenance/maintenance_calendar/maintenance-calendar-edit-stage-popup.png b/content-rst/applications/inventory_and_mrp/maintenance/maintenance_calendar/maintenance-calendar-edit-stage-popup.png new file mode 100644 index 000000000..496ff9a91 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/maintenance/maintenance_calendar/maintenance-calendar-edit-stage-popup.png differ diff --git a/content-rst/applications/inventory_and_mrp/maintenance/maintenance_calendar/maintenance-calendar-favorites-popover.png b/content-rst/applications/inventory_and_mrp/maintenance/maintenance_calendar/maintenance-calendar-favorites-popover.png new file mode 100644 index 000000000..a43c26600 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/maintenance/maintenance_calendar/maintenance-calendar-favorites-popover.png differ diff --git a/content-rst/applications/inventory_and_mrp/maintenance/maintenance_calendar/maintenance-calendar-filled-out-form.png b/content-rst/applications/inventory_and_mrp/maintenance/maintenance_calendar/maintenance-calendar-filled-out-form.png new file mode 100644 index 000000000..9add8ea4b Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/maintenance/maintenance_calendar/maintenance-calendar-filled-out-form.png differ diff --git a/content-rst/applications/inventory_and_mrp/maintenance/maintenance_calendar/maintenance-calendar-graph-view-icons.png b/content-rst/applications/inventory_and_mrp/maintenance/maintenance_calendar/maintenance-calendar-graph-view-icons.png new file mode 100644 index 000000000..23f59ff44 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/maintenance/maintenance_calendar/maintenance-calendar-graph-view-icons.png differ diff --git a/content-rst/applications/inventory_and_mrp/maintenance/maintenance_calendar/maintenance-calendar-instructions-tab.png b/content-rst/applications/inventory_and_mrp/maintenance/maintenance_calendar/maintenance-calendar-instructions-tab.png new file mode 100644 index 000000000..c9938dc98 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/maintenance/maintenance_calendar/maintenance-calendar-instructions-tab.png differ diff --git a/content-rst/applications/inventory_and_mrp/maintenance/maintenance_calendar/maintenance-calendar-kanban-column.png b/content-rst/applications/inventory_and_mrp/maintenance/maintenance_calendar/maintenance-calendar-kanban-column.png new file mode 100644 index 000000000..5d95992be Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/maintenance/maintenance_calendar/maintenance-calendar-kanban-column.png differ diff --git a/content-rst/applications/inventory_and_mrp/maintenance/maintenance_calendar/maintenance-calendar-measures-menu.png b/content-rst/applications/inventory_and_mrp/maintenance/maintenance_calendar/maintenance-calendar-measures-menu.png new file mode 100644 index 000000000..81bf713a0 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/maintenance/maintenance_calendar/maintenance-calendar-measures-menu.png differ diff --git a/content-rst/applications/inventory_and_mrp/maintenance/maintenance_calendar/maintenance-calendar-new-event-popup.png b/content-rst/applications/inventory_and_mrp/maintenance/maintenance_calendar/maintenance-calendar-new-event-popup.png new file mode 100644 index 000000000..c9e5b01b5 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/maintenance/maintenance_calendar/maintenance-calendar-new-event-popup.png differ diff --git a/content-rst/applications/inventory_and_mrp/maintenance/maintenance_calendar/maintenance-calendar-new-request-form.png b/content-rst/applications/inventory_and_mrp/maintenance/maintenance_calendar/maintenance-calendar-new-request-form.png new file mode 100644 index 000000000..ebda9a88d Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/maintenance/maintenance_calendar/maintenance-calendar-new-request-form.png differ diff --git a/content-rst/applications/inventory_and_mrp/maintenance/maintenance_calendar/maintenance-calendar-odoo-activity-popup.png b/content-rst/applications/inventory_and_mrp/maintenance/maintenance_calendar/maintenance-calendar-odoo-activity-popup.png new file mode 100644 index 000000000..8c32273c7 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/maintenance/maintenance_calendar/maintenance-calendar-odoo-activity-popup.png differ diff --git a/content-rst/applications/inventory_and_mrp/maintenance/maintenance_calendar/maintenance-calendar-period-dropdown.png b/content-rst/applications/inventory_and_mrp/maintenance/maintenance_calendar/maintenance-calendar-period-dropdown.png new file mode 100644 index 000000000..d0b685827 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/maintenance/maintenance_calendar/maintenance-calendar-period-dropdown.png differ diff --git a/content-rst/applications/inventory_and_mrp/maintenance/maintenance_calendar/maintenance-calendar-schedule-activity-popover.png b/content-rst/applications/inventory_and_mrp/maintenance/maintenance_calendar/maintenance-calendar-schedule-activity-popover.png new file mode 100644 index 000000000..98a5651a9 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/maintenance/maintenance_calendar/maintenance-calendar-schedule-activity-popover.png differ diff --git a/content-rst/applications/inventory_and_mrp/maintenance/maintenance_calendar/maintenance-calendar-view-type-icons.png b/content-rst/applications/inventory_and_mrp/maintenance/maintenance_calendar/maintenance-calendar-view-type-icons.png new file mode 100644 index 000000000..e59b0b006 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/maintenance/maintenance_calendar/maintenance-calendar-view-type-icons.png differ diff --git a/content/applications/inventory_and_mrp/maintenance/maintenance_requests.rst b/content-rst/applications/inventory_and_mrp/maintenance/maintenance_requests.rst similarity index 100% rename from content/applications/inventory_and_mrp/maintenance/maintenance_requests.rst rename to content-rst/applications/inventory_and_mrp/maintenance/maintenance_requests.rst diff --git a/content-rst/applications/inventory_and_mrp/maintenance/maintenance_requests/request-form.png b/content-rst/applications/inventory_and_mrp/maintenance/maintenance_requests/request-form.png new file mode 100644 index 000000000..2f413f091 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/maintenance/maintenance_requests/request-form.png differ diff --git a/content/applications/inventory_and_mrp/maintenance/maintenance_setup.rst b/content-rst/applications/inventory_and_mrp/maintenance/maintenance_setup.rst similarity index 100% rename from content/applications/inventory_and_mrp/maintenance/maintenance_setup.rst rename to content-rst/applications/inventory_and_mrp/maintenance/maintenance_setup.rst diff --git a/content-rst/applications/inventory_and_mrp/maintenance/maintenance_setup/maintenance-setup-category-form.png b/content-rst/applications/inventory_and_mrp/maintenance/maintenance_setup/maintenance-setup-category-form.png new file mode 100644 index 000000000..eeb58725a Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/maintenance/maintenance_setup/maintenance-setup-category-form.png differ diff --git a/content-rst/applications/inventory_and_mrp/maintenance/maintenance_setup/maintenance-setup-metrics.png b/content-rst/applications/inventory_and_mrp/maintenance/maintenance_setup/maintenance-setup-metrics.png new file mode 100644 index 000000000..37d5d4125 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/maintenance/maintenance_setup/maintenance-setup-metrics.png differ diff --git a/content-rst/applications/inventory_and_mrp/maintenance/maintenance_setup/maintenance-setup-new-equipment-left-side.png b/content-rst/applications/inventory_and_mrp/maintenance/maintenance_setup/maintenance-setup-new-equipment-left-side.png new file mode 100644 index 000000000..685243441 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/maintenance/maintenance_setup/maintenance-setup-new-equipment-left-side.png differ diff --git a/content-rst/applications/inventory_and_mrp/maintenance/maintenance_setup/maintenance-setup-new-equipment-right-side.png b/content-rst/applications/inventory_and_mrp/maintenance/maintenance_setup/maintenance-setup-new-equipment-right-side.png new file mode 100644 index 000000000..ad85a2b36 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/maintenance/maintenance_setup/maintenance-setup-new-equipment-right-side.png differ diff --git a/content-rst/applications/inventory_and_mrp/maintenance/maintenance_setup/maintenance-setup-popover-technician.png b/content-rst/applications/inventory_and_mrp/maintenance/maintenance_setup/maintenance-setup-popover-technician.png new file mode 100644 index 000000000..657117263 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/maintenance/maintenance_setup/maintenance-setup-popover-technician.png differ diff --git a/content-rst/applications/inventory_and_mrp/maintenance/maintenance_setup/maintenance-setup-product-information.png b/content-rst/applications/inventory_and_mrp/maintenance/maintenance_setup/maintenance-setup-product-information.png new file mode 100644 index 000000000..1e472e6cf Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/maintenance/maintenance_setup/maintenance-setup-product-information.png differ diff --git a/content-rst/applications/inventory_and_mrp/maintenance/maintenance_setup/maintenance-setup-search-team-members.png b/content-rst/applications/inventory_and_mrp/maintenance/maintenance_setup/maintenance-setup-search-team-members.png new file mode 100644 index 000000000..d83a71931 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/maintenance/maintenance_setup/maintenance-setup-search-team-members.png differ diff --git a/content-rst/applications/inventory_and_mrp/maintenance/maintenance_setup/maintenance-setup-smart-buttons.png b/content-rst/applications/inventory_and_mrp/maintenance/maintenance_setup/maintenance-setup-smart-buttons.png new file mode 100644 index 000000000..c1ad59624 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/maintenance/maintenance_setup/maintenance-setup-smart-buttons.png differ diff --git a/content-rst/applications/inventory_and_mrp/maintenance/maintenance_setup/maintenance-setup-teams-list.png b/content-rst/applications/inventory_and_mrp/maintenance/maintenance_setup/maintenance-setup-teams-list.png new file mode 100644 index 000000000..33a7b19c2 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/maintenance/maintenance_setup/maintenance-setup-teams-list.png differ diff --git a/content-rst/applications/inventory_and_mrp/maintenance/maintenance_setup/maintenance-setup-work-center.png b/content-rst/applications/inventory_and_mrp/maintenance/maintenance_setup/maintenance-setup-work-center.png new file mode 100644 index 000000000..979869a76 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/maintenance/maintenance_setup/maintenance-setup-work-center.png differ diff --git a/content/applications/inventory_and_mrp/manufacturing.rst b/content-rst/applications/inventory_and_mrp/manufacturing.rst similarity index 100% rename from content/applications/inventory_and_mrp/manufacturing.rst rename to content-rst/applications/inventory_and_mrp/manufacturing.rst diff --git a/content/applications/inventory_and_mrp/manufacturing/advanced_configuration.rst b/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration.rst similarity index 100% rename from content/applications/inventory_and_mrp/manufacturing/advanced_configuration.rst rename to content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration.rst diff --git a/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/kit_shipping.rst b/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/kit_shipping.rst similarity index 100% rename from content/applications/inventory_and_mrp/manufacturing/advanced_configuration/kit_shipping.rst rename to content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/kit_shipping.rst diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/kit_shipping/bom-kit-selection.png b/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/kit_shipping/bom-kit-selection.png new file mode 100644 index 000000000..2217afe0e Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/kit_shipping/bom-kit-selection.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/kit_shipping/multilevel-bom-kit.png b/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/kit_shipping/multilevel-bom-kit.png new file mode 100644 index 000000000..88b90272d Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/kit_shipping/multilevel-bom-kit.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/kit_shipping/structure-and-cost-kit.png b/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/kit_shipping/structure-and-cost-kit.png new file mode 100644 index 000000000..0bc565811 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/kit_shipping/structure-and-cost-kit.png differ diff --git a/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/product_variants.rst b/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/product_variants.rst similarity index 100% rename from content/applications/inventory_and_mrp/manufacturing/advanced_configuration/product_variants.rst rename to content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/product_variants.rst diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/product_variants/product-variants-apply-on-variants.png b/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/product_variants/product-variants-apply-on-variants.png new file mode 100644 index 000000000..6e2e2ddc4 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/product_variants/product-variants-apply-on-variants.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/product_variants/product-variants-attribute.png b/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/product_variants/product-variants-attribute.png new file mode 100644 index 000000000..54f58ae35 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/product_variants/product-variants-attribute.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/product_variants/product-variants-manufacturing-order.png b/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/product_variants/product-variants-manufacturing-order.png new file mode 100644 index 000000000..72402f535 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/product_variants/product-variants-manufacturing-order.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/product_variants/product-variants-product-form.png b/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/product_variants/product-variants-product-form.png new file mode 100644 index 000000000..0bdc552a5 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/product_variants/product-variants-product-form.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/product_variants/product-variants-variant-popup.png b/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/product_variants/product-variants-variant-popup.png new file mode 100644 index 000000000..e04abb1ac Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/product_variants/product-variants-variant-popup.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/product_variants/product-variants-variants-settings.png b/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/product_variants/product-variants-variants-settings.png new file mode 100644 index 000000000..f934851db Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/product_variants/product-variants-variants-settings.png differ diff --git a/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/sub_assemblies.rst b/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/sub_assemblies.rst similarity index 100% rename from content/applications/inventory_and_mrp/manufacturing/advanced_configuration/sub_assemblies.rst rename to content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/sub_assemblies.rst diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/sub_assemblies/custom-computer-bom.png b/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/sub_assemblies/custom-computer-bom.png new file mode 100644 index 000000000..c8b8aef6f Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/sub_assemblies/custom-computer-bom.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/sub_assemblies/semifinished-on-mo.png b/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/sub_assemblies/semifinished-on-mo.png new file mode 100644 index 000000000..b27017e9e Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/sub_assemblies/semifinished-on-mo.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/sub_assemblies/semifinished-product-bom.png b/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/sub_assemblies/semifinished-product-bom.png new file mode 100644 index 000000000..986895164 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/sub_assemblies/semifinished-product-bom.png differ diff --git a/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers.rst b/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers.rst similarity index 100% rename from content/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers.rst rename to content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers.rst diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers/automatic-work-center-selection.png b/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers/automatic-work-center-selection.png new file mode 100644 index 000000000..c4f2d2807 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers/automatic-work-center-selection.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers/manufacturing-order-plan-button.png b/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers/manufacturing-order-plan-button.png new file mode 100644 index 000000000..e849e2ded Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers/manufacturing-order-plan-button.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers/work-center-equipment.png b/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers/work-center-equipment.png new file mode 100644 index 000000000..d3b3194b9 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers/work-center-equipment.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers/work-center-form.png b/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers/work-center-form.png new file mode 100644 index 000000000..2c1b47879 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers/work-center-form.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers/work-center-general-information.png b/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers/work-center-general-information.png new file mode 100644 index 000000000..2d8b42598 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers/work-center-general-information.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers/work-center-iot.png b/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers/work-center-iot.png new file mode 100644 index 000000000..77398824c Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers/work-center-iot.png differ diff --git a/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/work_order_dependencies.rst b/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/work_order_dependencies.rst similarity index 100% rename from content/applications/inventory_and_mrp/manufacturing/advanced_configuration/work_order_dependencies.rst rename to content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/work_order_dependencies.rst diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/work_order_dependencies/blocked-by.png b/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/work_order_dependencies/blocked-by.png new file mode 100644 index 000000000..c7640474d Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/work_order_dependencies/blocked-by.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/work_order_dependencies/operation-dependencies.png b/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/work_order_dependencies/operation-dependencies.png new file mode 100644 index 000000000..c423a1a6a Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/work_order_dependencies/operation-dependencies.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/work_order_dependencies/operations-settings.png b/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/work_order_dependencies/operations-settings.png new file mode 100644 index 000000000..aa4af4995 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/work_order_dependencies/operations-settings.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/work_order_dependencies/planning-arrow.png b/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/work_order_dependencies/planning-arrow.png new file mode 100644 index 000000000..8ea8844d5 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/work_order_dependencies/planning-arrow.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/work_order_dependencies/scheduled-start-date.png b/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/work_order_dependencies/scheduled-start-date.png new file mode 100644 index 000000000..897d9fdce Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/work_order_dependencies/scheduled-start-date.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/work_order_dependencies/work-order-status.png b/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/work_order_dependencies/work-order-status.png new file mode 100644 index 000000000..030a31107 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/advanced_configuration/work_order_dependencies/work-order-status.png differ diff --git a/content/applications/inventory_and_mrp/manufacturing/basic_setup.rst b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup.rst similarity index 100% rename from content/applications/inventory_and_mrp/manufacturing/basic_setup.rst rename to content-rst/applications/inventory_and_mrp/manufacturing/basic_setup.rst diff --git a/content/applications/inventory_and_mrp/manufacturing/basic_setup/bill_configuration.rst b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/bill_configuration.rst similarity index 100% rename from content/applications/inventory_and_mrp/manufacturing/basic_setup/bill_configuration.rst rename to content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/bill_configuration.rst diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/bill_configuration/add-by-product.png b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/bill_configuration/add-by-product.png new file mode 100644 index 000000000..d0149a790 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/bill_configuration/add-by-product.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/bill_configuration/add-instructions.png b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/bill_configuration/add-instructions.png new file mode 100644 index 000000000..c0e8c7e55 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/bill_configuration/add-instructions.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/bill_configuration/bom-example.png b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/bill_configuration/bom-example.png new file mode 100644 index 000000000..4dd95df48 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/bill_configuration/bom-example.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/bill_configuration/by-products.png b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/bill_configuration/by-products.png new file mode 100644 index 000000000..847ee92b8 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/bill_configuration/by-products.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/bill_configuration/component-status.png b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/bill_configuration/component-status.png new file mode 100644 index 000000000..cf1822cad Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/bill_configuration/component-status.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/bill_configuration/component.png b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/bill_configuration/component.png new file mode 100644 index 000000000..ad4066550 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/bill_configuration/component.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/bill_configuration/consumed-field.png b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/bill_configuration/consumed-field.png new file mode 100644 index 000000000..6dcd46491 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/bill_configuration/consumed-field.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/bill_configuration/consumption-warning.png b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/bill_configuration/consumption-warning.png new file mode 100644 index 000000000..5e9927fa7 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/bill_configuration/consumption-warning.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/bill_configuration/copy-existing-operations.png b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/bill_configuration/copy-existing-operations.png new file mode 100644 index 000000000..7712741b9 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/bill_configuration/copy-existing-operations.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/bill_configuration/create-operations.png b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/bill_configuration/create-operations.png new file mode 100644 index 000000000..b93ecfb5b Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/bill_configuration/create-operations.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/bill_configuration/description.png b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/bill_configuration/description.png new file mode 100644 index 000000000..b38dbdad2 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/bill_configuration/description.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/bill_configuration/enable-work-orders.png b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/bill_configuration/enable-work-orders.png new file mode 100644 index 000000000..ca594690e Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/bill_configuration/enable-work-orders.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/bill_configuration/misc-tab.png b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/bill_configuration/misc-tab.png new file mode 100644 index 000000000..ea7c96f70 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/bill_configuration/misc-tab.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/bill_configuration/steps.png b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/bill_configuration/steps.png new file mode 100644 index 000000000..2a9ed2efa Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/bill_configuration/steps.png differ diff --git a/content/applications/inventory_and_mrp/manufacturing/basic_setup/configure_manufacturing_product.rst b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/configure_manufacturing_product.rst similarity index 100% rename from content/applications/inventory_and_mrp/manufacturing/basic_setup/configure_manufacturing_product.rst rename to content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/configure_manufacturing_product.rst diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/configure_manufacturing_product/bom-smart-button.png b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/configure_manufacturing_product/bom-smart-button.png new file mode 100644 index 000000000..35c6f0671 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/configure_manufacturing_product/bom-smart-button.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/configure_manufacturing_product/components-tab.png b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/configure_manufacturing_product/components-tab.png new file mode 100644 index 000000000..d70b36712 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/configure_manufacturing_product/components-tab.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/configure_manufacturing_product/lot-number-field.png b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/configure_manufacturing_product/lot-number-field.png new file mode 100644 index 000000000..faa3ba462 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/configure_manufacturing_product/lot-number-field.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/configure_manufacturing_product/manufacturing-route.png b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/configure_manufacturing_product/manufacturing-route.png new file mode 100644 index 000000000..e851c87d3 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/configure_manufacturing_product/manufacturing-route.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/configure_manufacturing_product/operations-tab.png b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/configure_manufacturing_product/operations-tab.png new file mode 100644 index 000000000..7a3c3f108 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/configure_manufacturing_product/operations-tab.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/configure_manufacturing_product/register-production.png b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/configure_manufacturing_product/register-production.png new file mode 100644 index 000000000..df6db0830 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/configure_manufacturing_product/register-production.png differ diff --git a/content/applications/inventory_and_mrp/manufacturing/basic_setup/mo_costs.rst b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/mo_costs.rst similarity index 100% rename from content/applications/inventory_and_mrp/manufacturing/basic_setup/mo_costs.rst rename to content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/mo_costs.rst diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/mo_costs/overview-before.png b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/mo_costs/overview-before.png new file mode 100644 index 000000000..5bc3de89f Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/mo_costs/overview-before.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/mo_costs/overview-during.png b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/mo_costs/overview-during.png new file mode 100644 index 000000000..2bccd42a4 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/mo_costs/overview-during.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/mo_costs/overview.png b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/mo_costs/overview.png new file mode 100644 index 000000000..d497ed800 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/mo_costs/overview.png differ diff --git a/content/applications/inventory_and_mrp/manufacturing/basic_setup/one_step_manufacturing.rst b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/one_step_manufacturing.rst similarity index 100% rename from content/applications/inventory_and_mrp/manufacturing/basic_setup/one_step_manufacturing.rst rename to content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/one_step_manufacturing.rst diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/one_step_manufacturing/done-button.png b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/one_step_manufacturing/done-button.png new file mode 100644 index 000000000..050a509fa Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/one_step_manufacturing/done-button.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/one_step_manufacturing/manufacturing-type.png b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/one_step_manufacturing/manufacturing-type.png new file mode 100644 index 000000000..c72bd52ca Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/one_step_manufacturing/manufacturing-type.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/one_step_manufacturing/shop-floor-button.png b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/one_step_manufacturing/shop-floor-button.png new file mode 100644 index 000000000..3ef4a121c Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/one_step_manufacturing/shop-floor-button.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/one_step_manufacturing/start-button.png b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/one_step_manufacturing/start-button.png new file mode 100644 index 000000000..d1cd3b670 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/one_step_manufacturing/start-button.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/one_step_manufacturing/work-order-card.png b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/one_step_manufacturing/work-order-card.png new file mode 100644 index 000000000..8dd04a74b Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/one_step_manufacturing/work-order-card.png differ diff --git a/content/applications/inventory_and_mrp/manufacturing/basic_setup/three_step_manufacturing.rst b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/three_step_manufacturing.rst similarity index 100% rename from content/applications/inventory_and_mrp/manufacturing/basic_setup/three_step_manufacturing.rst rename to content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/three_step_manufacturing.rst diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/three_step_manufacturing/done-button.png b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/three_step_manufacturing/done-button.png new file mode 100644 index 000000000..050a509fa Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/three_step_manufacturing/done-button.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/three_step_manufacturing/manufacturing-type.png b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/three_step_manufacturing/manufacturing-type.png new file mode 100644 index 000000000..b7e1b637e Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/three_step_manufacturing/manufacturing-type.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/three_step_manufacturing/mo-bread-crumb.png b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/three_step_manufacturing/mo-bread-crumb.png new file mode 100644 index 000000000..111293008 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/three_step_manufacturing/mo-bread-crumb.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/three_step_manufacturing/shop-floor-button.png b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/three_step_manufacturing/shop-floor-button.png new file mode 100644 index 000000000..3ef4a121c Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/three_step_manufacturing/shop-floor-button.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/three_step_manufacturing/start-button-2.png b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/three_step_manufacturing/start-button-2.png new file mode 100644 index 000000000..48861fde2 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/three_step_manufacturing/start-button-2.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/three_step_manufacturing/work-order-card.png b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/three_step_manufacturing/work-order-card.png new file mode 100644 index 000000000..8dd04a74b Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/three_step_manufacturing/work-order-card.png differ diff --git a/content/applications/inventory_and_mrp/manufacturing/basic_setup/two_step_manufacturing.rst b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/two_step_manufacturing.rst similarity index 100% rename from content/applications/inventory_and_mrp/manufacturing/basic_setup/two_step_manufacturing.rst rename to content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/two_step_manufacturing.rst diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/two_step_manufacturing/done-button.png b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/two_step_manufacturing/done-button.png new file mode 100644 index 000000000..050a509fa Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/two_step_manufacturing/done-button.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/two_step_manufacturing/manufacturing-type.png b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/two_step_manufacturing/manufacturing-type.png new file mode 100644 index 000000000..bf4fb35f4 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/two_step_manufacturing/manufacturing-type.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/two_step_manufacturing/mo-bread-crumb.png b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/two_step_manufacturing/mo-bread-crumb.png new file mode 100644 index 000000000..111293008 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/two_step_manufacturing/mo-bread-crumb.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/two_step_manufacturing/shop-floor-button.png b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/two_step_manufacturing/shop-floor-button.png new file mode 100644 index 000000000..3ef4a121c Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/two_step_manufacturing/shop-floor-button.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/two_step_manufacturing/start-button.png b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/two_step_manufacturing/start-button.png new file mode 100644 index 000000000..d1cd3b670 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/two_step_manufacturing/start-button.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/two_step_manufacturing/work-order-card.png b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/two_step_manufacturing/work-order-card.png new file mode 100644 index 000000000..8dd04a74b Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/basic_setup/two_step_manufacturing/work-order-card.png differ diff --git a/content/applications/inventory_and_mrp/manufacturing/reporting.rst b/content-rst/applications/inventory_and_mrp/manufacturing/reporting.rst similarity index 100% rename from content/applications/inventory_and_mrp/manufacturing/reporting.rst rename to content-rst/applications/inventory_and_mrp/manufacturing/reporting.rst diff --git a/content/applications/inventory_and_mrp/manufacturing/reporting/allocation.rst b/content-rst/applications/inventory_and_mrp/manufacturing/reporting/allocation.rst similarity index 100% rename from content/applications/inventory_and_mrp/manufacturing/reporting/allocation.rst rename to content-rst/applications/inventory_and_mrp/manufacturing/reporting/allocation.rst diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/reporting/allocation/allocation-button.png b/content-rst/applications/inventory_and_mrp/manufacturing/reporting/allocation/allocation-button.png new file mode 100644 index 000000000..765dff799 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/reporting/allocation/allocation-button.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/reporting/allocation/assigned-labels.png b/content-rst/applications/inventory_and_mrp/manufacturing/reporting/allocation/assigned-labels.png new file mode 100644 index 000000000..949d5a239 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/reporting/allocation/assigned-labels.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/reporting/allocation/component-reception-report.png b/content-rst/applications/inventory_and_mrp/manufacturing/reporting/allocation/component-reception-report.png new file mode 100644 index 000000000..d3540f3cc Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/reporting/allocation/component-reception-report.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/reporting/allocation/product-reception-report.png b/content-rst/applications/inventory_and_mrp/manufacturing/reporting/allocation/product-reception-report.png new file mode 100644 index 000000000..e41a0ae60 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/reporting/allocation/product-reception-report.png differ diff --git a/content/applications/inventory_and_mrp/manufacturing/reporting/oee.rst b/content-rst/applications/inventory_and_mrp/manufacturing/reporting/oee.rst similarity index 100% rename from content/applications/inventory_and_mrp/manufacturing/reporting/oee.rst rename to content-rst/applications/inventory_and_mrp/manufacturing/reporting/oee.rst diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/reporting/oee/oee-report.png b/content-rst/applications/inventory_and_mrp/manufacturing/reporting/oee/oee-report.png new file mode 100644 index 000000000..9fedc8a1a Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/reporting/oee/oee-report.png differ diff --git a/content/applications/inventory_and_mrp/manufacturing/reporting/production_analysis.rst b/content-rst/applications/inventory_and_mrp/manufacturing/reporting/production_analysis.rst similarity index 100% rename from content/applications/inventory_and_mrp/manufacturing/reporting/production_analysis.rst rename to content-rst/applications/inventory_and_mrp/manufacturing/reporting/production_analysis.rst diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/reporting/production_analysis/comparison.png b/content-rst/applications/inventory_and_mrp/manufacturing/reporting/production_analysis/comparison.png new file mode 100644 index 000000000..b524fae9e Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/reporting/production_analysis/comparison.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/reporting/production_analysis/use-case.png b/content-rst/applications/inventory_and_mrp/manufacturing/reporting/production_analysis/use-case.png new file mode 100644 index 000000000..91e93060b Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/reporting/production_analysis/use-case.png differ diff --git a/content/applications/inventory_and_mrp/manufacturing/shop_floor.rst b/content-rst/applications/inventory_and_mrp/manufacturing/shop_floor.rst similarity index 100% rename from content/applications/inventory_and_mrp/manufacturing/shop_floor.rst rename to content-rst/applications/inventory_and_mrp/manufacturing/shop_floor.rst diff --git a/content/applications/inventory_and_mrp/manufacturing/shop_floor/shop_floor_overview.rst b/content-rst/applications/inventory_and_mrp/manufacturing/shop_floor/shop_floor_overview.rst similarity index 100% rename from content/applications/inventory_and_mrp/manufacturing/shop_floor/shop_floor_overview.rst rename to content-rst/applications/inventory_and_mrp/manufacturing/shop_floor/shop_floor_overview.rst diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/shop_floor/shop_floor_overview/mo-card.png b/content-rst/applications/inventory_and_mrp/manufacturing/shop_floor/shop_floor_overview/mo-card.png new file mode 100644 index 000000000..f7a1bb914 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/shop_floor/shop_floor_overview/mo-card.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/shop_floor/shop_floor_overview/mo-order.png b/content-rst/applications/inventory_and_mrp/manufacturing/shop_floor/shop_floor_overview/mo-order.png new file mode 100644 index 000000000..7855f723e Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/shop_floor/shop_floor_overview/mo-order.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/shop_floor/shop_floor_overview/operator-panel.png b/content-rst/applications/inventory_and_mrp/manufacturing/shop_floor/shop_floor_overview/operator-panel.png new file mode 100644 index 000000000..6c0e5934a Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/shop_floor/shop_floor_overview/operator-panel.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/shop_floor/shop_floor_overview/sidebar-button.png b/content-rst/applications/inventory_and_mrp/manufacturing/shop_floor/shop_floor_overview/sidebar-button.png new file mode 100644 index 000000000..cf218fbb6 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/shop_floor/shop_floor_overview/sidebar-button.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/shop_floor/shop_floor_overview/wo-card.png b/content-rst/applications/inventory_and_mrp/manufacturing/shop_floor/shop_floor_overview/wo-card.png new file mode 100644 index 000000000..b4033db32 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/shop_floor/shop_floor_overview/wo-card.png differ diff --git a/content/applications/inventory_and_mrp/manufacturing/shop_floor/shop_floor_tracking.rst b/content-rst/applications/inventory_and_mrp/manufacturing/shop_floor/shop_floor_tracking.rst similarity index 100% rename from content/applications/inventory_and_mrp/manufacturing/shop_floor/shop_floor_tracking.rst rename to content-rst/applications/inventory_and_mrp/manufacturing/shop_floor/shop_floor_tracking.rst diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/shop_floor/shop_floor_tracking/employee-timer.png b/content-rst/applications/inventory_and_mrp/manufacturing/shop_floor/shop_floor_tracking/employee-timer.png new file mode 100644 index 000000000..aca093fb6 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/shop_floor/shop_floor_tracking/employee-timer.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/shop_floor/shop_floor_tracking/operator-panel.png b/content-rst/applications/inventory_and_mrp/manufacturing/shop_floor/shop_floor_tracking/operator-panel.png new file mode 100644 index 000000000..56c7ff8c2 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/shop_floor/shop_floor_tracking/operator-panel.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/shop_floor/shop_floor_tracking/pin-code.png b/content-rst/applications/inventory_and_mrp/manufacturing/shop_floor/shop_floor_tracking/pin-code.png new file mode 100644 index 000000000..a8f0be4b1 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/shop_floor/shop_floor_tracking/pin-code.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/shop_floor/shop_floor_tracking/work-order-timer.png b/content-rst/applications/inventory_and_mrp/manufacturing/shop_floor/shop_floor_tracking/work-order-timer.png new file mode 100644 index 000000000..f086c9c6c Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/shop_floor/shop_floor_tracking/work-order-timer.png differ diff --git a/content/applications/inventory_and_mrp/manufacturing/subcontracting.rst b/content-rst/applications/inventory_and_mrp/manufacturing/subcontracting.rst similarity index 100% rename from content/applications/inventory_and_mrp/manufacturing/subcontracting.rst rename to content-rst/applications/inventory_and_mrp/manufacturing/subcontracting.rst diff --git a/content/applications/inventory_and_mrp/manufacturing/subcontracting/basic_subcontracting_lead_times.rst b/content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/basic_subcontracting_lead_times.rst similarity index 100% rename from content/applications/inventory_and_mrp/manufacturing/subcontracting/basic_subcontracting_lead_times.rst rename to content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/basic_subcontracting_lead_times.rst diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/basic_subcontracting_lead_times/delivery-lead-time.png b/content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/basic_subcontracting_lead_times/delivery-lead-time.png new file mode 100644 index 000000000..7fb5ac5b8 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/basic_subcontracting_lead_times/delivery-lead-time.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/basic_subcontracting_lead_times/expected-arrival.png b/content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/basic_subcontracting_lead_times/expected-arrival.png new file mode 100644 index 000000000..de55d2d77 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/basic_subcontracting_lead_times/expected-arrival.png differ diff --git a/content/applications/inventory_and_mrp/manufacturing/subcontracting/dropship_subcontracting_lead_times.rst b/content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/dropship_subcontracting_lead_times.rst similarity index 100% rename from content/applications/inventory_and_mrp/manufacturing/subcontracting/dropship_subcontracting_lead_times.rst rename to content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/dropship_subcontracting_lead_times.rst diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/dropship_subcontracting_lead_times/deadline-arrival.png b/content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/dropship_subcontracting_lead_times/deadline-arrival.png new file mode 100644 index 000000000..d4cf2f73e Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/dropship_subcontracting_lead_times/deadline-arrival.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/dropship_subcontracting_lead_times/delivery-lead-time.png b/content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/dropship_subcontracting_lead_times/delivery-lead-time.png new file mode 100644 index 000000000..84775bb72 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/dropship_subcontracting_lead_times/delivery-lead-time.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/dropship_subcontracting_lead_times/manufacturing-lead-time.png b/content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/dropship_subcontracting_lead_times/manufacturing-lead-time.png new file mode 100644 index 000000000..ac3964911 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/dropship_subcontracting_lead_times/manufacturing-lead-time.png differ diff --git a/content/applications/inventory_and_mrp/manufacturing/subcontracting/resupply_subcontracting_lead_times.rst b/content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/resupply_subcontracting_lead_times.rst similarity index 100% rename from content/applications/inventory_and_mrp/manufacturing/subcontracting/resupply_subcontracting_lead_times.rst rename to content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/resupply_subcontracting_lead_times.rst diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/resupply_subcontracting_lead_times/delivery-lead-time.png b/content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/resupply_subcontracting_lead_times/delivery-lead-time.png new file mode 100644 index 000000000..cf0dde004 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/resupply_subcontracting_lead_times/delivery-lead-time.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/resupply_subcontracting_lead_times/manufacturing-lead-time.png b/content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/resupply_subcontracting_lead_times/manufacturing-lead-time.png new file mode 100644 index 000000000..5ec251201 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/resupply_subcontracting_lead_times/manufacturing-lead-time.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/resupply_subcontracting_lead_times/scheduled-deadline.png b/content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/resupply_subcontracting_lead_times/scheduled-deadline.png new file mode 100644 index 000000000..0593dfb4b Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/resupply_subcontracting_lead_times/scheduled-deadline.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/subcontracting-setting.png b/content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/subcontracting-setting.png new file mode 100644 index 000000000..8d8f9bda6 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/subcontracting-setting.png differ diff --git a/content/applications/inventory_and_mrp/manufacturing/subcontracting/subcontracting_basic.rst b/content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/subcontracting_basic.rst similarity index 100% rename from content/applications/inventory_and_mrp/manufacturing/subcontracting/subcontracting_basic.rst rename to content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/subcontracting_basic.rst diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/subcontracting_basic/bom-type.png b/content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/subcontracting_basic/bom-type.png new file mode 100644 index 000000000..bd0c39e29 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/subcontracting_basic/bom-type.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/subcontracting_basic/subcontractor-po.png b/content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/subcontracting_basic/subcontractor-po.png new file mode 100644 index 000000000..b35cf6950 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/subcontracting_basic/subcontractor-po.png differ diff --git a/content/applications/inventory_and_mrp/manufacturing/subcontracting/subcontracting_dropship.rst b/content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/subcontracting_dropship.rst similarity index 100% rename from content/applications/inventory_and_mrp/manufacturing/subcontracting/subcontracting_dropship.rst rename to content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/subcontracting_dropship.rst diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/subcontracting_dropship/bom-type.png b/content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/subcontracting_dropship/bom-type.png new file mode 100644 index 000000000..bd0c39e29 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/subcontracting_dropship/bom-type.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/subcontracting_dropship/subcontractor-po.png b/content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/subcontracting_dropship/subcontractor-po.png new file mode 100644 index 000000000..4b95bf91c Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/subcontracting_dropship/subcontractor-po.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/subcontracting_dropship/vendor-po.png b/content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/subcontracting_dropship/vendor-po.png new file mode 100644 index 000000000..54ed81d04 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/subcontracting_dropship/vendor-po.png differ diff --git a/content/applications/inventory_and_mrp/manufacturing/subcontracting/subcontracting_resupply.rst b/content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/subcontracting_resupply.rst similarity index 100% rename from content/applications/inventory_and_mrp/manufacturing/subcontracting/subcontracting_resupply.rst rename to content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/subcontracting_resupply.rst diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/subcontracting_resupply/bom-type.png b/content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/subcontracting_resupply/bom-type.png new file mode 100644 index 000000000..bd0c39e29 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/subcontracting_resupply/bom-type.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/subcontracting_resupply/subcontractor-po.png b/content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/subcontracting_resupply/subcontractor-po.png new file mode 100644 index 000000000..58ca1b01e Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/subcontracting/subcontracting_resupply/subcontractor-po.png differ diff --git a/content/applications/inventory_and_mrp/manufacturing/workflows.rst b/content-rst/applications/inventory_and_mrp/manufacturing/workflows.rst similarity index 100% rename from content/applications/inventory_and_mrp/manufacturing/workflows.rst rename to content-rst/applications/inventory_and_mrp/manufacturing/workflows.rst diff --git a/content/applications/inventory_and_mrp/manufacturing/workflows/byproducts.rst b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/byproducts.rst similarity index 100% rename from content/applications/inventory_and_mrp/manufacturing/workflows/byproducts.rst rename to content-rst/applications/inventory_and_mrp/manufacturing/workflows/byproducts.rst diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/workflows/byproducts/byproducts-setting.png b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/byproducts/byproducts-setting.png new file mode 100644 index 000000000..bf382609c Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/byproducts/byproducts-setting.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/workflows/byproducts/byproducts-tab.png b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/byproducts/byproducts-tab.png new file mode 100644 index 000000000..ba24a8265 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/byproducts/byproducts-tab.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/workflows/byproducts/product-moves.png b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/byproducts/product-moves.png new file mode 100644 index 000000000..ab37af7a6 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/byproducts/product-moves.png differ diff --git a/content/applications/inventory_and_mrp/manufacturing/workflows/continuous_improvement.rst b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/continuous_improvement.rst similarity index 100% rename from content/applications/inventory_and_mrp/manufacturing/workflows/continuous_improvement.rst rename to content-rst/applications/inventory_and_mrp/manufacturing/workflows/continuous_improvement.rst diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/workflows/continuous_improvement/bom.png b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/continuous_improvement/bom.png new file mode 100644 index 000000000..e04549c20 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/continuous_improvement/bom.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/workflows/continuous_improvement/eco.png b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/continuous_improvement/eco.png new file mode 100644 index 000000000..bb7ed1b55 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/continuous_improvement/eco.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/workflows/continuous_improvement/helpdesk-ticket.png b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/continuous_improvement/helpdesk-ticket.png new file mode 100644 index 000000000..3a1474ab9 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/continuous_improvement/helpdesk-ticket.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/workflows/continuous_improvement/quality-alert.png b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/continuous_improvement/quality-alert.png new file mode 100644 index 000000000..45230c224 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/continuous_improvement/quality-alert.png differ diff --git a/content/applications/inventory_and_mrp/manufacturing/workflows/manufacture_lots_serials.rst b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/manufacture_lots_serials.rst similarity index 100% rename from content/applications/inventory_and_mrp/manufacturing/workflows/manufacture_lots_serials.rst rename to content-rst/applications/inventory_and_mrp/manufacturing/workflows/manufacture_lots_serials.rst diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/workflows/manufacture_lots_serials/batch-production.png b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/manufacture_lots_serials/batch-production.png new file mode 100644 index 000000000..3c68cfac2 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/manufacture_lots_serials/batch-production.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/workflows/manufacture_lots_serials/lot-sn-field.png b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/manufacture_lots_serials/lot-sn-field.png new file mode 100644 index 000000000..06553910e Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/manufacture_lots_serials/lot-sn-field.png differ diff --git a/content/applications/inventory_and_mrp/manufacturing/workflows/manufacturing_backorders.rst b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/manufacturing_backorders.rst similarity index 100% rename from content/applications/inventory_and_mrp/manufacturing/workflows/manufacturing_backorders.rst rename to content-rst/applications/inventory_and_mrp/manufacturing/workflows/manufacturing_backorders.rst diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/workflows/manufacturing_backorders/create-backorder-button.png b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/manufacturing_backorders/create-backorder-button.png new file mode 100644 index 000000000..650c9602c Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/manufacturing_backorders/create-backorder-button.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/workflows/manufacturing_backorders/quantity-field.png b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/manufacturing_backorders/quantity-field.png new file mode 100644 index 000000000..376dfb505 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/manufacturing_backorders/quantity-field.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/workflows/manufacturing_backorders/register-production.png b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/manufacturing_backorders/register-production.png new file mode 100644 index 000000000..fb771d040 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/manufacturing_backorders/register-production.png differ diff --git a/content/applications/inventory_and_mrp/manufacturing/workflows/scrap_manufacturing.rst b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/scrap_manufacturing.rst similarity index 100% rename from content/applications/inventory_and_mrp/manufacturing/workflows/scrap_manufacturing.rst rename to content-rst/applications/inventory_and_mrp/manufacturing/workflows/scrap_manufacturing.rst diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/workflows/scrap_manufacturing/scrap-window.png b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/scrap_manufacturing/scrap-window.png new file mode 100644 index 000000000..df2622f22 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/scrap_manufacturing/scrap-window.png differ diff --git a/content/applications/inventory_and_mrp/manufacturing/workflows/split_merge.rst b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/split_merge.rst similarity index 100% rename from content/applications/inventory_and_mrp/manufacturing/workflows/split_merge.rst rename to content-rst/applications/inventory_and_mrp/manufacturing/workflows/split_merge.rst diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/workflows/split_merge/actions-merge.png b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/split_merge/actions-merge.png new file mode 100644 index 000000000..16c93f6aa Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/split_merge/actions-merge.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/workflows/split_merge/select-orders.png b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/split_merge/select-orders.png new file mode 100644 index 000000000..b9aa36f71 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/split_merge/select-orders.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/workflows/split_merge/settings-split.png b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/split_merge/settings-split.png new file mode 100644 index 000000000..4a9e5d607 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/split_merge/settings-split.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/workflows/split_merge/split-production-window.png b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/split_merge/split-production-window.png new file mode 100644 index 000000000..83a3af504 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/split_merge/split-production-window.png differ diff --git a/content/applications/inventory_and_mrp/manufacturing/workflows/unbuild_orders.rst b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/unbuild_orders.rst similarity index 100% rename from content/applications/inventory_and_mrp/manufacturing/workflows/unbuild_orders.rst rename to content-rst/applications/inventory_and_mrp/manufacturing/workflows/unbuild_orders.rst diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/workflows/unbuild_orders/insufficient-quantity.png b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/unbuild_orders/insufficient-quantity.png new file mode 100644 index 000000000..25bd4ba83 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/unbuild_orders/insufficient-quantity.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/workflows/unbuild_orders/unbuild-order.png b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/unbuild_orders/unbuild-order.png new file mode 100644 index 000000000..fe9370ced Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/unbuild_orders/unbuild-order.png differ diff --git a/content/applications/inventory_and_mrp/manufacturing/workflows/use_mps.rst b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/use_mps.rst similarity index 100% rename from content/applications/inventory_and_mrp/manufacturing/workflows/use_mps.rst rename to content-rst/applications/inventory_and_mrp/manufacturing/workflows/use_mps.rst diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/workflows/use_mps/add-a-product.png b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/use_mps/add-a-product.png new file mode 100644 index 000000000..1b0dbdf05 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/use_mps/add-a-product.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/workflows/use_mps/mps-setting.png b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/use_mps/mps-setting.png new file mode 100644 index 000000000..72f80be33 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/use_mps/mps-setting.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/workflows/use_mps/mps.png b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/use_mps/mps.png new file mode 100644 index 000000000..c5692c1ca Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/use_mps/mps.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/workflows/use_mps/replenish-button.png b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/use_mps/replenish-button.png new file mode 100644 index 000000000..a3147482c Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/use_mps/replenish-button.png differ diff --git a/content/applications/inventory_and_mrp/manufacturing/workflows/work_center_time_off.rst b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/work_center_time_off.rst similarity index 100% rename from content/applications/inventory_and_mrp/manufacturing/workflows/work_center_time_off.rst rename to content-rst/applications/inventory_and_mrp/manufacturing/workflows/work_center_time_off.rst diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/workflows/work_center_time_off/after-planning.png b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/work_center_time_off/after-planning.png new file mode 100644 index 000000000..84a8f84dc Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/work_center_time_off/after-planning.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/workflows/work_center_time_off/alternative-work-center-selection.png b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/work_center_time_off/alternative-work-center-selection.png new file mode 100644 index 000000000..3e99dd291 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/work_center_time_off/alternative-work-center-selection.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/workflows/work_center_time_off/before-planning.png b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/work_center_time_off/before-planning.png new file mode 100644 index 000000000..33247dba2 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/work_center_time_off/before-planning.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/workflows/work_center_time_off/time-off-form.png b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/work_center_time_off/time-off-form.png new file mode 100644 index 000000000..4f9c0b717 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/work_center_time_off/time-off-form.png differ diff --git a/content-rst/applications/inventory_and_mrp/manufacturing/workflows/work_center_time_off/working-hours-button.png b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/work_center_time_off/working-hours-button.png new file mode 100644 index 000000000..c1f54bf5a Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/manufacturing/workflows/work_center_time_off/working-hours-button.png differ diff --git a/content/applications/inventory_and_mrp/plm.rst b/content-rst/applications/inventory_and_mrp/plm.rst similarity index 100% rename from content/applications/inventory_and_mrp/plm.rst rename to content-rst/applications/inventory_and_mrp/plm.rst diff --git a/content/applications/inventory_and_mrp/plm/manage_changes.rst b/content-rst/applications/inventory_and_mrp/plm/manage_changes.rst similarity index 100% rename from content/applications/inventory_and_mrp/plm/manage_changes.rst rename to content-rst/applications/inventory_and_mrp/plm/manage_changes.rst diff --git a/content/applications/inventory_and_mrp/plm/manage_changes/eco_type.rst b/content-rst/applications/inventory_and_mrp/plm/manage_changes/eco_type.rst similarity index 100% rename from content/applications/inventory_and_mrp/plm/manage_changes/eco_type.rst rename to content-rst/applications/inventory_and_mrp/plm/manage_changes/eco_type.rst diff --git a/content-rst/applications/inventory_and_mrp/plm/manage_changes/eco_type/closing-stage.png b/content-rst/applications/inventory_and_mrp/plm/manage_changes/eco_type/closing-stage.png new file mode 100644 index 000000000..c9c8fe423 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/plm/manage_changes/eco_type/closing-stage.png differ diff --git a/content-rst/applications/inventory_and_mrp/plm/manage_changes/eco_type/create-eco-type.png b/content-rst/applications/inventory_and_mrp/plm/manage_changes/eco_type/create-eco-type.png new file mode 100644 index 000000000..ec17a1c25 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/plm/manage_changes/eco_type/create-eco-type.png differ diff --git a/content-rst/applications/inventory_and_mrp/plm/manage_changes/eco_type/create-stage.png b/content-rst/applications/inventory_and_mrp/plm/manage_changes/eco_type/create-stage.png new file mode 100644 index 000000000..c48b94a1f Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/plm/manage_changes/eco_type/create-stage.png differ diff --git a/content-rst/applications/inventory_and_mrp/plm/manage_changes/eco_type/verification-stage.png b/content-rst/applications/inventory_and_mrp/plm/manage_changes/eco_type/verification-stage.png new file mode 100644 index 000000000..61440340c Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/plm/manage_changes/eco_type/verification-stage.png differ diff --git a/content/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders.rst b/content-rst/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders.rst similarity index 100% rename from content/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders.rst rename to content-rst/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders.rst diff --git a/content-rst/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/add-a-step.png b/content-rst/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/add-a-step.png new file mode 100644 index 000000000..1fdf4af69 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/add-a-step.png differ diff --git a/content-rst/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/additional-options-menu.png b/content-rst/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/additional-options-menu.png new file mode 100644 index 000000000..00efc0e54 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/additional-options-menu.png differ diff --git a/content-rst/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/archived-bom.png b/content-rst/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/archived-bom.png new file mode 100644 index 000000000..0ae219401 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/archived-bom.png differ diff --git a/content-rst/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/bom-changes.png b/content-rst/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/bom-changes.png new file mode 100644 index 000000000..489d20348 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/bom-changes.png differ diff --git a/content-rst/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/bom-version.png b/content-rst/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/bom-version.png new file mode 100644 index 000000000..626d67685 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/bom-version.png differ diff --git a/content-rst/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/eco-form.png b/content-rst/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/eco-form.png new file mode 100644 index 000000000..d1dee2908 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/eco-form.png differ diff --git a/content-rst/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/instructions-smart-button.png b/content-rst/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/instructions-smart-button.png new file mode 100644 index 000000000..2e1e47e40 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/instructions-smart-button.png differ diff --git a/content-rst/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/operation-changes.png b/content-rst/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/operation-changes.png new file mode 100644 index 000000000..bb7cdf8a0 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/operation-changes.png differ diff --git a/content-rst/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/reorder.png b/content-rst/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/reorder.png new file mode 100644 index 000000000..0bcfb1fbe Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/reorder.png differ diff --git a/content-rst/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/show-instructions.png b/content-rst/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/show-instructions.png new file mode 100644 index 000000000..d9ced1276 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/show-instructions.png differ diff --git a/content-rst/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/tablet-icon.png b/content-rst/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/tablet-icon.png new file mode 100644 index 000000000..17694d791 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/tablet-icon.png differ diff --git a/content-rst/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/version-2-bom.png b/content-rst/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/version-2-bom.png new file mode 100644 index 000000000..b40b59381 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/version-2-bom.png differ diff --git a/content-rst/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/view-bom-change.png b/content-rst/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/view-bom-change.png new file mode 100644 index 000000000..59045f0b7 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders/view-bom-change.png differ diff --git a/content/applications/inventory_and_mrp/plm/manage_changes/version_control.rst b/content-rst/applications/inventory_and_mrp/plm/manage_changes/version_control.rst similarity index 100% rename from content/applications/inventory_and_mrp/plm/manage_changes/version_control.rst rename to content-rst/applications/inventory_and_mrp/plm/manage_changes/version_control.rst diff --git a/content-rst/applications/inventory_and_mrp/plm/manage_changes/version_control/attach-files.png b/content-rst/applications/inventory_and_mrp/plm/manage_changes/version_control/attach-files.png new file mode 100644 index 000000000..bee3d1387 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/plm/manage_changes/version_control/attach-files.png differ diff --git a/content-rst/applications/inventory_and_mrp/plm/manage_changes/version_control/attachments.png b/content-rst/applications/inventory_and_mrp/plm/manage_changes/version_control/attachments.png new file mode 100644 index 000000000..1e01ed207 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/plm/manage_changes/version_control/attachments.png differ diff --git a/content-rst/applications/inventory_and_mrp/plm/manage_changes/version_control/branch-change.png b/content-rst/applications/inventory_and_mrp/plm/manage_changes/version_control/branch-change.png new file mode 100644 index 000000000..6499e744e Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/plm/manage_changes/version_control/branch-change.png differ diff --git a/content-rst/applications/inventory_and_mrp/plm/manage_changes/version_control/current-version.png b/content-rst/applications/inventory_and_mrp/plm/manage_changes/version_control/current-version.png new file mode 100644 index 000000000..60cf40235 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/plm/manage_changes/version_control/current-version.png differ diff --git a/content-rst/applications/inventory_and_mrp/plm/manage_changes/version_control/documents-smart-button.png b/content-rst/applications/inventory_and_mrp/plm/manage_changes/version_control/documents-smart-button.png new file mode 100644 index 000000000..16e71692d Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/plm/manage_changes/version_control/documents-smart-button.png differ diff --git a/content-rst/applications/inventory_and_mrp/plm/manage_changes/version_control/eco-list.png b/content-rst/applications/inventory_and_mrp/plm/manage_changes/version_control/eco-list.png new file mode 100644 index 000000000..383de824c Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/plm/manage_changes/version_control/eco-list.png differ diff --git a/content-rst/applications/inventory_and_mrp/plm/manage_changes/version_control/eco-smart-button.png b/content-rst/applications/inventory_and_mrp/plm/manage_changes/version_control/eco-smart-button.png new file mode 100644 index 000000000..f33e7a43c Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/plm/manage_changes/version_control/eco-smart-button.png differ diff --git a/content-rst/applications/inventory_and_mrp/plm/manage_changes/version_control/merge-change.png b/content-rst/applications/inventory_and_mrp/plm/manage_changes/version_control/merge-change.png new file mode 100644 index 000000000..772071115 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/plm/manage_changes/version_control/merge-change.png differ diff --git a/content-rst/applications/inventory_and_mrp/plm/manage_changes/version_control/no-effective-date.png b/content-rst/applications/inventory_and_mrp/plm/manage_changes/version_control/no-effective-date.png new file mode 100644 index 000000000..b685730b0 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/plm/manage_changes/version_control/no-effective-date.png differ diff --git a/content/applications/inventory_and_mrp/plm/management.rst b/content-rst/applications/inventory_and_mrp/plm/management.rst similarity index 100% rename from content/applications/inventory_and_mrp/plm/management.rst rename to content-rst/applications/inventory_and_mrp/plm/management.rst diff --git a/content/applications/inventory_and_mrp/plm/management/approvals.rst b/content-rst/applications/inventory_and_mrp/plm/management/approvals.rst similarity index 100% rename from content/applications/inventory_and_mrp/plm/management/approvals.rst rename to content-rst/applications/inventory_and_mrp/plm/management/approvals.rst diff --git a/content-rst/applications/inventory_and_mrp/plm/management/approvals/approvers.png b/content-rst/applications/inventory_and_mrp/plm/management/approvals/approvers.png new file mode 100644 index 000000000..6811427f5 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/plm/management/approvals/approvers.png differ diff --git a/content-rst/applications/inventory_and_mrp/plm/management/approvals/mark-as-done.png b/content-rst/applications/inventory_and_mrp/plm/management/approvals/mark-as-done.png new file mode 100644 index 000000000..d8b6308e8 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/plm/management/approvals/mark-as-done.png differ diff --git a/content-rst/applications/inventory_and_mrp/plm/management/approvals/planned-activity.png b/content-rst/applications/inventory_and_mrp/plm/management/approvals/planned-activity.png new file mode 100644 index 000000000..83cd58cb9 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/plm/management/approvals/planned-activity.png differ diff --git a/content-rst/applications/inventory_and_mrp/plm/management/approvals/schedule-an-activity.png b/content-rst/applications/inventory_and_mrp/plm/management/approvals/schedule-an-activity.png new file mode 100644 index 000000000..6753a67d3 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/plm/management/approvals/schedule-an-activity.png differ diff --git a/content-rst/applications/inventory_and_mrp/plm/management/approvals/todo-list.png b/content-rst/applications/inventory_and_mrp/plm/management/approvals/todo-list.png new file mode 100644 index 000000000..7f000a430 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/plm/management/approvals/todo-list.png differ diff --git a/content-rst/applications/inventory_and_mrp/plm/management/approvals/validation-overview.png b/content-rst/applications/inventory_and_mrp/plm/management/approvals/validation-overview.png new file mode 100644 index 000000000..b32618388 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/plm/management/approvals/validation-overview.png differ diff --git a/content/applications/inventory_and_mrp/purchase.rst b/content-rst/applications/inventory_and_mrp/purchase.rst similarity index 100% rename from content/applications/inventory_and_mrp/purchase.rst rename to content-rst/applications/inventory_and_mrp/purchase.rst diff --git a/content/applications/inventory_and_mrp/purchase/advanced.rst b/content-rst/applications/inventory_and_mrp/purchase/advanced.rst similarity index 100% rename from content/applications/inventory_and_mrp/purchase/advanced.rst rename to content-rst/applications/inventory_and_mrp/purchase/advanced.rst diff --git a/content/applications/inventory_and_mrp/purchase/advanced/analyze.rst b/content-rst/applications/inventory_and_mrp/purchase/advanced/analyze.rst similarity index 100% rename from content/applications/inventory_and_mrp/purchase/advanced/analyze.rst rename to content-rst/applications/inventory_and_mrp/purchase/advanced/analyze.rst diff --git a/content-rst/applications/inventory_and_mrp/purchase/advanced/analyze/comparison.png b/content-rst/applications/inventory_and_mrp/purchase/advanced/analyze/comparison.png new file mode 100644 index 000000000..b7e59fe8c Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/purchase/advanced/analyze/comparison.png differ diff --git a/content-rst/applications/inventory_and_mrp/purchase/advanced/analyze/dtr.png b/content-rst/applications/inventory_and_mrp/purchase/advanced/analyze/dtr.png new file mode 100644 index 000000000..5f1ee247e Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/purchase/advanced/analyze/dtr.png differ diff --git a/content/applications/inventory_and_mrp/purchase/advanced/procurement_expenses_report.rst b/content-rst/applications/inventory_and_mrp/purchase/advanced/procurement_expenses_report.rst similarity index 100% rename from content/applications/inventory_and_mrp/purchase/advanced/procurement_expenses_report.rst rename to content-rst/applications/inventory_and_mrp/purchase/advanced/procurement_expenses_report.rst diff --git a/content-rst/applications/inventory_and_mrp/purchase/advanced/procurement_expenses_report/filters-groups.png b/content-rst/applications/inventory_and_mrp/purchase/advanced/procurement_expenses_report/filters-groups.png new file mode 100644 index 000000000..d51b416bf Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/purchase/advanced/procurement_expenses_report/filters-groups.png differ diff --git a/content-rst/applications/inventory_and_mrp/purchase/advanced/procurement_expenses_report/sample-per-report.png b/content-rst/applications/inventory_and_mrp/purchase/advanced/procurement_expenses_report/sample-per-report.png new file mode 100644 index 000000000..4653119f4 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/purchase/advanced/procurement_expenses_report/sample-per-report.png differ diff --git a/content/applications/inventory_and_mrp/purchase/advanced/vendor_costs_report.rst b/content-rst/applications/inventory_and_mrp/purchase/advanced/vendor_costs_report.rst similarity index 100% rename from content/applications/inventory_and_mrp/purchase/advanced/vendor_costs_report.rst rename to content-rst/applications/inventory_and_mrp/purchase/advanced/vendor_costs_report.rst diff --git a/content-rst/applications/inventory_and_mrp/purchase/advanced/vendor_costs_report/filters-groups.png b/content-rst/applications/inventory_and_mrp/purchase/advanced/vendor_costs_report/filters-groups.png new file mode 100644 index 000000000..edb7c504d Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/purchase/advanced/vendor_costs_report/filters-groups.png differ diff --git a/content-rst/applications/inventory_and_mrp/purchase/advanced/vendor_costs_report/sample-vendor-report.png b/content-rst/applications/inventory_and_mrp/purchase/advanced/vendor_costs_report/sample-vendor-report.png new file mode 100644 index 000000000..d9bc9ebe1 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/purchase/advanced/vendor_costs_report/sample-vendor-report.png differ diff --git a/content/applications/inventory_and_mrp/purchase/manage_deals.rst b/content-rst/applications/inventory_and_mrp/purchase/manage_deals.rst similarity index 100% rename from content/applications/inventory_and_mrp/purchase/manage_deals.rst rename to content-rst/applications/inventory_and_mrp/purchase/manage_deals.rst diff --git a/content/applications/inventory_and_mrp/purchase/manage_deals/blanket_orders.rst b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/blanket_orders.rst similarity index 100% rename from content/applications/inventory_and_mrp/purchase/manage_deals/blanket_orders.rst rename to content-rst/applications/inventory_and_mrp/purchase/manage_deals/blanket_orders.rst diff --git a/content-rst/applications/inventory_and_mrp/purchase/manage_deals/blanket_orders/blanket-orders-edit-agreement-type.png b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/blanket_orders/blanket-orders-edit-agreement-type.png new file mode 100644 index 000000000..91e520390 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/blanket_orders/blanket-orders-edit-agreement-type.png differ diff --git a/content-rst/applications/inventory_and_mrp/purchase/manage_deals/blanket_orders/blanket-orders-enabled-setting.png b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/blanket_orders/blanket-orders-enabled-setting.png new file mode 100644 index 000000000..2e6dc3c34 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/blanket_orders/blanket-orders-enabled-setting.png differ diff --git a/content-rst/applications/inventory_and_mrp/purchase/manage_deals/blanket_orders/blanket-orders-internal-link-arrow.png b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/blanket_orders/blanket-orders-internal-link-arrow.png new file mode 100644 index 000000000..ab7a68b7d Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/blanket_orders/blanket-orders-internal-link-arrow.png differ diff --git a/content-rst/applications/inventory_and_mrp/purchase/manage_deals/blanket_orders/blanket-orders-new-agreement.png b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/blanket_orders/blanket-orders-new-agreement.png new file mode 100644 index 000000000..77ca8d601 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/blanket_orders/blanket-orders-new-agreement.png differ diff --git a/content-rst/applications/inventory_and_mrp/purchase/manage_deals/blanket_orders/blanket-orders-new-quotation.png b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/blanket_orders/blanket-orders-new-quotation.png new file mode 100644 index 000000000..91308ba9b Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/blanket_orders/blanket-orders-new-quotation.png differ diff --git a/content-rst/applications/inventory_and_mrp/purchase/manage_deals/blanket_orders/blanket-orders-product-form.png b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/blanket_orders/blanket-orders-product-form.png new file mode 100644 index 000000000..f55f5a735 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/blanket_orders/blanket-orders-product-form.png differ diff --git a/content-rst/applications/inventory_and_mrp/purchase/manage_deals/blanket_orders/blanket-orders-rfq-smart-button.png b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/blanket_orders/blanket-orders-rfq-smart-button.png new file mode 100644 index 000000000..a965ff453 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/blanket_orders/blanket-orders-rfq-smart-button.png differ diff --git a/content/applications/inventory_and_mrp/purchase/manage_deals/calls_for_tenders.rst b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/calls_for_tenders.rst similarity index 100% rename from content/applications/inventory_and_mrp/purchase/manage_deals/calls_for_tenders.rst rename to content-rst/applications/inventory_and_mrp/purchase/manage_deals/calls_for_tenders.rst diff --git a/content-rst/applications/inventory_and_mrp/purchase/manage_deals/calls_for_tenders/calls-for-tenders-blank-quotation.png b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/calls_for_tenders/calls-for-tenders-blank-quotation.png new file mode 100644 index 000000000..0bc1ac7c2 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/calls_for_tenders/calls-for-tenders-blank-quotation.png differ diff --git a/content-rst/applications/inventory_and_mrp/purchase/manage_deals/calls_for_tenders/calls-for-tenders-compare-products.png b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/calls_for_tenders/calls-for-tenders-compare-products.png new file mode 100644 index 000000000..018adfbd6 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/calls_for_tenders/calls-for-tenders-compare-products.png differ diff --git a/content-rst/applications/inventory_and_mrp/purchase/manage_deals/calls_for_tenders/calls-for-tenders-create-alternative.png b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/calls_for_tenders/calls-for-tenders-create-alternative.png new file mode 100644 index 000000000..0aa4c78bc Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/calls_for_tenders/calls-for-tenders-create-alternative.png differ diff --git a/content-rst/applications/inventory_and_mrp/purchase/manage_deals/calls_for_tenders/calls-for-tenders-enabled-setting.png b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/calls_for_tenders/calls-for-tenders-enabled-setting.png new file mode 100644 index 000000000..1150de15d Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/calls_for_tenders/calls-for-tenders-enabled-setting.png differ diff --git a/content-rst/applications/inventory_and_mrp/purchase/manage_deals/calls_for_tenders/calls-for-tenders-keep-or-cancel.png b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/calls_for_tenders/calls-for-tenders-keep-or-cancel.png new file mode 100644 index 000000000..4d1fd6e48 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/calls_for_tenders/calls-for-tenders-keep-or-cancel.png differ diff --git a/content-rst/applications/inventory_and_mrp/purchase/manage_deals/calls_for_tenders/calls-for-tenders-link-rfq-popup.png b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/calls_for_tenders/calls-for-tenders-link-rfq-popup.png new file mode 100644 index 000000000..0c1a3b9cc Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/calls_for_tenders/calls-for-tenders-link-rfq-popup.png differ diff --git a/content-rst/applications/inventory_and_mrp/purchase/manage_deals/calls_for_tenders/calls-for-tenders-zero-total.png b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/calls_for_tenders/calls-for-tenders-zero-total.png new file mode 100644 index 000000000..d231bdde1 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/calls_for_tenders/calls-for-tenders-zero-total.png differ diff --git a/content/applications/inventory_and_mrp/purchase/manage_deals/control_bills.rst b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/control_bills.rst similarity index 100% rename from content/applications/inventory_and_mrp/purchase/manage_deals/control_bills.rst rename to content-rst/applications/inventory_and_mrp/purchase/manage_deals/control_bills.rst diff --git a/content-rst/applications/inventory_and_mrp/purchase/manage_deals/control_bills/control-bills-billing-status.png b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/control_bills/control-bills-billing-status.png new file mode 100644 index 000000000..a9542b57a Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/control_bills/control-bills-billing-status.png differ diff --git a/content-rst/applications/inventory_and_mrp/purchase/manage_deals/control_bills/control-bills-error-message-popup.png b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/control_bills/control-bills-error-message-popup.png new file mode 100644 index 000000000..9ef0f70aa Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/control_bills/control-bills-error-message-popup.png differ diff --git a/content-rst/applications/inventory_and_mrp/purchase/manage_deals/control_bills/control-bills-invalid-operation.png b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/control_bills/control-bills-invalid-operation.png new file mode 100644 index 000000000..71f3eff80 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/control_bills/control-bills-invalid-operation.png differ diff --git a/content-rst/applications/inventory_and_mrp/purchase/manage_deals/control_bills/control-bills-selected-policy.png b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/control_bills/control-bills-selected-policy.png new file mode 100644 index 000000000..552e83635 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/control_bills/control-bills-selected-policy.png differ diff --git a/content-rst/applications/inventory_and_mrp/purchase/manage_deals/control_bills/control-bills-should-be-paid.png b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/control_bills/control-bills-should-be-paid.png new file mode 100644 index 000000000..523df5935 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/control_bills/control-bills-should-be-paid.png differ diff --git a/content-rst/applications/inventory_and_mrp/purchase/manage_deals/control_bills/control-bills-three-way-matching.png b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/control_bills/control-bills-three-way-matching.png new file mode 100644 index 000000000..aaa2efeb2 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/control_bills/control-bills-three-way-matching.png differ diff --git a/content/applications/inventory_and_mrp/purchase/manage_deals/manage.rst b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/manage.rst similarity index 100% rename from content/applications/inventory_and_mrp/purchase/manage_deals/manage.rst rename to content-rst/applications/inventory_and_mrp/purchase/manage_deals/manage.rst diff --git a/content-rst/applications/inventory_and_mrp/purchase/manage_deals/manage/manage-auto-complete.png b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/manage/manage-auto-complete.png new file mode 100644 index 000000000..872487429 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/manage/manage-auto-complete.png differ diff --git a/content-rst/applications/inventory_and_mrp/purchase/manage_deals/manage/manage-batch-billing.png b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/manage/manage-batch-billing.png new file mode 100644 index 000000000..9a7622fe2 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/manage/manage-batch-billing.png differ diff --git a/content-rst/applications/inventory_and_mrp/purchase/manage_deals/manage/manage-configuration-settings.png b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/manage/manage-configuration-settings.png new file mode 100644 index 000000000..6f4c0c626 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/manage/manage-configuration-settings.png differ diff --git a/content-rst/applications/inventory_and_mrp/purchase/manage_deals/manage/manage-draft-vendor-bill.png b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/manage/manage-draft-vendor-bill.png new file mode 100644 index 000000000..4dfe2c3cd Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/manage/manage-draft-vendor-bill.png differ diff --git a/content-rst/applications/inventory_and_mrp/purchase/manage_deals/manage/manage-product-form.png b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/manage/manage-product-form.png new file mode 100644 index 000000000..244fdabca Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/manage/manage-product-form.png differ diff --git a/content-rst/applications/inventory_and_mrp/purchase/manage_deals/manage/manage-user-error-popup.png b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/manage/manage-user-error-popup.png new file mode 100644 index 000000000..e72221bbd Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/manage/manage-user-error-popup.png differ diff --git a/content/applications/inventory_and_mrp/purchase/manage_deals/purchase_templates.rst b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/purchase_templates.rst similarity index 100% rename from content/applications/inventory_and_mrp/purchase/manage_deals/purchase_templates.rst rename to content-rst/applications/inventory_and_mrp/purchase/manage_deals/purchase_templates.rst diff --git a/content-rst/applications/inventory_and_mrp/purchase/manage_deals/purchase_templates/purchase-agreements-setting.png b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/purchase_templates/purchase-agreements-setting.png new file mode 100644 index 000000000..48a382c6c Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/purchase_templates/purchase-agreements-setting.png differ diff --git a/content-rst/applications/inventory_and_mrp/purchase/manage_deals/purchase_templates/rfq-smart-button.png b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/purchase_templates/rfq-smart-button.png new file mode 100644 index 000000000..510a8683f Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/purchase_templates/rfq-smart-button.png differ diff --git a/content/applications/inventory_and_mrp/purchase/manage_deals/rfq.rst b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/rfq.rst similarity index 100% rename from content/applications/inventory_and_mrp/purchase/manage_deals/rfq.rst rename to content-rst/applications/inventory_and_mrp/purchase/manage_deals/rfq.rst diff --git a/content-rst/applications/inventory_and_mrp/purchase/manage_deals/rfq/product-vendor-pricelist-config.png b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/rfq/product-vendor-pricelist-config.png new file mode 100644 index 000000000..ac56dfd35 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/rfq/product-vendor-pricelist-config.png differ diff --git a/content-rst/applications/inventory_and_mrp/purchase/manage_deals/rfq/rfq-dashboard.png b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/rfq/rfq-dashboard.png new file mode 100644 index 000000000..b258cc94f Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/purchase/manage_deals/rfq/rfq-dashboard.png differ diff --git a/content/applications/inventory_and_mrp/purchase/products.rst b/content-rst/applications/inventory_and_mrp/purchase/products.rst similarity index 100% rename from content/applications/inventory_and_mrp/purchase/products.rst rename to content-rst/applications/inventory_and_mrp/purchase/products.rst diff --git a/content/applications/inventory_and_mrp/purchase/products/pricelist.rst b/content-rst/applications/inventory_and_mrp/purchase/products/pricelist.rst similarity index 100% rename from content/applications/inventory_and_mrp/purchase/products/pricelist.rst rename to content-rst/applications/inventory_and_mrp/purchase/products/pricelist.rst diff --git a/content-rst/applications/inventory_and_mrp/purchase/products/pricelist/duplicate-values.png b/content-rst/applications/inventory_and_mrp/purchase/products/pricelist/duplicate-values.png new file mode 100644 index 000000000..a6f9be6b5 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/purchase/products/pricelist/duplicate-values.png differ diff --git a/content-rst/applications/inventory_and_mrp/purchase/products/pricelist/export-data.png b/content-rst/applications/inventory_and_mrp/purchase/products/pricelist/export-data.png new file mode 100644 index 000000000..4fa91a12c Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/purchase/products/pricelist/export-data.png differ diff --git a/content-rst/applications/inventory_and_mrp/purchase/products/pricelist/export.png b/content-rst/applications/inventory_and_mrp/purchase/products/pricelist/export.png new file mode 100644 index 000000000..7e1292a96 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/purchase/products/pricelist/export.png differ diff --git a/content-rst/applications/inventory_and_mrp/purchase/products/pricelist/pricelist-example.csv b/content-rst/applications/inventory_and_mrp/purchase/products/pricelist/pricelist-example.csv new file mode 100644 index 000000000..f326c45a1 --- /dev/null +++ b/content-rst/applications/inventory_and_mrp/purchase/products/pricelist/pricelist-example.csv @@ -0,0 +1,5 @@ +"id","company_id","delay","price","product_tmpl_id","sequence","partner_id" +"product.product_supplierinfo_3","My Company (San Francisco)","3","13.0","[E-COM08] Storage Box","4","Wood Corner" +"","My Company (San Francisco)","3","14.4","[E-COM08] Storage Box","5","Ready Mat" +"","My Company (San Francisco)","2","1299.0","[E-COM09] Large Desk","6","Wood Corner" +"","My Company (San Francisco)","4","1399.0","[E-COM09] Large Desk","7","Azure Interior" diff --git a/content-rst/applications/inventory_and_mrp/purchase/products/pricelist/pricelist-example.xlsx b/content-rst/applications/inventory_and_mrp/purchase/products/pricelist/pricelist-example.xlsx new file mode 100644 index 000000000..5e6899f3b Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/purchase/products/pricelist/pricelist-example.xlsx differ diff --git a/content-rst/applications/inventory_and_mrp/purchase/products/pricelist/product-form-pricelist.png b/content-rst/applications/inventory_and_mrp/purchase/products/pricelist/product-form-pricelist.png new file mode 100644 index 000000000..3ae539478 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/purchase/products/pricelist/product-form-pricelist.png differ diff --git a/content-rst/applications/inventory_and_mrp/purchase/products/pricelist/supplier-pricelist-example.png b/content-rst/applications/inventory_and_mrp/purchase/products/pricelist/supplier-pricelist-example.png new file mode 100644 index 000000000..9ecfe7430 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/purchase/products/pricelist/supplier-pricelist-example.png differ diff --git a/content/applications/inventory_and_mrp/purchase/products/reordering.rst b/content-rst/applications/inventory_and_mrp/purchase/products/reordering.rst similarity index 100% rename from content/applications/inventory_and_mrp/purchase/products/reordering.rst rename to content-rst/applications/inventory_and_mrp/purchase/products/reordering.rst diff --git a/content-rst/applications/inventory_and_mrp/purchase/products/reordering/product-configured-for-reordering.png b/content-rst/applications/inventory_and_mrp/purchase/products/reordering/product-configured-for-reordering.png new file mode 100644 index 000000000..fd0eb83b8 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/purchase/products/reordering/product-configured-for-reordering.png differ diff --git a/content-rst/applications/inventory_and_mrp/purchase/products/reordering/reordering-rule-configuration.png b/content-rst/applications/inventory_and_mrp/purchase/products/reordering/reordering-rule-configuration.png new file mode 100644 index 000000000..76697fe3e Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/purchase/products/reordering/reordering-rule-configuration.png differ diff --git a/content/applications/inventory_and_mrp/purchase/products/temporary_reordering.rst b/content-rst/applications/inventory_and_mrp/purchase/products/temporary_reordering.rst similarity index 100% rename from content/applications/inventory_and_mrp/purchase/products/temporary_reordering.rst rename to content-rst/applications/inventory_and_mrp/purchase/products/temporary_reordering.rst diff --git a/content-rst/applications/inventory_and_mrp/purchase/products/temporary_reordering/temporary-reordering-purchase-order.png b/content-rst/applications/inventory_and_mrp/purchase/products/temporary_reordering/temporary-reordering-purchase-order.png new file mode 100644 index 000000000..a29c922ec Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/purchase/products/temporary_reordering/temporary-reordering-purchase-order.png differ diff --git a/content-rst/applications/inventory_and_mrp/purchase/products/temporary_reordering/temporary-reordering-replenishment-dashboard.png b/content-rst/applications/inventory_and_mrp/purchase/products/temporary_reordering/temporary-reordering-replenishment-dashboard.png new file mode 100644 index 000000000..682e9276c Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/purchase/products/temporary_reordering/temporary-reordering-replenishment-dashboard.png differ diff --git a/content-rst/applications/inventory_and_mrp/purchase/products/temporary_reordering/temporary-reordering-sales-order.png b/content-rst/applications/inventory_and_mrp/purchase/products/temporary_reordering/temporary-reordering-sales-order.png new file mode 100644 index 000000000..65d8d05ad Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/purchase/products/temporary_reordering/temporary-reordering-sales-order.png differ diff --git a/content-rst/applications/inventory_and_mrp/purchase/products/temporary_reordering/temporary-reordering-smart-buttons.png b/content-rst/applications/inventory_and_mrp/purchase/products/temporary_reordering/temporary-reordering-smart-buttons.png new file mode 100644 index 000000000..409ad14bd Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/purchase/products/temporary_reordering/temporary-reordering-smart-buttons.png differ diff --git a/content-rst/applications/inventory_and_mrp/purchase/products/temporary_reordering/temporary-reordering-warning-popup.png b/content-rst/applications/inventory_and_mrp/purchase/products/temporary_reordering/temporary-reordering-warning-popup.png new file mode 100644 index 000000000..36b2e8ec5 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/purchase/products/temporary_reordering/temporary-reordering-warning-popup.png differ diff --git a/content/applications/inventory_and_mrp/purchase/products/uom.rst b/content-rst/applications/inventory_and_mrp/purchase/products/uom.rst similarity index 100% rename from content/applications/inventory_and_mrp/purchase/products/uom.rst rename to content-rst/applications/inventory_and_mrp/purchase/products/uom.rst diff --git a/content-rst/applications/inventory_and_mrp/purchase/products/uom/uom-enable-option.png b/content-rst/applications/inventory_and_mrp/purchase/products/uom/uom-enable-option.png new file mode 100644 index 000000000..944720c85 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/purchase/products/uom/uom-enable-option.png differ diff --git a/content-rst/applications/inventory_and_mrp/purchase/products/uom/uom-new-category.png b/content-rst/applications/inventory_and_mrp/purchase/products/uom/uom-new-category.png new file mode 100644 index 000000000..3d2c8923c Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/purchase/products/uom/uom-new-category.png differ diff --git a/content-rst/applications/inventory_and_mrp/purchase/products/uom/uom-new-reference-unit.png b/content-rst/applications/inventory_and_mrp/purchase/products/uom/uom-new-reference-unit.png new file mode 100644 index 000000000..d2cca03d2 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/purchase/products/uom/uom-new-reference-unit.png differ diff --git a/content-rst/applications/inventory_and_mrp/purchase/products/uom/uom-product-configuration-new-units.png b/content-rst/applications/inventory_and_mrp/purchase/products/uom/uom-product-configuration-new-units.png new file mode 100644 index 000000000..3af7c9c20 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/purchase/products/uom/uom-product-configuration-new-units.png differ diff --git a/content-rst/applications/inventory_and_mrp/purchase/products/uom/uom-product-configuration.png b/content-rst/applications/inventory_and_mrp/purchase/products/uom/uom-product-configuration.png new file mode 100644 index 000000000..fe80c2f13 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/purchase/products/uom/uom-product-configuration.png differ diff --git a/content/applications/inventory_and_mrp/quality.rst b/content-rst/applications/inventory_and_mrp/quality.rst similarity index 100% rename from content/applications/inventory_and_mrp/quality.rst rename to content-rst/applications/inventory_and_mrp/quality.rst diff --git a/content/applications/inventory_and_mrp/quality/quality_check_types.rst b/content-rst/applications/inventory_and_mrp/quality/quality_check_types.rst similarity index 100% rename from content/applications/inventory_and_mrp/quality/quality_check_types.rst rename to content-rst/applications/inventory_and_mrp/quality/quality_check_types.rst diff --git a/content/applications/inventory_and_mrp/quality/quality_check_types/instructions_check.rst b/content-rst/applications/inventory_and_mrp/quality/quality_check_types/instructions_check.rst similarity index 100% rename from content/applications/inventory_and_mrp/quality/quality_check_types/instructions_check.rst rename to content-rst/applications/inventory_and_mrp/quality/quality_check_types/instructions_check.rst diff --git a/content-rst/applications/inventory_and_mrp/quality/quality_check_types/instructions_check/instructions-check-shop-floor.png b/content-rst/applications/inventory_and_mrp/quality/quality_check_types/instructions_check/instructions-check-shop-floor.png new file mode 100644 index 000000000..3b5ed3f9e Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/quality/quality_check_types/instructions_check/instructions-check-shop-floor.png differ diff --git a/content-rst/applications/inventory_and_mrp/quality/quality_check_types/instructions_check/quality-check-pop-up.png b/content-rst/applications/inventory_and_mrp/quality/quality_check_types/instructions_check/quality-check-pop-up.png new file mode 100644 index 000000000..08c4c2a0d Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/quality/quality_check_types/instructions_check/quality-check-pop-up.png differ diff --git a/content/applications/inventory_and_mrp/quality/quality_check_types/measure_check.rst b/content-rst/applications/inventory_and_mrp/quality/quality_check_types/measure_check.rst similarity index 100% rename from content/applications/inventory_and_mrp/quality/quality_check_types/measure_check.rst rename to content-rst/applications/inventory_and_mrp/quality/quality_check_types/measure_check.rst diff --git a/content-rst/applications/inventory_and_mrp/quality/quality_check_types/measure_check/measure-check-failed.png b/content-rst/applications/inventory_and_mrp/quality/quality_check_types/measure_check/measure-check-failed.png new file mode 100644 index 000000000..87a6fc0aa Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/quality/quality_check_types/measure_check/measure-check-failed.png differ diff --git a/content-rst/applications/inventory_and_mrp/quality/quality_check_types/measure_check/measure-check-form-1.png b/content-rst/applications/inventory_and_mrp/quality/quality_check_types/measure_check/measure-check-form-1.png new file mode 100644 index 000000000..1a9af188e Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/quality/quality_check_types/measure_check/measure-check-form-1.png differ diff --git a/content-rst/applications/inventory_and_mrp/quality/quality_check_types/measure_check/measure-check-pop-up.png b/content-rst/applications/inventory_and_mrp/quality/quality_check_types/measure_check/measure-check-pop-up.png new file mode 100644 index 000000000..a413ac2c8 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/quality/quality_check_types/measure_check/measure-check-pop-up.png differ diff --git a/content-rst/applications/inventory_and_mrp/quality/quality_check_types/measure_check/measure-check-qcp-form.png b/content-rst/applications/inventory_and_mrp/quality/quality_check_types/measure_check/measure-check-qcp-form.png new file mode 100644 index 000000000..eb5d408dc Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/quality/quality_check_types/measure_check/measure-check-qcp-form.png differ diff --git a/content-rst/applications/inventory_and_mrp/quality/quality_check_types/measure_check/measure-check-shop-floor.png b/content-rst/applications/inventory_and_mrp/quality/quality_check_types/measure_check/measure-check-shop-floor.png new file mode 100644 index 000000000..8868f8438 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/quality/quality_check_types/measure_check/measure-check-shop-floor.png differ diff --git a/content-rst/applications/inventory_and_mrp/quality/quality_check_types/measure_check/shop-floor-measure-check-failed.png b/content-rst/applications/inventory_and_mrp/quality/quality_check_types/measure_check/shop-floor-measure-check-failed.png new file mode 100644 index 000000000..4cbdce867 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/quality/quality_check_types/measure_check/shop-floor-measure-check-failed.png differ diff --git a/content/applications/inventory_and_mrp/quality/quality_check_types/pass_fail_check.rst b/content-rst/applications/inventory_and_mrp/quality/quality_check_types/pass_fail_check.rst similarity index 100% rename from content/applications/inventory_and_mrp/quality/quality_check_types/pass_fail_check.rst rename to content-rst/applications/inventory_and_mrp/quality/quality_check_types/pass_fail_check.rst diff --git a/content-rst/applications/inventory_and_mrp/quality/quality_check_types/pass_fail_check/pass-fail-check-pop-up.png b/content-rst/applications/inventory_and_mrp/quality/quality_check_types/pass_fail_check/pass-fail-check-pop-up.png new file mode 100644 index 000000000..ed57c8ab0 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/quality/quality_check_types/pass_fail_check/pass-fail-check-pop-up.png differ diff --git a/content-rst/applications/inventory_and_mrp/quality/quality_check_types/pass_fail_check/pass-fail-check-shop-floor.png b/content-rst/applications/inventory_and_mrp/quality/quality_check_types/pass_fail_check/pass-fail-check-shop-floor.png new file mode 100644 index 000000000..ff595b8a0 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/quality/quality_check_types/pass_fail_check/pass-fail-check-shop-floor.png differ diff --git a/content-rst/applications/inventory_and_mrp/quality/quality_check_types/pass_fail_check/qcp-form.png b/content-rst/applications/inventory_and_mrp/quality/quality_check_types/pass_fail_check/qcp-form.png new file mode 100644 index 000000000..36f2c87cb Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/quality/quality_check_types/pass_fail_check/qcp-form.png differ diff --git a/content-rst/applications/inventory_and_mrp/quality/quality_check_types/pass_fail_check/quality-check-form.png b/content-rst/applications/inventory_and_mrp/quality/quality_check_types/pass_fail_check/quality-check-form.png new file mode 100644 index 000000000..bdca5f75b Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/quality/quality_check_types/pass_fail_check/quality-check-form.png differ diff --git a/content/applications/inventory_and_mrp/quality/quality_check_types/picture_check.rst b/content-rst/applications/inventory_and_mrp/quality/quality_check_types/picture_check.rst similarity index 100% rename from content/applications/inventory_and_mrp/quality/quality_check_types/picture_check.rst rename to content-rst/applications/inventory_and_mrp/quality/quality_check_types/picture_check.rst diff --git a/content-rst/applications/inventory_and_mrp/quality/quality_check_types/picture_check/picture-check-form.png b/content-rst/applications/inventory_and_mrp/quality/quality_check_types/picture_check/picture-check-form.png new file mode 100644 index 000000000..f923a6e7c Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/quality/quality_check_types/picture_check/picture-check-form.png differ diff --git a/content-rst/applications/inventory_and_mrp/quality/quality_check_types/picture_check/picture-check-pop-up.png b/content-rst/applications/inventory_and_mrp/quality/quality_check_types/picture_check/picture-check-pop-up.png new file mode 100644 index 000000000..5822dbb21 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/quality/quality_check_types/picture_check/picture-check-pop-up.png differ diff --git a/content-rst/applications/inventory_and_mrp/quality/quality_check_types/picture_check/picture-check-shop-floor.png b/content-rst/applications/inventory_and_mrp/quality/quality_check_types/picture_check/picture-check-shop-floor.png new file mode 100644 index 000000000..ca859471f Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/quality/quality_check_types/picture_check/picture-check-shop-floor.png differ diff --git a/content-rst/applications/inventory_and_mrp/quality/quality_check_types/picture_check/picture-edit-button.png b/content-rst/applications/inventory_and_mrp/quality/quality_check_types/picture_check/picture-edit-button.png new file mode 100644 index 000000000..115db07a9 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/quality/quality_check_types/picture_check/picture-edit-button.png differ diff --git a/content-rst/applications/inventory_and_mrp/quality/quality_check_types/picture_check/picture-qcp-form.png b/content-rst/applications/inventory_and_mrp/quality/quality_check_types/picture_check/picture-qcp-form.png new file mode 100644 index 000000000..af0dbf2fa Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/quality/quality_check_types/picture_check/picture-qcp-form.png differ diff --git a/content-rst/applications/inventory_and_mrp/quality/quality_check_types/picture_check/review-picture-check.png b/content-rst/applications/inventory_and_mrp/quality/quality_check_types/picture_check/review-picture-check.png new file mode 100644 index 000000000..ea9a8b75d Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/quality/quality_check_types/picture_check/review-picture-check.png differ diff --git a/content/applications/inventory_and_mrp/quality/quality_management.rst b/content-rst/applications/inventory_and_mrp/quality/quality_management.rst similarity index 100% rename from content/applications/inventory_and_mrp/quality/quality_management.rst rename to content-rst/applications/inventory_and_mrp/quality/quality_management.rst diff --git a/content/applications/inventory_and_mrp/quality/quality_management/failure_locations.rst b/content-rst/applications/inventory_and_mrp/quality/quality_management/failure_locations.rst similarity index 100% rename from content/applications/inventory_and_mrp/quality/quality_management/failure_locations.rst rename to content-rst/applications/inventory_and_mrp/quality/quality_management/failure_locations.rst diff --git a/content-rst/applications/inventory_and_mrp/quality/quality_management/failure_locations/failed-pop-up.png b/content-rst/applications/inventory_and_mrp/quality/quality_management/failure_locations/failed-pop-up.png new file mode 100644 index 000000000..df46e0a12 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/quality/quality_management/failure_locations/failed-pop-up.png differ diff --git a/content-rst/applications/inventory_and_mrp/quality/quality_management/failure_locations/qcp-form.png b/content-rst/applications/inventory_and_mrp/quality/quality_management/failure_locations/qcp-form.png new file mode 100644 index 000000000..8879cb7f0 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/quality/quality_management/failure_locations/qcp-form.png differ diff --git a/content-rst/applications/inventory_and_mrp/quality/quality_management/failure_locations/storage-locations-setting.png b/content-rst/applications/inventory_and_mrp/quality/quality_management/failure_locations/storage-locations-setting.png new file mode 100644 index 000000000..886deebbe Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/quality/quality_management/failure_locations/storage-locations-setting.png differ diff --git a/content/applications/inventory_and_mrp/quality/quality_management/quality_alerts.rst b/content-rst/applications/inventory_and_mrp/quality/quality_management/quality_alerts.rst similarity index 100% rename from content/applications/inventory_and_mrp/quality/quality_management/quality_alerts.rst rename to content-rst/applications/inventory_and_mrp/quality/quality_management/quality_alerts.rst diff --git a/content-rst/applications/inventory_and_mrp/quality/quality_management/quality_alerts/alert-form.png b/content-rst/applications/inventory_and_mrp/quality/quality_management/quality_alerts/alert-form.png new file mode 100644 index 000000000..40f0499d6 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/quality/quality_management/quality_alerts/alert-form.png differ diff --git a/content-rst/applications/inventory_and_mrp/quality/quality_management/quality_alerts/alert-kanban.png b/content-rst/applications/inventory_and_mrp/quality/quality_management/quality_alerts/alert-kanban.png new file mode 100644 index 000000000..36c0f47f5 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/quality/quality_management/quality_alerts/alert-kanban.png differ diff --git a/content/applications/inventory_and_mrp/quality/quality_management/quality_checks.rst b/content-rst/applications/inventory_and_mrp/quality/quality_management/quality_checks.rst similarity index 100% rename from content/applications/inventory_and_mrp/quality/quality_management/quality_checks.rst rename to content-rst/applications/inventory_and_mrp/quality/quality_management/quality_checks.rst diff --git a/content-rst/applications/inventory_and_mrp/quality/quality_management/quality_checks/quality-check-form.png b/content-rst/applications/inventory_and_mrp/quality/quality_management/quality_checks/quality-check-form.png new file mode 100644 index 000000000..067a38183 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/quality/quality_management/quality_checks/quality-check-form.png differ diff --git a/content-rst/applications/inventory_and_mrp/quality/quality_management/quality_checks/quality-check-pop-up.png b/content-rst/applications/inventory_and_mrp/quality/quality_management/quality_checks/quality-check-pop-up.png new file mode 100644 index 000000000..08c4c2a0d Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/quality/quality_management/quality_checks/quality-check-pop-up.png differ diff --git a/content/applications/inventory_and_mrp/quality/quality_management/quality_control_points.rst b/content-rst/applications/inventory_and_mrp/quality/quality_management/quality_control_points.rst similarity index 100% rename from content/applications/inventory_and_mrp/quality/quality_management/quality_control_points.rst rename to content-rst/applications/inventory_and_mrp/quality/quality_management/quality_control_points.rst diff --git a/content-rst/applications/inventory_and_mrp/quality/quality_management/quality_control_points/qcp-form.png b/content-rst/applications/inventory_and_mrp/quality/quality_management/quality_control_points/qcp-form.png new file mode 100644 index 000000000..f61b2232c Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/quality/quality_management/quality_control_points/qcp-form.png differ diff --git a/content/applications/inventory_and_mrp/repairs.rst b/content-rst/applications/inventory_and_mrp/repairs.rst similarity index 100% rename from content/applications/inventory_and_mrp/repairs.rst rename to content-rst/applications/inventory_and_mrp/repairs.rst diff --git a/content/applications/inventory_and_mrp/repairs/repair_orders.rst b/content-rst/applications/inventory_and_mrp/repairs/repair_orders.rst similarity index 100% rename from content/applications/inventory_and_mrp/repairs/repair_orders.rst rename to content-rst/applications/inventory_and_mrp/repairs/repair_orders.rst diff --git a/content-rst/applications/inventory_and_mrp/repairs/repair_orders/repair-orders-additional-options.png b/content-rst/applications/inventory_and_mrp/repairs/repair_orders/repair-orders-additional-options.png new file mode 100644 index 000000000..903f805e5 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/repairs/repair_orders/repair-orders-additional-options.png differ diff --git a/content-rst/applications/inventory_and_mrp/repairs/repair_orders/repair-orders-completed-repair-form.png b/content-rst/applications/inventory_and_mrp/repairs/repair_orders/repair-orders-completed-repair-form.png new file mode 100644 index 000000000..1ca0b36ba Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/repairs/repair_orders/repair-orders-completed-repair-form.png differ diff --git a/content-rst/applications/inventory_and_mrp/repairs/repair_orders/repair-orders-left-hand-form.png b/content-rst/applications/inventory_and_mrp/repairs/repair_orders/repair-orders-left-hand-form.png new file mode 100644 index 000000000..7686d6e3e Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/repairs/repair_orders/repair-orders-left-hand-form.png differ diff --git a/content-rst/applications/inventory_and_mrp/repairs/repair_orders/repair-orders-new-quotation.png b/content-rst/applications/inventory_and_mrp/repairs/repair_orders/repair-orders-new-quotation.png new file mode 100644 index 000000000..7d05dfe15 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/repairs/repair_orders/repair-orders-new-quotation.png differ diff --git a/content-rst/applications/inventory_and_mrp/repairs/repair_orders/repair-orders-product-moves.png b/content-rst/applications/inventory_and_mrp/repairs/repair_orders/repair-orders-product-moves.png new file mode 100644 index 000000000..0702d7d77 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/repairs/repair_orders/repair-orders-product-moves.png differ diff --git a/content-rst/applications/inventory_and_mrp/repairs/repair_orders/repair-orders-quantity-delivered.png b/content-rst/applications/inventory_and_mrp/repairs/repair_orders/repair-orders-quantity-delivered.png new file mode 100644 index 000000000..51ba88d56 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/repairs/repair_orders/repair-orders-quantity-delivered.png differ diff --git a/content-rst/applications/inventory_and_mrp/repairs/repair_orders/repair-orders-reverse-transfer.png b/content-rst/applications/inventory_and_mrp/repairs/repair_orders/repair-orders-reverse-transfer.png new file mode 100644 index 000000000..ae4e72d4b Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/repairs/repair_orders/repair-orders-reverse-transfer.png differ diff --git a/content-rst/applications/inventory_and_mrp/repairs/repair_orders/repair-orders-type-column.png b/content-rst/applications/inventory_and_mrp/repairs/repair_orders/repair-orders-type-column.png new file mode 100644 index 000000000..1065f8ac7 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/repairs/repair_orders/repair-orders-type-column.png differ diff --git a/content-rst/applications/inventory_and_mrp/repairs/repair_orders/repair-orders-uncomplete-moves.png b/content-rst/applications/inventory_and_mrp/repairs/repair_orders/repair-orders-uncomplete-moves.png new file mode 100644 index 000000000..35c667ea6 Binary files /dev/null and b/content-rst/applications/inventory_and_mrp/repairs/repair_orders/repair-orders-uncomplete-moves.png differ diff --git a/content/applications/marketing.rst b/content-rst/applications/marketing.rst similarity index 100% rename from content/applications/marketing.rst rename to content-rst/applications/marketing.rst diff --git a/content/applications/marketing/email_marketing.rst b/content-rst/applications/marketing/email_marketing.rst similarity index 100% rename from content/applications/marketing/email_marketing.rst rename to content-rst/applications/marketing/email_marketing.rst diff --git a/content-rst/applications/marketing/email_marketing/ab-test-tab.png b/content-rst/applications/marketing/email_marketing/ab-test-tab.png new file mode 100644 index 000000000..eacec21c2 Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/ab-test-tab.png differ diff --git a/content-rst/applications/marketing/email_marketing/add-custom-filter-popup.png b/content-rst/applications/marketing/email_marketing/add-custom-filter-popup.png new file mode 100644 index 000000000..278d7bbc0 Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/add-custom-filter-popup.png differ diff --git a/content/applications/marketing/email_marketing/analyze_metrics.rst b/content-rst/applications/marketing/email_marketing/analyze_metrics.rst similarity index 100% rename from content/applications/marketing/email_marketing/analyze_metrics.rst rename to content-rst/applications/marketing/email_marketing/analyze_metrics.rst diff --git a/content-rst/applications/marketing/email_marketing/analyze_metrics/mailing-comparison.png b/content-rst/applications/marketing/email_marketing/analyze_metrics/mailing-comparison.png new file mode 100644 index 000000000..c7dea7276 Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/analyze_metrics/mailing-comparison.png differ diff --git a/content-rst/applications/marketing/email_marketing/analyze_metrics/malformed-addresses.png b/content-rst/applications/marketing/email_marketing/analyze_metrics/malformed-addresses.png new file mode 100644 index 000000000..ea574159d Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/analyze_metrics/malformed-addresses.png differ diff --git a/content-rst/applications/marketing/email_marketing/analyze_metrics/metric-smart-buttons.png b/content-rst/applications/marketing/email_marketing/analyze_metrics/metric-smart-buttons.png new file mode 100644 index 000000000..262260ab3 Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/analyze_metrics/metric-smart-buttons.png differ diff --git a/content-rst/applications/marketing/email_marketing/analyze_metrics/metrics-filter.png b/content-rst/applications/marketing/email_marketing/analyze_metrics/metrics-filter.png new file mode 100644 index 000000000..06b711814 Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/analyze_metrics/metrics-filter.png differ diff --git a/content-rst/applications/marketing/email_marketing/analyze_metrics/mma-opened.png b/content-rst/applications/marketing/email_marketing/analyze_metrics/mma-opened.png new file mode 100644 index 000000000..41c0c0791 Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/analyze_metrics/mma-opened.png differ diff --git a/content-rst/applications/marketing/email_marketing/analyze_metrics/newsletter-metrics.png b/content-rst/applications/marketing/email_marketing/analyze_metrics/newsletter-metrics.png new file mode 100644 index 000000000..27fce4896 Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/analyze_metrics/newsletter-metrics.png differ diff --git a/content-rst/applications/marketing/email_marketing/blank-campaign-form.png b/content-rst/applications/marketing/email_marketing/blank-campaign-form.png new file mode 100644 index 000000000..c433acf34 Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/blank-campaign-form.png differ diff --git a/content-rst/applications/marketing/email_marketing/blank-email-detail-form.png b/content-rst/applications/marketing/email_marketing/blank-email-detail-form.png new file mode 100644 index 000000000..c0a388651 Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/blank-email-detail-form.png differ diff --git a/content-rst/applications/marketing/email_marketing/calendar-view.png b/content-rst/applications/marketing/email_marketing/calendar-view.png new file mode 100644 index 000000000..bbd666a18 Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/calendar-view.png differ diff --git a/content-rst/applications/marketing/email_marketing/campaign-form.png b/content-rst/applications/marketing/email_marketing/campaign-form.png new file mode 100644 index 000000000..f8c0e2dd7 Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/campaign-form.png differ diff --git a/content-rst/applications/marketing/email_marketing/campaign-page-list-view.png b/content-rst/applications/marketing/email_marketing/campaign-page-list-view.png new file mode 100644 index 000000000..3a2ee2205 Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/campaign-page-list-view.png differ diff --git a/content-rst/applications/marketing/email_marketing/campaigns-feature.png b/content-rst/applications/marketing/email_marketing/campaigns-feature.png new file mode 100644 index 000000000..4a935e307 Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/campaigns-feature.png differ diff --git a/content-rst/applications/marketing/email_marketing/campaigns-kanban-popup.png b/content-rst/applications/marketing/email_marketing/campaigns-kanban-popup.png new file mode 100644 index 000000000..f6dc2b619 Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/campaigns-kanban-popup.png differ diff --git a/content-rst/applications/marketing/email_marketing/campaigns-page.png b/content-rst/applications/marketing/email_marketing/campaigns-page.png new file mode 100644 index 000000000..1cb311e47 Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/campaigns-page.png differ diff --git a/content-rst/applications/marketing/email_marketing/configuration-settings.png b/content-rst/applications/marketing/email_marketing/configuration-settings.png new file mode 100644 index 000000000..0ffeb3ba9 Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/configuration-settings.png differ diff --git a/content-rst/applications/marketing/email_marketing/detailed-filter-records.png b/content-rst/applications/marketing/email_marketing/detailed-filter-records.png new file mode 100644 index 000000000..de1cc5438 Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/detailed-filter-records.png differ diff --git a/content-rst/applications/marketing/email_marketing/favorites-dropdown.png b/content-rst/applications/marketing/email_marketing/favorites-dropdown.png new file mode 100644 index 000000000..beba3c2e9 Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/favorites-dropdown.png differ diff --git a/content-rst/applications/marketing/email_marketing/filter-records.png b/content-rst/applications/marketing/email_marketing/filter-records.png new file mode 100644 index 000000000..d58919b1e Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/filter-records.png differ diff --git a/content-rst/applications/marketing/email_marketing/filters-dropdown.png b/content-rst/applications/marketing/email_marketing/filters-dropdown.png new file mode 100644 index 000000000..b7977da61 Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/filters-dropdown.png differ diff --git a/content-rst/applications/marketing/email_marketing/graph-view.png b/content-rst/applications/marketing/email_marketing/graph-view.png new file mode 100644 index 000000000..c1eb85989 Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/graph-view.png differ diff --git a/content-rst/applications/marketing/email_marketing/group-by-dropdown.png b/content-rst/applications/marketing/email_marketing/group-by-dropdown.png new file mode 100644 index 000000000..8f36047d7 Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/group-by-dropdown.png differ diff --git a/content-rst/applications/marketing/email_marketing/kanban-view.png b/content-rst/applications/marketing/email_marketing/kanban-view.png new file mode 100644 index 000000000..3fc2d55af Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/kanban-view.png differ diff --git a/content/applications/marketing/email_marketing/lost_leads_email.rst b/content-rst/applications/marketing/email_marketing/lost_leads_email.rst similarity index 100% rename from content/applications/marketing/email_marketing/lost_leads_email.rst rename to content-rst/applications/marketing/email_marketing/lost_leads_email.rst diff --git a/content-rst/applications/marketing/email_marketing/lost_leads_email/ab-testing.png b/content-rst/applications/marketing/email_marketing/lost_leads_email/ab-testing.png new file mode 100644 index 000000000..f2e7b9527 Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/lost_leads_email/ab-testing.png differ diff --git a/content-rst/applications/marketing/email_marketing/lost_leads_email/active.png b/content-rst/applications/marketing/email_marketing/lost_leads_email/active.png new file mode 100644 index 000000000..11c70c877 Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/lost_leads_email/active.png differ diff --git a/content-rst/applications/marketing/email_marketing/lost_leads_email/created-on.png b/content-rst/applications/marketing/email_marketing/lost_leads_email/created-on.png new file mode 100644 index 000000000..4f61f0d7c Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/lost_leads_email/created-on.png differ diff --git a/content-rst/applications/marketing/email_marketing/lost_leads_email/example.png b/content-rst/applications/marketing/email_marketing/lost_leads_email/example.png new file mode 100644 index 000000000..24790b800 Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/lost_leads_email/example.png differ diff --git a/content-rst/applications/marketing/email_marketing/lost_leads_email/favorite-filter.png b/content-rst/applications/marketing/email_marketing/lost_leads_email/favorite-filter.png new file mode 100644 index 000000000..284cfa831 Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/lost_leads_email/favorite-filter.png differ diff --git a/content-rst/applications/marketing/email_marketing/lost_leads_email/match-all.png b/content-rst/applications/marketing/email_marketing/lost_leads_email/match-all.png new file mode 100644 index 000000000..96bc506ab Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/lost_leads_email/match-all.png differ diff --git a/content-rst/applications/marketing/email_marketing/lost_leads_email/out-of-stock.png b/content-rst/applications/marketing/email_marketing/lost_leads_email/out-of-stock.png new file mode 100644 index 000000000..2d9c69465 Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/lost_leads_email/out-of-stock.png differ diff --git a/content-rst/applications/marketing/email_marketing/lost_leads_email/reasons.png b/content-rst/applications/marketing/email_marketing/lost_leads_email/reasons.png new file mode 100644 index 000000000..d2742984a Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/lost_leads_email/reasons.png differ diff --git a/content-rst/applications/marketing/email_marketing/lost_leads_email/records.png b/content-rst/applications/marketing/email_marketing/lost_leads_email/records.png new file mode 100644 index 000000000..81bbe08b1 Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/lost_leads_email/records.png differ diff --git a/content-rst/applications/marketing/email_marketing/lost_leads_email/smart-buttons.png b/content-rst/applications/marketing/email_marketing/lost_leads_email/smart-buttons.png new file mode 100644 index 000000000..a69c25899 Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/lost_leads_email/smart-buttons.png differ diff --git a/content-rst/applications/marketing/email_marketing/lost_leads_email/stage-is-in.png b/content-rst/applications/marketing/email_marketing/lost_leads_email/stage-is-in.png new file mode 100644 index 000000000..79af5b808 Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/lost_leads_email/stage-is-in.png differ diff --git a/content-rst/applications/marketing/email_marketing/lost_leads_email/stages.png b/content-rst/applications/marketing/email_marketing/lost_leads_email/stages.png new file mode 100644 index 000000000..9f48af2fd Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/lost_leads_email/stages.png differ diff --git a/content-rst/applications/marketing/email_marketing/lost_leads_email/too-expensive.png b/content-rst/applications/marketing/email_marketing/lost_leads_email/too-expensive.png new file mode 100644 index 000000000..633fe1742 Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/lost_leads_email/too-expensive.png differ diff --git a/content-rst/applications/marketing/email_marketing/mail-body-templates.png b/content-rst/applications/marketing/email_marketing/mail-body-templates.png new file mode 100644 index 000000000..18bb561d3 Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/mail-body-templates.png differ diff --git a/content-rst/applications/marketing/email_marketing/mailing-campaign-popup.png b/content-rst/applications/marketing/email_marketing/mailing-campaign-popup.png new file mode 100644 index 000000000..87d9b06a4 Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/mailing-campaign-popup.png differ diff --git a/content-rst/applications/marketing/email_marketing/mailing-campaign-settings.png b/content-rst/applications/marketing/email_marketing/mailing-campaign-settings.png new file mode 100644 index 000000000..f01b26d55 Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/mailing-campaign-settings.png differ diff --git a/content/applications/marketing/email_marketing/mailing_lists.rst b/content-rst/applications/marketing/email_marketing/mailing_lists.rst similarity index 100% rename from content/applications/marketing/email_marketing/mailing_lists.rst rename to content-rst/applications/marketing/email_marketing/mailing_lists.rst diff --git a/content-rst/applications/marketing/email_marketing/mailing_lists/contact-form-mailing-list-add.png b/content-rst/applications/marketing/email_marketing/mailing_lists/contact-form-mailing-list-add.png new file mode 100644 index 000000000..dce9aa8b8 Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/mailing_lists/contact-form-mailing-list-add.png differ diff --git a/content-rst/applications/marketing/email_marketing/mailing_lists/import-contacts-button.png b/content-rst/applications/marketing/email_marketing/mailing_lists/import-contacts-button.png new file mode 100644 index 000000000..9ec0bd234 Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/mailing_lists/import-contacts-button.png differ diff --git a/content-rst/applications/marketing/email_marketing/mailing_lists/import-mailing-contacts-popup.png b/content-rst/applications/marketing/email_marketing/mailing_lists/import-mailing-contacts-popup.png new file mode 100644 index 000000000..2868d743b Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/mailing_lists/import-mailing-contacts-popup.png differ diff --git a/content-rst/applications/marketing/email_marketing/mailing_lists/mailing-list-page.png b/content-rst/applications/marketing/email_marketing/mailing_lists/mailing-list-page.png new file mode 100644 index 000000000..6e5c35fe0 Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/mailing_lists/mailing-list-page.png differ diff --git a/content-rst/applications/marketing/email_marketing/mailing_lists/new-mailing-list-form.png b/content-rst/applications/marketing/email_marketing/mailing_lists/new-mailing-list-form.png new file mode 100644 index 000000000..b81351d0a Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/mailing_lists/new-mailing-list-form.png differ diff --git a/content-rst/applications/marketing/email_marketing/mailing_lists/newsletter-block-sample.png b/content-rst/applications/marketing/email_marketing/mailing_lists/newsletter-block-sample.png new file mode 100644 index 000000000..4910357bf Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/mailing_lists/newsletter-block-sample.png differ diff --git a/content-rst/applications/marketing/email_marketing/mailing_lists/newsletter-block-search.png b/content-rst/applications/marketing/email_marketing/mailing_lists/newsletter-block-search.png new file mode 100644 index 000000000..88cf8d93a Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/mailing_lists/newsletter-block-search.png differ diff --git a/content-rst/applications/marketing/email_marketing/mailing_lists/newsletter-dropdown-customize-sidebar.png b/content-rst/applications/marketing/email_marketing/mailing_lists/newsletter-dropdown-customize-sidebar.png new file mode 100644 index 000000000..c656b709b Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/mailing_lists/newsletter-dropdown-customize-sidebar.png differ diff --git a/content-rst/applications/marketing/email_marketing/mailing_lists/newsletter-popup-sample.png b/content-rst/applications/marketing/email_marketing/mailing_lists/newsletter-popup-sample.png new file mode 100644 index 000000000..053aa5248 Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/mailing_lists/newsletter-popup-sample.png differ diff --git a/content-rst/applications/marketing/email_marketing/mailing_lists/newsletter-sample.png b/content-rst/applications/marketing/email_marketing/mailing_lists/newsletter-sample.png new file mode 100644 index 000000000..04b17f951 Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/mailing_lists/newsletter-sample.png differ diff --git a/content-rst/applications/marketing/email_marketing/mailings-dashboard.png b/content-rst/applications/marketing/email_marketing/mailings-dashboard.png new file mode 100644 index 000000000..e1dbacdc2 Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/mailings-dashboard.png differ diff --git a/content-rst/applications/marketing/email_marketing/recipients-dropdown.png b/content-rst/applications/marketing/email_marketing/recipients-dropdown.png new file mode 100644 index 000000000..3208bc812 Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/recipients-dropdown.png differ diff --git a/content-rst/applications/marketing/email_marketing/schedule-popup-calendar.png b/content-rst/applications/marketing/email_marketing/schedule-popup-calendar.png new file mode 100644 index 000000000..7b531ca16 Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/schedule-popup-calendar.png differ diff --git a/content-rst/applications/marketing/email_marketing/schedule-popup.png b/content-rst/applications/marketing/email_marketing/schedule-popup.png new file mode 100644 index 000000000..82598cd2b Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/schedule-popup.png differ diff --git a/content-rst/applications/marketing/email_marketing/search-mega-menu.png b/content-rst/applications/marketing/email_marketing/search-mega-menu.png new file mode 100644 index 000000000..888fdfc86 Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/search-mega-menu.png differ diff --git a/content-rst/applications/marketing/email_marketing/send-popup.png b/content-rst/applications/marketing/email_marketing/send-popup.png new file mode 100644 index 000000000..6a9ee0152 Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/send-popup.png differ diff --git a/content-rst/applications/marketing/email_marketing/settings-tab-with-campaign.png b/content-rst/applications/marketing/email_marketing/settings-tab-with-campaign.png new file mode 100644 index 000000000..ee0c26bea Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/settings-tab-with-campaign.png differ diff --git a/content-rst/applications/marketing/email_marketing/settings-without-features.png b/content-rst/applications/marketing/email_marketing/settings-without-features.png new file mode 100644 index 000000000..9150a5e3a Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/settings-without-features.png differ diff --git a/content-rst/applications/marketing/email_marketing/settings.png b/content-rst/applications/marketing/email_marketing/settings.png new file mode 100644 index 000000000..84c7c7e41 Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/settings.png differ diff --git a/content-rst/applications/marketing/email_marketing/template-blank-slash.png b/content-rst/applications/marketing/email_marketing/template-blank-slash.png new file mode 100644 index 000000000..aef4ac672 Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/template-blank-slash.png differ diff --git a/content-rst/applications/marketing/email_marketing/template-building-blocks.png b/content-rst/applications/marketing/email_marketing/template-building-blocks.png new file mode 100644 index 000000000..fc5e58ade Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/template-building-blocks.png differ diff --git a/content-rst/applications/marketing/email_marketing/test-popup.png b/content-rst/applications/marketing/email_marketing/test-popup.png new file mode 100644 index 000000000..3be21a663 Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/test-popup.png differ diff --git a/content-rst/applications/marketing/email_marketing/three-dot-dropdown.png b/content-rst/applications/marketing/email_marketing/three-dot-dropdown.png new file mode 100644 index 000000000..41543ee9e Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/three-dot-dropdown.png differ diff --git a/content/applications/marketing/email_marketing/unsubscriptions.rst b/content-rst/applications/marketing/email_marketing/unsubscriptions.rst similarity index 100% rename from content/applications/marketing/email_marketing/unsubscriptions.rst rename to content-rst/applications/marketing/email_marketing/unsubscriptions.rst diff --git a/content-rst/applications/marketing/email_marketing/unsubscriptions/blacklist-feature.png b/content-rst/applications/marketing/email_marketing/unsubscriptions/blacklist-feature.png new file mode 100644 index 000000000..63005d79a Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/unsubscriptions/blacklist-feature.png differ diff --git a/content-rst/applications/marketing/email_marketing/unsubscriptions/blacklisted-contact-form.png b/content-rst/applications/marketing/email_marketing/unsubscriptions/blacklisted-contact-form.png new file mode 100644 index 000000000..825decc6b Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/unsubscriptions/blacklisted-contact-form.png differ diff --git a/content-rst/applications/marketing/email_marketing/unsubscriptions/blacklisted-email-addresses.png b/content-rst/applications/marketing/email_marketing/unsubscriptions/blacklisted-email-addresses.png new file mode 100644 index 000000000..50500c13b Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/unsubscriptions/blacklisted-email-addresses.png differ diff --git a/content-rst/applications/marketing/email_marketing/unsubscriptions/mailing-subscriptions-blocklist-question.png b/content-rst/applications/marketing/email_marketing/unsubscriptions/mailing-subscriptions-blocklist-question.png new file mode 100644 index 000000000..67235fc8b Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/unsubscriptions/mailing-subscriptions-blocklist-question.png differ diff --git a/content-rst/applications/marketing/email_marketing/unsubscriptions/mailing-subscriptions-page.png b/content-rst/applications/marketing/email_marketing/unsubscriptions/mailing-subscriptions-page.png new file mode 100644 index 000000000..6d27dfac1 Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/unsubscriptions/mailing-subscriptions-page.png differ diff --git a/content-rst/applications/marketing/email_marketing/unsubscriptions/unblacklist-popup.png b/content-rst/applications/marketing/email_marketing/unsubscriptions/unblacklist-popup.png new file mode 100644 index 000000000..2b00b5a93 Binary files /dev/null and b/content-rst/applications/marketing/email_marketing/unsubscriptions/unblacklist-popup.png differ diff --git a/content/applications/marketing/events.rst b/content-rst/applications/marketing/events.rst similarity index 100% rename from content/applications/marketing/events.rst rename to content-rst/applications/marketing/events.rst diff --git a/content-rst/applications/marketing/events/blank-kanban-card.png b/content-rst/applications/marketing/events/blank-kanban-card.png new file mode 100644 index 000000000..4386f0d9f Binary files /dev/null and b/content-rst/applications/marketing/events/blank-kanban-card.png differ diff --git a/content/applications/marketing/events/create_events.rst b/content-rst/applications/marketing/events/create_events.rst similarity index 100% rename from content/applications/marketing/events/create_events.rst rename to content-rst/applications/marketing/events/create_events.rst diff --git a/content-rst/applications/marketing/events/create_events/blank-event-template.png b/content-rst/applications/marketing/events/create_events/blank-event-template.png new file mode 100644 index 000000000..679550b79 Binary files /dev/null and b/content-rst/applications/marketing/events/create_events/blank-event-template.png differ diff --git a/content-rst/applications/marketing/events/create_events/communication-tab.png b/content-rst/applications/marketing/events/create_events/communication-tab.png new file mode 100644 index 000000000..392ce11fc Binary files /dev/null and b/content-rst/applications/marketing/events/create_events/communication-tab.png differ diff --git a/content-rst/applications/marketing/events/create_events/create-question-popup.png b/content-rst/applications/marketing/events/create_events/create-question-popup.png new file mode 100644 index 000000000..eafff931b Binary files /dev/null and b/content-rst/applications/marketing/events/create_events/create-question-popup.png differ diff --git a/content-rst/applications/marketing/events/create_events/notes-tab.png b/content-rst/applications/marketing/events/create_events/notes-tab.png new file mode 100644 index 000000000..2d2ffc185 Binary files /dev/null and b/content-rst/applications/marketing/events/create_events/notes-tab.png differ diff --git a/content-rst/applications/marketing/events/create_events/questions-tab.png b/content-rst/applications/marketing/events/create_events/questions-tab.png new file mode 100644 index 000000000..010b4c66f Binary files /dev/null and b/content-rst/applications/marketing/events/create_events/questions-tab.png differ diff --git a/content-rst/applications/marketing/events/create_events/tickets-tab.png b/content-rst/applications/marketing/events/create_events/tickets-tab.png new file mode 100644 index 000000000..7581b5b9a Binary files /dev/null and b/content-rst/applications/marketing/events/create_events/tickets-tab.png differ diff --git a/content-rst/applications/marketing/events/create_events/twitter-wall-popup.png b/content-rst/applications/marketing/events/create_events/twitter-wall-popup.png new file mode 100644 index 000000000..cd0f00329 Binary files /dev/null and b/content-rst/applications/marketing/events/create_events/twitter-wall-popup.png differ diff --git a/content/applications/marketing/events/event_booths.rst b/content-rst/applications/marketing/events/event_booths.rst similarity index 100% rename from content/applications/marketing/events/event_booths.rst rename to content-rst/applications/marketing/events/event_booths.rst diff --git a/content-rst/applications/marketing/events/event_booths/booth-category-form.png b/content-rst/applications/marketing/events/event_booths/booth-category-form.png new file mode 100644 index 000000000..ea601b408 Binary files /dev/null and b/content-rst/applications/marketing/events/event_booths/booth-category-form.png differ diff --git a/content-rst/applications/marketing/events/event_booths/booth-category-page.png b/content-rst/applications/marketing/events/event_booths/booth-category-page.png new file mode 100644 index 000000000..a0ab75847 Binary files /dev/null and b/content-rst/applications/marketing/events/event_booths/booth-category-page.png differ diff --git a/content-rst/applications/marketing/events/event_booths/booth-form.png b/content-rst/applications/marketing/events/event_booths/booth-form.png new file mode 100644 index 000000000..28f654b69 Binary files /dev/null and b/content-rst/applications/marketing/events/event_booths/booth-form.png differ diff --git a/content-rst/applications/marketing/events/event_booths/booth-management-setting.png b/content-rst/applications/marketing/events/event_booths/booth-management-setting.png new file mode 100644 index 000000000..f1f3366ce Binary files /dev/null and b/content-rst/applications/marketing/events/event_booths/booth-management-setting.png differ diff --git a/content-rst/applications/marketing/events/event_booths/create-sponsor-level-popup.png b/content-rst/applications/marketing/events/event_booths/create-sponsor-level-popup.png new file mode 100644 index 000000000..7b8a2585f Binary files /dev/null and b/content-rst/applications/marketing/events/event_booths/create-sponsor-level-popup.png differ diff --git a/content-rst/applications/marketing/events/event_booths/get-a-booth-page.png b/content-rst/applications/marketing/events/event_booths/get-a-booth-page.png new file mode 100644 index 000000000..3af8c5b00 Binary files /dev/null and b/content-rst/applications/marketing/events/event_booths/get-a-booth-page.png differ diff --git a/content/applications/marketing/events/event_templates.rst b/content-rst/applications/marketing/events/event_templates.rst similarity index 100% rename from content/applications/marketing/events/event_templates.rst rename to content-rst/applications/marketing/events/event_templates.rst diff --git a/content-rst/applications/marketing/events/event_templates/create-booth-category-popup.png b/content-rst/applications/marketing/events/event_templates/create-booth-category-popup.png new file mode 100644 index 000000000..0fadf31b4 Binary files /dev/null and b/content-rst/applications/marketing/events/event_templates/create-booth-category-popup.png differ diff --git a/content-rst/applications/marketing/events/event_templates/create-booths-popup.png b/content-rst/applications/marketing/events/event_templates/create-booths-popup.png new file mode 100644 index 000000000..ee8e35732 Binary files /dev/null and b/content-rst/applications/marketing/events/event_templates/create-booths-popup.png differ diff --git a/content-rst/applications/marketing/events/event_templates/event-template-form.png b/content-rst/applications/marketing/events/event_templates/event-template-form.png new file mode 100644 index 000000000..121d98b15 Binary files /dev/null and b/content-rst/applications/marketing/events/event_templates/event-template-form.png differ diff --git a/content-rst/applications/marketing/events/event_templates/event-templates-page.png b/content-rst/applications/marketing/events/event_templates/event-templates-page.png new file mode 100644 index 000000000..ea1439b1f Binary files /dev/null and b/content-rst/applications/marketing/events/event_templates/event-templates-page.png differ diff --git a/content/applications/marketing/events/event_tracks.rst b/content-rst/applications/marketing/events/event_tracks.rst similarity index 100% rename from content/applications/marketing/events/event_tracks.rst rename to content-rst/applications/marketing/events/event_tracks.rst diff --git a/content-rst/applications/marketing/events/event_tracks/add-quiz.png b/content-rst/applications/marketing/events/event_tracks/add-quiz.png new file mode 100644 index 000000000..ed66b4b9c Binary files /dev/null and b/content-rst/applications/marketing/events/event_tracks/add-quiz.png differ diff --git a/content-rst/applications/marketing/events/event_tracks/create-questions.png b/content-rst/applications/marketing/events/event_tracks/create-questions.png new file mode 100644 index 000000000..b8bff006c Binary files /dev/null and b/content-rst/applications/marketing/events/event_tracks/create-questions.png differ diff --git a/content-rst/applications/marketing/events/event_tracks/event-track-form.png b/content-rst/applications/marketing/events/event_tracks/event-track-form.png new file mode 100644 index 000000000..9853679a3 Binary files /dev/null and b/content-rst/applications/marketing/events/event_tracks/event-track-form.png differ diff --git a/content-rst/applications/marketing/events/event_tracks/event-tracks-page.png b/content-rst/applications/marketing/events/event_tracks/event-tracks-page.png new file mode 100644 index 000000000..f910ba94c Binary files /dev/null and b/content-rst/applications/marketing/events/event_tracks/event-tracks-page.png differ diff --git a/content-rst/applications/marketing/events/event_tracks/interactivity-tab.png b/content-rst/applications/marketing/events/event_tracks/interactivity-tab.png new file mode 100644 index 000000000..da8d5010f Binary files /dev/null and b/content-rst/applications/marketing/events/event_tracks/interactivity-tab.png differ diff --git a/content-rst/applications/marketing/events/event_tracks/published-toggle.png b/content-rst/applications/marketing/events/event_tracks/published-toggle.png new file mode 100644 index 000000000..4e637cfa6 Binary files /dev/null and b/content-rst/applications/marketing/events/event_tracks/published-toggle.png differ diff --git a/content-rst/applications/marketing/events/event_tracks/speaker-tab.png b/content-rst/applications/marketing/events/event_tracks/speaker-tab.png new file mode 100644 index 000000000..ce2b970a3 Binary files /dev/null and b/content-rst/applications/marketing/events/event_tracks/speaker-tab.png differ diff --git a/content-rst/applications/marketing/events/event_tracks/track-settings.png b/content-rst/applications/marketing/events/event_tracks/track-settings.png new file mode 100644 index 000000000..07bfa2e00 Binary files /dev/null and b/content-rst/applications/marketing/events/event_tracks/track-settings.png differ diff --git a/content-rst/applications/marketing/events/kanban-dashboard.png b/content-rst/applications/marketing/events/kanban-dashboard.png new file mode 100644 index 000000000..1c0ff81a6 Binary files /dev/null and b/content-rst/applications/marketing/events/kanban-dashboard.png differ diff --git a/content/applications/marketing/events/registration_desk.rst b/content-rst/applications/marketing/events/registration_desk.rst similarity index 100% rename from content/applications/marketing/events/registration_desk.rst rename to content-rst/applications/marketing/events/registration_desk.rst diff --git a/content-rst/applications/marketing/events/registration_desk/attendees-page.png b/content-rst/applications/marketing/events/registration_desk/attendees-page.png new file mode 100644 index 000000000..79eb05927 Binary files /dev/null and b/content-rst/applications/marketing/events/registration_desk/attendees-page.png differ diff --git a/content-rst/applications/marketing/events/registration_desk/barcode-scanner-window.png b/content-rst/applications/marketing/events/registration_desk/barcode-scanner-window.png new file mode 100644 index 000000000..f3ca6912d Binary files /dev/null and b/content-rst/applications/marketing/events/registration_desk/barcode-scanner-window.png differ diff --git a/content-rst/applications/marketing/events/registration_desk/registration-desk-page.png b/content-rst/applications/marketing/events/registration_desk/registration-desk-page.png new file mode 100644 index 000000000..9e81e2fc4 Binary files /dev/null and b/content-rst/applications/marketing/events/registration_desk/registration-desk-page.png differ diff --git a/content/applications/marketing/events/revenues_report.rst b/content-rst/applications/marketing/events/revenues_report.rst similarity index 100% rename from content/applications/marketing/events/revenues_report.rst rename to content-rst/applications/marketing/events/revenues_report.rst diff --git a/content-rst/applications/marketing/events/revenues_report/default-view.png b/content-rst/applications/marketing/events/revenues_report/default-view.png new file mode 100644 index 000000000..39cdacd78 Binary files /dev/null and b/content-rst/applications/marketing/events/revenues_report/default-view.png differ diff --git a/content-rst/applications/marketing/events/revenues_report/event-ticket-analysis.png b/content-rst/applications/marketing/events/revenues_report/event-ticket-analysis.png new file mode 100644 index 000000000..48513277f Binary files /dev/null and b/content-rst/applications/marketing/events/revenues_report/event-ticket-analysis.png differ diff --git a/content-rst/applications/marketing/events/revenues_report/event-type-analysis.png b/content-rst/applications/marketing/events/revenues_report/event-type-analysis.png new file mode 100644 index 000000000..7ac5407f2 Binary files /dev/null and b/content-rst/applications/marketing/events/revenues_report/event-type-analysis.png differ diff --git a/content/applications/marketing/events/sell_tickets.rst b/content-rst/applications/marketing/events/sell_tickets.rst similarity index 100% rename from content/applications/marketing/events/sell_tickets.rst rename to content-rst/applications/marketing/events/sell_tickets.rst diff --git a/content-rst/applications/marketing/events/sell_tickets/attendees-popup.png b/content-rst/applications/marketing/events/sell_tickets/attendees-popup.png new file mode 100644 index 000000000..429babe72 Binary files /dev/null and b/content-rst/applications/marketing/events/sell_tickets/attendees-popup.png differ diff --git a/content-rst/applications/marketing/events/sell_tickets/configure-event-popup.png b/content-rst/applications/marketing/events/sell_tickets/configure-event-popup.png new file mode 100644 index 000000000..fb15f906a Binary files /dev/null and b/content-rst/applications/marketing/events/sell_tickets/configure-event-popup.png differ diff --git a/content-rst/applications/marketing/events/sell_tickets/events-sales-smartbutton.png b/content-rst/applications/marketing/events/sell_tickets/events-sales-smartbutton.png new file mode 100644 index 000000000..c75e040f3 Binary files /dev/null and b/content-rst/applications/marketing/events/sell_tickets/events-sales-smartbutton.png differ diff --git a/content-rst/applications/marketing/events/sell_tickets/events-settings-tickets.png b/content-rst/applications/marketing/events/sell_tickets/events-settings-tickets.png new file mode 100644 index 000000000..98e9ab6d6 Binary files /dev/null and b/content-rst/applications/marketing/events/sell_tickets/events-settings-tickets.png differ diff --git a/content-rst/applications/marketing/events/sell_tickets/events-tickets-registration-product.png b/content-rst/applications/marketing/events/sell_tickets/events-tickets-registration-product.png new file mode 100644 index 000000000..262d3f540 Binary files /dev/null and b/content-rst/applications/marketing/events/sell_tickets/events-tickets-registration-product.png differ diff --git a/content-rst/applications/marketing/events/sell_tickets/tickets-popup.png b/content-rst/applications/marketing/events/sell_tickets/tickets-popup.png new file mode 100644 index 000000000..b927e487e Binary files /dev/null and b/content-rst/applications/marketing/events/sell_tickets/tickets-popup.png differ diff --git a/content-rst/applications/marketing/events/settings-attendance-section.png b/content-rst/applications/marketing/events/settings-attendance-section.png new file mode 100644 index 000000000..2ca93886a Binary files /dev/null and b/content-rst/applications/marketing/events/settings-attendance-section.png differ diff --git a/content-rst/applications/marketing/events/settings-events-section.png b/content-rst/applications/marketing/events/settings-events-section.png new file mode 100644 index 000000000..4a3b5807c Binary files /dev/null and b/content-rst/applications/marketing/events/settings-events-section.png differ diff --git a/content-rst/applications/marketing/events/settings-registration-section.png b/content-rst/applications/marketing/events/settings-registration-section.png new file mode 100644 index 000000000..a29cafb5c Binary files /dev/null and b/content-rst/applications/marketing/events/settings-registration-section.png differ diff --git a/content/applications/marketing/events/track_manage_talks.rst b/content-rst/applications/marketing/events/track_manage_talks.rst similarity index 100% rename from content/applications/marketing/events/track_manage_talks.rst rename to content-rst/applications/marketing/events/track_manage_talks.rst diff --git a/content-rst/applications/marketing/events/track_manage_talks/create-tags-popup.png b/content-rst/applications/marketing/events/track_manage_talks/create-tags-popup.png new file mode 100644 index 000000000..641c649aa Binary files /dev/null and b/content-rst/applications/marketing/events/track_manage_talks/create-tags-popup.png differ diff --git a/content-rst/applications/marketing/events/track_manage_talks/event-agenda-page.png b/content-rst/applications/marketing/events/track_manage_talks/event-agenda-page.png new file mode 100644 index 000000000..35d2d7274 Binary files /dev/null and b/content-rst/applications/marketing/events/track_manage_talks/event-agenda-page.png differ diff --git a/content-rst/applications/marketing/events/track_manage_talks/talk-proposals-page.png b/content-rst/applications/marketing/events/track_manage_talks/talk-proposals-page.png new file mode 100644 index 000000000..0161fca40 Binary files /dev/null and b/content-rst/applications/marketing/events/track_manage_talks/talk-proposals-page.png differ diff --git a/content-rst/applications/marketing/events/track_manage_talks/talks-page.png b/content-rst/applications/marketing/events/track_manage_talks/talks-page.png new file mode 100644 index 000000000..f98ced899 Binary files /dev/null and b/content-rst/applications/marketing/events/track_manage_talks/talks-page.png differ diff --git a/content-rst/applications/marketing/events/track_manage_talks/track-submenu-options.png b/content-rst/applications/marketing/events/track_manage_talks/track-submenu-options.png new file mode 100644 index 000000000..e64805246 Binary files /dev/null and b/content-rst/applications/marketing/events/track_manage_talks/track-submenu-options.png differ diff --git a/content/applications/marketing/marketing_automation.rst b/content-rst/applications/marketing/marketing_automation.rst similarity index 100% rename from content/applications/marketing/marketing_automation.rst rename to content-rst/applications/marketing/marketing_automation.rst diff --git a/content/applications/marketing/marketing_automation/campaign_templates.rst b/content-rst/applications/marketing/marketing_automation/campaign_templates.rst similarity index 100% rename from content/applications/marketing/marketing_automation/campaign_templates.rst rename to content-rst/applications/marketing/marketing_automation/campaign_templates.rst diff --git a/content/applications/marketing/marketing_automation/campaign_templates/double_optin.rst b/content-rst/applications/marketing/marketing_automation/campaign_templates/double_optin.rst similarity index 100% rename from content/applications/marketing/marketing_automation/campaign_templates/double_optin.rst rename to content-rst/applications/marketing/marketing_automation/campaign_templates/double_optin.rst diff --git a/content-rst/applications/marketing/marketing_automation/campaign_templates/double_optin/double-optin-metrics.png b/content-rst/applications/marketing/marketing_automation/campaign_templates/double_optin/double-optin-metrics.png new file mode 100644 index 000000000..adb851583 Binary files /dev/null and b/content-rst/applications/marketing/marketing_automation/campaign_templates/double_optin/double-optin-metrics.png differ diff --git a/content-rst/applications/marketing/marketing_automation/campaign_templates/double_optin/newsletter-signup.png b/content-rst/applications/marketing/marketing_automation/campaign_templates/double_optin/newsletter-signup.png new file mode 100644 index 000000000..1e85f3e2a Binary files /dev/null and b/content-rst/applications/marketing/marketing_automation/campaign_templates/double_optin/newsletter-signup.png differ diff --git a/content-rst/applications/marketing/marketing_automation/campaigns-dashboard.png b/content-rst/applications/marketing/marketing_automation/campaigns-dashboard.png new file mode 100644 index 000000000..3a9bf04c1 Binary files /dev/null and b/content-rst/applications/marketing/marketing_automation/campaigns-dashboard.png differ diff --git a/content/applications/marketing/marketing_automation/target_audience.rst b/content-rst/applications/marketing/marketing_automation/target_audience.rst similarity index 100% rename from content/applications/marketing/marketing_automation/target_audience.rst rename to content-rst/applications/marketing/marketing_automation/target_audience.rst diff --git a/content-rst/applications/marketing/marketing_automation/target_audience/domain-filters.png b/content-rst/applications/marketing/marketing_automation/target_audience/domain-filters.png new file mode 100644 index 000000000..8d3d94cf4 Binary files /dev/null and b/content-rst/applications/marketing/marketing_automation/target_audience/domain-filters.png differ diff --git a/content-rst/applications/marketing/marketing_automation/target_audience/filter-scenario-one.png b/content-rst/applications/marketing/marketing_automation/target_audience/filter-scenario-one.png new file mode 100644 index 000000000..244223e9d Binary files /dev/null and b/content-rst/applications/marketing/marketing_automation/target_audience/filter-scenario-one.png differ diff --git a/content/applications/marketing/marketing_automation/testing_running.rst b/content-rst/applications/marketing/marketing_automation/testing_running.rst similarity index 100% rename from content/applications/marketing/marketing_automation/testing_running.rst rename to content-rst/applications/marketing/marketing_automation/testing_running.rst diff --git a/content-rst/applications/marketing/marketing_automation/testing_running/blank-contact-form.png b/content-rst/applications/marketing/marketing_automation/testing_running/blank-contact-form.png new file mode 100644 index 000000000..59838e67f Binary files /dev/null and b/content-rst/applications/marketing/marketing_automation/testing_running/blank-contact-form.png differ diff --git a/content-rst/applications/marketing/marketing_automation/testing_running/campaign-running-status.png b/content-rst/applications/marketing/marketing_automation/testing_running/campaign-running-status.png new file mode 100644 index 000000000..34036ab7c Binary files /dev/null and b/content-rst/applications/marketing/marketing_automation/testing_running/campaign-running-status.png differ diff --git a/content-rst/applications/marketing/marketing_automation/testing_running/campaign-smart-buttons.png b/content-rst/applications/marketing/marketing_automation/testing_running/campaign-smart-buttons.png new file mode 100644 index 000000000..9becb4b57 Binary files /dev/null and b/content-rst/applications/marketing/marketing_automation/testing_running/campaign-smart-buttons.png differ diff --git a/content-rst/applications/marketing/marketing_automation/testing_running/campaign-stopped-status-bar.png b/content-rst/applications/marketing/marketing_automation/testing_running/campaign-stopped-status-bar.png new file mode 100644 index 000000000..293424c16 Binary files /dev/null and b/content-rst/applications/marketing/marketing_automation/testing_running/campaign-stopped-status-bar.png differ diff --git a/content-rst/applications/marketing/marketing_automation/testing_running/launch-test-popup-window.png b/content-rst/applications/marketing/marketing_automation/testing_running/launch-test-popup-window.png new file mode 100644 index 000000000..279c46563 Binary files /dev/null and b/content-rst/applications/marketing/marketing_automation/testing_running/launch-test-popup-window.png differ diff --git a/content-rst/applications/marketing/marketing_automation/testing_running/launch-test.png b/content-rst/applications/marketing/marketing_automation/testing_running/launch-test.png new file mode 100644 index 000000000..397c93b07 Binary files /dev/null and b/content-rst/applications/marketing/marketing_automation/testing_running/launch-test.png differ diff --git a/content-rst/applications/marketing/marketing_automation/testing_running/new-contact-from-launch-test-popup.png b/content-rst/applications/marketing/marketing_automation/testing_running/new-contact-from-launch-test-popup.png new file mode 100644 index 000000000..59d222276 Binary files /dev/null and b/content-rst/applications/marketing/marketing_automation/testing_running/new-contact-from-launch-test-popup.png differ diff --git a/content-rst/applications/marketing/marketing_automation/testing_running/stop-button-campaign-form.png b/content-rst/applications/marketing/marketing_automation/testing_running/stop-button-campaign-form.png new file mode 100644 index 000000000..996be2777 Binary files /dev/null and b/content-rst/applications/marketing/marketing_automation/testing_running/stop-button-campaign-form.png differ diff --git a/content-rst/applications/marketing/marketing_automation/testing_running/test-screen.png b/content-rst/applications/marketing/marketing_automation/testing_running/test-screen.png new file mode 100644 index 000000000..e3e6780a9 Binary files /dev/null and b/content-rst/applications/marketing/marketing_automation/testing_running/test-screen.png differ diff --git a/content-rst/applications/marketing/marketing_automation/testing_running/workflow-modification-warning.png b/content-rst/applications/marketing/marketing_automation/testing_running/workflow-modification-warning.png new file mode 100644 index 000000000..7a38dabe8 Binary files /dev/null and b/content-rst/applications/marketing/marketing_automation/testing_running/workflow-modification-warning.png differ diff --git a/content-rst/applications/marketing/marketing_automation/testing_running/workflow-test-progress.png b/content-rst/applications/marketing/marketing_automation/testing_running/workflow-test-progress.png new file mode 100644 index 000000000..3e232a1d5 Binary files /dev/null and b/content-rst/applications/marketing/marketing_automation/testing_running/workflow-test-progress.png differ diff --git a/content/applications/marketing/marketing_automation/understanding_metrics.rst b/content-rst/applications/marketing/marketing_automation/understanding_metrics.rst similarity index 100% rename from content/applications/marketing/marketing_automation/understanding_metrics.rst rename to content-rst/applications/marketing/marketing_automation/understanding_metrics.rst diff --git a/content-rst/applications/marketing/marketing_automation/understanding_metrics/activity-analytics-block-sample.png b/content-rst/applications/marketing/marketing_automation/understanding_metrics/activity-analytics-block-sample.png new file mode 100644 index 000000000..e78785336 Binary files /dev/null and b/content-rst/applications/marketing/marketing_automation/understanding_metrics/activity-analytics-block-sample.png differ diff --git a/content-rst/applications/marketing/marketing_automation/understanding_metrics/activity-filter-tab.png b/content-rst/applications/marketing/marketing_automation/understanding_metrics/activity-filter-tab.png new file mode 100644 index 000000000..a761c872c Binary files /dev/null and b/content-rst/applications/marketing/marketing_automation/understanding_metrics/activity-filter-tab.png differ diff --git a/content-rst/applications/marketing/marketing_automation/understanding_metrics/campaign-link-tracker.png b/content-rst/applications/marketing/marketing_automation/understanding_metrics/campaign-link-tracker.png new file mode 100644 index 000000000..5a0fb1288 Binary files /dev/null and b/content-rst/applications/marketing/marketing_automation/understanding_metrics/campaign-link-tracker.png differ diff --git a/content-rst/applications/marketing/marketing_automation/understanding_metrics/graph-breakdown-data.png b/content-rst/applications/marketing/marketing_automation/understanding_metrics/graph-breakdown-data.png new file mode 100644 index 000000000..8971662e5 Binary files /dev/null and b/content-rst/applications/marketing/marketing_automation/understanding_metrics/graph-breakdown-data.png differ diff --git a/content-rst/applications/marketing/marketing_automation/understanding_metrics/participants-page-marketing-automation.png b/content-rst/applications/marketing/marketing_automation/understanding_metrics/participants-page-marketing-automation.png new file mode 100644 index 000000000..96ed306fa Binary files /dev/null and b/content-rst/applications/marketing/marketing_automation/understanding_metrics/participants-page-marketing-automation.png differ diff --git a/content-rst/applications/marketing/marketing_automation/understanding_metrics/replied-after-activity-time-trigger.png b/content-rst/applications/marketing/marketing_automation/understanding_metrics/replied-after-activity-time-trigger.png new file mode 100644 index 000000000..25539a9ae Binary files /dev/null and b/content-rst/applications/marketing/marketing_automation/understanding_metrics/replied-after-activity-time-trigger.png differ diff --git a/content-rst/applications/marketing/marketing_automation/understanding_metrics/traces-page-marketing-automation.png b/content-rst/applications/marketing/marketing_automation/understanding_metrics/traces-page-marketing-automation.png new file mode 100644 index 000000000..9f0fce9ad Binary files /dev/null and b/content-rst/applications/marketing/marketing_automation/understanding_metrics/traces-page-marketing-automation.png differ diff --git a/content/applications/marketing/marketing_automation/workflow_activities.rst b/content-rst/applications/marketing/marketing_automation/workflow_activities.rst similarity index 100% rename from content/applications/marketing/marketing_automation/workflow_activities.rst rename to content-rst/applications/marketing/marketing_automation/workflow_activities.rst diff --git a/content-rst/applications/marketing/marketing_automation/workflow_activities/create-activities.png b/content-rst/applications/marketing/marketing_automation/workflow_activities/create-activities.png new file mode 100644 index 000000000..b1a9586e7 Binary files /dev/null and b/content-rst/applications/marketing/marketing_automation/workflow_activities/create-activities.png differ diff --git a/content-rst/applications/marketing/marketing_automation/workflow_activities/create-sa.png b/content-rst/applications/marketing/marketing_automation/workflow_activities/create-sa.png new file mode 100644 index 000000000..ff092db70 Binary files /dev/null and b/content-rst/applications/marketing/marketing_automation/workflow_activities/create-sa.png differ diff --git a/content-rst/applications/marketing/marketing_automation/workflow_activities/email-activity-type.png b/content-rst/applications/marketing/marketing_automation/workflow_activities/email-activity-type.png new file mode 100644 index 000000000..2639c82a9 Binary files /dev/null and b/content-rst/applications/marketing/marketing_automation/workflow_activities/email-activity-type.png differ diff --git a/content-rst/applications/marketing/marketing_automation/workflow_activities/email-trigger-types.png b/content-rst/applications/marketing/marketing_automation/workflow_activities/email-trigger-types.png new file mode 100644 index 000000000..1082ba266 Binary files /dev/null and b/content-rst/applications/marketing/marketing_automation/workflow_activities/email-trigger-types.png differ diff --git a/content-rst/applications/marketing/marketing_automation/workflow_activities/sa-activity-type.png b/content-rst/applications/marketing/marketing_automation/workflow_activities/sa-activity-type.png new file mode 100644 index 000000000..3eda489e8 Binary files /dev/null and b/content-rst/applications/marketing/marketing_automation/workflow_activities/sa-activity-type.png differ diff --git a/content-rst/applications/marketing/marketing_automation/workflow_activities/sa-trigger-types.png b/content-rst/applications/marketing/marketing_automation/workflow_activities/sa-trigger-types.png new file mode 100644 index 000000000..3b4a37c31 Binary files /dev/null and b/content-rst/applications/marketing/marketing_automation/workflow_activities/sa-trigger-types.png differ diff --git a/content-rst/applications/marketing/marketing_automation/workflow_activities/sms-activity-type.png b/content-rst/applications/marketing/marketing_automation/workflow_activities/sms-activity-type.png new file mode 100644 index 000000000..5c258c4fb Binary files /dev/null and b/content-rst/applications/marketing/marketing_automation/workflow_activities/sms-activity-type.png differ diff --git a/content-rst/applications/marketing/marketing_automation/workflow_activities/sms-trigger-types.png b/content-rst/applications/marketing/marketing_automation/workflow_activities/sms-trigger-types.png new file mode 100644 index 000000000..60678f420 Binary files /dev/null and b/content-rst/applications/marketing/marketing_automation/workflow_activities/sms-trigger-types.png differ diff --git a/content-rst/applications/marketing/marketing_automation/workflow_activities/trigger.png b/content-rst/applications/marketing/marketing_automation/workflow_activities/trigger.png new file mode 100644 index 000000000..314c72505 Binary files /dev/null and b/content-rst/applications/marketing/marketing_automation/workflow_activities/trigger.png differ diff --git a/content-rst/applications/marketing/marketing_automation/workflow_activities/workflow-activities.png b/content-rst/applications/marketing/marketing_automation/workflow_activities/workflow-activities.png new file mode 100644 index 000000000..ac3984cbe Binary files /dev/null and b/content-rst/applications/marketing/marketing_automation/workflow_activities/workflow-activities.png differ diff --git a/content/applications/marketing/sms_marketing.rst b/content-rst/applications/marketing/sms_marketing.rst similarity index 100% rename from content/applications/marketing/sms_marketing.rst rename to content-rst/applications/marketing/sms_marketing.rst diff --git a/content/applications/marketing/sms_marketing/create_sms.rst b/content-rst/applications/marketing/sms_marketing/create_sms.rst similarity index 100% rename from content/applications/marketing/sms_marketing/create_sms.rst rename to content-rst/applications/marketing/sms_marketing/create_sms.rst diff --git a/content-rst/applications/marketing/sms_marketing/create_sms/contact-recipient.png b/content-rst/applications/marketing/sms_marketing/create_sms/contact-recipient.png new file mode 100644 index 000000000..046928a10 Binary files /dev/null and b/content-rst/applications/marketing/sms_marketing/create_sms/contact-recipient.png differ diff --git a/content-rst/applications/marketing/sms_marketing/create_sms/sms-create.png b/content-rst/applications/marketing/sms_marketing/create_sms/sms-create.png new file mode 100644 index 000000000..cbdccc021 Binary files /dev/null and b/content-rst/applications/marketing/sms_marketing/create_sms/sms-create.png differ diff --git a/content-rst/applications/marketing/sms_marketing/create_sms/sms-link-tracker.png b/content-rst/applications/marketing/sms_marketing/create_sms/sms-link-tracker.png new file mode 100644 index 000000000..ab0efbf35 Binary files /dev/null and b/content-rst/applications/marketing/sms_marketing/create_sms/sms-link-tracker.png differ diff --git a/content-rst/applications/marketing/sms_marketing/create_sms/sms-mailing-list.png b/content-rst/applications/marketing/sms_marketing/create_sms/sms-mailing-list.png new file mode 100644 index 000000000..8ace2197e Binary files /dev/null and b/content-rst/applications/marketing/sms_marketing/create_sms/sms-mailing-list.png differ diff --git a/content-rst/applications/marketing/sms_marketing/create_sms/sms-price-check.png b/content-rst/applications/marketing/sms_marketing/create_sms/sms-price-check.png new file mode 100644 index 000000000..77da76076 Binary files /dev/null and b/content-rst/applications/marketing/sms_marketing/create_sms/sms-price-check.png differ diff --git a/content-rst/applications/marketing/sms_marketing/create_sms/sms-settings-tab.png b/content-rst/applications/marketing/sms_marketing/create_sms/sms-settings-tab.png new file mode 100644 index 000000000..406cab447 Binary files /dev/null and b/content-rst/applications/marketing/sms_marketing/create_sms/sms-settings-tab.png differ diff --git a/content/applications/marketing/sms_marketing/mailing_lists_blacklists.rst b/content-rst/applications/marketing/sms_marketing/mailing_lists_blacklists.rst similarity index 100% rename from content/applications/marketing/sms_marketing/mailing_lists_blacklists.rst rename to content-rst/applications/marketing/sms_marketing/mailing_lists_blacklists.rst diff --git a/content-rst/applications/marketing/sms_marketing/mailing_lists_blacklists/import-blacklist.png b/content-rst/applications/marketing/sms_marketing/mailing_lists_blacklists/import-blacklist.png new file mode 100644 index 000000000..d33e27df5 Binary files /dev/null and b/content-rst/applications/marketing/sms_marketing/mailing_lists_blacklists/import-blacklist.png differ diff --git a/content-rst/applications/marketing/sms_marketing/mailing_lists_blacklists/mailing-list-contacts-page.png b/content-rst/applications/marketing/sms_marketing/mailing_lists_blacklists/mailing-list-contacts-page.png new file mode 100644 index 000000000..332ccb7db Binary files /dev/null and b/content-rst/applications/marketing/sms_marketing/mailing_lists_blacklists/mailing-list-contacts-page.png differ diff --git a/content-rst/applications/marketing/sms_marketing/mailing_lists_blacklists/mailing-list-main-page.png b/content-rst/applications/marketing/sms_marketing/mailing_lists_blacklists/mailing-list-main-page.png new file mode 100644 index 000000000..8ace2197e Binary files /dev/null and b/content-rst/applications/marketing/sms_marketing/mailing_lists_blacklists/mailing-list-main-page.png differ diff --git a/content-rst/applications/marketing/sms_marketing/mailing_lists_blacklists/sms-blacklist-create.png b/content-rst/applications/marketing/sms_marketing/mailing_lists_blacklists/sms-blacklist-create.png new file mode 100644 index 000000000..a9cce6fb5 Binary files /dev/null and b/content-rst/applications/marketing/sms_marketing/mailing_lists_blacklists/sms-blacklist-create.png differ diff --git a/content-rst/applications/marketing/sms_marketing/mailing_lists_blacklists/sms-blacklist-menu.png b/content-rst/applications/marketing/sms_marketing/mailing_lists_blacklists/sms-blacklist-menu.png new file mode 100644 index 000000000..7770ca8b4 Binary files /dev/null and b/content-rst/applications/marketing/sms_marketing/mailing_lists_blacklists/sms-blacklist-menu.png differ diff --git a/content-rst/applications/marketing/sms_marketing/mailing_lists_blacklists/sms-mailing-list-popup.png b/content-rst/applications/marketing/sms_marketing/mailing_lists_blacklists/sms-mailing-list-popup.png new file mode 100644 index 000000000..e7ea32aea Binary files /dev/null and b/content-rst/applications/marketing/sms_marketing/mailing_lists_blacklists/sms-mailing-list-popup.png differ diff --git a/content-rst/applications/marketing/sms_marketing/mailing_lists_blacklists/sms-mailing-list.png b/content-rst/applications/marketing/sms_marketing/mailing_lists_blacklists/sms-mailing-list.png new file mode 100644 index 000000000..ea13cc464 Binary files /dev/null and b/content-rst/applications/marketing/sms_marketing/mailing_lists_blacklists/sms-mailing-list.png differ diff --git a/content-rst/applications/marketing/sms_marketing/mailing_lists_blacklists/sms-marketing-chatter.png b/content-rst/applications/marketing/sms_marketing/mailing_lists_blacklists/sms-marketing-chatter.png new file mode 100644 index 000000000..66ece9df8 Binary files /dev/null and b/content-rst/applications/marketing/sms_marketing/mailing_lists_blacklists/sms-marketing-chatter.png differ diff --git a/content/applications/marketing/sms_marketing/marketing_campaigns.rst b/content-rst/applications/marketing/sms_marketing/marketing_campaigns.rst similarity index 100% rename from content/applications/marketing/sms_marketing/marketing_campaigns.rst rename to content-rst/applications/marketing/sms_marketing/marketing_campaigns.rst diff --git a/content-rst/applications/marketing/sms_marketing/marketing_campaigns/ab-tests-sms.png b/content-rst/applications/marketing/sms_marketing/marketing_campaigns/ab-tests-sms.png new file mode 100644 index 000000000..d7168523b Binary files /dev/null and b/content-rst/applications/marketing/sms_marketing/marketing_campaigns/ab-tests-sms.png differ diff --git a/content-rst/applications/marketing/sms_marketing/marketing_campaigns/campaigns-page.png b/content-rst/applications/marketing/sms_marketing/marketing_campaigns/campaigns-page.png new file mode 100644 index 000000000..5493544bb Binary files /dev/null and b/content-rst/applications/marketing/sms_marketing/marketing_campaigns/campaigns-page.png differ diff --git a/content-rst/applications/marketing/sms_marketing/marketing_campaigns/sms-campaign-template.png b/content-rst/applications/marketing/sms_marketing/marketing_campaigns/sms-campaign-template.png new file mode 100644 index 000000000..4f4d40827 Binary files /dev/null and b/content-rst/applications/marketing/sms_marketing/marketing_campaigns/sms-campaign-template.png differ diff --git a/content-rst/applications/marketing/sms_marketing/marketing_campaigns/sms-contact-form.png b/content-rst/applications/marketing/sms_marketing/marketing_campaigns/sms-contact-form.png new file mode 100644 index 000000000..38cc8d27e Binary files /dev/null and b/content-rst/applications/marketing/sms_marketing/marketing_campaigns/sms-contact-form.png differ diff --git a/content-rst/applications/marketing/sms_marketing/marketing_campaigns/sms-contacts-action-send-message.png b/content-rst/applications/marketing/sms_marketing/marketing_campaigns/sms-contacts-action-send-message.png new file mode 100644 index 000000000..c60578192 Binary files /dev/null and b/content-rst/applications/marketing/sms_marketing/marketing_campaigns/sms-contacts-action-send-message.png differ diff --git a/content-rst/applications/marketing/sms_marketing/marketing_campaigns/sms-mailing-campaigns.png b/content-rst/applications/marketing/sms_marketing/marketing_campaigns/sms-mailing-campaigns.png new file mode 100644 index 000000000..d0a599c5a Binary files /dev/null and b/content-rst/applications/marketing/sms_marketing/marketing_campaigns/sms-mailing-campaigns.png differ diff --git a/content-rst/applications/marketing/sms_marketing/marketing_campaigns/sms-template-setting.png b/content-rst/applications/marketing/sms_marketing/marketing_campaigns/sms-template-setting.png new file mode 100644 index 000000000..cd7beea2e Binary files /dev/null and b/content-rst/applications/marketing/sms_marketing/marketing_campaigns/sms-template-setting.png differ diff --git a/content-rst/applications/marketing/sms_marketing/marketing_campaigns/sms-template.png b/content-rst/applications/marketing/sms_marketing/marketing_campaigns/sms-template.png new file mode 100644 index 000000000..fc9cef33e Binary files /dev/null and b/content-rst/applications/marketing/sms_marketing/marketing_campaigns/sms-template.png differ diff --git a/content/applications/marketing/sms_marketing/pricing_and_faq.rst b/content-rst/applications/marketing/sms_marketing/pricing_and_faq.rst similarity index 100% rename from content/applications/marketing/sms_marketing/pricing_and_faq.rst rename to content-rst/applications/marketing/sms_marketing/pricing_and_faq.rst diff --git a/content-rst/applications/marketing/sms_marketing/pricing_and_faq/faq1.png b/content-rst/applications/marketing/sms_marketing/pricing_and_faq/faq1.png new file mode 100644 index 000000000..490a3f97e Binary files /dev/null and b/content-rst/applications/marketing/sms_marketing/pricing_and_faq/faq1.png differ diff --git a/content-rst/applications/marketing/sms_marketing/pricing_and_faq/faq2.png b/content-rst/applications/marketing/sms_marketing/pricing_and_faq/faq2.png new file mode 100644 index 000000000..b53c79681 Binary files /dev/null and b/content-rst/applications/marketing/sms_marketing/pricing_and_faq/faq2.png differ diff --git a/content-rst/applications/marketing/sms_marketing/pricing_and_faq/faq3.png b/content-rst/applications/marketing/sms_marketing/pricing_and_faq/faq3.png new file mode 100644 index 000000000..6654c46bb Binary files /dev/null and b/content-rst/applications/marketing/sms_marketing/pricing_and_faq/faq3.png differ diff --git a/content-rst/applications/marketing/sms_marketing/pricing_and_faq/faq4.png b/content-rst/applications/marketing/sms_marketing/pricing_and_faq/faq4.png new file mode 100644 index 000000000..2b40a3aa5 Binary files /dev/null and b/content-rst/applications/marketing/sms_marketing/pricing_and_faq/faq4.png differ diff --git a/content/applications/marketing/sms_marketing/sms_analysis.rst b/content-rst/applications/marketing/sms_marketing/sms_analysis.rst similarity index 100% rename from content/applications/marketing/sms_marketing/sms_analysis.rst rename to content-rst/applications/marketing/sms_marketing/sms_analysis.rst diff --git a/content-rst/applications/marketing/sms_marketing/sms_analysis/automation-rule-sms.png b/content-rst/applications/marketing/sms_marketing/sms_analysis/automation-rule-sms.png new file mode 100644 index 000000000..df022d119 Binary files /dev/null and b/content-rst/applications/marketing/sms_marketing/sms_analysis/automation-rule-sms.png differ diff --git a/content-rst/applications/marketing/sms_marketing/sms_analysis/sms-reporting-page.png b/content-rst/applications/marketing/sms_marketing/sms_analysis/sms-reporting-page.png new file mode 100644 index 000000000..65eb3aba2 Binary files /dev/null and b/content-rst/applications/marketing/sms_marketing/sms_analysis/sms-reporting-page.png differ diff --git a/content/applications/marketing/social_marketing.rst b/content-rst/applications/marketing/social_marketing.rst similarity index 100% rename from content/applications/marketing/social_marketing.rst rename to content-rst/applications/marketing/social_marketing.rst diff --git a/content-rst/applications/marketing/social_marketing/add-stream-social-popup.png b/content-rst/applications/marketing/social_marketing/add-stream-social-popup.png new file mode 100644 index 000000000..977766ce8 Binary files /dev/null and b/content-rst/applications/marketing/social_marketing/add-stream-social-popup.png differ diff --git a/content-rst/applications/marketing/social_marketing/permission-error.png b/content-rst/applications/marketing/social_marketing/permission-error.png new file mode 100644 index 000000000..cb695649e Binary files /dev/null and b/content-rst/applications/marketing/social_marketing/permission-error.png differ diff --git a/content-rst/applications/marketing/social_marketing/social-accounts-page.png b/content-rst/applications/marketing/social_marketing/social-accounts-page.png new file mode 100644 index 000000000..8022ca296 Binary files /dev/null and b/content-rst/applications/marketing/social_marketing/social-accounts-page.png differ diff --git a/content-rst/applications/marketing/social_marketing/social-marketing-dashboard.png b/content-rst/applications/marketing/social_marketing/social-marketing-dashboard.png new file mode 100644 index 000000000..3cb5c28dc Binary files /dev/null and b/content-rst/applications/marketing/social_marketing/social-marketing-dashboard.png differ diff --git a/content-rst/applications/marketing/social_marketing/social-media-page.png b/content-rst/applications/marketing/social_marketing/social-media-page.png new file mode 100644 index 000000000..db6b335e9 Binary files /dev/null and b/content-rst/applications/marketing/social_marketing/social-media-page.png differ diff --git a/content-rst/applications/marketing/social_marketing/social-streams-page.png b/content-rst/applications/marketing/social_marketing/social-streams-page.png new file mode 100644 index 000000000..7840aa0cf Binary files /dev/null and b/content-rst/applications/marketing/social_marketing/social-streams-page.png differ diff --git a/content/applications/marketing/social_marketing/social_campaigns.rst b/content-rst/applications/marketing/social_marketing/social_campaigns.rst similarity index 100% rename from content/applications/marketing/social_marketing/social_campaigns.rst rename to content-rst/applications/marketing/social_marketing/social_campaigns.rst diff --git a/content-rst/applications/marketing/social_marketing/social_campaigns/campaign-stage-dropdown.png b/content-rst/applications/marketing/social_marketing/social_campaigns/campaign-stage-dropdown.png new file mode 100644 index 000000000..af845b338 Binary files /dev/null and b/content-rst/applications/marketing/social_marketing/social_campaigns/campaign-stage-dropdown.png differ diff --git a/content-rst/applications/marketing/social_marketing/social_campaigns/campaigns-page.png b/content-rst/applications/marketing/social_marketing/social_campaigns/campaigns-page.png new file mode 100644 index 000000000..c1c672934 Binary files /dev/null and b/content-rst/applications/marketing/social_marketing/social_campaigns/campaigns-page.png differ diff --git a/content-rst/applications/marketing/social_marketing/social_campaigns/create-campaign.png b/content-rst/applications/marketing/social_marketing/social_campaigns/create-campaign.png new file mode 100644 index 000000000..ebaeaa46d Binary files /dev/null and b/content-rst/applications/marketing/social_marketing/social_campaigns/create-campaign.png differ diff --git a/content-rst/applications/marketing/social_marketing/social_campaigns/quick-add-campaign.png b/content-rst/applications/marketing/social_marketing/social_campaigns/quick-add-campaign.png new file mode 100644 index 000000000..5db629abc Binary files /dev/null and b/content-rst/applications/marketing/social_marketing/social_campaigns/quick-add-campaign.png differ diff --git a/content/applications/marketing/social_marketing/social_posts.rst b/content-rst/applications/marketing/social_marketing/social_posts.rst similarity index 100% rename from content/applications/marketing/social_marketing/social_posts.rst rename to content-rst/applications/marketing/social_marketing/social_posts.rst diff --git a/content-rst/applications/marketing/social_marketing/social_posts/attach-images-visual-social-post-sample.png b/content-rst/applications/marketing/social_marketing/social_posts/attach-images-visual-social-post-sample.png new file mode 100644 index 000000000..674d09f48 Binary files /dev/null and b/content-rst/applications/marketing/social_marketing/social_posts/attach-images-visual-social-post-sample.png differ diff --git a/content-rst/applications/marketing/social_marketing/social_posts/blank-post-detail-page.png b/content-rst/applications/marketing/social_marketing/social_posts/blank-post-detail-page.png new file mode 100644 index 000000000..36940b401 Binary files /dev/null and b/content-rst/applications/marketing/social_marketing/social_posts/blank-post-detail-page.png differ diff --git a/content-rst/applications/marketing/social_marketing/social_posts/calendar-view.png b/content-rst/applications/marketing/social_marketing/social_posts/calendar-view.png new file mode 100644 index 000000000..3e052cac1 Binary files /dev/null and b/content-rst/applications/marketing/social_marketing/social_posts/calendar-view.png differ diff --git a/content-rst/applications/marketing/social_marketing/social_posts/campaign-drop-down-menu-options.png b/content-rst/applications/marketing/social_marketing/social_posts/campaign-drop-down-menu-options.png new file mode 100644 index 000000000..bd508e5d0 Binary files /dev/null and b/content-rst/applications/marketing/social_marketing/social_posts/campaign-drop-down-menu-options.png differ diff --git a/content-rst/applications/marketing/social_marketing/social_posts/convert-post-to-lead-popup.png b/content-rst/applications/marketing/social_marketing/social_posts/convert-post-to-lead-popup.png new file mode 100644 index 000000000..3903128b2 Binary files /dev/null and b/content-rst/applications/marketing/social_marketing/social_posts/convert-post-to-lead-popup.png differ diff --git a/content-rst/applications/marketing/social_marketing/social_posts/create-campaign-popup.png b/content-rst/applications/marketing/social_marketing/social_posts/create-campaign-popup.png new file mode 100644 index 000000000..bf478845c Binary files /dev/null and b/content-rst/applications/marketing/social_marketing/social_posts/create-campaign-popup.png differ diff --git a/content-rst/applications/marketing/social_marketing/social_posts/create-lead-drop-down.png b/content-rst/applications/marketing/social_marketing/social_posts/create-lead-drop-down.png new file mode 100644 index 000000000..5f20e98e8 Binary files /dev/null and b/content-rst/applications/marketing/social_marketing/social_posts/create-lead-drop-down.png differ diff --git a/content-rst/applications/marketing/social_marketing/social_posts/list-view.png b/content-rst/applications/marketing/social_marketing/social_posts/list-view.png new file mode 100644 index 000000000..309034cd1 Binary files /dev/null and b/content-rst/applications/marketing/social_marketing/social_posts/list-view.png differ diff --git a/content-rst/applications/marketing/social_marketing/social_posts/new-button-social-posts-page.png b/content-rst/applications/marketing/social_marketing/social_posts/new-button-social-posts-page.png new file mode 100644 index 000000000..5f27a4944 Binary files /dev/null and b/content-rst/applications/marketing/social_marketing/social_posts/new-button-social-posts-page.png differ diff --git a/content-rst/applications/marketing/social_marketing/social_posts/new-lead-detail-form-comments.png b/content-rst/applications/marketing/social_marketing/social_posts/new-lead-detail-form-comments.png new file mode 100644 index 000000000..7cf994625 Binary files /dev/null and b/content-rst/applications/marketing/social_marketing/social_posts/new-lead-detail-form-comments.png differ diff --git a/content-rst/applications/marketing/social_marketing/social_posts/new-post-button-social-marketing-dashboard.png b/content-rst/applications/marketing/social_marketing/social_posts/new-post-button-social-marketing-dashboard.png new file mode 100644 index 000000000..289976745 Binary files /dev/null and b/content-rst/applications/marketing/social_marketing/social_posts/new-post-button-social-marketing-dashboard.png differ diff --git a/content-rst/applications/marketing/social_marketing/social_posts/pivot-view.png b/content-rst/applications/marketing/social_marketing/social_posts/pivot-view.png new file mode 100644 index 000000000..02d7c66af Binary files /dev/null and b/content-rst/applications/marketing/social_marketing/social_posts/pivot-view.png differ diff --git a/content-rst/applications/marketing/social_marketing/social_posts/posts-page-kanban.png b/content-rst/applications/marketing/social_marketing/social_posts/posts-page-kanban.png new file mode 100644 index 000000000..98fc8eb2e Binary files /dev/null and b/content-rst/applications/marketing/social_marketing/social_posts/posts-page-kanban.png differ diff --git a/content-rst/applications/marketing/social_marketing/social_posts/push-notification-condition.png b/content-rst/applications/marketing/social_marketing/social_posts/push-notification-condition.png new file mode 100644 index 000000000..cdcf9eec0 Binary files /dev/null and b/content-rst/applications/marketing/social_marketing/social_posts/push-notification-condition.png differ diff --git a/content-rst/applications/marketing/social_marketing/social_posts/push-notification-local-time.png b/content-rst/applications/marketing/social_marketing/social_posts/push-notification-local-time.png new file mode 100644 index 000000000..4e1dd0477 Binary files /dev/null and b/content-rst/applications/marketing/social_marketing/social_posts/push-notification-local-time.png differ diff --git a/content-rst/applications/marketing/social_marketing/social_posts/push-notification-options-section.png b/content-rst/applications/marketing/social_marketing/social_posts/push-notification-options-section.png new file mode 100644 index 000000000..f70dcd64c Binary files /dev/null and b/content-rst/applications/marketing/social_marketing/social_posts/push-notification-options-section.png differ diff --git a/content-rst/applications/marketing/social_marketing/social_posts/schedule-post-calendar-popup.png b/content-rst/applications/marketing/social_marketing/social_posts/schedule-post-calendar-popup.png new file mode 100644 index 000000000..a9ca9e717 Binary files /dev/null and b/content-rst/applications/marketing/social_marketing/social_posts/schedule-post-calendar-popup.png differ diff --git a/content-rst/applications/marketing/social_marketing/social_posts/social-marketing-insights-link.png b/content-rst/applications/marketing/social_marketing/social_posts/social-marketing-insights-link.png new file mode 100644 index 000000000..9d490e629 Binary files /dev/null and b/content-rst/applications/marketing/social_marketing/social_posts/social-marketing-insights-link.png differ diff --git a/content-rst/applications/marketing/social_marketing/social_posts/social-post-popup.png b/content-rst/applications/marketing/social_marketing/social_posts/social-post-popup.png new file mode 100644 index 000000000..36bc72e7f Binary files /dev/null and b/content-rst/applications/marketing/social_marketing/social_posts/social-post-popup.png differ diff --git a/content-rst/applications/marketing/social_marketing/social_posts/visual-samples-social-media-outlets-preview.png b/content-rst/applications/marketing/social_marketing/social_posts/visual-samples-social-media-outlets-preview.png new file mode 100644 index 000000000..ba7c7975c Binary files /dev/null and b/content-rst/applications/marketing/social_marketing/social_posts/visual-samples-social-media-outlets-preview.png differ diff --git a/content-rst/applications/marketing/social_marketing/visitors.png b/content-rst/applications/marketing/social_marketing/visitors.png new file mode 100644 index 000000000..d8aa33fa0 Binary files /dev/null and b/content-rst/applications/marketing/social_marketing/visitors.png differ diff --git a/content/applications/marketing/surveys.rst b/content-rst/applications/marketing/surveys.rst similarity index 100% rename from content/applications/marketing/surveys.rst rename to content-rst/applications/marketing/surveys.rst diff --git a/content-rst/applications/marketing/surveys/activities-view.png b/content-rst/applications/marketing/surveys/activities-view.png new file mode 100644 index 000000000..7326cf81a Binary files /dev/null and b/content-rst/applications/marketing/surveys/activities-view.png differ diff --git a/content/applications/marketing/surveys/analysis.rst b/content-rst/applications/marketing/surveys/analysis.rst similarity index 100% rename from content/applications/marketing/surveys/analysis.rst rename to content-rst/applications/marketing/surveys/analysis.rst diff --git a/content-rst/applications/marketing/surveys/analysis/all-data-tab.png b/content-rst/applications/marketing/surveys/analysis/all-data-tab.png new file mode 100644 index 000000000..50486bdb9 Binary files /dev/null and b/content-rst/applications/marketing/surveys/analysis/all-data-tab.png differ diff --git a/content-rst/applications/marketing/surveys/analysis/all-surveys-dropdown.png b/content-rst/applications/marketing/surveys/analysis/all-surveys-dropdown.png new file mode 100644 index 000000000..f2d853318 Binary files /dev/null and b/content-rst/applications/marketing/surveys/analysis/all-surveys-dropdown.png differ diff --git a/content-rst/applications/marketing/surveys/analysis/applied-filter.png b/content-rst/applications/marketing/surveys/analysis/applied-filter.png new file mode 100644 index 000000000..708527fc2 Binary files /dev/null and b/content-rst/applications/marketing/surveys/analysis/applied-filter.png differ diff --git a/content-rst/applications/marketing/surveys/analysis/bar-graph-results.png b/content-rst/applications/marketing/surveys/analysis/bar-graph-results.png new file mode 100644 index 000000000..cd78e7ffd Binary files /dev/null and b/content-rst/applications/marketing/surveys/analysis/bar-graph-results.png differ diff --git a/content-rst/applications/marketing/surveys/analysis/correct-indicator.png b/content-rst/applications/marketing/surveys/analysis/correct-indicator.png new file mode 100644 index 000000000..04be44794 Binary files /dev/null and b/content-rst/applications/marketing/surveys/analysis/correct-indicator.png differ diff --git a/content-rst/applications/marketing/surveys/analysis/data-tab.png b/content-rst/applications/marketing/surveys/analysis/data-tab.png new file mode 100644 index 000000000..a91b7380a Binary files /dev/null and b/content-rst/applications/marketing/surveys/analysis/data-tab.png differ diff --git a/content-rst/applications/marketing/surveys/analysis/filter-icon.png b/content-rst/applications/marketing/surveys/analysis/filter-icon.png new file mode 100644 index 000000000..f3faae0d4 Binary files /dev/null and b/content-rst/applications/marketing/surveys/analysis/filter-icon.png differ diff --git a/content-rst/applications/marketing/surveys/analysis/individual-participant-page.png b/content-rst/applications/marketing/surveys/analysis/individual-participant-page.png new file mode 100644 index 000000000..ebe630f2b Binary files /dev/null and b/content-rst/applications/marketing/surveys/analysis/individual-participant-page.png differ diff --git a/content-rst/applications/marketing/surveys/analysis/max-min-avg-indicator.png b/content-rst/applications/marketing/surveys/analysis/max-min-avg-indicator.png new file mode 100644 index 000000000..f010c010d Binary files /dev/null and b/content-rst/applications/marketing/surveys/analysis/max-min-avg-indicator.png differ diff --git a/content-rst/applications/marketing/surveys/analysis/most-common-tab.png b/content-rst/applications/marketing/surveys/analysis/most-common-tab.png new file mode 100644 index 000000000..0b19e3579 Binary files /dev/null and b/content-rst/applications/marketing/surveys/analysis/most-common-tab.png differ diff --git a/content-rst/applications/marketing/surveys/analysis/participations-page-all-surveys.png b/content-rst/applications/marketing/surveys/analysis/participations-page-all-surveys.png new file mode 100644 index 000000000..ca3c64457 Binary files /dev/null and b/content-rst/applications/marketing/surveys/analysis/participations-page-all-surveys.png differ diff --git a/content-rst/applications/marketing/surveys/analysis/participations-page-kanban-view.png b/content-rst/applications/marketing/surveys/analysis/participations-page-kanban-view.png new file mode 100644 index 000000000..0edb3d6b6 Binary files /dev/null and b/content-rst/applications/marketing/surveys/analysis/participations-page-kanban-view.png differ diff --git a/content-rst/applications/marketing/surveys/analysis/participations-page-singular-survey.png b/content-rst/applications/marketing/surveys/analysis/participations-page-singular-survey.png new file mode 100644 index 000000000..bdde1b289 Binary files /dev/null and b/content-rst/applications/marketing/surveys/analysis/participations-page-singular-survey.png differ diff --git a/content-rst/applications/marketing/surveys/analysis/participations-smart-button.png b/content-rst/applications/marketing/surveys/analysis/participations-smart-button.png new file mode 100644 index 000000000..e3f4d292e Binary files /dev/null and b/content-rst/applications/marketing/surveys/analysis/participations-smart-button.png differ diff --git a/content-rst/applications/marketing/surveys/analysis/passed-failed-dropdown.png b/content-rst/applications/marketing/surveys/analysis/passed-failed-dropdown.png new file mode 100644 index 000000000..5a61b04b3 Binary files /dev/null and b/content-rst/applications/marketing/surveys/analysis/passed-failed-dropdown.png differ diff --git a/content-rst/applications/marketing/surveys/analysis/pie-graph-results.png b/content-rst/applications/marketing/surveys/analysis/pie-graph-results.png new file mode 100644 index 000000000..2782a7b39 Binary files /dev/null and b/content-rst/applications/marketing/surveys/analysis/pie-graph-results.png differ diff --git a/content-rst/applications/marketing/surveys/analysis/responded-skipped-indicators.png b/content-rst/applications/marketing/surveys/analysis/responded-skipped-indicators.png new file mode 100644 index 000000000..465a6cace Binary files /dev/null and b/content-rst/applications/marketing/surveys/analysis/responded-skipped-indicators.png differ diff --git a/content-rst/applications/marketing/surveys/analysis/results-overview.png b/content-rst/applications/marketing/surveys/analysis/results-overview.png new file mode 100644 index 000000000..b7d282841 Binary files /dev/null and b/content-rst/applications/marketing/surveys/analysis/results-overview.png differ diff --git a/content-rst/applications/marketing/surveys/analysis/results-page.png b/content-rst/applications/marketing/surveys/analysis/results-page.png new file mode 100644 index 000000000..35ed74923 Binary files /dev/null and b/content-rst/applications/marketing/surveys/analysis/results-page.png differ diff --git a/content-rst/applications/marketing/surveys/analysis/see-results-button.png b/content-rst/applications/marketing/surveys/analysis/see-results-button.png new file mode 100644 index 000000000..0d300849a Binary files /dev/null and b/content-rst/applications/marketing/surveys/analysis/see-results-button.png differ diff --git a/content/applications/marketing/surveys/create.rst b/content-rst/applications/marketing/surveys/create.rst similarity index 100% rename from content/applications/marketing/surveys/create.rst rename to content-rst/applications/marketing/surveys/create.rst diff --git a/content-rst/applications/marketing/surveys/create/blank-survey-form.png b/content-rst/applications/marketing/surveys/create/blank-survey-form.png new file mode 100644 index 000000000..8ef0eacd9 Binary files /dev/null and b/content-rst/applications/marketing/surveys/create/blank-survey-form.png differ diff --git a/content-rst/applications/marketing/surveys/create/live-session-section-options-tab.png b/content-rst/applications/marketing/surveys/create/live-session-section-options-tab.png new file mode 100644 index 000000000..f8808acb4 Binary files /dev/null and b/content-rst/applications/marketing/surveys/create/live-session-section-options-tab.png differ diff --git a/content-rst/applications/marketing/surveys/create/mandatory-answer-dropdown.png b/content-rst/applications/marketing/surveys/create/mandatory-answer-dropdown.png new file mode 100644 index 000000000..aa529c58c Binary files /dev/null and b/content-rst/applications/marketing/surveys/create/mandatory-answer-dropdown.png differ diff --git a/content-rst/applications/marketing/surveys/create/participants-section-options-tab.png b/content-rst/applications/marketing/surveys/create/participants-section-options-tab.png new file mode 100644 index 000000000..c4077a6a5 Binary files /dev/null and b/content-rst/applications/marketing/surveys/create/participants-section-options-tab.png differ diff --git a/content-rst/applications/marketing/surveys/create/questions-section-options-tab.png b/content-rst/applications/marketing/surveys/create/questions-section-options-tab.png new file mode 100644 index 000000000..5a35d93d6 Binary files /dev/null and b/content-rst/applications/marketing/surveys/create/questions-section-options-tab.png differ diff --git a/content-rst/applications/marketing/surveys/create/share-survey-popup-email-toggle.png b/content-rst/applications/marketing/surveys/create/share-survey-popup-email-toggle.png new file mode 100644 index 000000000..56c2547f0 Binary files /dev/null and b/content-rst/applications/marketing/surveys/create/share-survey-popup-email-toggle.png differ diff --git a/content-rst/applications/marketing/surveys/create/share-survey-popup.png b/content-rst/applications/marketing/surveys/create/share-survey-popup.png new file mode 100644 index 000000000..be8931825 Binary files /dev/null and b/content-rst/applications/marketing/surveys/create/share-survey-popup.png differ diff --git a/content-rst/applications/marketing/surveys/create/survey-form-buttons.png b/content-rst/applications/marketing/surveys/create/survey-form-buttons.png new file mode 100644 index 000000000..563158ee4 Binary files /dev/null and b/content-rst/applications/marketing/surveys/create/survey-form-buttons.png differ diff --git a/content-rst/applications/marketing/surveys/create/time-scoring-section-options-tab.png b/content-rst/applications/marketing/surveys/create/time-scoring-section-options-tab.png new file mode 100644 index 000000000..a8d380594 Binary files /dev/null and b/content-rst/applications/marketing/surveys/create/time-scoring-section-options-tab.png differ diff --git a/content-rst/applications/marketing/surveys/list-view.png b/content-rst/applications/marketing/surveys/list-view.png new file mode 100644 index 000000000..cdb09c711 Binary files /dev/null and b/content-rst/applications/marketing/surveys/list-view.png differ diff --git a/content/applications/marketing/surveys/live_session.rst b/content-rst/applications/marketing/surveys/live_session.rst similarity index 100% rename from content/applications/marketing/surveys/live_session.rst rename to content-rst/applications/marketing/surveys/live_session.rst diff --git a/content-rst/applications/marketing/surveys/live_session/live-session-concept-sample.png b/content-rst/applications/marketing/surveys/live_session/live-session-concept-sample.png new file mode 100644 index 000000000..cfc6b64ed Binary files /dev/null and b/content-rst/applications/marketing/surveys/live_session/live-session-concept-sample.png differ diff --git a/content-rst/applications/marketing/surveys/live_session/question-time-limit-option.png b/content-rst/applications/marketing/surveys/live_session/question-time-limit-option.png new file mode 100644 index 000000000..4877eb544 Binary files /dev/null and b/content-rst/applications/marketing/surveys/live_session/question-time-limit-option.png differ diff --git a/content/applications/marketing/surveys/questions.rst b/content-rst/applications/marketing/surveys/questions.rst similarity index 100% rename from content/applications/marketing/surveys/questions.rst rename to content-rst/applications/marketing/surveys/questions.rst diff --git a/content-rst/applications/marketing/surveys/questions/conditional-display-section.png b/content-rst/applications/marketing/surveys/questions/conditional-display-section.png new file mode 100644 index 000000000..04402a6da Binary files /dev/null and b/content-rst/applications/marketing/surveys/questions/conditional-display-section.png differ diff --git a/content-rst/applications/marketing/surveys/questions/constraints-section.png b/content-rst/applications/marketing/surveys/questions/constraints-section.png new file mode 100644 index 000000000..1386f3900 Binary files /dev/null and b/content-rst/applications/marketing/surveys/questions/constraints-section.png differ diff --git a/content-rst/applications/marketing/surveys/questions/create-sections-questions-popup.png b/content-rst/applications/marketing/surveys/questions/create-sections-questions-popup.png new file mode 100644 index 000000000..135d57c98 Binary files /dev/null and b/content-rst/applications/marketing/surveys/questions/create-sections-questions-popup.png differ diff --git a/content-rst/applications/marketing/surveys/questions/live-sessions-section.png b/content-rst/applications/marketing/surveys/questions/live-sessions-section.png new file mode 100644 index 000000000..5afc9cfe3 Binary files /dev/null and b/content-rst/applications/marketing/surveys/questions/live-sessions-section.png differ diff --git a/content-rst/applications/marketing/surveys/questions/matrix-answer-tab.png b/content-rst/applications/marketing/surveys/questions/matrix-answer-tab.png new file mode 100644 index 000000000..f6f855306 Binary files /dev/null and b/content-rst/applications/marketing/surveys/questions/matrix-answer-tab.png differ diff --git a/content-rst/applications/marketing/surveys/questions/multiple-choice-answer-options.png b/content-rst/applications/marketing/surveys/questions/multiple-choice-answer-options.png new file mode 100644 index 000000000..f4b9361f4 Binary files /dev/null and b/content-rst/applications/marketing/surveys/questions/multiple-choice-answer-options.png differ diff --git a/content-rst/applications/marketing/surveys/questions/multiple-choice-options-tab.png b/content-rst/applications/marketing/surveys/questions/multiple-choice-options-tab.png new file mode 100644 index 000000000..9b1a53c44 Binary files /dev/null and b/content-rst/applications/marketing/surveys/questions/multiple-choice-options-tab.png differ diff --git a/content-rst/applications/marketing/surveys/questions/multiple-lines-placeholder.png b/content-rst/applications/marketing/surveys/questions/multiple-lines-placeholder.png new file mode 100644 index 000000000..2e7a7614f Binary files /dev/null and b/content-rst/applications/marketing/surveys/questions/multiple-lines-placeholder.png differ diff --git a/content-rst/applications/marketing/surveys/questions/single-line-answer-tab.png b/content-rst/applications/marketing/surveys/questions/single-line-answer-tab.png new file mode 100644 index 000000000..4416c3f61 Binary files /dev/null and b/content-rst/applications/marketing/surveys/questions/single-line-answer-tab.png differ diff --git a/content-rst/applications/marketing/surveys/questions/single-line-validate-entry.png b/content-rst/applications/marketing/surveys/questions/single-line-validate-entry.png new file mode 100644 index 000000000..4cec978af Binary files /dev/null and b/content-rst/applications/marketing/surveys/questions/single-line-validate-entry.png differ diff --git a/content-rst/applications/marketing/surveys/questions/slider-dropdown-mandatory-answer.png b/content-rst/applications/marketing/surveys/questions/slider-dropdown-mandatory-answer.png new file mode 100644 index 000000000..c19cbb2e8 Binary files /dev/null and b/content-rst/applications/marketing/surveys/questions/slider-dropdown-mandatory-answer.png differ diff --git a/content-rst/applications/marketing/surveys/schedule-activities-dropdown.png b/content-rst/applications/marketing/surveys/schedule-activities-dropdown.png new file mode 100644 index 000000000..e0097524e Binary files /dev/null and b/content-rst/applications/marketing/surveys/schedule-activities-dropdown.png differ diff --git a/content/applications/marketing/surveys/scoring.rst b/content-rst/applications/marketing/surveys/scoring.rst similarity index 100% rename from content/applications/marketing/surveys/scoring.rst rename to content-rst/applications/marketing/surveys/scoring.rst diff --git a/content-rst/applications/marketing/surveys/scoring/frontend-badges.png b/content-rst/applications/marketing/surveys/scoring/frontend-badges.png new file mode 100644 index 000000000..67d0d4049 Binary files /dev/null and b/content-rst/applications/marketing/surveys/scoring/frontend-badges.png differ diff --git a/content-rst/applications/marketing/surveys/scoring/required-score-login.png b/content-rst/applications/marketing/surveys/scoring/required-score-login.png new file mode 100644 index 000000000..61ae40bbe Binary files /dev/null and b/content-rst/applications/marketing/surveys/scoring/required-score-login.png differ diff --git a/content-rst/applications/marketing/surveys/share-survey-popup-email-toggle.png b/content-rst/applications/marketing/surveys/share-survey-popup-email-toggle.png new file mode 100644 index 000000000..56c2547f0 Binary files /dev/null and b/content-rst/applications/marketing/surveys/share-survey-popup-email-toggle.png differ diff --git a/content-rst/applications/marketing/surveys/surveys-dashboard.png b/content-rst/applications/marketing/surveys/surveys-dashboard.png new file mode 100644 index 000000000..e548c90fd Binary files /dev/null and b/content-rst/applications/marketing/surveys/surveys-dashboard.png differ diff --git a/content-rst/applications/marketing/surveys/three-dot-dropdown.png b/content-rst/applications/marketing/surveys/three-dot-dropdown.png new file mode 100644 index 000000000..4a9cac61a Binary files /dev/null and b/content-rst/applications/marketing/surveys/three-dot-dropdown.png differ diff --git a/content/applications/productivity.rst b/content-rst/applications/productivity.rst similarity index 100% rename from content/applications/productivity.rst rename to content-rst/applications/productivity.rst diff --git a/content/applications/productivity/calendar.rst b/content-rst/applications/productivity/calendar.rst similarity index 100% rename from content/applications/productivity/calendar.rst rename to content-rst/applications/productivity/calendar.rst diff --git a/content-rst/applications/productivity/calendar/calendar-attendees.png b/content-rst/applications/productivity/calendar/calendar-attendees.png new file mode 100644 index 000000000..fae0a9a14 Binary files /dev/null and b/content-rst/applications/productivity/calendar/calendar-attendees.png differ diff --git a/content-rst/applications/productivity/calendar/calendar-meeting-share-availability.png b/content-rst/applications/productivity/calendar/calendar-meeting-share-availability.png new file mode 100644 index 000000000..abc779dc4 Binary files /dev/null and b/content-rst/applications/productivity/calendar/calendar-meeting-share-availability.png differ diff --git a/content-rst/applications/productivity/calendar/calendar-new-meeting.png b/content-rst/applications/productivity/calendar/calendar-new-meeting.png new file mode 100644 index 000000000..85eb3f209 Binary files /dev/null and b/content-rst/applications/productivity/calendar/calendar-new-meeting.png differ diff --git a/content-rst/applications/productivity/calendar/calendar-overview.png b/content-rst/applications/productivity/calendar/calendar-overview.png new file mode 100644 index 000000000..4d4704733 Binary files /dev/null and b/content-rst/applications/productivity/calendar/calendar-overview.png differ diff --git a/content-rst/applications/productivity/calendar/calendar-schedule-event.png b/content-rst/applications/productivity/calendar/calendar-schedule-event.png new file mode 100644 index 000000000..7c233735e Binary files /dev/null and b/content-rst/applications/productivity/calendar/calendar-schedule-event.png differ diff --git a/content/applications/productivity/calendar/google.rst b/content-rst/applications/productivity/calendar/google.rst similarity index 100% rename from content/applications/productivity/calendar/google.rst rename to content-rst/applications/productivity/calendar/google.rst diff --git a/content-rst/applications/productivity/calendar/google/403-error.png b/content-rst/applications/productivity/calendar/google/403-error.png new file mode 100644 index 000000000..34661c5d4 Binary files /dev/null and b/content-rst/applications/productivity/calendar/google/403-error.png differ diff --git a/content-rst/applications/productivity/calendar/google/enable-apis-services.png b/content-rst/applications/productivity/calendar/google/enable-apis-services.png new file mode 100644 index 000000000..6b01aa974 Binary files /dev/null and b/content-rst/applications/productivity/calendar/google/enable-apis-services.png differ diff --git a/content-rst/applications/productivity/calendar/google/enable-google-cal-api.png b/content-rst/applications/productivity/calendar/google/enable-google-cal-api.png new file mode 100644 index 000000000..2189dc62e Binary files /dev/null and b/content-rst/applications/productivity/calendar/google/enable-google-cal-api.png differ diff --git a/content-rst/applications/productivity/calendar/google/error-400.png b/content-rst/applications/productivity/calendar/google/error-400.png new file mode 100644 index 000000000..68246eb5f Binary files /dev/null and b/content-rst/applications/productivity/calendar/google/error-400.png differ diff --git a/content-rst/applications/productivity/calendar/google/google-reset.png b/content-rst/applications/productivity/calendar/google/google-reset.png new file mode 100644 index 000000000..554583fdf Binary files /dev/null and b/content-rst/applications/productivity/calendar/google/google-reset.png differ diff --git a/content-rst/applications/productivity/calendar/google/new-api-project.png b/content-rst/applications/productivity/calendar/google/new-api-project.png new file mode 100644 index 000000000..c0d292255 Binary files /dev/null and b/content-rst/applications/productivity/calendar/google/new-api-project.png differ diff --git a/content-rst/applications/productivity/calendar/google/reset-calendar.png b/content-rst/applications/productivity/calendar/google/reset-calendar.png new file mode 100644 index 000000000..b12901e50 Binary files /dev/null and b/content-rst/applications/productivity/calendar/google/reset-calendar.png differ diff --git a/content-rst/applications/productivity/calendar/google/settings-google-cal.png b/content-rst/applications/productivity/calendar/google/settings-google-cal.png new file mode 100644 index 000000000..b28d74972 Binary files /dev/null and b/content-rst/applications/productivity/calendar/google/settings-google-cal.png differ diff --git a/content-rst/applications/productivity/calendar/google/sync-google.png b/content-rst/applications/productivity/calendar/google/sync-google.png new file mode 100644 index 000000000..14084c75b Binary files /dev/null and b/content-rst/applications/productivity/calendar/google/sync-google.png differ diff --git a/content-rst/applications/productivity/calendar/google/trust-odoo.png b/content-rst/applications/productivity/calendar/google/trust-odoo.png new file mode 100644 index 000000000..28fcef1aa Binary files /dev/null and b/content-rst/applications/productivity/calendar/google/trust-odoo.png differ diff --git a/content-rst/applications/productivity/calendar/google/uri.png b/content-rst/applications/productivity/calendar/google/uri.png new file mode 100644 index 000000000..e2b0ec2f8 Binary files /dev/null and b/content-rst/applications/productivity/calendar/google/uri.png differ diff --git a/content/applications/productivity/calendar/outlook.rst b/content-rst/applications/productivity/calendar/outlook.rst similarity index 100% rename from content/applications/productivity/calendar/outlook.rst rename to content-rst/applications/productivity/calendar/outlook.rst diff --git a/content-rst/applications/productivity/calendar/outlook/accept-terms.png b/content-rst/applications/productivity/calendar/outlook/accept-terms.png new file mode 100644 index 000000000..4ba15c3b4 Binary files /dev/null and b/content-rst/applications/productivity/calendar/outlook/accept-terms.png differ diff --git a/content-rst/applications/productivity/calendar/outlook/app-client-id.png b/content-rst/applications/productivity/calendar/outlook/app-client-id.png new file mode 100644 index 000000000..833938284 Binary files /dev/null and b/content-rst/applications/productivity/calendar/outlook/app-client-id.png differ diff --git a/content-rst/applications/productivity/calendar/outlook/app-register.png b/content-rst/applications/productivity/calendar/outlook/app-register.png new file mode 100644 index 000000000..727172943 Binary files /dev/null and b/content-rst/applications/productivity/calendar/outlook/app-register.png differ diff --git a/content-rst/applications/productivity/calendar/outlook/azure-register-application.png b/content-rst/applications/productivity/calendar/outlook/azure-register-application.png new file mode 100644 index 000000000..9243ef965 Binary files /dev/null and b/content-rst/applications/productivity/calendar/outlook/azure-register-application.png differ diff --git a/content-rst/applications/productivity/calendar/outlook/client-id.png b/content-rst/applications/productivity/calendar/outlook/client-id.png new file mode 100644 index 000000000..06b75abfe Binary files /dev/null and b/content-rst/applications/productivity/calendar/outlook/client-id.png differ diff --git a/content-rst/applications/productivity/calendar/outlook/client-secret-value.png b/content-rst/applications/productivity/calendar/outlook/client-secret-value.png new file mode 100644 index 000000000..75c466642 Binary files /dev/null and b/content-rst/applications/productivity/calendar/outlook/client-secret-value.png differ diff --git a/content-rst/applications/productivity/calendar/outlook/client-secret.png b/content-rst/applications/productivity/calendar/outlook/client-secret.png new file mode 100644 index 000000000..3777b1b5e Binary files /dev/null and b/content-rst/applications/productivity/calendar/outlook/client-secret.png differ diff --git a/content-rst/applications/productivity/calendar/outlook/outlook-calendar-setting.png b/content-rst/applications/productivity/calendar/outlook/outlook-calendar-setting.png new file mode 100644 index 000000000..46352ca2d Binary files /dev/null and b/content-rst/applications/productivity/calendar/outlook/outlook-calendar-setting.png differ diff --git a/content-rst/applications/productivity/calendar/outlook/outlook-reset.png b/content-rst/applications/productivity/calendar/outlook/outlook-reset.png new file mode 100644 index 000000000..68917c642 Binary files /dev/null and b/content-rst/applications/productivity/calendar/outlook/outlook-reset.png differ diff --git a/content-rst/applications/productivity/calendar/outlook/outlook-sync-button.png b/content-rst/applications/productivity/calendar/outlook/outlook-sync-button.png new file mode 100644 index 000000000..831f7e372 Binary files /dev/null and b/content-rst/applications/productivity/calendar/outlook/outlook-sync-button.png differ diff --git a/content-rst/applications/productivity/calendar/outlook/reset-calendar.png b/content-rst/applications/productivity/calendar/outlook/reset-calendar.png new file mode 100644 index 000000000..c0d8b3434 Binary files /dev/null and b/content-rst/applications/productivity/calendar/outlook/reset-calendar.png differ diff --git a/content/applications/productivity/data_cleaning.rst b/content-rst/applications/productivity/data_cleaning.rst similarity index 100% rename from content/applications/productivity/data_cleaning.rst rename to content-rst/applications/productivity/data_cleaning.rst diff --git a/content-rst/applications/productivity/data_cleaning/data-cleaning-duplicates.png b/content-rst/applications/productivity/data_cleaning/data-cleaning-duplicates.png new file mode 100644 index 000000000..c9a09b2bc Binary files /dev/null and b/content-rst/applications/productivity/data_cleaning/data-cleaning-duplicates.png differ diff --git a/content-rst/applications/productivity/data_cleaning/data-cleaning-field.png b/content-rst/applications/productivity/data_cleaning/data-cleaning-field.png new file mode 100644 index 000000000..6cae2ebdc Binary files /dev/null and b/content-rst/applications/productivity/data_cleaning/data-cleaning-field.png differ diff --git a/content-rst/applications/productivity/data_cleaning/data-cleaning-recycle-rule.png b/content-rst/applications/productivity/data_cleaning/data-cleaning-recycle-rule.png new file mode 100644 index 000000000..160a95aab Binary files /dev/null and b/content-rst/applications/productivity/data_cleaning/data-cleaning-recycle-rule.png differ diff --git a/content-rst/applications/productivity/data_cleaning/data-cleaning-recycle.png b/content-rst/applications/productivity/data_cleaning/data-cleaning-recycle.png new file mode 100644 index 000000000..5a17cb294 Binary files /dev/null and b/content-rst/applications/productivity/data_cleaning/data-cleaning-recycle.png differ diff --git a/content/applications/productivity/discuss.rst b/content-rst/applications/productivity/discuss.rst similarity index 100% rename from content/applications/productivity/discuss.rst rename to content-rst/applications/productivity/discuss.rst diff --git a/content/applications/productivity/discuss/canned_responses.rst b/content-rst/applications/productivity/discuss/canned_responses.rst similarity index 100% rename from content/applications/productivity/discuss/canned_responses.rst rename to content-rst/applications/productivity/discuss/canned_responses.rst diff --git a/content-rst/applications/productivity/discuss/canned_responses/canned-response-sample.png b/content-rst/applications/productivity/discuss/canned_responses/canned-response-sample.png new file mode 100644 index 000000000..cc83e99f0 Binary files /dev/null and b/content-rst/applications/productivity/discuss/canned_responses/canned-response-sample.png differ diff --git a/content-rst/applications/productivity/discuss/canned_responses/canned-responses-using.png b/content-rst/applications/productivity/discuss/canned_responses/canned-responses-using.png new file mode 100644 index 000000000..6e5f48cb3 Binary files /dev/null and b/content-rst/applications/productivity/discuss/canned_responses/canned-responses-using.png differ diff --git a/content-rst/applications/productivity/discuss/canned_responses/shortcut-substitution.png b/content-rst/applications/productivity/discuss/canned_responses/shortcut-substitution.png new file mode 100644 index 000000000..a44b4bf04 Binary files /dev/null and b/content-rst/applications/productivity/discuss/canned_responses/shortcut-substitution.png differ diff --git a/content/applications/productivity/discuss/chatter.rst b/content-rst/applications/productivity/discuss/chatter.rst similarity index 100% rename from content/applications/productivity/discuss/chatter.rst rename to content-rst/applications/productivity/discuss/chatter.rst diff --git a/content-rst/applications/productivity/discuss/chatter/chatter-activity-icons.png b/content-rst/applications/productivity/discuss/chatter/chatter-activity-icons.png new file mode 100644 index 000000000..9c9e218bf Binary files /dev/null and b/content-rst/applications/productivity/discuss/chatter/chatter-activity-icons.png differ diff --git a/content-rst/applications/productivity/discuss/chatter/chatter-attach-files.png b/content-rst/applications/productivity/discuss/chatter/chatter-attach-files.png new file mode 100644 index 000000000..c6fd201a3 Binary files /dev/null and b/content-rst/applications/productivity/discuss/chatter/chatter-attach-files.png differ diff --git a/content-rst/applications/productivity/discuss/chatter/chatter-completed-activity.png b/content-rst/applications/productivity/discuss/chatter/chatter-completed-activity.png new file mode 100644 index 000000000..b0141fa9e Binary files /dev/null and b/content-rst/applications/productivity/discuss/chatter/chatter-completed-activity.png differ diff --git a/content-rst/applications/productivity/discuss/chatter/chatter-edit-subscription.png b/content-rst/applications/productivity/discuss/chatter/chatter-edit-subscription.png new file mode 100644 index 000000000..6cf436148 Binary files /dev/null and b/content-rst/applications/productivity/discuss/chatter/chatter-edit-subscription.png differ diff --git a/content-rst/applications/productivity/discuss/chatter/chatter-edit.png b/content-rst/applications/productivity/discuss/chatter/chatter-edit.png new file mode 100644 index 000000000..3e82745c2 Binary files /dev/null and b/content-rst/applications/productivity/discuss/chatter/chatter-edit.png differ diff --git a/content-rst/applications/productivity/discuss/chatter/chatter-expand-icon.png b/content-rst/applications/productivity/discuss/chatter/chatter-expand-icon.png new file mode 100644 index 000000000..5f35e478e Binary files /dev/null and b/content-rst/applications/productivity/discuss/chatter/chatter-expand-icon.png differ diff --git a/content-rst/applications/productivity/discuss/chatter/chatter-full-composer.png b/content-rst/applications/productivity/discuss/chatter/chatter-full-composer.png new file mode 100644 index 000000000..7ac0c604f Binary files /dev/null and b/content-rst/applications/productivity/discuss/chatter/chatter-full-composer.png differ diff --git a/content-rst/applications/productivity/discuss/chatter/chatter-search.png b/content-rst/applications/productivity/discuss/chatter/chatter-search.png new file mode 100644 index 000000000..a8cf0657c Binary files /dev/null and b/content-rst/applications/productivity/discuss/chatter/chatter-search.png differ diff --git a/content-rst/applications/productivity/discuss/chatter/chatter-thread-email-update.png b/content-rst/applications/productivity/discuss/chatter/chatter-thread-email-update.png new file mode 100644 index 000000000..1ca8be40c Binary files /dev/null and b/content-rst/applications/productivity/discuss/chatter/chatter-thread-email-update.png differ diff --git a/content-rst/applications/productivity/discuss/chatter/chatter-translate-message.png b/content-rst/applications/productivity/discuss/chatter/chatter-translate-message.png new file mode 100644 index 000000000..211a762a6 Binary files /dev/null and b/content-rst/applications/productivity/discuss/chatter/chatter-translate-message.png differ diff --git a/content-rst/applications/productivity/discuss/chatter/odoo-bot-created.png b/content-rst/applications/productivity/discuss/chatter/odoo-bot-created.png new file mode 100644 index 000000000..2e4eb89a1 Binary files /dev/null and b/content-rst/applications/productivity/discuss/chatter/odoo-bot-created.png differ diff --git a/content-rst/applications/productivity/discuss/chatter/planned-activity-details.png b/content-rst/applications/productivity/discuss/chatter/planned-activity-details.png new file mode 100644 index 000000000..1f8d0def5 Binary files /dev/null and b/content-rst/applications/productivity/discuss/chatter/planned-activity-details.png differ diff --git a/content-rst/applications/productivity/discuss/chatter/send-message-followers.png b/content-rst/applications/productivity/discuss/chatter/send-message-followers.png new file mode 100644 index 000000000..ae85aff71 Binary files /dev/null and b/content-rst/applications/productivity/discuss/chatter/send-message-followers.png differ diff --git a/content-rst/applications/productivity/discuss/chatter/whats-app-message.png b/content-rst/applications/productivity/discuss/chatter/whats-app-message.png new file mode 100644 index 000000000..1fc413e79 Binary files /dev/null and b/content-rst/applications/productivity/discuss/chatter/whats-app-message.png differ diff --git a/content-rst/applications/productivity/discuss/conversation-actions.png b/content-rst/applications/productivity/discuss/conversation-actions.png new file mode 100644 index 000000000..d09ad0459 Binary files /dev/null and b/content-rst/applications/productivity/discuss/conversation-actions.png differ diff --git a/content-rst/applications/productivity/discuss/discuss-in-other-apps.png b/content-rst/applications/productivity/discuss/discuss-in-other-apps.png new file mode 100644 index 000000000..26730543c Binary files /dev/null and b/content-rst/applications/productivity/discuss/discuss-in-other-apps.png differ diff --git a/content/applications/productivity/discuss/ice_servers.rst b/content-rst/applications/productivity/discuss/ice_servers.rst similarity index 100% rename from content/applications/productivity/discuss/ice_servers.rst rename to content-rst/applications/productivity/discuss/ice_servers.rst diff --git a/content-rst/applications/productivity/discuss/ice_servers/connect-twilio-to-odoo.png b/content-rst/applications/productivity/discuss/ice_servers/connect-twilio-to-odoo.png new file mode 100644 index 000000000..e8e5a5e1e Binary files /dev/null and b/content-rst/applications/productivity/discuss/ice_servers/connect-twilio-to-odoo.png differ diff --git a/content-rst/applications/productivity/discuss/ice_servers/custom-ice-servers-list.png b/content-rst/applications/productivity/discuss/ice_servers/custom-ice-servers-list.png new file mode 100644 index 000000000..43c760555 Binary files /dev/null and b/content-rst/applications/productivity/discuss/ice_servers/custom-ice-servers-list.png differ diff --git a/content-rst/applications/productivity/discuss/ice_servers/ice-servers-page.png b/content-rst/applications/productivity/discuss/ice_servers/ice-servers-page.png new file mode 100644 index 000000000..f0bef0ca3 Binary files /dev/null and b/content-rst/applications/productivity/discuss/ice_servers/ice-servers-page.png differ diff --git a/content-rst/applications/productivity/discuss/ice_servers/twilio-acct-info.png b/content-rst/applications/productivity/discuss/ice_servers/twilio-acct-info.png new file mode 100644 index 000000000..90d0cbd42 Binary files /dev/null and b/content-rst/applications/productivity/discuss/ice_servers/twilio-acct-info.png differ diff --git a/content-rst/applications/productivity/discuss/ice_servers/twilio-welcome.png b/content-rst/applications/productivity/discuss/ice_servers/twilio-welcome.png new file mode 100644 index 000000000..c8f37fe59 Binary files /dev/null and b/content-rst/applications/productivity/discuss/ice_servers/twilio-welcome.png differ diff --git a/content-rst/applications/productivity/discuss/meeting.png b/content-rst/applications/productivity/discuss/meeting.png new file mode 100644 index 000000000..f7ad57db6 Binary files /dev/null and b/content-rst/applications/productivity/discuss/meeting.png differ diff --git a/content-rst/applications/productivity/discuss/preferences-user.png b/content-rst/applications/productivity/discuss/preferences-user.png new file mode 100644 index 000000000..fb046e433 Binary files /dev/null and b/content-rst/applications/productivity/discuss/preferences-user.png differ diff --git a/content/applications/productivity/discuss/team_communication.rst b/content-rst/applications/productivity/discuss/team_communication.rst similarity index 100% rename from content/applications/productivity/discuss/team_communication.rst rename to content-rst/applications/productivity/discuss/team_communication.rst diff --git a/content-rst/applications/productivity/discuss/team_communication/channel-settings.png b/content-rst/applications/productivity/discuss/team_communication/channel-settings.png new file mode 100644 index 000000000..4be7b73da Binary files /dev/null and b/content-rst/applications/productivity/discuss/team_communication/channel-settings.png differ diff --git a/content-rst/applications/productivity/discuss/team_communication/chatter-channel.png b/content-rst/applications/productivity/discuss/team_communication/chatter-channel.png new file mode 100644 index 000000000..57263927a Binary files /dev/null and b/content-rst/applications/productivity/discuss/team_communication/chatter-channel.png differ diff --git a/content-rst/applications/productivity/discuss/team_communication/filter.png b/content-rst/applications/productivity/discuss/team_communication/filter.png new file mode 100644 index 000000000..0eb4e8355 Binary files /dev/null and b/content-rst/applications/productivity/discuss/team_communication/filter.png differ diff --git a/content-rst/applications/productivity/discuss/team_communication/invite-channel.png b/content-rst/applications/productivity/discuss/team_communication/invite-channel.png new file mode 100644 index 000000000..f564aead8 Binary files /dev/null and b/content-rst/applications/productivity/discuss/team_communication/invite-channel.png differ diff --git a/content-rst/applications/productivity/discuss/team_communication/public-private-channel.png b/content-rst/applications/productivity/discuss/team_communication/public-private-channel.png new file mode 100644 index 000000000..28d528ec7 Binary files /dev/null and b/content-rst/applications/productivity/discuss/team_communication/public-private-channel.png differ diff --git a/content-rst/applications/productivity/discuss/team_communication/quick-search.png b/content-rst/applications/productivity/discuss/team_communication/quick-search.png new file mode 100644 index 000000000..a77ed9938 Binary files /dev/null and b/content-rst/applications/productivity/discuss/team_communication/quick-search.png differ diff --git a/content/applications/productivity/documents.rst b/content-rst/applications/productivity/documents.rst similarity index 100% rename from content/applications/productivity/documents.rst rename to content-rst/applications/productivity/documents.rst diff --git a/content-rst/applications/productivity/documents/accounting-files-centralization.png b/content-rst/applications/productivity/documents/accounting-files-centralization.png new file mode 100644 index 000000000..37de139a7 Binary files /dev/null and b/content-rst/applications/productivity/documents/accounting-files-centralization.png differ diff --git a/content-rst/applications/productivity/documents/basic-condition-example.png b/content-rst/applications/productivity/documents/basic-condition-example.png new file mode 100644 index 000000000..e448c7cfd Binary files /dev/null and b/content-rst/applications/productivity/documents/basic-condition-example.png differ diff --git a/content-rst/applications/productivity/documents/domain-condition-example.png b/content-rst/applications/productivity/documents/domain-condition-example.png new file mode 100644 index 000000000..9664c27d3 Binary files /dev/null and b/content-rst/applications/productivity/documents/domain-condition-example.png differ diff --git a/content-rst/applications/productivity/documents/files-centralization.png b/content-rst/applications/productivity/documents/files-centralization.png new file mode 100644 index 000000000..75df9ecaa Binary files /dev/null and b/content-rst/applications/productivity/documents/files-centralization.png differ diff --git a/content-rst/applications/productivity/documents/reminder-email.png b/content-rst/applications/productivity/documents/reminder-email.png new file mode 100644 index 000000000..45644b63f Binary files /dev/null and b/content-rst/applications/productivity/documents/reminder-email.png differ diff --git a/content-rst/applications/productivity/documents/split-pdf.png b/content-rst/applications/productivity/documents/split-pdf.png new file mode 100644 index 000000000..ae4bedcc2 Binary files /dev/null and b/content-rst/applications/productivity/documents/split-pdf.png differ diff --git a/content/applications/productivity/knowledge.rst b/content-rst/applications/productivity/knowledge.rst similarity index 100% rename from content/applications/productivity/knowledge.rst rename to content-rst/applications/productivity/knowledge.rst diff --git a/content/applications/productivity/knowledge/articles_editing.rst b/content-rst/applications/productivity/knowledge/articles_editing.rst similarity index 100% rename from content/applications/productivity/knowledge/articles_editing.rst rename to content-rst/applications/productivity/knowledge/articles_editing.rst diff --git a/content-rst/applications/productivity/knowledge/articles_editing/inserted-view.png b/content-rst/applications/productivity/knowledge/articles_editing/inserted-view.png new file mode 100644 index 000000000..f50cc424f Binary files /dev/null and b/content-rst/applications/productivity/knowledge/articles_editing/inserted-view.png differ diff --git a/content-rst/applications/productivity/knowledge/articles_editing/style-and-colors.png b/content-rst/applications/productivity/knowledge/articles_editing/style-and-colors.png new file mode 100644 index 000000000..d8103e9c1 Binary files /dev/null and b/content-rst/applications/productivity/knowledge/articles_editing/style-and-colors.png differ diff --git a/content-rst/applications/productivity/knowledge/articles_editing/ui.png b/content-rst/applications/productivity/knowledge/articles_editing/ui.png new file mode 100644 index 000000000..9054dcf80 Binary files /dev/null and b/content-rst/applications/productivity/knowledge/articles_editing/ui.png differ diff --git a/content/applications/productivity/knowledge/management.rst b/content-rst/applications/productivity/knowledge/management.rst similarity index 100% rename from content/applications/productivity/knowledge/management.rst rename to content-rst/applications/productivity/knowledge/management.rst diff --git a/content-rst/applications/productivity/knowledge/management/invite.png b/content-rst/applications/productivity/knowledge/management/invite.png new file mode 100644 index 000000000..c35be8086 Binary files /dev/null and b/content-rst/applications/productivity/knowledge/management/invite.png differ diff --git a/content-rst/applications/productivity/knowledge/management/left-sidebar-cat.png b/content-rst/applications/productivity/knowledge/management/left-sidebar-cat.png new file mode 100644 index 000000000..dbde6c803 Binary files /dev/null and b/content-rst/applications/productivity/knowledge/management/left-sidebar-cat.png differ diff --git a/content-rst/applications/productivity/knowledge/management/share-menu.png b/content-rst/applications/productivity/knowledge/management/share-menu.png new file mode 100644 index 000000000..69fa26d48 Binary files /dev/null and b/content-rst/applications/productivity/knowledge/management/share-menu.png differ diff --git a/content-rst/applications/productivity/knowledge/management/toolbox.png b/content-rst/applications/productivity/knowledge/management/toolbox.png new file mode 100644 index 000000000..af9bcc30a Binary files /dev/null and b/content-rst/applications/productivity/knowledge/management/toolbox.png differ diff --git a/content/applications/productivity/knowledge/properties.rst b/content-rst/applications/productivity/knowledge/properties.rst similarity index 100% rename from content/applications/productivity/knowledge/properties.rst rename to content-rst/applications/productivity/knowledge/properties.rst diff --git a/content-rst/applications/productivity/knowledge/properties/fields.png b/content-rst/applications/productivity/knowledge/properties/fields.png new file mode 100644 index 000000000..3718a800b Binary files /dev/null and b/content-rst/applications/productivity/knowledge/properties/fields.png differ diff --git a/content-rst/applications/productivity/knowledge/properties/manyone.png b/content-rst/applications/productivity/knowledge/properties/manyone.png new file mode 100644 index 000000000..8a3766dfb Binary files /dev/null and b/content-rst/applications/productivity/knowledge/properties/manyone.png differ diff --git a/content/applications/productivity/sign.rst b/content-rst/applications/productivity/sign.rst similarity index 100% rename from content/applications/productivity/sign.rst rename to content-rst/applications/productivity/sign.rst diff --git a/content/applications/productivity/sign/algeria.rst b/content-rst/applications/productivity/sign/algeria.rst similarity index 100% rename from content/applications/productivity/sign/algeria.rst rename to content-rst/applications/productivity/sign/algeria.rst diff --git a/content/applications/productivity/sign/angola.rst b/content-rst/applications/productivity/sign/angola.rst similarity index 100% rename from content/applications/productivity/sign/angola.rst rename to content-rst/applications/productivity/sign/angola.rst diff --git a/content/applications/productivity/sign/argentina.rst b/content-rst/applications/productivity/sign/argentina.rst similarity index 100% rename from content/applications/productivity/sign/argentina.rst rename to content-rst/applications/productivity/sign/argentina.rst diff --git a/content/applications/productivity/sign/australia.rst b/content-rst/applications/productivity/sign/australia.rst similarity index 100% rename from content/applications/productivity/sign/australia.rst rename to content-rst/applications/productivity/sign/australia.rst diff --git a/content/applications/productivity/sign/azerbaijan.rst b/content-rst/applications/productivity/sign/azerbaijan.rst similarity index 100% rename from content/applications/productivity/sign/azerbaijan.rst rename to content-rst/applications/productivity/sign/azerbaijan.rst diff --git a/content/applications/productivity/sign/bangladesh.rst b/content-rst/applications/productivity/sign/bangladesh.rst similarity index 100% rename from content/applications/productivity/sign/bangladesh.rst rename to content-rst/applications/productivity/sign/bangladesh.rst diff --git a/content/applications/productivity/sign/brazil.rst b/content-rst/applications/productivity/sign/brazil.rst similarity index 100% rename from content/applications/productivity/sign/brazil.rst rename to content-rst/applications/productivity/sign/brazil.rst diff --git a/content/applications/productivity/sign/canada.rst b/content-rst/applications/productivity/sign/canada.rst similarity index 100% rename from content/applications/productivity/sign/canada.rst rename to content-rst/applications/productivity/sign/canada.rst diff --git a/content/applications/productivity/sign/chile.rst b/content-rst/applications/productivity/sign/chile.rst similarity index 100% rename from content/applications/productivity/sign/chile.rst rename to content-rst/applications/productivity/sign/chile.rst diff --git a/content/applications/productivity/sign/china.rst b/content-rst/applications/productivity/sign/china.rst similarity index 100% rename from content/applications/productivity/sign/china.rst rename to content-rst/applications/productivity/sign/china.rst diff --git a/content/applications/productivity/sign/colombia.rst b/content-rst/applications/productivity/sign/colombia.rst similarity index 100% rename from content/applications/productivity/sign/colombia.rst rename to content-rst/applications/productivity/sign/colombia.rst diff --git a/content/applications/productivity/sign/dominican_republic.rst b/content-rst/applications/productivity/sign/dominican_republic.rst similarity index 100% rename from content/applications/productivity/sign/dominican_republic.rst rename to content-rst/applications/productivity/sign/dominican_republic.rst diff --git a/content/applications/productivity/sign/ecuador.rst b/content-rst/applications/productivity/sign/ecuador.rst similarity index 100% rename from content/applications/productivity/sign/ecuador.rst rename to content-rst/applications/productivity/sign/ecuador.rst diff --git a/content/applications/productivity/sign/egypt.rst b/content-rst/applications/productivity/sign/egypt.rst similarity index 100% rename from content/applications/productivity/sign/egypt.rst rename to content-rst/applications/productivity/sign/egypt.rst diff --git a/content/applications/productivity/sign/ethiopia.rst b/content-rst/applications/productivity/sign/ethiopia.rst similarity index 100% rename from content/applications/productivity/sign/ethiopia.rst rename to content-rst/applications/productivity/sign/ethiopia.rst diff --git a/content/applications/productivity/sign/germany.rst b/content-rst/applications/productivity/sign/germany.rst similarity index 100% rename from content/applications/productivity/sign/germany.rst rename to content-rst/applications/productivity/sign/germany.rst diff --git a/content/applications/productivity/sign/guatemala.rst b/content-rst/applications/productivity/sign/guatemala.rst similarity index 100% rename from content/applications/productivity/sign/guatemala.rst rename to content-rst/applications/productivity/sign/guatemala.rst diff --git a/content/applications/productivity/sign/hong_kong.rst b/content-rst/applications/productivity/sign/hong_kong.rst similarity index 100% rename from content/applications/productivity/sign/hong_kong.rst rename to content-rst/applications/productivity/sign/hong_kong.rst diff --git a/content/applications/productivity/sign/india.rst b/content-rst/applications/productivity/sign/india.rst similarity index 100% rename from content/applications/productivity/sign/india.rst rename to content-rst/applications/productivity/sign/india.rst diff --git a/content/applications/productivity/sign/indonesia.rst b/content-rst/applications/productivity/sign/indonesia.rst similarity index 100% rename from content/applications/productivity/sign/indonesia.rst rename to content-rst/applications/productivity/sign/indonesia.rst diff --git a/content/applications/productivity/sign/iran.rst b/content-rst/applications/productivity/sign/iran.rst similarity index 100% rename from content/applications/productivity/sign/iran.rst rename to content-rst/applications/productivity/sign/iran.rst diff --git a/content/applications/productivity/sign/iraq.rst b/content-rst/applications/productivity/sign/iraq.rst similarity index 100% rename from content/applications/productivity/sign/iraq.rst rename to content-rst/applications/productivity/sign/iraq.rst diff --git a/content/applications/productivity/sign/israel.rst b/content-rst/applications/productivity/sign/israel.rst similarity index 100% rename from content/applications/productivity/sign/israel.rst rename to content-rst/applications/productivity/sign/israel.rst diff --git a/content-rst/applications/productivity/sign/itsme-identification.png b/content-rst/applications/productivity/sign/itsme-identification.png new file mode 100644 index 000000000..97dd7e6b3 Binary files /dev/null and b/content-rst/applications/productivity/sign/itsme-identification.png differ diff --git a/content/applications/productivity/sign/japan.rst b/content-rst/applications/productivity/sign/japan.rst similarity index 100% rename from content/applications/productivity/sign/japan.rst rename to content-rst/applications/productivity/sign/japan.rst diff --git a/content/applications/productivity/sign/kazakhstan.rst b/content-rst/applications/productivity/sign/kazakhstan.rst similarity index 100% rename from content/applications/productivity/sign/kazakhstan.rst rename to content-rst/applications/productivity/sign/kazakhstan.rst diff --git a/content/applications/productivity/sign/kenya.rst b/content-rst/applications/productivity/sign/kenya.rst similarity index 100% rename from content/applications/productivity/sign/kenya.rst rename to content-rst/applications/productivity/sign/kenya.rst diff --git a/content/applications/productivity/sign/kuwait.rst b/content-rst/applications/productivity/sign/kuwait.rst similarity index 100% rename from content/applications/productivity/sign/kuwait.rst rename to content-rst/applications/productivity/sign/kuwait.rst diff --git a/content/applications/productivity/sign/malaysia.rst b/content-rst/applications/productivity/sign/malaysia.rst similarity index 100% rename from content/applications/productivity/sign/malaysia.rst rename to content-rst/applications/productivity/sign/malaysia.rst diff --git a/content/applications/productivity/sign/mexico.rst b/content-rst/applications/productivity/sign/mexico.rst similarity index 100% rename from content/applications/productivity/sign/mexico.rst rename to content-rst/applications/productivity/sign/mexico.rst diff --git a/content/applications/productivity/sign/morocco.rst b/content-rst/applications/productivity/sign/morocco.rst similarity index 100% rename from content/applications/productivity/sign/morocco.rst rename to content-rst/applications/productivity/sign/morocco.rst diff --git a/content/applications/productivity/sign/new_zealand.rst b/content-rst/applications/productivity/sign/new_zealand.rst similarity index 100% rename from content/applications/productivity/sign/new_zealand.rst rename to content-rst/applications/productivity/sign/new_zealand.rst diff --git a/content/applications/productivity/sign/nigeria.rst b/content-rst/applications/productivity/sign/nigeria.rst similarity index 100% rename from content/applications/productivity/sign/nigeria.rst rename to content-rst/applications/productivity/sign/nigeria.rst diff --git a/content/applications/productivity/sign/norway.rst b/content-rst/applications/productivity/sign/norway.rst similarity index 100% rename from content/applications/productivity/sign/norway.rst rename to content-rst/applications/productivity/sign/norway.rst diff --git a/content/applications/productivity/sign/oman.rst b/content-rst/applications/productivity/sign/oman.rst similarity index 100% rename from content/applications/productivity/sign/oman.rst rename to content-rst/applications/productivity/sign/oman.rst diff --git a/content/applications/productivity/sign/pakistan.rst b/content-rst/applications/productivity/sign/pakistan.rst similarity index 100% rename from content/applications/productivity/sign/pakistan.rst rename to content-rst/applications/productivity/sign/pakistan.rst diff --git a/content/applications/productivity/sign/peru.rst b/content-rst/applications/productivity/sign/peru.rst similarity index 100% rename from content/applications/productivity/sign/peru.rst rename to content-rst/applications/productivity/sign/peru.rst diff --git a/content/applications/productivity/sign/philippines.rst b/content-rst/applications/productivity/sign/philippines.rst similarity index 100% rename from content/applications/productivity/sign/philippines.rst rename to content-rst/applications/productivity/sign/philippines.rst diff --git a/content/applications/productivity/sign/qatar.rst b/content-rst/applications/productivity/sign/qatar.rst similarity index 100% rename from content/applications/productivity/sign/qatar.rst rename to content-rst/applications/productivity/sign/qatar.rst diff --git a/content-rst/applications/productivity/sign/reminder.png b/content-rst/applications/productivity/sign/reminder.png new file mode 100644 index 000000000..796e2b218 Binary files /dev/null and b/content-rst/applications/productivity/sign/reminder.png differ diff --git a/content/applications/productivity/sign/russia.rst b/content-rst/applications/productivity/sign/russia.rst similarity index 100% rename from content/applications/productivity/sign/russia.rst rename to content-rst/applications/productivity/sign/russia.rst diff --git a/content/applications/productivity/sign/saudi_arabia.rst b/content-rst/applications/productivity/sign/saudi_arabia.rst similarity index 100% rename from content/applications/productivity/sign/saudi_arabia.rst rename to content-rst/applications/productivity/sign/saudi_arabia.rst diff --git a/content-rst/applications/productivity/sign/sign-hash.png b/content-rst/applications/productivity/sign/sign-hash.png new file mode 100644 index 000000000..74d276915 Binary files /dev/null and b/content-rst/applications/productivity/sign/sign-hash.png differ diff --git a/content-rst/applications/productivity/sign/signature-status.png b/content-rst/applications/productivity/sign/signature-status.png new file mode 100644 index 000000000..e301b7c78 Binary files /dev/null and b/content-rst/applications/productivity/sign/signature-status.png differ diff --git a/content/applications/productivity/sign/singapore.rst b/content-rst/applications/productivity/sign/singapore.rst similarity index 100% rename from content/applications/productivity/sign/singapore.rst rename to content-rst/applications/productivity/sign/singapore.rst diff --git a/content-rst/applications/productivity/sign/sms-verification.png b/content-rst/applications/productivity/sign/sms-verification.png new file mode 100644 index 000000000..aeca67515 Binary files /dev/null and b/content-rst/applications/productivity/sign/sms-verification.png differ diff --git a/content/applications/productivity/sign/south_africa.rst b/content-rst/applications/productivity/sign/south_africa.rst similarity index 100% rename from content/applications/productivity/sign/south_africa.rst rename to content-rst/applications/productivity/sign/south_africa.rst diff --git a/content/applications/productivity/sign/south_korea.rst b/content-rst/applications/productivity/sign/south_korea.rst similarity index 100% rename from content/applications/productivity/sign/south_korea.rst rename to content-rst/applications/productivity/sign/south_korea.rst diff --git a/content-rst/applications/productivity/sign/specify-signing-order.png b/content-rst/applications/productivity/sign/specify-signing-order.png new file mode 100644 index 000000000..54a1ef817 Binary files /dev/null and b/content-rst/applications/productivity/sign/specify-signing-order.png differ diff --git a/content/applications/productivity/sign/switzerland.rst b/content-rst/applications/productivity/sign/switzerland.rst similarity index 100% rename from content/applications/productivity/sign/switzerland.rst rename to content-rst/applications/productivity/sign/switzerland.rst diff --git a/content/applications/productivity/sign/thailand.rst b/content-rst/applications/productivity/sign/thailand.rst similarity index 100% rename from content/applications/productivity/sign/thailand.rst rename to content-rst/applications/productivity/sign/thailand.rst diff --git a/content-rst/applications/productivity/sign/tip-placeholder.png b/content-rst/applications/productivity/sign/tip-placeholder.png new file mode 100644 index 000000000..d9093d1b9 Binary files /dev/null and b/content-rst/applications/productivity/sign/tip-placeholder.png differ diff --git a/content/applications/productivity/sign/turkey.rst b/content-rst/applications/productivity/sign/turkey.rst similarity index 100% rename from content/applications/productivity/sign/turkey.rst rename to content-rst/applications/productivity/sign/turkey.rst diff --git a/content/applications/productivity/sign/ukraine.rst b/content-rst/applications/productivity/sign/ukraine.rst similarity index 100% rename from content/applications/productivity/sign/ukraine.rst rename to content-rst/applications/productivity/sign/ukraine.rst diff --git a/content/applications/productivity/sign/united_arab_emirates.rst b/content-rst/applications/productivity/sign/united_arab_emirates.rst similarity index 100% rename from content/applications/productivity/sign/united_arab_emirates.rst rename to content-rst/applications/productivity/sign/united_arab_emirates.rst diff --git a/content/applications/productivity/sign/united_kingdom.rst b/content-rst/applications/productivity/sign/united_kingdom.rst similarity index 100% rename from content/applications/productivity/sign/united_kingdom.rst rename to content-rst/applications/productivity/sign/united_kingdom.rst diff --git a/content/applications/productivity/sign/uzbekistan.rst b/content-rst/applications/productivity/sign/uzbekistan.rst similarity index 100% rename from content/applications/productivity/sign/uzbekistan.rst rename to content-rst/applications/productivity/sign/uzbekistan.rst diff --git a/content/applications/productivity/sign/vietnam.rst b/content-rst/applications/productivity/sign/vietnam.rst similarity index 100% rename from content/applications/productivity/sign/vietnam.rst rename to content-rst/applications/productivity/sign/vietnam.rst diff --git a/content/applications/productivity/spreadsheet.rst b/content-rst/applications/productivity/spreadsheet.rst similarity index 100% rename from content/applications/productivity/spreadsheet.rst rename to content-rst/applications/productivity/spreadsheet.rst diff --git a/content/applications/productivity/spreadsheet/functions.rst b/content-rst/applications/productivity/spreadsheet/functions.rst similarity index 100% rename from content/applications/productivity/spreadsheet/functions.rst rename to content-rst/applications/productivity/spreadsheet/functions.rst diff --git a/content/applications/productivity/spreadsheet/global_filters.rst b/content-rst/applications/productivity/spreadsheet/global_filters.rst similarity index 100% rename from content/applications/productivity/spreadsheet/global_filters.rst rename to content-rst/applications/productivity/spreadsheet/global_filters.rst diff --git a/content-rst/applications/productivity/spreadsheet/global_filters/date-period-offset.png b/content-rst/applications/productivity/spreadsheet/global_filters/date-period-offset.png new file mode 100644 index 000000000..4338694b7 Binary files /dev/null and b/content-rst/applications/productivity/spreadsheet/global_filters/date-period-offset.png differ diff --git a/content-rst/applications/productivity/spreadsheet/global_filters/global-filters-menu.png b/content-rst/applications/productivity/spreadsheet/global_filters/global-filters-menu.png new file mode 100644 index 000000000..a6e78e9bc Binary files /dev/null and b/content-rst/applications/productivity/spreadsheet/global_filters/global-filters-menu.png differ diff --git a/content-rst/applications/productivity/spreadsheet/global_filters/relation-contact.png b/content-rst/applications/productivity/spreadsheet/global_filters/relation-contact.png new file mode 100644 index 000000000..10cb205ff Binary files /dev/null and b/content-rst/applications/productivity/spreadsheet/global_filters/relation-contact.png differ diff --git a/content-rst/applications/productivity/spreadsheet/global_filters/text-values.png b/content-rst/applications/productivity/spreadsheet/global_filters/text-values.png new file mode 100644 index 000000000..153f06825 Binary files /dev/null and b/content-rst/applications/productivity/spreadsheet/global_filters/text-values.png differ diff --git a/content/applications/productivity/spreadsheet/insert.rst b/content-rst/applications/productivity/spreadsheet/insert.rst similarity index 100% rename from content/applications/productivity/spreadsheet/insert.rst rename to content-rst/applications/productivity/spreadsheet/insert.rst diff --git a/content-rst/applications/productivity/spreadsheet/insert/insert-spreadsheet.png b/content-rst/applications/productivity/spreadsheet/insert/insert-spreadsheet.png new file mode 100644 index 000000000..b6359ce59 Binary files /dev/null and b/content-rst/applications/productivity/spreadsheet/insert/insert-spreadsheet.png differ diff --git a/content-rst/applications/productivity/spreadsheet/insert/missing-cells.png b/content-rst/applications/productivity/spreadsheet/insert/missing-cells.png new file mode 100644 index 000000000..08a538b50 Binary files /dev/null and b/content-rst/applications/productivity/spreadsheet/insert/missing-cells.png differ diff --git a/content/applications/productivity/spreadsheet/templates.rst b/content-rst/applications/productivity/spreadsheet/templates.rst similarity index 100% rename from content/applications/productivity/spreadsheet/templates.rst rename to content-rst/applications/productivity/spreadsheet/templates.rst diff --git a/content-rst/applications/productivity/spreadsheet/ui-elements.png b/content-rst/applications/productivity/spreadsheet/ui-elements.png new file mode 100644 index 000000000..618ec00cf Binary files /dev/null and b/content-rst/applications/productivity/spreadsheet/ui-elements.png differ diff --git a/content/applications/productivity/to_do.rst b/content-rst/applications/productivity/to_do.rst similarity index 100% rename from content/applications/productivity/to_do.rst rename to content-rst/applications/productivity/to_do.rst diff --git a/content-rst/applications/productivity/to_do/add-on-the-fly.png b/content-rst/applications/productivity/to_do/add-on-the-fly.png new file mode 100644 index 000000000..2df4758ca Binary files /dev/null and b/content-rst/applications/productivity/to_do/add-on-the-fly.png differ diff --git a/content-rst/applications/productivity/to_do/convert-task-button.png b/content-rst/applications/productivity/to_do/convert-task-button.png new file mode 100644 index 000000000..016985661 Binary files /dev/null and b/content-rst/applications/productivity/to_do/convert-task-button.png differ diff --git a/content-rst/applications/productivity/to_do/my-task-pipeline.png b/content-rst/applications/productivity/to_do/my-task-pipeline.png new file mode 100644 index 000000000..600b5353f Binary files /dev/null and b/content-rst/applications/productivity/to_do/my-task-pipeline.png differ diff --git a/content-rst/applications/productivity/to_do/schedule-activity.png b/content-rst/applications/productivity/to_do/schedule-activity.png new file mode 100644 index 000000000..f7ea734c1 Binary files /dev/null and b/content-rst/applications/productivity/to_do/schedule-activity.png differ diff --git a/content-rst/applications/productivity/to_do/stage-options.png b/content-rst/applications/productivity/to_do/stage-options.png new file mode 100644 index 000000000..96eb4b699 Binary files /dev/null and b/content-rst/applications/productivity/to_do/stage-options.png differ diff --git a/content-rst/applications/productivity/to_do/to-do-pipeline.png b/content-rst/applications/productivity/to_do/to-do-pipeline.png new file mode 100644 index 000000000..581c1e393 Binary files /dev/null and b/content-rst/applications/productivity/to_do/to-do-pipeline.png differ diff --git a/content/applications/productivity/voip.rst b/content-rst/applications/productivity/voip.rst similarity index 100% rename from content/applications/productivity/voip.rst rename to content-rst/applications/productivity/voip.rst diff --git a/content/applications/productivity/voip/axivox.rst b/content-rst/applications/productivity/voip/axivox.rst similarity index 100% rename from content/applications/productivity/voip/axivox.rst rename to content-rst/applications/productivity/voip/axivox.rst diff --git a/content/applications/productivity/voip/axivox/axivox_config.rst b/content-rst/applications/productivity/voip/axivox/axivox_config.rst similarity index 100% rename from content/applications/productivity/voip/axivox/axivox_config.rst rename to content-rst/applications/productivity/voip/axivox/axivox_config.rst diff --git a/content-rst/applications/productivity/voip/axivox/axivox_config/manager-sip.png b/content-rst/applications/productivity/voip/axivox/axivox_config/manager-sip.png new file mode 100644 index 000000000..a37fbb185 Binary files /dev/null and b/content-rst/applications/productivity/voip/axivox/axivox_config/manager-sip.png differ diff --git a/content-rst/applications/productivity/voip/axivox/axivox_config/odoo-user.png b/content-rst/applications/productivity/voip/axivox/axivox_config/odoo-user.png new file mode 100644 index 000000000..4fc0e393d Binary files /dev/null and b/content-rst/applications/productivity/voip/axivox/axivox_config/odoo-user.png differ diff --git a/content-rst/applications/productivity/voip/axivox/axivox_config/voip-configuration.png b/content-rst/applications/productivity/voip/axivox/axivox_config/voip-configuration.png new file mode 100644 index 000000000..3150364a2 Binary files /dev/null and b/content-rst/applications/productivity/voip/axivox/axivox_config/voip-configuration.png differ diff --git a/content/applications/productivity/voip/axivox/call_queues.rst b/content-rst/applications/productivity/voip/axivox/call_queues.rst similarity index 100% rename from content/applications/productivity/voip/axivox/call_queues.rst rename to content-rst/applications/productivity/voip/axivox/call_queues.rst diff --git a/content-rst/applications/productivity/voip/axivox/call_queues/call-queue.png b/content-rst/applications/productivity/voip/axivox/call_queues/call-queue.png new file mode 100644 index 000000000..b8690aafa Binary files /dev/null and b/content-rst/applications/productivity/voip/axivox/call_queues/call-queue.png differ diff --git a/content-rst/applications/productivity/voip/axivox/call_queues/event-type.png b/content-rst/applications/productivity/voip/axivox/call_queues/event-type.png new file mode 100644 index 000000000..f8982c2e9 Binary files /dev/null and b/content-rst/applications/productivity/voip/axivox/call_queues/event-type.png differ diff --git a/content-rst/applications/productivity/voip/axivox/call_queues/report.png b/content-rst/applications/productivity/voip/axivox/call_queues/report.png new file mode 100644 index 000000000..498730982 Binary files /dev/null and b/content-rst/applications/productivity/voip/axivox/call_queues/report.png differ diff --git a/content/applications/productivity/voip/axivox/conference_calls.rst b/content-rst/applications/productivity/voip/axivox/conference_calls.rst similarity index 100% rename from content/applications/productivity/voip/axivox/conference_calls.rst rename to content-rst/applications/productivity/voip/axivox/conference_calls.rst diff --git a/content-rst/applications/productivity/voip/axivox/conference_calls/conference-invite.png b/content-rst/applications/productivity/voip/axivox/conference_calls/conference-invite.png new file mode 100644 index 000000000..10d20d811 Binary files /dev/null and b/content-rst/applications/productivity/voip/axivox/conference_calls/conference-invite.png differ diff --git a/content-rst/applications/productivity/voip/axivox/conference_calls/new-conference.png b/content-rst/applications/productivity/voip/axivox/conference_calls/new-conference.png new file mode 100644 index 000000000..b8a86a991 Binary files /dev/null and b/content-rst/applications/productivity/voip/axivox/conference_calls/new-conference.png differ diff --git a/content-rst/applications/productivity/voip/axivox/conference_calls/phone-widget.png b/content-rst/applications/productivity/voip/axivox/conference_calls/phone-widget.png new file mode 100644 index 000000000..dec0aaa53 Binary files /dev/null and b/content-rst/applications/productivity/voip/axivox/conference_calls/phone-widget.png differ diff --git a/content/applications/productivity/voip/axivox/dial_plan_advanced.rst b/content-rst/applications/productivity/voip/axivox/dial_plan_advanced.rst similarity index 100% rename from content/applications/productivity/voip/axivox/dial_plan_advanced.rst rename to content-rst/applications/productivity/voip/axivox/dial_plan_advanced.rst diff --git a/content-rst/applications/productivity/voip/axivox/dial_plan_advanced/access-config.png b/content-rst/applications/productivity/voip/axivox/dial_plan_advanced/access-config.png new file mode 100644 index 000000000..320b49920 Binary files /dev/null and b/content-rst/applications/productivity/voip/axivox/dial_plan_advanced/access-config.png differ diff --git a/content-rst/applications/productivity/voip/axivox/dial_plan_advanced/access-list.png b/content-rst/applications/productivity/voip/axivox/dial_plan_advanced/access-list.png new file mode 100644 index 000000000..2d14b3f3c Binary files /dev/null and b/content-rst/applications/productivity/voip/axivox/dial_plan_advanced/access-list.png differ diff --git a/content-rst/applications/productivity/voip/axivox/dial_plan_advanced/dispatcher-element.png b/content-rst/applications/productivity/voip/axivox/dial_plan_advanced/dispatcher-element.png new file mode 100644 index 000000000..f8903214a Binary files /dev/null and b/content-rst/applications/productivity/voip/axivox/dial_plan_advanced/dispatcher-element.png differ diff --git a/content-rst/applications/productivity/voip/axivox/dial_plan_advanced/dispatcher.png b/content-rst/applications/productivity/voip/axivox/dial_plan_advanced/dispatcher.png new file mode 100644 index 000000000..9e69a37cc Binary files /dev/null and b/content-rst/applications/productivity/voip/axivox/dial_plan_advanced/dispatcher.png differ diff --git a/content-rst/applications/productivity/voip/axivox/dial_plan_advanced/multi-switch.png b/content-rst/applications/productivity/voip/axivox/dial_plan_advanced/multi-switch.png new file mode 100644 index 000000000..f36a9e212 Binary files /dev/null and b/content-rst/applications/productivity/voip/axivox/dial_plan_advanced/multi-switch.png differ diff --git a/content-rst/applications/productivity/voip/axivox/dial_plan_advanced/receptionist.png b/content-rst/applications/productivity/voip/axivox/dial_plan_advanced/receptionist.png new file mode 100644 index 000000000..6867e7b03 Binary files /dev/null and b/content-rst/applications/productivity/voip/axivox/dial_plan_advanced/receptionist.png differ diff --git a/content-rst/applications/productivity/voip/axivox/dial_plan_advanced/switch.png b/content-rst/applications/productivity/voip/axivox/dial_plan_advanced/switch.png new file mode 100644 index 000000000..38509048c Binary files /dev/null and b/content-rst/applications/productivity/voip/axivox/dial_plan_advanced/switch.png differ diff --git a/content-rst/applications/productivity/voip/axivox/dial_plan_advanced/time-condition.png b/content-rst/applications/productivity/voip/axivox/dial_plan_advanced/time-condition.png new file mode 100644 index 000000000..f8daf4b71 Binary files /dev/null and b/content-rst/applications/productivity/voip/axivox/dial_plan_advanced/time-condition.png differ diff --git a/content-rst/applications/productivity/voip/axivox/dial_plan_advanced/visual-editor.png b/content-rst/applications/productivity/voip/axivox/dial_plan_advanced/visual-editor.png new file mode 100644 index 000000000..cfb7c5e55 Binary files /dev/null and b/content-rst/applications/productivity/voip/axivox/dial_plan_advanced/visual-editor.png differ diff --git a/content/applications/productivity/voip/axivox/dial_plan_basics.rst b/content-rst/applications/productivity/voip/axivox/dial_plan_basics.rst similarity index 100% rename from content/applications/productivity/voip/axivox/dial_plan_basics.rst rename to content-rst/applications/productivity/voip/axivox/dial_plan_basics.rst diff --git a/content-rst/applications/productivity/voip/axivox/dial_plan_basics/basic-scenario.png b/content-rst/applications/productivity/voip/axivox/dial_plan_basics/basic-scenario.png new file mode 100644 index 000000000..7c1405d0e Binary files /dev/null and b/content-rst/applications/productivity/voip/axivox/dial_plan_basics/basic-scenario.png differ diff --git a/content-rst/applications/productivity/voip/axivox/dial_plan_basics/dial-plan-edits.png b/content-rst/applications/productivity/voip/axivox/dial_plan_basics/dial-plan-edits.png new file mode 100644 index 000000000..25dba5030 Binary files /dev/null and b/content-rst/applications/productivity/voip/axivox/dial_plan_basics/dial-plan-edits.png differ diff --git a/content-rst/applications/productivity/voip/axivox/dial_plan_basics/dial-plan-visual.png b/content-rst/applications/productivity/voip/axivox/dial_plan_basics/dial-plan-visual.png new file mode 100644 index 000000000..efac54091 Binary files /dev/null and b/content-rst/applications/productivity/voip/axivox/dial_plan_basics/dial-plan-visual.png differ diff --git a/content-rst/applications/productivity/voip/axivox/dial_plan_basics/loop-back.png b/content-rst/applications/productivity/voip/axivox/dial_plan_basics/loop-back.png new file mode 100644 index 000000000..a7b041f24 Binary files /dev/null and b/content-rst/applications/productivity/voip/axivox/dial_plan_basics/loop-back.png differ diff --git a/content/applications/productivity/voip/axivox/dynamic_caller_id.rst b/content-rst/applications/productivity/voip/axivox/dynamic_caller_id.rst similarity index 100% rename from content/applications/productivity/voip/axivox/dynamic_caller_id.rst rename to content-rst/applications/productivity/voip/axivox/dynamic_caller_id.rst diff --git a/content-rst/applications/productivity/voip/axivox/dynamic_caller_id/advanced-callerid.png b/content-rst/applications/productivity/voip/axivox/dynamic_caller_id/advanced-callerid.png new file mode 100644 index 000000000..805973dd6 Binary files /dev/null and b/content-rst/applications/productivity/voip/axivox/dynamic_caller_id/advanced-callerid.png differ diff --git a/content/applications/productivity/voip/axivox/manage_users.rst b/content-rst/applications/productivity/voip/axivox/manage_users.rst similarity index 100% rename from content/applications/productivity/voip/axivox/manage_users.rst rename to content-rst/applications/productivity/voip/axivox/manage_users.rst diff --git a/content-rst/applications/productivity/voip/axivox/manage_users/follow-me-tab.png b/content-rst/applications/productivity/voip/axivox/manage_users/follow-me-tab.png new file mode 100644 index 000000000..e00f36a07 Binary files /dev/null and b/content-rst/applications/productivity/voip/axivox/manage_users/follow-me-tab.png differ diff --git a/content-rst/applications/productivity/voip/axivox/manage_users/forwardings-tab.png b/content-rst/applications/productivity/voip/axivox/manage_users/forwardings-tab.png new file mode 100644 index 000000000..38fa4ece5 Binary files /dev/null and b/content-rst/applications/productivity/voip/axivox/manage_users/forwardings-tab.png differ diff --git a/content-rst/applications/productivity/voip/axivox/manage_users/general-tab.png b/content-rst/applications/productivity/voip/axivox/manage_users/general-tab.png new file mode 100644 index 000000000..bb9e0b6d2 Binary files /dev/null and b/content-rst/applications/productivity/voip/axivox/manage_users/general-tab.png differ diff --git a/content-rst/applications/productivity/voip/axivox/manage_users/sip-identifiers-tab.png b/content-rst/applications/productivity/voip/axivox/manage_users/sip-identifiers-tab.png new file mode 100644 index 000000000..270789592 Binary files /dev/null and b/content-rst/applications/productivity/voip/axivox/manage_users/sip-identifiers-tab.png differ diff --git a/content-rst/applications/productivity/voip/axivox/manage_users/user-keys.png b/content-rst/applications/productivity/voip/axivox/manage_users/user-keys.png new file mode 100644 index 000000000..f2741af51 Binary files /dev/null and b/content-rst/applications/productivity/voip/axivox/manage_users/user-keys.png differ diff --git a/content-rst/applications/productivity/voip/axivox/manage_users/user-permissions.png b/content-rst/applications/productivity/voip/axivox/manage_users/user-permissions.png new file mode 100644 index 000000000..ab2cf12ff Binary files /dev/null and b/content-rst/applications/productivity/voip/axivox/manage_users/user-permissions.png differ diff --git a/content/applications/productivity/voip/axivox/vm_audio_messages.rst b/content-rst/applications/productivity/voip/axivox/vm_audio_messages.rst similarity index 100% rename from content/applications/productivity/voip/axivox/vm_audio_messages.rst rename to content-rst/applications/productivity/voip/axivox/vm_audio_messages.rst diff --git a/content-rst/applications/productivity/voip/axivox/vm_audio_messages/forwardings.png b/content-rst/applications/productivity/voip/axivox/vm_audio_messages/forwardings.png new file mode 100644 index 000000000..80d208412 Binary files /dev/null and b/content-rst/applications/productivity/voip/axivox/vm_audio_messages/forwardings.png differ diff --git a/content-rst/applications/productivity/voip/axivox/vm_audio_messages/sample-message.png b/content-rst/applications/productivity/voip/axivox/vm_audio_messages/sample-message.png new file mode 100644 index 000000000..1ed4c6ce2 Binary files /dev/null and b/content-rst/applications/productivity/voip/axivox/vm_audio_messages/sample-message.png differ diff --git a/content/applications/productivity/voip/devices_integrations.rst b/content-rst/applications/productivity/voip/devices_integrations.rst similarity index 100% rename from content/applications/productivity/voip/devices_integrations.rst rename to content-rst/applications/productivity/voip/devices_integrations.rst diff --git a/content-rst/applications/productivity/voip/devices_integrations/account-settings-zoiper-group.png b/content-rst/applications/productivity/voip/devices_integrations/account-settings-zoiper-group.png new file mode 100644 index 000000000..783a7c87b Binary files /dev/null and b/content-rst/applications/productivity/voip/devices_integrations/account-settings-zoiper-group.png differ diff --git a/content-rst/applications/productivity/voip/devices_integrations/allow-mic.png b/content-rst/applications/productivity/voip/devices_integrations/allow-mic.png new file mode 100644 index 000000000..d4cacaf01 Binary files /dev/null and b/content-rst/applications/productivity/voip/devices_integrations/allow-mic.png differ diff --git a/content-rst/applications/productivity/voip/devices_integrations/crm-voip-widget.png b/content-rst/applications/productivity/voip/devices_integrations/crm-voip-widget.png new file mode 100644 index 000000000..f66425e73 Binary files /dev/null and b/content-rst/applications/productivity/voip/devices_integrations/crm-voip-widget.png differ diff --git a/content-rst/applications/productivity/voip/devices_integrations/linphone-odoo-setup.png b/content-rst/applications/productivity/voip/devices_integrations/linphone-odoo-setup.png new file mode 100644 index 000000000..257cbba6f Binary files /dev/null and b/content-rst/applications/productivity/voip/devices_integrations/linphone-odoo-setup.png differ diff --git a/content-rst/applications/productivity/voip/devices_integrations/provider-zoiper-odoo.png b/content-rst/applications/productivity/voip/devices_integrations/provider-zoiper-odoo.png new file mode 100644 index 000000000..28a563e92 Binary files /dev/null and b/content-rst/applications/productivity/voip/devices_integrations/provider-zoiper-odoo.png differ diff --git a/content-rst/applications/productivity/voip/devices_integrations/sip-options-zoiper.png b/content-rst/applications/productivity/voip/devices_integrations/sip-options-zoiper.png new file mode 100644 index 000000000..e75c4f582 Binary files /dev/null and b/content-rst/applications/productivity/voip/devices_integrations/sip-options-zoiper.png differ diff --git a/content-rst/applications/productivity/voip/devices_integrations/voip-odoo-dashboard.png b/content-rst/applications/productivity/voip/devices_integrations/voip-odoo-dashboard.png new file mode 100644 index 000000000..eaf99ae49 Binary files /dev/null and b/content-rst/applications/productivity/voip/devices_integrations/voip-odoo-dashboard.png differ diff --git a/content-rst/applications/productivity/voip/devices_integrations/voip-phone.png b/content-rst/applications/productivity/voip/devices_integrations/voip-phone.png new file mode 100644 index 000000000..5b1830022 Binary files /dev/null and b/content-rst/applications/productivity/voip/devices_integrations/voip-phone.png differ diff --git a/content/applications/productivity/voip/onsip.rst b/content-rst/applications/productivity/voip/onsip.rst similarity index 100% rename from content/applications/productivity/voip/onsip.rst rename to content-rst/applications/productivity/voip/onsip.rst diff --git a/content-rst/applications/productivity/voip/onsip/domain-setting.png b/content-rst/applications/productivity/voip/onsip/domain-setting.png new file mode 100644 index 000000000..e20af1754 Binary files /dev/null and b/content-rst/applications/productivity/voip/onsip/domain-setting.png differ diff --git a/content-rst/applications/productivity/voip/onsip/incoming-call.png b/content-rst/applications/productivity/voip/onsip/incoming-call.png new file mode 100644 index 000000000..40c075d13 Binary files /dev/null and b/content-rst/applications/productivity/voip/onsip/incoming-call.png differ diff --git a/content-rst/applications/productivity/voip/onsip/install-onsip.png b/content-rst/applications/productivity/voip/onsip/install-onsip.png new file mode 100644 index 000000000..0e52bc0fa Binary files /dev/null and b/content-rst/applications/productivity/voip/onsip/install-onsip.png differ diff --git a/content-rst/applications/productivity/voip/onsip/onsip04.png b/content-rst/applications/productivity/voip/onsip/onsip04.png new file mode 100644 index 000000000..951515e48 Binary files /dev/null and b/content-rst/applications/productivity/voip/onsip/onsip04.png differ diff --git a/content-rst/applications/productivity/voip/onsip/onsip05.png b/content-rst/applications/productivity/voip/onsip/onsip05.png new file mode 100644 index 000000000..4886db17d Binary files /dev/null and b/content-rst/applications/productivity/voip/onsip/onsip05.png differ diff --git a/content-rst/applications/productivity/voip/onsip/voip-setting.png b/content-rst/applications/productivity/voip/onsip/voip-setting.png new file mode 100644 index 000000000..4c6b583b4 Binary files /dev/null and b/content-rst/applications/productivity/voip/onsip/voip-setting.png differ diff --git a/content/applications/productivity/voip/transfer_forward.rst b/content-rst/applications/productivity/voip/transfer_forward.rst similarity index 100% rename from content/applications/productivity/voip/transfer_forward.rst rename to content-rst/applications/productivity/voip/transfer_forward.rst diff --git a/content-rst/applications/productivity/voip/transfer_forward/add-call-queue.png b/content-rst/applications/productivity/voip/transfer_forward/add-call-queue.png new file mode 100644 index 000000000..b52fffda6 Binary files /dev/null and b/content-rst/applications/productivity/voip/transfer_forward/add-call-queue.png differ diff --git a/content-rst/applications/productivity/voip/transfer_forward/incoming-call.png b/content-rst/applications/productivity/voip/transfer_forward/incoming-call.png new file mode 100644 index 000000000..40c075d13 Binary files /dev/null and b/content-rst/applications/productivity/voip/transfer_forward/incoming-call.png differ diff --git a/content-rst/applications/productivity/voip/transfer_forward/manual-call.png b/content-rst/applications/productivity/voip/transfer_forward/manual-call.png new file mode 100644 index 000000000..0a1340e0e Binary files /dev/null and b/content-rst/applications/productivity/voip/transfer_forward/manual-call.png differ diff --git a/content-rst/applications/productivity/voip/transfer_forward/next-activities.png b/content-rst/applications/productivity/voip/transfer_forward/next-activities.png new file mode 100644 index 000000000..2e936c602 Binary files /dev/null and b/content-rst/applications/productivity/voip/transfer_forward/next-activities.png differ diff --git a/content-rst/applications/productivity/voip/transfer_forward/transfer.png b/content-rst/applications/productivity/voip/transfer_forward/transfer.png new file mode 100644 index 000000000..da60be14c Binary files /dev/null and b/content-rst/applications/productivity/voip/transfer_forward/transfer.png differ diff --git a/content-rst/applications/productivity/voip/transfer_forward/widget-operation.png b/content-rst/applications/productivity/voip/transfer_forward/widget-operation.png new file mode 100644 index 000000000..602b744c1 Binary files /dev/null and b/content-rst/applications/productivity/voip/transfer_forward/widget-operation.png differ diff --git a/content/applications/productivity/voip/voip_widget.rst b/content-rst/applications/productivity/voip/voip_widget.rst similarity index 100% rename from content/applications/productivity/voip/voip_widget.rst rename to content-rst/applications/productivity/voip/voip_widget.rst diff --git a/content-rst/applications/productivity/voip/voip_widget/activity-widget.png b/content-rst/applications/productivity/voip/voip_widget/activity-widget.png new file mode 100644 index 000000000..9e791c9e0 Binary files /dev/null and b/content-rst/applications/productivity/voip/voip_widget/activity-widget.png differ diff --git a/content-rst/applications/productivity/voip/voip_widget/call.png b/content-rst/applications/productivity/voip/voip_widget/call.png new file mode 100644 index 000000000..48b4b1f1c Binary files /dev/null and b/content-rst/applications/productivity/voip/voip_widget/call.png differ diff --git a/content-rst/applications/productivity/voip/voip_widget/incorrect-number.png b/content-rst/applications/productivity/voip/voip_widget/incorrect-number.png new file mode 100644 index 000000000..669094c60 Binary files /dev/null and b/content-rst/applications/productivity/voip/voip_widget/incorrect-number.png differ diff --git a/content-rst/applications/productivity/voip/voip_widget/missing-parameter.png b/content-rst/applications/productivity/voip/voip_widget/missing-parameter.png new file mode 100644 index 000000000..528ec6c14 Binary files /dev/null and b/content-rst/applications/productivity/voip/voip_widget/missing-parameter.png differ diff --git a/content/applications/productivity/whatsapp.rst b/content-rst/applications/productivity/whatsapp.rst similarity index 100% rename from content/applications/productivity/whatsapp.rst rename to content-rst/applications/productivity/whatsapp.rst diff --git a/content-rst/applications/productivity/whatsapp/account-tools.png b/content-rst/applications/productivity/whatsapp/account-tools.png new file mode 100644 index 000000000..fc4bd854b Binary files /dev/null and b/content-rst/applications/productivity/whatsapp/account-tools.png differ diff --git a/content-rst/applications/productivity/whatsapp/add-users.png b/content-rst/applications/productivity/whatsapp/add-users.png new file mode 100644 index 000000000..2344d22b2 Binary files /dev/null and b/content-rst/applications/productivity/whatsapp/add-users.png differ diff --git a/content-rst/applications/productivity/whatsapp/edit-template.png b/content-rst/applications/productivity/whatsapp/edit-template.png new file mode 100644 index 000000000..682d1c1ad Binary files /dev/null and b/content-rst/applications/productivity/whatsapp/edit-template.png differ diff --git a/content-rst/applications/productivity/whatsapp/message.png b/content-rst/applications/productivity/whatsapp/message.png new file mode 100644 index 000000000..38d14a51e Binary files /dev/null and b/content-rst/applications/productivity/whatsapp/message.png differ diff --git a/content-rst/applications/productivity/whatsapp/phone-field.png b/content-rst/applications/productivity/whatsapp/phone-field.png new file mode 100644 index 000000000..350aa9bf9 Binary files /dev/null and b/content-rst/applications/productivity/whatsapp/phone-field.png differ diff --git a/content-rst/applications/productivity/whatsapp/quickstart.png b/content-rst/applications/productivity/whatsapp/quickstart.png new file mode 100644 index 000000000..34413ca2e Binary files /dev/null and b/content-rst/applications/productivity/whatsapp/quickstart.png differ diff --git a/content-rst/applications/productivity/whatsapp/sync-template.png b/content-rst/applications/productivity/whatsapp/sync-template.png new file mode 100644 index 000000000..cfc0805c5 Binary files /dev/null and b/content-rst/applications/productivity/whatsapp/sync-template.png differ diff --git a/content-rst/applications/productivity/whatsapp/template-config.png b/content-rst/applications/productivity/whatsapp/template-config.png new file mode 100644 index 000000000..1d6da2eed Binary files /dev/null and b/content-rst/applications/productivity/whatsapp/template-config.png differ diff --git a/content-rst/applications/productivity/whatsapp/toggle.png b/content-rst/applications/productivity/whatsapp/toggle.png new file mode 100644 index 000000000..50d6c88d4 Binary files /dev/null and b/content-rst/applications/productivity/whatsapp/toggle.png differ diff --git a/content-rst/applications/productivity/whatsapp/user-error-2.png b/content-rst/applications/productivity/whatsapp/user-error-2.png new file mode 100644 index 000000000..9890ed962 Binary files /dev/null and b/content-rst/applications/productivity/whatsapp/user-error-2.png differ diff --git a/content-rst/applications/productivity/whatsapp/user-error.png b/content-rst/applications/productivity/whatsapp/user-error.png new file mode 100644 index 000000000..ff850f2c7 Binary files /dev/null and b/content-rst/applications/productivity/whatsapp/user-error.png differ diff --git a/content-rst/applications/productivity/whatsapp/validation-error-2.png b/content-rst/applications/productivity/whatsapp/validation-error-2.png new file mode 100644 index 000000000..a3ac0daf1 Binary files /dev/null and b/content-rst/applications/productivity/whatsapp/validation-error-2.png differ diff --git a/content-rst/applications/productivity/whatsapp/webhooks-done.png b/content-rst/applications/productivity/whatsapp/webhooks-done.png new file mode 100644 index 000000000..73bf634dd Binary files /dev/null and b/content-rst/applications/productivity/whatsapp/webhooks-done.png differ diff --git a/content-rst/applications/productivity/whatsapp/webhooks.png b/content-rst/applications/productivity/whatsapp/webhooks.png new file mode 100644 index 000000000..a945af6a4 Binary files /dev/null and b/content-rst/applications/productivity/whatsapp/webhooks.png differ diff --git a/content/applications/sales.rst b/content-rst/applications/sales.rst similarity index 100% rename from content/applications/sales.rst rename to content-rst/applications/sales.rst diff --git a/content/applications/sales/crm.rst b/content-rst/applications/sales/crm.rst similarity index 100% rename from content/applications/sales/crm.rst rename to content-rst/applications/sales/crm.rst diff --git a/content/applications/sales/crm/acquire_leads.rst b/content-rst/applications/sales/crm/acquire_leads.rst similarity index 100% rename from content/applications/sales/crm/acquire_leads.rst rename to content-rst/applications/sales/crm/acquire_leads.rst diff --git a/content/applications/sales/crm/acquire_leads/convert.rst b/content-rst/applications/sales/crm/acquire_leads/convert.rst similarity index 100% rename from content/applications/sales/crm/acquire_leads/convert.rst rename to content-rst/applications/sales/crm/acquire_leads/convert.rst diff --git a/content-rst/applications/sales/crm/acquire_leads/convert/convert-leads-conversion-action.png b/content-rst/applications/sales/crm/acquire_leads/convert/convert-leads-conversion-action.png new file mode 100644 index 000000000..e1246a737 Binary files /dev/null and b/content-rst/applications/sales/crm/acquire_leads/convert/convert-leads-conversion-action.png differ diff --git a/content-rst/applications/sales/crm/acquire_leads/convert/convert-leads-convert-opp-button.png b/content-rst/applications/sales/crm/acquire_leads/convert/convert-leads-convert-opp-button.png new file mode 100644 index 000000000..e826bc5a2 Binary files /dev/null and b/content-rst/applications/sales/crm/acquire_leads/convert/convert-leads-convert-opp-button.png differ diff --git a/content-rst/applications/sales/crm/acquire_leads/convert/convert-leads-leads-button.png b/content-rst/applications/sales/crm/acquire_leads/convert/convert-leads-leads-button.png new file mode 100644 index 000000000..082572993 Binary files /dev/null and b/content-rst/applications/sales/crm/acquire_leads/convert/convert-leads-leads-button.png differ diff --git a/content-rst/applications/sales/crm/acquire_leads/convert/convert-leads-leads-menu.png b/content-rst/applications/sales/crm/acquire_leads/convert/convert-leads-leads-menu.png new file mode 100644 index 000000000..86528cf13 Binary files /dev/null and b/content-rst/applications/sales/crm/acquire_leads/convert/convert-leads-leads-menu.png differ diff --git a/content-rst/applications/sales/crm/acquire_leads/convert/convert-leads-leads-setting.png b/content-rst/applications/sales/crm/acquire_leads/convert/convert-leads-leads-setting.png new file mode 100644 index 000000000..99b574b8d Binary files /dev/null and b/content-rst/applications/sales/crm/acquire_leads/convert/convert-leads-leads-setting.png differ diff --git a/content-rst/applications/sales/crm/acquire_leads/convert/similar-leads-smart-button.png b/content-rst/applications/sales/crm/acquire_leads/convert/similar-leads-smart-button.png new file mode 100644 index 000000000..34fafdee1 Binary files /dev/null and b/content-rst/applications/sales/crm/acquire_leads/convert/similar-leads-smart-button.png differ diff --git a/content/applications/sales/crm/acquire_leads/email_manual.rst b/content-rst/applications/sales/crm/acquire_leads/email_manual.rst similarity index 100% rename from content/applications/sales/crm/acquire_leads/email_manual.rst rename to content-rst/applications/sales/crm/acquire_leads/email_manual.rst diff --git a/content-rst/applications/sales/crm/acquire_leads/email_manual/chatter-message.png b/content-rst/applications/sales/crm/acquire_leads/email_manual/chatter-message.png new file mode 100644 index 000000000..db90992e3 Binary files /dev/null and b/content-rst/applications/sales/crm/acquire_leads/email_manual/chatter-message.png differ diff --git a/content-rst/applications/sales/crm/acquire_leads/email_manual/create-opportunities.png b/content-rst/applications/sales/crm/acquire_leads/email_manual/create-opportunities.png new file mode 100644 index 000000000..2edaf99d6 Binary files /dev/null and b/content-rst/applications/sales/crm/acquire_leads/email_manual/create-opportunities.png differ diff --git a/content-rst/applications/sales/crm/acquire_leads/email_manual/email-alias.png b/content-rst/applications/sales/crm/acquire_leads/email_manual/email-alias.png new file mode 100644 index 000000000..8d736db0b Binary files /dev/null and b/content-rst/applications/sales/crm/acquire_leads/email_manual/email-alias.png differ diff --git a/content-rst/applications/sales/crm/acquire_leads/email_manual/opportunity-example.png b/content-rst/applications/sales/crm/acquire_leads/email_manual/opportunity-example.png new file mode 100644 index 000000000..f6d423003 Binary files /dev/null and b/content-rst/applications/sales/crm/acquire_leads/email_manual/opportunity-example.png differ diff --git a/content/applications/sales/crm/acquire_leads/lead_mining.rst b/content-rst/applications/sales/crm/acquire_leads/lead_mining.rst similarity index 100% rename from content/applications/sales/crm/acquire_leads/lead_mining.rst rename to content-rst/applications/sales/crm/acquire_leads/lead_mining.rst diff --git a/content-rst/applications/sales/crm/acquire_leads/lead_mining/activate-lead-mining.png b/content-rst/applications/sales/crm/acquire_leads/lead_mining/activate-lead-mining.png new file mode 100644 index 000000000..4a5526c27 Binary files /dev/null and b/content-rst/applications/sales/crm/acquire_leads/lead_mining/activate-lead-mining.png differ diff --git a/content-rst/applications/sales/crm/acquire_leads/lead_mining/generate-leads-button.png b/content-rst/applications/sales/crm/acquire_leads/lead_mining/generate-leads-button.png new file mode 100644 index 000000000..922ab8be9 Binary files /dev/null and b/content-rst/applications/sales/crm/acquire_leads/lead_mining/generate-leads-button.png differ diff --git a/content-rst/applications/sales/crm/acquire_leads/lead_mining/generate-leads-popup.png b/content-rst/applications/sales/crm/acquire_leads/lead_mining/generate-leads-popup.png new file mode 100644 index 000000000..099287494 Binary files /dev/null and b/content-rst/applications/sales/crm/acquire_leads/lead_mining/generate-leads-popup.png differ diff --git a/content-rst/applications/sales/crm/acquire_leads/lead_mining/generated-lead.png b/content-rst/applications/sales/crm/acquire_leads/lead_mining/generated-lead.png new file mode 100644 index 000000000..b03e53302 Binary files /dev/null and b/content-rst/applications/sales/crm/acquire_leads/lead_mining/generated-lead.png differ diff --git a/content-rst/applications/sales/crm/acquire_leads/lead_mining/view-my-services-setting.png b/content-rst/applications/sales/crm/acquire_leads/lead_mining/view-my-services-setting.png new file mode 100644 index 000000000..236918c08 Binary files /dev/null and b/content-rst/applications/sales/crm/acquire_leads/lead_mining/view-my-services-setting.png differ diff --git a/content/applications/sales/crm/acquire_leads/opportunities_form.rst b/content-rst/applications/sales/crm/acquire_leads/opportunities_form.rst similarity index 100% rename from content/applications/sales/crm/acquire_leads/opportunities_form.rst rename to content-rst/applications/sales/crm/acquire_leads/opportunities_form.rst diff --git a/content-rst/applications/sales/crm/acquire_leads/opportunities_form/field-customization.png b/content-rst/applications/sales/crm/acquire_leads/opportunities_form/field-customization.png new file mode 100644 index 000000000..e32a6573f Binary files /dev/null and b/content-rst/applications/sales/crm/acquire_leads/opportunities_form/field-customization.png differ diff --git a/content-rst/applications/sales/crm/acquire_leads/opportunities_form/form-customization.png b/content-rst/applications/sales/crm/acquire_leads/opportunities_form/form-customization.png new file mode 100644 index 000000000..954d14035 Binary files /dev/null and b/content-rst/applications/sales/crm/acquire_leads/opportunities_form/form-customization.png differ diff --git a/content/applications/sales/crm/acquire_leads/send_quotes.rst b/content-rst/applications/sales/crm/acquire_leads/send_quotes.rst similarity index 100% rename from content/applications/sales/crm/acquire_leads/send_quotes.rst rename to content-rst/applications/sales/crm/acquire_leads/send_quotes.rst diff --git a/content-rst/applications/sales/crm/acquire_leads/send_quotes/product-catalog.png b/content-rst/applications/sales/crm/acquire_leads/send_quotes/product-catalog.png new file mode 100644 index 000000000..63190e461 Binary files /dev/null and b/content-rst/applications/sales/crm/acquire_leads/send_quotes/product-catalog.png differ diff --git a/content-rst/applications/sales/crm/acquire_leads/send_quotes/product-sections.png b/content-rst/applications/sales/crm/acquire_leads/send_quotes/product-sections.png new file mode 100644 index 000000000..c89db2f97 Binary files /dev/null and b/content-rst/applications/sales/crm/acquire_leads/send_quotes/product-sections.png differ diff --git a/content-rst/applications/sales/crm/acquire_leads/send_quotes/send-quotes-new-button.png b/content-rst/applications/sales/crm/acquire_leads/send_quotes/send-quotes-new-button.png new file mode 100644 index 000000000..97429455a Binary files /dev/null and b/content-rst/applications/sales/crm/acquire_leads/send_quotes/send-quotes-new-button.png differ diff --git a/content-rst/applications/sales/crm/acquire_leads/send_quotes/send-quotes-new-quotation.png b/content-rst/applications/sales/crm/acquire_leads/send_quotes/send-quotes-new-quotation.png new file mode 100644 index 000000000..dbbbf8552 Binary files /dev/null and b/content-rst/applications/sales/crm/acquire_leads/send_quotes/send-quotes-new-quotation.png differ diff --git a/content-rst/applications/sales/crm/acquire_leads/send_quotes/set-quantity.png b/content-rst/applications/sales/crm/acquire_leads/send_quotes/set-quantity.png new file mode 100644 index 000000000..ce98be1ea Binary files /dev/null and b/content-rst/applications/sales/crm/acquire_leads/send_quotes/set-quantity.png differ diff --git a/content/applications/sales/crm/optimize.rst b/content-rst/applications/sales/crm/optimize.rst similarity index 100% rename from content/applications/sales/crm/optimize.rst rename to content-rst/applications/sales/crm/optimize.rst diff --git a/content/applications/sales/crm/optimize/gamification.rst b/content-rst/applications/sales/crm/optimize/gamification.rst similarity index 100% rename from content/applications/sales/crm/optimize/gamification.rst rename to content-rst/applications/sales/crm/optimize/gamification.rst diff --git a/content-rst/applications/sales/crm/optimize/gamification/assignation-rule.png b/content-rst/applications/sales/crm/optimize/gamification/assignation-rule.png new file mode 100644 index 000000000..e911d9b66 Binary files /dev/null and b/content-rst/applications/sales/crm/optimize/gamification/assignation-rule.png differ diff --git a/content-rst/applications/sales/crm/optimize/gamification/badges.png b/content-rst/applications/sales/crm/optimize/gamification/badges.png new file mode 100644 index 000000000..eb0ba89f3 Binary files /dev/null and b/content-rst/applications/sales/crm/optimize/gamification/badges.png differ diff --git a/content-rst/applications/sales/crm/optimize/gamification/challenge-goals.png b/content-rst/applications/sales/crm/optimize/gamification/challenge-goals.png new file mode 100644 index 000000000..3fc142910 Binary files /dev/null and b/content-rst/applications/sales/crm/optimize/gamification/challenge-goals.png differ diff --git a/content-rst/applications/sales/crm/optimize/gamification/create-badge.png b/content-rst/applications/sales/crm/optimize/gamification/create-badge.png new file mode 100644 index 000000000..df3df48bb Binary files /dev/null and b/content-rst/applications/sales/crm/optimize/gamification/create-badge.png differ diff --git a/content-rst/applications/sales/crm/optimize/gamification/gamification-module-install.png b/content-rst/applications/sales/crm/optimize/gamification/gamification-module-install.png new file mode 100644 index 000000000..cbccf65dd Binary files /dev/null and b/content-rst/applications/sales/crm/optimize/gamification/gamification-module-install.png differ diff --git a/content-rst/applications/sales/crm/optimize/gamification/gamification-tools-menu.png b/content-rst/applications/sales/crm/optimize/gamification/gamification-tools-menu.png new file mode 100644 index 000000000..3bcfa42a0 Binary files /dev/null and b/content-rst/applications/sales/crm/optimize/gamification/gamification-tools-menu.png differ diff --git a/content/applications/sales/crm/optimize/lead_enrichment.rst b/content-rst/applications/sales/crm/optimize/lead_enrichment.rst similarity index 100% rename from content/applications/sales/crm/optimize/lead_enrichment.rst rename to content-rst/applications/sales/crm/optimize/lead_enrichment.rst diff --git a/content-rst/applications/sales/crm/optimize/lead_enrichment/buy-lead-enrichment-credits-setting.png b/content-rst/applications/sales/crm/optimize/lead_enrichment/buy-lead-enrichment-credits-setting.png new file mode 100644 index 000000000..1c521a728 Binary files /dev/null and b/content-rst/applications/sales/crm/optimize/lead_enrichment/buy-lead-enrichment-credits-setting.png differ diff --git a/content-rst/applications/sales/crm/optimize/lead_enrichment/lead-enrichment-activate.png b/content-rst/applications/sales/crm/optimize/lead_enrichment/lead-enrichment-activate.png new file mode 100644 index 000000000..310b0af9b Binary files /dev/null and b/content-rst/applications/sales/crm/optimize/lead_enrichment/lead-enrichment-activate.png differ diff --git a/content-rst/applications/sales/crm/optimize/lead_enrichment/lead-enrichment-data.png b/content-rst/applications/sales/crm/optimize/lead_enrichment/lead-enrichment-data.png new file mode 100644 index 000000000..8220b22f3 Binary files /dev/null and b/content-rst/applications/sales/crm/optimize/lead_enrichment/lead-enrichment-data.png differ diff --git a/content-rst/applications/sales/crm/optimize/lead_enrichment/manual-enrichment.png b/content-rst/applications/sales/crm/optimize/lead_enrichment/manual-enrichment.png new file mode 100644 index 000000000..ff66452e6 Binary files /dev/null and b/content-rst/applications/sales/crm/optimize/lead_enrichment/manual-enrichment.png differ diff --git a/content-rst/applications/sales/crm/optimize/lead_enrichment/view-my-services-setting.png b/content-rst/applications/sales/crm/optimize/lead_enrichment/view-my-services-setting.png new file mode 100644 index 000000000..236918c08 Binary files /dev/null and b/content-rst/applications/sales/crm/optimize/lead_enrichment/view-my-services-setting.png differ diff --git a/content/applications/sales/crm/optimize/partner_autocomplete.rst b/content-rst/applications/sales/crm/optimize/partner_autocomplete.rst similarity index 100% rename from content/applications/sales/crm/optimize/partner_autocomplete.rst rename to content-rst/applications/sales/crm/optimize/partner_autocomplete.rst diff --git a/content-rst/applications/sales/crm/optimize/partner_autocomplete/odoo-autocomplete.png b/content-rst/applications/sales/crm/optimize/partner_autocomplete/odoo-autocomplete.png new file mode 100644 index 000000000..bc45a5758 Binary files /dev/null and b/content-rst/applications/sales/crm/optimize/partner_autocomplete/odoo-autocomplete.png differ diff --git a/content-rst/applications/sales/crm/optimize/partner_autocomplete/odoo-info-autocomplete.png b/content-rst/applications/sales/crm/optimize/partner_autocomplete/odoo-info-autocomplete.png new file mode 100644 index 000000000..9d0ae747a Binary files /dev/null and b/content-rst/applications/sales/crm/optimize/partner_autocomplete/odoo-info-autocomplete.png differ diff --git a/content-rst/applications/sales/crm/optimize/partner_autocomplete/settings-partner-autocomplete.png b/content-rst/applications/sales/crm/optimize/partner_autocomplete/settings-partner-autocomplete.png new file mode 100644 index 000000000..98307c37d Binary files /dev/null and b/content-rst/applications/sales/crm/optimize/partner_autocomplete/settings-partner-autocomplete.png differ diff --git a/content/applications/sales/crm/optimize/utilize_activities.rst b/content-rst/applications/sales/crm/optimize/utilize_activities.rst similarity index 100% rename from content/applications/sales/crm/optimize/utilize_activities.rst rename to content-rst/applications/sales/crm/optimize/utilize_activities.rst diff --git a/content-rst/applications/sales/crm/optimize/utilize_activities/action-field.png b/content-rst/applications/sales/crm/optimize/utilize_activities/action-field.png new file mode 100644 index 000000000..270fadc72 Binary files /dev/null and b/content-rst/applications/sales/crm/optimize/utilize_activities/action-field.png differ diff --git a/content-rst/applications/sales/crm/optimize/utilize_activities/activities-view.png b/content-rst/applications/sales/crm/optimize/utilize_activities/activities-view.png new file mode 100644 index 000000000..aa669f10e Binary files /dev/null and b/content-rst/applications/sales/crm/optimize/utilize_activities/activities-view.png differ diff --git a/content-rst/applications/sales/crm/optimize/utilize_activities/activity-plan-chatter.png b/content-rst/applications/sales/crm/optimize/utilize_activities/activity-plan-chatter.png new file mode 100644 index 000000000..6582cdc0e Binary files /dev/null and b/content-rst/applications/sales/crm/optimize/utilize_activities/activity-plan-chatter.png differ diff --git a/content-rst/applications/sales/crm/optimize/utilize_activities/create-activity-plan.png b/content-rst/applications/sales/crm/optimize/utilize_activities/create-activity-plan.png new file mode 100644 index 000000000..ae6a58558 Binary files /dev/null and b/content-rst/applications/sales/crm/optimize/utilize_activities/create-activity-plan.png differ diff --git a/content-rst/applications/sales/crm/optimize/utilize_activities/next-activity.png b/content-rst/applications/sales/crm/optimize/utilize_activities/next-activity.png new file mode 100644 index 000000000..879bcf70d Binary files /dev/null and b/content-rst/applications/sales/crm/optimize/utilize_activities/next-activity.png differ diff --git a/content-rst/applications/sales/crm/optimize/utilize_activities/schedule-activity-plan.png b/content-rst/applications/sales/crm/optimize/utilize_activities/schedule-activity-plan.png new file mode 100644 index 000000000..a3114e261 Binary files /dev/null and b/content-rst/applications/sales/crm/optimize/utilize_activities/schedule-activity-plan.png differ diff --git a/content-rst/applications/sales/crm/optimize/utilize_activities/suggest-next-activity.png b/content-rst/applications/sales/crm/optimize/utilize_activities/suggest-next-activity.png new file mode 100644 index 000000000..9cb1ffac9 Binary files /dev/null and b/content-rst/applications/sales/crm/optimize/utilize_activities/suggest-next-activity.png differ diff --git a/content/applications/sales/crm/performance.rst b/content-rst/applications/sales/crm/performance.rst similarity index 100% rename from content/applications/sales/crm/performance.rst rename to content-rst/applications/sales/crm/performance.rst diff --git a/content/applications/sales/crm/performance/expected_revenue_report.rst b/content-rst/applications/sales/crm/performance/expected_revenue_report.rst similarity index 100% rename from content/applications/sales/crm/performance/expected_revenue_report.rst rename to content-rst/applications/sales/crm/performance/expected_revenue_report.rst diff --git a/content-rst/applications/sales/crm/performance/expected_revenue_report/custom-filters.png b/content-rst/applications/sales/crm/performance/expected_revenue_report/custom-filters.png new file mode 100644 index 000000000..d6766be80 Binary files /dev/null and b/content-rst/applications/sales/crm/performance/expected_revenue_report/custom-filters.png differ diff --git a/content-rst/applications/sales/crm/performance/expected_revenue_report/expected-revenue-closing.png b/content-rst/applications/sales/crm/performance/expected_revenue_report/expected-revenue-closing.png new file mode 100644 index 000000000..64fd7af0b Binary files /dev/null and b/content-rst/applications/sales/crm/performance/expected_revenue_report/expected-revenue-closing.png differ diff --git a/content-rst/applications/sales/crm/performance/expected_revenue_report/graph-view-icons.png b/content-rst/applications/sales/crm/performance/expected_revenue_report/graph-view-icons.png new file mode 100644 index 000000000..787146704 Binary files /dev/null and b/content-rst/applications/sales/crm/performance/expected_revenue_report/graph-view-icons.png differ diff --git a/content-rst/applications/sales/crm/performance/expected_revenue_report/list-icon.png b/content-rst/applications/sales/crm/performance/expected_revenue_report/list-icon.png new file mode 100644 index 000000000..db564305a Binary files /dev/null and b/content-rst/applications/sales/crm/performance/expected_revenue_report/list-icon.png differ diff --git a/content-rst/applications/sales/crm/performance/expected_revenue_report/match-all-filters.png b/content-rst/applications/sales/crm/performance/expected_revenue_report/match-all-filters.png new file mode 100644 index 000000000..403bf85e9 Binary files /dev/null and b/content-rst/applications/sales/crm/performance/expected_revenue_report/match-all-filters.png differ diff --git a/content-rst/applications/sales/crm/performance/expected_revenue_report/pivot-view-icon.png b/content-rst/applications/sales/crm/performance/expected_revenue_report/pivot-view-icon.png new file mode 100644 index 000000000..9516c8b88 Binary files /dev/null and b/content-rst/applications/sales/crm/performance/expected_revenue_report/pivot-view-icon.png differ diff --git a/content-rst/applications/sales/crm/performance/expected_revenue_report/toggle-icon.png b/content-rst/applications/sales/crm/performance/expected_revenue_report/toggle-icon.png new file mode 100644 index 000000000..c40f8304d Binary files /dev/null and b/content-rst/applications/sales/crm/performance/expected_revenue_report/toggle-icon.png differ diff --git a/content/applications/sales/crm/performance/forecast_report.rst b/content-rst/applications/sales/crm/performance/forecast_report.rst similarity index 100% rename from content/applications/sales/crm/performance/forecast_report.rst rename to content-rst/applications/sales/crm/performance/forecast_report.rst diff --git a/content-rst/applications/sales/crm/performance/forecast_report/example-revenue.png b/content-rst/applications/sales/crm/performance/forecast_report/example-revenue.png new file mode 100644 index 000000000..3f1da8e9a Binary files /dev/null and b/content-rst/applications/sales/crm/performance/forecast_report/example-revenue.png differ diff --git a/content-rst/applications/sales/crm/performance/forecast_report/pie-chart-view.png b/content-rst/applications/sales/crm/performance/forecast_report/pie-chart-view.png new file mode 100644 index 000000000..5fc60ce2e Binary files /dev/null and b/content-rst/applications/sales/crm/performance/forecast_report/pie-chart-view.png differ diff --git a/content-rst/applications/sales/crm/performance/forecast_report/pivot-view.png b/content-rst/applications/sales/crm/performance/forecast_report/pivot-view.png new file mode 100644 index 000000000..c1c997f93 Binary files /dev/null and b/content-rst/applications/sales/crm/performance/forecast_report/pivot-view.png differ diff --git a/content-rst/applications/sales/crm/performance/forecast_report/sample-report.png b/content-rst/applications/sales/crm/performance/forecast_report/sample-report.png new file mode 100644 index 000000000..eed54c5a6 Binary files /dev/null and b/content-rst/applications/sales/crm/performance/forecast_report/sample-report.png differ diff --git a/content/applications/sales/crm/performance/win_loss.rst b/content-rst/applications/sales/crm/performance/win_loss.rst similarity index 100% rename from content/applications/sales/crm/performance/win_loss.rst rename to content-rst/applications/sales/crm/performance/win_loss.rst diff --git a/content-rst/applications/sales/crm/performance/win_loss/add-custom-active-filter.png b/content-rst/applications/sales/crm/performance/win_loss/add-custom-active-filter.png new file mode 100644 index 000000000..4cccad53b Binary files /dev/null and b/content-rst/applications/sales/crm/performance/win_loss/add-custom-active-filter.png differ diff --git a/content-rst/applications/sales/crm/performance/win_loss/add-to-dashboard.png b/content-rst/applications/sales/crm/performance/win_loss/add-to-dashboard.png new file mode 100644 index 000000000..c380c15da Binary files /dev/null and b/content-rst/applications/sales/crm/performance/win_loss/add-to-dashboard.png differ diff --git a/content-rst/applications/sales/crm/performance/win_loss/basic-win-loss-report.png b/content-rst/applications/sales/crm/performance/win_loss/basic-win-loss-report.png new file mode 100644 index 000000000..0ea80c700 Binary files /dev/null and b/content-rst/applications/sales/crm/performance/win_loss/basic-win-loss-report.png differ diff --git a/content-rst/applications/sales/crm/performance/win_loss/cohort-view.png b/content-rst/applications/sales/crm/performance/win_loss/cohort-view.png new file mode 100644 index 000000000..a99a21d8c Binary files /dev/null and b/content-rst/applications/sales/crm/performance/win_loss/cohort-view.png differ diff --git a/content-rst/applications/sales/crm/performance/win_loss/custom-filter-add-branch.png b/content-rst/applications/sales/crm/performance/win_loss/custom-filter-add-branch.png new file mode 100644 index 000000000..35363b1d3 Binary files /dev/null and b/content-rst/applications/sales/crm/performance/win_loss/custom-filter-add-branch.png differ diff --git a/content-rst/applications/sales/crm/performance/win_loss/filters-for-basic-win-loss-report.png b/content-rst/applications/sales/crm/performance/win_loss/filters-for-basic-win-loss-report.png new file mode 100644 index 000000000..6174b2110 Binary files /dev/null and b/content-rst/applications/sales/crm/performance/win_loss/filters-for-basic-win-loss-report.png differ diff --git a/content-rst/applications/sales/crm/performance/win_loss/graph-view.png b/content-rst/applications/sales/crm/performance/win_loss/graph-view.png new file mode 100644 index 000000000..2dcc8cdb2 Binary files /dev/null and b/content-rst/applications/sales/crm/performance/win_loss/graph-view.png differ diff --git a/content-rst/applications/sales/crm/performance/win_loss/list-view.png b/content-rst/applications/sales/crm/performance/win_loss/list-view.png new file mode 100644 index 000000000..a41b58868 Binary files /dev/null and b/content-rst/applications/sales/crm/performance/win_loss/list-view.png differ diff --git a/content-rst/applications/sales/crm/performance/win_loss/pipeline-analysis-page.png b/content-rst/applications/sales/crm/performance/win_loss/pipeline-analysis-page.png new file mode 100644 index 000000000..e214fe2d4 Binary files /dev/null and b/content-rst/applications/sales/crm/performance/win_loss/pipeline-analysis-page.png differ diff --git a/content-rst/applications/sales/crm/performance/win_loss/pivot-view-in-spreadsheet.png b/content-rst/applications/sales/crm/performance/win_loss/pivot-view-in-spreadsheet.png new file mode 100644 index 000000000..0f1600d32 Binary files /dev/null and b/content-rst/applications/sales/crm/performance/win_loss/pivot-view-in-spreadsheet.png differ diff --git a/content-rst/applications/sales/crm/performance/win_loss/pivot-view.png b/content-rst/applications/sales/crm/performance/win_loss/pivot-view.png new file mode 100644 index 000000000..3655939c4 Binary files /dev/null and b/content-rst/applications/sales/crm/performance/win_loss/pivot-view.png differ diff --git a/content-rst/applications/sales/crm/performance/win_loss/reporting-tab-and-pipeline-view.png b/content-rst/applications/sales/crm/performance/win_loss/reporting-tab-and-pipeline-view.png new file mode 100644 index 000000000..af0e7a046 Binary files /dev/null and b/content-rst/applications/sales/crm/performance/win_loss/reporting-tab-and-pipeline-view.png differ diff --git a/content-rst/applications/sales/crm/performance/win_loss/save-to-favorites.png b/content-rst/applications/sales/crm/performance/win_loss/save-to-favorites.png new file mode 100644 index 000000000..6909039a5 Binary files /dev/null and b/content-rst/applications/sales/crm/performance/win_loss/save-to-favorites.png differ diff --git a/content-rst/applications/sales/crm/performance/win_loss/search-criteria-for-basic-win-loss.png b/content-rst/applications/sales/crm/performance/win_loss/search-criteria-for-basic-win-loss.png new file mode 100644 index 000000000..c0b55a1f9 Binary files /dev/null and b/content-rst/applications/sales/crm/performance/win_loss/search-criteria-for-basic-win-loss.png differ diff --git a/content-rst/applications/sales/crm/performance/win_loss/search-panel-filters-and-group-by-options.png b/content-rst/applications/sales/crm/performance/win_loss/search-panel-filters-and-group-by-options.png new file mode 100644 index 000000000..47a5b257a Binary files /dev/null and b/content-rst/applications/sales/crm/performance/win_loss/search-panel-filters-and-group-by-options.png differ diff --git a/content-rst/applications/sales/crm/performance/win_loss/win-loss-list-view.png b/content-rst/applications/sales/crm/performance/win_loss/win-loss-list-view.png new file mode 100644 index 000000000..d4074c60a Binary files /dev/null and b/content-rst/applications/sales/crm/performance/win_loss/win-loss-list-view.png differ diff --git a/content-rst/applications/sales/crm/performance/win_loss/win-loss-pivot-view.png b/content-rst/applications/sales/crm/performance/win_loss/win-loss-pivot-view.png new file mode 100644 index 000000000..4a1320669 Binary files /dev/null and b/content-rst/applications/sales/crm/performance/win_loss/win-loss-pivot-view.png differ diff --git a/content/applications/sales/crm/pipeline.rst b/content-rst/applications/sales/crm/pipeline.rst similarity index 100% rename from content/applications/sales/crm/pipeline.rst rename to content-rst/applications/sales/crm/pipeline.rst diff --git a/content/applications/sales/crm/pipeline/lost_opportunities.rst b/content-rst/applications/sales/crm/pipeline/lost_opportunities.rst similarity index 100% rename from content/applications/sales/crm/pipeline/lost_opportunities.rst rename to content-rst/applications/sales/crm/pipeline/lost_opportunities.rst diff --git a/content-rst/applications/sales/crm/pipeline/lost_opportunities/lost-banner.png b/content-rst/applications/sales/crm/pipeline/lost_opportunities/lost-banner.png new file mode 100644 index 000000000..695ebdb85 Binary files /dev/null and b/content-rst/applications/sales/crm/pipeline/lost_opportunities/lost-banner.png differ diff --git a/content-rst/applications/sales/crm/pipeline/lost_opportunities/lost-opps-lost-button.png b/content-rst/applications/sales/crm/pipeline/lost_opportunities/lost-opps-lost-button.png new file mode 100644 index 000000000..8ab5a61bf Binary files /dev/null and b/content-rst/applications/sales/crm/pipeline/lost_opportunities/lost-opps-lost-button.png differ diff --git a/content-rst/applications/sales/crm/pipeline/lost_opportunities/lost-opps-lost-custom-filter.png b/content-rst/applications/sales/crm/pipeline/lost_opportunities/lost-opps-lost-custom-filter.png new file mode 100644 index 000000000..c42c337e6 Binary files /dev/null and b/content-rst/applications/sales/crm/pipeline/lost_opportunities/lost-opps-lost-custom-filter.png differ diff --git a/content-rst/applications/sales/crm/pipeline/lost_opportunities/lost-opps-lost-filter.png b/content-rst/applications/sales/crm/pipeline/lost_opportunities/lost-opps-lost-filter.png new file mode 100644 index 000000000..dc6082fda Binary files /dev/null and b/content-rst/applications/sales/crm/pipeline/lost_opportunities/lost-opps-lost-filter.png differ diff --git a/content-rst/applications/sales/crm/pipeline/lost_opportunities/lost-opps-lost-reason.png b/content-rst/applications/sales/crm/pipeline/lost_opportunities/lost-opps-lost-reason.png new file mode 100644 index 000000000..d069d1c73 Binary files /dev/null and b/content-rst/applications/sales/crm/pipeline/lost_opportunities/lost-opps-lost-reason.png differ diff --git a/content-rst/applications/sales/crm/pipeline/lost_opportunities/lost-opps-restore.png b/content-rst/applications/sales/crm/pipeline/lost_opportunities/lost-opps-restore.png new file mode 100644 index 000000000..42ec700a8 Binary files /dev/null and b/content-rst/applications/sales/crm/pipeline/lost_opportunities/lost-opps-restore.png differ diff --git a/content-rst/applications/sales/crm/pipeline/lost_opportunities/lost-opps-unarchive.png b/content-rst/applications/sales/crm/pipeline/lost_opportunities/lost-opps-unarchive.png new file mode 100644 index 000000000..0c4512d34 Binary files /dev/null and b/content-rst/applications/sales/crm/pipeline/lost_opportunities/lost-opps-unarchive.png differ diff --git a/content-rst/applications/sales/crm/pipeline/lost_opportunities/multiple-lost-reasons.png b/content-rst/applications/sales/crm/pipeline/lost_opportunities/multiple-lost-reasons.png new file mode 100644 index 000000000..8081913b0 Binary files /dev/null and b/content-rst/applications/sales/crm/pipeline/lost_opportunities/multiple-lost-reasons.png differ diff --git a/content/applications/sales/crm/pipeline/manage_sales_teams.rst b/content-rst/applications/sales/crm/pipeline/manage_sales_teams.rst similarity index 100% rename from content/applications/sales/crm/pipeline/manage_sales_teams.rst rename to content-rst/applications/sales/crm/pipeline/manage_sales_teams.rst diff --git a/content-rst/applications/sales/crm/pipeline/manage_sales_teams/add-salespersons.png b/content-rst/applications/sales/crm/pipeline/manage_sales_teams/add-salespersons.png new file mode 100644 index 000000000..ade248611 Binary files /dev/null and b/content-rst/applications/sales/crm/pipeline/manage_sales_teams/add-salespersons.png differ diff --git a/content-rst/applications/sales/crm/pipeline/manage_sales_teams/create-sales-team-members.png b/content-rst/applications/sales/crm/pipeline/manage_sales_teams/create-sales-team-members.png new file mode 100644 index 000000000..8698f396a Binary files /dev/null and b/content-rst/applications/sales/crm/pipeline/manage_sales_teams/create-sales-team-members.png differ diff --git a/content-rst/applications/sales/crm/pipeline/manage_sales_teams/enable-multi-teams.png b/content-rst/applications/sales/crm/pipeline/manage_sales_teams/enable-multi-teams.png new file mode 100644 index 000000000..ee9b97a46 Binary files /dev/null and b/content-rst/applications/sales/crm/pipeline/manage_sales_teams/enable-multi-teams.png differ diff --git a/content-rst/applications/sales/crm/pipeline/manage_sales_teams/sales-team-creation.png b/content-rst/applications/sales/crm/pipeline/manage_sales_teams/sales-team-creation.png new file mode 100644 index 000000000..279c63e89 Binary files /dev/null and b/content-rst/applications/sales/crm/pipeline/manage_sales_teams/sales-team-creation.png differ diff --git a/content-rst/applications/sales/crm/pipeline/manage_sales_teams/sales-teams-dashboard.png b/content-rst/applications/sales/crm/pipeline/manage_sales_teams/sales-teams-dashboard.png new file mode 100644 index 000000000..c369cc4a0 Binary files /dev/null and b/content-rst/applications/sales/crm/pipeline/manage_sales_teams/sales-teams-dashboard.png differ diff --git a/content/applications/sales/crm/pipeline/merge_similar.rst b/content-rst/applications/sales/crm/pipeline/merge_similar.rst similarity index 100% rename from content/applications/sales/crm/pipeline/merge_similar.rst rename to content-rst/applications/sales/crm/pipeline/merge_similar.rst diff --git a/content-rst/applications/sales/crm/pipeline/merge_similar/contact-info-example.png b/content-rst/applications/sales/crm/pipeline/merge_similar/contact-info-example.png new file mode 100644 index 000000000..73969c337 Binary files /dev/null and b/content-rst/applications/sales/crm/pipeline/merge_similar/contact-info-example.png differ diff --git a/content-rst/applications/sales/crm/pipeline/merge_similar/select-merge.png b/content-rst/applications/sales/crm/pipeline/merge_similar/select-merge.png new file mode 100644 index 000000000..439856e4f Binary files /dev/null and b/content-rst/applications/sales/crm/pipeline/merge_similar/select-merge.png differ diff --git a/content-rst/applications/sales/crm/pipeline/merge_similar/similar-smart-button.png b/content-rst/applications/sales/crm/pipeline/merge_similar/similar-smart-button.png new file mode 100644 index 000000000..e82f924bc Binary files /dev/null and b/content-rst/applications/sales/crm/pipeline/merge_similar/similar-smart-button.png differ diff --git a/content/applications/sales/crm/track_leads.rst b/content-rst/applications/sales/crm/track_leads.rst similarity index 100% rename from content/applications/sales/crm/track_leads.rst rename to content-rst/applications/sales/crm/track_leads.rst diff --git a/content/applications/sales/crm/track_leads/lead_distribution_report.rst b/content-rst/applications/sales/crm/track_leads/lead_distribution_report.rst similarity index 100% rename from content/applications/sales/crm/track_leads/lead_distribution_report.rst rename to content-rst/applications/sales/crm/track_leads/lead_distribution_report.rst diff --git a/content-rst/applications/sales/crm/track_leads/lead_distribution_report/active-set.png b/content-rst/applications/sales/crm/track_leads/lead_distribution_report/active-set.png new file mode 100644 index 000000000..0063bdf7b Binary files /dev/null and b/content-rst/applications/sales/crm/track_leads/lead_distribution_report/active-set.png differ diff --git a/content-rst/applications/sales/crm/track_leads/lead_distribution_report/created-on.png b/content-rst/applications/sales/crm/track_leads/lead_distribution_report/created-on.png new file mode 100644 index 000000000..100e18bc7 Binary files /dev/null and b/content-rst/applications/sales/crm/track_leads/lead_distribution_report/created-on.png differ diff --git a/content-rst/applications/sales/crm/track_leads/lead_distribution_report/sales-team-location.png b/content-rst/applications/sales/crm/track_leads/lead_distribution_report/sales-team-location.png new file mode 100644 index 000000000..493e666da Binary files /dev/null and b/content-rst/applications/sales/crm/track_leads/lead_distribution_report/sales-team-location.png differ diff --git a/content/applications/sales/crm/track_leads/lead_scoring.rst b/content-rst/applications/sales/crm/track_leads/lead_scoring.rst similarity index 100% rename from content/applications/sales/crm/track_leads/lead_scoring.rst rename to content-rst/applications/sales/crm/track_leads/lead_scoring.rst diff --git a/content-rst/applications/sales/crm/track_leads/lead_scoring/probability-domain.png b/content-rst/applications/sales/crm/track_leads/lead_scoring/probability-domain.png new file mode 100644 index 000000000..254a66144 Binary files /dev/null and b/content-rst/applications/sales/crm/track_leads/lead_scoring/probability-domain.png differ diff --git a/content-rst/applications/sales/crm/track_leads/lead_scoring/probability-gear-icon.png b/content-rst/applications/sales/crm/track_leads/lead_scoring/probability-gear-icon.png new file mode 100644 index 000000000..832b87aed Binary files /dev/null and b/content-rst/applications/sales/crm/track_leads/lead_scoring/probability-gear-icon.png differ diff --git a/content-rst/applications/sales/crm/track_leads/lead_scoring/probability-opportunity-form.png b/content-rst/applications/sales/crm/track_leads/lead_scoring/probability-opportunity-form.png new file mode 100644 index 000000000..945391dd6 Binary files /dev/null and b/content-rst/applications/sales/crm/track_leads/lead_scoring/probability-opportunity-form.png differ diff --git a/content-rst/applications/sales/crm/track_leads/lead_scoring/rule-based-assignment.png b/content-rst/applications/sales/crm/track_leads/lead_scoring/rule-based-assignment.png new file mode 100644 index 000000000..a6bd3a967 Binary files /dev/null and b/content-rst/applications/sales/crm/track_leads/lead_scoring/rule-based-assignment.png differ diff --git a/content-rst/applications/sales/crm/track_leads/lead_scoring/update-probabilities.png b/content-rst/applications/sales/crm/track_leads/lead_scoring/update-probabilities.png new file mode 100644 index 000000000..33bf18d61 Binary files /dev/null and b/content-rst/applications/sales/crm/track_leads/lead_scoring/update-probabilities.png differ diff --git a/content/applications/sales/crm/track_leads/marketing_attribution.rst b/content-rst/applications/sales/crm/track_leads/marketing_attribution.rst similarity index 100% rename from content/applications/sales/crm/track_leads/marketing_attribution.rst rename to content-rst/applications/sales/crm/track_leads/marketing_attribution.rst diff --git a/content-rst/applications/sales/crm/track_leads/marketing_attribution/campaign-and-country-groups.png b/content-rst/applications/sales/crm/track_leads/marketing_attribution/campaign-and-country-groups.png new file mode 100644 index 000000000..9876d3d64 Binary files /dev/null and b/content-rst/applications/sales/crm/track_leads/marketing_attribution/campaign-and-country-groups.png differ diff --git a/content-rst/applications/sales/crm/track_leads/marketing_attribution/documents-export.png b/content-rst/applications/sales/crm/track_leads/marketing_attribution/documents-export.png new file mode 100644 index 000000000..cc6b8858e Binary files /dev/null and b/content-rst/applications/sales/crm/track_leads/marketing_attribution/documents-export.png differ diff --git a/content-rst/applications/sales/crm/track_leads/marketing_attribution/group-by.png b/content-rst/applications/sales/crm/track_leads/marketing_attribution/group-by.png new file mode 100644 index 000000000..9de95e9a0 Binary files /dev/null and b/content-rst/applications/sales/crm/track_leads/marketing_attribution/group-by.png differ diff --git a/content-rst/applications/sales/crm/track_leads/marketing_attribution/list-view-button.png b/content-rst/applications/sales/crm/track_leads/marketing_attribution/list-view-button.png new file mode 100644 index 000000000..d402c4563 Binary files /dev/null and b/content-rst/applications/sales/crm/track_leads/marketing_attribution/list-view-button.png differ diff --git a/content-rst/applications/sales/crm/track_leads/marketing_attribution/reporting-tab-and-leads.png b/content-rst/applications/sales/crm/track_leads/marketing_attribution/reporting-tab-and-leads.png new file mode 100644 index 000000000..5b3607ba0 Binary files /dev/null and b/content-rst/applications/sales/crm/track_leads/marketing_attribution/reporting-tab-and-leads.png differ diff --git a/content-rst/applications/sales/crm/track_leads/marketing_attribution/search-results-multiple-options.png b/content-rst/applications/sales/crm/track_leads/marketing_attribution/search-results-multiple-options.png new file mode 100644 index 000000000..a2b735464 Binary files /dev/null and b/content-rst/applications/sales/crm/track_leads/marketing_attribution/search-results-multiple-options.png differ diff --git a/content/applications/sales/crm/track_leads/quality_leads_report.rst b/content-rst/applications/sales/crm/track_leads/quality_leads_report.rst similarity index 100% rename from content/applications/sales/crm/track_leads/quality_leads_report.rst rename to content-rst/applications/sales/crm/track_leads/quality_leads_report.rst diff --git a/content-rst/applications/sales/crm/track_leads/quality_leads_report/configured-custom-rules.png b/content-rst/applications/sales/crm/track_leads/quality_leads_report/configured-custom-rules.png new file mode 100644 index 000000000..b21707491 Binary files /dev/null and b/content-rst/applications/sales/crm/track_leads/quality_leads_report/configured-custom-rules.png differ diff --git a/content-rst/applications/sales/crm/track_leads/quality_leads_report/example-report.png b/content-rst/applications/sales/crm/track_leads/quality_leads_report/example-report.png new file mode 100644 index 000000000..41ecd73bd Binary files /dev/null and b/content-rst/applications/sales/crm/track_leads/quality_leads_report/example-report.png differ diff --git a/content-rst/applications/sales/crm/track_leads/quality_leads_report/include-archived.png b/content-rst/applications/sales/crm/track_leads/quality_leads_report/include-archived.png new file mode 100644 index 000000000..0562315d6 Binary files /dev/null and b/content-rst/applications/sales/crm/track_leads/quality_leads_report/include-archived.png differ diff --git a/content-rst/applications/sales/crm/track_leads/quality_leads_report/match-all-match-any.png b/content-rst/applications/sales/crm/track_leads/quality_leads_report/match-all-match-any.png new file mode 100644 index 000000000..47aaf1572 Binary files /dev/null and b/content-rst/applications/sales/crm/track_leads/quality_leads_report/match-all-match-any.png differ diff --git a/content-rst/applications/sales/crm/track_leads/quality_leads_report/match-all-rules.png b/content-rst/applications/sales/crm/track_leads/quality_leads_report/match-all-rules.png new file mode 100644 index 000000000..86e1dbe7d Binary files /dev/null and b/content-rst/applications/sales/crm/track_leads/quality_leads_report/match-all-rules.png differ diff --git a/content/applications/sales/crm/track_leads/resellers.rst b/content-rst/applications/sales/crm/track_leads/resellers.rst similarity index 100% rename from content/applications/sales/crm/track_leads/resellers.rst rename to content-rst/applications/sales/crm/track_leads/resellers.rst diff --git a/content-rst/applications/sales/crm/track_leads/resellers/activations-toggle.png b/content-rst/applications/sales/crm/track_leads/resellers/activations-toggle.png new file mode 100644 index 000000000..2320f1393 Binary files /dev/null and b/content-rst/applications/sales/crm/track_leads/resellers/activations-toggle.png differ diff --git a/content-rst/applications/sales/crm/track_leads/resellers/partners-webpage.png b/content-rst/applications/sales/crm/track_leads/resellers/partners-webpage.png new file mode 100644 index 000000000..7e8bc75b6 Binary files /dev/null and b/content-rst/applications/sales/crm/track_leads/resellers/partners-webpage.png differ diff --git a/content-rst/applications/sales/crm/track_leads/resellers/resellers-module.png b/content-rst/applications/sales/crm/track_leads/resellers/resellers-module.png new file mode 100644 index 000000000..25ff403e1 Binary files /dev/null and b/content-rst/applications/sales/crm/track_leads/resellers/resellers-module.png differ diff --git a/content/applications/sales/crm/track_leads/unattended_leads_report.rst b/content-rst/applications/sales/crm/track_leads/unattended_leads_report.rst similarity index 100% rename from content/applications/sales/crm/track_leads/unattended_leads_report.rst rename to content-rst/applications/sales/crm/track_leads/unattended_leads_report.rst diff --git a/content-rst/applications/sales/crm/track_leads/unattended_leads_report/activities-due.png b/content-rst/applications/sales/crm/track_leads/unattended_leads_report/activities-due.png new file mode 100644 index 000000000..dee178822 Binary files /dev/null and b/content-rst/applications/sales/crm/track_leads/unattended_leads_report/activities-due.png differ diff --git a/content-rst/applications/sales/crm/track_leads/unattended_leads_report/additional-options.png b/content-rst/applications/sales/crm/track_leads/unattended_leads_report/additional-options.png new file mode 100644 index 000000000..6d45124c0 Binary files /dev/null and b/content-rst/applications/sales/crm/track_leads/unattended_leads_report/additional-options.png differ diff --git a/content-rst/applications/sales/crm/track_leads/unattended_leads_report/all-custom-filter.png b/content-rst/applications/sales/crm/track_leads/unattended_leads_report/all-custom-filter.png new file mode 100644 index 000000000..3f299c501 Binary files /dev/null and b/content-rst/applications/sales/crm/track_leads/unattended_leads_report/all-custom-filter.png differ diff --git a/content-rst/applications/sales/crm/track_leads/unattended_leads_report/configured-custom-rules.png b/content-rst/applications/sales/crm/track_leads/unattended_leads_report/configured-custom-rules.png new file mode 100644 index 000000000..8e2bf7c29 Binary files /dev/null and b/content-rst/applications/sales/crm/track_leads/unattended_leads_report/configured-custom-rules.png differ diff --git a/content-rst/applications/sales/crm/track_leads/unattended_leads_report/overdue-activities-email.png b/content-rst/applications/sales/crm/track_leads/unattended_leads_report/overdue-activities-email.png new file mode 100644 index 000000000..99460708d Binary files /dev/null and b/content-rst/applications/sales/crm/track_leads/unattended_leads_report/overdue-activities-email.png differ diff --git a/content-rst/applications/sales/crm/track_leads/unattended_leads_report/unattended-leads-example.png b/content-rst/applications/sales/crm/track_leads/unattended_leads_report/unattended-leads-example.png new file mode 100644 index 000000000..1b6361bfc Binary files /dev/null and b/content-rst/applications/sales/crm/track_leads/unattended_leads_report/unattended-leads-example.png differ diff --git a/content/applications/sales/members.rst b/content-rst/applications/sales/members.rst similarity index 100% rename from content/applications/sales/members.rst rename to content-rst/applications/sales/members.rst diff --git a/content/applications/sales/members/members_analysis.rst b/content-rst/applications/sales/members/members_analysis.rst similarity index 100% rename from content/applications/sales/members/members_analysis.rst rename to content-rst/applications/sales/members/members_analysis.rst diff --git a/content-rst/applications/sales/members/members_analysis/example-report.png b/content-rst/applications/sales/members/members_analysis/example-report.png new file mode 100644 index 000000000..d2df2873c Binary files /dev/null and b/content-rst/applications/sales/members/members_analysis/example-report.png differ diff --git a/content-rst/applications/sales/members/membership-directory-app.png b/content-rst/applications/sales/members/membership-directory-app.png new file mode 100644 index 000000000..fa6e1d1be Binary files /dev/null and b/content-rst/applications/sales/members/membership-directory-app.png differ diff --git a/content-rst/applications/sales/members/membership-product.png b/content-rst/applications/sales/members/membership-product.png new file mode 100644 index 000000000..6ddd047fd Binary files /dev/null and b/content-rst/applications/sales/members/membership-product.png differ diff --git a/content/applications/sales/point_of_sale.rst b/content-rst/applications/sales/point_of_sale.rst similarity index 100% rename from content/applications/sales/point_of_sale.rst rename to content-rst/applications/sales/point_of_sale.rst diff --git a/content-rst/applications/sales/point_of_sale/closing-control.png b/content-rst/applications/sales/point_of_sale/closing-control.png new file mode 100644 index 000000000..ce8a66a58 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/closing-control.png differ diff --git a/content/applications/sales/point_of_sale/combos.rst b/content-rst/applications/sales/point_of_sale/combos.rst similarity index 100% rename from content/applications/sales/point_of_sale/combos.rst rename to content-rst/applications/sales/point_of_sale/combos.rst diff --git a/content-rst/applications/sales/point_of_sale/combos/combo-form.png b/content-rst/applications/sales/point_of_sale/combos/combo-form.png new file mode 100644 index 000000000..3e7725164 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/combos/combo-form.png differ diff --git a/content-rst/applications/sales/point_of_sale/combos/combo-product-form.png b/content-rst/applications/sales/point_of_sale/combos/combo-product-form.png new file mode 100644 index 000000000..1168ad793 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/combos/combo-product-form.png differ diff --git a/content-rst/applications/sales/point_of_sale/combos/combo-select.png b/content-rst/applications/sales/point_of_sale/combos/combo-select.png new file mode 100644 index 000000000..d5752ef63 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/combos/combo-select.png differ diff --git a/content/applications/sales/point_of_sale/configuration.rst b/content-rst/applications/sales/point_of_sale/configuration.rst similarity index 100% rename from content/applications/sales/point_of_sale/configuration.rst rename to content-rst/applications/sales/point_of_sale/configuration.rst diff --git a/content/applications/sales/point_of_sale/configuration/epos_printers.rst b/content-rst/applications/sales/point_of_sale/configuration/epos_printers.rst similarity index 100% rename from content/applications/sales/point_of_sale/configuration/epos_printers.rst rename to content-rst/applications/sales/point_of_sale/configuration/epos_printers.rst diff --git a/content-rst/applications/sales/point_of_sale/configuration/epos_printers/setting.png b/content-rst/applications/sales/point_of_sale/configuration/epos_printers/setting.png new file mode 100644 index 000000000..9593b1354 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/configuration/epos_printers/setting.png differ diff --git a/content/applications/sales/point_of_sale/configuration/epos_ssc.rst b/content-rst/applications/sales/point_of_sale/configuration/epos_ssc.rst similarity index 100% rename from content/applications/sales/point_of_sale/configuration/epos_ssc.rst rename to content-rst/applications/sales/point_of_sale/configuration/epos_ssc.rst diff --git a/content-rst/applications/sales/point_of_sale/configuration/epos_ssc/browser-https-insecure.png b/content-rst/applications/sales/point_of_sale/configuration/epos_ssc/browser-https-insecure.png new file mode 100644 index 000000000..3e9b278fa Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/configuration/epos_ssc/browser-https-insecure.png differ diff --git a/content-rst/applications/sales/point_of_sale/configuration/epos_ssc/browser-warning.png b/content-rst/applications/sales/point_of_sale/configuration/epos_ssc/browser-warning.png new file mode 100644 index 000000000..aa2723fcd Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/configuration/epos_ssc/browser-warning.png differ diff --git a/content-rst/applications/sales/point_of_sale/configuration/epos_ssc/mozilla-not-secure.png b/content-rst/applications/sales/point_of_sale/configuration/epos_ssc/mozilla-not-secure.png new file mode 100644 index 000000000..1a7a08e50 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/configuration/epos_ssc/mozilla-not-secure.png differ diff --git a/content-rst/applications/sales/point_of_sale/configuration/epos_ssc/ssl-ios-verified.png b/content-rst/applications/sales/point_of_sale/configuration/epos_ssc/ssl-ios-verified.png new file mode 100644 index 000000000..15710fa1e Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/configuration/epos_ssc/ssl-ios-verified.png differ diff --git a/content-rst/applications/sales/point_of_sale/configuration/epos_ssc/win-cert-wizard-store.png b/content-rst/applications/sales/point_of_sale/configuration/epos_ssc/win-cert-wizard-store.png new file mode 100644 index 000000000..99ddba5a4 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/configuration/epos_ssc/win-cert-wizard-store.png differ diff --git a/content-rst/applications/sales/point_of_sale/configuration/form-pos-category.png b/content-rst/applications/sales/point_of_sale/configuration/form-pos-category.png new file mode 100644 index 000000000..9eafbc69b Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/configuration/form-pos-category.png differ diff --git a/content/applications/sales/point_of_sale/configuration/https.rst b/content-rst/applications/sales/point_of_sale/configuration/https.rst similarity index 100% rename from content/applications/sales/point_of_sale/configuration/https.rst rename to content-rst/applications/sales/point_of_sale/configuration/https.rst diff --git a/content-rst/applications/sales/point_of_sale/configuration/parent-categories.png b/content-rst/applications/sales/point_of_sale/configuration/parent-categories.png new file mode 100644 index 000000000..993d3827c Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/configuration/parent-categories.png differ diff --git a/content-rst/applications/sales/point_of_sale/configuration/pos-available.png b/content-rst/applications/sales/point_of_sale/configuration/pos-available.png new file mode 100644 index 000000000..df90174dc Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/configuration/pos-available.png differ diff --git a/content/applications/sales/point_of_sale/configuration/pos_iot.rst b/content-rst/applications/sales/point_of_sale/configuration/pos_iot.rst similarity index 100% rename from content/applications/sales/point_of_sale/configuration/pos_iot.rst rename to content-rst/applications/sales/point_of_sale/configuration/pos_iot.rst diff --git a/content-rst/applications/sales/point_of_sale/configuration/pos_iot/pos-connections.png b/content-rst/applications/sales/point_of_sale/configuration/pos_iot/pos-connections.png new file mode 100644 index 000000000..af3eebc75 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/configuration/pos_iot/pos-connections.png differ diff --git a/content-rst/applications/sales/point_of_sale/configuration/restrict-category.png b/content-rst/applications/sales/point_of_sale/configuration/restrict-category.png new file mode 100644 index 000000000..409d429dd Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/configuration/restrict-category.png differ diff --git a/content-rst/applications/sales/point_of_sale/configuration/select-pos-dropdown.png b/content-rst/applications/sales/point_of_sale/configuration/select-pos-dropdown.png new file mode 100644 index 000000000..b98bd8aa1 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/configuration/select-pos-dropdown.png differ diff --git a/content-rst/applications/sales/point_of_sale/configuration/toggle-settings.png b/content-rst/applications/sales/point_of_sale/configuration/toggle-settings.png new file mode 100644 index 000000000..f607aa1a3 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/configuration/toggle-settings.png differ diff --git a/content-rst/applications/sales/point_of_sale/customer-notes.png b/content-rst/applications/sales/point_of_sale/customer-notes.png new file mode 100644 index 000000000..f5e6d958a Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/customer-notes.png differ diff --git a/content/applications/sales/point_of_sale/employee_login.rst b/content-rst/applications/sales/point_of_sale/employee_login.rst similarity index 100% rename from content/applications/sales/point_of_sale/employee_login.rst rename to content-rst/applications/sales/point_of_sale/employee_login.rst diff --git a/content-rst/applications/sales/point_of_sale/employee_login/open-session.png b/content-rst/applications/sales/point_of_sale/employee_login/open-session.png new file mode 100644 index 000000000..e81e74cd0 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/employee_login/open-session.png differ diff --git a/content-rst/applications/sales/point_of_sale/employee_login/pin-and-badgeid.png b/content-rst/applications/sales/point_of_sale/employee_login/pin-and-badgeid.png new file mode 100644 index 000000000..a0cbecf6f Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/employee_login/pin-and-badgeid.png differ diff --git a/content-rst/applications/sales/point_of_sale/employee_login/setting.png b/content-rst/applications/sales/point_of_sale/employee_login/setting.png new file mode 100644 index 000000000..8d236331d Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/employee_login/setting.png differ diff --git a/content-rst/applications/sales/point_of_sale/employee_login/switch-user.png b/content-rst/applications/sales/point_of_sale/employee_login/switch-user.png new file mode 100644 index 000000000..f5f3e5898 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/employee_login/switch-user.png differ diff --git a/content-rst/applications/sales/point_of_sale/menu-button.png b/content-rst/applications/sales/point_of_sale/menu-button.png new file mode 100644 index 000000000..168073733 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/menu-button.png differ diff --git a/content-rst/applications/sales/point_of_sale/notes-receipt.png b/content-rst/applications/sales/point_of_sale/notes-receipt.png new file mode 100644 index 000000000..0da784be2 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/notes-receipt.png differ diff --git a/content/applications/sales/point_of_sale/online_food_delivery.rst b/content-rst/applications/sales/point_of_sale/online_food_delivery.rst similarity index 100% rename from content/applications/sales/point_of_sale/online_food_delivery.rst rename to content-rst/applications/sales/point_of_sale/online_food_delivery.rst diff --git a/content-rst/applications/sales/point_of_sale/online_food_delivery/cart-button.png b/content-rst/applications/sales/point_of_sale/online_food_delivery/cart-button.png new file mode 100644 index 000000000..0ccbbaa20 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/online_food_delivery/cart-button.png differ diff --git a/content-rst/applications/sales/point_of_sale/online_food_delivery/create-store.png b/content-rst/applications/sales/point_of_sale/online_food_delivery/create-store.png new file mode 100644 index 000000000..720fc8975 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/online_food_delivery/create-store.png differ diff --git a/content-rst/applications/sales/point_of_sale/online_food_delivery/go-live-parameters.png b/content-rst/applications/sales/point_of_sale/online_food_delivery/go-live-parameters.png new file mode 100644 index 000000000..63adb5ede Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/online_food_delivery/go-live-parameters.png differ diff --git a/content-rst/applications/sales/point_of_sale/online_food_delivery/go-live.png b/content-rst/applications/sales/point_of_sale/online_food_delivery/go-live.png new file mode 100644 index 000000000..070218254 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/online_food_delivery/go-live.png differ diff --git a/content-rst/applications/sales/point_of_sale/online_food_delivery/product-form.png b/content-rst/applications/sales/point_of_sale/online_food_delivery/product-form.png new file mode 100644 index 000000000..e52c5db3f Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/online_food_delivery/product-form.png differ diff --git a/content-rst/applications/sales/point_of_sale/online_food_delivery/product-list.png b/content-rst/applications/sales/point_of_sale/online_food_delivery/product-list.png new file mode 100644 index 000000000..bd1022715 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/online_food_delivery/product-list.png differ diff --git a/content-rst/applications/sales/point_of_sale/online_food_delivery/reject-order.png b/content-rst/applications/sales/point_of_sale/online_food_delivery/reject-order.png new file mode 100644 index 000000000..a4f064b0b Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/online_food_delivery/reject-order.png differ diff --git a/content-rst/applications/sales/point_of_sale/online_food_delivery/urban-piper-api.png b/content-rst/applications/sales/point_of_sale/online_food_delivery/urban-piper-api.png new file mode 100644 index 000000000..7ea98aa5c Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/online_food_delivery/urban-piper-api.png differ diff --git a/content/applications/sales/point_of_sale/payment_methods.rst b/content-rst/applications/sales/point_of_sale/payment_methods.rst similarity index 100% rename from content/applications/sales/point_of_sale/payment_methods.rst rename to content-rst/applications/sales/point_of_sale/payment_methods.rst diff --git a/content-rst/applications/sales/point_of_sale/payment_methods/payment-method.png b/content-rst/applications/sales/point_of_sale/payment_methods/payment-method.png new file mode 100644 index 000000000..b4b1b3720 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/payment_methods/payment-method.png differ diff --git a/content/applications/sales/point_of_sale/payment_methods/qr_code_payment.rst b/content-rst/applications/sales/point_of_sale/payment_methods/qr_code_payment.rst similarity index 100% rename from content/applications/sales/point_of_sale/payment_methods/qr_code_payment.rst rename to content-rst/applications/sales/point_of_sale/payment_methods/qr_code_payment.rst diff --git a/content-rst/applications/sales/point_of_sale/payment_methods/qr_code_payment/qr-configuration-setting.png b/content-rst/applications/sales/point_of_sale/payment_methods/qr_code_payment/qr-configuration-setting.png new file mode 100644 index 000000000..d9999ecb5 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/payment_methods/qr_code_payment/qr-configuration-setting.png differ diff --git a/content-rst/applications/sales/point_of_sale/payment_methods/qr_code_payment/qr-payment-example.png b/content-rst/applications/sales/point_of_sale/payment_methods/qr_code_payment/qr-payment-example.png new file mode 100644 index 000000000..add2b6de2 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/payment_methods/qr_code_payment/qr-payment-example.png differ diff --git a/content-rst/applications/sales/point_of_sale/payment_methods/qr_code_payment/qr-payment-methods-setting.png b/content-rst/applications/sales/point_of_sale/payment_methods/qr_code_payment/qr-payment-methods-setting.png new file mode 100644 index 000000000..b9c80fe2b Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/payment_methods/qr_code_payment/qr-payment-methods-setting.png differ diff --git a/content/applications/sales/point_of_sale/payment_methods/terminals.rst b/content-rst/applications/sales/point_of_sale/payment_methods/terminals.rst similarity index 100% rename from content/applications/sales/point_of_sale/payment_methods/terminals.rst rename to content-rst/applications/sales/point_of_sale/payment_methods/terminals.rst diff --git a/content/applications/sales/point_of_sale/payment_methods/terminals/adyen.rst b/content-rst/applications/sales/point_of_sale/payment_methods/terminals/adyen.rst similarity index 100% rename from content/applications/sales/point_of_sale/payment_methods/terminals/adyen.rst rename to content-rst/applications/sales/point_of_sale/payment_methods/terminals/adyen.rst diff --git a/content-rst/applications/sales/point_of_sale/payment_methods/terminals/adyen/payment-method.png b/content-rst/applications/sales/point_of_sale/payment_methods/terminals/adyen/payment-method.png new file mode 100644 index 000000000..10c7ffa7e Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/payment_methods/terminals/adyen/payment-method.png differ diff --git a/content/applications/sales/point_of_sale/payment_methods/terminals/ingenico.rst b/content-rst/applications/sales/point_of_sale/payment_methods/terminals/ingenico.rst similarity index 100% rename from content/applications/sales/point_of_sale/payment_methods/terminals/ingenico.rst rename to content-rst/applications/sales/point_of_sale/payment_methods/terminals/ingenico.rst diff --git a/content-rst/applications/sales/point_of_sale/payment_methods/terminals/ingenico/payment-method.png b/content-rst/applications/sales/point_of_sale/payment_methods/terminals/ingenico/payment-method.png new file mode 100644 index 000000000..7f342498b Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/payment_methods/terminals/ingenico/payment-method.png differ diff --git a/content-rst/applications/sales/point_of_sale/payment_methods/terminals/ingenico/payment_terminal_02.png b/content-rst/applications/sales/point_of_sale/payment_methods/terminals/ingenico/payment_terminal_02.png new file mode 100644 index 000000000..3dd2abdea Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/payment_methods/terminals/ingenico/payment_terminal_02.png differ diff --git a/content/applications/sales/point_of_sale/payment_methods/terminals/mercado_pago.rst b/content-rst/applications/sales/point_of_sale/payment_methods/terminals/mercado_pago.rst similarity index 100% rename from content/applications/sales/point_of_sale/payment_methods/terminals/mercado_pago.rst rename to content-rst/applications/sales/point_of_sale/payment_methods/terminals/mercado_pago.rst diff --git a/content-rst/applications/sales/point_of_sale/payment_methods/terminals/mercado_pago/payment-method.png b/content-rst/applications/sales/point_of_sale/payment_methods/terminals/mercado_pago/payment-method.png new file mode 100644 index 000000000..fc2f95625 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/payment_methods/terminals/mercado_pago/payment-method.png differ diff --git a/content-rst/applications/sales/point_of_sale/payment_methods/terminals/mercado_pago/webhooks.png b/content-rst/applications/sales/point_of_sale/payment_methods/terminals/mercado_pago/webhooks.png new file mode 100644 index 000000000..1a3e7ce59 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/payment_methods/terminals/mercado_pago/webhooks.png differ diff --git a/content-rst/applications/sales/point_of_sale/payment_methods/terminals/payment-terminals.png b/content-rst/applications/sales/point_of_sale/payment_methods/terminals/payment-terminals.png new file mode 100644 index 000000000..07fde00dc Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/payment_methods/terminals/payment-terminals.png differ diff --git a/content/applications/sales/point_of_sale/payment_methods/terminals/razorpay.rst b/content-rst/applications/sales/point_of_sale/payment_methods/terminals/razorpay.rst similarity index 100% rename from content/applications/sales/point_of_sale/payment_methods/terminals/razorpay.rst rename to content-rst/applications/sales/point_of_sale/payment_methods/terminals/razorpay.rst diff --git a/content-rst/applications/sales/point_of_sale/payment_methods/terminals/razorpay/create-method-razorpay.png b/content-rst/applications/sales/point_of_sale/payment_methods/terminals/razorpay/create-method-razorpay.png new file mode 100644 index 000000000..e9c5ac5c5 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/payment_methods/terminals/razorpay/create-method-razorpay.png differ diff --git a/content/applications/sales/point_of_sale/payment_methods/terminals/six.rst b/content-rst/applications/sales/point_of_sale/payment_methods/terminals/six.rst similarity index 100% rename from content/applications/sales/point_of_sale/payment_methods/terminals/six.rst rename to content-rst/applications/sales/point_of_sale/payment_methods/terminals/six.rst diff --git a/content-rst/applications/sales/point_of_sale/payment_methods/terminals/six/id-configured.png b/content-rst/applications/sales/point_of_sale/payment_methods/terminals/six/id-configured.png new file mode 100644 index 000000000..0f31aeab8 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/payment_methods/terminals/six/id-configured.png differ diff --git a/content-rst/applications/sales/point_of_sale/payment_methods/terminals/six/new-payment-method.png b/content-rst/applications/sales/point_of_sale/payment_methods/terminals/six/new-payment-method.png new file mode 100644 index 000000000..d08588e83 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/payment_methods/terminals/six/new-payment-method.png differ diff --git a/content-rst/applications/sales/point_of_sale/payment_methods/terminals/six/terminal-id.png b/content-rst/applications/sales/point_of_sale/payment_methods/terminals/six/terminal-id.png new file mode 100644 index 000000000..945ba2916 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/payment_methods/terminals/six/terminal-id.png differ diff --git a/content/applications/sales/point_of_sale/payment_methods/terminals/stripe.rst b/content-rst/applications/sales/point_of_sale/payment_methods/terminals/stripe.rst similarity index 100% rename from content/applications/sales/point_of_sale/payment_methods/terminals/stripe.rst rename to content-rst/applications/sales/point_of_sale/payment_methods/terminals/stripe.rst diff --git a/content-rst/applications/sales/point_of_sale/payment_methods/terminals/stripe/create-method-stripe.png b/content-rst/applications/sales/point_of_sale/payment_methods/terminals/stripe/create-method-stripe.png new file mode 100644 index 000000000..9ba6e2ea5 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/payment_methods/terminals/stripe/create-method-stripe.png differ diff --git a/content-rst/applications/sales/point_of_sale/payment_methods/terminals/stripe/stripe-connect.png b/content-rst/applications/sales/point_of_sale/payment_methods/terminals/stripe/stripe-connect.png new file mode 100644 index 000000000..caeb166fb Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/payment_methods/terminals/stripe/stripe-connect.png differ diff --git a/content/applications/sales/point_of_sale/payment_methods/terminals/viva_wallet.rst b/content-rst/applications/sales/point_of_sale/payment_methods/terminals/viva_wallet.rst similarity index 100% rename from content/applications/sales/point_of_sale/payment_methods/terminals/viva_wallet.rst rename to content-rst/applications/sales/point_of_sale/payment_methods/terminals/viva_wallet.rst diff --git a/content-rst/applications/sales/point_of_sale/payment_methods/terminals/viva_wallet/access-cred.png b/content-rst/applications/sales/point_of_sale/payment_methods/terminals/viva_wallet/access-cred.png new file mode 100644 index 000000000..1d15a781a Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/payment_methods/terminals/viva_wallet/access-cred.png differ diff --git a/content-rst/applications/sales/point_of_sale/payment_methods/terminals/viva_wallet/api-cred.png b/content-rst/applications/sales/point_of_sale/payment_methods/terminals/viva_wallet/api-cred.png new file mode 100644 index 000000000..ce6c3b6d9 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/payment_methods/terminals/viva_wallet/api-cred.png differ diff --git a/content-rst/applications/sales/point_of_sale/payment_methods/terminals/viva_wallet/create-method-viva-wallet.png b/content-rst/applications/sales/point_of_sale/payment_methods/terminals/viva_wallet/create-method-viva-wallet.png new file mode 100644 index 000000000..c4255db4e Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/payment_methods/terminals/viva_wallet/create-method-viva-wallet.png differ diff --git a/content-rst/applications/sales/point_of_sale/payment_methods/terminals/viva_wallet/terminal-id.png b/content-rst/applications/sales/point_of_sale/payment_methods/terminals/viva_wallet/terminal-id.png new file mode 100644 index 000000000..7c60ed03e Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/payment_methods/terminals/viva_wallet/terminal-id.png differ diff --git a/content/applications/sales/point_of_sale/payment_methods/terminals/worldline.rst b/content-rst/applications/sales/point_of_sale/payment_methods/terminals/worldline.rst similarity index 100% rename from content/applications/sales/point_of_sale/payment_methods/terminals/worldline.rst rename to content-rst/applications/sales/point_of_sale/payment_methods/terminals/worldline.rst diff --git a/content-rst/applications/sales/point_of_sale/payment_methods/terminals/worldline/worldline-payment-terminals.png b/content-rst/applications/sales/point_of_sale/payment_methods/terminals/worldline/worldline-payment-terminals.png new file mode 100644 index 000000000..c3c28ea2c Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/payment_methods/terminals/worldline/worldline-payment-terminals.png differ diff --git a/content-rst/applications/sales/point_of_sale/pos-interface.png b/content-rst/applications/sales/point_of_sale/pos-interface.png new file mode 100644 index 000000000..1d31b4dff Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/pos-interface.png differ diff --git a/content/applications/sales/point_of_sale/pos_based_marketing.rst b/content-rst/applications/sales/point_of_sale/pos_based_marketing.rst similarity index 100% rename from content/applications/sales/point_of_sale/pos_based_marketing.rst rename to content-rst/applications/sales/point_of_sale/pos_based_marketing.rst diff --git a/content-rst/applications/sales/point_of_sale/pos_based_marketing/mail-composer.png b/content-rst/applications/sales/point_of_sale/pos_based_marketing/mail-composer.png new file mode 100644 index 000000000..7ba49ca72 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/pos_based_marketing/mail-composer.png differ diff --git a/content-rst/applications/sales/point_of_sale/pos_based_marketing/sms-whatsapp-enabled.png b/content-rst/applications/sales/point_of_sale/pos_based_marketing/sms-whatsapp-enabled.png new file mode 100644 index 000000000..607b6d5d5 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/pos_based_marketing/sms-whatsapp-enabled.png differ diff --git a/content-rst/applications/sales/point_of_sale/pos_based_marketing/standalone-marketing-from-pos.png b/content-rst/applications/sales/point_of_sale/pos_based_marketing/standalone-marketing-from-pos.png new file mode 100644 index 000000000..cc7ca9138 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/pos_based_marketing/standalone-marketing-from-pos.png differ diff --git a/content-rst/applications/sales/point_of_sale/pos_based_marketing/whatsapp-composer.png b/content-rst/applications/sales/point_of_sale/pos_based_marketing/whatsapp-composer.png new file mode 100644 index 000000000..9f759f7c0 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/pos_based_marketing/whatsapp-composer.png differ diff --git a/content-rst/applications/sales/point_of_sale/pos_based_marketing/whatsapp-template.png b/content-rst/applications/sales/point_of_sale/pos_based_marketing/whatsapp-template.png new file mode 100644 index 000000000..1d8bea80a Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/pos_based_marketing/whatsapp-template.png differ diff --git a/content/applications/sales/point_of_sale/preparation.rst b/content-rst/applications/sales/point_of_sale/preparation.rst similarity index 100% rename from content/applications/sales/point_of_sale/preparation.rst rename to content-rst/applications/sales/point_of_sale/preparation.rst diff --git a/content-rst/applications/sales/point_of_sale/preparation/display-card.png b/content-rst/applications/sales/point_of_sale/preparation/display-card.png new file mode 100644 index 000000000..c68318bae Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/preparation/display-card.png differ diff --git a/content-rst/applications/sales/point_of_sale/preparation/display-form.png b/content-rst/applications/sales/point_of_sale/preparation/display-form.png new file mode 100644 index 000000000..cd3964c37 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/preparation/display-form.png differ diff --git a/content-rst/applications/sales/point_of_sale/preparation/preparation-display.png b/content-rst/applications/sales/point_of_sale/preparation/preparation-display.png new file mode 100644 index 000000000..e53872058 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/preparation/preparation-display.png differ diff --git a/content-rst/applications/sales/point_of_sale/preparation/preparation-setting.png b/content-rst/applications/sales/point_of_sale/preparation/preparation-setting.png new file mode 100644 index 000000000..5822ab904 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/preparation/preparation-setting.png differ diff --git a/content/applications/sales/point_of_sale/pricing.rst b/content-rst/applications/sales/point_of_sale/pricing.rst similarity index 100% rename from content/applications/sales/point_of_sale/pricing.rst rename to content-rst/applications/sales/point_of_sale/pricing.rst diff --git a/content/applications/sales/point_of_sale/pricing/cash_rounding.rst b/content-rst/applications/sales/point_of_sale/pricing/cash_rounding.rst similarity index 100% rename from content/applications/sales/point_of_sale/pricing/cash_rounding.rst rename to content-rst/applications/sales/point_of_sale/pricing/cash_rounding.rst diff --git a/content-rst/applications/sales/point_of_sale/pricing/cash_rounding/cash_rounding01.png b/content-rst/applications/sales/point_of_sale/pricing/cash_rounding/cash_rounding01.png new file mode 100644 index 000000000..763a8cbe9 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/pricing/cash_rounding/cash_rounding01.png differ diff --git a/content-rst/applications/sales/point_of_sale/pricing/cash_rounding/cash_rounding02.png b/content-rst/applications/sales/point_of_sale/pricing/cash_rounding/cash_rounding02.png new file mode 100644 index 000000000..c2a2ef775 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/pricing/cash_rounding/cash_rounding02.png differ diff --git a/content-rst/applications/sales/point_of_sale/pricing/cash_rounding/cash_rounding03.png b/content-rst/applications/sales/point_of_sale/pricing/cash_rounding/cash_rounding03.png new file mode 100644 index 000000000..2f53b54db Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/pricing/cash_rounding/cash_rounding03.png differ diff --git a/content/applications/sales/point_of_sale/pricing/discount_tags.rst b/content-rst/applications/sales/point_of_sale/pricing/discount_tags.rst similarity index 100% rename from content/applications/sales/point_of_sale/pricing/discount_tags.rst rename to content-rst/applications/sales/point_of_sale/pricing/discount_tags.rst diff --git a/content-rst/applications/sales/point_of_sale/pricing/discount_tags/discount_tags01.png b/content-rst/applications/sales/point_of_sale/pricing/discount_tags/discount_tags01.png new file mode 100644 index 000000000..43e0ed31c Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/pricing/discount_tags/discount_tags01.png differ diff --git a/content-rst/applications/sales/point_of_sale/pricing/discount_tags/discount_tags02.png b/content-rst/applications/sales/point_of_sale/pricing/discount_tags/discount_tags02.png new file mode 100644 index 000000000..4d65c1c49 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/pricing/discount_tags/discount_tags02.png differ diff --git a/content-rst/applications/sales/point_of_sale/pricing/discount_tags/discount_tags03.png b/content-rst/applications/sales/point_of_sale/pricing/discount_tags/discount_tags03.png new file mode 100644 index 000000000..fe00fd8c1 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/pricing/discount_tags/discount_tags03.png differ diff --git a/content-rst/applications/sales/point_of_sale/pricing/discount_tags/discount_tags04.png b/content-rst/applications/sales/point_of_sale/pricing/discount_tags/discount_tags04.png new file mode 100644 index 000000000..2115e32b7 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/pricing/discount_tags/discount_tags04.png differ diff --git a/content-rst/applications/sales/point_of_sale/pricing/discount_tags/discount_tags05.png b/content-rst/applications/sales/point_of_sale/pricing/discount_tags/discount_tags05.png new file mode 100644 index 000000000..446109d8a Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/pricing/discount_tags/discount_tags05.png differ diff --git a/content-rst/applications/sales/point_of_sale/pricing/discount_tags/discount_tags06.png b/content-rst/applications/sales/point_of_sale/pricing/discount_tags/discount_tags06.png new file mode 100644 index 000000000..e00e38fc8 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/pricing/discount_tags/discount_tags06.png differ diff --git a/content/applications/sales/point_of_sale/pricing/discounts.rst b/content-rst/applications/sales/point_of_sale/pricing/discounts.rst similarity index 100% rename from content/applications/sales/point_of_sale/pricing/discounts.rst rename to content-rst/applications/sales/point_of_sale/pricing/discounts.rst diff --git a/content-rst/applications/sales/point_of_sale/pricing/discounts/discounts_01.png b/content-rst/applications/sales/point_of_sale/pricing/discounts/discounts_01.png new file mode 100644 index 000000000..cb26ea26f Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/pricing/discounts/discounts_01.png differ diff --git a/content-rst/applications/sales/point_of_sale/pricing/discounts/discounts_02.png b/content-rst/applications/sales/point_of_sale/pricing/discounts/discounts_02.png new file mode 100644 index 000000000..3ced577fc Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/pricing/discounts/discounts_02.png differ diff --git a/content-rst/applications/sales/point_of_sale/pricing/discounts/discounts_03.png b/content-rst/applications/sales/point_of_sale/pricing/discounts/discounts_03.png new file mode 100644 index 000000000..c373bd829 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/pricing/discounts/discounts_03.png differ diff --git a/content-rst/applications/sales/point_of_sale/pricing/discounts/discounts_04.png b/content-rst/applications/sales/point_of_sale/pricing/discounts/discounts_04.png new file mode 100644 index 000000000..b36e75512 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/pricing/discounts/discounts_04.png differ diff --git a/content-rst/applications/sales/point_of_sale/pricing/discounts/discounts_05.png b/content-rst/applications/sales/point_of_sale/pricing/discounts/discounts_05.png new file mode 100644 index 000000000..c89f24be6 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/pricing/discounts/discounts_05.png differ diff --git a/content-rst/applications/sales/point_of_sale/pricing/discounts/discounts_06.png b/content-rst/applications/sales/point_of_sale/pricing/discounts/discounts_06.png new file mode 100644 index 000000000..3e50203d5 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/pricing/discounts/discounts_06.png differ diff --git a/content-rst/applications/sales/point_of_sale/pricing/discounts/discounts_07.png b/content-rst/applications/sales/point_of_sale/pricing/discounts/discounts_07.png new file mode 100644 index 000000000..9150ba63c Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/pricing/discounts/discounts_07.png differ diff --git a/content/applications/sales/point_of_sale/pricing/electronic_labels.rst b/content-rst/applications/sales/point_of_sale/pricing/electronic_labels.rst similarity index 100% rename from content/applications/sales/point_of_sale/pricing/electronic_labels.rst rename to content-rst/applications/sales/point_of_sale/pricing/electronic_labels.rst diff --git a/content-rst/applications/sales/point_of_sale/pricing/electronic_labels/electronic-label.png b/content-rst/applications/sales/point_of_sale/pricing/electronic_labels/electronic-label.png new file mode 100644 index 000000000..fbff6236b Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/pricing/electronic_labels/electronic-label.png differ diff --git a/content-rst/applications/sales/point_of_sale/pricing/electronic_labels/pricer-module.png b/content-rst/applications/sales/point_of_sale/pricing/electronic_labels/pricer-module.png new file mode 100644 index 000000000..c192c5d4b Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/pricing/electronic_labels/pricer-module.png differ diff --git a/content-rst/applications/sales/point_of_sale/pricing/electronic_labels/pricer-product.png b/content-rst/applications/sales/point_of_sale/pricing/electronic_labels/pricer-product.png new file mode 100644 index 000000000..cc6d8f197 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/pricing/electronic_labels/pricer-product.png differ diff --git a/content-rst/applications/sales/point_of_sale/pricing/electronic_labels/pricer-sales-pricelist.png b/content-rst/applications/sales/point_of_sale/pricing/electronic_labels/pricer-sales-pricelist.png new file mode 100644 index 000000000..f7f0a21de Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/pricing/electronic_labels/pricer-sales-pricelist.png differ diff --git a/content-rst/applications/sales/point_of_sale/pricing/electronic_labels/pricer-stores-setup.png b/content-rst/applications/sales/point_of_sale/pricing/electronic_labels/pricer-stores-setup.png new file mode 100644 index 000000000..33513fab9 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/pricing/electronic_labels/pricer-stores-setup.png differ diff --git a/content-rst/applications/sales/point_of_sale/pricing/electronic_labels/update-all.png b/content-rst/applications/sales/point_of_sale/pricing/electronic_labels/update-all.png new file mode 100644 index 000000000..990f63c27 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/pricing/electronic_labels/update-all.png differ diff --git a/content/applications/sales/point_of_sale/pricing/fiscal_position.rst b/content-rst/applications/sales/point_of_sale/pricing/fiscal_position.rst similarity index 100% rename from content/applications/sales/point_of_sale/pricing/fiscal_position.rst rename to content-rst/applications/sales/point_of_sale/pricing/fiscal_position.rst diff --git a/content-rst/applications/sales/point_of_sale/pricing/fiscal_position/flexible-taxes-setting.png b/content-rst/applications/sales/point_of_sale/pricing/fiscal_position/flexible-taxes-setting.png new file mode 100644 index 000000000..761ca814e Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/pricing/fiscal_position/flexible-taxes-setting.png differ diff --git a/content-rst/applications/sales/point_of_sale/pricing/fiscal_position/set-tax.png b/content-rst/applications/sales/point_of_sale/pricing/fiscal_position/set-tax.png new file mode 100644 index 000000000..ddd8a0942 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/pricing/fiscal_position/set-tax.png differ diff --git a/content/applications/sales/point_of_sale/pricing/loyalty.rst b/content-rst/applications/sales/point_of_sale/pricing/loyalty.rst similarity index 100% rename from content/applications/sales/point_of_sale/pricing/loyalty.rst rename to content-rst/applications/sales/point_of_sale/pricing/loyalty.rst diff --git a/content-rst/applications/sales/point_of_sale/pricing/loyalty/loyalty01.png b/content-rst/applications/sales/point_of_sale/pricing/loyalty/loyalty01.png new file mode 100644 index 000000000..4057aab77 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/pricing/loyalty/loyalty01.png differ diff --git a/content-rst/applications/sales/point_of_sale/pricing/loyalty/loyalty02.png b/content-rst/applications/sales/point_of_sale/pricing/loyalty/loyalty02.png new file mode 100644 index 000000000..209947232 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/pricing/loyalty/loyalty02.png differ diff --git a/content-rst/applications/sales/point_of_sale/pricing/loyalty/loyalty03.png b/content-rst/applications/sales/point_of_sale/pricing/loyalty/loyalty03.png new file mode 100644 index 000000000..7a8fb201f Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/pricing/loyalty/loyalty03.png differ diff --git a/content/applications/sales/point_of_sale/pricing/pricelists.rst b/content-rst/applications/sales/point_of_sale/pricing/pricelists.rst similarity index 100% rename from content/applications/sales/point_of_sale/pricing/pricelists.rst rename to content-rst/applications/sales/point_of_sale/pricing/pricelists.rst diff --git a/content-rst/applications/sales/point_of_sale/pricing/pricelists/multiple-prices.png b/content-rst/applications/sales/point_of_sale/pricing/pricelists/multiple-prices.png new file mode 100644 index 000000000..1295e375a Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/pricing/pricelists/multiple-prices.png differ diff --git a/content-rst/applications/sales/point_of_sale/pricing/pricelists/price-rules.png b/content-rst/applications/sales/point_of_sale/pricing/pricelists/price-rules.png new file mode 100644 index 000000000..fd5047107 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/pricing/pricelists/price-rules.png differ diff --git a/content-rst/applications/sales/point_of_sale/pricing/pricelists/pricelist-button.png b/content-rst/applications/sales/point_of_sale/pricing/pricelists/pricelist-button.png new file mode 100644 index 000000000..93da07340 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/pricing/pricelists/pricelist-button.png differ diff --git a/content-rst/applications/sales/point_of_sale/pricing/pricelists/settings.png b/content-rst/applications/sales/point_of_sale/pricing/pricelists/settings.png new file mode 100644 index 000000000..e797d0b8a Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/pricing/pricelists/settings.png differ diff --git a/content/applications/sales/point_of_sale/receipts_invoices.rst b/content-rst/applications/sales/point_of_sale/receipts_invoices.rst similarity index 100% rename from content/applications/sales/point_of_sale/receipts_invoices.rst rename to content-rst/applications/sales/point_of_sale/receipts_invoices.rst diff --git a/content-rst/applications/sales/point_of_sale/receipts_invoices/invoice-config.png b/content-rst/applications/sales/point_of_sale/receipts_invoices/invoice-config.png new file mode 100644 index 000000000..dcd2f6cff Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/receipts_invoices/invoice-config.png differ diff --git a/content-rst/applications/sales/point_of_sale/receipts_invoices/invoice-smart-button.png b/content-rst/applications/sales/point_of_sale/receipts_invoices/invoice-smart-button.png new file mode 100644 index 000000000..8136ceb28 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/receipts_invoices/invoice-smart-button.png differ diff --git a/content-rst/applications/sales/point_of_sale/receipts_invoices/order-status.png b/content-rst/applications/sales/point_of_sale/receipts_invoices/order-status.png new file mode 100644 index 000000000..fe9e5f0d6 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/receipts_invoices/order-status.png differ diff --git a/content-rst/applications/sales/point_of_sale/receipts_invoices/print-receipt.png b/content-rst/applications/sales/point_of_sale/receipts_invoices/print-receipt.png new file mode 100644 index 000000000..fbbb52865 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/receipts_invoices/print-receipt.png differ diff --git a/content-rst/applications/sales/point_of_sale/receipts_invoices/receipt.png b/content-rst/applications/sales/point_of_sale/receipts_invoices/receipt.png new file mode 100644 index 000000000..447b282f3 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/receipts_invoices/receipt.png differ diff --git a/content-rst/applications/sales/point_of_sale/refund.png b/content-rst/applications/sales/point_of_sale/refund.png new file mode 100644 index 000000000..c55f5ce20 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/refund.png differ diff --git a/content/applications/sales/point_of_sale/reporting.rst b/content-rst/applications/sales/point_of_sale/reporting.rst similarity index 100% rename from content/applications/sales/point_of_sale/reporting.rst rename to content-rst/applications/sales/point_of_sale/reporting.rst diff --git a/content/applications/sales/point_of_sale/restaurant.rst b/content-rst/applications/sales/point_of_sale/restaurant.rst similarity index 100% rename from content/applications/sales/point_of_sale/restaurant.rst rename to content-rst/applications/sales/point_of_sale/restaurant.rst diff --git a/content/applications/sales/point_of_sale/restaurant/bill_printing.rst b/content-rst/applications/sales/point_of_sale/restaurant/bill_printing.rst similarity index 100% rename from content/applications/sales/point_of_sale/restaurant/bill_printing.rst rename to content-rst/applications/sales/point_of_sale/restaurant/bill_printing.rst diff --git a/content-rst/applications/sales/point_of_sale/restaurant/bill_printing/settings.png b/content-rst/applications/sales/point_of_sale/restaurant/bill_printing/settings.png new file mode 100644 index 000000000..32c175940 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/restaurant/bill_printing/settings.png differ diff --git a/content/applications/sales/point_of_sale/restaurant/floors_tables.rst b/content-rst/applications/sales/point_of_sale/restaurant/floors_tables.rst similarity index 100% rename from content/applications/sales/point_of_sale/restaurant/floors_tables.rst rename to content-rst/applications/sales/point_of_sale/restaurant/floors_tables.rst diff --git a/content-rst/applications/sales/point_of_sale/restaurant/floors_tables/floor-creation-backend.png b/content-rst/applications/sales/point_of_sale/restaurant/floors_tables/floor-creation-backend.png new file mode 100644 index 000000000..d99349ea7 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/restaurant/floors_tables/floor-creation-backend.png differ diff --git a/content-rst/applications/sales/point_of_sale/restaurant/floors_tables/floor-map.png b/content-rst/applications/sales/point_of_sale/restaurant/floors_tables/floor-map.png new file mode 100644 index 000000000..4114c72a4 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/restaurant/floors_tables/floor-map.png differ diff --git a/content-rst/applications/sales/point_of_sale/restaurant/floors_tables/plan-understand.png b/content-rst/applications/sales/point_of_sale/restaurant/floors_tables/plan-understand.png new file mode 100644 index 000000000..371277683 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/restaurant/floors_tables/plan-understand.png differ diff --git a/content-rst/applications/sales/point_of_sale/restaurant/floors_tables/table-creation-backend.png b/content-rst/applications/sales/point_of_sale/restaurant/floors_tables/table-creation-backend.png new file mode 100644 index 000000000..a2caa8a66 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/restaurant/floors_tables/table-creation-backend.png differ diff --git a/content/applications/sales/point_of_sale/restaurant/kitchen_printing.rst b/content-rst/applications/sales/point_of_sale/restaurant/kitchen_printing.rst similarity index 100% rename from content/applications/sales/point_of_sale/restaurant/kitchen_printing.rst rename to content-rst/applications/sales/point_of_sale/restaurant/kitchen_printing.rst diff --git a/content-rst/applications/sales/point_of_sale/restaurant/kitchen_printing/order-button.png b/content-rst/applications/sales/point_of_sale/restaurant/kitchen_printing/order-button.png new file mode 100644 index 000000000..73b3f1abc Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/restaurant/kitchen_printing/order-button.png differ diff --git a/content-rst/applications/sales/point_of_sale/restaurant/kitchen_printing/printer-setup.png b/content-rst/applications/sales/point_of_sale/restaurant/kitchen_printing/printer-setup.png new file mode 100644 index 000000000..2d5ab131d Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/restaurant/kitchen_printing/printer-setup.png differ diff --git a/content-rst/applications/sales/point_of_sale/restaurant/kitchen_printing/printers-settings.png b/content-rst/applications/sales/point_of_sale/restaurant/kitchen_printing/printers-settings.png new file mode 100644 index 000000000..4c526830b Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/restaurant/kitchen_printing/printers-settings.png differ diff --git a/content-rst/applications/sales/point_of_sale/restaurant/restaurant-bar-section.png b/content-rst/applications/sales/point_of_sale/restaurant/restaurant-bar-section.png new file mode 100644 index 000000000..608cae1a9 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/restaurant/restaurant-bar-section.png differ diff --git a/content/applications/sales/point_of_sale/restaurant/tips.rst b/content-rst/applications/sales/point_of_sale/restaurant/tips.rst similarity index 100% rename from content/applications/sales/point_of_sale/restaurant/tips.rst rename to content-rst/applications/sales/point_of_sale/restaurant/tips.rst diff --git a/content-rst/applications/sales/point_of_sale/restaurant/tips/add-tip.png b/content-rst/applications/sales/point_of_sale/restaurant/tips/add-tip.png new file mode 100644 index 000000000..f5884272f Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/restaurant/tips/add-tip.png differ diff --git a/content-rst/applications/sales/point_of_sale/restaurant/tips/tip-after-payment.png b/content-rst/applications/sales/point_of_sale/restaurant/tips/tip-after-payment.png new file mode 100644 index 000000000..ba73f77d3 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/restaurant/tips/tip-after-payment.png differ diff --git a/content-rst/applications/sales/point_of_sale/restaurant/tips/tipping-bill.png b/content-rst/applications/sales/point_of_sale/restaurant/tips/tipping-bill.png new file mode 100644 index 000000000..e64f88025 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/restaurant/tips/tipping-bill.png differ diff --git a/content-rst/applications/sales/point_of_sale/restaurant/tips/tips-setup.png b/content-rst/applications/sales/point_of_sale/restaurant/tips/tips-setup.png new file mode 100644 index 000000000..a6fb61b5f Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/restaurant/tips/tips-setup.png differ diff --git a/content/applications/sales/point_of_sale/shop.rst b/content-rst/applications/sales/point_of_sale/shop.rst similarity index 100% rename from content/applications/sales/point_of_sale/shop.rst rename to content-rst/applications/sales/point_of_sale/shop.rst diff --git a/content/applications/sales/point_of_sale/shop/barcode.rst b/content-rst/applications/sales/point_of_sale/shop/barcode.rst similarity index 100% rename from content/applications/sales/point_of_sale/shop/barcode.rst rename to content-rst/applications/sales/point_of_sale/shop/barcode.rst diff --git a/content-rst/applications/sales/point_of_sale/shop/barcode/barcode-inventory.png b/content-rst/applications/sales/point_of_sale/shop/barcode/barcode-inventory.png new file mode 100644 index 000000000..7c2a1e50c Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/shop/barcode/barcode-inventory.png differ diff --git a/content/applications/sales/point_of_sale/shop/customer_display.rst b/content-rst/applications/sales/point_of_sale/shop/customer_display.rst similarity index 100% rename from content/applications/sales/point_of_sale/shop/customer_display.rst rename to content-rst/applications/sales/point_of_sale/shop/customer_display.rst diff --git a/content-rst/applications/sales/point_of_sale/shop/customer_display/display.png b/content-rst/applications/sales/point_of_sale/shop/customer_display/display.png new file mode 100644 index 000000000..4a93f1899 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/shop/customer_display/display.png differ diff --git a/content-rst/applications/sales/point_of_sale/shop/customer_display/feature-setting.png b/content-rst/applications/sales/point_of_sale/shop/customer_display/feature-setting.png new file mode 100644 index 000000000..5290a0b62 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/shop/customer_display/feature-setting.png differ diff --git a/content-rst/applications/sales/point_of_sale/shop/customer_display/iot-setting.png b/content-rst/applications/sales/point_of_sale/shop/customer_display/iot-setting.png new file mode 100644 index 000000000..d9676d11e Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/shop/customer_display/iot-setting.png differ diff --git a/content/applications/sales/point_of_sale/shop/sales_order.rst b/content-rst/applications/sales/point_of_sale/shop/sales_order.rst similarity index 100% rename from content/applications/sales/point_of_sale/shop/sales_order.rst rename to content-rst/applications/sales/point_of_sale/shop/sales_order.rst diff --git a/content-rst/applications/sales/point_of_sale/shop/sales_order/list-of-so.png b/content-rst/applications/sales/point_of_sale/shop/sales_order/list-of-so.png new file mode 100644 index 000000000..c6a42ae75 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/shop/sales_order/list-of-so.png differ diff --git a/content-rst/applications/sales/point_of_sale/shop/sales_order/pos-interface.png b/content-rst/applications/sales/point_of_sale/shop/sales_order/pos-interface.png new file mode 100644 index 000000000..8e7455710 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/shop/sales_order/pos-interface.png differ diff --git a/content/applications/sales/point_of_sale/shop/serial_numbers.rst b/content-rst/applications/sales/point_of_sale/shop/serial_numbers.rst similarity index 100% rename from content/applications/sales/point_of_sale/shop/serial_numbers.rst rename to content-rst/applications/sales/point_of_sale/shop/serial_numbers.rst diff --git a/content-rst/applications/sales/point_of_sale/shop/serial_numbers/create-change-sn.png b/content-rst/applications/sales/point_of_sale/shop/serial_numbers/create-change-sn.png new file mode 100644 index 000000000..c7a01eac7 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/shop/serial_numbers/create-change-sn.png differ diff --git a/content-rst/applications/sales/point_of_sale/shop/serial_numbers/importing-sn.png b/content-rst/applications/sales/point_of_sale/shop/serial_numbers/importing-sn.png new file mode 100644 index 000000000..5680bcb52 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/shop/serial_numbers/importing-sn.png differ diff --git a/content-rst/applications/sales/point_of_sale/shop/serial_numbers/pos-sn-imported.png b/content-rst/applications/sales/point_of_sale/shop/serial_numbers/pos-sn-imported.png new file mode 100644 index 000000000..3fdbeba0e Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/shop/serial_numbers/pos-sn-imported.png differ diff --git a/content-rst/applications/sales/point_of_sale/shop/serial_numbers/product-form-traceability.png b/content-rst/applications/sales/point_of_sale/shop/serial_numbers/product-form-traceability.png new file mode 100644 index 000000000..4f8cc6e80 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/shop/serial_numbers/product-form-traceability.png differ diff --git a/content/applications/sales/point_of_sale/shop/ship_later.rst b/content-rst/applications/sales/point_of_sale/shop/ship_later.rst similarity index 100% rename from content/applications/sales/point_of_sale/shop/ship_later.rst rename to content-rst/applications/sales/point_of_sale/shop/ship_later.rst diff --git a/content-rst/applications/sales/point_of_sale/shop/ship_later/payment.png b/content-rst/applications/sales/point_of_sale/shop/ship_later/payment.png new file mode 100644 index 000000000..c41933041 Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/shop/ship_later/payment.png differ diff --git a/content-rst/applications/sales/point_of_sale/shop/ship_later/settings.png b/content-rst/applications/sales/point_of_sale/shop/ship_later/settings.png new file mode 100644 index 000000000..5aa10cade Binary files /dev/null and b/content-rst/applications/sales/point_of_sale/shop/ship_later/settings.png differ diff --git a/content/applications/sales/rental.rst b/content-rst/applications/sales/rental.rst similarity index 100% rename from content/applications/sales/rental.rst rename to content-rst/applications/sales/rental.rst diff --git a/content-rst/applications/sales/rental/adopt-signature-popup.png b/content-rst/applications/sales/rental/adopt-signature-popup.png new file mode 100644 index 000000000..632590960 Binary files /dev/null and b/content-rst/applications/sales/rental/adopt-signature-popup.png differ diff --git a/content-rst/applications/sales/rental/new-signature-request-form.png b/content-rst/applications/sales/rental/new-signature-request-form.png new file mode 100644 index 000000000..db88c0898 Binary files /dev/null and b/content-rst/applications/sales/rental/new-signature-request-form.png differ diff --git a/content-rst/applications/sales/rental/print-pickup-return-receipt.png b/content-rst/applications/sales/rental/print-pickup-return-receipt.png new file mode 100644 index 000000000..fcd2449da Binary files /dev/null and b/content-rst/applications/sales/rental/print-pickup-return-receipt.png differ diff --git a/content-rst/applications/sales/rental/rental-order.png b/content-rst/applications/sales/rental/rental-order.png new file mode 100644 index 000000000..85fbcd802 Binary files /dev/null and b/content-rst/applications/sales/rental/rental-order.png differ diff --git a/content-rst/applications/sales/rental/rental-orders-dashboard.png b/content-rst/applications/sales/rental/rental-orders-dashboard.png new file mode 100644 index 000000000..eff176b90 Binary files /dev/null and b/content-rst/applications/sales/rental/rental-orders-dashboard.png differ diff --git a/content-rst/applications/sales/rental/rental-period-field-popup.png b/content-rst/applications/sales/rental/rental-period-field-popup.png new file mode 100644 index 000000000..51ce601d7 Binary files /dev/null and b/content-rst/applications/sales/rental/rental-period-field-popup.png differ diff --git a/content-rst/applications/sales/rental/rental-prices-tab.png b/content-rst/applications/sales/rental/rental-prices-tab.png new file mode 100644 index 000000000..571f77bd0 Binary files /dev/null and b/content-rst/applications/sales/rental/rental-prices-tab.png differ diff --git a/content-rst/applications/sales/rental/rental-settings.png b/content-rst/applications/sales/rental/rental-settings.png new file mode 100644 index 000000000..7b5c9967b Binary files /dev/null and b/content-rst/applications/sales/rental/rental-settings.png differ diff --git a/content-rst/applications/sales/rental/rental-update-rental-prices.png b/content-rst/applications/sales/rental/rental-update-rental-prices.png new file mode 100644 index 000000000..4277eb4d6 Binary files /dev/null and b/content-rst/applications/sales/rental/rental-update-rental-prices.png differ diff --git a/content-rst/applications/sales/rental/sign-documents-popup.png b/content-rst/applications/sales/rental/sign-documents-popup.png new file mode 100644 index 000000000..430d33d6a Binary files /dev/null and b/content-rst/applications/sales/rental/sign-documents-popup.png differ diff --git a/content-rst/applications/sales/rental/validate-send-doc-button.png b/content-rst/applications/sales/rental/validate-send-doc-button.png new file mode 100644 index 000000000..54bf2275b Binary files /dev/null and b/content-rst/applications/sales/rental/validate-send-doc-button.png differ diff --git a/content/applications/sales/sales.rst b/content-rst/applications/sales/sales.rst similarity index 100% rename from content/applications/sales/sales.rst rename to content-rst/applications/sales/sales.rst diff --git a/content/applications/sales/sales/amazon_connector.rst b/content-rst/applications/sales/sales/amazon_connector.rst similarity index 100% rename from content/applications/sales/sales/amazon_connector.rst rename to content-rst/applications/sales/sales/amazon_connector.rst diff --git a/content/applications/sales/sales/amazon_connector/features.rst b/content-rst/applications/sales/sales/amazon_connector/features.rst similarity index 100% rename from content/applications/sales/sales/amazon_connector/features.rst rename to content-rst/applications/sales/sales/amazon_connector/features.rst diff --git a/content/applications/sales/sales/amazon_connector/manage.rst b/content-rst/applications/sales/sales/amazon_connector/manage.rst similarity index 100% rename from content/applications/sales/sales/amazon_connector/manage.rst rename to content-rst/applications/sales/sales/amazon_connector/manage.rst diff --git a/content/applications/sales/sales/amazon_connector/setup.rst b/content-rst/applications/sales/sales/amazon_connector/setup.rst similarity index 100% rename from content/applications/sales/sales/amazon_connector/setup.rst rename to content-rst/applications/sales/sales/amazon_connector/setup.rst diff --git a/content-rst/applications/sales/sales/amazon_connector/setup/amazon-accounts-form-link-button.png b/content-rst/applications/sales/sales/amazon_connector/setup/amazon-accounts-form-link-button.png new file mode 100644 index 000000000..c3e92ea73 Binary files /dev/null and b/content-rst/applications/sales/sales/amazon_connector/setup/amazon-accounts-form-link-button.png differ diff --git a/content-rst/applications/sales/sales/amazon_connector/setup/amazon-accounts-form-page.png b/content-rst/applications/sales/sales/amazon_connector/setup/amazon-accounts-form-page.png new file mode 100644 index 000000000..fb56b3796 Binary files /dev/null and b/content-rst/applications/sales/sales/amazon_connector/setup/amazon-accounts-form-page.png differ diff --git a/content-rst/applications/sales/sales/amazon_connector/setup/amazon-accounts-link-setting.png b/content-rst/applications/sales/sales/amazon_connector/setup/amazon-accounts-link-setting.png new file mode 100644 index 000000000..0961ba689 Binary files /dev/null and b/content-rst/applications/sales/sales/amazon_connector/setup/amazon-accounts-link-setting.png differ diff --git a/content-rst/applications/sales/sales/amazon_connector/setup/amazon-offers-button.png b/content-rst/applications/sales/sales/amazon_connector/setup/amazon-offers-button.png new file mode 100644 index 000000000..9db51d177 Binary files /dev/null and b/content-rst/applications/sales/sales/amazon_connector/setup/amazon-offers-button.png differ diff --git a/content/applications/sales/sales/gelato.rst b/content-rst/applications/sales/sales/gelato.rst similarity index 100% rename from content/applications/sales/sales/gelato.rst rename to content-rst/applications/sales/sales/gelato.rst diff --git a/content-rst/applications/sales/sales/gelato/gelato-api-key.png b/content-rst/applications/sales/sales/gelato/gelato-api-key.png new file mode 100644 index 000000000..e807766bc Binary files /dev/null and b/content-rst/applications/sales/sales/gelato/gelato-api-key.png differ diff --git a/content-rst/applications/sales/sales/gelato/gelato-company.png b/content-rst/applications/sales/sales/gelato/gelato-company.png new file mode 100644 index 000000000..b9278b40e Binary files /dev/null and b/content-rst/applications/sales/sales/gelato/gelato-company.png differ diff --git a/content-rst/applications/sales/sales/gelato/gelato-settings.png b/content-rst/applications/sales/sales/gelato/gelato-settings.png new file mode 100644 index 000000000..430179e71 Binary files /dev/null and b/content-rst/applications/sales/sales/gelato/gelato-settings.png differ diff --git a/content-rst/applications/sales/sales/gelato/gelato-webhook.png b/content-rst/applications/sales/sales/gelato/gelato-webhook.png new file mode 100644 index 000000000..b0437a08a Binary files /dev/null and b/content-rst/applications/sales/sales/gelato/gelato-webhook.png differ diff --git a/content-rst/applications/sales/sales/gelato/odoo-company.png b/content-rst/applications/sales/sales/gelato/odoo-company.png new file mode 100644 index 000000000..28e933b6b Binary files /dev/null and b/content-rst/applications/sales/sales/gelato/odoo-company.png differ diff --git a/content/applications/sales/sales/invoicing.rst b/content-rst/applications/sales/sales/invoicing.rst similarity index 100% rename from content/applications/sales/sales/invoicing.rst rename to content-rst/applications/sales/sales/invoicing.rst diff --git a/content/applications/sales/sales/invoicing/down_payment.rst b/content-rst/applications/sales/sales/invoicing/down_payment.rst similarity index 100% rename from content/applications/sales/sales/invoicing/down_payment.rst rename to content-rst/applications/sales/sales/invoicing/down_payment.rst diff --git a/content-rst/applications/sales/sales/invoicing/down_payment/100p-down-payment-percentage.png b/content-rst/applications/sales/sales/invoicing/down_payment/100p-down-payment-percentage.png new file mode 100644 index 000000000..6b7352a33 Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/down_payment/100p-down-payment-percentage.png differ diff --git a/content-rst/applications/sales/sales/invoicing/down_payment/100p-invoice.png b/content-rst/applications/sales/sales/invoicing/down_payment/100p-invoice.png new file mode 100644 index 000000000..fc962d1f2 Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/down_payment/100p-invoice.png differ diff --git a/content-rst/applications/sales/sales/invoicing/down_payment/cabinet-product-details.png b/content-rst/applications/sales/sales/invoicing/down_payment/cabinet-product-details.png new file mode 100644 index 000000000..870b55667 Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/down_payment/cabinet-product-details.png differ diff --git a/content-rst/applications/sales/sales/invoicing/down_payment/cabinet-sales-orders-confirmed.png b/content-rst/applications/sales/sales/invoicing/down_payment/cabinet-sales-orders-confirmed.png new file mode 100644 index 000000000..d642b9b2d Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/down_payment/cabinet-sales-orders-confirmed.png differ diff --git a/content-rst/applications/sales/sales/invoicing/down_payment/create-invoices-pop-up-already-invoiced.png b/content-rst/applications/sales/sales/invoicing/down_payment/create-invoices-pop-up-already-invoiced.png new file mode 100644 index 000000000..e0d0acd86 Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/down_payment/create-invoices-pop-up-already-invoiced.png differ diff --git a/content-rst/applications/sales/sales/invoicing/down_payment/create-invoices-popup-form.png b/content-rst/applications/sales/sales/invoicing/down_payment/create-invoices-popup-form.png new file mode 100644 index 000000000..5980de575 Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/down_payment/create-invoices-popup-form.png differ diff --git a/content-rst/applications/sales/sales/invoicing/down_payment/customer-invoice-green-payment-banner.png b/content-rst/applications/sales/sales/invoicing/down_payment/customer-invoice-green-payment-banner.png new file mode 100644 index 000000000..31a82b02b Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/down_payment/customer-invoice-green-payment-banner.png differ diff --git a/content-rst/applications/sales/sales/invoicing/down_payment/customer-taxes-field.png b/content-rst/applications/sales/sales/invoicing/down_payment/customer-taxes-field.png new file mode 100644 index 000000000..20d3fed71 Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/down_payment/customer-taxes-field.png differ diff --git a/content-rst/applications/sales/sales/invoicing/down_payment/down-payments-section-order-lines.png b/content-rst/applications/sales/sales/invoicing/down_payment/down-payments-section-order-lines.png new file mode 100644 index 000000000..71c86dd67 Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/down_payment/down-payments-section-order-lines.png differ diff --git a/content-rst/applications/sales/sales/invoicing/down_payment/draft-invoice-sample.png b/content-rst/applications/sales/sales/invoicing/down_payment/draft-invoice-sample.png new file mode 100644 index 000000000..5c7375092 Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/down_payment/draft-invoice-sample.png differ diff --git a/content-rst/applications/sales/sales/invoicing/down_payment/income-account.png b/content-rst/applications/sales/sales/invoicing/down_payment/income-account.png new file mode 100644 index 000000000..6c7f99198 Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/down_payment/income-account.png differ diff --git a/content-rst/applications/sales/sales/invoicing/down_payment/register-payment-button.png b/content-rst/applications/sales/sales/invoicing/down_payment/register-payment-button.png new file mode 100644 index 000000000..798138d52 Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/down_payment/register-payment-button.png differ diff --git a/content-rst/applications/sales/sales/invoicing/down_payment/register-payment-pop-up-window.png b/content-rst/applications/sales/sales/invoicing/down_payment/register-payment-pop-up-window.png new file mode 100644 index 000000000..b305427de Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/down_payment/register-payment-pop-up-window.png differ diff --git a/content-rst/applications/sales/sales/invoicing/down_payment/second-down-payment-in-payment-invoice.png b/content-rst/applications/sales/sales/invoicing/down_payment/second-down-payment-in-payment-invoice.png new file mode 100644 index 000000000..3e21a67f1 Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/down_payment/second-down-payment-in-payment-invoice.png differ diff --git a/content-rst/applications/sales/sales/invoicing/down_payment/second-register-payment-popup.png b/content-rst/applications/sales/sales/invoicing/down_payment/second-register-payment-popup.png new file mode 100644 index 000000000..75f76ddc1 Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/down_payment/second-register-payment-popup.png differ diff --git a/content/applications/sales/sales/invoicing/expense.rst b/content-rst/applications/sales/sales/invoicing/expense.rst similarity index 100% rename from content/applications/sales/sales/invoicing/expense.rst rename to content-rst/applications/sales/sales/invoicing/expense.rst diff --git a/content-rst/applications/sales/sales/invoicing/expense/blank-expenses-form.png b/content-rst/applications/sales/sales/invoicing/expense/blank-expenses-form.png new file mode 100644 index 000000000..d9bc6ef25 Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/expense/blank-expenses-form.png differ diff --git a/content-rst/applications/sales/sales/invoicing/expense/confirmed-sales-order.png b/content-rst/applications/sales/sales/invoicing/expense/confirmed-sales-order.png new file mode 100644 index 000000000..5dda184f5 Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/expense/confirmed-sales-order.png differ diff --git a/content-rst/applications/sales/sales/invoicing/expense/create-invoices-popup.png b/content-rst/applications/sales/sales/invoicing/expense/create-invoices-popup.png new file mode 100644 index 000000000..d619cab9f Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/expense/create-invoices-popup.png differ diff --git a/content-rst/applications/sales/sales/invoicing/expense/customer-invoice-draft-with-expense.png b/content-rst/applications/sales/sales/invoicing/expense/customer-invoice-draft-with-expense.png new file mode 100644 index 000000000..f855a5d14 Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/expense/customer-invoice-draft-with-expense.png differ diff --git a/content-rst/applications/sales/sales/invoicing/expense/customer-invoice-register-payment.png b/content-rst/applications/sales/sales/invoicing/expense/customer-invoice-register-payment.png new file mode 100644 index 000000000..537ac890d Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/expense/customer-invoice-register-payment.png differ diff --git a/content-rst/applications/sales/sales/invoicing/expense/expense-categories-page.png b/content-rst/applications/sales/sales/invoicing/expense/expense-categories-page.png new file mode 100644 index 000000000..57f17546a Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/expense/expense-categories-page.png differ diff --git a/content-rst/applications/sales/sales/invoicing/expense/expense-category-pop-up.png b/content-rst/applications/sales/sales/invoicing/expense/expense-category-pop-up.png new file mode 100644 index 000000000..da8e60901 Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/expense/expense-category-pop-up.png differ diff --git a/content-rst/applications/sales/sales/invoicing/expense/expense-invoice-in-payment-banner.png b/content-rst/applications/sales/sales/invoicing/expense/expense-invoice-in-payment-banner.png new file mode 100644 index 000000000..a36774e90 Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/expense/expense-invoice-in-payment-banner.png differ diff --git a/content-rst/applications/sales/sales/invoicing/expense/expense-report-summary-form.png b/content-rst/applications/sales/sales/invoicing/expense/expense-report-summary-form.png new file mode 100644 index 000000000..3b20fd467 Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/expense/expense-report-summary-form.png differ diff --git a/content-rst/applications/sales/sales/invoicing/expense/expense-report-summary-manager-approve.png b/content-rst/applications/sales/sales/invoicing/expense/expense-report-summary-manager-approve.png new file mode 100644 index 000000000..96cc3aa9c Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/expense/expense-report-summary-manager-approve.png differ diff --git a/content-rst/applications/sales/sales/invoicing/expense/expense-report-summary-manager-post-journal.png b/content-rst/applications/sales/sales/invoicing/expense/expense-report-summary-manager-post-journal.png new file mode 100644 index 000000000..b118d402b Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/expense/expense-report-summary-manager-post-journal.png differ diff --git a/content-rst/applications/sales/sales/invoicing/expense/filled-in-expense-form.png b/content-rst/applications/sales/sales/invoicing/expense/filled-in-expense-form.png new file mode 100644 index 000000000..8637aeb6d Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/expense/filled-in-expense-form.png differ diff --git a/content-rst/applications/sales/sales/invoicing/expense/register-payment-popup.png b/content-rst/applications/sales/sales/invoicing/expense/register-payment-popup.png new file mode 100644 index 000000000..ac027b88e Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/expense/register-payment-popup.png differ diff --git a/content-rst/applications/sales/sales/invoicing/expense/reinvoice-expenses-field.png b/content-rst/applications/sales/sales/invoicing/expense/reinvoice-expenses-field.png new file mode 100644 index 000000000..d7a1551d4 Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/expense/reinvoice-expenses-field.png differ diff --git a/content-rst/applications/sales/sales/invoicing/expense/sales-order-with-expense-order-lines.png b/content-rst/applications/sales/sales/invoicing/expense/sales-order-with-expense-order-lines.png new file mode 100644 index 000000000..db453683d Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/expense/sales-order-with-expense-order-lines.png differ diff --git a/content/applications/sales/sales/invoicing/invoicing_policy.rst b/content-rst/applications/sales/sales/invoicing/invoicing_policy.rst similarity index 100% rename from content/applications/sales/sales/invoicing/invoicing_policy.rst rename to content-rst/applications/sales/sales/invoicing/invoicing_policy.rst diff --git a/content-rst/applications/sales/sales/invoicing/invoicing_policy/invoicing-policy-error-message.png b/content-rst/applications/sales/sales/invoicing/invoicing_policy/invoicing-policy-error-message.png new file mode 100644 index 000000000..52884ede7 Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/invoicing_policy/invoicing-policy-error-message.png differ diff --git a/content-rst/applications/sales/sales/invoicing/invoicing_policy/invoicing-policy-general-info-tab.png b/content-rst/applications/sales/sales/invoicing/invoicing_policy/invoicing-policy-general-info-tab.png new file mode 100644 index 000000000..658440b14 Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/invoicing_policy/invoicing-policy-general-info-tab.png differ diff --git a/content-rst/applications/sales/sales/invoicing/invoicing_policy/invoicing-policy-order-lines.png b/content-rst/applications/sales/sales/invoicing/invoicing_policy/invoicing-policy-order-lines.png new file mode 100644 index 000000000..34c15bcd0 Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/invoicing_policy/invoicing-policy-order-lines.png differ diff --git a/content-rst/applications/sales/sales/invoicing/invoicing_policy/invoicing-policy-setting.png b/content-rst/applications/sales/sales/invoicing/invoicing_policy/invoicing-policy-setting.png new file mode 100644 index 000000000..890c769aa Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/invoicing_policy/invoicing-policy-setting.png differ diff --git a/content/applications/sales/sales/invoicing/milestone.rst b/content-rst/applications/sales/sales/invoicing/milestone.rst similarity index 100% rename from content/applications/sales/sales/invoicing/milestone.rst rename to content-rst/applications/sales/sales/invoicing/milestone.rst diff --git a/content-rst/applications/sales/sales/invoicing/milestone/adding-milestones.png b/content-rst/applications/sales/sales/invoicing/milestone/adding-milestones.png new file mode 100644 index 000000000..0663a4f60 Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/milestone/adding-milestones.png differ diff --git a/content-rst/applications/sales/sales/invoicing/milestone/create-invoices-pop-up.png b/content-rst/applications/sales/sales/invoicing/milestone/create-invoices-pop-up.png new file mode 100644 index 000000000..cb106a978 Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/milestone/create-invoices-pop-up.png differ diff --git a/content-rst/applications/sales/sales/invoicing/milestone/delivered-milestone-product-sales-order.png b/content-rst/applications/sales/sales/invoicing/milestone/delivered-milestone-product-sales-order.png new file mode 100644 index 000000000..ae144945b Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/milestone/delivered-milestone-product-sales-order.png differ diff --git a/content-rst/applications/sales/sales/invoicing/milestone/in-payment-invoice.png b/content-rst/applications/sales/sales/invoicing/milestone/in-payment-invoice.png new file mode 100644 index 000000000..a7bdc58b6 Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/milestone/in-payment-invoice.png differ diff --git a/content-rst/applications/sales/sales/invoicing/milestone/invoice-draft-milestone.png b/content-rst/applications/sales/sales/invoicing/milestone/invoice-draft-milestone.png new file mode 100644 index 000000000..5b6412aca Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/milestone/invoice-draft-milestone.png differ diff --git a/content-rst/applications/sales/sales/invoicing/milestone/invoiced-column-filled-milestone.png b/content-rst/applications/sales/sales/invoicing/milestone/invoiced-column-filled-milestone.png new file mode 100644 index 000000000..a62dd26a8 Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/milestone/invoiced-column-filled-milestone.png differ diff --git a/content-rst/applications/sales/sales/invoicing/milestone/invoices-smart-button.png b/content-rst/applications/sales/sales/invoicing/milestone/invoices-smart-button.png new file mode 100644 index 000000000..33e94a608 Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/milestone/invoices-smart-button.png differ diff --git a/content-rst/applications/sales/sales/invoicing/milestone/invoicing-policy-field.png b/content-rst/applications/sales/sales/invoicing/milestone/invoicing-policy-field.png new file mode 100644 index 000000000..57f97cd48 Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/milestone/invoicing-policy-field.png differ diff --git a/content-rst/applications/sales/sales/invoicing/milestone/milestone-field-on-task-form.png b/content-rst/applications/sales/sales/invoicing/milestone/milestone-field-on-task-form.png new file mode 100644 index 000000000..2ab4eab99 Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/milestone/milestone-field-on-task-form.png differ diff --git a/content-rst/applications/sales/sales/invoicing/milestone/product-type-field.png b/content-rst/applications/sales/sales/invoicing/milestone/product-type-field.png new file mode 100644 index 000000000..ba38188c7 Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/milestone/product-type-field.png differ diff --git a/content-rst/applications/sales/sales/invoicing/milestone/project-task-option-project-workspace-fields.png b/content-rst/applications/sales/sales/invoicing/milestone/project-task-option-project-workspace-fields.png new file mode 100644 index 000000000..423d3d2eb Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/milestone/project-task-option-project-workspace-fields.png differ diff --git a/content-rst/applications/sales/sales/invoicing/milestone/reached-milestone.png b/content-rst/applications/sales/sales/invoicing/milestone/reached-milestone.png new file mode 100644 index 000000000..9269d7a3c Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/milestone/reached-milestone.png differ diff --git a/content-rst/applications/sales/sales/invoicing/milestone/register-payment-pop-up.png b/content-rst/applications/sales/sales/invoicing/milestone/register-payment-pop-up.png new file mode 100644 index 000000000..8ef8f5c1d Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/milestone/register-payment-pop-up.png differ diff --git a/content-rst/applications/sales/sales/invoicing/milestone/settings-for-workflow.png b/content-rst/applications/sales/sales/invoicing/milestone/settings-for-workflow.png new file mode 100644 index 000000000..7e81b2e84 Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/milestone/settings-for-workflow.png differ diff --git a/content-rst/applications/sales/sales/invoicing/milestone/task-option-project-field.png b/content-rst/applications/sales/sales/invoicing/milestone/task-option-project-field.png new file mode 100644 index 000000000..d1bc1124d Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/milestone/task-option-project-field.png differ diff --git a/content-rst/applications/sales/sales/invoicing/milestone/tasks-page.png b/content-rst/applications/sales/sales/invoicing/milestone/tasks-page.png new file mode 100644 index 000000000..a1e2400af Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/milestone/tasks-page.png differ diff --git a/content/applications/sales/sales/invoicing/proforma.rst b/content-rst/applications/sales/sales/invoicing/proforma.rst similarity index 100% rename from content/applications/sales/sales/invoicing/proforma.rst rename to content-rst/applications/sales/sales/invoicing/proforma.rst diff --git a/content-rst/applications/sales/sales/invoicing/proforma/pro-forma-email-message-pop-up.png b/content-rst/applications/sales/sales/invoicing/proforma/pro-forma-email-message-pop-up.png new file mode 100644 index 000000000..e614f2635 Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/proforma/pro-forma-email-message-pop-up.png differ diff --git a/content-rst/applications/sales/sales/invoicing/proforma/pro-forma-pdf.png b/content-rst/applications/sales/sales/invoicing/proforma/pro-forma-pdf.png new file mode 100644 index 000000000..1761706ca Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/proforma/pro-forma-pdf.png differ diff --git a/content-rst/applications/sales/sales/invoicing/proforma/pro-forma-setting.png b/content-rst/applications/sales/sales/invoicing/proforma/pro-forma-setting.png new file mode 100644 index 000000000..94e89e190 Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/proforma/pro-forma-setting.png differ diff --git a/content-rst/applications/sales/sales/invoicing/proforma/send-pro-forma-invoice-button.png b/content-rst/applications/sales/sales/invoicing/proforma/send-pro-forma-invoice-button.png new file mode 100644 index 000000000..ede360360 Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/proforma/send-pro-forma-invoice-button.png differ diff --git a/content/applications/sales/sales/invoicing/time_materials.rst b/content-rst/applications/sales/sales/invoicing/time_materials.rst similarity index 100% rename from content/applications/sales/sales/invoicing/time_materials.rst rename to content-rst/applications/sales/sales/invoicing/time_materials.rst diff --git a/content-rst/applications/sales/sales/invoicing/time_materials/analytic-accounting-setting.png b/content-rst/applications/sales/sales/invoicing/time_materials/analytic-accounting-setting.png new file mode 100644 index 000000000..bc7827e19 Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/time_materials/analytic-accounting-setting.png differ diff --git a/content-rst/applications/sales/sales/invoicing/time_materials/analytic-drop-down-distribution.png b/content-rst/applications/sales/sales/invoicing/time_materials/analytic-drop-down-distribution.png new file mode 100644 index 000000000..bead47b56 Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/time_materials/analytic-drop-down-distribution.png differ diff --git a/content-rst/applications/sales/sales/invoicing/time_materials/customer-invoice-for-expense.png b/content-rst/applications/sales/sales/invoicing/time_materials/customer-invoice-for-expense.png new file mode 100644 index 000000000..31e5988c5 Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/time_materials/customer-invoice-for-expense.png differ diff --git a/content-rst/applications/sales/sales/invoicing/time_materials/draft-invoice-with-purchase-product.png b/content-rst/applications/sales/sales/invoicing/time_materials/draft-invoice-with-purchase-product.png new file mode 100644 index 000000000..90e830676 Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/time_materials/draft-invoice-with-purchase-product.png differ diff --git a/content-rst/applications/sales/sales/invoicing/time_materials/expense-detail-form.png b/content-rst/applications/sales/sales/invoicing/time_materials/expense-detail-form.png new file mode 100644 index 000000000..ad13052fe Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/time_materials/expense-detail-form.png differ diff --git a/content-rst/applications/sales/sales/invoicing/time_materials/expense-report-summary.png b/content-rst/applications/sales/sales/invoicing/time_materials/expense-report-summary.png new file mode 100644 index 000000000..40613a4d1 Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/time_materials/expense-report-summary.png differ diff --git a/content-rst/applications/sales/sales/invoicing/time_materials/extra-column-analytic-distribution-option.png b/content-rst/applications/sales/sales/invoicing/time_materials/extra-column-analytic-distribution-option.png new file mode 100644 index 000000000..e44cf633f Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/time_materials/extra-column-analytic-distribution-option.png differ diff --git a/content-rst/applications/sales/sales/invoicing/time_materials/invoice-expense-from-sales-order.png b/content-rst/applications/sales/sales/invoicing/time_materials/invoice-expense-from-sales-order.png new file mode 100644 index 000000000..b49587ffb Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/time_materials/invoice-expense-from-sales-order.png differ diff --git a/content-rst/applications/sales/sales/invoicing/time_materials/invoice-lines-time.png b/content-rst/applications/sales/sales/invoicing/time_materials/invoice-lines-time.png new file mode 100644 index 000000000..e0e9daa85 Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/time_materials/invoice-lines-time.png differ diff --git a/content-rst/applications/sales/sales/invoicing/time_materials/product-form-settings-invoice-purchase.png b/content-rst/applications/sales/sales/invoicing/time_materials/product-form-settings-invoice-purchase.png new file mode 100644 index 000000000..0521bdb51 Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/time_materials/product-form-settings-invoice-purchase.png differ diff --git a/content-rst/applications/sales/sales/invoicing/time_materials/projects-tasks-smart-buttons.png b/content-rst/applications/sales/sales/invoicing/time_materials/projects-tasks-smart-buttons.png new file mode 100644 index 000000000..f05f6bd98 Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/time_materials/projects-tasks-smart-buttons.png differ diff --git a/content-rst/applications/sales/sales/invoicing/time_materials/purchase-order-on-sales-order.png b/content-rst/applications/sales/sales/invoicing/time_materials/purchase-order-on-sales-order.png new file mode 100644 index 000000000..84e3cd98c Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/time_materials/purchase-order-on-sales-order.png differ diff --git a/content-rst/applications/sales/sales/invoicing/time_materials/service-product-general-settings.png b/content-rst/applications/sales/sales/invoicing/time_materials/service-product-general-settings.png new file mode 100644 index 000000000..ef5bdabcb Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/time_materials/service-product-general-settings.png differ diff --git a/content-rst/applications/sales/sales/invoicing/time_materials/timesheets-feature.png b/content-rst/applications/sales/sales/invoicing/time_materials/timesheets-feature.png new file mode 100644 index 000000000..84d360c71 Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/time_materials/timesheets-feature.png differ diff --git a/content-rst/applications/sales/sales/invoicing/time_materials/timesheets-tab-on-task.png b/content-rst/applications/sales/sales/invoicing/time_materials/timesheets-tab-on-task.png new file mode 100644 index 000000000..feae7efc5 Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/time_materials/timesheets-tab-on-task.png differ diff --git a/content-rst/applications/sales/sales/invoicing/time_materials/vendor-bill-draft.png b/content-rst/applications/sales/sales/invoicing/time_materials/vendor-bill-draft.png new file mode 100644 index 000000000..1d826e502 Binary files /dev/null and b/content-rst/applications/sales/sales/invoicing/time_materials/vendor-bill-draft.png differ diff --git a/content/applications/sales/sales/products_prices.rst b/content-rst/applications/sales/sales/products_prices.rst similarity index 100% rename from content/applications/sales/sales/products_prices.rst rename to content-rst/applications/sales/sales/products_prices.rst diff --git a/content/applications/sales/sales/products_prices/ewallets_giftcards.rst b/content-rst/applications/sales/sales/products_prices/ewallets_giftcards.rst similarity index 100% rename from content/applications/sales/sales/products_prices/ewallets_giftcards.rst rename to content-rst/applications/sales/sales/products_prices/ewallets_giftcards.rst diff --git a/content-rst/applications/sales/sales/products_prices/ewallets_giftcards/ewallet-configuration.png b/content-rst/applications/sales/sales/products_prices/ewallets_giftcards/ewallet-configuration.png new file mode 100644 index 000000000..3e8844cf6 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/ewallets_giftcards/ewallet-configuration.png differ diff --git a/content-rst/applications/sales/sales/products_prices/ewallets_giftcards/ewallet-share.png b/content-rst/applications/sales/sales/products_prices/ewallets_giftcards/ewallet-share.png new file mode 100644 index 000000000..d38e70bd7 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/ewallets_giftcards/ewallet-share.png differ diff --git a/content-rst/applications/sales/sales/products_prices/ewallets_giftcards/giftcard-configuration.png b/content-rst/applications/sales/sales/products_prices/ewallets_giftcards/giftcard-configuration.png new file mode 100644 index 000000000..ca15c0ad7 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/ewallets_giftcards/giftcard-configuration.png differ diff --git a/content-rst/applications/sales/sales/products_prices/ewallets_giftcards/giftcard-share.png b/content-rst/applications/sales/sales/products_prices/ewallets_giftcards/giftcard-share.png new file mode 100644 index 000000000..5cbd09aa1 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/ewallets_giftcards/giftcard-share.png differ diff --git a/content/applications/sales/sales/products_prices/loyalty_discount.rst b/content-rst/applications/sales/sales/products_prices/loyalty_discount.rst similarity index 100% rename from content/applications/sales/sales/products_prices/loyalty_discount.rst rename to content-rst/applications/sales/sales/products_prices/loyalty_discount.rst diff --git a/content-rst/applications/sales/sales/products_prices/loyalty_discount/loyalty-cards-smart-button.png b/content-rst/applications/sales/sales/products_prices/loyalty_discount/loyalty-cards-smart-button.png new file mode 100644 index 000000000..628abbea1 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/loyalty_discount/loyalty-cards-smart-button.png differ diff --git a/content-rst/applications/sales/sales/products_prices/loyalty_discount/price-conditional-rewards.png b/content-rst/applications/sales/sales/products_prices/loyalty_discount/price-conditional-rewards.png new file mode 100644 index 000000000..3425ec6be Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/loyalty_discount/price-conditional-rewards.png differ diff --git a/content-rst/applications/sales/sales/products_prices/loyalty_discount/price-conditions.png b/content-rst/applications/sales/sales/products_prices/loyalty_discount/price-conditions.png new file mode 100644 index 000000000..ce1c4ddad Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/loyalty_discount/price-conditions.png differ diff --git a/content-rst/applications/sales/sales/products_prices/loyalty_discount/price-discount-loyalty.png b/content-rst/applications/sales/sales/products_prices/loyalty_discount/price-discount-loyalty.png new file mode 100644 index 000000000..546cb2f02 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/loyalty_discount/price-discount-loyalty.png differ diff --git a/content-rst/applications/sales/sales/products_prices/loyalty_discount/price-programs-items.png b/content-rst/applications/sales/sales/products_prices/loyalty_discount/price-programs-items.png new file mode 100644 index 000000000..7b0e16ce5 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/loyalty_discount/price-programs-items.png differ diff --git a/content-rst/applications/sales/sales/products_prices/loyalty_discount/price-programs.png b/content-rst/applications/sales/sales/products_prices/loyalty_discount/price-programs.png new file mode 100644 index 000000000..1bf7da065 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/loyalty_discount/price-programs.png differ diff --git a/content-rst/applications/sales/sales/products_prices/loyalty_discount/price-rewards.png b/content-rst/applications/sales/sales/products_prices/loyalty_discount/price-rewards.png new file mode 100644 index 000000000..f33a9e3f0 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/loyalty_discount/price-rewards.png differ diff --git a/content/applications/sales/sales/products_prices/prices.rst b/content-rst/applications/sales/sales/products_prices/prices.rst similarity index 100% rename from content/applications/sales/sales/products_prices/prices.rst rename to content-rst/applications/sales/sales/products_prices/prices.rst diff --git a/content/applications/sales/sales/products_prices/prices/currencies.rst b/content-rst/applications/sales/sales/products_prices/prices/currencies.rst similarity index 100% rename from content/applications/sales/sales/products_prices/prices/currencies.rst rename to content-rst/applications/sales/sales/products_prices/prices/currencies.rst diff --git a/content-rst/applications/sales/sales/products_prices/prices/currencies/automatic-currency-rates.png b/content-rst/applications/sales/sales/products_prices/prices/currencies/automatic-currency-rates.png new file mode 100644 index 000000000..c512686e8 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/prices/currencies/automatic-currency-rates.png differ diff --git a/content-rst/applications/sales/sales/products_prices/prices/currencies/blank-currency-detail-form.png b/content-rst/applications/sales/sales/products_prices/prices/currencies/blank-currency-detail-form.png new file mode 100644 index 000000000..92bf9d7b4 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/prices/currencies/blank-currency-detail-form.png differ diff --git a/content-rst/applications/sales/sales/products_prices/prices/currencies/currency-detail-form.png b/content-rst/applications/sales/sales/products_prices/prices/currencies/currency-detail-form.png new file mode 100644 index 000000000..1b1281fd5 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/prices/currencies/currency-detail-form.png differ diff --git a/content-rst/applications/sales/sales/products_prices/prices/currencies/main-currencies-page.png b/content-rst/applications/sales/sales/products_prices/prices/currencies/main-currencies-page.png new file mode 100644 index 000000000..43dce08e2 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/prices/currencies/main-currencies-page.png differ diff --git a/content-rst/applications/sales/sales/products_prices/prices/currencies/main-currency-detail-form.png b/content-rst/applications/sales/sales/products_prices/prices/currencies/main-currency-detail-form.png new file mode 100644 index 000000000..ca5f212b9 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/prices/currencies/main-currency-detail-form.png differ diff --git a/content-rst/applications/sales/sales/products_prices/prices/currencies/main-currency-setting-page.png b/content-rst/applications/sales/sales/products_prices/prices/currencies/main-currency-setting-page.png new file mode 100644 index 000000000..00be2f58e Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/prices/currencies/main-currency-setting-page.png differ diff --git a/content-rst/applications/sales/sales/products_prices/prices/currencies/price-rules-currencies.png b/content-rst/applications/sales/sales/products_prices/prices/currencies/price-rules-currencies.png new file mode 100644 index 000000000..c20db4210 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/prices/currencies/price-rules-currencies.png differ diff --git a/content/applications/sales/sales/products_prices/prices/discounts.rst b/content-rst/applications/sales/sales/products_prices/prices/discounts.rst similarity index 100% rename from content/applications/sales/sales/products_prices/prices/discounts.rst rename to content-rst/applications/sales/sales/products_prices/prices/discounts.rst diff --git a/content-rst/applications/sales/sales/products_prices/prices/discounts/discount-button-sales-order.png b/content-rst/applications/sales/sales/products_prices/prices/discounts/discount-button-sales-order.png new file mode 100644 index 000000000..a15efb486 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/prices/discounts/discount-button-sales-order.png differ diff --git a/content-rst/applications/sales/sales/products_prices/prices/discounts/discount-on-sales-order-fs8.png b/content-rst/applications/sales/sales/products_prices/prices/discounts/discount-on-sales-order-fs8.png new file mode 100644 index 000000000..512897751 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/prices/discounts/discount-on-sales-order-fs8.png differ diff --git a/content-rst/applications/sales/sales/products_prices/prices/discounts/discount-on-sales-order.png b/content-rst/applications/sales/sales/products_prices/prices/discounts/discount-on-sales-order.png new file mode 100644 index 000000000..69023ddc7 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/prices/discounts/discount-on-sales-order.png differ diff --git a/content-rst/applications/sales/sales/products_prices/prices/discounts/discounts-option.png b/content-rst/applications/sales/sales/products_prices/prices/discounts/discounts-option.png new file mode 100644 index 000000000..89fb1ab54 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/prices/discounts/discounts-option.png differ diff --git a/content-rst/applications/sales/sales/products_prices/prices/discounts/fixed-discount-on-sales-order-fs8.png b/content-rst/applications/sales/sales/products_prices/prices/discounts/fixed-discount-on-sales-order-fs8.png new file mode 100644 index 000000000..767ea442e Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/prices/discounts/fixed-discount-on-sales-order-fs8.png differ diff --git a/content-rst/applications/sales/sales/products_prices/prices/discounts/fixed-discount-on-sales-order.png b/content-rst/applications/sales/sales/products_prices/prices/discounts/fixed-discount-on-sales-order.png new file mode 100644 index 000000000..3c7039a61 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/prices/discounts/fixed-discount-on-sales-order.png differ diff --git a/content-rst/applications/sales/sales/products_prices/prices/discounts/global-discount-option-fs8.png b/content-rst/applications/sales/sales/products_prices/prices/discounts/global-discount-option-fs8.png new file mode 100644 index 000000000..ca63fb7c5 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/prices/discounts/global-discount-option-fs8.png differ diff --git a/content-rst/applications/sales/sales/products_prices/prices/discounts/global-discount-option.png b/content-rst/applications/sales/sales/products_prices/prices/discounts/global-discount-option.png new file mode 100644 index 000000000..efb63f6bc Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/prices/discounts/global-discount-option.png differ diff --git a/content/applications/sales/sales/products_prices/prices/pricing.rst b/content-rst/applications/sales/sales/products_prices/prices/pricing.rst similarity index 100% rename from content/applications/sales/sales/products_prices/prices/pricing.rst rename to content-rst/applications/sales/sales/products_prices/prices/pricing.rst diff --git a/content-rst/applications/sales/sales/products_prices/prices/pricing/18-sales-new-pricelist-form.png b/content-rst/applications/sales/sales/products_prices/prices/pricing/18-sales-new-pricelist-form.png new file mode 100644 index 000000000..29c4105e7 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/prices/pricing/18-sales-new-pricelist-form.png differ diff --git a/content-rst/applications/sales/sales/products_prices/prices/pricing/18-sales-pricelist-page.png b/content-rst/applications/sales/sales/products_prices/prices/pricing/18-sales-pricelist-page.png new file mode 100644 index 000000000..7b7edce8f Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/prices/pricing/18-sales-pricelist-page.png differ diff --git a/content-rst/applications/sales/sales/products_prices/prices/pricing/customer-detail-form.png b/content-rst/applications/sales/sales/products_prices/prices/pricing/customer-detail-form.png new file mode 100644 index 000000000..68f8efe09 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/prices/pricing/customer-detail-form.png differ diff --git a/content-rst/applications/sales/sales/products_prices/prices/pricing/customer-form-pricelist-field.png b/content-rst/applications/sales/sales/products_prices/prices/pricing/customer-form-pricelist-field.png new file mode 100644 index 000000000..aed52c10b Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/prices/pricing/customer-form-pricelist-field.png differ diff --git a/content-rst/applications/sales/sales/products_prices/prices/pricing/formula-discount-example.png b/content-rst/applications/sales/sales/products_prices/prices/pricing/formula-discount-example.png new file mode 100644 index 000000000..58d2075c3 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/prices/pricing/formula-discount-example.png differ diff --git a/content-rst/applications/sales/sales/products_prices/prices/pricing/formula-markup-cost-example.png b/content-rst/applications/sales/sales/products_prices/prices/pricing/formula-markup-cost-example.png new file mode 100644 index 000000000..0db650ed3 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/prices/pricing/formula-markup-cost-example.png differ diff --git a/content-rst/applications/sales/sales/products_prices/prices/pricing/pricelist-feature-setting.png b/content-rst/applications/sales/sales/products_prices/prices/pricing/pricelist-feature-setting.png new file mode 100644 index 000000000..64a63bd56 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/prices/pricing/pricelist-feature-setting.png differ diff --git a/content-rst/applications/sales/sales/products_prices/prices/pricing/sales-pricelist-ecommerce.png b/content-rst/applications/sales/sales/products_prices/prices/pricing/sales-pricelist-ecommerce.png new file mode 100644 index 000000000..91ae16ab1 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/prices/pricing/sales-pricelist-ecommerce.png differ diff --git a/content-rst/applications/sales/sales/products_prices/prices/pricing/sales-pricelist-pricerule-discount-customer.png b/content-rst/applications/sales/sales/products_prices/prices/pricing/sales-pricelist-pricerule-discount-customer.png new file mode 100644 index 000000000..7507038e3 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/prices/pricing/sales-pricelist-pricerule-discount-customer.png differ diff --git a/content-rst/applications/sales/sales/products_prices/prices/pricing/sales-pricelist-pricerule-discount.png b/content-rst/applications/sales/sales/products_prices/prices/pricing/sales-pricelist-pricerule-discount.png new file mode 100644 index 000000000..79e48a330 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/prices/pricing/sales-pricelist-pricerule-discount.png differ diff --git a/content-rst/applications/sales/sales/products_prices/prices/pricing/sales-pricelist-recurringprices.png b/content-rst/applications/sales/sales/products_prices/prices/pricing/sales-pricelist-recurringprices.png new file mode 100644 index 000000000..0c5ed4657 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/prices/pricing/sales-pricelist-recurringprices.png differ diff --git a/content-rst/applications/sales/sales/products_prices/prices/pricing/sales-pricelist-rental.png b/content-rst/applications/sales/sales/products_prices/prices/pricing/sales-pricelist-rental.png new file mode 100644 index 000000000..cc8eec35d Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/prices/pricing/sales-pricelist-rental.png differ diff --git a/content-rst/applications/sales/sales/products_prices/prices/pricing/time-period-popup.png b/content-rst/applications/sales/sales/products_prices/prices/pricing/time-period-popup.png new file mode 100644 index 000000000..ca4638716 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/prices/pricing/time-period-popup.png differ diff --git a/content/applications/sales/sales/products_prices/products.rst b/content-rst/applications/sales/sales/products_prices/products.rst similarity index 100% rename from content/applications/sales/sales/products_prices/products.rst rename to content-rst/applications/sales/sales/products_prices/products.rst diff --git a/content/applications/sales/sales/products_prices/products/import.rst b/content-rst/applications/sales/sales/products_prices/products/import.rst similarity index 100% rename from content/applications/sales/sales/products_prices/products/import.rst rename to content-rst/applications/sales/sales/products_prices/products/import.rst diff --git a/content-rst/applications/sales/sales/products_prices/products/import/attributes-and-values-spreadsheet.png b/content-rst/applications/sales/sales/products_prices/products/import/attributes-and-values-spreadsheet.png new file mode 100644 index 000000000..235266a59 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/products/import/attributes-and-values-spreadsheet.png differ diff --git a/content-rst/applications/sales/sales/products_prices/products/import/everything-seems-valid-message.png b/content-rst/applications/sales/sales/products_prices/products/import/everything-seems-valid-message.png new file mode 100644 index 000000000..a09e226c1 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/products/import/everything-seems-valid-message.png differ diff --git a/content-rst/applications/sales/sales/products_prices/products/import/gear-import-records-option.png b/content-rst/applications/sales/sales/products_prices/products/import/gear-import-records-option.png new file mode 100644 index 000000000..ba0ba67c0 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/products/import/gear-import-records-option.png differ diff --git a/content-rst/applications/sales/sales/products_prices/products/import/import-a-file-page.png b/content-rst/applications/sales/sales/products_prices/products/import/import-a-file-page.png new file mode 100644 index 000000000..0428f3031 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/products/import/import-a-file-page.png differ diff --git a/content-rst/applications/sales/sales/products_prices/products/import/import-error-message.png b/content-rst/applications/sales/sales/products_prices/products/import/import-error-message.png new file mode 100644 index 000000000..9095610fc Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/products/import/import-error-message.png differ diff --git a/content-rst/applications/sales/sales/products_prices/products/import/import-template-products.png b/content-rst/applications/sales/sales/products_prices/products/import/import-template-products.png new file mode 100644 index 000000000..e2166c8f5 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/products/import/import-template-products.png differ diff --git a/content-rst/applications/sales/sales/products_prices/products/import/odoo-field-dropdown-menu.png b/content-rst/applications/sales/sales/products_prices/products/import/odoo-field-dropdown-menu.png new file mode 100644 index 000000000..3b2abded4 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/products/import/odoo-field-dropdown-menu.png differ diff --git a/content-rst/applications/sales/sales/products_prices/products/import/product-attribute-spreadsheet-import.png b/content-rst/applications/sales/sales/products_prices/products/import/product-attribute-spreadsheet-import.png new file mode 100644 index 000000000..d8aa4c144 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/products/import/product-attribute-spreadsheet-import.png differ diff --git a/content-rst/applications/sales/sales/products_prices/products/import/successful-import-popup.png b/content-rst/applications/sales/sales/products_prices/products/import/successful-import-popup.png new file mode 100644 index 000000000..4873dc454 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/products/import/successful-import-popup.png differ diff --git a/content-rst/applications/sales/sales/products_prices/products/import/upload-file-button.png b/content-rst/applications/sales/sales/products_prices/products/import/upload-file-button.png new file mode 100644 index 000000000..5f1f82415 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/products/import/upload-file-button.png differ diff --git a/content/applications/sales/sales/products_prices/products/product_images.rst b/content-rst/applications/sales/sales/products_prices/products/product_images.rst similarity index 100% rename from content/applications/sales/sales/products_prices/products/product_images.rst rename to content-rst/applications/sales/sales/products_prices/products/product_images.rst diff --git a/content-rst/applications/sales/sales/products_prices/products/product_images/api-key-pop-up.png b/content-rst/applications/sales/sales/products_prices/products/product_images/api-key-pop-up.png new file mode 100644 index 000000000..429f75b34 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/products/product_images/api-key-pop-up.png differ diff --git a/content-rst/applications/sales/sales/products_prices/products/product_images/basic-overview-search-engine-id.png b/content-rst/applications/sales/sales/products_prices/products/product_images/basic-overview-search-engine-id.png new file mode 100644 index 000000000..b9901b60e Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/products/product_images/basic-overview-search-engine-id.png differ diff --git a/content-rst/applications/sales/sales/products_prices/products/product_images/click-get-picture-from-pop-up.png b/content-rst/applications/sales/sales/products_prices/products/product_images/click-get-picture-from-pop-up.png new file mode 100644 index 000000000..5633ac1a6 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/products/product_images/click-get-picture-from-pop-up.png differ diff --git a/content-rst/applications/sales/sales/products_prices/products/product_images/create-new-search.png b/content-rst/applications/sales/sales/products_prices/products/product_images/create-new-search.png new file mode 100644 index 000000000..60b30bbd8 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/products/product_images/create-new-search.png differ diff --git a/content-rst/applications/sales/sales/products_prices/products/product_images/credentials-api-key.png b/content-rst/applications/sales/sales/products_prices/products/product_images/credentials-api-key.png new file mode 100644 index 000000000..1da761d68 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/products/product_images/credentials-api-key.png differ diff --git a/content-rst/applications/sales/sales/products_prices/products/product_images/custom-search-api-search-bar.png b/content-rst/applications/sales/sales/products_prices/products/product_images/custom-search-api-search-bar.png new file mode 100644 index 000000000..5c4b2b30c Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/products/product_images/custom-search-api-search-bar.png differ diff --git a/content-rst/applications/sales/sales/products_prices/products/product_images/gcp-custom-search-api-page.png b/content-rst/applications/sales/sales/products_prices/products/product_images/gcp-custom-search-api-page.png new file mode 100644 index 000000000..ca8619028 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/products/product_images/gcp-custom-search-api-page.png differ diff --git a/content-rst/applications/sales/sales/products_prices/products/product_images/get-pictures-from-google-action.png b/content-rst/applications/sales/sales/products_prices/products/product_images/get-pictures-from-google-action.png new file mode 100644 index 000000000..aeeedda60 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/products/product_images/get-pictures-from-google-action.png differ diff --git a/content-rst/applications/sales/sales/products_prices/products/product_images/google-images-setting.png b/content-rst/applications/sales/sales/products_prices/products/product_images/google-images-setting.png new file mode 100644 index 000000000..c265b0db9 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/products/product_images/google-images-setting.png differ diff --git a/content-rst/applications/sales/sales/products_prices/products/product_images/google-pse-get-started.png b/content-rst/applications/sales/sales/products_prices/products/product_images/google-pse-get-started.png new file mode 100644 index 000000000..f20215a3d Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/products/product_images/google-pse-get-started.png differ diff --git a/content-rst/applications/sales/sales/products_prices/products/product_images/new-search-engine-has-been-created.png b/content-rst/applications/sales/sales/products_prices/products/product_images/new-search-engine-has-been-created.png new file mode 100644 index 000000000..6833121a8 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/products/product_images/new-search-engine-has-been-created.png differ diff --git a/content/applications/sales/sales/products_prices/products/variants.rst b/content-rst/applications/sales/sales/products_prices/products/variants.rst similarity index 100% rename from content/applications/sales/sales/products_prices/products/variants.rst rename to content-rst/applications/sales/sales/products_prices/products/variants.rst diff --git a/content-rst/applications/sales/sales/products_prices/products/variants/activating-variants-setting.png b/content-rst/applications/sales/sales/products_prices/products/variants/activating-variants-setting.png new file mode 100644 index 000000000..3eae04db4 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/products/variants/activating-variants-setting.png differ diff --git a/content-rst/applications/sales/sales/products_prices/products/variants/attribute-category-internal-link.png b/content-rst/applications/sales/sales/products_prices/products/variants/attribute-category-internal-link.png new file mode 100644 index 000000000..7933a750b Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/products/variants/attribute-category-internal-link.png differ diff --git a/content-rst/applications/sales/sales/products_prices/products/variants/attribute-creation.png b/content-rst/applications/sales/sales/products_prices/products/variants/attribute-creation.png new file mode 100644 index 000000000..6995f3c3c Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/products/variants/attribute-creation.png differ diff --git a/content-rst/applications/sales/sales/products_prices/products/variants/attribute-value-add-a-line.png b/content-rst/applications/sales/sales/products_prices/products/variants/attribute-value-add-a-line.png new file mode 100644 index 000000000..f7f540237 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/products/variants/attribute-value-add-a-line.png differ diff --git a/content-rst/applications/sales/sales/products_prices/products/variants/attributes-values-tab.png b/content-rst/applications/sales/sales/products_prices/products/variants/attributes-values-tab.png new file mode 100644 index 000000000..e300e540c Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/products/variants/attributes-values-tab.png differ diff --git a/content-rst/applications/sales/sales/products_prices/products/variants/display-types.png b/content-rst/applications/sales/sales/products_prices/products/variants/display-types.png new file mode 100644 index 000000000..0eeb30d6e Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/products/variants/display-types.png differ diff --git a/content-rst/applications/sales/sales/products_prices/products/variants/picking-a-color.png b/content-rst/applications/sales/sales/products_prices/products/variants/picking-a-color.png new file mode 100644 index 000000000..d282de90d Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/products/variants/picking-a-color.png differ diff --git a/content-rst/applications/sales/sales/products_prices/products/variants/product-variant-value-page.png b/content-rst/applications/sales/sales/products_prices/products/variants/product-variant-value-page.png new file mode 100644 index 000000000..2bcaef422 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/products/variants/product-variant-value-page.png differ diff --git a/content-rst/applications/sales/sales/products_prices/products/variants/product-variant-values.png b/content-rst/applications/sales/sales/products_prices/products/variants/product-variant-values.png new file mode 100644 index 000000000..9f2446e08 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/products/variants/product-variant-values.png differ diff --git a/content-rst/applications/sales/sales/products_prices/products/variants/variants-page.png b/content-rst/applications/sales/sales/products_prices/products/variants/variants-page.png new file mode 100644 index 000000000..2c64098c5 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/products/variants/variants-page.png differ diff --git a/content-rst/applications/sales/sales/products_prices/products/variants/variants-smart-button.png b/content-rst/applications/sales/sales/products_prices/products/variants/variants-smart-button.png new file mode 100644 index 000000000..3d0d5cd07 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/products/variants/variants-smart-button.png differ diff --git a/content/applications/sales/sales/products_prices/returns.rst b/content-rst/applications/sales/sales/products_prices/returns.rst similarity index 100% rename from content/applications/sales/sales/products_prices/returns.rst rename to content-rst/applications/sales/sales/products_prices/returns.rst diff --git a/content-rst/applications/sales/sales/products_prices/returns/credit-note-button.png b/content-rst/applications/sales/sales/products_prices/returns/credit-note-button.png new file mode 100644 index 000000000..36634cc9f Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/returns/credit-note-button.png differ diff --git a/content-rst/applications/sales/sales/products_prices/returns/credit-note-pop-up-form.png b/content-rst/applications/sales/sales/products_prices/returns/credit-note-pop-up-form.png new file mode 100644 index 000000000..faa9919bc Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/returns/credit-note-pop-up-form.png differ diff --git a/content-rst/applications/sales/sales/products_prices/returns/green-in-payment-banner.png b/content-rst/applications/sales/sales/products_prices/returns/green-in-payment-banner.png new file mode 100644 index 000000000..2db5e3514 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/returns/green-in-payment-banner.png differ diff --git a/content-rst/applications/sales/sales/products_prices/returns/reverse-transfer-popup.png b/content-rst/applications/sales/sales/products_prices/returns/reverse-transfer-popup.png new file mode 100644 index 000000000..b01f549d1 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/returns/reverse-transfer-popup.png differ diff --git a/content-rst/applications/sales/sales/products_prices/returns/sales-order-delivery-smart-button.png b/content-rst/applications/sales/sales/products_prices/returns/sales-order-delivery-smart-button.png new file mode 100644 index 000000000..167d81ec4 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/returns/sales-order-delivery-smart-button.png differ diff --git a/content-rst/applications/sales/sales/products_prices/returns/updated-sales-quantities.png b/content-rst/applications/sales/sales/products_prices/returns/updated-sales-quantities.png new file mode 100644 index 000000000..ed5ef2b75 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/returns/updated-sales-quantities.png differ diff --git a/content-rst/applications/sales/sales/products_prices/returns/validated-delivery-order-return-button.png b/content-rst/applications/sales/sales/products_prices/returns/validated-delivery-order-return-button.png new file mode 100644 index 000000000..b67c8fe60 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/returns/validated-delivery-order-return-button.png differ diff --git a/content-rst/applications/sales/sales/products_prices/returns/warehouse-operation-confirmed-return.png b/content-rst/applications/sales/sales/products_prices/returns/warehouse-operation-confirmed-return.png new file mode 100644 index 000000000..d1c294513 Binary files /dev/null and b/content-rst/applications/sales/sales/products_prices/returns/warehouse-operation-confirmed-return.png differ diff --git a/content/applications/sales/sales/send_quotations.rst b/content-rst/applications/sales/sales/send_quotations.rst similarity index 100% rename from content/applications/sales/sales/send_quotations.rst rename to content-rst/applications/sales/sales/send_quotations.rst diff --git a/content/applications/sales/sales/send_quotations/create_quotations.rst b/content-rst/applications/sales/sales/send_quotations/create_quotations.rst similarity index 100% rename from content/applications/sales/sales/send_quotations/create_quotations.rst rename to content-rst/applications/sales/sales/send_quotations/create_quotations.rst diff --git a/content-rst/applications/sales/sales/send_quotations/create_quotations/other-info-delivery.png b/content-rst/applications/sales/sales/send_quotations/create_quotations/other-info-delivery.png new file mode 100644 index 000000000..db7b6cf89 Binary files /dev/null and b/content-rst/applications/sales/sales/send_quotations/create_quotations/other-info-delivery.png differ diff --git a/content-rst/applications/sales/sales/send_quotations/create_quotations/other-info-invoicing.png b/content-rst/applications/sales/sales/send_quotations/create_quotations/other-info-invoicing.png new file mode 100644 index 000000000..776fffea0 Binary files /dev/null and b/content-rst/applications/sales/sales/send_quotations/create_quotations/other-info-invoicing.png differ diff --git a/content-rst/applications/sales/sales/send_quotations/create_quotations/other-info-sales.png b/content-rst/applications/sales/sales/send_quotations/create_quotations/other-info-sales.png new file mode 100644 index 000000000..491cffe28 Binary files /dev/null and b/content-rst/applications/sales/sales/send_quotations/create_quotations/other-info-sales.png differ diff --git a/content-rst/applications/sales/sales/send_quotations/create_quotations/other-info-tracking.png b/content-rst/applications/sales/sales/send_quotations/create_quotations/other-info-tracking.png new file mode 100644 index 000000000..9e61e5870 Binary files /dev/null and b/content-rst/applications/sales/sales/send_quotations/create_quotations/other-info-tracking.png differ diff --git a/content-rst/applications/sales/sales/send_quotations/create_quotations/product-catalog.png b/content-rst/applications/sales/sales/send_quotations/create_quotations/product-catalog.png new file mode 100644 index 000000000..053cb5403 Binary files /dev/null and b/content-rst/applications/sales/sales/send_quotations/create_quotations/product-catalog.png differ diff --git a/content-rst/applications/sales/sales/send_quotations/create_quotations/quotation-form.png b/content-rst/applications/sales/sales/send_quotations/create_quotations/quotation-form.png new file mode 100644 index 000000000..53427ddaa Binary files /dev/null and b/content-rst/applications/sales/sales/send_quotations/create_quotations/quotation-form.png differ diff --git a/content-rst/applications/sales/sales/send_quotations/create_quotations/quotations-dashboard.png b/content-rst/applications/sales/sales/send_quotations/create_quotations/quotations-dashboard.png new file mode 100644 index 000000000..9ccc49adc Binary files /dev/null and b/content-rst/applications/sales/sales/send_quotations/create_quotations/quotations-dashboard.png differ diff --git a/content-rst/applications/sales/sales/send_quotations/create_quotations/quotations-orders-section.png b/content-rst/applications/sales/sales/send_quotations/create_quotations/quotations-orders-section.png new file mode 100644 index 000000000..f2613ee82 Binary files /dev/null and b/content-rst/applications/sales/sales/send_quotations/create_quotations/quotations-orders-section.png differ diff --git a/content/applications/sales/sales/send_quotations/deadline.rst b/content-rst/applications/sales/sales/send_quotations/deadline.rst similarity index 100% rename from content/applications/sales/sales/send_quotations/deadline.rst rename to content-rst/applications/sales/sales/send_quotations/deadline.rst diff --git a/content-rst/applications/sales/sales/send_quotations/deadline/quotation-deadlines-expiration-field.png b/content-rst/applications/sales/sales/send_quotations/deadline/quotation-deadlines-expiration-field.png new file mode 100644 index 000000000..fe9b84d8f Binary files /dev/null and b/content-rst/applications/sales/sales/send_quotations/deadline/quotation-deadlines-expiration-field.png differ diff --git a/content-rst/applications/sales/sales/send_quotations/deadline/quotation-deadlines-expires-after.png b/content-rst/applications/sales/sales/send_quotations/deadline/quotation-deadlines-expires-after.png new file mode 100644 index 000000000..9ca167bb6 Binary files /dev/null and b/content-rst/applications/sales/sales/send_quotations/deadline/quotation-deadlines-expires-after.png differ diff --git a/content-rst/applications/sales/sales/send_quotations/deadline/quotation-deadlines-preview.png b/content-rst/applications/sales/sales/send_quotations/deadline/quotation-deadlines-preview.png new file mode 100644 index 000000000..dba5a51d6 Binary files /dev/null and b/content-rst/applications/sales/sales/send_quotations/deadline/quotation-deadlines-preview.png differ diff --git a/content/applications/sales/sales/send_quotations/different_addresses.rst b/content-rst/applications/sales/sales/send_quotations/different_addresses.rst similarity index 100% rename from content/applications/sales/sales/send_quotations/different_addresses.rst rename to content-rst/applications/sales/sales/send_quotations/different_addresses.rst diff --git a/content-rst/applications/sales/sales/send_quotations/different_addresses/contact-form-add-address.png b/content-rst/applications/sales/sales/send_quotations/different_addresses/contact-form-add-address.png new file mode 100644 index 000000000..f65543a74 Binary files /dev/null and b/content-rst/applications/sales/sales/send_quotations/different_addresses/contact-form-add-address.png differ diff --git a/content-rst/applications/sales/sales/send_quotations/different_addresses/create-contact-window.png b/content-rst/applications/sales/sales/send_quotations/different_addresses/create-contact-window.png new file mode 100644 index 000000000..37fa5ba8b Binary files /dev/null and b/content-rst/applications/sales/sales/send_quotations/different_addresses/create-contact-window.png differ diff --git a/content-rst/applications/sales/sales/send_quotations/different_addresses/customer-addresses-setting.png b/content-rst/applications/sales/sales/send_quotations/different_addresses/customer-addresses-setting.png new file mode 100644 index 000000000..72b86beb5 Binary files /dev/null and b/content-rst/applications/sales/sales/send_quotations/different_addresses/customer-addresses-setting.png differ diff --git a/content-rst/applications/sales/sales/send_quotations/different_addresses/quotation-address-autopopulate.png b/content-rst/applications/sales/sales/send_quotations/different_addresses/quotation-address-autopopulate.png new file mode 100644 index 000000000..c1d0fd48a Binary files /dev/null and b/content-rst/applications/sales/sales/send_quotations/different_addresses/quotation-address-autopopulate.png differ diff --git a/content/applications/sales/sales/send_quotations/get_paid_to_validate.rst b/content-rst/applications/sales/sales/send_quotations/get_paid_to_validate.rst similarity index 100% rename from content/applications/sales/sales/send_quotations/get_paid_to_validate.rst rename to content-rst/applications/sales/sales/send_quotations/get_paid_to_validate.rst diff --git a/content-rst/applications/sales/sales/send_quotations/get_paid_to_validate/accept-and-pay-button.png b/content-rst/applications/sales/sales/send_quotations/get_paid_to_validate/accept-and-pay-button.png new file mode 100644 index 000000000..ff4a129aa Binary files /dev/null and b/content-rst/applications/sales/sales/send_quotations/get_paid_to_validate/accept-and-pay-button.png differ diff --git a/content-rst/applications/sales/sales/send_quotations/get_paid_to_validate/online-payment-option-quotation-template.png b/content-rst/applications/sales/sales/send_quotations/get_paid_to_validate/online-payment-option-quotation-template.png new file mode 100644 index 000000000..392390bac Binary files /dev/null and b/content-rst/applications/sales/sales/send_quotations/get_paid_to_validate/online-payment-option-quotation-template.png differ diff --git a/content-rst/applications/sales/sales/send_quotations/get_paid_to_validate/online-payment-option-quotation.png b/content-rst/applications/sales/sales/send_quotations/get_paid_to_validate/online-payment-option-quotation.png new file mode 100644 index 000000000..bdba9ab4e Binary files /dev/null and b/content-rst/applications/sales/sales/send_quotations/get_paid_to_validate/online-payment-option-quotation.png differ diff --git a/content-rst/applications/sales/sales/send_quotations/get_paid_to_validate/online-payment-setting.png b/content-rst/applications/sales/sales/send_quotations/get_paid_to_validate/online-payment-setting.png new file mode 100644 index 000000000..df08a3caf Binary files /dev/null and b/content-rst/applications/sales/sales/send_quotations/get_paid_to_validate/online-payment-setting.png differ diff --git a/content-rst/applications/sales/sales/send_quotations/get_paid_to_validate/payment-confirmation-notification-chatter.png b/content-rst/applications/sales/sales/send_quotations/get_paid_to_validate/payment-confirmation-notification-chatter.png new file mode 100644 index 000000000..51563aaf4 Binary files /dev/null and b/content-rst/applications/sales/sales/send_quotations/get_paid_to_validate/payment-confirmation-notification-chatter.png differ diff --git a/content-rst/applications/sales/sales/send_quotations/get_paid_to_validate/payment-providers-page.png b/content-rst/applications/sales/sales/send_quotations/get_paid_to_validate/payment-providers-page.png new file mode 100644 index 000000000..315ab6a2e Binary files /dev/null and b/content-rst/applications/sales/sales/send_quotations/get_paid_to_validate/payment-providers-page.png differ diff --git a/content-rst/applications/sales/sales/send_quotations/get_paid_to_validate/validate-order-pay-with.png b/content-rst/applications/sales/sales/send_quotations/get_paid_to_validate/validate-order-pay-with.png new file mode 100644 index 000000000..3894943ab Binary files /dev/null and b/content-rst/applications/sales/sales/send_quotations/get_paid_to_validate/validate-order-pay-with.png differ diff --git a/content/applications/sales/sales/send_quotations/get_signature_to_validate.rst b/content-rst/applications/sales/sales/send_quotations/get_signature_to_validate.rst similarity index 100% rename from content/applications/sales/sales/send_quotations/get_signature_to_validate.rst rename to content-rst/applications/sales/sales/send_quotations/get_signature_to_validate.rst diff --git a/content-rst/applications/sales/sales/send_quotations/get_signature_to_validate/sign-and-pay-button.png b/content-rst/applications/sales/sales/send_quotations/get_signature_to_validate/sign-and-pay-button.png new file mode 100644 index 000000000..11ec1a8e9 Binary files /dev/null and b/content-rst/applications/sales/sales/send_quotations/get_signature_to_validate/sign-and-pay-button.png differ diff --git a/content-rst/applications/sales/sales/send_quotations/get_signature_to_validate/signature-feature-quotation-template.png b/content-rst/applications/sales/sales/send_quotations/get_signature_to_validate/signature-feature-quotation-template.png new file mode 100644 index 000000000..9bb94b81d Binary files /dev/null and b/content-rst/applications/sales/sales/send_quotations/get_signature_to_validate/signature-feature-quotation-template.png differ diff --git a/content-rst/applications/sales/sales/send_quotations/get_signature_to_validate/signature-other-info-tab.png b/content-rst/applications/sales/sales/send_quotations/get_signature_to_validate/signature-other-info-tab.png new file mode 100644 index 000000000..d4acf559e Binary files /dev/null and b/content-rst/applications/sales/sales/send_quotations/get_signature_to_validate/signature-other-info-tab.png differ diff --git a/content-rst/applications/sales/sales/send_quotations/get_signature_to_validate/signature-setting.png b/content-rst/applications/sales/sales/send_quotations/get_signature_to_validate/signature-setting.png new file mode 100644 index 000000000..c69ffcd8a Binary files /dev/null and b/content-rst/applications/sales/sales/send_quotations/get_signature_to_validate/signature-setting.png differ diff --git a/content-rst/applications/sales/sales/send_quotations/get_signature_to_validate/validate-order-popup.png b/content-rst/applications/sales/sales/send_quotations/get_signature_to_validate/validate-order-popup.png new file mode 100644 index 000000000..c6e2745e1 Binary files /dev/null and b/content-rst/applications/sales/sales/send_quotations/get_signature_to_validate/validate-order-popup.png differ diff --git a/content/applications/sales/sales/send_quotations/optional_products.rst b/content-rst/applications/sales/sales/send_quotations/optional_products.rst similarity index 100% rename from content/applications/sales/sales/send_quotations/optional_products.rst rename to content-rst/applications/sales/sales/send_quotations/optional_products.rst diff --git a/content-rst/applications/sales/sales/send_quotations/optional_products/optional-products-checkout.png b/content-rst/applications/sales/sales/send_quotations/optional_products/optional-products-checkout.png new file mode 100644 index 000000000..f275bf751 Binary files /dev/null and b/content-rst/applications/sales/sales/send_quotations/optional_products/optional-products-checkout.png differ diff --git a/content-rst/applications/sales/sales/send_quotations/optional_products/optional-products-tab-quotation-template.png b/content-rst/applications/sales/sales/send_quotations/optional_products/optional-products-tab-quotation-template.png new file mode 100644 index 000000000..bf1862d8e Binary files /dev/null and b/content-rst/applications/sales/sales/send_quotations/optional_products/optional-products-tab-quotation-template.png differ diff --git a/content-rst/applications/sales/sales/send_quotations/optional_products/optional-products-tab.png b/content-rst/applications/sales/sales/send_quotations/optional_products/optional-products-tab.png new file mode 100644 index 000000000..39300d875 Binary files /dev/null and b/content-rst/applications/sales/sales/send_quotations/optional_products/optional-products-tab.png differ diff --git a/content/applications/sales/sales/send_quotations/orders_and_variants.rst b/content-rst/applications/sales/sales/send_quotations/orders_and_variants.rst similarity index 100% rename from content/applications/sales/sales/send_quotations/orders_and_variants.rst rename to content-rst/applications/sales/sales/send_quotations/orders_and_variants.rst diff --git a/content-rst/applications/sales/sales/send_quotations/orders_and_variants/attributes-variants-tab-selection-options.png b/content-rst/applications/sales/sales/send_quotations/orders_and_variants/attributes-variants-tab-selection-options.png new file mode 100644 index 000000000..2eb6177b0 Binary files /dev/null and b/content-rst/applications/sales/sales/send_quotations/orders_and_variants/attributes-variants-tab-selection-options.png differ diff --git a/content-rst/applications/sales/sales/send_quotations/orders_and_variants/choose-product-variants-popup.png b/content-rst/applications/sales/sales/send_quotations/orders_and_variants/choose-product-variants-popup.png new file mode 100644 index 000000000..c08e3ce96 Binary files /dev/null and b/content-rst/applications/sales/sales/send_quotations/orders_and_variants/choose-product-variants-popup.png differ diff --git a/content-rst/applications/sales/sales/send_quotations/orders_and_variants/order-grid-entry-order-lines-tab.png b/content-rst/applications/sales/sales/send_quotations/orders_and_variants/order-grid-entry-order-lines-tab.png new file mode 100644 index 000000000..ae11f91d0 Binary files /dev/null and b/content-rst/applications/sales/sales/send_quotations/orders_and_variants/order-grid-entry-order-lines-tab.png differ diff --git a/content-rst/applications/sales/sales/send_quotations/orders_and_variants/order-grid-entry-setting.png b/content-rst/applications/sales/sales/send_quotations/orders_and_variants/order-grid-entry-setting.png new file mode 100644 index 000000000..f5200565b Binary files /dev/null and b/content-rst/applications/sales/sales/send_quotations/orders_and_variants/order-grid-entry-setting.png differ diff --git a/content-rst/applications/sales/sales/send_quotations/orders_and_variants/product-configurator-window.png b/content-rst/applications/sales/sales/send_quotations/orders_and_variants/product-configurator-window.png new file mode 100644 index 000000000..7eb8e72a2 Binary files /dev/null and b/content-rst/applications/sales/sales/send_quotations/orders_and_variants/product-configurator-window.png differ diff --git a/content/applications/sales/sales/send_quotations/pdf_quote_builder.rst b/content-rst/applications/sales/sales/send_quotations/pdf_quote_builder.rst similarity index 100% rename from content/applications/sales/sales/send_quotations/pdf_quote_builder.rst rename to content-rst/applications/sales/sales/send_quotations/pdf_quote_builder.rst diff --git a/content-rst/applications/sales/sales/send_quotations/pdf_quote_builder/blank-document-form.png b/content-rst/applications/sales/sales/send_quotations/pdf_quote_builder/blank-document-form.png new file mode 100644 index 000000000..881593b54 Binary files /dev/null and b/content-rst/applications/sales/sales/send_quotations/pdf_quote_builder/blank-document-form.png differ diff --git a/content-rst/applications/sales/sales/send_quotations/pdf_quote_builder/document-form-uploaded-pdf.png b/content-rst/applications/sales/sales/send_quotations/pdf_quote_builder/document-form-uploaded-pdf.png new file mode 100644 index 000000000..510d2bbef Binary files /dev/null and b/content-rst/applications/sales/sales/send_quotations/pdf_quote_builder/document-form-uploaded-pdf.png differ diff --git a/content-rst/applications/sales/sales/send_quotations/pdf_quote_builder/documents-smart-button.png b/content-rst/applications/sales/sales/send_quotations/pdf_quote_builder/documents-smart-button.png new file mode 100644 index 000000000..3eaf6564c Binary files /dev/null and b/content-rst/applications/sales/sales/send_quotations/pdf_quote_builder/documents-smart-button.png differ diff --git a/content-rst/applications/sales/sales/send_quotations/pdf_quote_builder/drop-down-print-pdf.png b/content-rst/applications/sales/sales/send_quotations/pdf_quote_builder/drop-down-print-pdf.png new file mode 100644 index 000000000..2ae8f0f42 Binary files /dev/null and b/content-rst/applications/sales/sales/send_quotations/pdf_quote_builder/drop-down-print-pdf.png differ diff --git a/content-rst/applications/sales/sales/send_quotations/pdf_quote_builder/pdf-inside-quote-sample.png b/content-rst/applications/sales/sales/send_quotations/pdf_quote_builder/pdf-inside-quote-sample.png new file mode 100644 index 000000000..7df9d9187 Binary files /dev/null and b/content-rst/applications/sales/sales/send_quotations/pdf_quote_builder/pdf-inside-quote-sample.png differ diff --git a/content-rst/applications/sales/sales/send_quotations/pdf_quote_builder/pdf-quote-builder-sample.png b/content-rst/applications/sales/sales/send_quotations/pdf_quote_builder/pdf-quote-builder-sample.png new file mode 100644 index 000000000..524b08ccb Binary files /dev/null and b/content-rst/applications/sales/sales/send_quotations/pdf_quote_builder/pdf-quote-builder-sample.png differ diff --git a/content-rst/applications/sales/sales/send_quotations/pdf_quote_builder/pdfquotebuilderexamples.zip b/content-rst/applications/sales/sales/send_quotations/pdf_quote_builder/pdfquotebuilderexamples.zip new file mode 100644 index 000000000..ad2dbb2ae Binary files /dev/null and b/content-rst/applications/sales/sales/send_quotations/pdf_quote_builder/pdfquotebuilderexamples.zip differ diff --git a/content-rst/applications/sales/sales/send_quotations/pdf_quote_builder/sample_quotation.pdf b/content-rst/applications/sales/sales/send_quotations/pdf_quote_builder/sample_quotation.pdf new file mode 100644 index 000000000..befc143b8 Binary files /dev/null and b/content-rst/applications/sales/sales/send_quotations/pdf_quote_builder/sample_quotation.pdf differ diff --git a/content-rst/applications/sales/sales/send_quotations/pdf_quote_builder/show-product-page.png b/content-rst/applications/sales/sales/send_quotations/pdf_quote_builder/show-product-page.png new file mode 100644 index 000000000..9ff3e4c69 Binary files /dev/null and b/content-rst/applications/sales/sales/send_quotations/pdf_quote_builder/show-product-page.png differ diff --git a/content/applications/sales/sales/send_quotations/quote_template.rst b/content-rst/applications/sales/sales/send_quotations/quote_template.rst similarity index 100% rename from content/applications/sales/sales/send_quotations/quote_template.rst rename to content-rst/applications/sales/sales/send_quotations/quote_template.rst diff --git a/content-rst/applications/sales/sales/send_quotations/quote_template/blank-quotation-form.png b/content-rst/applications/sales/sales/send_quotations/quote_template/blank-quotation-form.png new file mode 100644 index 000000000..288e2a187 Binary files /dev/null and b/content-rst/applications/sales/sales/send_quotations/quote_template/blank-quotation-form.png differ diff --git a/content-rst/applications/sales/sales/send_quotations/quote_template/cancel-quotations.png b/content-rst/applications/sales/sales/send_quotations/quote_template/cancel-quotations.png new file mode 100644 index 000000000..9403fc16f Binary files /dev/null and b/content-rst/applications/sales/sales/send_quotations/quote_template/cancel-quotations.png differ diff --git a/content-rst/applications/sales/sales/send_quotations/quote_template/create-confirmation-mail-popup.png b/content-rst/applications/sales/sales/send_quotations/quote_template/create-confirmation-mail-popup.png new file mode 100644 index 000000000..26a815ae1 Binary files /dev/null and b/content-rst/applications/sales/sales/send_quotations/quote_template/create-confirmation-mail-popup.png differ diff --git a/content-rst/applications/sales/sales/send_quotations/quote_template/optional-products-on-sales-order.png b/content-rst/applications/sales/sales/send_quotations/quote_template/optional-products-on-sales-order.png new file mode 100644 index 000000000..be6ea04b6 Binary files /dev/null and b/content-rst/applications/sales/sales/send_quotations/quote_template/optional-products-on-sales-order.png differ diff --git a/content-rst/applications/sales/sales/send_quotations/quote_template/quotation-templates-page.png b/content-rst/applications/sales/sales/send_quotations/quote_template/quotation-templates-page.png new file mode 100644 index 000000000..331d2c5a3 Binary files /dev/null and b/content-rst/applications/sales/sales/send_quotations/quote_template/quotation-templates-page.png differ diff --git a/content-rst/applications/sales/sales/send_quotations/quote_template/quotations-templates-preview.png b/content-rst/applications/sales/sales/send_quotations/quote_template/quotations-templates-preview.png new file mode 100644 index 000000000..08c6ea61d Binary files /dev/null and b/content-rst/applications/sales/sales/send_quotations/quote_template/quotations-templates-preview.png differ diff --git a/content-rst/applications/sales/sales/send_quotations/quote_template/quotations-templates-setting.png b/content-rst/applications/sales/sales/send_quotations/quote_template/quotations-templates-setting.png new file mode 100644 index 000000000..2c1115061 Binary files /dev/null and b/content-rst/applications/sales/sales/send_quotations/quote_template/quotations-templates-setting.png differ diff --git a/content/applications/sales/sales/shopee_connector.rst b/content-rst/applications/sales/sales/shopee_connector.rst similarity index 100% rename from content/applications/sales/sales/shopee_connector.rst rename to content-rst/applications/sales/sales/shopee_connector.rst diff --git a/content/applications/sales/sales/shopee_connector/manage.rst b/content-rst/applications/sales/sales/shopee_connector/manage.rst similarity index 100% rename from content/applications/sales/sales/shopee_connector/manage.rst rename to content-rst/applications/sales/sales/shopee_connector/manage.rst diff --git a/content-rst/applications/sales/sales/shopee_connector/manage/shopee-delivery-orders-status.png b/content-rst/applications/sales/sales/shopee_connector/manage/shopee-delivery-orders-status.png new file mode 100644 index 000000000..fd4ce0d9a Binary files /dev/null and b/content-rst/applications/sales/sales/shopee_connector/manage/shopee-delivery-orders-status.png differ diff --git a/content-rst/applications/sales/sales/shopee_connector/manage/shopee-seller-centre-product-extract.png b/content-rst/applications/sales/sales/shopee_connector/manage/shopee-seller-centre-product-extract.png new file mode 100644 index 000000000..5112aaff9 Binary files /dev/null and b/content-rst/applications/sales/sales/shopee_connector/manage/shopee-seller-centre-product-extract.png differ diff --git a/content-rst/applications/sales/sales/shopee_connector/manage/shopee-wh-out.png b/content-rst/applications/sales/sales/shopee_connector/manage/shopee-wh-out.png new file mode 100644 index 000000000..7d0749915 Binary files /dev/null and b/content-rst/applications/sales/sales/shopee_connector/manage/shopee-wh-out.png differ diff --git a/content/applications/sales/sales/shopee_connector/setup.rst b/content-rst/applications/sales/sales/shopee_connector/setup.rst similarity index 100% rename from content/applications/sales/sales/shopee_connector/setup.rst rename to content-rst/applications/sales/sales/shopee_connector/setup.rst diff --git a/content-rst/applications/sales/sales/shopee_connector/setup/shopee-sales-odoo.png b/content-rst/applications/sales/sales/shopee_connector/setup/shopee-sales-odoo.png new file mode 100644 index 000000000..6fd8d8890 Binary files /dev/null and b/content-rst/applications/sales/sales/shopee_connector/setup/shopee-sales-odoo.png differ diff --git a/content/applications/sales/subscriptions.rst b/content-rst/applications/sales/subscriptions.rst similarity index 100% rename from content/applications/sales/subscriptions.rst rename to content-rst/applications/sales/subscriptions.rst diff --git a/content/applications/sales/subscriptions/automatic_alerts.rst b/content-rst/applications/sales/subscriptions/automatic_alerts.rst similarity index 100% rename from content/applications/sales/subscriptions/automatic_alerts.rst rename to content-rst/applications/sales/subscriptions/automatic_alerts.rst diff --git a/content-rst/applications/sales/subscriptions/automatic_alerts/automation-rules-form.png b/content-rst/applications/sales/subscriptions/automatic_alerts/automation-rules-form.png new file mode 100644 index 000000000..e9a46f40f Binary files /dev/null and b/content-rst/applications/sales/subscriptions/automatic_alerts/automation-rules-form.png differ diff --git a/content-rst/applications/sales/subscriptions/automatic_alerts/automation-rules-page.png b/content-rst/applications/sales/subscriptions/automatic_alerts/automation-rules-page.png new file mode 100644 index 000000000..aebd6598d Binary files /dev/null and b/content-rst/applications/sales/subscriptions/automatic_alerts/automation-rules-page.png differ diff --git a/content/applications/sales/subscriptions/closing.rst b/content-rst/applications/sales/subscriptions/closing.rst similarity index 100% rename from content/applications/sales/subscriptions/closing.rst rename to content-rst/applications/sales/subscriptions/closing.rst diff --git a/content-rst/applications/sales/subscriptions/closing/churned-sales-order-chatter.png b/content-rst/applications/sales/subscriptions/closing/churned-sales-order-chatter.png new file mode 100644 index 000000000..59b5e6897 Binary files /dev/null and b/content-rst/applications/sales/subscriptions/closing/churned-sales-order-chatter.png differ diff --git a/content-rst/applications/sales/subscriptions/closing/churned-sales-order.png b/content-rst/applications/sales/subscriptions/closing/churned-sales-order.png new file mode 100644 index 000000000..ca07f8b42 Binary files /dev/null and b/content-rst/applications/sales/subscriptions/closing/churned-sales-order.png differ diff --git a/content-rst/applications/sales/subscriptions/closing/close-reason-popup.png b/content-rst/applications/sales/subscriptions/closing/close-reason-popup.png new file mode 100644 index 000000000..58b48b221 Binary files /dev/null and b/content-rst/applications/sales/subscriptions/closing/close-reason-popup.png differ diff --git a/content-rst/applications/sales/subscriptions/closing/close-subscription-button-customer-view.png b/content-rst/applications/sales/subscriptions/closing/close-subscription-button-customer-view.png new file mode 100644 index 000000000..4ebd60c27 Binary files /dev/null and b/content-rst/applications/sales/subscriptions/closing/close-subscription-button-customer-view.png differ diff --git a/content-rst/applications/sales/subscriptions/closing/close-subscription-customer-pov.png b/content-rst/applications/sales/subscriptions/closing/close-subscription-customer-pov.png new file mode 100644 index 000000000..a03349d2c Binary files /dev/null and b/content-rst/applications/sales/subscriptions/closing/close-subscription-customer-pov.png differ diff --git a/content-rst/applications/sales/subscriptions/closing/close-subscriptions-administrator.png b/content-rst/applications/sales/subscriptions/closing/close-subscriptions-administrator.png new file mode 100644 index 000000000..df8e734f1 Binary files /dev/null and b/content-rst/applications/sales/subscriptions/closing/close-subscriptions-administrator.png differ diff --git a/content-rst/applications/sales/subscriptions/closing/recurring-plans-closable-option.png b/content-rst/applications/sales/subscriptions/closing/recurring-plans-closable-option.png new file mode 100644 index 000000000..1cad38869 Binary files /dev/null and b/content-rst/applications/sales/subscriptions/closing/recurring-plans-closable-option.png differ diff --git a/content/applications/sales/subscriptions/ecommerce.rst b/content-rst/applications/sales/subscriptions/ecommerce.rst similarity index 100% rename from content/applications/sales/subscriptions/ecommerce.rst rename to content-rst/applications/sales/subscriptions/ecommerce.rst diff --git a/content-rst/applications/sales/subscriptions/ecommerce/subscription-product.png b/content-rst/applications/sales/subscriptions/ecommerce/subscription-product.png new file mode 100644 index 000000000..0330c940a Binary files /dev/null and b/content-rst/applications/sales/subscriptions/ecommerce/subscription-product.png differ diff --git a/content/applications/sales/subscriptions/payment_providers.rst b/content-rst/applications/sales/subscriptions/payment_providers.rst similarity index 100% rename from content/applications/sales/subscriptions/payment_providers.rst rename to content-rst/applications/sales/subscriptions/payment_providers.rst diff --git a/content/applications/sales/subscriptions/payment_providers/wire_transfer.rst b/content-rst/applications/sales/subscriptions/payment_providers/wire_transfer.rst similarity index 100% rename from content/applications/sales/subscriptions/payment_providers/wire_transfer.rst rename to content-rst/applications/sales/subscriptions/payment_providers/wire_transfer.rst diff --git a/content-rst/applications/sales/subscriptions/payment_providers/wire_transfer/in-payment-banner.png b/content-rst/applications/sales/subscriptions/payment_providers/wire_transfer/in-payment-banner.png new file mode 100644 index 000000000..f4dc27274 Binary files /dev/null and b/content-rst/applications/sales/subscriptions/payment_providers/wire_transfer/in-payment-banner.png differ diff --git a/content-rst/applications/sales/subscriptions/payment_providers/wire_transfer/payment-instructions-checkout.png b/content-rst/applications/sales/subscriptions/payment_providers/wire_transfer/payment-instructions-checkout.png new file mode 100644 index 000000000..257066b00 Binary files /dev/null and b/content-rst/applications/sales/subscriptions/payment_providers/wire_transfer/payment-instructions-checkout.png differ diff --git a/content-rst/applications/sales/subscriptions/payment_providers/wire_transfer/register-payment.png b/content-rst/applications/sales/subscriptions/payment_providers/wire_transfer/register-payment.png new file mode 100644 index 000000000..23589b640 Binary files /dev/null and b/content-rst/applications/sales/subscriptions/payment_providers/wire_transfer/register-payment.png differ diff --git a/content-rst/applications/sales/subscriptions/payment_providers/wire_transfer/wire-transfer-published.png b/content-rst/applications/sales/subscriptions/payment_providers/wire_transfer/wire-transfer-published.png new file mode 100644 index 000000000..34045397e Binary files /dev/null and b/content-rst/applications/sales/subscriptions/payment_providers/wire_transfer/wire-transfer-published.png differ diff --git a/content/applications/sales/subscriptions/plans.rst b/content-rst/applications/sales/subscriptions/plans.rst similarity index 100% rename from content/applications/sales/subscriptions/plans.rst rename to content-rst/applications/sales/subscriptions/plans.rst diff --git a/content-rst/applications/sales/subscriptions/plans/subplan-quotation-template.png b/content-rst/applications/sales/subscriptions/plans/subplan-quotation-template.png new file mode 100644 index 000000000..3823f4b9d Binary files /dev/null and b/content-rst/applications/sales/subscriptions/plans/subplan-quotation-template.png differ diff --git a/content-rst/applications/sales/subscriptions/plans/subplan-recurrence.png b/content-rst/applications/sales/subscriptions/plans/subplan-recurrence.png new file mode 100644 index 000000000..9539b98d1 Binary files /dev/null and b/content-rst/applications/sales/subscriptions/plans/subplan-recurrence.png differ diff --git a/content-rst/applications/sales/subscriptions/plans/subplan-terms-conditions.png b/content-rst/applications/sales/subscriptions/plans/subplan-terms-conditions.png new file mode 100644 index 000000000..f87c9e20e Binary files /dev/null and b/content-rst/applications/sales/subscriptions/plans/subplan-terms-conditions.png differ diff --git a/content/applications/sales/subscriptions/products.rst b/content-rst/applications/sales/subscriptions/products.rst similarity index 100% rename from content/applications/sales/subscriptions/products.rst rename to content-rst/applications/sales/subscriptions/products.rst diff --git a/content-rst/applications/sales/subscriptions/products/pricelist-form-time-based-rules-tab.png b/content-rst/applications/sales/subscriptions/products/pricelist-form-time-based-rules-tab.png new file mode 100644 index 000000000..dc57b22de Binary files /dev/null and b/content-rst/applications/sales/subscriptions/products/pricelist-form-time-based-rules-tab.png differ diff --git a/content-rst/applications/sales/subscriptions/products/pricelist-time-based-pricing.png b/content-rst/applications/sales/subscriptions/products/pricelist-time-based-pricing.png new file mode 100644 index 000000000..dc1f968af Binary files /dev/null and b/content-rst/applications/sales/subscriptions/products/pricelist-time-based-pricing.png differ diff --git a/content-rst/applications/sales/subscriptions/products/recurrence-period-form.png b/content-rst/applications/sales/subscriptions/products/recurrence-period-form.png new file mode 100644 index 000000000..5e152a037 Binary files /dev/null and b/content-rst/applications/sales/subscriptions/products/recurrence-period-form.png differ diff --git a/content-rst/applications/sales/subscriptions/products/recurrence-periods-page.png b/content-rst/applications/sales/subscriptions/products/recurrence-periods-page.png new file mode 100644 index 000000000..6aa6dc719 Binary files /dev/null and b/content-rst/applications/sales/subscriptions/products/recurrence-periods-page.png differ diff --git a/content-rst/applications/sales/subscriptions/products/subscription-product-form.png b/content-rst/applications/sales/subscriptions/products/subscription-product-form.png new file mode 100644 index 000000000..e1deb093c Binary files /dev/null and b/content-rst/applications/sales/subscriptions/products/subscription-product-form.png differ diff --git a/content-rst/applications/sales/subscriptions/products/time-based-pricing-tab.png b/content-rst/applications/sales/subscriptions/products/time-based-pricing-tab.png new file mode 100644 index 000000000..eaad7c0e7 Binary files /dev/null and b/content-rst/applications/sales/subscriptions/products/time-based-pricing-tab.png differ diff --git a/content-rst/applications/sales/subscriptions/products/validation-error-popup.png b/content-rst/applications/sales/subscriptions/products/validation-error-popup.png new file mode 100644 index 000000000..adeb7e759 Binary files /dev/null and b/content-rst/applications/sales/subscriptions/products/validation-error-popup.png differ diff --git a/content/applications/sales/subscriptions/renewals.rst b/content-rst/applications/sales/subscriptions/renewals.rst similarity index 100% rename from content/applications/sales/subscriptions/renewals.rst rename to content-rst/applications/sales/subscriptions/renewals.rst diff --git a/content-rst/applications/sales/subscriptions/renewals/contract-in-exception.png b/content-rst/applications/sales/subscriptions/renewals/contract-in-exception.png new file mode 100644 index 000000000..532b2a093 Binary files /dev/null and b/content-rst/applications/sales/subscriptions/renewals/contract-in-exception.png differ diff --git a/content-rst/applications/sales/subscriptions/renewals/mrr-smart-button.png b/content-rst/applications/sales/subscriptions/renewals/mrr-smart-button.png new file mode 100644 index 000000000..ae9bce3ed Binary files /dev/null and b/content-rst/applications/sales/subscriptions/renewals/mrr-smart-button.png differ diff --git a/content-rst/applications/sales/subscriptions/renewals/renew-button.png b/content-rst/applications/sales/subscriptions/renewals/renew-button.png new file mode 100644 index 000000000..8bd0be92d Binary files /dev/null and b/content-rst/applications/sales/subscriptions/renewals/renew-button.png differ diff --git a/content-rst/applications/sales/subscriptions/renewals/renewal-quotation.png b/content-rst/applications/sales/subscriptions/renewals/renewal-quotation.png new file mode 100644 index 000000000..23a1bbb15 Binary files /dev/null and b/content-rst/applications/sales/subscriptions/renewals/renewal-quotation.png differ diff --git a/content-rst/applications/sales/subscriptions/renewals/sales-history-page.png b/content-rst/applications/sales/subscriptions/renewals/sales-history-page.png new file mode 100644 index 000000000..ec737cafa Binary files /dev/null and b/content-rst/applications/sales/subscriptions/renewals/sales-history-page.png differ diff --git a/content-rst/applications/sales/subscriptions/renewals/sales-history-smart-button.png b/content-rst/applications/sales/subscriptions/renewals/sales-history-smart-button.png new file mode 100644 index 000000000..e34f452f1 Binary files /dev/null and b/content-rst/applications/sales/subscriptions/renewals/sales-history-smart-button.png differ diff --git a/content/applications/sales/subscriptions/reports.rst b/content-rst/applications/sales/subscriptions/reports.rst similarity index 100% rename from content/applications/sales/subscriptions/reports.rst rename to content-rst/applications/sales/subscriptions/reports.rst diff --git a/content-rst/applications/sales/subscriptions/reports/subscriptions-analysis-measures.png b/content-rst/applications/sales/subscriptions/reports/subscriptions-analysis-measures.png new file mode 100644 index 000000000..9ae9c5245 Binary files /dev/null and b/content-rst/applications/sales/subscriptions/reports/subscriptions-analysis-measures.png differ diff --git a/content-rst/applications/sales/subscriptions/reports/subscriptions-analysis-page-default.png b/content-rst/applications/sales/subscriptions/reports/subscriptions-analysis-page-default.png new file mode 100644 index 000000000..02b4558e4 Binary files /dev/null and b/content-rst/applications/sales/subscriptions/reports/subscriptions-analysis-page-default.png differ diff --git a/content-rst/applications/sales/subscriptions/reports/subscriptions-analysis-page-view-options.png b/content-rst/applications/sales/subscriptions/reports/subscriptions-analysis-page-view-options.png new file mode 100644 index 000000000..d6bc9a5f7 Binary files /dev/null and b/content-rst/applications/sales/subscriptions/reports/subscriptions-analysis-page-view-options.png differ diff --git a/content-rst/applications/sales/subscriptions/reports/subscriptions-analysis-spreadsheet-popup.png b/content-rst/applications/sales/subscriptions/reports/subscriptions-analysis-spreadsheet-popup.png new file mode 100644 index 000000000..5dcbf0fcf Binary files /dev/null and b/content-rst/applications/sales/subscriptions/reports/subscriptions-analysis-spreadsheet-popup.png differ diff --git a/content-rst/applications/sales/subscriptions/reports/subscriptions-graph-specific-options.png b/content-rst/applications/sales/subscriptions/reports/subscriptions-graph-specific-options.png new file mode 100644 index 000000000..4615ec2c7 Binary files /dev/null and b/content-rst/applications/sales/subscriptions/reports/subscriptions-graph-specific-options.png differ diff --git a/content-rst/applications/sales/subscriptions/reports/subscriptions-measures-drop-down.png b/content-rst/applications/sales/subscriptions/reports/subscriptions-measures-drop-down.png new file mode 100644 index 000000000..c96cf4498 Binary files /dev/null and b/content-rst/applications/sales/subscriptions/reports/subscriptions-measures-drop-down.png differ diff --git a/content-rst/applications/sales/subscriptions/reports/subscriptions-mrr-analysis-default.png b/content-rst/applications/sales/subscriptions/reports/subscriptions-mrr-analysis-default.png new file mode 100644 index 000000000..2d87f177d Binary files /dev/null and b/content-rst/applications/sales/subscriptions/reports/subscriptions-mrr-analysis-default.png differ diff --git a/content-rst/applications/sales/subscriptions/reports/subscriptions-mrr-analysis-measures.png b/content-rst/applications/sales/subscriptions/reports/subscriptions-mrr-analysis-measures.png new file mode 100644 index 000000000..fcd3806c5 Binary files /dev/null and b/content-rst/applications/sales/subscriptions/reports/subscriptions-mrr-analysis-measures.png differ diff --git a/content-rst/applications/sales/subscriptions/reports/subscriptions-mrr-breakdown-default.png b/content-rst/applications/sales/subscriptions/reports/subscriptions-mrr-breakdown-default.png new file mode 100644 index 000000000..d28171312 Binary files /dev/null and b/content-rst/applications/sales/subscriptions/reports/subscriptions-mrr-breakdown-default.png differ diff --git a/content-rst/applications/sales/subscriptions/reports/subscriptions-mrr-breakdown-measures.png b/content-rst/applications/sales/subscriptions/reports/subscriptions-mrr-breakdown-measures.png new file mode 100644 index 000000000..a165ea489 Binary files /dev/null and b/content-rst/applications/sales/subscriptions/reports/subscriptions-mrr-breakdown-measures.png differ diff --git a/content-rst/applications/sales/subscriptions/reports/subscriptions-pivot-view-options.png b/content-rst/applications/sales/subscriptions/reports/subscriptions-pivot-view-options.png new file mode 100644 index 000000000..b054218d7 Binary files /dev/null and b/content-rst/applications/sales/subscriptions/reports/subscriptions-pivot-view-options.png differ diff --git a/content-rst/applications/sales/subscriptions/reports/subscriptions-retention-analysis-measures.png b/content-rst/applications/sales/subscriptions/reports/subscriptions-retention-analysis-measures.png new file mode 100644 index 000000000..795039062 Binary files /dev/null and b/content-rst/applications/sales/subscriptions/reports/subscriptions-retention-analysis-measures.png differ diff --git a/content-rst/applications/sales/subscriptions/reports/subscriptions-retention-analysis-page-default.png b/content-rst/applications/sales/subscriptions/reports/subscriptions-retention-analysis-page-default.png new file mode 100644 index 000000000..df6becd10 Binary files /dev/null and b/content-rst/applications/sales/subscriptions/reports/subscriptions-retention-analysis-page-default.png differ diff --git a/content-rst/applications/sales/subscriptions/reports/subscriptions-retention-analysis-time-periods.png b/content-rst/applications/sales/subscriptions/reports/subscriptions-retention-analysis-time-periods.png new file mode 100644 index 000000000..88ab92eaf Binary files /dev/null and b/content-rst/applications/sales/subscriptions/reports/subscriptions-retention-analysis-time-periods.png differ diff --git a/content/applications/sales/subscriptions/scheduled_actions.rst b/content-rst/applications/sales/subscriptions/scheduled_actions.rst similarity index 100% rename from content/applications/sales/subscriptions/scheduled_actions.rst rename to content-rst/applications/sales/subscriptions/scheduled_actions.rst diff --git a/content-rst/applications/sales/subscriptions/scheduled_actions/automatic-closing-field.png b/content-rst/applications/sales/subscriptions/scheduled_actions/automatic-closing-field.png new file mode 100644 index 000000000..b482af4ec Binary files /dev/null and b/content-rst/applications/sales/subscriptions/scheduled_actions/automatic-closing-field.png differ diff --git a/content-rst/applications/sales/subscriptions/scheduled_actions/confirmed-subscription-sales-order-fields.png b/content-rst/applications/sales/subscriptions/scheduled_actions/confirmed-subscription-sales-order-fields.png new file mode 100644 index 000000000..0a46e55e7 Binary files /dev/null and b/content-rst/applications/sales/subscriptions/scheduled_actions/confirmed-subscription-sales-order-fields.png differ diff --git a/content-rst/applications/sales/subscriptions/scheduled_actions/deferred-settings-accounting.png b/content-rst/applications/sales/subscriptions/scheduled_actions/deferred-settings-accounting.png new file mode 100644 index 000000000..a9dadf586 Binary files /dev/null and b/content-rst/applications/sales/subscriptions/scheduled_actions/deferred-settings-accounting.png differ diff --git a/content-rst/applications/sales/subscriptions/scheduled_actions/invoices-invoice-date-column.png b/content-rst/applications/sales/subscriptions/scheduled_actions/invoices-invoice-date-column.png new file mode 100644 index 000000000..e3f8b611e Binary files /dev/null and b/content-rst/applications/sales/subscriptions/scheduled_actions/invoices-invoice-date-column.png differ diff --git a/content-rst/applications/sales/subscriptions/scheduled_actions/payment-token-field.png b/content-rst/applications/sales/subscriptions/scheduled_actions/payment-token-field.png new file mode 100644 index 000000000..f1f8b3580 Binary files /dev/null and b/content-rst/applications/sales/subscriptions/scheduled_actions/payment-token-field.png differ diff --git a/content-rst/applications/sales/subscriptions/scheduled_actions/scheduled-action-form.png b/content-rst/applications/sales/subscriptions/scheduled_actions/scheduled-action-form.png new file mode 100644 index 000000000..afcf687bd Binary files /dev/null and b/content-rst/applications/sales/subscriptions/scheduled_actions/scheduled-action-form.png differ diff --git a/content-rst/applications/sales/subscriptions/scheduled_actions/scheduled-actions-page-subscription-results.png b/content-rst/applications/sales/subscriptions/scheduled_actions/scheduled-actions-page-subscription-results.png new file mode 100644 index 000000000..20b3c42ee Binary files /dev/null and b/content-rst/applications/sales/subscriptions/scheduled_actions/scheduled-actions-page-subscription-results.png differ diff --git a/content-rst/applications/sales/subscriptions/scheduled_actions/scheduled-actions-technical-settings-page.png b/content-rst/applications/sales/subscriptions/scheduled_actions/scheduled-actions-technical-settings-page.png new file mode 100644 index 000000000..b6b5bbe4b Binary files /dev/null and b/content-rst/applications/sales/subscriptions/scheduled_actions/scheduled-actions-technical-settings-page.png differ diff --git a/content-rst/applications/sales/subscriptions/scheduled_actions/subscription-expiration-date.png b/content-rst/applications/sales/subscriptions/scheduled_actions/subscription-expiration-date.png new file mode 100644 index 000000000..5198ff1cd Binary files /dev/null and b/content-rst/applications/sales/subscriptions/scheduled_actions/subscription-expiration-date.png differ diff --git a/content/applications/sales/subscriptions/upselling.rst b/content-rst/applications/sales/subscriptions/upselling.rst similarity index 100% rename from content/applications/sales/subscriptions/upselling.rst rename to content-rst/applications/sales/subscriptions/upselling.rst diff --git a/content-rst/applications/sales/subscriptions/upselling/configuration-to-upsell-a-subscription.png b/content-rst/applications/sales/subscriptions/upselling/configuration-to-upsell-a-subscription.png new file mode 100644 index 000000000..30639e8d8 Binary files /dev/null and b/content-rst/applications/sales/subscriptions/upselling/configuration-to-upsell-a-subscription.png differ diff --git a/content-rst/applications/sales/subscriptions/upselling/sales-history-smartbutton.png b/content-rst/applications/sales/subscriptions/upselling/sales-history-smartbutton.png new file mode 100644 index 000000000..5ed3ebb83 Binary files /dev/null and b/content-rst/applications/sales/subscriptions/upselling/sales-history-smartbutton.png differ diff --git a/content-rst/applications/sales/subscriptions/upselling/upsell-your-subscription.png b/content-rst/applications/sales/subscriptions/upselling/upsell-your-subscription.png new file mode 100644 index 000000000..a663e9430 Binary files /dev/null and b/content-rst/applications/sales/subscriptions/upselling/upsell-your-subscription.png differ diff --git a/content-rst/applications/sales/subscriptions/upselling/use-of-the-upsell-button-in-odoo-sales.png b/content-rst/applications/sales/subscriptions/upselling/use-of-the-upsell-button-in-odoo-sales.png new file mode 100644 index 000000000..1d5517b73 Binary files /dev/null and b/content-rst/applications/sales/subscriptions/upselling/use-of-the-upsell-button-in-odoo-sales.png differ diff --git a/content/applications/services.rst b/content-rst/applications/services.rst similarity index 100% rename from content/applications/services.rst rename to content-rst/applications/services.rst diff --git a/content/applications/services/field_service.rst b/content-rst/applications/services/field_service.rst similarity index 100% rename from content/applications/services/field_service.rst rename to content-rst/applications/services/field_service.rst diff --git a/content/applications/services/field_service/creating_tasks.rst b/content-rst/applications/services/field_service/creating_tasks.rst similarity index 100% rename from content/applications/services/field_service/creating_tasks.rst rename to content-rst/applications/services/field_service/creating_tasks.rst diff --git a/content/applications/services/field_service/planning_itinerary.rst b/content-rst/applications/services/field_service/planning_itinerary.rst similarity index 100% rename from content/applications/services/field_service/planning_itinerary.rst rename to content-rst/applications/services/field_service/planning_itinerary.rst diff --git a/content/applications/services/field_service/product_management.rst b/content-rst/applications/services/field_service/product_management.rst similarity index 100% rename from content/applications/services/field_service/product_management.rst rename to content-rst/applications/services/field_service/product_management.rst diff --git a/content-rst/applications/services/field_service/product_management/user-default.png b/content-rst/applications/services/field_service/product_management/user-default.png new file mode 100644 index 000000000..bd2af2a84 Binary files /dev/null and b/content-rst/applications/services/field_service/product_management/user-default.png differ diff --git a/content/applications/services/field_service/worksheets.rst b/content-rst/applications/services/field_service/worksheets.rst similarity index 100% rename from content/applications/services/field_service/worksheets.rst rename to content-rst/applications/services/field_service/worksheets.rst diff --git a/content-rst/applications/services/field_service/worksheets/template-default.png b/content-rst/applications/services/field_service/worksheets/template-default.png new file mode 100644 index 000000000..79b842244 Binary files /dev/null and b/content-rst/applications/services/field_service/worksheets/template-default.png differ diff --git a/content/applications/services/helpdesk.rst b/content-rst/applications/services/helpdesk.rst similarity index 100% rename from content/applications/services/helpdesk.rst rename to content-rst/applications/services/helpdesk.rst diff --git a/content/applications/services/helpdesk/advanced.rst b/content-rst/applications/services/helpdesk/advanced.rst similarity index 100% rename from content/applications/services/helpdesk/advanced.rst rename to content-rst/applications/services/helpdesk/advanced.rst diff --git a/content/applications/services/helpdesk/advanced/after_sales.rst b/content-rst/applications/services/helpdesk/advanced/after_sales.rst similarity index 100% rename from content/applications/services/helpdesk/advanced/after_sales.rst rename to content-rst/applications/services/helpdesk/advanced/after_sales.rst diff --git a/content-rst/applications/services/helpdesk/advanced/after_sales/after-sales-coupon-email.png b/content-rst/applications/services/helpdesk/advanced/after_sales/after-sales-coupon-email.png new file mode 100644 index 000000000..dee4683b0 Binary files /dev/null and b/content-rst/applications/services/helpdesk/advanced/after_sales/after-sales-coupon-email.png differ diff --git a/content-rst/applications/services/helpdesk/advanced/after_sales/after-sales-coupon-smart-button.png b/content-rst/applications/services/helpdesk/advanced/after_sales/after-sales-coupon-smart-button.png new file mode 100644 index 000000000..e91a723ce Binary files /dev/null and b/content-rst/applications/services/helpdesk/advanced/after_sales/after-sales-coupon-smart-button.png differ diff --git a/content-rst/applications/services/helpdesk/advanced/after_sales/after-sales-credit-note-smart-button.png b/content-rst/applications/services/helpdesk/advanced/after_sales/after-sales-credit-note-smart-button.png new file mode 100644 index 000000000..80dc4b6d8 Binary files /dev/null and b/content-rst/applications/services/helpdesk/advanced/after_sales/after-sales-credit-note-smart-button.png differ diff --git a/content-rst/applications/services/helpdesk/advanced/after_sales/after-sales-enable.png b/content-rst/applications/services/helpdesk/advanced/after_sales/after-sales-enable.png new file mode 100644 index 000000000..ac63b39cf Binary files /dev/null and b/content-rst/applications/services/helpdesk/advanced/after_sales/after-sales-enable.png differ diff --git a/content-rst/applications/services/helpdesk/advanced/after_sales/after-sales-field-service-create.png b/content-rst/applications/services/helpdesk/advanced/after_sales/after-sales-field-service-create.png new file mode 100644 index 000000000..71d9fa30e Binary files /dev/null and b/content-rst/applications/services/helpdesk/advanced/after_sales/after-sales-field-service-create.png differ diff --git a/content-rst/applications/services/helpdesk/advanced/after_sales/after-sales-field-service-smart-button.png b/content-rst/applications/services/helpdesk/advanced/after_sales/after-sales-field-service-smart-button.png new file mode 100644 index 000000000..ff35c12a9 Binary files /dev/null and b/content-rst/applications/services/helpdesk/advanced/after_sales/after-sales-field-service-smart-button.png differ diff --git a/content-rst/applications/services/helpdesk/advanced/after_sales/after-sales-generate-coupon.png b/content-rst/applications/services/helpdesk/advanced/after_sales/after-sales-generate-coupon.png new file mode 100644 index 000000000..4696cb7c3 Binary files /dev/null and b/content-rst/applications/services/helpdesk/advanced/after_sales/after-sales-generate-coupon.png differ diff --git a/content-rst/applications/services/helpdesk/advanced/after_sales/after-sales-refund-details.png b/content-rst/applications/services/helpdesk/advanced/after_sales/after-sales-refund-details.png new file mode 100644 index 000000000..79fed194d Binary files /dev/null and b/content-rst/applications/services/helpdesk/advanced/after_sales/after-sales-refund-details.png differ diff --git a/content-rst/applications/services/helpdesk/advanced/after_sales/after-sales-repair-reference.png b/content-rst/applications/services/helpdesk/advanced/after_sales/after-sales-repair-reference.png new file mode 100644 index 000000000..a4882d0bb Binary files /dev/null and b/content-rst/applications/services/helpdesk/advanced/after_sales/after-sales-repair-reference.png differ diff --git a/content-rst/applications/services/helpdesk/advanced/after_sales/after-sales-repair-smart-button.png b/content-rst/applications/services/helpdesk/advanced/after_sales/after-sales-repair-smart-button.png new file mode 100644 index 000000000..80460fef8 Binary files /dev/null and b/content-rst/applications/services/helpdesk/advanced/after_sales/after-sales-repair-smart-button.png differ diff --git a/content-rst/applications/services/helpdesk/advanced/after_sales/after-sales-return-button.png b/content-rst/applications/services/helpdesk/advanced/after_sales/after-sales-return-button.png new file mode 100644 index 000000000..b6447ed15 Binary files /dev/null and b/content-rst/applications/services/helpdesk/advanced/after_sales/after-sales-return-button.png differ diff --git a/content-rst/applications/services/helpdesk/advanced/after_sales/after-sales-return-smart-button.png b/content-rst/applications/services/helpdesk/advanced/after_sales/after-sales-return-smart-button.png new file mode 100644 index 000000000..1d5c33d3f Binary files /dev/null and b/content-rst/applications/services/helpdesk/advanced/after_sales/after-sales-return-smart-button.png differ diff --git a/content-rst/applications/services/helpdesk/advanced/after_sales/after-sales-reverse-transfer.png b/content-rst/applications/services/helpdesk/advanced/after_sales/after-sales-reverse-transfer.png new file mode 100644 index 000000000..069a966a9 Binary files /dev/null and b/content-rst/applications/services/helpdesk/advanced/after_sales/after-sales-reverse-transfer.png differ diff --git a/content/applications/services/helpdesk/advanced/close_tickets.rst b/content-rst/applications/services/helpdesk/advanced/close_tickets.rst similarity index 100% rename from content/applications/services/helpdesk/advanced/close_tickets.rst rename to content-rst/applications/services/helpdesk/advanced/close_tickets.rst diff --git a/content-rst/applications/services/helpdesk/advanced/close_tickets/closing-automatic-settings-example.png b/content-rst/applications/services/helpdesk/advanced/close_tickets/closing-automatic-settings-example.png new file mode 100644 index 000000000..4c6ceac6f Binary files /dev/null and b/content-rst/applications/services/helpdesk/advanced/close_tickets/closing-automatic-settings-example.png differ diff --git a/content-rst/applications/services/helpdesk/advanced/close_tickets/closing-by-customer-setting.png b/content-rst/applications/services/helpdesk/advanced/close_tickets/closing-by-customer-setting.png new file mode 100644 index 000000000..976822834 Binary files /dev/null and b/content-rst/applications/services/helpdesk/advanced/close_tickets/closing-by-customer-setting.png differ diff --git a/content-rst/applications/services/helpdesk/advanced/close_tickets/closing-customer-view.png b/content-rst/applications/services/helpdesk/advanced/close_tickets/closing-customer-view.png new file mode 100644 index 000000000..952058039 Binary files /dev/null and b/content-rst/applications/services/helpdesk/advanced/close_tickets/closing-customer-view.png differ diff --git a/content-rst/applications/services/helpdesk/advanced/close_tickets/closing-edit-stage-gear.png b/content-rst/applications/services/helpdesk/advanced/close_tickets/closing-edit-stage-gear.png new file mode 100644 index 000000000..39c83e7e9 Binary files /dev/null and b/content-rst/applications/services/helpdesk/advanced/close_tickets/closing-edit-stage-gear.png differ diff --git a/content-rst/applications/services/helpdesk/advanced/close_tickets/closing-folded-setting.png b/content-rst/applications/services/helpdesk/advanced/close_tickets/closing-folded-setting.png new file mode 100644 index 000000000..52c5a2288 Binary files /dev/null and b/content-rst/applications/services/helpdesk/advanced/close_tickets/closing-folded-setting.png differ diff --git a/content/applications/services/helpdesk/advanced/track_and_bill.rst b/content-rst/applications/services/helpdesk/advanced/track_and_bill.rst similarity index 100% rename from content/applications/services/helpdesk/advanced/track_and_bill.rst rename to content-rst/applications/services/helpdesk/advanced/track_and_bill.rst diff --git a/content-rst/applications/services/helpdesk/advanced/track_and_bill/track-bill-create-invoice-timesheets-period.png b/content-rst/applications/services/helpdesk/advanced/track_and_bill/track-bill-create-invoice-timesheets-period.png new file mode 100644 index 000000000..4be95292c Binary files /dev/null and b/content-rst/applications/services/helpdesk/advanced/track_and_bill/track-bill-create-invoice-timesheets-period.png differ diff --git a/content-rst/applications/services/helpdesk/advanced/track_and_bill/track-bill-delivered-timesheet-hours.png b/content-rst/applications/services/helpdesk/advanced/track_and_bill/track-bill-delivered-timesheet-hours.png new file mode 100644 index 000000000..9cefac5d6 Binary files /dev/null and b/content-rst/applications/services/helpdesk/advanced/track_and_bill/track-bill-delivered-timesheet-hours.png differ diff --git a/content-rst/applications/services/helpdesk/advanced/track_and_bill/track-bill-enable-settings.png b/content-rst/applications/services/helpdesk/advanced/track_and_bill/track-bill-enable-settings.png new file mode 100644 index 000000000..9d129feac Binary files /dev/null and b/content-rst/applications/services/helpdesk/advanced/track_and_bill/track-bill-enable-settings.png differ diff --git a/content-rst/applications/services/helpdesk/advanced/track_and_bill/track-bill-product-based-on-timesheets.png b/content-rst/applications/services/helpdesk/advanced/track_and_bill/track-bill-product-based-on-timesheets.png new file mode 100644 index 000000000..d40506d3c Binary files /dev/null and b/content-rst/applications/services/helpdesk/advanced/track_and_bill/track-bill-product-based-on-timesheets.png differ diff --git a/content-rst/applications/services/helpdesk/advanced/track_and_bill/track-bill-product-prepaid-fixed.png b/content-rst/applications/services/helpdesk/advanced/track_and_bill/track-bill-product-prepaid-fixed.png new file mode 100644 index 000000000..55923df47 Binary files /dev/null and b/content-rst/applications/services/helpdesk/advanced/track_and_bill/track-bill-product-prepaid-fixed.png differ diff --git a/content-rst/applications/services/helpdesk/advanced/track_and_bill/track-bill-record-timesheet-hours.png b/content-rst/applications/services/helpdesk/advanced/track_and_bill/track-bill-record-timesheet-hours.png new file mode 100644 index 000000000..f3155ec26 Binary files /dev/null and b/content-rst/applications/services/helpdesk/advanced/track_and_bill/track-bill-record-timesheet-hours.png differ diff --git a/content-rst/applications/services/helpdesk/advanced/track_and_bill/track-bill-remaining-hours-total.png b/content-rst/applications/services/helpdesk/advanced/track_and_bill/track-bill-remaining-hours-total.png new file mode 100644 index 000000000..49903404b Binary files /dev/null and b/content-rst/applications/services/helpdesk/advanced/track_and_bill/track-bill-remaining-hours-total.png differ diff --git a/content-rst/applications/services/helpdesk/convert-to-opp.png b/content-rst/applications/services/helpdesk/convert-to-opp.png new file mode 100644 index 000000000..b88e2eb71 Binary files /dev/null and b/content-rst/applications/services/helpdesk/convert-to-opp.png differ diff --git a/content-rst/applications/services/helpdesk/helpdesk-teams-list.png b/content-rst/applications/services/helpdesk/helpdesk-teams-list.png new file mode 100644 index 000000000..6cda3f491 Binary files /dev/null and b/content-rst/applications/services/helpdesk/helpdesk-teams-list.png differ diff --git a/content-rst/applications/services/helpdesk/helpdesk-visibility-assignment.png b/content-rst/applications/services/helpdesk/helpdesk-visibility-assignment.png new file mode 100644 index 000000000..c28b74db5 Binary files /dev/null and b/content-rst/applications/services/helpdesk/helpdesk-visibility-assignment.png differ diff --git a/content/applications/services/helpdesk/overview.rst b/content-rst/applications/services/helpdesk/overview.rst similarity index 100% rename from content/applications/services/helpdesk/overview.rst rename to content-rst/applications/services/helpdesk/overview.rst diff --git a/content/applications/services/helpdesk/overview/help_center.rst b/content-rst/applications/services/helpdesk/overview/help_center.rst similarity index 100% rename from content/applications/services/helpdesk/overview/help_center.rst rename to content-rst/applications/services/helpdesk/overview/help_center.rst diff --git a/content-rst/applications/services/helpdesk/overview/help_center/help-center-create-ticket.png b/content-rst/applications/services/helpdesk/overview/help_center/help-center-create-ticket.png new file mode 100644 index 000000000..822217245 Binary files /dev/null and b/content-rst/applications/services/helpdesk/overview/help_center/help-center-create-ticket.png differ diff --git a/content-rst/applications/services/helpdesk/overview/help_center/help-center-elearning-course-contents-page.png b/content-rst/applications/services/helpdesk/overview/help_center/help-center-elearning-course-contents-page.png new file mode 100644 index 000000000..1db286e91 Binary files /dev/null and b/content-rst/applications/services/helpdesk/overview/help_center/help-center-elearning-course-contents-page.png differ diff --git a/content-rst/applications/services/helpdesk/overview/help_center/help-center-elearning-publish-back-end.png b/content-rst/applications/services/helpdesk/overview/help_center/help-center-elearning-publish-back-end.png new file mode 100644 index 000000000..8ad20b7d5 Binary files /dev/null and b/content-rst/applications/services/helpdesk/overview/help_center/help-center-elearning-publish-back-end.png differ diff --git a/content-rst/applications/services/helpdesk/overview/help_center/help-center-enable-features.png b/content-rst/applications/services/helpdesk/overview/help_center/help-center-enable-features.png new file mode 100644 index 000000000..44795b025 Binary files /dev/null and b/content-rst/applications/services/helpdesk/overview/help_center/help-center-enable-features.png differ diff --git a/content-rst/applications/services/helpdesk/overview/help_center/help-center-knowledge-bookmark-icon.png b/content-rst/applications/services/helpdesk/overview/help_center/help-center-knowledge-bookmark-icon.png new file mode 100644 index 000000000..af64ce8a4 Binary files /dev/null and b/content-rst/applications/services/helpdesk/overview/help_center/help-center-knowledge-bookmark-icon.png differ diff --git a/content-rst/applications/services/helpdesk/overview/help_center/help-center-knowledge-clipboard-options.png b/content-rst/applications/services/helpdesk/overview/help_center/help-center-knowledge-clipboard-options.png new file mode 100644 index 000000000..bf6e21260 Binary files /dev/null and b/content-rst/applications/services/helpdesk/overview/help_center/help-center-knowledge-clipboard-options.png differ diff --git a/content-rst/applications/services/helpdesk/overview/help_center/help-center-knowledge-search.png b/content-rst/applications/services/helpdesk/overview/help_center/help-center-knowledge-search.png new file mode 100644 index 000000000..488d83413 Binary files /dev/null and b/content-rst/applications/services/helpdesk/overview/help_center/help-center-knowledge-search.png differ diff --git a/content-rst/applications/services/helpdesk/overview/help_center/help-center-knowledge-sharing.png b/content-rst/applications/services/helpdesk/overview/help_center/help-center-knowledge-sharing.png new file mode 100644 index 000000000..9236cfe27 Binary files /dev/null and b/content-rst/applications/services/helpdesk/overview/help_center/help-center-knowledge-sharing.png differ diff --git a/content-rst/applications/services/helpdesk/overview/help_center/help-center-share-on-forum.png b/content-rst/applications/services/helpdesk/overview/help_center/help-center-share-on-forum.png new file mode 100644 index 000000000..8fa02a538 Binary files /dev/null and b/content-rst/applications/services/helpdesk/overview/help_center/help-center-share-on-forum.png differ diff --git a/content/applications/services/helpdesk/overview/ratings.rst b/content-rst/applications/services/helpdesk/overview/ratings.rst similarity index 100% rename from content/applications/services/helpdesk/overview/ratings.rst rename to content-rst/applications/services/helpdesk/overview/ratings.rst diff --git a/content-rst/applications/services/helpdesk/overview/ratings/ratings-enable.png b/content-rst/applications/services/helpdesk/overview/ratings/ratings-enable.png new file mode 100644 index 000000000..989ac947b Binary files /dev/null and b/content-rst/applications/services/helpdesk/overview/ratings/ratings-enable.png differ diff --git a/content-rst/applications/services/helpdesk/overview/ratings/ratings-keep-internal.png b/content-rst/applications/services/helpdesk/overview/ratings/ratings-keep-internal.png new file mode 100644 index 000000000..e6cd3be94 Binary files /dev/null and b/content-rst/applications/services/helpdesk/overview/ratings/ratings-keep-internal.png differ diff --git a/content-rst/applications/services/helpdesk/overview/ratings/ratings-portal-overview.png b/content-rst/applications/services/helpdesk/overview/ratings/ratings-portal-overview.png new file mode 100644 index 000000000..98746c1f0 Binary files /dev/null and b/content-rst/applications/services/helpdesk/overview/ratings/ratings-portal-overview.png differ diff --git a/content/applications/services/helpdesk/overview/receiving_tickets.rst b/content-rst/applications/services/helpdesk/overview/receiving_tickets.rst similarity index 100% rename from content/applications/services/helpdesk/overview/receiving_tickets.rst rename to content-rst/applications/services/helpdesk/overview/receiving_tickets.rst diff --git a/content-rst/applications/services/helpdesk/overview/receiving_tickets/receiving-tickets-channel-rules.png b/content-rst/applications/services/helpdesk/overview/receiving_tickets/receiving-tickets-channel-rules.png new file mode 100644 index 000000000..8869ae213 Binary files /dev/null and b/content-rst/applications/services/helpdesk/overview/receiving_tickets/receiving-tickets-channel-rules.png differ diff --git a/content-rst/applications/services/helpdesk/overview/receiving_tickets/receiving-tickets-email-alias.png b/content-rst/applications/services/helpdesk/overview/receiving_tickets/receiving-tickets-email-alias.png new file mode 100644 index 000000000..b583d003b Binary files /dev/null and b/content-rst/applications/services/helpdesk/overview/receiving_tickets/receiving-tickets-email-alias.png differ diff --git a/content-rst/applications/services/helpdesk/overview/receiving_tickets/receiving-tickets-go-to-website.png b/content-rst/applications/services/helpdesk/overview/receiving_tickets/receiving-tickets-go-to-website.png new file mode 100644 index 000000000..93b9684c9 Binary files /dev/null and b/content-rst/applications/services/helpdesk/overview/receiving_tickets/receiving-tickets-go-to-website.png differ diff --git a/content-rst/applications/services/helpdesk/overview/receiving_tickets/receiving-tickets-join-live-chat.png b/content-rst/applications/services/helpdesk/overview/receiving_tickets/receiving-tickets-join-live-chat.png new file mode 100644 index 000000000..1cfe0a556 Binary files /dev/null and b/content-rst/applications/services/helpdesk/overview/receiving_tickets/receiving-tickets-join-live-chat.png differ diff --git a/content-rst/applications/services/helpdesk/overview/receiving_tickets/receiving-tickets-live-chat-new-channel.png b/content-rst/applications/services/helpdesk/overview/receiving_tickets/receiving-tickets-live-chat-new-channel.png new file mode 100644 index 000000000..9edda3eba Binary files /dev/null and b/content-rst/applications/services/helpdesk/overview/receiving_tickets/receiving-tickets-live-chat-new-channel.png differ diff --git a/content-rst/applications/services/helpdesk/overview/receiving_tickets/receiving-tickets-options-tab.png b/content-rst/applications/services/helpdesk/overview/receiving_tickets/receiving-tickets-options-tab.png new file mode 100644 index 000000000..df70690f6 Binary files /dev/null and b/content-rst/applications/services/helpdesk/overview/receiving_tickets/receiving-tickets-options-tab.png differ diff --git a/content-rst/applications/services/helpdesk/overview/receiving_tickets/receiving-tickets-priority.png b/content-rst/applications/services/helpdesk/overview/receiving_tickets/receiving-tickets-priority.png new file mode 100644 index 000000000..3ed782c0f Binary files /dev/null and b/content-rst/applications/services/helpdesk/overview/receiving_tickets/receiving-tickets-priority.png differ diff --git a/content-rst/applications/services/helpdesk/overview/receiving_tickets/receiving-tickets-web-form.png b/content-rst/applications/services/helpdesk/overview/receiving_tickets/receiving-tickets-web-form.png new file mode 100644 index 000000000..8d62a97d7 Binary files /dev/null and b/content-rst/applications/services/helpdesk/overview/receiving_tickets/receiving-tickets-web-form.png differ diff --git a/content/applications/services/helpdesk/overview/reports.rst b/content-rst/applications/services/helpdesk/overview/reports.rst similarity index 100% rename from content/applications/services/helpdesk/overview/reports.rst rename to content-rst/applications/services/helpdesk/overview/reports.rst diff --git a/content-rst/applications/services/helpdesk/overview/reports/bar-chart.png b/content-rst/applications/services/helpdesk/overview/reports/bar-chart.png new file mode 100644 index 000000000..96f0886b7 Binary files /dev/null and b/content-rst/applications/services/helpdesk/overview/reports/bar-chart.png differ diff --git a/content-rst/applications/services/helpdesk/overview/reports/customer-ratings.png b/content-rst/applications/services/helpdesk/overview/reports/customer-ratings.png new file mode 100644 index 000000000..148cd7dd9 Binary files /dev/null and b/content-rst/applications/services/helpdesk/overview/reports/customer-ratings.png differ diff --git a/content-rst/applications/services/helpdesk/overview/reports/line-chart.png b/content-rst/applications/services/helpdesk/overview/reports/line-chart.png new file mode 100644 index 000000000..8dff0c784 Binary files /dev/null and b/content-rst/applications/services/helpdesk/overview/reports/line-chart.png differ diff --git a/content-rst/applications/services/helpdesk/overview/reports/pie-chart.png b/content-rst/applications/services/helpdesk/overview/reports/pie-chart.png new file mode 100644 index 000000000..969ecf1cf Binary files /dev/null and b/content-rst/applications/services/helpdesk/overview/reports/pie-chart.png differ diff --git a/content-rst/applications/services/helpdesk/overview/reports/pivot-view.png b/content-rst/applications/services/helpdesk/overview/reports/pivot-view.png new file mode 100644 index 000000000..53e8f2e79 Binary files /dev/null and b/content-rst/applications/services/helpdesk/overview/reports/pivot-view.png differ diff --git a/content-rst/applications/services/helpdesk/overview/reports/ratings-details.png b/content-rst/applications/services/helpdesk/overview/reports/ratings-details.png new file mode 100644 index 000000000..8e780e97c Binary files /dev/null and b/content-rst/applications/services/helpdesk/overview/reports/ratings-details.png differ diff --git a/content-rst/applications/services/helpdesk/overview/reports/save-filters.png b/content-rst/applications/services/helpdesk/overview/reports/save-filters.png new file mode 100644 index 000000000..21db7938a Binary files /dev/null and b/content-rst/applications/services/helpdesk/overview/reports/save-filters.png differ diff --git a/content-rst/applications/services/helpdesk/overview/reports/sla-status.png b/content-rst/applications/services/helpdesk/overview/reports/sla-status.png new file mode 100644 index 000000000..c6c7bd012 Binary files /dev/null and b/content-rst/applications/services/helpdesk/overview/reports/sla-status.png differ diff --git a/content-rst/applications/services/helpdesk/overview/reports/tickets-default.png b/content-rst/applications/services/helpdesk/overview/reports/tickets-default.png new file mode 100644 index 000000000..100f066dd Binary files /dev/null and b/content-rst/applications/services/helpdesk/overview/reports/tickets-default.png differ diff --git a/content/applications/services/helpdesk/overview/sla.rst b/content-rst/applications/services/helpdesk/overview/sla.rst similarity index 100% rename from content/applications/services/helpdesk/overview/sla.rst rename to content-rst/applications/services/helpdesk/overview/sla.rst diff --git a/content-rst/applications/services/helpdesk/overview/sla/sla-create-new.png b/content-rst/applications/services/helpdesk/overview/sla/sla-create-new.png new file mode 100644 index 000000000..3a4fbfda4 Binary files /dev/null and b/content-rst/applications/services/helpdesk/overview/sla/sla-create-new.png differ diff --git a/content-rst/applications/services/helpdesk/overview/sla/sla-deadline.png b/content-rst/applications/services/helpdesk/overview/sla/sla-deadline.png new file mode 100644 index 000000000..4cafb1851 Binary files /dev/null and b/content-rst/applications/services/helpdesk/overview/sla/sla-deadline.png differ diff --git a/content-rst/applications/services/helpdesk/overview/sla/sla-enable.png b/content-rst/applications/services/helpdesk/overview/sla/sla-enable.png new file mode 100644 index 000000000..4223bd84c Binary files /dev/null and b/content-rst/applications/services/helpdesk/overview/sla/sla-enable.png differ diff --git a/content-rst/applications/services/helpdesk/overview/sla/sla-open-deadline.png b/content-rst/applications/services/helpdesk/overview/sla/sla-open-deadline.png new file mode 100644 index 000000000..4455a36c1 Binary files /dev/null and b/content-rst/applications/services/helpdesk/overview/sla/sla-open-deadline.png differ diff --git a/content-rst/applications/services/helpdesk/overview/sla/sla-passing-failing.png b/content-rst/applications/services/helpdesk/overview/sla/sla-passing-failing.png new file mode 100644 index 000000000..7bddd914d Binary files /dev/null and b/content-rst/applications/services/helpdesk/overview/sla/sla-passing-failing.png differ diff --git a/content-rst/applications/services/helpdesk/overview/sla/sla-pivot-groups.png b/content-rst/applications/services/helpdesk/overview/sla/sla-pivot-groups.png new file mode 100644 index 000000000..3a7d0d78d Binary files /dev/null and b/content-rst/applications/services/helpdesk/overview/sla/sla-pivot-groups.png differ diff --git a/content-rst/applications/services/helpdesk/overview/sla/sla-pivot-measures.png b/content-rst/applications/services/helpdesk/overview/sla/sla-pivot-measures.png new file mode 100644 index 000000000..43f3edf1d Binary files /dev/null and b/content-rst/applications/services/helpdesk/overview/sla/sla-pivot-measures.png differ diff --git a/content-rst/applications/services/helpdesk/overview/sla/sla-report-bar.png b/content-rst/applications/services/helpdesk/overview/sla/sla-report-bar.png new file mode 100644 index 000000000..ac0bef26e Binary files /dev/null and b/content-rst/applications/services/helpdesk/overview/sla/sla-report-bar.png differ diff --git a/content-rst/applications/services/helpdesk/overview/sla/sla-report-cohort.png b/content-rst/applications/services/helpdesk/overview/sla/sla-report-cohort.png new file mode 100644 index 000000000..6df2b3821 Binary files /dev/null and b/content-rst/applications/services/helpdesk/overview/sla/sla-report-cohort.png differ diff --git a/content-rst/applications/services/helpdesk/overview/sla/sla-report-line.png b/content-rst/applications/services/helpdesk/overview/sla/sla-report-line.png new file mode 100644 index 000000000..bd4796539 Binary files /dev/null and b/content-rst/applications/services/helpdesk/overview/sla/sla-report-line.png differ diff --git a/content-rst/applications/services/helpdesk/overview/sla/sla-report-pie.png b/content-rst/applications/services/helpdesk/overview/sla/sla-report-pie.png new file mode 100644 index 000000000..c5ee7b59c Binary files /dev/null and b/content-rst/applications/services/helpdesk/overview/sla/sla-report-pie.png differ diff --git a/content-rst/applications/services/helpdesk/overview/sla/sla-report-stacked.png b/content-rst/applications/services/helpdesk/overview/sla/sla-report-stacked.png new file mode 100644 index 000000000..745d22a29 Binary files /dev/null and b/content-rst/applications/services/helpdesk/overview/sla/sla-report-stacked.png differ diff --git a/content-rst/applications/services/helpdesk/overview/sla/sla-status-analysis.png b/content-rst/applications/services/helpdesk/overview/sla/sla-status-analysis.png new file mode 100644 index 000000000..2039c68e2 Binary files /dev/null and b/content-rst/applications/services/helpdesk/overview/sla/sla-status-analysis.png differ diff --git a/content/applications/services/helpdesk/overview/stages.rst b/content-rst/applications/services/helpdesk/overview/stages.rst similarity index 100% rename from content/applications/services/helpdesk/overview/stages.rst rename to content-rst/applications/services/helpdesk/overview/stages.rst diff --git a/content-rst/applications/services/helpdesk/overview/stages/fold-stage-kanban.png b/content-rst/applications/services/helpdesk/overview/stages/fold-stage-kanban.png new file mode 100644 index 000000000..faf8e2bb3 Binary files /dev/null and b/content-rst/applications/services/helpdesk/overview/stages/fold-stage-kanban.png differ diff --git a/content-rst/applications/services/helpdesk/overview/stages/new-stage-details.png b/content-rst/applications/services/helpdesk/overview/stages/new-stage-details.png new file mode 100644 index 000000000..ca44810cf Binary files /dev/null and b/content-rst/applications/services/helpdesk/overview/stages/new-stage-details.png differ diff --git a/content-rst/applications/services/helpdesk/overview/stages/sms-template.png b/content-rst/applications/services/helpdesk/overview/stages/sms-template.png new file mode 100644 index 000000000..b212720ae Binary files /dev/null and b/content-rst/applications/services/helpdesk/overview/stages/sms-template.png differ diff --git a/content-rst/applications/services/helpdesk/overview/stages/stages-list-buttons.png b/content-rst/applications/services/helpdesk/overview/stages/stages-list-buttons.png new file mode 100644 index 000000000..527f9f004 Binary files /dev/null and b/content-rst/applications/services/helpdesk/overview/stages/stages-list-buttons.png differ diff --git a/content-rst/applications/services/helpdesk/team-description-webform.png b/content-rst/applications/services/helpdesk/team-description-webform.png new file mode 100644 index 000000000..3006fa545 Binary files /dev/null and b/content-rst/applications/services/helpdesk/team-description-webform.png differ diff --git a/content/applications/services/planning.rst b/content-rst/applications/services/planning.rst similarity index 100% rename from content/applications/services/planning.rst rename to content-rst/applications/services/planning.rst diff --git a/content-rst/applications/services/planning/add-properties.png b/content-rst/applications/services/planning/add-properties.png new file mode 100644 index 000000000..bcde06c6c Binary files /dev/null and b/content-rst/applications/services/planning/add-properties.png differ diff --git a/content-rst/applications/services/planning/employee-tab.png b/content-rst/applications/services/planning/employee-tab.png new file mode 100644 index 000000000..b6b51465a Binary files /dev/null and b/content-rst/applications/services/planning/employee-tab.png differ diff --git a/content-rst/applications/services/planning/save-template.png b/content-rst/applications/services/planning/save-template.png new file mode 100644 index 000000000..728de82fe Binary files /dev/null and b/content-rst/applications/services/planning/save-template.png differ diff --git a/content-rst/applications/services/planning/schedule.png b/content-rst/applications/services/planning/schedule.png new file mode 100644 index 000000000..c67958d75 Binary files /dev/null and b/content-rst/applications/services/planning/schedule.png differ diff --git a/content/applications/services/project.rst b/content-rst/applications/services/project.rst similarity index 100% rename from content/applications/services/project.rst rename to content-rst/applications/services/project.rst diff --git a/content/applications/services/project/project_dashboard.rst b/content-rst/applications/services/project/project_dashboard.rst similarity index 100% rename from content/applications/services/project/project_dashboard.rst rename to content-rst/applications/services/project/project_dashboard.rst diff --git a/content/applications/services/project/project_management.rst b/content-rst/applications/services/project/project_management.rst similarity index 100% rename from content/applications/services/project/project_management.rst rename to content-rst/applications/services/project/project_management.rst diff --git a/content-rst/applications/services/project/project_management/project-settings-opened.png b/content-rst/applications/services/project/project_management/project-settings-opened.png new file mode 100644 index 000000000..d12274e34 Binary files /dev/null and b/content-rst/applications/services/project/project_management/project-settings-opened.png differ diff --git a/content-rst/applications/services/project/project_management/project-settings.png b/content-rst/applications/services/project/project_management/project-settings.png new file mode 100644 index 000000000..24cb2521f Binary files /dev/null and b/content-rst/applications/services/project/project_management/project-settings.png differ diff --git a/content-rst/applications/services/project/project_management/top-bar.png b/content-rst/applications/services/project/project_management/top-bar.png new file mode 100644 index 000000000..25de1431c Binary files /dev/null and b/content-rst/applications/services/project/project_management/top-bar.png differ diff --git a/content/applications/services/project/tasks.rst b/content-rst/applications/services/project/tasks.rst similarity index 100% rename from content/applications/services/project/tasks.rst rename to content-rst/applications/services/project/tasks.rst diff --git a/content/applications/services/project/tasks/recurring_tasks.rst b/content-rst/applications/services/project/tasks/recurring_tasks.rst similarity index 100% rename from content/applications/services/project/tasks/recurring_tasks.rst rename to content-rst/applications/services/project/tasks/recurring_tasks.rst diff --git a/content/applications/services/project/tasks/sub-tasks.rst b/content-rst/applications/services/project/tasks/sub-tasks.rst similarity index 100% rename from content/applications/services/project/tasks/sub-tasks.rst rename to content-rst/applications/services/project/tasks/sub-tasks.rst diff --git a/content/applications/services/project/tasks/task_creation.rst b/content-rst/applications/services/project/tasks/task_creation.rst similarity index 100% rename from content/applications/services/project/tasks/task_creation.rst rename to content-rst/applications/services/project/tasks/task_creation.rst diff --git a/content-rst/applications/services/project/tasks/task_creation/email-configuration.png b/content-rst/applications/services/project/tasks/task_creation/email-configuration.png new file mode 100644 index 000000000..37d4d7005 Binary files /dev/null and b/content-rst/applications/services/project/tasks/task_creation/email-configuration.png differ diff --git a/content-rst/applications/services/project/tasks/task_creation/task-shortcuts.png b/content-rst/applications/services/project/tasks/task_creation/task-shortcuts.png new file mode 100644 index 000000000..4f13c916b Binary files /dev/null and b/content-rst/applications/services/project/tasks/task_creation/task-shortcuts.png differ diff --git a/content/applications/services/project/tasks/task_dependencies.rst b/content-rst/applications/services/project/tasks/task_dependencies.rst similarity index 100% rename from content/applications/services/project/tasks/task_dependencies.rst rename to content-rst/applications/services/project/tasks/task_dependencies.rst diff --git a/content-rst/applications/services/project/tasks/task_dependencies/task-dependency.png b/content-rst/applications/services/project/tasks/task_dependencies/task-dependency.png new file mode 100644 index 000000000..ec7423500 Binary files /dev/null and b/content-rst/applications/services/project/tasks/task_dependencies/task-dependency.png differ diff --git a/content/applications/services/project/tasks/task_stages_statuses.rst b/content-rst/applications/services/project/tasks/task_stages_statuses.rst similarity index 100% rename from content/applications/services/project/tasks/task_stages_statuses.rst rename to content-rst/applications/services/project/tasks/task_stages_statuses.rst diff --git a/content/applications/services/timesheets.rst b/content-rst/applications/services/timesheets.rst similarity index 100% rename from content/applications/services/timesheets.rst rename to content-rst/applications/services/timesheets.rst diff --git a/content/applications/services/timesheets/overview.rst b/content-rst/applications/services/timesheets/overview.rst similarity index 100% rename from content/applications/services/timesheets/overview.rst rename to content-rst/applications/services/timesheets/overview.rst diff --git a/content/applications/services/timesheets/overview/time_off.rst b/content-rst/applications/services/timesheets/overview/time_off.rst similarity index 100% rename from content/applications/services/timesheets/overview/time_off.rst rename to content-rst/applications/services/timesheets/overview/time_off.rst diff --git a/content-rst/applications/services/timesheets/overview/time_off/record_time_off.png b/content-rst/applications/services/timesheets/overview/time_off/record_time_off.png new file mode 100644 index 000000000..a89b8875e Binary files /dev/null and b/content-rst/applications/services/timesheets/overview/time_off/record_time_off.png differ diff --git a/content-rst/applications/services/timesheets/overview/time_off/time_off_request.png b/content-rst/applications/services/timesheets/overview/time_off/time_off_request.png new file mode 100644 index 000000000..56d847128 Binary files /dev/null and b/content-rst/applications/services/timesheets/overview/time_off/time_off_request.png differ diff --git a/content-rst/applications/services/timesheets/overview/time_off/time_off_types.png b/content-rst/applications/services/timesheets/overview/time_off/time_off_types.png new file mode 100644 index 000000000..a4b34fa44 Binary files /dev/null and b/content-rst/applications/services/timesheets/overview/time_off/time_off_types.png differ diff --git a/content-rst/applications/services/timesheets/overview/time_off/timesheet_description.png b/content-rst/applications/services/timesheets/overview/time_off/timesheet_description.png new file mode 100644 index 000000000..a56bcaa69 Binary files /dev/null and b/content-rst/applications/services/timesheets/overview/time_off/timesheet_description.png differ diff --git a/content-rst/applications/services/timesheets/overview/time_off/timesheets.png b/content-rst/applications/services/timesheets/overview/time_off/timesheets.png new file mode 100644 index 000000000..f7b6c0a14 Binary files /dev/null and b/content-rst/applications/services/timesheets/overview/time_off/timesheets.png differ diff --git a/content/applications/studio.rst b/content-rst/applications/studio.rst similarity index 100% rename from content/applications/studio.rst rename to content-rst/applications/studio.rst diff --git a/content/applications/studio/approval_rules.rst b/content-rst/applications/studio/approval_rules.rst similarity index 100% rename from content/applications/studio/approval_rules.rst rename to content-rst/applications/studio/approval_rules.rst diff --git a/content-rst/applications/studio/approval_rules/approval-button.png b/content-rst/applications/studio/approval_rules/approval-button.png new file mode 100644 index 000000000..511ca1d5c Binary files /dev/null and b/content-rst/applications/studio/approval_rules/approval-button.png differ diff --git a/content-rst/applications/studio/approval_rules/delegate-dialog.png b/content-rst/applications/studio/approval_rules/delegate-dialog.png new file mode 100644 index 000000000..e2198c837 Binary files /dev/null and b/content-rst/applications/studio/approval_rules/delegate-dialog.png differ diff --git a/content/applications/studio/automated_actions.rst b/content-rst/applications/studio/automated_actions.rst similarity index 100% rename from content/applications/studio/automated_actions.rst rename to content-rst/applications/studio/automated_actions.rst diff --git a/content-rst/applications/studio/automated_actions/automation-rule-ex.png b/content-rst/applications/studio/automated_actions/automation-rule-ex.png new file mode 100644 index 000000000..221bb156c Binary files /dev/null and b/content-rst/applications/studio/automated_actions/automation-rule-ex.png differ diff --git a/content-rst/applications/studio/automated_actions/automations-kanban.png b/content-rst/applications/studio/automated_actions/automations-kanban.png new file mode 100644 index 000000000..cad1db62f Binary files /dev/null and b/content-rst/applications/studio/automated_actions/automations-kanban.png differ diff --git a/content-rst/applications/studio/automated_actions/before-update-domain.png b/content-rst/applications/studio/automated_actions/before-update-domain.png new file mode 100644 index 000000000..a775c6159 Binary files /dev/null and b/content-rst/applications/studio/automated_actions/before-update-domain.png differ diff --git a/content-rst/applications/studio/automated_actions/create-activity-action.png b/content-rst/applications/studio/automated_actions/create-activity-action.png new file mode 100644 index 000000000..cc6e2f42d Binary files /dev/null and b/content-rst/applications/studio/automated_actions/create-activity-action.png differ diff --git a/content-rst/applications/studio/automated_actions/timing-conditions-trigger.png b/content-rst/applications/studio/automated_actions/timing-conditions-trigger.png new file mode 100644 index 000000000..41ca2575d Binary files /dev/null and b/content-rst/applications/studio/automated_actions/timing-conditions-trigger.png differ diff --git a/content-rst/applications/studio/automated_actions/update-record-action.png b/content-rst/applications/studio/automated_actions/update-record-action.png new file mode 100644 index 000000000..1915eef21 Binary files /dev/null and b/content-rst/applications/studio/automated_actions/update-record-action.png differ diff --git a/content-rst/applications/studio/automated_actions/update-record-compute.png b/content-rst/applications/studio/automated_actions/update-record-compute.png new file mode 100644 index 000000000..c0c812912 Binary files /dev/null and b/content-rst/applications/studio/automated_actions/update-record-compute.png differ diff --git a/content-rst/applications/studio/automated_actions/values-updated-trigger.png b/content-rst/applications/studio/automated_actions/values-updated-trigger.png new file mode 100644 index 000000000..39758f705 Binary files /dev/null and b/content-rst/applications/studio/automated_actions/values-updated-trigger.png differ diff --git a/content/applications/studio/fields.rst b/content-rst/applications/studio/fields.rst similarity index 100% rename from content/applications/studio/fields.rst rename to content-rst/applications/studio/fields.rst diff --git a/content-rst/applications/studio/fields/checkbox-examples.png b/content-rst/applications/studio/fields/checkbox-examples.png new file mode 100644 index 000000000..c4089b4dc Binary files /dev/null and b/content-rst/applications/studio/fields/checkbox-examples.png differ diff --git a/content-rst/applications/studio/fields/date-examples.png b/content-rst/applications/studio/fields/date-examples.png new file mode 100644 index 000000000..4afacc9ec Binary files /dev/null and b/content-rst/applications/studio/fields/date-examples.png differ diff --git a/content-rst/applications/studio/fields/date-time-examples.png b/content-rst/applications/studio/fields/date-time-examples.png new file mode 100644 index 000000000..77b86201e Binary files /dev/null and b/content-rst/applications/studio/fields/date-time-examples.png differ diff --git a/content-rst/applications/studio/fields/decimal-examples.png b/content-rst/applications/studio/fields/decimal-examples.png new file mode 100644 index 000000000..6179e5fbf Binary files /dev/null and b/content-rst/applications/studio/fields/decimal-examples.png differ diff --git a/content-rst/applications/studio/fields/file-examples.png b/content-rst/applications/studio/fields/file-examples.png new file mode 100644 index 000000000..fbed2346a Binary files /dev/null and b/content-rst/applications/studio/fields/file-examples.png differ diff --git a/content-rst/applications/studio/fields/html-example.png b/content-rst/applications/studio/fields/html-example.png new file mode 100644 index 000000000..999953c5f Binary files /dev/null and b/content-rst/applications/studio/fields/html-example.png differ diff --git a/content-rst/applications/studio/fields/integer-examples.png b/content-rst/applications/studio/fields/integer-examples.png new file mode 100644 index 000000000..659c5a55b Binary files /dev/null and b/content-rst/applications/studio/fields/integer-examples.png differ diff --git a/content-rst/applications/studio/fields/lines-example.png b/content-rst/applications/studio/fields/lines-example.png new file mode 100644 index 000000000..7640a94e9 Binary files /dev/null and b/content-rst/applications/studio/fields/lines-example.png differ diff --git a/content-rst/applications/studio/fields/many2many-diagram.png b/content-rst/applications/studio/fields/many2many-diagram.png new file mode 100644 index 000000000..572c88ad7 Binary files /dev/null and b/content-rst/applications/studio/fields/many2many-diagram.png differ diff --git a/content-rst/applications/studio/fields/many2one-diagram.png b/content-rst/applications/studio/fields/many2one-diagram.png new file mode 100644 index 000000000..4b7553c45 Binary files /dev/null and b/content-rst/applications/studio/fields/many2one-diagram.png differ diff --git a/content-rst/applications/studio/fields/monetary-example.png b/content-rst/applications/studio/fields/monetary-example.png new file mode 100644 index 000000000..23d928335 Binary files /dev/null and b/content-rst/applications/studio/fields/monetary-example.png differ diff --git a/content-rst/applications/studio/fields/multiline-text-examples.png b/content-rst/applications/studio/fields/multiline-text-examples.png new file mode 100644 index 000000000..82c2ac75e Binary files /dev/null and b/content-rst/applications/studio/fields/multiline-text-examples.png differ diff --git a/content-rst/applications/studio/fields/one2many-diagram.png b/content-rst/applications/studio/fields/one2many-diagram.png new file mode 100644 index 000000000..54c3659e8 Binary files /dev/null and b/content-rst/applications/studio/fields/one2many-diagram.png differ diff --git a/content-rst/applications/studio/fields/priority-example.png b/content-rst/applications/studio/fields/priority-example.png new file mode 100644 index 000000000..65678edab Binary files /dev/null and b/content-rst/applications/studio/fields/priority-example.png differ diff --git a/content-rst/applications/studio/fields/selection-examples.png b/content-rst/applications/studio/fields/selection-examples.png new file mode 100644 index 000000000..c94b01c06 Binary files /dev/null and b/content-rst/applications/studio/fields/selection-examples.png differ diff --git a/content-rst/applications/studio/fields/tags-example.png b/content-rst/applications/studio/fields/tags-example.png new file mode 100644 index 000000000..0e28fa745 Binary files /dev/null and b/content-rst/applications/studio/fields/tags-example.png differ diff --git a/content-rst/applications/studio/fields/text-examples.png b/content-rst/applications/studio/fields/text-examples.png new file mode 100644 index 000000000..b4882931f Binary files /dev/null and b/content-rst/applications/studio/fields/text-examples.png differ diff --git a/content/applications/studio/models_modules_apps.rst b/content-rst/applications/studio/models_modules_apps.rst similarity index 100% rename from content/applications/studio/models_modules_apps.rst rename to content-rst/applications/studio/models_modules_apps.rst diff --git a/content-rst/applications/studio/models_modules_apps/chatter.png b/content-rst/applications/studio/models_modules_apps/chatter.png new file mode 100644 index 000000000..266bfba06 Binary files /dev/null and b/content-rst/applications/studio/models_modules_apps/chatter.png differ diff --git a/content-rst/applications/studio/models_modules_apps/contact.png b/content-rst/applications/studio/models_modules_apps/contact.png new file mode 100644 index 000000000..868129c8c Binary files /dev/null and b/content-rst/applications/studio/models_modules_apps/contact.png differ diff --git a/content-rst/applications/studio/models_modules_apps/picture-pipeline-kanban.png b/content-rst/applications/studio/models_modules_apps/picture-pipeline-kanban.png new file mode 100644 index 000000000..ee4be4d21 Binary files /dev/null and b/content-rst/applications/studio/models_modules_apps/picture-pipeline-kanban.png differ diff --git a/content-rst/applications/studio/models_modules_apps/user-assignment.png b/content-rst/applications/studio/models_modules_apps/user-assignment.png new file mode 100644 index 000000000..f325eb17a Binary files /dev/null and b/content-rst/applications/studio/models_modules_apps/user-assignment.png differ diff --git a/content/applications/studio/pdf_reports.rst b/content-rst/applications/studio/pdf_reports.rst similarity index 100% rename from content/applications/studio/pdf_reports.rst rename to content-rst/applications/studio/pdf_reports.rst diff --git a/content-rst/applications/studio/pdf_reports/XML-SO-product-category.png b/content-rst/applications/studio/pdf_reports/XML-SO-product-category.png new file mode 100644 index 000000000..a790c47c9 Binary files /dev/null and b/content-rst/applications/studio/pdf_reports/XML-SO-product-category.png differ diff --git a/content-rst/applications/studio/pdf_reports/XML-condition-else.png b/content-rst/applications/studio/pdf_reports/XML-condition-else.png new file mode 100644 index 000000000..e44d887e8 Binary files /dev/null and b/content-rst/applications/studio/pdf_reports/XML-condition-else.png differ diff --git a/content-rst/applications/studio/pdf_reports/XML-condition-if.png b/content-rst/applications/studio/pdf_reports/XML-condition-if.png new file mode 100644 index 000000000..bf953d643 Binary files /dev/null and b/content-rst/applications/studio/pdf_reports/XML-condition-if.png differ diff --git a/content-rst/applications/studio/pdf_reports/XML-data-table.png b/content-rst/applications/studio/pdf_reports/XML-data-table.png new file mode 100644 index 000000000..aa066c97a Binary files /dev/null and b/content-rst/applications/studio/pdf_reports/XML-data-table.png differ diff --git a/content-rst/applications/studio/pdf_reports/XML-images.png b/content-rst/applications/studio/pdf_reports/XML-images.png new file mode 100644 index 000000000..0c6977621 Binary files /dev/null and b/content-rst/applications/studio/pdf_reports/XML-images.png differ diff --git a/content-rst/applications/studio/pdf_reports/conditional-block-else.png b/content-rst/applications/studio/pdf_reports/conditional-block-else.png new file mode 100644 index 000000000..4bc8b2fe7 Binary files /dev/null and b/content-rst/applications/studio/pdf_reports/conditional-block-else.png differ diff --git a/content-rst/applications/studio/pdf_reports/conditional-block-if.png b/content-rst/applications/studio/pdf_reports/conditional-block-if.png new file mode 100644 index 000000000..b3f3df1f7 Binary files /dev/null and b/content-rst/applications/studio/pdf_reports/conditional-block-if.png differ diff --git a/content-rst/applications/studio/pdf_reports/duplicate-report.png b/content-rst/applications/studio/pdf_reports/duplicate-report.png new file mode 100644 index 000000000..dc29ed847 Binary files /dev/null and b/content-rst/applications/studio/pdf_reports/duplicate-report.png differ diff --git a/content-rst/applications/studio/pdf_reports/dynamic-table.png b/content-rst/applications/studio/pdf_reports/dynamic-table.png new file mode 100644 index 000000000..8d6167354 Binary files /dev/null and b/content-rst/applications/studio/pdf_reports/dynamic-table.png differ diff --git a/content-rst/applications/studio/pdf_reports/layout-bold.png b/content-rst/applications/studio/pdf_reports/layout-bold.png new file mode 100644 index 000000000..f2934f90a Binary files /dev/null and b/content-rst/applications/studio/pdf_reports/layout-bold.png differ diff --git a/content-rst/applications/studio/pdf_reports/layout-boxed.png b/content-rst/applications/studio/pdf_reports/layout-boxed.png new file mode 100644 index 000000000..ee7c8c58a Binary files /dev/null and b/content-rst/applications/studio/pdf_reports/layout-boxed.png differ diff --git a/content-rst/applications/studio/pdf_reports/layout-light.png b/content-rst/applications/studio/pdf_reports/layout-light.png new file mode 100644 index 000000000..27693faa1 Binary files /dev/null and b/content-rst/applications/studio/pdf_reports/layout-light.png differ diff --git a/content-rst/applications/studio/pdf_reports/layout-striped.png b/content-rst/applications/studio/pdf_reports/layout-striped.png new file mode 100644 index 000000000..6ff0a683a Binary files /dev/null and b/content-rst/applications/studio/pdf_reports/layout-striped.png differ diff --git a/content-rst/applications/studio/pdf_reports/powerbox-field.png b/content-rst/applications/studio/pdf_reports/powerbox-field.png new file mode 100644 index 000000000..503ad1adb Binary files /dev/null and b/content-rst/applications/studio/pdf_reports/powerbox-field.png differ diff --git a/content-rst/applications/studio/pdf_reports/table-add-column.png b/content-rst/applications/studio/pdf_reports/table-add-column.png new file mode 100644 index 000000000..9851baa2a Binary files /dev/null and b/content-rst/applications/studio/pdf_reports/table-add-column.png differ diff --git a/content-rst/applications/studio/pdf_reports/text-editor.png b/content-rst/applications/studio/pdf_reports/text-editor.png new file mode 100644 index 000000000..9d880477c Binary files /dev/null and b/content-rst/applications/studio/pdf_reports/text-editor.png differ diff --git a/content/applications/studio/views.rst b/content-rst/applications/studio/views.rst similarity index 100% rename from content/applications/studio/views.rst rename to content-rst/applications/studio/views.rst diff --git a/content-rst/applications/studio/views/activity-lead-opportunity.png b/content-rst/applications/studio/views/activity-lead-opportunity.png new file mode 100644 index 000000000..1eff9ed98 Binary files /dev/null and b/content-rst/applications/studio/views/activity-lead-opportunity.png differ diff --git a/content-rst/applications/studio/views/calendar-event.png b/content-rst/applications/studio/views/calendar-event.png new file mode 100644 index 000000000..cfcb8a582 Binary files /dev/null and b/content-rst/applications/studio/views/calendar-event.png differ diff --git a/content-rst/applications/studio/views/cohort-subscription.png b/content-rst/applications/studio/views/cohort-subscription.png new file mode 100644 index 000000000..f4ab3d5ea Binary files /dev/null and b/content-rst/applications/studio/views/cohort-subscription.png differ diff --git a/content-rst/applications/studio/views/form-sales-order.png b/content-rst/applications/studio/views/form-sales-order.png new file mode 100644 index 000000000..b225362e9 Binary files /dev/null and b/content-rst/applications/studio/views/form-sales-order.png differ diff --git a/content-rst/applications/studio/views/gantt-planning.png b/content-rst/applications/studio/views/gantt-planning.png new file mode 100644 index 000000000..2e7d77e43 Binary files /dev/null and b/content-rst/applications/studio/views/gantt-planning.png differ diff --git a/content-rst/applications/studio/views/graph-sales-report.png b/content-rst/applications/studio/views/graph-sales-report.png new file mode 100644 index 000000000..ab34ced21 Binary files /dev/null and b/content-rst/applications/studio/views/graph-sales-report.png differ diff --git a/content-rst/applications/studio/views/kanban-project.png b/content-rst/applications/studio/views/kanban-project.png new file mode 100644 index 000000000..e779cfe5c Binary files /dev/null and b/content-rst/applications/studio/views/kanban-project.png differ diff --git a/content-rst/applications/studio/views/list-drag-handle.png b/content-rst/applications/studio/views/list-drag-handle.png new file mode 100644 index 000000000..324e85906 Binary files /dev/null and b/content-rst/applications/studio/views/list-drag-handle.png differ diff --git a/content-rst/applications/studio/views/list-sales-order.png b/content-rst/applications/studio/views/list-sales-order.png new file mode 100644 index 000000000..b70c290bd Binary files /dev/null and b/content-rst/applications/studio/views/list-sales-order.png differ diff --git a/content-rst/applications/studio/views/map-task.png b/content-rst/applications/studio/views/map-task.png new file mode 100644 index 000000000..8b1646a75 Binary files /dev/null and b/content-rst/applications/studio/views/map-task.png differ diff --git a/content-rst/applications/studio/views/pivot-purchase-report.png b/content-rst/applications/studio/views/pivot-purchase-report.png new file mode 100644 index 000000000..2915df642 Binary files /dev/null and b/content-rst/applications/studio/views/pivot-purchase-report.png differ diff --git a/content-rst/applications/studio/views/search-project-kanban.png b/content-rst/applications/studio/views/search-project-kanban.png new file mode 100644 index 000000000..025d0a49a Binary files /dev/null and b/content-rst/applications/studio/views/search-project-kanban.png differ diff --git a/content/applications/websites.rst b/content-rst/applications/websites.rst similarity index 100% rename from content/applications/websites.rst rename to content-rst/applications/websites.rst diff --git a/content/applications/websites/blog.rst b/content-rst/applications/websites/blog.rst similarity index 100% rename from content/applications/websites/blog.rst rename to content-rst/applications/websites/blog.rst diff --git a/content-rst/applications/websites/blog/create-tag.png b/content-rst/applications/websites/blog/create-tag.png new file mode 100644 index 000000000..f661d92db Binary files /dev/null and b/content-rst/applications/websites/blog/create-tag.png differ diff --git a/content/applications/websites/ecommerce.rst b/content-rst/applications/websites/ecommerce.rst similarity index 100% rename from content/applications/websites/ecommerce.rst rename to content-rst/applications/websites/ecommerce.rst diff --git a/content/applications/websites/ecommerce/checkout_payment_shipping.rst b/content-rst/applications/websites/ecommerce/checkout_payment_shipping.rst similarity index 100% rename from content/applications/websites/ecommerce/checkout_payment_shipping.rst rename to content-rst/applications/websites/ecommerce/checkout_payment_shipping.rst diff --git a/content/applications/websites/ecommerce/checkout_payment_shipping/cart.rst b/content-rst/applications/websites/ecommerce/checkout_payment_shipping/cart.rst similarity index 100% rename from content/applications/websites/ecommerce/checkout_payment_shipping/cart.rst rename to content-rst/applications/websites/ecommerce/checkout_payment_shipping/cart.rst diff --git a/content-rst/applications/websites/ecommerce/checkout_payment_shipping/cart/cart-add.png b/content-rst/applications/websites/ecommerce/checkout_payment_shipping/cart/cart-add.png new file mode 100644 index 000000000..9e548df87 Binary files /dev/null and b/content-rst/applications/websites/ecommerce/checkout_payment_shipping/cart/cart-add.png differ diff --git a/content-rst/applications/websites/ecommerce/checkout_payment_shipping/cart/cart-buy-now.png b/content-rst/applications/websites/ecommerce/checkout_payment_shipping/cart/cart-buy-now.png new file mode 100644 index 000000000..92fb69413 Binary files /dev/null and b/content-rst/applications/websites/ecommerce/checkout_payment_shipping/cart/cart-buy-now.png differ diff --git a/content-rst/applications/websites/ecommerce/checkout_payment_shipping/cart/cart-contactus.png b/content-rst/applications/websites/ecommerce/checkout_payment_shipping/cart/cart-contactus.png new file mode 100644 index 000000000..024e3418f Binary files /dev/null and b/content-rst/applications/websites/ecommerce/checkout_payment_shipping/cart/cart-contactus.png differ diff --git a/content-rst/applications/websites/ecommerce/checkout_payment_shipping/cart/cart-reorder.png b/content-rst/applications/websites/ecommerce/checkout_payment_shipping/cart/cart-reorder.png new file mode 100644 index 000000000..813fc3f6e Binary files /dev/null and b/content-rst/applications/websites/ecommerce/checkout_payment_shipping/cart/cart-reorder.png differ diff --git a/content/applications/websites/ecommerce/checkout_payment_shipping/checkout.rst b/content-rst/applications/websites/ecommerce/checkout_payment_shipping/checkout.rst similarity index 100% rename from content/applications/websites/ecommerce/checkout_payment_shipping/checkout.rst rename to content-rst/applications/websites/ecommerce/checkout_payment_shipping/checkout.rst diff --git a/content/applications/websites/ecommerce/checkout_payment_shipping/payments.rst b/content-rst/applications/websites/ecommerce/checkout_payment_shipping/payments.rst similarity index 100% rename from content/applications/websites/ecommerce/checkout_payment_shipping/payments.rst rename to content-rst/applications/websites/ecommerce/checkout_payment_shipping/payments.rst diff --git a/content-rst/applications/websites/ecommerce/checkout_payment_shipping/payments/payments-checkout.png b/content-rst/applications/websites/ecommerce/checkout_payment_shipping/payments/payments-checkout.png new file mode 100644 index 000000000..9e96a8fc1 Binary files /dev/null and b/content-rst/applications/websites/ecommerce/checkout_payment_shipping/payments/payments-checkout.png differ diff --git a/content-rst/applications/websites/ecommerce/checkout_payment_shipping/payments/payments-ewallets-giftcards.png b/content-rst/applications/websites/ecommerce/checkout_payment_shipping/payments/payments-ewallets-giftcards.png new file mode 100644 index 000000000..560c06831 Binary files /dev/null and b/content-rst/applications/websites/ecommerce/checkout_payment_shipping/payments/payments-ewallets-giftcards.png differ diff --git a/content/applications/websites/ecommerce/checkout_payment_shipping/shipping.rst b/content-rst/applications/websites/ecommerce/checkout_payment_shipping/shipping.rst similarity index 100% rename from content/applications/websites/ecommerce/checkout_payment_shipping/shipping.rst rename to content-rst/applications/websites/ecommerce/checkout_payment_shipping/shipping.rst diff --git a/content/applications/websites/ecommerce/ecommerce_management.rst b/content-rst/applications/websites/ecommerce/ecommerce_management.rst similarity index 100% rename from content/applications/websites/ecommerce/ecommerce_management.rst rename to content-rst/applications/websites/ecommerce/ecommerce_management.rst diff --git a/content/applications/websites/ecommerce/ecommerce_management/customer_accounts.rst b/content-rst/applications/websites/ecommerce/ecommerce_management/customer_accounts.rst similarity index 100% rename from content/applications/websites/ecommerce/ecommerce_management/customer_accounts.rst rename to content-rst/applications/websites/ecommerce/ecommerce_management/customer_accounts.rst diff --git a/content-rst/applications/websites/ecommerce/ecommerce_management/customer_accounts/account-documents.png b/content-rst/applications/websites/ecommerce/ecommerce_management/customer_accounts/account-documents.png new file mode 100644 index 000000000..39df71a09 Binary files /dev/null and b/content-rst/applications/websites/ecommerce/ecommerce_management/customer_accounts/account-documents.png differ diff --git a/content-rst/applications/websites/ecommerce/ecommerce_management/customer_accounts/account-log.png b/content-rst/applications/websites/ecommerce/ecommerce_management/customer_accounts/account-log.png new file mode 100644 index 000000000..ad61923df Binary files /dev/null and b/content-rst/applications/websites/ecommerce/ecommerce_management/customer_accounts/account-log.png differ diff --git a/content/applications/websites/ecommerce/ecommerce_management/customer_interaction.rst b/content-rst/applications/websites/ecommerce/ecommerce_management/customer_interaction.rst similarity index 100% rename from content/applications/websites/ecommerce/ecommerce_management/customer_interaction.rst rename to content-rst/applications/websites/ecommerce/ecommerce_management/customer_interaction.rst diff --git a/content-rst/applications/websites/ecommerce/ecommerce_management/customer_interaction/interaction-checkboxes.png b/content-rst/applications/websites/ecommerce/ecommerce_management/customer_interaction/interaction-checkboxes.png new file mode 100644 index 000000000..6a69e72d1 Binary files /dev/null and b/content-rst/applications/websites/ecommerce/ecommerce_management/customer_interaction/interaction-checkboxes.png differ diff --git a/content-rst/applications/websites/ecommerce/ecommerce_management/customer_interaction/interaction-form.png b/content-rst/applications/websites/ecommerce/ecommerce_management/customer_interaction/interaction-form.png new file mode 100644 index 000000000..94b7c79be Binary files /dev/null and b/content-rst/applications/websites/ecommerce/ecommerce_management/customer_interaction/interaction-form.png differ diff --git a/content-rst/applications/websites/ecommerce/ecommerce_management/customer_interaction/interaction-news.png b/content-rst/applications/websites/ecommerce/ecommerce_management/customer_interaction/interaction-news.png new file mode 100644 index 000000000..756c512e2 Binary files /dev/null and b/content-rst/applications/websites/ecommerce/ecommerce_management/customer_interaction/interaction-news.png differ diff --git a/content-rst/applications/websites/ecommerce/ecommerce_management/customer_interaction/interaction-rating.png b/content-rst/applications/websites/ecommerce/ecommerce_management/customer_interaction/interaction-rating.png new file mode 100644 index 000000000..050f350b3 Binary files /dev/null and b/content-rst/applications/websites/ecommerce/ecommerce_management/customer_interaction/interaction-rating.png differ diff --git a/content-rst/applications/websites/ecommerce/ecommerce_management/customer_interaction/interaction-tags.png b/content-rst/applications/websites/ecommerce/ecommerce_management/customer_interaction/interaction-tags.png new file mode 100644 index 000000000..592252bcf Binary files /dev/null and b/content-rst/applications/websites/ecommerce/ecommerce_management/customer_interaction/interaction-tags.png differ diff --git a/content-rst/applications/websites/ecommerce/ecommerce_management/customer_interaction/interaction-ticket.png b/content-rst/applications/websites/ecommerce/ecommerce_management/customer_interaction/interaction-ticket.png new file mode 100644 index 000000000..6845da20f Binary files /dev/null and b/content-rst/applications/websites/ecommerce/ecommerce_management/customer_interaction/interaction-ticket.png differ diff --git a/content/applications/websites/ecommerce/ecommerce_management/order_handling.rst b/content-rst/applications/websites/ecommerce/ecommerce_management/order_handling.rst similarity index 100% rename from content/applications/websites/ecommerce/ecommerce_management/order_handling.rst rename to content-rst/applications/websites/ecommerce/ecommerce_management/order_handling.rst diff --git a/content-rst/applications/websites/ecommerce/ecommerce_management/order_handling/handling-salesteam.png b/content-rst/applications/websites/ecommerce/ecommerce_management/order_handling/handling-salesteam.png new file mode 100644 index 000000000..bb6dea69d Binary files /dev/null and b/content-rst/applications/websites/ecommerce/ecommerce_management/order_handling/handling-salesteam.png differ diff --git a/content-rst/applications/websites/ecommerce/ecommerce_management/order_handling/handling-status.png b/content-rst/applications/websites/ecommerce/ecommerce_management/order_handling/handling-status.png new file mode 100644 index 000000000..4ecb5dfc2 Binary files /dev/null and b/content-rst/applications/websites/ecommerce/ecommerce_management/order_handling/handling-status.png differ diff --git a/content/applications/websites/ecommerce/ecommerce_management/performance.rst b/content-rst/applications/websites/ecommerce/ecommerce_management/performance.rst similarity index 100% rename from content/applications/websites/ecommerce/ecommerce_management/performance.rst rename to content-rst/applications/websites/ecommerce/ecommerce_management/performance.rst diff --git a/content-rst/applications/websites/ecommerce/ecommerce_management/performance/reporting.png b/content-rst/applications/websites/ecommerce/ecommerce_management/performance/reporting.png new file mode 100644 index 000000000..bc58374a7 Binary files /dev/null and b/content-rst/applications/websites/ecommerce/ecommerce_management/performance/reporting.png differ diff --git a/content/applications/websites/ecommerce/products.rst b/content-rst/applications/websites/ecommerce/products.rst similarity index 100% rename from content/applications/websites/ecommerce/products.rst rename to content-rst/applications/websites/ecommerce/products.rst diff --git a/content/applications/websites/ecommerce/products/catalog.rst b/content-rst/applications/websites/ecommerce/products/catalog.rst similarity index 100% rename from content/applications/websites/ecommerce/products/catalog.rst rename to content-rst/applications/websites/ecommerce/products/catalog.rst diff --git a/content-rst/applications/websites/ecommerce/products/catalog/catalog-attributes.png b/content-rst/applications/websites/ecommerce/products/catalog/catalog-attributes.png new file mode 100644 index 000000000..f2fc54c94 Binary files /dev/null and b/content-rst/applications/websites/ecommerce/products/catalog/catalog-attributes.png differ diff --git a/content-rst/applications/websites/ecommerce/products/catalog/catalog-buttons.png b/content-rst/applications/websites/ecommerce/products/catalog/catalog-buttons.png new file mode 100644 index 000000000..260076f5a Binary files /dev/null and b/content-rst/applications/websites/ecommerce/products/catalog/catalog-buttons.png differ diff --git a/content-rst/applications/websites/ecommerce/products/catalog/catalog-categories.png b/content-rst/applications/websites/ecommerce/products/catalog/catalog-categories.png new file mode 100644 index 000000000..7d33f6880 Binary files /dev/null and b/content-rst/applications/websites/ecommerce/products/catalog/catalog-categories.png differ diff --git a/content-rst/applications/websites/ecommerce/products/catalog/catalog-category-layout.png b/content-rst/applications/websites/ecommerce/products/catalog/catalog-category-layout.png new file mode 100644 index 000000000..4f00e62fb Binary files /dev/null and b/content-rst/applications/websites/ecommerce/products/catalog/catalog-category-layout.png differ diff --git a/content-rst/applications/websites/ecommerce/products/catalog/catalog-content.png b/content-rst/applications/websites/ecommerce/products/catalog/catalog-content.png new file mode 100644 index 000000000..d7b2ccba7 Binary files /dev/null and b/content-rst/applications/websites/ecommerce/products/catalog/catalog-content.png differ diff --git a/content-rst/applications/websites/ecommerce/products/catalog/catalog-features.png b/content-rst/applications/websites/ecommerce/products/catalog/catalog-features.png new file mode 100644 index 000000000..978f26c83 Binary files /dev/null and b/content-rst/applications/websites/ecommerce/products/catalog/catalog-features.png differ diff --git a/content-rst/applications/websites/ecommerce/products/catalog/catalog-panel-categories.png b/content-rst/applications/websites/ecommerce/products/catalog/catalog-panel-categories.png new file mode 100644 index 000000000..dc5ed35f8 Binary files /dev/null and b/content-rst/applications/websites/ecommerce/products/catalog/catalog-panel-categories.png differ diff --git a/content-rst/applications/websites/ecommerce/products/catalog/catalog-product-highlight.png b/content-rst/applications/websites/ecommerce/products/catalog/catalog-product-highlight.png new file mode 100644 index 000000000..1434c3d97 Binary files /dev/null and b/content-rst/applications/websites/ecommerce/products/catalog/catalog-product-highlight.png differ diff --git a/content-rst/applications/websites/ecommerce/products/catalog/catalog-reorder.png b/content-rst/applications/websites/ecommerce/products/catalog/catalog-reorder.png new file mode 100644 index 000000000..1350b1d75 Binary files /dev/null and b/content-rst/applications/websites/ecommerce/products/catalog/catalog-reorder.png differ diff --git a/content/applications/websites/ecommerce/products/cross_upselling.rst b/content-rst/applications/websites/ecommerce/products/cross_upselling.rst similarity index 100% rename from content/applications/websites/ecommerce/products/cross_upselling.rst rename to content-rst/applications/websites/ecommerce/products/cross_upselling.rst diff --git a/content-rst/applications/websites/ecommerce/products/cross_upselling/accessory-products.png b/content-rst/applications/websites/ecommerce/products/cross_upselling/accessory-products.png new file mode 100644 index 000000000..a100c349b Binary files /dev/null and b/content-rst/applications/websites/ecommerce/products/cross_upselling/accessory-products.png differ diff --git a/content-rst/applications/websites/ecommerce/products/cross_upselling/add-to-cart.png b/content-rst/applications/websites/ecommerce/products/cross_upselling/add-to-cart.png new file mode 100644 index 000000000..7bc28f343 Binary files /dev/null and b/content-rst/applications/websites/ecommerce/products/cross_upselling/add-to-cart.png differ diff --git a/content-rst/applications/websites/ecommerce/products/cross_upselling/cross_upselling-alternative.png b/content-rst/applications/websites/ecommerce/products/cross_upselling/cross_upselling-alternative.png new file mode 100644 index 000000000..648016e68 Binary files /dev/null and b/content-rst/applications/websites/ecommerce/products/cross_upselling/cross_upselling-alternative.png differ diff --git a/content-rst/applications/websites/ecommerce/products/digital-files.png b/content-rst/applications/websites/ecommerce/products/digital-files.png new file mode 100644 index 000000000..ff63cbb8d Binary files /dev/null and b/content-rst/applications/websites/ecommerce/products/digital-files.png differ diff --git a/content/applications/websites/ecommerce/products/price_management.rst b/content-rst/applications/websites/ecommerce/products/price_management.rst similarity index 100% rename from content/applications/websites/ecommerce/products/price_management.rst rename to content-rst/applications/websites/ecommerce/products/price_management.rst diff --git a/content-rst/applications/websites/ecommerce/products/price_management/price-cost-per-unit-page.png b/content-rst/applications/websites/ecommerce/products/price_management/price-cost-per-unit-page.png new file mode 100644 index 000000000..ffa644e83 Binary files /dev/null and b/content-rst/applications/websites/ecommerce/products/price_management/price-cost-per-unit-page.png differ diff --git a/content-rst/applications/websites/ecommerce/products/price_management/price-cost-per-unit.png b/content-rst/applications/websites/ecommerce/products/price_management/price-cost-per-unit.png new file mode 100644 index 000000000..9c6e5fe2b Binary files /dev/null and b/content-rst/applications/websites/ecommerce/products/price_management/price-cost-per-unit.png differ diff --git a/content-rst/applications/websites/ecommerce/products/price_management/price-pricelists.png b/content-rst/applications/websites/ecommerce/products/price_management/price-pricelists.png new file mode 100644 index 000000000..46683ba4e Binary files /dev/null and b/content-rst/applications/websites/ecommerce/products/price_management/price-pricelists.png differ diff --git a/content-rst/applications/websites/ecommerce/products/price_management/price-strikethrough.png b/content-rst/applications/websites/ecommerce/products/price_management/price-strikethrough.png new file mode 100644 index 000000000..303a92f2d Binary files /dev/null and b/content-rst/applications/websites/ecommerce/products/price_management/price-strikethrough.png differ diff --git a/content-rst/applications/websites/ecommerce/products/price_management/price-tax-display-type.png b/content-rst/applications/websites/ecommerce/products/price_management/price-tax-display-type.png new file mode 100644 index 000000000..3ee71f6fe Binary files /dev/null and b/content-rst/applications/websites/ecommerce/products/price_management/price-tax-display-type.png differ diff --git a/content-rst/applications/websites/ecommerce/products/products-compare.png b/content-rst/applications/websites/ecommerce/products/products-compare.png new file mode 100644 index 000000000..1aed59602 Binary files /dev/null and b/content-rst/applications/websites/ecommerce/products/products-compare.png differ diff --git a/content/applications/websites/elearning.rst b/content-rst/applications/websites/elearning.rst similarity index 100% rename from content/applications/websites/elearning.rst rename to content-rst/applications/websites/elearning.rst diff --git a/content-rst/applications/websites/elearning/additional-content.png b/content-rst/applications/websites/elearning/additional-content.png new file mode 100644 index 000000000..ff296c8ec Binary files /dev/null and b/content-rst/applications/websites/elearning/additional-content.png differ diff --git a/content-rst/applications/websites/elearning/course-description.png b/content-rst/applications/websites/elearning/course-description.png new file mode 100644 index 000000000..2162a3aae Binary files /dev/null and b/content-rst/applications/websites/elearning/course-description.png differ diff --git a/content-rst/applications/websites/elearning/elearning-content-tab.png b/content-rst/applications/websites/elearning/elearning-content-tab.png new file mode 100644 index 000000000..9acc434d5 Binary files /dev/null and b/content-rst/applications/websites/elearning/elearning-content-tab.png differ diff --git a/content-rst/applications/websites/elearning/elearning-course-creation.png b/content-rst/applications/websites/elearning/elearning-course-creation.png new file mode 100644 index 000000000..0187af998 Binary files /dev/null and b/content-rst/applications/websites/elearning/elearning-course-creation.png differ diff --git a/content-rst/applications/websites/elearning/elearning-publish-button.png b/content-rst/applications/websites/elearning/elearning-publish-button.png new file mode 100644 index 000000000..42ad7148e Binary files /dev/null and b/content-rst/applications/websites/elearning/elearning-publish-button.png differ diff --git a/content-rst/applications/websites/elearning/options-tab.png b/content-rst/applications/websites/elearning/options-tab.png new file mode 100644 index 000000000..10e2de774 Binary files /dev/null and b/content-rst/applications/websites/elearning/options-tab.png differ diff --git a/content/applications/websites/forum.rst b/content-rst/applications/websites/forum.rst similarity index 100% rename from content/applications/websites/forum.rst rename to content-rst/applications/websites/forum.rst diff --git a/content-rst/applications/websites/forum/badges.png b/content-rst/applications/websites/forum/badges.png new file mode 100644 index 000000000..e71fafcc4 Binary files /dev/null and b/content-rst/applications/websites/forum/badges.png differ diff --git a/content-rst/applications/websites/forum/moderation-tools.png b/content-rst/applications/websites/forum/moderation-tools.png new file mode 100644 index 000000000..dcef59b42 Binary files /dev/null and b/content-rst/applications/websites/forum/moderation-tools.png differ diff --git a/content-rst/applications/websites/forum/offensive-reason.png b/content-rst/applications/websites/forum/offensive-reason.png new file mode 100644 index 000000000..f2d184dac Binary files /dev/null and b/content-rst/applications/websites/forum/offensive-reason.png differ diff --git a/content-rst/applications/websites/forum/post-actions.png b/content-rst/applications/websites/forum/post-actions.png new file mode 100644 index 000000000..188853743 Binary files /dev/null and b/content-rst/applications/websites/forum/post-actions.png differ diff --git a/content-rst/applications/websites/forum/ranks.png b/content-rst/applications/websites/forum/ranks.png new file mode 100644 index 000000000..58c1adb38 Binary files /dev/null and b/content-rst/applications/websites/forum/ranks.png differ diff --git a/content-rst/applications/websites/forum/to-validate.png b/content-rst/applications/websites/forum/to-validate.png new file mode 100644 index 000000000..43d0f69a9 Binary files /dev/null and b/content-rst/applications/websites/forum/to-validate.png differ diff --git a/content/applications/websites/livechat.rst b/content-rst/applications/websites/livechat.rst similarity index 100% rename from content/applications/websites/livechat.rst rename to content-rst/applications/websites/livechat.rst diff --git a/content-rst/applications/websites/livechat/chat-button.png b/content-rst/applications/websites/livechat/chat-button.png new file mode 100644 index 000000000..db79b660d Binary files /dev/null and b/content-rst/applications/websites/livechat/chat-button.png differ diff --git a/content-rst/applications/websites/livechat/chat-window.png b/content-rst/applications/websites/livechat/chat-window.png new file mode 100644 index 000000000..272b5276f Binary files /dev/null and b/content-rst/applications/websites/livechat/chat-window.png differ diff --git a/content/applications/websites/livechat/chatbots.rst b/content-rst/applications/websites/livechat/chatbots.rst similarity index 100% rename from content/applications/websites/livechat/chatbots.rst rename to content-rst/applications/websites/livechat/chatbots.rst diff --git a/content-rst/applications/websites/livechat/chatbots/chatbot-add-to-channel.png b/content-rst/applications/websites/livechat/chatbots/chatbot-add-to-channel.png new file mode 100644 index 000000000..091fdac19 Binary files /dev/null and b/content-rst/applications/websites/livechat/chatbots/chatbot-add-to-channel.png differ diff --git a/content-rst/applications/websites/livechat/chatbots/chatbot-invalid-email.png b/content-rst/applications/websites/livechat/chatbots/chatbot-invalid-email.png new file mode 100644 index 000000000..e97198f9d Binary files /dev/null and b/content-rst/applications/websites/livechat/chatbots/chatbot-invalid-email.png differ diff --git a/content-rst/applications/websites/livechat/chatbots/chatbot-no-operator.png b/content-rst/applications/websites/livechat/chatbots/chatbot-no-operator.png new file mode 100644 index 000000000..8caedc2ce Binary files /dev/null and b/content-rst/applications/websites/livechat/chatbots/chatbot-no-operator.png differ diff --git a/content-rst/applications/websites/livechat/chatbots/chatbot-only-if.png b/content-rst/applications/websites/livechat/chatbots/chatbot-only-if.png new file mode 100644 index 000000000..2f81c7275 Binary files /dev/null and b/content-rst/applications/websites/livechat/chatbots/chatbot-only-if.png differ diff --git a/content-rst/applications/websites/livechat/chatbots/chatbot-visitor-view.png b/content-rst/applications/websites/livechat/chatbots/chatbot-visitor-view.png new file mode 100644 index 000000000..5265ae477 Binary files /dev/null and b/content-rst/applications/websites/livechat/chatbots/chatbot-visitor-view.png differ diff --git a/content-rst/applications/websites/livechat/chatbots/chatbot-welcome-bot.png b/content-rst/applications/websites/livechat/chatbots/chatbot-welcome-bot.png new file mode 100644 index 000000000..a0811f58c Binary files /dev/null and b/content-rst/applications/websites/livechat/chatbots/chatbot-welcome-bot.png differ diff --git a/content-rst/applications/websites/livechat/create-rules.png b/content-rst/applications/websites/livechat/create-rules.png new file mode 100644 index 000000000..36ddcc0d9 Binary files /dev/null and b/content-rst/applications/websites/livechat/create-rules.png differ diff --git a/content-rst/applications/websites/livechat/enable-setting.png b/content-rst/applications/websites/livechat/enable-setting.png new file mode 100644 index 000000000..544eb2187 Binary files /dev/null and b/content-rst/applications/websites/livechat/enable-setting.png differ diff --git a/content-rst/applications/websites/livechat/open-channel.png b/content-rst/applications/websites/livechat/open-channel.png new file mode 100644 index 000000000..59191b551 Binary files /dev/null and b/content-rst/applications/websites/livechat/open-channel.png differ diff --git a/content/applications/websites/livechat/participate.rst b/content-rst/applications/websites/livechat/participate.rst similarity index 100% rename from content/applications/websites/livechat/participate.rst rename to content-rst/applications/websites/livechat/participate.rst diff --git a/content-rst/applications/websites/livechat/participate/leave-channel.png b/content-rst/applications/websites/livechat/participate/leave-channel.png new file mode 100644 index 000000000..f096f21f7 Binary files /dev/null and b/content-rst/applications/websites/livechat/participate/leave-channel.png differ diff --git a/content-rst/applications/websites/livechat/participate/managing-chat-responses.png b/content-rst/applications/websites/livechat/participate/managing-chat-responses.png new file mode 100644 index 000000000..1c402edb1 Binary files /dev/null and b/content-rst/applications/websites/livechat/participate/managing-chat-responses.png differ diff --git a/content-rst/applications/websites/livechat/participate/menu-bar.png b/content-rst/applications/websites/livechat/participate/menu-bar.png new file mode 100644 index 000000000..6c4c5661f Binary files /dev/null and b/content-rst/applications/websites/livechat/participate/menu-bar.png differ diff --git a/content-rst/applications/websites/livechat/participate/online-chat-name.png b/content-rst/applications/websites/livechat/participate/online-chat-name.png new file mode 100644 index 000000000..4a2955a15 Binary files /dev/null and b/content-rst/applications/websites/livechat/participate/online-chat-name.png differ diff --git a/content-rst/applications/websites/livechat/pop-up.png b/content-rst/applications/websites/livechat/pop-up.png new file mode 100644 index 000000000..81111b59b Binary files /dev/null and b/content-rst/applications/websites/livechat/pop-up.png differ diff --git a/content/applications/websites/livechat/ratings.rst b/content-rst/applications/websites/livechat/ratings.rst similarity index 100% rename from content/applications/websites/livechat/ratings.rst rename to content-rst/applications/websites/livechat/ratings.rst diff --git a/content-rst/applications/websites/livechat/ratings/live-chat-is-published.png b/content-rst/applications/websites/livechat/ratings/live-chat-is-published.png new file mode 100644 index 000000000..6e0f61e1f Binary files /dev/null and b/content-rst/applications/websites/livechat/ratings/live-chat-is-published.png differ diff --git a/content-rst/applications/websites/livechat/ratings/live-chat-published-icon.png b/content-rst/applications/websites/livechat/ratings/live-chat-published-icon.png new file mode 100644 index 000000000..d4e8ff39d Binary files /dev/null and b/content-rst/applications/websites/livechat/ratings/live-chat-published-icon.png differ diff --git a/content-rst/applications/websites/livechat/ratings/live-chat-ratings-faces.png b/content-rst/applications/websites/livechat/ratings/live-chat-ratings-faces.png new file mode 100644 index 000000000..4c14aa2f4 Binary files /dev/null and b/content-rst/applications/websites/livechat/ratings/live-chat-ratings-faces.png differ diff --git a/content-rst/applications/websites/livechat/ratings/live-chat-ratings-operator-window.png b/content-rst/applications/websites/livechat/ratings/live-chat-ratings-operator-window.png new file mode 100644 index 000000000..06099e529 Binary files /dev/null and b/content-rst/applications/websites/livechat/ratings/live-chat-ratings-operator-window.png differ diff --git a/content-rst/applications/websites/livechat/ratings/live-chat-ratings-report.png b/content-rst/applications/websites/livechat/ratings/live-chat-ratings-report.png new file mode 100644 index 000000000..b2a704cf2 Binary files /dev/null and b/content-rst/applications/websites/livechat/ratings/live-chat-ratings-report.png differ diff --git a/content-rst/applications/websites/livechat/ratings/live-chat-ratings-unpublished.png b/content-rst/applications/websites/livechat/ratings/live-chat-ratings-unpublished.png new file mode 100644 index 000000000..22feb7859 Binary files /dev/null and b/content-rst/applications/websites/livechat/ratings/live-chat-ratings-unpublished.png differ diff --git a/content-rst/applications/websites/livechat/ratings/live-chat-ratings-visible-internally.png b/content-rst/applications/websites/livechat/ratings/live-chat-ratings-visible-internally.png new file mode 100644 index 000000000..5c8688c3a Binary files /dev/null and b/content-rst/applications/websites/livechat/ratings/live-chat-ratings-visible-internally.png differ diff --git a/content-rst/applications/websites/livechat/ratings/live-chat-thank-you.png b/content-rst/applications/websites/livechat/ratings/live-chat-thank-you.png new file mode 100644 index 000000000..94aa3550a Binary files /dev/null and b/content-rst/applications/websites/livechat/ratings/live-chat-thank-you.png differ diff --git a/content/applications/websites/livechat/reports.rst b/content-rst/applications/websites/livechat/reports.rst similarity index 100% rename from content/applications/websites/livechat/reports.rst rename to content-rst/applications/websites/livechat/reports.rst diff --git a/content-rst/applications/websites/livechat/reports/chat-transcript.png b/content-rst/applications/websites/livechat/reports/chat-transcript.png new file mode 100644 index 000000000..99a83006e Binary files /dev/null and b/content-rst/applications/websites/livechat/reports/chat-transcript.png differ diff --git a/content-rst/applications/websites/livechat/reports/operator-analysis.png b/content-rst/applications/websites/livechat/reports/operator-analysis.png new file mode 100644 index 000000000..25b5eb981 Binary files /dev/null and b/content-rst/applications/websites/livechat/reports/operator-analysis.png differ diff --git a/content-rst/applications/websites/livechat/reports/sessions-history.png b/content-rst/applications/websites/livechat/reports/sessions-history.png new file mode 100644 index 000000000..ca61b230d Binary files /dev/null and b/content-rst/applications/websites/livechat/reports/sessions-history.png differ diff --git a/content-rst/applications/websites/livechat/reports/sessions-statistics.png b/content-rst/applications/websites/livechat/reports/sessions-statistics.png new file mode 100644 index 000000000..410e763fc Binary files /dev/null and b/content-rst/applications/websites/livechat/reports/sessions-statistics.png differ diff --git a/content/applications/websites/livechat/responses.rst b/content-rst/applications/websites/livechat/responses.rst similarity index 100% rename from content/applications/websites/livechat/responses.rst rename to content-rst/applications/websites/livechat/responses.rst diff --git a/content-rst/applications/websites/livechat/responses/canned-responses.png b/content-rst/applications/websites/livechat/responses/canned-responses.png new file mode 100644 index 000000000..554539f25 Binary files /dev/null and b/content-rst/applications/websites/livechat/responses/canned-responses.png differ diff --git a/content-rst/applications/websites/livechat/responses/helpdesk-search.png b/content-rst/applications/websites/livechat/responses/helpdesk-search.png new file mode 100644 index 000000000..68a82a70e Binary files /dev/null and b/content-rst/applications/websites/livechat/responses/helpdesk-search.png differ diff --git a/content-rst/applications/websites/livechat/responses/helpdesk.png b/content-rst/applications/websites/livechat/responses/helpdesk.png new file mode 100644 index 000000000..d1f4da0c8 Binary files /dev/null and b/content-rst/applications/websites/livechat/responses/helpdesk.png differ diff --git a/content-rst/applications/websites/livechat/responses/response-list.png b/content-rst/applications/websites/livechat/responses/response-list.png new file mode 100644 index 000000000..db1f3cd18 Binary files /dev/null and b/content-rst/applications/websites/livechat/responses/response-list.png differ diff --git a/content-rst/applications/websites/livechat/responses/responses-history.png b/content-rst/applications/websites/livechat/responses/responses-history.png new file mode 100644 index 000000000..448abd668 Binary files /dev/null and b/content-rst/applications/websites/livechat/responses/responses-history.png differ diff --git a/content-rst/applications/websites/livechat/responses/responses-lead.png b/content-rst/applications/websites/livechat/responses/responses-lead.png new file mode 100644 index 000000000..867d526f0 Binary files /dev/null and b/content-rst/applications/websites/livechat/responses/responses-lead.png differ diff --git a/content-rst/applications/websites/livechat/responses/responses-ticket-link.png b/content-rst/applications/websites/livechat/responses/responses-ticket-link.png new file mode 100644 index 000000000..3362c444e Binary files /dev/null and b/content-rst/applications/websites/livechat/responses/responses-ticket-link.png differ diff --git a/content-rst/applications/websites/livechat/widget-code.png b/content-rst/applications/websites/livechat/widget-code.png new file mode 100644 index 000000000..6d6c87c9a Binary files /dev/null and b/content-rst/applications/websites/livechat/widget-code.png differ diff --git a/content/applications/websites/website.rst b/content-rst/applications/websites/website.rst similarity index 100% rename from content/applications/websites/website.rst rename to content-rst/applications/websites/website.rst diff --git a/content/applications/websites/website/configuration.rst b/content-rst/applications/websites/website/configuration.rst similarity index 100% rename from content/applications/websites/website/configuration.rst rename to content-rst/applications/websites/website/configuration.rst diff --git a/content/applications/websites/website/configuration/address_autocomplete.rst b/content-rst/applications/websites/website/configuration/address_autocomplete.rst similarity index 100% rename from content/applications/websites/website/configuration/address_autocomplete.rst rename to content-rst/applications/websites/website/configuration/address_autocomplete.rst diff --git a/content-rst/applications/websites/website/configuration/address_autocomplete/address-autocomplete-example.png b/content-rst/applications/websites/website/configuration/address_autocomplete/address-autocomplete-example.png new file mode 100644 index 000000000..9540ea45b Binary files /dev/null and b/content-rst/applications/websites/website/configuration/address_autocomplete/address-autocomplete-example.png differ diff --git a/content-rst/applications/websites/website/configuration/address_autocomplete/enable-address-autocomplete.png b/content-rst/applications/websites/website/configuration/address_autocomplete/enable-address-autocomplete.png new file mode 100644 index 000000000..fb8ba0ca3 Binary files /dev/null and b/content-rst/applications/websites/website/configuration/address_autocomplete/enable-address-autocomplete.png differ diff --git a/content/applications/websites/website/configuration/cdn.rst b/content-rst/applications/websites/website/configuration/cdn.rst similarity index 100% rename from content/applications/websites/website/configuration/cdn.rst rename to content-rst/applications/websites/website/configuration/cdn.rst diff --git a/content-rst/applications/websites/website/configuration/cdn/cdn-base-url.png b/content-rst/applications/websites/website/configuration/cdn/cdn-base-url.png new file mode 100644 index 000000000..18b648a56 Binary files /dev/null and b/content-rst/applications/websites/website/configuration/cdn/cdn-base-url.png differ diff --git a/content-rst/applications/websites/website/configuration/cdn/keycdn-zone.png b/content-rst/applications/websites/website/configuration/cdn/keycdn-zone.png new file mode 100644 index 000000000..07f3e21a3 Binary files /dev/null and b/content-rst/applications/websites/website/configuration/cdn/keycdn-zone.png differ diff --git a/content-rst/applications/websites/website/configuration/cdn/odoo-security-message.png b/content-rst/applications/websites/website/configuration/cdn/odoo-security-message.png new file mode 100644 index 000000000..6312c51e2 Binary files /dev/null and b/content-rst/applications/websites/website/configuration/cdn/odoo-security-message.png differ diff --git a/content-rst/applications/websites/website/configuration/cdn/test-pull.png b/content-rst/applications/websites/website/configuration/cdn/test-pull.png new file mode 100644 index 000000000..aba548952 Binary files /dev/null and b/content-rst/applications/websites/website/configuration/cdn/test-pull.png differ diff --git a/content-rst/applications/websites/website/configuration/cdn/zone-url.png b/content-rst/applications/websites/website/configuration/cdn/zone-url.png new file mode 100644 index 000000000..8ee239ab4 Binary files /dev/null and b/content-rst/applications/websites/website/configuration/cdn/zone-url.png differ diff --git a/content/applications/websites/website/configuration/cookies_bar.rst b/content-rst/applications/websites/website/configuration/cookies_bar.rst similarity index 100% rename from content/applications/websites/website/configuration/cookies_bar.rst rename to content-rst/applications/websites/website/configuration/cookies_bar.rst diff --git a/content/applications/websites/website/configuration/domain_names.rst b/content-rst/applications/websites/website/configuration/domain_names.rst similarity index 100% rename from content/applications/websites/website/configuration/domain_names.rst rename to content-rst/applications/websites/website/configuration/domain_names.rst diff --git a/content-rst/applications/websites/website/configuration/domain_names/cloudflare-cname-db.png b/content-rst/applications/websites/website/configuration/domain_names/cloudflare-cname-db.png new file mode 100644 index 000000000..d30218820 Binary files /dev/null and b/content-rst/applications/websites/website/configuration/domain_names/cloudflare-cname-db.png differ diff --git a/content-rst/applications/websites/website/configuration/domain_names/cloudflare-cname-www.png b/content-rst/applications/websites/website/configuration/domain_names/cloudflare-cname-www.png new file mode 100644 index 000000000..2e26e037b Binary files /dev/null and b/content-rst/applications/websites/website/configuration/domain_names/cloudflare-cname-www.png differ diff --git a/content-rst/applications/websites/website/configuration/domain_names/cloudflare-encryption.png b/content-rst/applications/websites/website/configuration/domain_names/cloudflare-encryption.png new file mode 100644 index 000000000..f5d26351e Binary files /dev/null and b/content-rst/applications/websites/website/configuration/domain_names/cloudflare-encryption.png differ diff --git a/content-rst/applications/websites/website/configuration/domain_names/cloudflare-redirect-rule.png b/content-rst/applications/websites/website/configuration/domain_names/cloudflare-redirect-rule.png new file mode 100644 index 000000000..b3ba8ceb3 Binary files /dev/null and b/content-rst/applications/websites/website/configuration/domain_names/cloudflare-redirect-rule.png differ diff --git a/content-rst/applications/websites/website/configuration/domain_names/domain-names.png b/content-rst/applications/websites/website/configuration/domain_names/domain-names.png new file mode 100644 index 000000000..643751928 Binary files /dev/null and b/content-rst/applications/websites/website/configuration/domain_names/domain-names.png differ diff --git a/content-rst/applications/websites/website/configuration/domain_names/domain-owner.png b/content-rst/applications/websites/website/configuration/domain_names/domain-owner.png new file mode 100644 index 000000000..f0a1f662b Binary files /dev/null and b/content-rst/applications/websites/website/configuration/domain_names/domain-owner.png differ diff --git a/content-rst/applications/websites/website/configuration/domain_names/domain-search.png b/content-rst/applications/websites/website/configuration/domain_names/domain-search.png new file mode 100644 index 000000000..ba78e3bc0 Binary files /dev/null and b/content-rst/applications/websites/website/configuration/domain_names/domain-search.png differ diff --git a/content-rst/applications/websites/website/configuration/domain_names/map-database-online.png b/content-rst/applications/websites/website/configuration/domain_names/map-database-online.png new file mode 100644 index 000000000..858ae5a99 Binary files /dev/null and b/content-rst/applications/websites/website/configuration/domain_names/map-database-online.png differ diff --git a/content-rst/applications/websites/website/configuration/domain_names/map-database-sh.png b/content-rst/applications/websites/website/configuration/domain_names/map-database-sh.png new file mode 100644 index 000000000..17d659090 Binary files /dev/null and b/content-rst/applications/websites/website/configuration/domain_names/map-database-sh.png differ diff --git a/content/applications/websites/website/configuration/google_search_console.rst b/content-rst/applications/websites/website/configuration/google_search_console.rst similarity index 100% rename from content/applications/websites/website/configuration/google_search_console.rst rename to content-rst/applications/websites/website/configuration/google_search_console.rst diff --git a/content-rst/applications/websites/website/configuration/google_search_console/add-domain-or-url-prefix.png b/content-rst/applications/websites/website/configuration/google_search_console/add-domain-or-url-prefix.png new file mode 100644 index 000000000..42d2891a0 Binary files /dev/null and b/content-rst/applications/websites/website/configuration/google_search_console/add-domain-or-url-prefix.png differ diff --git a/content-rst/applications/websites/website/configuration/google_search_console/html-file-download.png b/content-rst/applications/websites/website/configuration/google_search_console/html-file-download.png new file mode 100644 index 000000000..d706f453d Binary files /dev/null and b/content-rst/applications/websites/website/configuration/google_search_console/html-file-download.png differ diff --git a/content-rst/applications/websites/website/configuration/google_search_console/open-copy-html-file.png b/content-rst/applications/websites/website/configuration/google_search_console/open-copy-html-file.png new file mode 100644 index 000000000..18ce4f21c Binary files /dev/null and b/content-rst/applications/websites/website/configuration/google_search_console/open-copy-html-file.png differ diff --git a/content-rst/applications/websites/website/configuration/google_search_console/paste-html-code-settings.png b/content-rst/applications/websites/website/configuration/google_search_console/paste-html-code-settings.png new file mode 100644 index 000000000..b7b53ed23 Binary files /dev/null and b/content-rst/applications/websites/website/configuration/google_search_console/paste-html-code-settings.png differ diff --git a/content/applications/websites/website/configuration/multi_website.rst b/content-rst/applications/websites/website/configuration/multi_website.rst similarity index 100% rename from content/applications/websites/website/configuration/multi_website.rst rename to content-rst/applications/websites/website/configuration/multi_website.rst diff --git a/content-rst/applications/websites/website/configuration/multi_website/analytics-switch-websites.png b/content-rst/applications/websites/website/configuration/multi_website/analytics-switch-websites.png new file mode 100644 index 000000000..7a7d26ca3 Binary files /dev/null and b/content-rst/applications/websites/website/configuration/multi_website/analytics-switch-websites.png differ diff --git a/content-rst/applications/websites/website/configuration/multi_website/create-website.png b/content-rst/applications/websites/website/configuration/multi_website/create-website.png new file mode 100644 index 000000000..308000aef Binary files /dev/null and b/content-rst/applications/websites/website/configuration/multi_website/create-website.png differ diff --git a/content-rst/applications/websites/website/configuration/multi_website/forum-multi-website.png b/content-rst/applications/websites/website/configuration/multi_website/forum-multi-website.png new file mode 100644 index 000000000..f4ace7250 Binary files /dev/null and b/content-rst/applications/websites/website/configuration/multi_website/forum-multi-website.png differ diff --git a/content-rst/applications/websites/website/configuration/multi_website/pages-switch-websites.png b/content-rst/applications/websites/website/configuration/multi_website/pages-switch-websites.png new file mode 100644 index 000000000..0a0b416b5 Binary files /dev/null and b/content-rst/applications/websites/website/configuration/multi_website/pages-switch-websites.png differ diff --git a/content-rst/applications/websites/website/configuration/multi_website/switch-websites.png b/content-rst/applications/websites/website/configuration/multi_website/switch-websites.png new file mode 100644 index 000000000..b08556958 Binary files /dev/null and b/content-rst/applications/websites/website/configuration/multi_website/switch-websites.png differ diff --git a/content/applications/websites/website/configuration/spam_protection.rst b/content-rst/applications/websites/website/configuration/spam_protection.rst similarity index 100% rename from content/applications/websites/website/configuration/spam_protection.rst rename to content-rst/applications/websites/website/configuration/spam_protection.rst diff --git a/content-rst/applications/websites/website/configuration/spam_protection/recaptcha-error.png b/content-rst/applications/websites/website/configuration/spam_protection/recaptcha-error.png new file mode 100644 index 000000000..b7947e564 Binary files /dev/null and b/content-rst/applications/websites/website/configuration/spam_protection/recaptcha-error.png differ diff --git a/content-rst/applications/websites/website/configuration/spam_protection/recaptcha-google-configuration.png b/content-rst/applications/websites/website/configuration/spam_protection/recaptcha-google-configuration.png new file mode 100644 index 000000000..c3bbea65a Binary files /dev/null and b/content-rst/applications/websites/website/configuration/spam_protection/recaptcha-google-configuration.png differ diff --git a/content-rst/applications/websites/website/configuration/spam_protection/recaptcha-policy.png b/content-rst/applications/websites/website/configuration/spam_protection/recaptcha-policy.png new file mode 100644 index 000000000..a335a45eb Binary files /dev/null and b/content-rst/applications/websites/website/configuration/spam_protection/recaptcha-policy.png differ diff --git a/content-rst/applications/websites/website/configuration/spam_protection/turnstile-configuration.png b/content-rst/applications/websites/website/configuration/spam_protection/turnstile-configuration.png new file mode 100644 index 000000000..195309fb8 Binary files /dev/null and b/content-rst/applications/websites/website/configuration/spam_protection/turnstile-configuration.png differ diff --git a/content-rst/applications/websites/website/configuration/spam_protection/turnstile-error.png b/content-rst/applications/websites/website/configuration/spam_protection/turnstile-error.png new file mode 100644 index 000000000..d70b2d61f Binary files /dev/null and b/content-rst/applications/websites/website/configuration/spam_protection/turnstile-error.png differ diff --git a/content-rst/applications/websites/website/configuration/spam_protection/turnstile-human.png b/content-rst/applications/websites/website/configuration/spam_protection/turnstile-human.png new file mode 100644 index 000000000..12926b5b6 Binary files /dev/null and b/content-rst/applications/websites/website/configuration/spam_protection/turnstile-human.png differ diff --git a/content/applications/websites/website/configuration/translate.rst b/content-rst/applications/websites/website/configuration/translate.rst similarity index 100% rename from content/applications/websites/website/configuration/translate.rst rename to content-rst/applications/websites/website/configuration/translate.rst diff --git a/content-rst/applications/websites/website/configuration/translate/language-selector.png b/content-rst/applications/websites/website/configuration/translate/language-selector.png new file mode 100644 index 000000000..cdc391b7d Binary files /dev/null and b/content-rst/applications/websites/website/configuration/translate/language-selector.png differ diff --git a/content-rst/applications/websites/website/configuration/translate/translated-text.png b/content-rst/applications/websites/website/configuration/translate/translated-text.png new file mode 100644 index 000000000..817f723d6 Binary files /dev/null and b/content-rst/applications/websites/website/configuration/translate/translated-text.png differ diff --git a/content/applications/websites/website/mail_groups.rst b/content-rst/applications/websites/website/mail_groups.rst similarity index 100% rename from content/applications/websites/website/mail_groups.rst rename to content-rst/applications/websites/website/mail_groups.rst diff --git a/content-rst/applications/websites/website/mail_groups/mail-group-URLs.png b/content-rst/applications/websites/website/mail_groups/mail-group-URLs.png new file mode 100644 index 000000000..0fd84d754 Binary files /dev/null and b/content-rst/applications/websites/website/mail_groups/mail-group-URLs.png differ diff --git a/content-rst/applications/websites/website/mail_groups/mail-group-moderation.png b/content-rst/applications/websites/website/mail_groups/mail-group-moderation.png new file mode 100644 index 000000000..f663e350f Binary files /dev/null and b/content-rst/applications/websites/website/mail_groups/mail-group-moderation.png differ diff --git a/content-rst/applications/websites/website/mail_groups/mail-group-page.png b/content-rst/applications/websites/website/mail_groups/mail-group-page.png new file mode 100644 index 000000000..7e34bcbd0 Binary files /dev/null and b/content-rst/applications/websites/website/mail_groups/mail-group-page.png differ diff --git a/content/applications/websites/website/pages.rst b/content-rst/applications/websites/website/pages.rst similarity index 100% rename from content/applications/websites/website/pages.rst rename to content-rst/applications/websites/website/pages.rst diff --git a/content/applications/websites/website/pages/menus.rst b/content-rst/applications/websites/website/pages/menus.rst similarity index 100% rename from content/applications/websites/website/pages/menus.rst rename to content-rst/applications/websites/website/pages/menus.rst diff --git a/content-rst/applications/websites/website/pages/menus/edit-menu-icon.png b/content-rst/applications/websites/website/pages/menus/edit-menu-icon.png new file mode 100644 index 000000000..a2b9a388b Binary files /dev/null and b/content-rst/applications/websites/website/pages/menus/edit-menu-icon.png differ diff --git a/content-rst/applications/websites/website/pages/menus/mega-menu-option.png b/content-rst/applications/websites/website/pages/menus/mega-menu-option.png new file mode 100644 index 000000000..841bc6c92 Binary files /dev/null and b/content-rst/applications/websites/website/pages/menus/mega-menu-option.png differ diff --git a/content-rst/applications/websites/website/pages/menus/mega-menu.png b/content-rst/applications/websites/website/pages/menus/mega-menu.png new file mode 100644 index 000000000..5d93674c5 Binary files /dev/null and b/content-rst/applications/websites/website/pages/menus/mega-menu.png differ diff --git a/content-rst/applications/websites/website/pages/menus/menu-editor.png b/content-rst/applications/websites/website/pages/menus/menu-editor.png new file mode 100644 index 000000000..78a198dde Binary files /dev/null and b/content-rst/applications/websites/website/pages/menus/menu-editor.png differ diff --git a/content-rst/applications/websites/website/pages/page-redirection.png b/content-rst/applications/websites/website/pages/page-redirection.png new file mode 100644 index 000000000..e5fbb3a5c Binary files /dev/null and b/content-rst/applications/websites/website/pages/page-redirection.png differ diff --git a/content/applications/websites/website/pages/seo.rst b/content-rst/applications/websites/website/pages/seo.rst similarity index 100% rename from content/applications/websites/website/pages/seo.rst rename to content-rst/applications/websites/website/pages/seo.rst diff --git a/content-rst/applications/websites/website/pages/seo/data-markup.png b/content-rst/applications/websites/website/pages/seo/data-markup.png new file mode 100644 index 000000000..11a9cc47c Binary files /dev/null and b/content-rst/applications/websites/website/pages/seo/data-markup.png differ diff --git a/content-rst/applications/websites/website/pages/seo/image-format.png b/content-rst/applications/websites/website/pages/seo/image-format.png new file mode 100644 index 000000000..ca2381731 Binary files /dev/null and b/content-rst/applications/websites/website/pages/seo/image-format.png differ diff --git a/content-rst/applications/websites/website/pages/seo/optimize-seo.png b/content-rst/applications/websites/website/pages/seo/optimize-seo.png new file mode 100644 index 000000000..c1e03d72c Binary files /dev/null and b/content-rst/applications/websites/website/pages/seo/optimize-seo.png differ diff --git a/content-rst/applications/websites/website/pages/seo/page-properties.png b/content-rst/applications/websites/website/pages/seo/page-properties.png new file mode 100644 index 000000000..d7404e21e Binary files /dev/null and b/content-rst/applications/websites/website/pages/seo/page-properties.png differ diff --git a/content-rst/applications/websites/website/pages/un-published_toggle.png b/content-rst/applications/websites/website/pages/un-published_toggle.png new file mode 100644 index 000000000..54ac8673c Binary files /dev/null and b/content-rst/applications/websites/website/pages/un-published_toggle.png differ diff --git a/content/applications/websites/website/reporting.rst b/content-rst/applications/websites/website/reporting.rst similarity index 100% rename from content/applications/websites/website/reporting.rst rename to content-rst/applications/websites/website/reporting.rst diff --git a/content/applications/websites/website/reporting/analytics.rst b/content-rst/applications/websites/website/reporting/analytics.rst similarity index 100% rename from content/applications/websites/website/reporting/analytics.rst rename to content-rst/applications/websites/website/reporting/analytics.rst diff --git a/content-rst/applications/websites/website/reporting/analytics/GA-add-property.png b/content-rst/applications/websites/website/reporting/analytics/GA-add-property.png new file mode 100644 index 000000000..65457740b Binary files /dev/null and b/content-rst/applications/websites/website/reporting/analytics/GA-add-property.png differ diff --git a/content-rst/applications/websites/website/reporting/analytics/GA-measurement-id.png b/content-rst/applications/websites/website/reporting/analytics/GA-measurement-id.png new file mode 100644 index 000000000..bb1c77504 Binary files /dev/null and b/content-rst/applications/websites/website/reporting/analytics/GA-measurement-id.png differ diff --git a/content-rst/applications/websites/website/reporting/analytics/GA-platform.png b/content-rst/applications/websites/website/reporting/analytics/GA-platform.png new file mode 100644 index 000000000..47ceea997 Binary files /dev/null and b/content-rst/applications/websites/website/reporting/analytics/GA-platform.png differ diff --git a/content-rst/applications/websites/website/reporting/analytics/gtm-codes.png b/content-rst/applications/websites/website/reporting/analytics/gtm-codes.png new file mode 100644 index 000000000..302bbab22 Binary files /dev/null and b/content-rst/applications/websites/website/reporting/analytics/gtm-codes.png differ diff --git a/content-rst/applications/websites/website/reporting/analytics/plausible-copy-sharedlink.png b/content-rst/applications/websites/website/reporting/analytics/plausible-copy-sharedlink.png new file mode 100644 index 000000000..1eb8116ba Binary files /dev/null and b/content-rst/applications/websites/website/reporting/analytics/plausible-copy-sharedlink.png differ diff --git a/content-rst/applications/websites/website/reporting/analytics/plausible-create-sharedlink.png b/content-rst/applications/websites/website/reporting/analytics/plausible-create-sharedlink.png new file mode 100644 index 000000000..e5057da19 Binary files /dev/null and b/content-rst/applications/websites/website/reporting/analytics/plausible-create-sharedlink.png differ diff --git a/content-rst/applications/websites/website/reporting/analytics/plausible-gear-icon.png b/content-rst/applications/websites/website/reporting/analytics/plausible-gear-icon.png new file mode 100644 index 000000000..2ee1af67c Binary files /dev/null and b/content-rst/applications/websites/website/reporting/analytics/plausible-gear-icon.png differ diff --git a/content/applications/websites/website/reporting/link_tracker.rst b/content-rst/applications/websites/website/reporting/link_tracker.rst similarity index 100% rename from content/applications/websites/website/reporting/link_tracker.rst rename to content-rst/applications/websites/website/reporting/link_tracker.rst diff --git a/content-rst/applications/websites/website/reporting/link_tracker/conditional-visibility.png b/content-rst/applications/websites/website/reporting/link_tracker/conditional-visibility.png new file mode 100644 index 000000000..7bb6b2e09 Binary files /dev/null and b/content-rst/applications/websites/website/reporting/link_tracker/conditional-visibility.png differ diff --git a/content-rst/applications/websites/website/reporting/link_tracker/create-link-tracker.png b/content-rst/applications/websites/website/reporting/link_tracker/create-link-tracker.png new file mode 100644 index 000000000..37feec073 Binary files /dev/null and b/content-rst/applications/websites/website/reporting/link_tracker/create-link-tracker.png differ diff --git a/content-rst/applications/websites/website/reporting/link_tracker/statistics.png b/content-rst/applications/websites/website/reporting/link_tracker/statistics.png new file mode 100644 index 000000000..b0ce34bb0 Binary files /dev/null and b/content-rst/applications/websites/website/reporting/link_tracker/statistics.png differ diff --git a/content-rst/applications/websites/website/reporting/link_tracker/your-tracked-links.png b/content-rst/applications/websites/website/reporting/link_tracker/your-tracked-links.png new file mode 100644 index 000000000..06733fc97 Binary files /dev/null and b/content-rst/applications/websites/website/reporting/link_tracker/your-tracked-links.png differ diff --git a/content/applications/websites/website/web_design.rst b/content-rst/applications/websites/website/web_design.rst similarity index 100% rename from content/applications/websites/website/web_design.rst rename to content-rst/applications/websites/website/web_design.rst diff --git a/content/applications/websites/website/web_design/building_blocks.rst b/content-rst/applications/websites/website/web_design/building_blocks.rst similarity index 100% rename from content/applications/websites/website/web_design/building_blocks.rst rename to content-rst/applications/websites/website/web_design/building_blocks.rst diff --git a/content-rst/applications/websites/website/web_design/building_blocks/cols.png b/content-rst/applications/websites/website/web_design/building_blocks/cols.png new file mode 100644 index 000000000..0a25f85e9 Binary files /dev/null and b/content-rst/applications/websites/website/web_design/building_blocks/cols.png differ diff --git a/content-rst/applications/websites/website/web_design/building_blocks/custom-blocks.png b/content-rst/applications/websites/website/web_design/building_blocks/custom-blocks.png new file mode 100644 index 000000000..a320080db Binary files /dev/null and b/content-rst/applications/websites/website/web_design/building_blocks/custom-blocks.png differ diff --git a/content-rst/applications/websites/website/web_design/building_blocks/duplicate-container.png b/content-rst/applications/websites/website/web_design/building_blocks/duplicate-container.png new file mode 100644 index 000000000..0a5d5a972 Binary files /dev/null and b/content-rst/applications/websites/website/web_design/building_blocks/duplicate-container.png differ diff --git a/content/applications/websites/website/web_design/building_blocks/dynamic_content.rst b/content-rst/applications/websites/website/web_design/building_blocks/dynamic_content.rst similarity index 100% rename from content/applications/websites/website/web_design/building_blocks/dynamic_content.rst rename to content-rst/applications/websites/website/web_design/building_blocks/dynamic_content.rst diff --git a/content-rst/applications/websites/website/web_design/building_blocks/dynamic_content/embed-code.png b/content-rst/applications/websites/website/web_design/building_blocks/dynamic_content/embed-code.png new file mode 100644 index 000000000..fa6b7e69e Binary files /dev/null and b/content-rst/applications/websites/website/web_design/building_blocks/dynamic_content/embed-code.png differ diff --git a/content-rst/applications/websites/website/web_design/building_blocks/dynamic_content/form-block-settings.png b/content-rst/applications/websites/website/web_design/building_blocks/dynamic_content/form-block-settings.png new file mode 100644 index 000000000..461e6ecb7 Binary files /dev/null and b/content-rst/applications/websites/website/web_design/building_blocks/dynamic_content/form-block-settings.png differ diff --git a/content-rst/applications/websites/website/web_design/building_blocks/dynamic_content/form-block.png b/content-rst/applications/websites/website/web_design/building_blocks/dynamic_content/form-block.png new file mode 100644 index 000000000..a090b8eb8 Binary files /dev/null and b/content-rst/applications/websites/website/web_design/building_blocks/dynamic_content/form-block.png differ diff --git a/content-rst/applications/websites/website/web_design/building_blocks/dynamic_content/form-field-types.png b/content-rst/applications/websites/website/web_design/building_blocks/dynamic_content/form-field-types.png new file mode 100644 index 000000000..e5bb7ee68 Binary files /dev/null and b/content-rst/applications/websites/website/web_design/building_blocks/dynamic_content/form-field-types.png differ diff --git a/content-rst/applications/websites/website/web_design/building_blocks/dynamic_content/products-block.png b/content-rst/applications/websites/website/web_design/building_blocks/dynamic_content/products-block.png new file mode 100644 index 000000000..56af96e10 Binary files /dev/null and b/content-rst/applications/websites/website/web_design/building_blocks/dynamic_content/products-block.png differ diff --git a/content/applications/websites/website/web_design/building_blocks/features.rst b/content-rst/applications/websites/website/web_design/building_blocks/features.rst similarity index 100% rename from content/applications/websites/website/web_design/building_blocks/features.rst rename to content-rst/applications/websites/website/web_design/building_blocks/features.rst diff --git a/content-rst/applications/websites/website/web_design/building_blocks/features/call-to-action.png b/content-rst/applications/websites/website/web_design/building_blocks/features/call-to-action.png new file mode 100644 index 000000000..0fb1f0400 Binary files /dev/null and b/content-rst/applications/websites/website/web_design/building_blocks/features/call-to-action.png differ diff --git a/content-rst/applications/websites/website/web_design/building_blocks/features/table-of-content.png b/content-rst/applications/websites/website/web_design/building_blocks/features/table-of-content.png new file mode 100644 index 000000000..df2c83184 Binary files /dev/null and b/content-rst/applications/websites/website/web_design/building_blocks/features/table-of-content.png differ diff --git a/content-rst/applications/websites/website/web_design/building_blocks/grid-layout.png b/content-rst/applications/websites/website/web_design/building_blocks/grid-layout.png new file mode 100644 index 000000000..086c6b1fe Binary files /dev/null and b/content-rst/applications/websites/website/web_design/building_blocks/grid-layout.png differ diff --git a/content/applications/websites/website/web_design/building_blocks/inner_content.rst b/content-rst/applications/websites/website/web_design/building_blocks/inner_content.rst similarity index 100% rename from content/applications/websites/website/web_design/building_blocks/inner_content.rst rename to content-rst/applications/websites/website/web_design/building_blocks/inner_content.rst diff --git a/content-rst/applications/websites/website/web_design/building_blocks/inner_content/social-media-block.png b/content-rst/applications/websites/website/web_design/building_blocks/inner_content/social-media-block.png new file mode 100644 index 000000000..fc4208802 Binary files /dev/null and b/content-rst/applications/websites/website/web_design/building_blocks/inner_content/social-media-block.png differ diff --git a/content-rst/applications/websites/website/web_design/building_blocks/phone-icon.png b/content-rst/applications/websites/website/web_design/building_blocks/phone-icon.png new file mode 100644 index 000000000..424b8741e Binary files /dev/null and b/content-rst/applications/websites/website/web_design/building_blocks/phone-icon.png differ diff --git a/content-rst/applications/websites/website/web_design/building_blocks/reordering-blocks.png b/content-rst/applications/websites/website/web_design/building_blocks/reordering-blocks.png new file mode 100644 index 000000000..4807d0610 Binary files /dev/null and b/content-rst/applications/websites/website/web_design/building_blocks/reordering-blocks.png differ diff --git a/content-rst/applications/websites/website/web_design/building_blocks/saving-custom-block.png b/content-rst/applications/websites/website/web_design/building_blocks/saving-custom-block.png new file mode 100644 index 000000000..b143b40f3 Binary files /dev/null and b/content-rst/applications/websites/website/web_design/building_blocks/saving-custom-block.png differ diff --git a/content-rst/applications/websites/website/web_design/building_blocks/show-hide-on-mobile.png b/content-rst/applications/websites/website/web_design/building_blocks/show-hide-on-mobile.png new file mode 100644 index 000000000..482350aee Binary files /dev/null and b/content-rst/applications/websites/website/web_design/building_blocks/show-hide-on-mobile.png differ diff --git a/content/applications/websites/website/web_design/building_blocks/structure.rst b/content-rst/applications/websites/website/web_design/building_blocks/structure.rst similarity index 100% rename from content/applications/websites/website/web_design/building_blocks/structure.rst rename to content-rst/applications/websites/website/web_design/building_blocks/structure.rst diff --git a/content-rst/applications/websites/website/web_design/building_blocks/structure/call-to-action.png b/content-rst/applications/websites/website/web_design/building_blocks/structure/call-to-action.png new file mode 100644 index 000000000..9a515d982 Binary files /dev/null and b/content-rst/applications/websites/website/web_design/building_blocks/structure/call-to-action.png differ diff --git a/content-rst/applications/websites/website/web_design/building_blocks/structure/default-image-content.png b/content-rst/applications/websites/website/web_design/building_blocks/structure/default-image-content.png new file mode 100644 index 000000000..a50cbc9b8 Binary files /dev/null and b/content-rst/applications/websites/website/web_design/building_blocks/structure/default-image-content.png differ diff --git a/content-rst/applications/websites/website/web_design/building_blocks/structure/inline-text.png b/content-rst/applications/websites/website/web_design/building_blocks/structure/inline-text.png new file mode 100644 index 000000000..914e1c121 Binary files /dev/null and b/content-rst/applications/websites/website/web_design/building_blocks/structure/inline-text.png differ diff --git a/content-rst/applications/websites/website/web_design/building_blocks/structure/masonry-template.png b/content-rst/applications/websites/website/web_design/building_blocks/structure/masonry-template.png new file mode 100644 index 000000000..b9948ee38 Binary files /dev/null and b/content-rst/applications/websites/website/web_design/building_blocks/structure/masonry-template.png differ diff --git a/content-rst/applications/websites/website/web_design/building_blocks/structure/masonry-text-box.png b/content-rst/applications/websites/website/web_design/building_blocks/structure/masonry-text-box.png new file mode 100644 index 000000000..bdaa7af7b Binary files /dev/null and b/content-rst/applications/websites/website/web_design/building_blocks/structure/masonry-text-box.png differ diff --git a/content-rst/applications/websites/website/web_design/building_blocks/superimpose-images-to-text.png b/content-rst/applications/websites/website/web_design/building_blocks/superimpose-images-to-text.png new file mode 100644 index 000000000..8dee0f1a9 Binary files /dev/null and b/content-rst/applications/websites/website/web_design/building_blocks/superimpose-images-to-text.png differ diff --git a/content/applications/websites/website/web_design/themes.rst b/content-rst/applications/websites/website/web_design/themes.rst similarity index 100% rename from content/applications/websites/website/web_design/themes.rst rename to content-rst/applications/websites/website/web_design/themes.rst diff --git a/content-rst/applications/websites/website/web_design/themes/add-a-font.png b/content-rst/applications/websites/website/web_design/themes/add-a-font.png new file mode 100644 index 000000000..e57d4c9e8 Binary files /dev/null and b/content-rst/applications/websites/website/web_design/themes/add-a-font.png differ diff --git a/content-rst/applications/websites/website/web_design/themes/advanced.png b/content-rst/applications/websites/website/web_design/themes/advanced.png new file mode 100644 index 000000000..b9cacfd89 Binary files /dev/null and b/content-rst/applications/websites/website/web_design/themes/advanced.png differ diff --git a/content-rst/applications/websites/website/web_design/themes/buttons.png b/content-rst/applications/websites/website/web_design/themes/buttons.png new file mode 100644 index 000000000..af0bd9b43 Binary files /dev/null and b/content-rst/applications/websites/website/web_design/themes/buttons.png differ diff --git a/content-rst/applications/websites/website/web_design/themes/colors.png b/content-rst/applications/websites/website/web_design/themes/colors.png new file mode 100644 index 000000000..74d090d0e Binary files /dev/null and b/content-rst/applications/websites/website/web_design/themes/colors.png differ diff --git a/content-rst/applications/websites/website/web_design/themes/grays.png b/content-rst/applications/websites/website/web_design/themes/grays.png new file mode 100644 index 000000000..8b1cd36bf Binary files /dev/null and b/content-rst/applications/websites/website/web_design/themes/grays.png differ diff --git a/content-rst/applications/websites/website/web_design/themes/success.png b/content-rst/applications/websites/website/web_design/themes/success.png new file mode 100644 index 000000000..12660600f Binary files /dev/null and b/content-rst/applications/websites/website/web_design/themes/success.png differ diff --git a/content/contributing.rst b/content-rst/contributing.rst similarity index 100% rename from content/contributing.rst rename to content-rst/contributing.rst diff --git a/content/contributing/development.rst b/content-rst/contributing/development.rst similarity index 100% rename from content/contributing/development.rst rename to content-rst/contributing/development.rst diff --git a/content/contributing/development/coding_guidelines.rst b/content-rst/contributing/development/coding_guidelines.rst similarity index 100% rename from content/contributing/development/coding_guidelines.rst rename to content-rst/contributing/development/coding_guidelines.rst diff --git a/content/contributing/development/git_guidelines.rst b/content-rst/contributing/development/git_guidelines.rst similarity index 100% rename from content/contributing/development/git_guidelines.rst rename to content-rst/contributing/development/git_guidelines.rst diff --git a/content/contributing/documentation.rst b/content-rst/contributing/documentation.rst similarity index 100% rename from content/contributing/documentation.rst rename to content-rst/contributing/documentation.rst diff --git a/content/contributing/documentation/content_guidelines.rst b/content-rst/contributing/documentation/content_guidelines.rst similarity index 100% rename from content/contributing/documentation/content_guidelines.rst rename to content-rst/contributing/documentation/content_guidelines.rst diff --git a/content-rst/contributing/documentation/content_guidelines/quotations-list-full.png b/content-rst/contributing/documentation/content_guidelines/quotations-list-full.png new file mode 100644 index 000000000..188587682 Binary files /dev/null and b/content-rst/contributing/documentation/content_guidelines/quotations-list-full.png differ diff --git a/content-rst/contributing/documentation/content_guidelines/quotations-list-reduced.png b/content-rst/contributing/documentation/content_guidelines/quotations-list-reduced.png new file mode 100644 index 000000000..b750df64e Binary files /dev/null and b/content-rst/contributing/documentation/content_guidelines/quotations-list-reduced.png differ diff --git a/content-rst/contributing/documentation/content_guidelines/settings.png b/content-rst/contributing/documentation/content_guidelines/settings.png new file mode 100644 index 000000000..5d43936c7 Binary files /dev/null and b/content-rst/contributing/documentation/content_guidelines/settings.png differ diff --git a/content-rst/contributing/documentation/fork-repository.png b/content-rst/contributing/documentation/fork-repository.png new file mode 100644 index 000000000..af76cafa7 Binary files /dev/null and b/content-rst/contributing/documentation/fork-repository.png differ diff --git a/content-rst/contributing/documentation/propose-changes.png b/content-rst/contributing/documentation/propose-changes.png new file mode 100644 index 000000000..8358afd4b Binary files /dev/null and b/content-rst/contributing/documentation/propose-changes.png differ diff --git a/content/contributing/documentation/rst_guidelines.rst b/content-rst/contributing/documentation/rst_guidelines.rst similarity index 100% rename from content/contributing/documentation/rst_guidelines.rst rename to content-rst/contributing/documentation/rst_guidelines.rst diff --git a/content-rst/contributing/documentation/rst_guidelines/accounting-menu.png b/content-rst/contributing/documentation/rst_guidelines/accounting-menu.png new file mode 100644 index 000000000..baf223ff6 Binary files /dev/null and b/content-rst/contributing/documentation/rst_guidelines/accounting-menu.png differ diff --git a/content-rst/contributing/documentation/rst_guidelines/create-invoice.png b/content-rst/contributing/documentation/rst_guidelines/create-invoice.png new file mode 100644 index 000000000..956ac4ebb Binary files /dev/null and b/content-rst/contributing/documentation/rst_guidelines/create-invoice.png differ diff --git a/content-rst/contributing/documentation/rst_guidelines/my_module.zip b/content-rst/contributing/documentation/rst_guidelines/my_module.zip new file mode 100644 index 000000000..97a63dfb7 Binary files /dev/null and b/content-rst/contributing/documentation/rst_guidelines/my_module.zip differ diff --git a/content/contributing/install_git.rst b/content-rst/contributing/install_git.rst similarity index 100% rename from content/contributing/install_git.rst rename to content-rst/contributing/install_git.rst diff --git a/content/developer.rst b/content-rst/developer.rst similarity index 100% rename from content/developer.rst rename to content-rst/developer.rst diff --git a/content/developer/glossary.rst b/content-rst/developer/glossary.rst similarity index 100% rename from content/developer/glossary.rst rename to content-rst/developer/glossary.rst diff --git a/content/developer/howtos.rst b/content-rst/developer/howtos.rst similarity index 100% rename from content/developer/howtos.rst rename to content-rst/developer/howtos.rst diff --git a/content/developer/howtos/accounting_localization.rst b/content-rst/developer/howtos/accounting_localization.rst similarity index 100% rename from content/developer/howtos/accounting_localization.rst rename to content-rst/developer/howtos/accounting_localization.rst diff --git a/content-rst/developer/howtos/accounting_localization/tax_report.dot b/content-rst/developer/howtos/accounting_localization/tax_report.dot new file mode 100644 index 000000000..aae02b2bd --- /dev/null +++ b/content-rst/developer/howtos/accounting_localization/tax_report.dot @@ -0,0 +1,81 @@ +digraph foo { + graph [ + newrank=true, + overlap=false, + ]; + node [ + fontname="Ubuntu" + fontsize=10, + style="filled,setlinewidth(6)", + shape=box, + height=0.1, + width=0.1, + ]; + edge [ + fontsize=8, + ]; + res_country[label="res.country", fillcolor=white, penwidth=1]; + subgraph cluster_invoice { + style = filled; + label = "Invoices"; + color = lightyellow; + node [style=filled, color=white]; + edge [fontsize=8,]; + account_move_line[label="account.move.line"] + account_tax[label="account.tax"] + account_tax_repartition_line[label="account.tax.repartition.line"]; + account_account_tag[label="account.account.tag"]; + account_move_line -> account_tax [label="tax_ids | tax_line_ids"]; + account_move_line -> account_tax_repartition_line [label="tax_repartition_line_id"]; + account_move_line -> account_account_tag [label="tag_ids"]; + account_tax_repartition_line -> account_account_tag [label="tag_ids"]; + account_tax -> account_tax_repartition_line [label="1 for base, 1..* for tax amount"]; + } + subgraph cluster_reporting { + style = filled; + label = "Reporting"; + color = mistyrose; + node [style=filled, color=white]; + edge [fontsize=8,]; + account_tax_report [label="account.report"]; + account_tax_report_line [label="account.report.line"]; + account_report_expression [label="account.report.expression"]; + account_tax_report -> account_tax_report_line [label="0..*"] + } + subgraph cluster_templates { + style = filled; + label = "Templates"; + color = lightblue; + node [style=filled, color=white]; + edge [fontsize=8,]; + account_tax_template[label="account.tax.template"]; + account_tax_repartition_line_template[label="account.tax.repartition.line.template"]; + account_tax_template -> account_tax_repartition_line_template [label="1 for base, 1..* for tax amount"]; + } + { + rank=same; + account_move_line; + account_tax_report; + } + { + rank=same; + account_tax; + account_tax_repartition_line; + account_account_tag; + res_country; + } + { + rank=same; + account_report_expression; + account_tax_template; + account_tax_repartition_line_template; + } + account_tax -> account_tax_template [label=" Creates when\n installing CoA", dir=back]; + account_tax_repartition_line -> account_tax_repartition_line_template[label=" Creates when\n installing CoA", dir=back]; + account_tax_repartition_line_template -> account_account_tag [label="tag_ids"]; + account_tax_report_line -> account_report_expression [label="0..*"]; + account_tax_report_line -> account_tax_report_line [label="children_ids"]; + account_report_expression -> account_account_tag [label="Engine tax_tags 1..*"]; + account_tax_report -> res_country [label="0..1"]; + account_account_tag -> res_country [label="0..1"]; +} diff --git a/content/developer/howtos/company.rst b/content-rst/developer/howtos/company.rst similarity index 100% rename from content/developer/howtos/company.rst rename to content-rst/developer/howtos/company.rst diff --git a/content/developer/howtos/connect_device.rst b/content-rst/developer/howtos/connect_device.rst similarity index 100% rename from content/developer/howtos/connect_device.rst rename to content-rst/developer/howtos/connect_device.rst diff --git a/content/developer/howtos/create_reports.rst b/content-rst/developer/howtos/create_reports.rst similarity index 100% rename from content/developer/howtos/create_reports.rst rename to content-rst/developer/howtos/create_reports.rst diff --git a/content/developer/howtos/frontend_owl_components.rst b/content-rst/developer/howtos/frontend_owl_components.rst similarity index 100% rename from content/developer/howtos/frontend_owl_components.rst rename to content-rst/developer/howtos/frontend_owl_components.rst diff --git a/content/developer/howtos/javascript_client_action.rst b/content-rst/developer/howtos/javascript_client_action.rst similarity index 100% rename from content/developer/howtos/javascript_client_action.rst rename to content-rst/developer/howtos/javascript_client_action.rst diff --git a/content/developer/howtos/javascript_field.rst b/content-rst/developer/howtos/javascript_field.rst similarity index 100% rename from content/developer/howtos/javascript_field.rst rename to content-rst/developer/howtos/javascript_field.rst diff --git a/content/developer/howtos/javascript_view.rst b/content-rst/developer/howtos/javascript_view.rst similarity index 100% rename from content/developer/howtos/javascript_view.rst rename to content-rst/developer/howtos/javascript_view.rst diff --git a/content/developer/howtos/scss_tips.rst b/content-rst/developer/howtos/scss_tips.rst similarity index 100% rename from content/developer/howtos/scss_tips.rst rename to content-rst/developer/howtos/scss_tips.rst diff --git a/content/developer/howtos/standalone_owl_application.rst b/content-rst/developer/howtos/standalone_owl_application.rst similarity index 100% rename from content/developer/howtos/standalone_owl_application.rst rename to content-rst/developer/howtos/standalone_owl_application.rst diff --git a/content/developer/howtos/translations.rst b/content-rst/developer/howtos/translations.rst similarity index 100% rename from content/developer/howtos/translations.rst rename to content-rst/developer/howtos/translations.rst diff --git a/content-rst/developer/howtos/translations/po-export.png b/content-rst/developer/howtos/translations/po-export.png new file mode 100644 index 000000000..91574b40e Binary files /dev/null and b/content-rst/developer/howtos/translations/po-export.png differ diff --git a/content/developer/howtos/upgrade_custom_db.rst b/content-rst/developer/howtos/upgrade_custom_db.rst similarity index 100% rename from content/developer/howtos/upgrade_custom_db.rst rename to content-rst/developer/howtos/upgrade_custom_db.rst diff --git a/content/developer/howtos/web_services.rst b/content-rst/developer/howtos/web_services.rst similarity index 100% rename from content/developer/howtos/web_services.rst rename to content-rst/developer/howtos/web_services.rst diff --git a/content/developer/howtos/website_themes.rst b/content-rst/developer/howtos/website_themes.rst similarity index 100% rename from content/developer/howtos/website_themes.rst rename to content-rst/developer/howtos/website_themes.rst diff --git a/content/developer/howtos/website_themes/animations.rst b/content-rst/developer/howtos/website_themes/animations.rst similarity index 100% rename from content/developer/howtos/website_themes/animations.rst rename to content-rst/developer/howtos/website_themes/animations.rst diff --git a/content-rst/developer/howtos/website_themes/animations/animations.png b/content-rst/developer/howtos/website_themes/animations/animations.png new file mode 100644 index 000000000..f71cb0b31 Binary files /dev/null and b/content-rst/developer/howtos/website_themes/animations/animations.png differ diff --git a/content/developer/howtos/website_themes/building_blocks.rst b/content-rst/developer/howtos/website_themes/building_blocks.rst similarity index 100% rename from content/developer/howtos/website_themes/building_blocks.rst rename to content-rst/developer/howtos/website_themes/building_blocks.rst diff --git a/content/developer/howtos/website_themes/forms.rst b/content-rst/developer/howtos/website_themes/forms.rst similarity index 100% rename from content/developer/howtos/website_themes/forms.rst rename to content-rst/developer/howtos/website_themes/forms.rst diff --git a/content/developer/howtos/website_themes/going_live.rst b/content-rst/developer/howtos/website_themes/going_live.rst similarity index 100% rename from content/developer/howtos/website_themes/going_live.rst rename to content-rst/developer/howtos/website_themes/going_live.rst diff --git a/content/developer/howtos/website_themes/gradients.rst b/content-rst/developer/howtos/website_themes/gradients.rst similarity index 100% rename from content/developer/howtos/website_themes/gradients.rst rename to content-rst/developer/howtos/website_themes/gradients.rst diff --git a/content/developer/howtos/website_themes/layout.rst b/content-rst/developer/howtos/website_themes/layout.rst similarity index 100% rename from content/developer/howtos/website_themes/layout.rst rename to content-rst/developer/howtos/website_themes/layout.rst diff --git a/content/developer/howtos/website_themes/navigation.rst b/content-rst/developer/howtos/website_themes/navigation.rst similarity index 100% rename from content/developer/howtos/website_themes/navigation.rst rename to content-rst/developer/howtos/website_themes/navigation.rst diff --git a/content/developer/howtos/website_themes/pages.rst b/content-rst/developer/howtos/website_themes/pages.rst similarity index 100% rename from content/developer/howtos/website_themes/pages.rst rename to content-rst/developer/howtos/website_themes/pages.rst diff --git a/content-rst/developer/howtos/website_themes/pages/header-overlay.png b/content-rst/developer/howtos/website_themes/pages/header-overlay.png new file mode 100644 index 000000000..9c2577445 Binary files /dev/null and b/content-rst/developer/howtos/website_themes/pages/header-overlay.png differ diff --git a/content-rst/developer/howtos/website_themes/pages/icon-options.png b/content-rst/developer/howtos/website_themes/pages/icon-options.png new file mode 100644 index 000000000..929ebbe3d Binary files /dev/null and b/content-rst/developer/howtos/website_themes/pages/icon-options.png differ diff --git a/content-rst/developer/howtos/website_themes/pages/media-window.png b/content-rst/developer/howtos/website_themes/pages/media-window.png new file mode 100644 index 000000000..40c43f211 Binary files /dev/null and b/content-rst/developer/howtos/website_themes/pages/media-window.png differ diff --git a/content/developer/howtos/website_themes/setup.rst b/content-rst/developer/howtos/website_themes/setup.rst similarity index 100% rename from content/developer/howtos/website_themes/setup.rst rename to content-rst/developer/howtos/website_themes/setup.rst diff --git a/content-rst/developer/howtos/website_themes/setup/database-backup.png b/content-rst/developer/howtos/website_themes/setup/database-backup.png new file mode 100644 index 000000000..5fba189ce Binary files /dev/null and b/content-rst/developer/howtos/website_themes/setup/database-backup.png differ diff --git a/content-rst/developer/howtos/website_themes/setup/download-backup.png b/content-rst/developer/howtos/website_themes/setup/download-backup.png new file mode 100644 index 000000000..76648aa86 Binary files /dev/null and b/content-rst/developer/howtos/website_themes/setup/download-backup.png differ diff --git a/content-rst/developer/howtos/website_themes/setup/models-page.png b/content-rst/developer/howtos/website_themes/setup/models-page.png new file mode 100644 index 000000000..4ec123529 Binary files /dev/null and b/content-rst/developer/howtos/website_themes/setup/models-page.png differ diff --git a/content-rst/developer/howtos/website_themes/setup/welcome-homepage.png b/content-rst/developer/howtos/website_themes/setup/welcome-homepage.png new file mode 100644 index 000000000..74c223a3b Binary files /dev/null and b/content-rst/developer/howtos/website_themes/setup/welcome-homepage.png differ diff --git a/content/developer/howtos/website_themes/shapes.rst b/content-rst/developer/howtos/website_themes/shapes.rst similarity index 100% rename from content/developer/howtos/website_themes/shapes.rst rename to content-rst/developer/howtos/website_themes/shapes.rst diff --git a/content/developer/howtos/website_themes/theming.rst b/content-rst/developer/howtos/website_themes/theming.rst similarity index 100% rename from content/developer/howtos/website_themes/theming.rst rename to content-rst/developer/howtos/website_themes/theming.rst diff --git a/content-rst/developer/howtos/website_themes/theming/theme-colors-airproof.png b/content-rst/developer/howtos/website_themes/theming/theme-colors-airproof.png new file mode 100644 index 000000000..b6f67e005 Binary files /dev/null and b/content-rst/developer/howtos/website_themes/theming/theme-colors-airproof.png differ diff --git a/content-rst/developer/howtos/website_themes/theming/theme-colors-big.png b/content-rst/developer/howtos/website_themes/theming/theme-colors-big.png new file mode 100644 index 000000000..fa606feda Binary files /dev/null and b/content-rst/developer/howtos/website_themes/theming/theme-colors-big.png differ diff --git a/content-rst/developer/howtos/website_themes/theming/theme-colors.png b/content-rst/developer/howtos/website_themes/theming/theme-colors.png new file mode 100644 index 000000000..fc29e7312 Binary files /dev/null and b/content-rst/developer/howtos/website_themes/theming/theme-colors.png differ diff --git a/content/developer/howtos/website_themes/translations.rst b/content-rst/developer/howtos/website_themes/translations.rst similarity index 100% rename from content/developer/howtos/website_themes/translations.rst rename to content-rst/developer/howtos/website_themes/translations.rst diff --git a/content-rst/developer/howtos/website_themes/translations/edit-translations.png b/content-rst/developer/howtos/website_themes/translations/edit-translations.png new file mode 100644 index 000000000..8961911b8 Binary files /dev/null and b/content-rst/developer/howtos/website_themes/translations/edit-translations.png differ diff --git a/content-rst/developer/howtos/website_themes/translations/translate-button.png b/content-rst/developer/howtos/website_themes/translations/translate-button.png new file mode 100644 index 000000000..af15663d0 Binary files /dev/null and b/content-rst/developer/howtos/website_themes/translations/translate-button.png differ diff --git a/content-rst/developer/howtos/website_themes/web-design.png b/content-rst/developer/howtos/website_themes/web-design.png new file mode 100644 index 000000000..8527f3832 Binary files /dev/null and b/content-rst/developer/howtos/website_themes/web-design.png differ diff --git a/content/developer/reference.rst b/content-rst/developer/reference.rst similarity index 100% rename from content/developer/reference.rst rename to content-rst/developer/reference.rst diff --git a/content/developer/reference/backend.rst b/content-rst/developer/reference/backend.rst similarity index 100% rename from content/developer/reference/backend.rst rename to content-rst/developer/reference/backend.rst diff --git a/content/developer/reference/backend/actions.rst b/content-rst/developer/reference/backend/actions.rst similarity index 100% rename from content/developer/reference/backend/actions.rst rename to content-rst/developer/reference/backend/actions.rst diff --git a/content/developer/reference/backend/data.rst b/content-rst/developer/reference/backend/data.rst similarity index 100% rename from content/developer/reference/backend/data.rst rename to content-rst/developer/reference/backend/data.rst diff --git a/content-rst/developer/reference/backend/data/res.country.state.csv b/content-rst/developer/reference/backend/data/res.country.state.csv new file mode 100644 index 000000000..b1960d9a4 --- /dev/null +++ b/content-rst/developer/reference/backend/data/res.country.state.csv @@ -0,0 +1,15 @@ +"id","country_id:id","name","code" +state_au_1,au,"Australian Capital Territory","ACT" +state_au_2,au,"New South Wales","NSW" +state_au_3,au,"Northern Territory","NT" +state_au_4,au,"Queensland","QLD" +state_au_5,au,"South Australia","SA" +state_au_6,au,"Tasmania","TAS" +state_au_7,au,"Victoria","VIC" +state_au_8,au,"Western Australia","WA" +state_us_1,us,"Alabama","AL" +state_us_2,us,"Alaska","AK" +state_us_3,us,"Arizona","AZ" +state_us_4,us,"Arkansas","AR" +state_us_5,us,"California","CA" +state_us_6,us,"Colorado","CO" diff --git a/content/developer/reference/backend/http.rst b/content-rst/developer/reference/backend/http.rst similarity index 100% rename from content/developer/reference/backend/http.rst rename to content-rst/developer/reference/backend/http.rst diff --git a/content/developer/reference/backend/mixins.rst b/content-rst/developer/reference/backend/mixins.rst similarity index 100% rename from content/developer/reference/backend/mixins.rst rename to content-rst/developer/reference/backend/mixins.rst diff --git a/content/developer/reference/backend/module.rst b/content-rst/developer/reference/backend/module.rst similarity index 100% rename from content/developer/reference/backend/module.rst rename to content-rst/developer/reference/backend/module.rst diff --git a/content/developer/reference/backend/orm.rst b/content-rst/developer/reference/backend/orm.rst similarity index 100% rename from content/developer/reference/backend/orm.rst rename to content-rst/developer/reference/backend/orm.rst diff --git a/content/developer/reference/backend/orm/changelog.rst b/content-rst/developer/reference/backend/orm/changelog.rst similarity index 100% rename from content/developer/reference/backend/orm/changelog.rst rename to content-rst/developer/reference/backend/orm/changelog.rst diff --git a/content-rst/developer/reference/backend/orm/inheritance_methods.png b/content-rst/developer/reference/backend/orm/inheritance_methods.png new file mode 100644 index 000000000..990e7640a Binary files /dev/null and b/content-rst/developer/reference/backend/orm/inheritance_methods.png differ diff --git a/content/developer/reference/backend/performance.rst b/content-rst/developer/reference/backend/performance.rst similarity index 100% rename from content/developer/reference/backend/performance.rst rename to content-rst/developer/reference/backend/performance.rst diff --git a/content-rst/developer/reference/backend/performance/enable_profiling_wizard.png b/content-rst/developer/reference/backend/performance/enable_profiling_wizard.png new file mode 100644 index 000000000..7fa2870d3 Binary files /dev/null and b/content-rst/developer/reference/backend/performance/enable_profiling_wizard.png differ diff --git a/content-rst/developer/reference/backend/performance/flamegraph_example.png b/content-rst/developer/reference/backend/performance/flamegraph_example.png new file mode 100644 index 000000000..6fe54aaa8 Binary files /dev/null and b/content-rst/developer/reference/backend/performance/flamegraph_example.png differ diff --git a/content-rst/developer/reference/backend/performance/profiling_debug_menu.png b/content-rst/developer/reference/backend/performance/profiling_debug_menu.png new file mode 100644 index 000000000..ac5af3f6f Binary files /dev/null and b/content-rst/developer/reference/backend/performance/profiling_debug_menu.png differ diff --git a/content-rst/developer/reference/backend/performance/profiling_web.png b/content-rst/developer/reference/backend/performance/profiling_web.png new file mode 100644 index 000000000..a636e02ac Binary files /dev/null and b/content-rst/developer/reference/backend/performance/profiling_web.png differ diff --git a/content-rst/developer/reference/backend/performance/speedscope_modes.png b/content-rst/developer/reference/backend/performance/speedscope_modes.png new file mode 100644 index 000000000..e08a70620 Binary files /dev/null and b/content-rst/developer/reference/backend/performance/speedscope_modes.png differ diff --git a/content/developer/reference/backend/reports.rst b/content-rst/developer/reference/backend/reports.rst similarity index 100% rename from content/developer/reference/backend/reports.rst rename to content-rst/developer/reference/backend/reports.rst diff --git a/content/developer/reference/backend/security.rst b/content-rst/developer/reference/backend/security.rst similarity index 100% rename from content/developer/reference/backend/security.rst rename to content-rst/developer/reference/backend/security.rst diff --git a/content/developer/reference/backend/testing.rst b/content-rst/developer/reference/backend/testing.rst similarity index 100% rename from content/developer/reference/backend/testing.rst rename to content-rst/developer/reference/backend/testing.rst diff --git a/content-rst/developer/reference/backend/testing/tests.png b/content-rst/developer/reference/backend/testing/tests.png new file mode 100644 index 000000000..11552c053 Binary files /dev/null and b/content-rst/developer/reference/backend/testing/tests.png differ diff --git a/content/developer/reference/cli.rst b/content-rst/developer/reference/cli.rst similarity index 100% rename from content/developer/reference/cli.rst rename to content-rst/developer/reference/cli.rst diff --git a/content/developer/reference/external_api.rst b/content-rst/developer/reference/external_api.rst similarity index 100% rename from content/developer/reference/external_api.rst rename to content-rst/developer/reference/external_api.rst diff --git a/content-rst/developer/reference/external_api/account-security.png b/content-rst/developer/reference/external_api/account-security.png new file mode 100644 index 000000000..cf91646dd Binary files /dev/null and b/content-rst/developer/reference/external_api/account-security.png differ diff --git a/content-rst/developer/reference/external_api/delete-key.png b/content-rst/developer/reference/external_api/delete-key.png new file mode 100644 index 000000000..df14cb35d Binary files /dev/null and b/content-rst/developer/reference/external_api/delete-key.png differ diff --git a/content-rst/developer/reference/external_api/preferences.png b/content-rst/developer/reference/external_api/preferences.png new file mode 100644 index 000000000..1ce36717e Binary files /dev/null and b/content-rst/developer/reference/external_api/preferences.png differ diff --git a/content/developer/reference/extract_api.rst b/content-rst/developer/reference/extract_api.rst similarity index 100% rename from content/developer/reference/extract_api.rst rename to content-rst/developer/reference/extract_api.rst diff --git a/content-rst/developer/reference/extract_api/implementation.py b/content-rst/developer/reference/extract_api/implementation.py new file mode 100644 index 000000000..3392f4ee5 --- /dev/null +++ b/content-rst/developer/reference/extract_api/implementation.py @@ -0,0 +1,90 @@ +import base64 +import json +import sys +import time + +import requests + +account_token = "integration_token" # Use your token +domain_name = "https://extract.api.odoo.com" +path_to_pdf = "/path/to/your/pdf" +doc_type = "invoice" # invoice, expense or applicant + +# Do not change +API_VERSION = { + 'invoice': 122, + 'expense': 132, + 'applicant': 102, +} + +def extract_jsonrpc_call(path: str, params: dict): + payload = { + 'jsonrpc': '2.0', + 'method': 'call', + 'params': params, + 'id': 0, # This should be unique for each call + } + response = requests.post(domain_name + path, json=payload, timeout=10) + response.raise_for_status() + json_response = response.json() + return json_response + + +def send_document_to_extract(doc_path: str): + with open(doc_path, 'rb') as f: + encoded_doc = base64.b64encode(f.read()).decode() + params = { + 'account_token': account_token, + 'version': API_VERSION[doc_type], + 'documents': [encoded_doc], + } + response = extract_jsonrpc_call(f"/api/extract/{doc_type}/2/parse", params) + return response + + +def get_result_from_extract(document_token: str): + params = { + 'version': API_VERSION[doc_type], + 'document_token': document_token, + 'account_token': account_token, + } + endpoint = f"/api/extract/{doc_type}/2/get_result" + response = extract_jsonrpc_call(endpoint, params) + while response['result']['status'] == 'processing': + print("Still processing... Retrying in 5 seconds") + time.sleep(5) + response = extract_jsonrpc_call(endpoint, params) + return response + + +if __name__ == '__main__': + + # Parse the document + response = send_document_to_extract(path_to_pdf) + print("/parse call status: ", response['result']['status_msg']) + + if response['result']['status'] != 'success': + sys.exit(1) + + document_token = response['result']['document_token'] + + # Get the results of the parsing + response = get_result_from_extract(document_token) + + # Write the response to a file + output_file = 'response.json' + with open(output_file, 'w') as f: + json.dump(response, f, indent=2) + print("\nResult saved in", output_file) + + print("/get_results call status: ", response['result']['status_msg']) + if response['result']['status'] != 'success': + sys.exit(1) + + document_results = response['result']['results'][0] + + print("\nTotal:", document_results['total']['selected_value']['content']) + print("Subtotal:", document_results['subtotal']['selected_value']['content']) + print("Invoice id:", document_results['invoice_id']['selected_value']['content']) + print("Date:", document_results['date']['selected_value']['content']) + print("...\n") diff --git a/content/developer/reference/frontend.rst b/content-rst/developer/reference/frontend.rst similarity index 100% rename from content/developer/reference/frontend.rst rename to content-rst/developer/reference/frontend.rst diff --git a/content/developer/reference/frontend/assets.rst b/content-rst/developer/reference/frontend/assets.rst similarity index 100% rename from content/developer/reference/frontend/assets.rst rename to content-rst/developer/reference/frontend/assets.rst diff --git a/content/developer/reference/frontend/error_handling.rst b/content-rst/developer/reference/frontend/error_handling.rst similarity index 100% rename from content/developer/reference/frontend/error_handling.rst rename to content-rst/developer/reference/frontend/error_handling.rst diff --git a/content/developer/reference/frontend/framework_overview.rst b/content-rst/developer/reference/frontend/framework_overview.rst similarity index 100% rename from content/developer/reference/frontend/framework_overview.rst rename to content-rst/developer/reference/frontend/framework_overview.rst diff --git a/content/developer/reference/frontend/hooks.rst b/content-rst/developer/reference/frontend/hooks.rst similarity index 100% rename from content/developer/reference/frontend/hooks.rst rename to content-rst/developer/reference/frontend/hooks.rst diff --git a/content/developer/reference/frontend/javascript_modules.rst b/content-rst/developer/reference/frontend/javascript_modules.rst similarity index 100% rename from content/developer/reference/frontend/javascript_modules.rst rename to content-rst/developer/reference/frontend/javascript_modules.rst diff --git a/content/developer/reference/frontend/javascript_reference.rst b/content-rst/developer/reference/frontend/javascript_reference.rst similarity index 100% rename from content/developer/reference/frontend/javascript_reference.rst rename to content-rst/developer/reference/frontend/javascript_reference.rst diff --git a/content/developer/reference/frontend/mobile.rst b/content-rst/developer/reference/frontend/mobile.rst similarity index 100% rename from content/developer/reference/frontend/mobile.rst rename to content-rst/developer/reference/frontend/mobile.rst diff --git a/content-rst/developer/reference/frontend/mobile/mobile_contact_create.png b/content-rst/developer/reference/frontend/mobile/mobile_contact_create.png new file mode 100644 index 000000000..53ca9e499 Binary files /dev/null and b/content-rst/developer/reference/frontend/mobile/mobile_contact_create.png differ diff --git a/content-rst/developer/reference/frontend/mobile/mobile_notification.png b/content-rst/developer/reference/frontend/mobile/mobile_notification.png new file mode 100644 index 000000000..ea72d7a6d Binary files /dev/null and b/content-rst/developer/reference/frontend/mobile/mobile_notification.png differ diff --git a/content-rst/developer/reference/frontend/mobile/mobile_switch_account.png b/content-rst/developer/reference/frontend/mobile/mobile_switch_account.png new file mode 100644 index 000000000..3c7da3e2c Binary files /dev/null and b/content-rst/developer/reference/frontend/mobile/mobile_switch_account.png differ diff --git a/content-rst/developer/reference/frontend/mobile/mobile_working.jpg b/content-rst/developer/reference/frontend/mobile/mobile_working.jpg new file mode 100644 index 000000000..8243530f7 Binary files /dev/null and b/content-rst/developer/reference/frontend/mobile/mobile_working.jpg differ diff --git a/content-rst/developer/reference/frontend/mobile/odoo_mobile_api.png b/content-rst/developer/reference/frontend/mobile/odoo_mobile_api.png new file mode 100644 index 000000000..8fdf37942 Binary files /dev/null and b/content-rst/developer/reference/frontend/mobile/odoo_mobile_api.png differ diff --git a/content-rst/developer/reference/frontend/mobile/snackbar.png b/content-rst/developer/reference/frontend/mobile/snackbar.png new file mode 100644 index 000000000..76ad0f1a9 Binary files /dev/null and b/content-rst/developer/reference/frontend/mobile/snackbar.png differ diff --git a/content-rst/developer/reference/frontend/mobile/toast.png b/content-rst/developer/reference/frontend/mobile/toast.png new file mode 100644 index 000000000..d6f5298a7 Binary files /dev/null and b/content-rst/developer/reference/frontend/mobile/toast.png differ diff --git a/content/developer/reference/frontend/odoo_editor.rst b/content-rst/developer/reference/frontend/odoo_editor.rst similarity index 100% rename from content/developer/reference/frontend/odoo_editor.rst rename to content-rst/developer/reference/frontend/odoo_editor.rst diff --git a/content-rst/developer/reference/frontend/odoo_editor/powerbox-custom.png b/content-rst/developer/reference/frontend/odoo_editor/powerbox-custom.png new file mode 100644 index 000000000..e81152e32 Binary files /dev/null and b/content-rst/developer/reference/frontend/odoo_editor/powerbox-custom.png differ diff --git a/content-rst/developer/reference/frontend/odoo_editor/powerbox-filtered.png b/content-rst/developer/reference/frontend/odoo_editor/powerbox-filtered.png new file mode 100644 index 000000000..8732e4462 Binary files /dev/null and b/content-rst/developer/reference/frontend/odoo_editor/powerbox-filtered.png differ diff --git a/content-rst/developer/reference/frontend/odoo_editor/powerbox.png b/content-rst/developer/reference/frontend/odoo_editor/powerbox.png new file mode 100644 index 000000000..4b3b31489 Binary files /dev/null and b/content-rst/developer/reference/frontend/odoo_editor/powerbox.png differ diff --git a/content/developer/reference/frontend/owl_components.rst b/content-rst/developer/reference/frontend/owl_components.rst similarity index 100% rename from content/developer/reference/frontend/owl_components.rst rename to content-rst/developer/reference/frontend/owl_components.rst diff --git a/content-rst/developer/reference/frontend/owl_components/actionswiper.png b/content-rst/developer/reference/frontend/owl_components/actionswiper.png new file mode 100644 index 000000000..7472f6247 Binary files /dev/null and b/content-rst/developer/reference/frontend/owl_components/actionswiper.png differ diff --git a/content-rst/developer/reference/frontend/owl_components/notebook.png b/content-rst/developer/reference/frontend/owl_components/notebook.png new file mode 100644 index 000000000..6a621a036 Binary files /dev/null and b/content-rst/developer/reference/frontend/owl_components/notebook.png differ diff --git a/content-rst/developer/reference/frontend/owl_components/select_menu.png b/content-rst/developer/reference/frontend/owl_components/select_menu.png new file mode 100644 index 000000000..6b9e9dbfd Binary files /dev/null and b/content-rst/developer/reference/frontend/owl_components/select_menu.png differ diff --git a/content-rst/developer/reference/frontend/owl_components/select_menu_bottomArea.png b/content-rst/developer/reference/frontend/owl_components/select_menu_bottomArea.png new file mode 100644 index 000000000..09bed513d Binary files /dev/null and b/content-rst/developer/reference/frontend/owl_components/select_menu_bottomArea.png differ diff --git a/content-rst/developer/reference/frontend/owl_components/select_menu_multiSelect.png b/content-rst/developer/reference/frontend/owl_components/select_menu_multiSelect.png new file mode 100644 index 000000000..83f5a3cf4 Binary files /dev/null and b/content-rst/developer/reference/frontend/owl_components/select_menu_multiSelect.png differ diff --git a/content-rst/developer/reference/frontend/owl_components/tags_list.png b/content-rst/developer/reference/frontend/owl_components/tags_list.png new file mode 100644 index 000000000..4b10b7d60 Binary files /dev/null and b/content-rst/developer/reference/frontend/owl_components/tags_list.png differ diff --git a/content/developer/reference/frontend/patching_code.rst b/content-rst/developer/reference/frontend/patching_code.rst similarity index 100% rename from content/developer/reference/frontend/patching_code.rst rename to content-rst/developer/reference/frontend/patching_code.rst diff --git a/content/developer/reference/frontend/qweb.rst b/content-rst/developer/reference/frontend/qweb.rst similarity index 100% rename from content/developer/reference/frontend/qweb.rst rename to content-rst/developer/reference/frontend/qweb.rst diff --git a/content/developer/reference/frontend/registries.rst b/content-rst/developer/reference/frontend/registries.rst similarity index 100% rename from content/developer/reference/frontend/registries.rst rename to content-rst/developer/reference/frontend/registries.rst diff --git a/content/developer/reference/frontend/services.rst b/content-rst/developer/reference/frontend/services.rst similarity index 100% rename from content/developer/reference/frontend/services.rst rename to content-rst/developer/reference/frontend/services.rst diff --git a/content-rst/developer/reference/frontend/services/notification_service.png b/content-rst/developer/reference/frontend/services/notification_service.png new file mode 100644 index 000000000..3cd84914d Binary files /dev/null and b/content-rst/developer/reference/frontend/services/notification_service.png differ diff --git a/content-rst/developer/reference/frontend/services/odoo_sepia.png b/content-rst/developer/reference/frontend/services/odoo_sepia.png new file mode 100644 index 000000000..d38ccc664 Binary files /dev/null and b/content-rst/developer/reference/frontend/services/odoo_sepia.png differ diff --git a/content-rst/developer/reference/frontend/services/rainbow_man.png b/content-rst/developer/reference/frontend/services/rainbow_man.png new file mode 100644 index 000000000..aec8ec250 Binary files /dev/null and b/content-rst/developer/reference/frontend/services/rainbow_man.png differ diff --git a/content/developer/reference/standard_modules.rst b/content-rst/developer/reference/standard_modules.rst similarity index 100% rename from content/developer/reference/standard_modules.rst rename to content-rst/developer/reference/standard_modules.rst diff --git a/content/developer/reference/standard_modules/account.rst b/content-rst/developer/reference/standard_modules/account.rst similarity index 100% rename from content/developer/reference/standard_modules/account.rst rename to content-rst/developer/reference/standard_modules/account.rst diff --git a/content/developer/reference/standard_modules/account/account_account.rst b/content-rst/developer/reference/standard_modules/account/account_account.rst similarity index 100% rename from content/developer/reference/standard_modules/account/account_account.rst rename to content-rst/developer/reference/standard_modules/account/account_account.rst diff --git a/content/developer/reference/standard_modules/account/account_account_tag.rst b/content-rst/developer/reference/standard_modules/account/account_account_tag.rst similarity index 100% rename from content/developer/reference/standard_modules/account/account_account_tag.rst rename to content-rst/developer/reference/standard_modules/account/account_account_tag.rst diff --git a/content/developer/reference/standard_modules/account/account_fiscal_position.rst b/content-rst/developer/reference/standard_modules/account/account_fiscal_position.rst similarity index 100% rename from content/developer/reference/standard_modules/account/account_fiscal_position.rst rename to content-rst/developer/reference/standard_modules/account/account_fiscal_position.rst diff --git a/content/developer/reference/standard_modules/account/account_group.rst b/content-rst/developer/reference/standard_modules/account/account_group.rst similarity index 100% rename from content/developer/reference/standard_modules/account/account_group.rst rename to content-rst/developer/reference/standard_modules/account/account_group.rst diff --git a/content/developer/reference/standard_modules/account/account_report.rst b/content-rst/developer/reference/standard_modules/account/account_report.rst similarity index 100% rename from content/developer/reference/standard_modules/account/account_report.rst rename to content-rst/developer/reference/standard_modules/account/account_report.rst diff --git a/content/developer/reference/standard_modules/account/account_report_line.rst b/content-rst/developer/reference/standard_modules/account/account_report_line.rst similarity index 100% rename from content/developer/reference/standard_modules/account/account_report_line.rst rename to content-rst/developer/reference/standard_modules/account/account_report_line.rst diff --git a/content/developer/reference/standard_modules/account/account_tax.rst b/content-rst/developer/reference/standard_modules/account/account_tax.rst similarity index 100% rename from content/developer/reference/standard_modules/account/account_tax.rst rename to content-rst/developer/reference/standard_modules/account/account_tax.rst diff --git a/content/developer/reference/standard_modules/account/account_tax_repartition.rst b/content-rst/developer/reference/standard_modules/account/account_tax_repartition.rst similarity index 100% rename from content/developer/reference/standard_modules/account/account_tax_repartition.rst rename to content-rst/developer/reference/standard_modules/account/account_tax_repartition.rst diff --git a/content/developer/reference/standard_modules/payment.rst b/content-rst/developer/reference/standard_modules/payment.rst similarity index 100% rename from content/developer/reference/standard_modules/payment.rst rename to content-rst/developer/reference/standard_modules/payment.rst diff --git a/content/developer/reference/standard_modules/payment/payment_method.rst b/content-rst/developer/reference/standard_modules/payment/payment_method.rst similarity index 100% rename from content/developer/reference/standard_modules/payment/payment_method.rst rename to content-rst/developer/reference/standard_modules/payment/payment_method.rst diff --git a/content/developer/reference/standard_modules/payment/payment_provider.rst b/content-rst/developer/reference/standard_modules/payment/payment_provider.rst similarity index 100% rename from content/developer/reference/standard_modules/payment/payment_provider.rst rename to content-rst/developer/reference/standard_modules/payment/payment_provider.rst diff --git a/content/developer/reference/standard_modules/payment/payment_token.rst b/content-rst/developer/reference/standard_modules/payment/payment_token.rst similarity index 100% rename from content/developer/reference/standard_modules/payment/payment_token.rst rename to content-rst/developer/reference/standard_modules/payment/payment_token.rst diff --git a/content/developer/reference/standard_modules/payment/payment_transaction.rst b/content-rst/developer/reference/standard_modules/payment/payment_transaction.rst similarity index 100% rename from content/developer/reference/standard_modules/payment/payment_transaction.rst rename to content-rst/developer/reference/standard_modules/payment/payment_transaction.rst diff --git a/content/developer/reference/upgrades.rst b/content-rst/developer/reference/upgrades.rst similarity index 100% rename from content/developer/reference/upgrades.rst rename to content-rst/developer/reference/upgrades.rst diff --git a/content/developer/reference/upgrades/upgrade_scripts.rst b/content-rst/developer/reference/upgrades/upgrade_scripts.rst similarity index 100% rename from content/developer/reference/upgrades/upgrade_scripts.rst rename to content-rst/developer/reference/upgrades/upgrade_scripts.rst diff --git a/content/developer/reference/upgrades/upgrade_utils.rst b/content-rst/developer/reference/upgrades/upgrade_utils.rst similarity index 100% rename from content/developer/reference/upgrades/upgrade_utils.rst rename to content-rst/developer/reference/upgrades/upgrade_utils.rst diff --git a/content/developer/reference/user_interface.rst b/content-rst/developer/reference/user_interface.rst similarity index 100% rename from content/developer/reference/user_interface.rst rename to content-rst/developer/reference/user_interface.rst diff --git a/content/developer/reference/user_interface/icons.rst b/content-rst/developer/reference/user_interface/icons.rst similarity index 100% rename from content/developer/reference/user_interface/icons.rst rename to content-rst/developer/reference/user_interface/icons.rst diff --git a/content/developer/reference/user_interface/scss_inheritance.rst b/content-rst/developer/reference/user_interface/scss_inheritance.rst similarity index 100% rename from content/developer/reference/user_interface/scss_inheritance.rst rename to content-rst/developer/reference/user_interface/scss_inheritance.rst diff --git a/content/developer/reference/user_interface/view_architectures.rst b/content-rst/developer/reference/user_interface/view_architectures.rst similarity index 100% rename from content/developer/reference/user_interface/view_architectures.rst rename to content-rst/developer/reference/user_interface/view_architectures.rst diff --git a/content/developer/reference/user_interface/view_architectures/button_attribute_context.rst b/content-rst/developer/reference/user_interface/view_architectures/button_attribute_context.rst similarity index 100% rename from content/developer/reference/user_interface/view_architectures/button_attribute_context.rst rename to content-rst/developer/reference/user_interface/view_architectures/button_attribute_context.rst diff --git a/content/developer/reference/user_interface/view_architectures/button_attribute_help.rst b/content-rst/developer/reference/user_interface/view_architectures/button_attribute_help.rst similarity index 100% rename from content/developer/reference/user_interface/view_architectures/button_attribute_help.rst rename to content-rst/developer/reference/user_interface/view_architectures/button_attribute_help.rst diff --git a/content/developer/reference/user_interface/view_architectures/button_attribute_icon.rst b/content-rst/developer/reference/user_interface/view_architectures/button_attribute_icon.rst similarity index 100% rename from content/developer/reference/user_interface/view_architectures/button_attribute_icon.rst rename to content-rst/developer/reference/user_interface/view_architectures/button_attribute_icon.rst diff --git a/content/developer/reference/user_interface/view_architectures/button_attribute_name.rst b/content-rst/developer/reference/user_interface/view_architectures/button_attribute_name.rst similarity index 100% rename from content/developer/reference/user_interface/view_architectures/button_attribute_name.rst rename to content-rst/developer/reference/user_interface/view_architectures/button_attribute_name.rst diff --git a/content/developer/reference/user_interface/view_architectures/button_attribute_string.rst b/content-rst/developer/reference/user_interface/view_architectures/button_attribute_string.rst similarity index 100% rename from content/developer/reference/user_interface/view_architectures/button_attribute_string.rst rename to content-rst/developer/reference/user_interface/view_architectures/button_attribute_string.rst diff --git a/content/developer/reference/user_interface/view_architectures/button_attribute_type.rst b/content-rst/developer/reference/user_interface/view_architectures/button_attribute_type.rst similarity index 100% rename from content/developer/reference/user_interface/view_architectures/button_attribute_type.rst rename to content-rst/developer/reference/user_interface/view_architectures/button_attribute_type.rst diff --git a/content/developer/reference/user_interface/view_architectures/field_attribute_name.rst b/content-rst/developer/reference/user_interface/view_architectures/field_attribute_name.rst similarity index 100% rename from content/developer/reference/user_interface/view_architectures/field_attribute_name.rst rename to content-rst/developer/reference/user_interface/view_architectures/field_attribute_name.rst diff --git a/content/developer/reference/user_interface/view_architectures/field_attribute_readonly.rst b/content-rst/developer/reference/user_interface/view_architectures/field_attribute_readonly.rst similarity index 100% rename from content/developer/reference/user_interface/view_architectures/field_attribute_readonly.rst rename to content-rst/developer/reference/user_interface/view_architectures/field_attribute_readonly.rst diff --git a/content/developer/reference/user_interface/view_architectures/field_attribute_required.rst b/content-rst/developer/reference/user_interface/view_architectures/field_attribute_required.rst similarity index 100% rename from content/developer/reference/user_interface/view_architectures/field_attribute_required.rst rename to content-rst/developer/reference/user_interface/view_architectures/field_attribute_required.rst diff --git a/content/developer/reference/user_interface/view_architectures/field_attribute_string.rst b/content-rst/developer/reference/user_interface/view_architectures/field_attribute_string.rst similarity index 100% rename from content/developer/reference/user_interface/view_architectures/field_attribute_string.rst rename to content-rst/developer/reference/user_interface/view_architectures/field_attribute_string.rst diff --git a/content-rst/developer/reference/user_interface/view_architectures/form_button_box.svg b/content-rst/developer/reference/user_interface/view_architectures/form_button_box.svg new file mode 100644 index 000000000..b6af3d674 --- /dev/null +++ b/content-rst/developer/reference/user_interface/view_architectures/form_button_box.svg @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Button1 + + + + $ + 123 + Invoices + + + + + + + + + + + + \ No newline at end of file diff --git a/content-rst/developer/reference/user_interface/view_architectures/form_group.svg b/content-rst/developer/reference/user_interface/view_architectures/form_group.svg new file mode 100644 index 000000000..d840dc535 --- /dev/null +++ b/content-rst/developer/reference/user_interface/view_architectures/form_group.svg @@ -0,0 +1,95 @@ + + + + + + + + + + custom + + + + value of field a + + + + + label b + + + + value of field b + + + + + title 1 + + + + + title 2 + + + + label e + + + + value of field e + + + + + label c + + + + value of field c + + + + label f + + + + value of field f + + + + + label d + + + + value of field d + + + + label g + + + + value of field g + + + + + label h + + + + value of field h + + + + label i + + + + value of field i + + + \ No newline at end of file diff --git a/content-rst/developer/reference/user_interface/view_architectures/form_newline.svg b/content-rst/developer/reference/user_interface/view_architectures/form_newline.svg new file mode 100644 index 000000000..67fbf101c --- /dev/null +++ b/content-rst/developer/reference/user_interface/view_architectures/form_newline.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + Title 1 + + + + Title 1.1 + + + + Title 1.2 + + + + Title 1.3 + + + \ No newline at end of file diff --git a/content-rst/developer/reference/user_interface/view_architectures/form_notebook.svg b/content-rst/developer/reference/user_interface/view_architectures/form_notebook.svg new file mode 100644 index 000000000..bd7c81591 --- /dev/null +++ b/content-rst/developer/reference/user_interface/view_architectures/form_notebook.svg @@ -0,0 +1,27 @@ + + + + + + + + + + Page1 + + Page2 + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/content-rst/developer/reference/user_interface/view_architectures/form_separator.svg b/content-rst/developer/reference/user_interface/view_architectures/form_separator.svg new file mode 100644 index 000000000..c12cd87d0 --- /dev/null +++ b/content-rst/developer/reference/user_interface/view_architectures/form_separator.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + Title 1 + + + + + + + + + + + + + + Title 2 + + + + + + + + + + \ No newline at end of file diff --git a/content/developer/reference/user_interface/view_architectures/generic_attribute_class.rst b/content-rst/developer/reference/user_interface/view_architectures/generic_attribute_class.rst similarity index 100% rename from content/developer/reference/user_interface/view_architectures/generic_attribute_class.rst rename to content-rst/developer/reference/user_interface/view_architectures/generic_attribute_class.rst diff --git a/content/developer/reference/user_interface/view_architectures/generic_attribute_column_invisible.rst b/content-rst/developer/reference/user_interface/view_architectures/generic_attribute_column_invisible.rst similarity index 100% rename from content/developer/reference/user_interface/view_architectures/generic_attribute_column_invisible.rst rename to content-rst/developer/reference/user_interface/view_architectures/generic_attribute_column_invisible.rst diff --git a/content/developer/reference/user_interface/view_architectures/generic_attribute_groups.rst b/content-rst/developer/reference/user_interface/view_architectures/generic_attribute_groups.rst similarity index 100% rename from content/developer/reference/user_interface/view_architectures/generic_attribute_groups.rst rename to content-rst/developer/reference/user_interface/view_architectures/generic_attribute_groups.rst diff --git a/content/developer/reference/user_interface/view_architectures/generic_attribute_invisible.rst b/content-rst/developer/reference/user_interface/view_architectures/generic_attribute_invisible.rst similarity index 100% rename from content/developer/reference/user_interface/view_architectures/generic_attribute_invisible.rst rename to content-rst/developer/reference/user_interface/view_architectures/generic_attribute_invisible.rst diff --git a/content-rst/developer/reference/user_interface/view_architectures/kanban.svg b/content-rst/developer/reference/user_interface/view_architectures/kanban.svg new file mode 100644 index 000000000..cff3cb18e --- /dev/null +++ b/content-rst/developer/reference/user_interface/view_architectures/kanban.svg @@ -0,0 +1,18 @@ + + + + + + + + Column 1 + + + + Column 2 + + + Column 2 + + + \ No newline at end of file diff --git a/content-rst/developer/reference/user_interface/view_architectures/kanban_progressbar.svg b/content-rst/developer/reference/user_interface/view_architectures/kanban_progressbar.svg new file mode 100644 index 000000000..b62a763c1 --- /dev/null +++ b/content-rst/developer/reference/user_interface/view_architectures/kanban_progressbar.svg @@ -0,0 +1,25 @@ + + + + + + + + Column 1 + + + 12,988 + + + + Column 2 + + 6,700 + + + Column 2 + + 18,000 + + + \ No newline at end of file diff --git a/content-rst/developer/reference/user_interface/view_architectures/list.svg b/content-rst/developer/reference/user_interface/view_architectures/list.svg new file mode 100644 index 000000000..ff7cf25e6 --- /dev/null +++ b/content-rst/developer/reference/user_interface/view_architectures/list.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + Name + Amount + Currency + Tax + + + + + + + + \ No newline at end of file diff --git a/content-rst/developer/reference/user_interface/view_architectures/list_button.svg b/content-rst/developer/reference/user_interface/view_architectures/list_button.svg new file mode 100644 index 000000000..20e748002 --- /dev/null +++ b/content-rst/developer/reference/user_interface/view_architectures/list_button.svg @@ -0,0 +1,44 @@ + + + + + + + + + + + + + Button1 + + + + + + + + + + + + + + + + + Name + Amount + Currency + Tax + + + + + + + + \ No newline at end of file diff --git a/content-rst/developer/reference/user_interface/view_architectures/list_control.svg b/content-rst/developer/reference/user_interface/view_architectures/list_control.svg new file mode 100644 index 000000000..093e36a03 --- /dev/null +++ b/content-rst/developer/reference/user_interface/view_architectures/list_control.svg @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + Name + Amount + Currency + Tax + + + + + + + + + + Add an item + + + + Add a section + + + + Add a note + + + \ No newline at end of file diff --git a/content-rst/developer/reference/user_interface/view_architectures/list_field.svg b/content-rst/developer/reference/user_interface/view_architectures/list_field.svg new file mode 100644 index 000000000..0e5ea4e20 --- /dev/null +++ b/content-rst/developer/reference/user_interface/view_architectures/list_field.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + My Custom Name + Amount + Currency + Tax + + + + + + + + + 123.45 € + + \ No newline at end of file diff --git a/content-rst/developer/reference/user_interface/view_architectures/list_groupby.svg b/content-rst/developer/reference/user_interface/view_architectures/list_groupby.svg new file mode 100644 index 000000000..8bb88a593 --- /dev/null +++ b/content-rst/developer/reference/user_interface/view_architectures/list_groupby.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Name + Amount + Currency + Tax + + + Admin (3) + + + Button1 + + + + + + + Demo (0) + + + Button1 + + + + Jhon (1) + + + + + \ No newline at end of file diff --git a/content-rst/developer/reference/user_interface/view_architectures/list_header.svg b/content-rst/developer/reference/user_interface/view_architectures/list_header.svg new file mode 100644 index 000000000..426b68afa --- /dev/null +++ b/content-rst/developer/reference/user_interface/view_architectures/list_header.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + New + + + 3 selected + + + Button1 + + + + + + + Name + Amount + Currency + Tax + + + + + + + + + + + \ No newline at end of file diff --git a/content/developer/reference/user_interface/view_architectures/root_attribute_create.rst b/content-rst/developer/reference/user_interface/view_architectures/root_attribute_create.rst similarity index 100% rename from content/developer/reference/user_interface/view_architectures/root_attribute_create.rst rename to content-rst/developer/reference/user_interface/view_architectures/root_attribute_create.rst diff --git a/content/developer/reference/user_interface/view_architectures/root_attribute_default_group_by.rst b/content-rst/developer/reference/user_interface/view_architectures/root_attribute_default_group_by.rst similarity index 100% rename from content/developer/reference/user_interface/view_architectures/root_attribute_default_group_by.rst rename to content-rst/developer/reference/user_interface/view_architectures/root_attribute_default_group_by.rst diff --git a/content/developer/reference/user_interface/view_architectures/root_attribute_default_order.rst b/content-rst/developer/reference/user_interface/view_architectures/root_attribute_default_order.rst similarity index 100% rename from content/developer/reference/user_interface/view_architectures/root_attribute_default_order.rst rename to content-rst/developer/reference/user_interface/view_architectures/root_attribute_default_order.rst diff --git a/content/developer/reference/user_interface/view_architectures/root_attribute_delete.rst b/content-rst/developer/reference/user_interface/view_architectures/root_attribute_delete.rst similarity index 100% rename from content/developer/reference/user_interface/view_architectures/root_attribute_delete.rst rename to content-rst/developer/reference/user_interface/view_architectures/root_attribute_delete.rst diff --git a/content/developer/reference/user_interface/view_architectures/root_attribute_edit.rst b/content-rst/developer/reference/user_interface/view_architectures/root_attribute_edit.rst similarity index 100% rename from content/developer/reference/user_interface/view_architectures/root_attribute_edit.rst rename to content-rst/developer/reference/user_interface/view_architectures/root_attribute_edit.rst diff --git a/content/developer/reference/user_interface/view_architectures/root_attribute_sample.rst b/content-rst/developer/reference/user_interface/view_architectures/root_attribute_sample.rst similarity index 100% rename from content/developer/reference/user_interface/view_architectures/root_attribute_sample.rst rename to content-rst/developer/reference/user_interface/view_architectures/root_attribute_sample.rst diff --git a/content/developer/reference/user_interface/view_architectures/root_attribute_string.rst b/content-rst/developer/reference/user_interface/view_architectures/root_attribute_string.rst similarity index 100% rename from content/developer/reference/user_interface/view_architectures/root_attribute_string.rst rename to content-rst/developer/reference/user_interface/view_architectures/root_attribute_string.rst diff --git a/content-rst/developer/reference/user_interface/view_architectures/search.svg b/content-rst/developer/reference/user_interface/view_architectures/search.svg new file mode 100644 index 000000000..ff2ac6fbb --- /dev/null +++ b/content-rst/developer/reference/user_interface/view_architectures/search.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + Name + + Searching value + + \ No newline at end of file diff --git a/content-rst/developer/reference/user_interface/view_architectures/search_field.svg b/content-rst/developer/reference/user_interface/view_architectures/search_field.svg new file mode 100644 index 000000000..272c9acb2 --- /dev/null +++ b/content-rst/developer/reference/user_interface/view_architectures/search_field.svg @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + My Custom Name + + Default value search + + aaa + | + + + + + + Search + Amount + for: + aaa + + Search + Currency + for: + aaa + + Search + Reference + for: + aaa + + + \ No newline at end of file diff --git a/content-rst/developer/reference/user_interface/view_architectures/search_filter.svg b/content-rst/developer/reference/user_interface/view_architectures/search_filter.svg new file mode 100644 index 000000000..d4b3da311 --- /dev/null +++ b/content-rst/developer/reference/user_interface/view_architectures/search_filter.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + My orders + + + + + + + Filters + Unassigned + x + My orders + + Group By + Category + + + \ No newline at end of file diff --git a/content/developer/reference/user_interface/view_records.rst b/content-rst/developer/reference/user_interface/view_records.rst similarity index 100% rename from content/developer/reference/user_interface/view_records.rst rename to content-rst/developer/reference/user_interface/view_records.rst diff --git a/content/developer/tutorials.rst b/content-rst/developer/tutorials.rst similarity index 100% rename from content/developer/tutorials.rst rename to content-rst/developer/tutorials.rst diff --git a/content/developer/tutorials/backend.rst b/content-rst/developer/tutorials/backend.rst similarity index 100% rename from content/developer/tutorials/backend.rst rename to content-rst/developer/tutorials/backend.rst diff --git a/content/developer/tutorials/define_module_data.rst b/content-rst/developer/tutorials/define_module_data.rst similarity index 100% rename from content/developer/tutorials/define_module_data.rst rename to content-rst/developer/tutorials/define_module_data.rst diff --git a/content/developer/tutorials/discover_js_framework.rst b/content-rst/developer/tutorials/discover_js_framework.rst similarity index 100% rename from content/developer/tutorials/discover_js_framework.rst rename to content-rst/developer/tutorials/discover_js_framework.rst diff --git a/content/developer/tutorials/discover_js_framework/01_owl_components.rst b/content-rst/developer/tutorials/discover_js_framework/01_owl_components.rst similarity index 100% rename from content/developer/tutorials/discover_js_framework/01_owl_components.rst rename to content-rst/developer/tutorials/discover_js_framework/01_owl_components.rst diff --git a/content-rst/developer/tutorials/discover_js_framework/01_owl_components/autofocus.png b/content-rst/developer/tutorials/discover_js_framework/01_owl_components/autofocus.png new file mode 100644 index 000000000..eb13a35b6 Binary files /dev/null and b/content-rst/developer/tutorials/discover_js_framework/01_owl_components/autofocus.png differ diff --git a/content-rst/developer/tutorials/discover_js_framework/01_owl_components/component_lifecycle.svg b/content-rst/developer/tutorials/discover_js_framework/01_owl_components/component_lifecycle.svg new file mode 100644 index 000000000..e3767e555 --- /dev/null +++ b/content-rst/developer/tutorials/discover_js_framework/01_owl_components/component_lifecycle.svg @@ -0,0 +1 @@ +
destruction
onWillUnmount
onWillDestroy
removed from DOM
updates
(onWillUpdateProps)
render
onWillPatch
patch DOM
onPatched
creation
setup
onWillStart
render
mount (in DOM)
onMounted
\ No newline at end of file diff --git a/content-rst/developer/tutorials/discover_js_framework/01_owl_components/counter.png b/content-rst/developer/tutorials/discover_js_framework/01_owl_components/counter.png new file mode 100644 index 000000000..5e2ac1a8f Binary files /dev/null and b/content-rst/developer/tutorials/discover_js_framework/01_owl_components/counter.png differ diff --git a/content-rst/developer/tutorials/discover_js_framework/01_owl_components/create_todo.png b/content-rst/developer/tutorials/discover_js_framework/01_owl_components/create_todo.png new file mode 100644 index 000000000..83ec5c4c5 Binary files /dev/null and b/content-rst/developer/tutorials/discover_js_framework/01_owl_components/create_todo.png differ diff --git a/content-rst/developer/tutorials/discover_js_framework/01_owl_components/delete_todo.png b/content-rst/developer/tutorials/discover_js_framework/01_owl_components/delete_todo.png new file mode 100644 index 000000000..cc9ff9a85 Binary files /dev/null and b/content-rst/developer/tutorials/discover_js_framework/01_owl_components/delete_todo.png differ diff --git a/content-rst/developer/tutorials/discover_js_framework/01_owl_components/double_counter.png b/content-rst/developer/tutorials/discover_js_framework/01_owl_components/double_counter.png new file mode 100644 index 000000000..99e2b88d4 Binary files /dev/null and b/content-rst/developer/tutorials/discover_js_framework/01_owl_components/double_counter.png differ diff --git a/content-rst/developer/tutorials/discover_js_framework/01_owl_components/generic_card.png b/content-rst/developer/tutorials/discover_js_framework/01_owl_components/generic_card.png new file mode 100644 index 000000000..ad079e95d Binary files /dev/null and b/content-rst/developer/tutorials/discover_js_framework/01_owl_components/generic_card.png differ diff --git a/content-rst/developer/tutorials/discover_js_framework/01_owl_components/markup.png b/content-rst/developer/tutorials/discover_js_framework/01_owl_components/markup.png new file mode 100644 index 000000000..bd8fea06f Binary files /dev/null and b/content-rst/developer/tutorials/discover_js_framework/01_owl_components/markup.png differ diff --git a/content-rst/developer/tutorials/discover_js_framework/01_owl_components/muted_todo.png b/content-rst/developer/tutorials/discover_js_framework/01_owl_components/muted_todo.png new file mode 100644 index 000000000..e732e4cfa Binary files /dev/null and b/content-rst/developer/tutorials/discover_js_framework/01_owl_components/muted_todo.png differ diff --git a/content-rst/developer/tutorials/discover_js_framework/01_owl_components/simple_card.png b/content-rst/developer/tutorials/discover_js_framework/01_owl_components/simple_card.png new file mode 100644 index 000000000..8cff4e90d Binary files /dev/null and b/content-rst/developer/tutorials/discover_js_framework/01_owl_components/simple_card.png differ diff --git a/content-rst/developer/tutorials/discover_js_framework/01_owl_components/sum_counter.png b/content-rst/developer/tutorials/discover_js_framework/01_owl_components/sum_counter.png new file mode 100644 index 000000000..9948016ca Binary files /dev/null and b/content-rst/developer/tutorials/discover_js_framework/01_owl_components/sum_counter.png differ diff --git a/content-rst/developer/tutorials/discover_js_framework/01_owl_components/todo_list.png b/content-rst/developer/tutorials/discover_js_framework/01_owl_components/todo_list.png new file mode 100644 index 000000000..6d77ee395 Binary files /dev/null and b/content-rst/developer/tutorials/discover_js_framework/01_owl_components/todo_list.png differ diff --git a/content-rst/developer/tutorials/discover_js_framework/01_owl_components/toggle_card.png b/content-rst/developer/tutorials/discover_js_framework/01_owl_components/toggle_card.png new file mode 100644 index 000000000..6048b38c7 Binary files /dev/null and b/content-rst/developer/tutorials/discover_js_framework/01_owl_components/toggle_card.png differ diff --git a/content-rst/developer/tutorials/discover_js_framework/01_owl_components/toggle_todo.png b/content-rst/developer/tutorials/discover_js_framework/01_owl_components/toggle_todo.png new file mode 100644 index 000000000..594b6c8ae Binary files /dev/null and b/content-rst/developer/tutorials/discover_js_framework/01_owl_components/toggle_todo.png differ diff --git a/content/developer/tutorials/discover_js_framework/02_build_a_dashboard.rst b/content-rst/developer/tutorials/discover_js_framework/02_build_a_dashboard.rst similarity index 100% rename from content/developer/tutorials/discover_js_framework/02_build_a_dashboard.rst rename to content-rst/developer/tutorials/discover_js_framework/02_build_a_dashboard.rst diff --git a/content-rst/developer/tutorials/discover_js_framework/02_build_a_dashboard/dashboard_item.png b/content-rst/developer/tutorials/discover_js_framework/02_build_a_dashboard/dashboard_item.png new file mode 100644 index 000000000..1524ca5b0 Binary files /dev/null and b/content-rst/developer/tutorials/discover_js_framework/02_build_a_dashboard/dashboard_item.png differ diff --git a/content-rst/developer/tutorials/discover_js_framework/02_build_a_dashboard/items_configuration.png b/content-rst/developer/tutorials/discover_js_framework/02_build_a_dashboard/items_configuration.png new file mode 100644 index 000000000..a828a187b Binary files /dev/null and b/content-rst/developer/tutorials/discover_js_framework/02_build_a_dashboard/items_configuration.png differ diff --git a/content-rst/developer/tutorials/discover_js_framework/02_build_a_dashboard/navigation_buttons.png b/content-rst/developer/tutorials/discover_js_framework/02_build_a_dashboard/navigation_buttons.png new file mode 100644 index 000000000..79d0221d2 Binary files /dev/null and b/content-rst/developer/tutorials/discover_js_framework/02_build_a_dashboard/navigation_buttons.png differ diff --git a/content-rst/developer/tutorials/discover_js_framework/02_build_a_dashboard/new_layout.png b/content-rst/developer/tutorials/discover_js_framework/02_build_a_dashboard/new_layout.png new file mode 100644 index 000000000..7bfd81287 Binary files /dev/null and b/content-rst/developer/tutorials/discover_js_framework/02_build_a_dashboard/new_layout.png differ diff --git a/content-rst/developer/tutorials/discover_js_framework/02_build_a_dashboard/overview_02.png b/content-rst/developer/tutorials/discover_js_framework/02_build_a_dashboard/overview_02.png new file mode 100644 index 000000000..bd618027c Binary files /dev/null and b/content-rst/developer/tutorials/discover_js_framework/02_build_a_dashboard/overview_02.png differ diff --git a/content-rst/developer/tutorials/discover_js_framework/02_build_a_dashboard/pie_chart.png b/content-rst/developer/tutorials/discover_js_framework/02_build_a_dashboard/pie_chart.png new file mode 100644 index 000000000..ba56ded24 Binary files /dev/null and b/content-rst/developer/tutorials/discover_js_framework/02_build_a_dashboard/pie_chart.png differ diff --git a/content-rst/developer/tutorials/discover_js_framework/02_build_a_dashboard/previously_learned.svg b/content-rst/developer/tutorials/discover_js_framework/02_build_a_dashboard/previously_learned.svg new file mode 100644 index 000000000..b39468b86 --- /dev/null +++ b/content-rst/developer/tutorials/discover_js_framework/02_build_a_dashboard/previously_learned.svg @@ -0,0 +1 @@ +
Owl
Component
Template
Hook
Slot
Event
Odoo JavaScript framework
\ No newline at end of file diff --git a/content-rst/developer/tutorials/discover_js_framework/02_build_a_dashboard/statistics.png b/content-rst/developer/tutorials/discover_js_framework/02_build_a_dashboard/statistics.png new file mode 100644 index 000000000..d05fa928f Binary files /dev/null and b/content-rst/developer/tutorials/discover_js_framework/02_build_a_dashboard/statistics.png differ diff --git a/content/developer/tutorials/importable_modules.rst b/content-rst/developer/tutorials/importable_modules.rst similarity index 100% rename from content/developer/tutorials/importable_modules.rst rename to content-rst/developer/tutorials/importable_modules.rst diff --git a/content-rst/developer/tutorials/importable_modules/offer_accept_button.png b/content-rst/developer/tutorials/importable_modules/offer_accept_button.png new file mode 100644 index 000000000..147245ca5 Binary files /dev/null and b/content-rst/developer/tutorials/importable_modules/offer_accept_button.png differ diff --git a/content/developer/tutorials/master_odoo_web_framework.rst b/content-rst/developer/tutorials/master_odoo_web_framework.rst similarity index 100% rename from content/developer/tutorials/master_odoo_web_framework.rst rename to content-rst/developer/tutorials/master_odoo_web_framework.rst diff --git a/content/developer/tutorials/master_odoo_web_framework/01_build_clicker_game.rst b/content-rst/developer/tutorials/master_odoo_web_framework/01_build_clicker_game.rst similarity index 100% rename from content/developer/tutorials/master_odoo_web_framework/01_build_clicker_game.rst rename to content-rst/developer/tutorials/master_odoo_web_framework/01_build_clicker_game.rst diff --git a/content-rst/developer/tutorials/master_odoo_web_framework/01_build_clicker_game/bigbot.png b/content-rst/developer/tutorials/master_odoo_web_framework/01_build_clicker_game/bigbot.png new file mode 100644 index 000000000..77ae8dc00 Binary files /dev/null and b/content-rst/developer/tutorials/master_odoo_web_framework/01_build_clicker_game/bigbot.png differ diff --git a/content-rst/developer/tutorials/master_odoo_web_framework/01_build_clicker_game/clickbot.png b/content-rst/developer/tutorials/master_odoo_web_framework/01_build_clicker_game/clickbot.png new file mode 100644 index 000000000..fc7217485 Binary files /dev/null and b/content-rst/developer/tutorials/master_odoo_web_framework/01_build_clicker_game/clickbot.png differ diff --git a/content-rst/developer/tutorials/master_odoo_web_framework/01_build_clicker_game/client_action.png b/content-rst/developer/tutorials/master_odoo_web_framework/01_build_clicker_game/client_action.png new file mode 100644 index 000000000..434a19213 Binary files /dev/null and b/content-rst/developer/tutorials/master_odoo_web_framework/01_build_clicker_game/client_action.png differ diff --git a/content-rst/developer/tutorials/master_odoo_web_framework/01_build_clicker_game/command_palette.png b/content-rst/developer/tutorials/master_odoo_web_framework/01_build_clicker_game/command_palette.png new file mode 100644 index 000000000..31c3a9ea3 Binary files /dev/null and b/content-rst/developer/tutorials/master_odoo_web_framework/01_build_clicker_game/command_palette.png differ diff --git a/content-rst/developer/tutorials/master_odoo_web_framework/01_build_clicker_game/dropdown.png b/content-rst/developer/tutorials/master_odoo_web_framework/01_build_clicker_game/dropdown.png new file mode 100644 index 000000000..1cdeddc40 Binary files /dev/null and b/content-rst/developer/tutorials/master_odoo_web_framework/01_build_clicker_game/dropdown.png differ diff --git a/content-rst/developer/tutorials/master_odoo_web_framework/01_build_clicker_game/final.png b/content-rst/developer/tutorials/master_odoo_web_framework/01_build_clicker_game/final.png new file mode 100644 index 000000000..f40107a7f Binary files /dev/null and b/content-rst/developer/tutorials/master_odoo_web_framework/01_build_clicker_game/final.png differ diff --git a/content-rst/developer/tutorials/master_odoo_web_framework/01_build_clicker_game/humanized_number.png b/content-rst/developer/tutorials/master_odoo_web_framework/01_build_clicker_game/humanized_number.png new file mode 100644 index 000000000..f51cf9c99 Binary files /dev/null and b/content-rst/developer/tutorials/master_odoo_web_framework/01_build_clicker_game/humanized_number.png differ diff --git a/content-rst/developer/tutorials/master_odoo_web_framework/01_build_clicker_game/humanized_tooltip.png b/content-rst/developer/tutorials/master_odoo_web_framework/01_build_clicker_game/humanized_tooltip.png new file mode 100644 index 000000000..b11e5d522 Binary files /dev/null and b/content-rst/developer/tutorials/master_odoo_web_framework/01_build_clicker_game/humanized_tooltip.png differ diff --git a/content-rst/developer/tutorials/master_odoo_web_framework/01_build_clicker_game/increment_button.png b/content-rst/developer/tutorials/master_odoo_web_framework/01_build_clicker_game/increment_button.png new file mode 100644 index 000000000..1d96e7aa0 Binary files /dev/null and b/content-rst/developer/tutorials/master_odoo_web_framework/01_build_clicker_game/increment_button.png differ diff --git a/content-rst/developer/tutorials/master_odoo_web_framework/01_build_clicker_game/milestone.png b/content-rst/developer/tutorials/master_odoo_web_framework/01_build_clicker_game/milestone.png new file mode 100644 index 000000000..cc11eda36 Binary files /dev/null and b/content-rst/developer/tutorials/master_odoo_web_framework/01_build_clicker_game/milestone.png differ diff --git a/content-rst/developer/tutorials/master_odoo_web_framework/01_build_clicker_game/notebook.png b/content-rst/developer/tutorials/master_odoo_web_framework/01_build_clicker_game/notebook.png new file mode 100644 index 000000000..101be3bd3 Binary files /dev/null and b/content-rst/developer/tutorials/master_odoo_web_framework/01_build_clicker_game/notebook.png differ diff --git a/content-rst/developer/tutorials/master_odoo_web_framework/01_build_clicker_game/peach_tree.png b/content-rst/developer/tutorials/master_odoo_web_framework/01_build_clicker_game/peach_tree.png new file mode 100644 index 000000000..7ccbe51a7 Binary files /dev/null and b/content-rst/developer/tutorials/master_odoo_web_framework/01_build_clicker_game/peach_tree.png differ diff --git a/content-rst/developer/tutorials/master_odoo_web_framework/01_build_clicker_game/reward.png b/content-rst/developer/tutorials/master_odoo_web_framework/01_build_clicker_game/reward.png new file mode 100644 index 000000000..bdd85e241 Binary files /dev/null and b/content-rst/developer/tutorials/master_odoo_web_framework/01_build_clicker_game/reward.png differ diff --git a/content-rst/developer/tutorials/master_odoo_web_framework/01_build_clicker_game/systray.png b/content-rst/developer/tutorials/master_odoo_web_framework/01_build_clicker_game/systray.png new file mode 100644 index 000000000..06b40b440 Binary files /dev/null and b/content-rst/developer/tutorials/master_odoo_web_framework/01_build_clicker_game/systray.png differ diff --git a/content-rst/developer/tutorials/master_odoo_web_framework/01_build_clicker_game/trees.png b/content-rst/developer/tutorials/master_odoo_web_framework/01_build_clicker_game/trees.png new file mode 100644 index 000000000..35b39ce16 Binary files /dev/null and b/content-rst/developer/tutorials/master_odoo_web_framework/01_build_clicker_game/trees.png differ diff --git a/content/developer/tutorials/master_odoo_web_framework/02_create_gallery_view.rst b/content-rst/developer/tutorials/master_odoo_web_framework/02_create_gallery_view.rst similarity index 100% rename from content/developer/tutorials/master_odoo_web_framework/02_create_gallery_view.rst rename to content-rst/developer/tutorials/master_odoo_web_framework/02_create_gallery_view.rst diff --git a/content-rst/developer/tutorials/master_odoo_web_framework/02_create_gallery_view/advanced_tooltip.png b/content-rst/developer/tutorials/master_odoo_web_framework/02_create_gallery_view/advanced_tooltip.png new file mode 100644 index 000000000..73d599e0b Binary files /dev/null and b/content-rst/developer/tutorials/master_odoo_web_framework/02_create_gallery_view/advanced_tooltip.png differ diff --git a/content-rst/developer/tutorials/master_odoo_web_framework/02_create_gallery_view/gallery_data.png b/content-rst/developer/tutorials/master_odoo_web_framework/02_create_gallery_view/gallery_data.png new file mode 100644 index 000000000..79f757abf Binary files /dev/null and b/content-rst/developer/tutorials/master_odoo_web_framework/02_create_gallery_view/gallery_data.png differ diff --git a/content-rst/developer/tutorials/master_odoo_web_framework/02_create_gallery_view/image_tooltip.png b/content-rst/developer/tutorials/master_odoo_web_framework/02_create_gallery_view/image_tooltip.png new file mode 100644 index 000000000..c5cd690bd Binary files /dev/null and b/content-rst/developer/tutorials/master_odoo_web_framework/02_create_gallery_view/image_tooltip.png differ diff --git a/content-rst/developer/tutorials/master_odoo_web_framework/02_create_gallery_view/layout.png b/content-rst/developer/tutorials/master_odoo_web_framework/02_create_gallery_view/layout.png new file mode 100644 index 000000000..5d5e1bbda Binary files /dev/null and b/content-rst/developer/tutorials/master_odoo_web_framework/02_create_gallery_view/layout.png differ diff --git a/content-rst/developer/tutorials/master_odoo_web_framework/02_create_gallery_view/new_view.png b/content-rst/developer/tutorials/master_odoo_web_framework/02_create_gallery_view/new_view.png new file mode 100644 index 000000000..eeec6fb71 Binary files /dev/null and b/content-rst/developer/tutorials/master_odoo_web_framework/02_create_gallery_view/new_view.png differ diff --git a/content-rst/developer/tutorials/master_odoo_web_framework/02_create_gallery_view/overview.png b/content-rst/developer/tutorials/master_odoo_web_framework/02_create_gallery_view/overview.png new file mode 100644 index 000000000..1aa49565c Binary files /dev/null and b/content-rst/developer/tutorials/master_odoo_web_framework/02_create_gallery_view/overview.png differ diff --git a/content-rst/developer/tutorials/master_odoo_web_framework/02_create_gallery_view/pagination.png b/content-rst/developer/tutorials/master_odoo_web_framework/02_create_gallery_view/pagination.png new file mode 100644 index 000000000..a4b70ca6e Binary files /dev/null and b/content-rst/developer/tutorials/master_odoo_web_framework/02_create_gallery_view/pagination.png differ diff --git a/content-rst/developer/tutorials/master_odoo_web_framework/02_create_gallery_view/tshirt_images.png b/content-rst/developer/tutorials/master_odoo_web_framework/02_create_gallery_view/tshirt_images.png new file mode 100644 index 000000000..d3039ee31 Binary files /dev/null and b/content-rst/developer/tutorials/master_odoo_web_framework/02_create_gallery_view/tshirt_images.png differ diff --git a/content-rst/developer/tutorials/master_odoo_web_framework/02_create_gallery_view/upload_image.png b/content-rst/developer/tutorials/master_odoo_web_framework/02_create_gallery_view/upload_image.png new file mode 100644 index 000000000..decc5db24 Binary files /dev/null and b/content-rst/developer/tutorials/master_odoo_web_framework/02_create_gallery_view/upload_image.png differ diff --git a/content-rst/developer/tutorials/master_odoo_web_framework/02_create_gallery_view/view_button.png b/content-rst/developer/tutorials/master_odoo_web_framework/02_create_gallery_view/view_button.png new file mode 100644 index 000000000..efc2ecd12 Binary files /dev/null and b/content-rst/developer/tutorials/master_odoo_web_framework/02_create_gallery_view/view_button.png differ diff --git a/content/developer/tutorials/master_odoo_web_framework/03_customize_kanban_view.rst b/content-rst/developer/tutorials/master_odoo_web_framework/03_customize_kanban_view.rst similarity index 100% rename from content/developer/tutorials/master_odoo_web_framework/03_customize_kanban_view.rst rename to content-rst/developer/tutorials/master_odoo_web_framework/03_customize_kanban_view.rst diff --git a/content-rst/developer/tutorials/master_odoo_web_framework/03_customize_kanban_view/active_customer.png b/content-rst/developer/tutorials/master_odoo_web_framework/03_customize_kanban_view/active_customer.png new file mode 100644 index 000000000..df7d96b94 Binary files /dev/null and b/content-rst/developer/tutorials/master_odoo_web_framework/03_customize_kanban_view/active_customer.png differ diff --git a/content-rst/developer/tutorials/master_odoo_web_framework/03_customize_kanban_view/customer_data.png b/content-rst/developer/tutorials/master_odoo_web_framework/03_customize_kanban_view/customer_data.png new file mode 100644 index 000000000..c6936e284 Binary files /dev/null and b/content-rst/developer/tutorials/master_odoo_web_framework/03_customize_kanban_view/customer_data.png differ diff --git a/content-rst/developer/tutorials/master_odoo_web_framework/03_customize_kanban_view/customer_filter.png b/content-rst/developer/tutorials/master_odoo_web_framework/03_customize_kanban_view/customer_filter.png new file mode 100644 index 000000000..370b8fe2f Binary files /dev/null and b/content-rst/developer/tutorials/master_odoo_web_framework/03_customize_kanban_view/customer_filter.png differ diff --git a/content-rst/developer/tutorials/master_odoo_web_framework/03_customize_kanban_view/customer_list_component.png b/content-rst/developer/tutorials/master_odoo_web_framework/03_customize_kanban_view/customer_list_component.png new file mode 100644 index 000000000..a34750f5f Binary files /dev/null and b/content-rst/developer/tutorials/master_odoo_web_framework/03_customize_kanban_view/customer_list_component.png differ diff --git a/content-rst/developer/tutorials/master_odoo_web_framework/03_customize_kanban_view/customer_pager.png b/content-rst/developer/tutorials/master_odoo_web_framework/03_customize_kanban_view/customer_pager.png new file mode 100644 index 000000000..e35628814 Binary files /dev/null and b/content-rst/developer/tutorials/master_odoo_web_framework/03_customize_kanban_view/customer_pager.png differ diff --git a/content-rst/developer/tutorials/master_odoo_web_framework/03_customize_kanban_view/customer_search.png b/content-rst/developer/tutorials/master_odoo_web_framework/03_customize_kanban_view/customer_search.png new file mode 100644 index 000000000..46e9bb433 Binary files /dev/null and b/content-rst/developer/tutorials/master_odoo_web_framework/03_customize_kanban_view/customer_search.png differ diff --git a/content-rst/developer/tutorials/master_odoo_web_framework/03_customize_kanban_view/overview.png b/content-rst/developer/tutorials/master_odoo_web_framework/03_customize_kanban_view/overview.png new file mode 100644 index 000000000..e610116e1 Binary files /dev/null and b/content-rst/developer/tutorials/master_odoo_web_framework/03_customize_kanban_view/overview.png differ diff --git a/content/developer/tutorials/mixins.rst b/content-rst/developer/tutorials/mixins.rst similarity index 100% rename from content/developer/tutorials/mixins.rst rename to content-rst/developer/tutorials/mixins.rst diff --git a/content/developer/tutorials/pdf_reports.rst b/content-rst/developer/tutorials/pdf_reports.rst similarity index 100% rename from content/developer/tutorials/pdf_reports.rst rename to content-rst/developer/tutorials/pdf_reports.rst diff --git a/content-rst/developer/tutorials/pdf_reports/inherited_report.png b/content-rst/developer/tutorials/pdf_reports/inherited_report.png new file mode 100644 index 000000000..92230e732 Binary files /dev/null and b/content-rst/developer/tutorials/pdf_reports/inherited_report.png differ diff --git a/content-rst/developer/tutorials/pdf_reports/print_menu.png b/content-rst/developer/tutorials/pdf_reports/print_menu.png new file mode 100644 index 000000000..7a015dbef Binary files /dev/null and b/content-rst/developer/tutorials/pdf_reports/print_menu.png differ diff --git a/content-rst/developer/tutorials/pdf_reports/report_subtemplate.png b/content-rst/developer/tutorials/pdf_reports/report_subtemplate.png new file mode 100644 index 000000000..300424c01 Binary files /dev/null and b/content-rst/developer/tutorials/pdf_reports/report_subtemplate.png differ diff --git a/content-rst/developer/tutorials/pdf_reports/simple_report.png b/content-rst/developer/tutorials/pdf_reports/simple_report.png new file mode 100644 index 000000000..2679e978d Binary files /dev/null and b/content-rst/developer/tutorials/pdf_reports/simple_report.png differ diff --git a/content/developer/tutorials/restrict_data_access.rst b/content-rst/developer/tutorials/restrict_data_access.rst similarity index 100% rename from content/developer/tutorials/restrict_data_access.rst rename to content-rst/developer/tutorials/restrict_data_access.rst diff --git a/content-rst/developer/tutorials/restrict_data_access/agent.png b/content-rst/developer/tutorials/restrict_data_access/agent.png new file mode 100644 index 000000000..62269e8f8 Binary files /dev/null and b/content-rst/developer/tutorials/restrict_data_access/agent.png differ diff --git a/content-rst/developer/tutorials/restrict_data_access/error.png b/content-rst/developer/tutorials/restrict_data_access/error.png new file mode 100644 index 000000000..8e84669ac Binary files /dev/null and b/content-rst/developer/tutorials/restrict_data_access/error.png differ diff --git a/content-rst/developer/tutorials/restrict_data_access/groups.png b/content-rst/developer/tutorials/restrict_data_access/groups.png new file mode 100644 index 000000000..af02c7290 Binary files /dev/null and b/content-rst/developer/tutorials/restrict_data_access/groups.png differ diff --git a/content/developer/tutorials/server_framework_101.rst b/content-rst/developer/tutorials/server_framework_101.rst similarity index 100% rename from content/developer/tutorials/server_framework_101.rst rename to content-rst/developer/tutorials/server_framework_101.rst diff --git a/content/developer/tutorials/server_framework_101/01_architecture.rst b/content-rst/developer/tutorials/server_framework_101/01_architecture.rst similarity index 100% rename from content/developer/tutorials/server_framework_101/01_architecture.rst rename to content-rst/developer/tutorials/server_framework_101/01_architecture.rst diff --git a/content-rst/developer/tutorials/server_framework_101/01_architecture/three_tier.svg b/content-rst/developer/tutorials/server_framework_101/01_architecture/three_tier.svg new file mode 100644 index 000000000..5c98f57e0 --- /dev/null +++ b/content-rst/developer/tutorials/server_framework_101/01_architecture/three_tier.svg @@ -0,0 +1,253 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Database + Storage + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + >GET SALES TOTAL + >GET SALES TOTAL + GET LIST OF ALLSALES MADELAST YEAR + ADD ALL SALESTOGETHER + 4 TOTAL SALES + QUERY + SALE 1SALE 2SALE 3SALE 4 + + + Data tier + Presentation tier + Logic tier + This layer coordinates the application, processes commands, makes logical decisions and evaluations, and performs calculations. It also moves and processes data between the two surrounding layers. + Here information is stored and retrieved from a database or file system. The information is then passed back to the logic tier for processing, and then eventually back to the user. + The top-most level of the applicationis the user interface. The main functionof the interface is to translate tasks and results to something the user can understand. + + \ No newline at end of file diff --git a/content/developer/tutorials/server_framework_101/02_newapp.rst b/content-rst/developer/tutorials/server_framework_101/02_newapp.rst similarity index 100% rename from content/developer/tutorials/server_framework_101/02_newapp.rst rename to content-rst/developer/tutorials/server_framework_101/02_newapp.rst diff --git a/content-rst/developer/tutorials/server_framework_101/02_newapp/app_in_list.png b/content-rst/developer/tutorials/server_framework_101/02_newapp/app_in_list.png new file mode 100644 index 000000000..90baeeaca Binary files /dev/null and b/content-rst/developer/tutorials/server_framework_101/02_newapp/app_in_list.png differ diff --git a/content-rst/developer/tutorials/server_framework_101/02_newapp/overview_form_view_01.png b/content-rst/developer/tutorials/server_framework_101/02_newapp/overview_form_view_01.png new file mode 100644 index 000000000..1ec543d7c Binary files /dev/null and b/content-rst/developer/tutorials/server_framework_101/02_newapp/overview_form_view_01.png differ diff --git a/content-rst/developer/tutorials/server_framework_101/02_newapp/overview_form_view_02.png b/content-rst/developer/tutorials/server_framework_101/02_newapp/overview_form_view_02.png new file mode 100644 index 000000000..05ea60bc2 Binary files /dev/null and b/content-rst/developer/tutorials/server_framework_101/02_newapp/overview_form_view_02.png differ diff --git a/content-rst/developer/tutorials/server_framework_101/02_newapp/overview_list_view_01.png b/content-rst/developer/tutorials/server_framework_101/02_newapp/overview_list_view_01.png new file mode 100644 index 000000000..935b84a0a Binary files /dev/null and b/content-rst/developer/tutorials/server_framework_101/02_newapp/overview_list_view_01.png differ diff --git a/content/developer/tutorials/server_framework_101/03_basicmodel.rst b/content-rst/developer/tutorials/server_framework_101/03_basicmodel.rst similarity index 100% rename from content/developer/tutorials/server_framework_101/03_basicmodel.rst rename to content-rst/developer/tutorials/server_framework_101/03_basicmodel.rst diff --git a/content/developer/tutorials/server_framework_101/04_securityintro.rst b/content-rst/developer/tutorials/server_framework_101/04_securityintro.rst similarity index 100% rename from content/developer/tutorials/server_framework_101/04_securityintro.rst rename to content-rst/developer/tutorials/server_framework_101/04_securityintro.rst diff --git a/content/developer/tutorials/server_framework_101/05_firstui.rst b/content-rst/developer/tutorials/server_framework_101/05_firstui.rst similarity index 100% rename from content/developer/tutorials/server_framework_101/05_firstui.rst rename to content-rst/developer/tutorials/server_framework_101/05_firstui.rst diff --git a/content-rst/developer/tutorials/server_framework_101/05_firstui/attribute_and_default.gif b/content-rst/developer/tutorials/server_framework_101/05_firstui/attribute_and_default.gif new file mode 100644 index 000000000..318890988 Binary files /dev/null and b/content-rst/developer/tutorials/server_framework_101/05_firstui/attribute_and_default.gif differ diff --git a/content-rst/developer/tutorials/server_framework_101/05_firstui/estate_form_default.png b/content-rst/developer/tutorials/server_framework_101/05_firstui/estate_form_default.png new file mode 100644 index 000000000..5923f8ac5 Binary files /dev/null and b/content-rst/developer/tutorials/server_framework_101/05_firstui/estate_form_default.png differ diff --git a/content-rst/developer/tutorials/server_framework_101/05_firstui/estate_menu_action.png b/content-rst/developer/tutorials/server_framework_101/05_firstui/estate_menu_action.png new file mode 100644 index 000000000..858fb7821 Binary files /dev/null and b/content-rst/developer/tutorials/server_framework_101/05_firstui/estate_menu_action.png differ diff --git a/content-rst/developer/tutorials/server_framework_101/05_firstui/estate_menu_root.png b/content-rst/developer/tutorials/server_framework_101/05_firstui/estate_menu_root.png new file mode 100644 index 000000000..aef7992af Binary files /dev/null and b/content-rst/developer/tutorials/server_framework_101/05_firstui/estate_menu_root.png differ diff --git a/content-rst/developer/tutorials/server_framework_101/05_firstui/inactive.gif b/content-rst/developer/tutorials/server_framework_101/05_firstui/inactive.gif new file mode 100644 index 000000000..efac9fd81 Binary files /dev/null and b/content-rst/developer/tutorials/server_framework_101/05_firstui/inactive.gif differ diff --git a/content-rst/developer/tutorials/server_framework_101/05_firstui/menu_01.png b/content-rst/developer/tutorials/server_framework_101/05_firstui/menu_01.png new file mode 100644 index 000000000..289bc1eee Binary files /dev/null and b/content-rst/developer/tutorials/server_framework_101/05_firstui/menu_01.png differ diff --git a/content-rst/developer/tutorials/server_framework_101/05_firstui/menu_02.png b/content-rst/developer/tutorials/server_framework_101/05_firstui/menu_02.png new file mode 100644 index 000000000..c46b52af7 Binary files /dev/null and b/content-rst/developer/tutorials/server_framework_101/05_firstui/menu_02.png differ diff --git a/content/developer/tutorials/server_framework_101/06_basicviews.rst b/content-rst/developer/tutorials/server_framework_101/06_basicviews.rst similarity index 100% rename from content/developer/tutorials/server_framework_101/06_basicviews.rst rename to content-rst/developer/tutorials/server_framework_101/06_basicviews.rst diff --git a/content-rst/developer/tutorials/server_framework_101/06_basicviews/form.png b/content-rst/developer/tutorials/server_framework_101/06_basicviews/form.png new file mode 100644 index 000000000..8d7fb5541 Binary files /dev/null and b/content-rst/developer/tutorials/server_framework_101/06_basicviews/form.png differ diff --git a/content-rst/developer/tutorials/server_framework_101/06_basicviews/list.png b/content-rst/developer/tutorials/server_framework_101/06_basicviews/list.png new file mode 100644 index 000000000..aedde67fc Binary files /dev/null and b/content-rst/developer/tutorials/server_framework_101/06_basicviews/list.png differ diff --git a/content-rst/developer/tutorials/server_framework_101/06_basicviews/search_01.png b/content-rst/developer/tutorials/server_framework_101/06_basicviews/search_01.png new file mode 100644 index 000000000..0a67c48a9 Binary files /dev/null and b/content-rst/developer/tutorials/server_framework_101/06_basicviews/search_01.png differ diff --git a/content-rst/developer/tutorials/server_framework_101/06_basicviews/search_02.png b/content-rst/developer/tutorials/server_framework_101/06_basicviews/search_02.png new file mode 100644 index 000000000..47f2f9b57 Binary files /dev/null and b/content-rst/developer/tutorials/server_framework_101/06_basicviews/search_02.png differ diff --git a/content-rst/developer/tutorials/server_framework_101/06_basicviews/search_03.png b/content-rst/developer/tutorials/server_framework_101/06_basicviews/search_03.png new file mode 100644 index 000000000..8b9840f59 Binary files /dev/null and b/content-rst/developer/tutorials/server_framework_101/06_basicviews/search_03.png differ diff --git a/content/developer/tutorials/server_framework_101/07_relations.rst b/content-rst/developer/tutorials/server_framework_101/07_relations.rst similarity index 100% rename from content/developer/tutorials/server_framework_101/07_relations.rst rename to content-rst/developer/tutorials/server_framework_101/07_relations.rst diff --git a/content-rst/developer/tutorials/server_framework_101/07_relations/property_many2many.png b/content-rst/developer/tutorials/server_framework_101/07_relations/property_many2many.png new file mode 100644 index 000000000..189a38355 Binary files /dev/null and b/content-rst/developer/tutorials/server_framework_101/07_relations/property_many2many.png differ diff --git a/content-rst/developer/tutorials/server_framework_101/07_relations/property_many2one.png b/content-rst/developer/tutorials/server_framework_101/07_relations/property_many2one.png new file mode 100644 index 000000000..b9b947e07 Binary files /dev/null and b/content-rst/developer/tutorials/server_framework_101/07_relations/property_many2one.png differ diff --git a/content-rst/developer/tutorials/server_framework_101/07_relations/property_offer.png b/content-rst/developer/tutorials/server_framework_101/07_relations/property_offer.png new file mode 100644 index 000000000..dad5b29e3 Binary files /dev/null and b/content-rst/developer/tutorials/server_framework_101/07_relations/property_offer.png differ diff --git a/content-rst/developer/tutorials/server_framework_101/07_relations/property_tag.png b/content-rst/developer/tutorials/server_framework_101/07_relations/property_tag.png new file mode 100644 index 000000000..dd128ae8b Binary files /dev/null and b/content-rst/developer/tutorials/server_framework_101/07_relations/property_tag.png differ diff --git a/content-rst/developer/tutorials/server_framework_101/07_relations/property_type.png b/content-rst/developer/tutorials/server_framework_101/07_relations/property_type.png new file mode 100644 index 000000000..350128fc9 Binary files /dev/null and b/content-rst/developer/tutorials/server_framework_101/07_relations/property_type.png differ diff --git a/content/developer/tutorials/server_framework_101/08_compute_onchange.rst b/content-rst/developer/tutorials/server_framework_101/08_compute_onchange.rst similarity index 100% rename from content/developer/tutorials/server_framework_101/08_compute_onchange.rst rename to content-rst/developer/tutorials/server_framework_101/08_compute_onchange.rst diff --git a/content-rst/developer/tutorials/server_framework_101/08_compute_onchange/compute.gif b/content-rst/developer/tutorials/server_framework_101/08_compute_onchange/compute.gif new file mode 100644 index 000000000..46cf10ecf Binary files /dev/null and b/content-rst/developer/tutorials/server_framework_101/08_compute_onchange/compute.gif differ diff --git a/content-rst/developer/tutorials/server_framework_101/08_compute_onchange/compute_inverse.gif b/content-rst/developer/tutorials/server_framework_101/08_compute_onchange/compute_inverse.gif new file mode 100644 index 000000000..3c9071627 Binary files /dev/null and b/content-rst/developer/tutorials/server_framework_101/08_compute_onchange/compute_inverse.gif differ diff --git a/content-rst/developer/tutorials/server_framework_101/08_compute_onchange/onchange.gif b/content-rst/developer/tutorials/server_framework_101/08_compute_onchange/onchange.gif new file mode 100644 index 000000000..eac5f8c12 Binary files /dev/null and b/content-rst/developer/tutorials/server_framework_101/08_compute_onchange/onchange.gif differ diff --git a/content/developer/tutorials/server_framework_101/09_actions.rst b/content-rst/developer/tutorials/server_framework_101/09_actions.rst similarity index 100% rename from content/developer/tutorials/server_framework_101/09_actions.rst rename to content-rst/developer/tutorials/server_framework_101/09_actions.rst diff --git a/content-rst/developer/tutorials/server_framework_101/09_actions/offer_01.gif b/content-rst/developer/tutorials/server_framework_101/09_actions/offer_01.gif new file mode 100644 index 000000000..661b8318c Binary files /dev/null and b/content-rst/developer/tutorials/server_framework_101/09_actions/offer_01.gif differ diff --git a/content-rst/developer/tutorials/server_framework_101/09_actions/offer_02.gif b/content-rst/developer/tutorials/server_framework_101/09_actions/offer_02.gif new file mode 100644 index 000000000..d6be0b3a2 Binary files /dev/null and b/content-rst/developer/tutorials/server_framework_101/09_actions/offer_02.gif differ diff --git a/content-rst/developer/tutorials/server_framework_101/09_actions/property.gif b/content-rst/developer/tutorials/server_framework_101/09_actions/property.gif new file mode 100644 index 000000000..f3c942ad4 Binary files /dev/null and b/content-rst/developer/tutorials/server_framework_101/09_actions/property.gif differ diff --git a/content/developer/tutorials/server_framework_101/10_constraints.rst b/content-rst/developer/tutorials/server_framework_101/10_constraints.rst similarity index 100% rename from content/developer/tutorials/server_framework_101/10_constraints.rst rename to content-rst/developer/tutorials/server_framework_101/10_constraints.rst diff --git a/content-rst/developer/tutorials/server_framework_101/10_constraints/python.gif b/content-rst/developer/tutorials/server_framework_101/10_constraints/python.gif new file mode 100644 index 000000000..0da2aede1 Binary files /dev/null and b/content-rst/developer/tutorials/server_framework_101/10_constraints/python.gif differ diff --git a/content-rst/developer/tutorials/server_framework_101/10_constraints/sql_01.gif b/content-rst/developer/tutorials/server_framework_101/10_constraints/sql_01.gif new file mode 100644 index 000000000..a9daf99cc Binary files /dev/null and b/content-rst/developer/tutorials/server_framework_101/10_constraints/sql_01.gif differ diff --git a/content-rst/developer/tutorials/server_framework_101/10_constraints/sql_02.gif b/content-rst/developer/tutorials/server_framework_101/10_constraints/sql_02.gif new file mode 100644 index 000000000..aff60f466 Binary files /dev/null and b/content-rst/developer/tutorials/server_framework_101/10_constraints/sql_02.gif differ diff --git a/content/developer/tutorials/server_framework_101/11_sprinkles.rst b/content-rst/developer/tutorials/server_framework_101/11_sprinkles.rst similarity index 100% rename from content/developer/tutorials/server_framework_101/11_sprinkles.rst rename to content-rst/developer/tutorials/server_framework_101/11_sprinkles.rst diff --git a/content-rst/developer/tutorials/server_framework_101/11_sprinkles/decoration.png b/content-rst/developer/tutorials/server_framework_101/11_sprinkles/decoration.png new file mode 100644 index 000000000..3aaa731d3 Binary files /dev/null and b/content-rst/developer/tutorials/server_framework_101/11_sprinkles/decoration.png differ diff --git a/content-rst/developer/tutorials/server_framework_101/11_sprinkles/editable_list.gif b/content-rst/developer/tutorials/server_framework_101/11_sprinkles/editable_list.gif new file mode 100644 index 000000000..cb0308e9c Binary files /dev/null and b/content-rst/developer/tutorials/server_framework_101/11_sprinkles/editable_list.gif differ diff --git a/content-rst/developer/tutorials/server_framework_101/11_sprinkles/form.gif b/content-rst/developer/tutorials/server_framework_101/11_sprinkles/form.gif new file mode 100644 index 000000000..bf94aaac2 Binary files /dev/null and b/content-rst/developer/tutorials/server_framework_101/11_sprinkles/form.gif differ diff --git a/content-rst/developer/tutorials/server_framework_101/11_sprinkles/inline_view.png b/content-rst/developer/tutorials/server_framework_101/11_sprinkles/inline_view.png new file mode 100644 index 000000000..290483098 Binary files /dev/null and b/content-rst/developer/tutorials/server_framework_101/11_sprinkles/inline_view.png differ diff --git a/content-rst/developer/tutorials/server_framework_101/11_sprinkles/search.gif b/content-rst/developer/tutorials/server_framework_101/11_sprinkles/search.gif new file mode 100644 index 000000000..a71419567 Binary files /dev/null and b/content-rst/developer/tutorials/server_framework_101/11_sprinkles/search.gif differ diff --git a/content-rst/developer/tutorials/server_framework_101/11_sprinkles/stat_button.gif b/content-rst/developer/tutorials/server_framework_101/11_sprinkles/stat_button.gif new file mode 100644 index 000000000..cf1d419ca Binary files /dev/null and b/content-rst/developer/tutorials/server_framework_101/11_sprinkles/stat_button.gif differ diff --git a/content-rst/developer/tutorials/server_framework_101/11_sprinkles/widget.png b/content-rst/developer/tutorials/server_framework_101/11_sprinkles/widget.png new file mode 100644 index 000000000..31f564f53 Binary files /dev/null and b/content-rst/developer/tutorials/server_framework_101/11_sprinkles/widget.png differ diff --git a/content/developer/tutorials/server_framework_101/12_inheritance.rst b/content-rst/developer/tutorials/server_framework_101/12_inheritance.rst similarity index 100% rename from content/developer/tutorials/server_framework_101/12_inheritance.rst rename to content-rst/developer/tutorials/server_framework_101/12_inheritance.rst diff --git a/content-rst/developer/tutorials/server_framework_101/12_inheritance/create.gif b/content-rst/developer/tutorials/server_framework_101/12_inheritance/create.gif new file mode 100644 index 000000000..7d36064d6 Binary files /dev/null and b/content-rst/developer/tutorials/server_framework_101/12_inheritance/create.gif differ diff --git a/content-rst/developer/tutorials/server_framework_101/12_inheritance/inheritance_methods.png b/content-rst/developer/tutorials/server_framework_101/12_inheritance/inheritance_methods.png new file mode 100644 index 000000000..990e7640a Binary files /dev/null and b/content-rst/developer/tutorials/server_framework_101/12_inheritance/inheritance_methods.png differ diff --git a/content-rst/developer/tutorials/server_framework_101/12_inheritance/unlink.gif b/content-rst/developer/tutorials/server_framework_101/12_inheritance/unlink.gif new file mode 100644 index 000000000..f3581b169 Binary files /dev/null and b/content-rst/developer/tutorials/server_framework_101/12_inheritance/unlink.gif differ diff --git a/content-rst/developer/tutorials/server_framework_101/12_inheritance/users.png b/content-rst/developer/tutorials/server_framework_101/12_inheritance/users.png new file mode 100644 index 000000000..ba4436e10 Binary files /dev/null and b/content-rst/developer/tutorials/server_framework_101/12_inheritance/users.png differ diff --git a/content/developer/tutorials/server_framework_101/13_other_module.rst b/content-rst/developer/tutorials/server_framework_101/13_other_module.rst similarity index 100% rename from content/developer/tutorials/server_framework_101/13_other_module.rst rename to content-rst/developer/tutorials/server_framework_101/13_other_module.rst diff --git a/content-rst/developer/tutorials/server_framework_101/13_other_module/create_inv.gif b/content-rst/developer/tutorials/server_framework_101/13_other_module/create_inv.gif new file mode 100644 index 000000000..00088f9fc Binary files /dev/null and b/content-rst/developer/tutorials/server_framework_101/13_other_module/create_inv.gif differ diff --git a/content/developer/tutorials/server_framework_101/14_qwebintro.rst b/content-rst/developer/tutorials/server_framework_101/14_qwebintro.rst similarity index 100% rename from content/developer/tutorials/server_framework_101/14_qwebintro.rst rename to content-rst/developer/tutorials/server_framework_101/14_qwebintro.rst diff --git a/content-rst/developer/tutorials/server_framework_101/14_qwebintro/kanban.png b/content-rst/developer/tutorials/server_framework_101/14_qwebintro/kanban.png new file mode 100644 index 000000000..83518ac4a Binary files /dev/null and b/content-rst/developer/tutorials/server_framework_101/14_qwebintro/kanban.png differ diff --git a/content/developer/tutorials/server_framework_101/15_final_word.rst b/content-rst/developer/tutorials/server_framework_101/15_final_word.rst similarity index 100% rename from content/developer/tutorials/server_framework_101/15_final_word.rst rename to content-rst/developer/tutorials/server_framework_101/15_final_word.rst diff --git a/content/developer/tutorials/setup_guide.rst b/content-rst/developer/tutorials/setup_guide.rst similarity index 100% rename from content/developer/tutorials/setup_guide.rst rename to content-rst/developer/tutorials/setup_guide.rst diff --git a/content/developer/tutorials/unit_tests.rst b/content-rst/developer/tutorials/unit_tests.rst similarity index 100% rename from content/developer/tutorials/unit_tests.rst rename to content-rst/developer/tutorials/unit_tests.rst diff --git a/content/developer/tutorials/web.rst b/content-rst/developer/tutorials/web.rst similarity index 100% rename from content/developer/tutorials/web.rst rename to content-rst/developer/tutorials/web.rst diff --git a/content-rst/developer/tutorials/web/about_odoo.png b/content-rst/developer/tutorials/web/about_odoo.png new file mode 100644 index 000000000..c155c5cf7 Binary files /dev/null and b/content-rst/developer/tutorials/web/about_odoo.png differ diff --git a/content-rst/developer/tutorials/web/devmode.png b/content-rst/developer/tutorials/web/devmode.png new file mode 100644 index 000000000..52cfdcec4 Binary files /dev/null and b/content-rst/developer/tutorials/web/devmode.png differ diff --git a/content-rst/developer/tutorials/web/qweb.png b/content-rst/developer/tutorials/web/qweb.png new file mode 100644 index 000000000..56b4a6352 Binary files /dev/null and b/content-rst/developer/tutorials/web/qweb.png differ diff --git a/content-rst/developer/tutorials/web/viewarchitecture.png b/content-rst/developer/tutorials/web/viewarchitecture.png new file mode 100644 index 000000000..2d324ea59 Binary files /dev/null and b/content-rst/developer/tutorials/web/viewarchitecture.png differ diff --git a/content/developer/tutorials/website.rst b/content-rst/developer/tutorials/website.rst similarity index 100% rename from content/developer/tutorials/website.rst rename to content-rst/developer/tutorials/website.rst diff --git a/content-rst/developer/tutorials/website/basic-list.png b/content-rst/developer/tutorials/website/basic-list.png new file mode 100644 index 000000000..3eb76ddf7 Binary files /dev/null and b/content-rst/developer/tutorials/website/basic-list.png differ diff --git a/content-rst/developer/tutorials/website/helloworld.png b/content-rst/developer/tutorials/website/helloworld.png new file mode 100644 index 000000000..fe76ad88b Binary files /dev/null and b/content-rst/developer/tutorials/website/helloworld.png differ diff --git a/content-rst/developer/tutorials/website/layout.png b/content-rst/developer/tutorials/website/layout.png new file mode 100644 index 000000000..f3fcaf3ac Binary files /dev/null and b/content-rst/developer/tutorials/website/layout.png differ diff --git a/content/index.rst b/content-rst/index.rst similarity index 100% rename from content/index.rst rename to content-rst/index.rst diff --git a/content/last_build.rst b/content-rst/last_build.rst similarity index 100% rename from content/last_build.rst rename to content-rst/last_build.rst diff --git a/content/legal.rst b/content-rst/legal.rst similarity index 100% rename from content/legal.rst rename to content-rst/legal.rst diff --git a/content/legal/cla.rst b/content-rst/legal/cla.rst similarity index 100% rename from content/legal/cla.rst rename to content-rst/legal/cla.rst diff --git a/content/legal/coc.rst b/content-rst/legal/coc.rst similarity index 100% rename from content/legal/coc.rst rename to content-rst/legal/coc.rst diff --git a/content-rst/legal/img/pdf.svg b/content-rst/legal/img/pdf.svg new file mode 100644 index 000000000..23904abba --- /dev/null +++ b/content-rst/legal/img/pdf.svg @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content-rst/legal/img/pdf_missing.svg b/content-rst/legal/img/pdf_missing.svg new file mode 100644 index 000000000..1a5e599c2 --- /dev/null +++ b/content-rst/legal/img/pdf_missing.svg @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content-rst/legal/img/txt.svg b/content-rst/legal/img/txt.svg new file mode 100644 index 000000000..5706fc65c --- /dev/null +++ b/content-rst/legal/img/txt.svg @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content-rst/legal/img/txt_missing.svg b/content-rst/legal/img/txt_missing.svg new file mode 100644 index 000000000..4c71c0497 --- /dev/null +++ b/content-rst/legal/img/txt_missing.svg @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/legal/licenses.rst b/content-rst/legal/licenses.rst similarity index 100% rename from content/legal/licenses.rst rename to content-rst/legal/licenses.rst diff --git a/content-rst/legal/licenses/enterprise_license.txt b/content-rst/legal/licenses/enterprise_license.txt new file mode 100644 index 000000000..24cc072c1 --- /dev/null +++ b/content-rst/legal/licenses/enterprise_license.txt @@ -0,0 +1,33 @@ +Odoo Enterprise Edition License v1.0 + +This software and associated files (the "Software") can only be used (executed, +modified, executed after modifications) with a valid Odoo Enterprise +Subscription for the correct number of users. + +With a valid Partnership Agreement with Odoo S.A., the above permissions are +also granted, as long as the usage is limited to a testing or development +environment. + +You may develop Odoo modules based on the Software and distribute them +under the license of your choice, provided that it is compatible with the +terms of the Odoo Enterprise Edition License (For example: LGPL, MIT, or +proprietary licenses similar to this one). + +You may use Odoo modules published under any license along with the +Software, provided that their license is compatible with the terms of the +Odoo Enterprise License (Including, but not limited to, any module +published on the Odoo Apps Store on odoo.com/apps) + +It is forbidden to publish, distribute, sublicense, or sell copies of the +Software or modified copies of the Software. + +The above copyright notice and this permission notice must be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/content/legal/terms.rst b/content-rst/legal/terms.rst similarity index 100% rename from content/legal/terms.rst rename to content-rst/legal/terms.rst diff --git a/content/legal/terms/enterprise.rst b/content-rst/legal/terms/enterprise.rst similarity index 100% rename from content/legal/terms/enterprise.rst rename to content-rst/legal/terms/enterprise.rst diff --git a/content/legal/terms/enterprise_tex.rst b/content-rst/legal/terms/enterprise_tex.rst similarity index 100% rename from content/legal/terms/enterprise_tex.rst rename to content-rst/legal/terms/enterprise_tex.rst diff --git a/content/legal/terms/i18n/enterprise_de.rst b/content-rst/legal/terms/i18n/enterprise_de.rst similarity index 100% rename from content/legal/terms/i18n/enterprise_de.rst rename to content-rst/legal/terms/i18n/enterprise_de.rst diff --git a/content/legal/terms/i18n/enterprise_es.rst b/content-rst/legal/terms/i18n/enterprise_es.rst similarity index 100% rename from content/legal/terms/i18n/enterprise_es.rst rename to content-rst/legal/terms/i18n/enterprise_es.rst diff --git a/content/legal/terms/i18n/enterprise_fr.rst b/content-rst/legal/terms/i18n/enterprise_fr.rst similarity index 100% rename from content/legal/terms/i18n/enterprise_fr.rst rename to content-rst/legal/terms/i18n/enterprise_fr.rst diff --git a/content/legal/terms/i18n/enterprise_nl.rst b/content-rst/legal/terms/i18n/enterprise_nl.rst similarity index 100% rename from content/legal/terms/i18n/enterprise_nl.rst rename to content-rst/legal/terms/i18n/enterprise_nl.rst diff --git a/content/legal/terms/i18n/enterprise_pt_BR.rst b/content-rst/legal/terms/i18n/enterprise_pt_BR.rst similarity index 100% rename from content/legal/terms/i18n/enterprise_pt_BR.rst rename to content-rst/legal/terms/i18n/enterprise_pt_BR.rst diff --git a/content/legal/terms/i18n/enterprise_tex_de.rst b/content-rst/legal/terms/i18n/enterprise_tex_de.rst similarity index 100% rename from content/legal/terms/i18n/enterprise_tex_de.rst rename to content-rst/legal/terms/i18n/enterprise_tex_de.rst diff --git a/content/legal/terms/i18n/enterprise_tex_es.rst b/content-rst/legal/terms/i18n/enterprise_tex_es.rst similarity index 100% rename from content/legal/terms/i18n/enterprise_tex_es.rst rename to content-rst/legal/terms/i18n/enterprise_tex_es.rst diff --git a/content/legal/terms/i18n/enterprise_tex_fr.rst b/content-rst/legal/terms/i18n/enterprise_tex_fr.rst similarity index 100% rename from content/legal/terms/i18n/enterprise_tex_fr.rst rename to content-rst/legal/terms/i18n/enterprise_tex_fr.rst diff --git a/content/legal/terms/i18n/enterprise_tex_nl.rst b/content-rst/legal/terms/i18n/enterprise_tex_nl.rst similarity index 100% rename from content/legal/terms/i18n/enterprise_tex_nl.rst rename to content-rst/legal/terms/i18n/enterprise_tex_nl.rst diff --git a/content/legal/terms/i18n/enterprise_tex_pt_BR.rst b/content-rst/legal/terms/i18n/enterprise_tex_pt_BR.rst similarity index 100% rename from content/legal/terms/i18n/enterprise_tex_pt_BR.rst rename to content-rst/legal/terms/i18n/enterprise_tex_pt_BR.rst diff --git a/content/legal/terms/i18n/partnership_es.rst b/content-rst/legal/terms/i18n/partnership_es.rst similarity index 100% rename from content/legal/terms/i18n/partnership_es.rst rename to content-rst/legal/terms/i18n/partnership_es.rst diff --git a/content/legal/terms/i18n/partnership_fr.rst b/content-rst/legal/terms/i18n/partnership_fr.rst similarity index 100% rename from content/legal/terms/i18n/partnership_fr.rst rename to content-rst/legal/terms/i18n/partnership_fr.rst diff --git a/content/legal/terms/i18n/partnership_tex_es.rst b/content-rst/legal/terms/i18n/partnership_tex_es.rst similarity index 100% rename from content/legal/terms/i18n/partnership_tex_es.rst rename to content-rst/legal/terms/i18n/partnership_tex_es.rst diff --git a/content/legal/terms/i18n/partnership_tex_fr.rst b/content-rst/legal/terms/i18n/partnership_tex_fr.rst similarity index 100% rename from content/legal/terms/i18n/partnership_tex_fr.rst rename to content-rst/legal/terms/i18n/partnership_tex_fr.rst diff --git a/content/legal/terms/i18n/terms_of_sale_de.rst b/content-rst/legal/terms/i18n/terms_of_sale_de.rst similarity index 100% rename from content/legal/terms/i18n/terms_of_sale_de.rst rename to content-rst/legal/terms/i18n/terms_of_sale_de.rst diff --git a/content/legal/terms/i18n/terms_of_sale_es.rst b/content-rst/legal/terms/i18n/terms_of_sale_es.rst similarity index 100% rename from content/legal/terms/i18n/terms_of_sale_es.rst rename to content-rst/legal/terms/i18n/terms_of_sale_es.rst diff --git a/content/legal/terms/i18n/terms_of_sale_fr.rst b/content-rst/legal/terms/i18n/terms_of_sale_fr.rst similarity index 100% rename from content/legal/terms/i18n/terms_of_sale_fr.rst rename to content-rst/legal/terms/i18n/terms_of_sale_fr.rst diff --git a/content/legal/terms/i18n/terms_of_sale_tex_de.rst b/content-rst/legal/terms/i18n/terms_of_sale_tex_de.rst similarity index 100% rename from content/legal/terms/i18n/terms_of_sale_tex_de.rst rename to content-rst/legal/terms/i18n/terms_of_sale_tex_de.rst diff --git a/content/legal/terms/i18n/terms_of_sale_tex_es.rst b/content-rst/legal/terms/i18n/terms_of_sale_tex_es.rst similarity index 100% rename from content/legal/terms/i18n/terms_of_sale_tex_es.rst rename to content-rst/legal/terms/i18n/terms_of_sale_tex_es.rst diff --git a/content/legal/terms/i18n/terms_of_sale_tex_fr.rst b/content-rst/legal/terms/i18n/terms_of_sale_tex_fr.rst similarity index 100% rename from content/legal/terms/i18n/terms_of_sale_tex_fr.rst rename to content-rst/legal/terms/i18n/terms_of_sale_tex_fr.rst diff --git a/content/legal/terms/odoo_sh_terms.rst b/content-rst/legal/terms/odoo_sh_terms.rst similarity index 100% rename from content/legal/terms/odoo_sh_terms.rst rename to content-rst/legal/terms/odoo_sh_terms.rst diff --git a/content/legal/terms/partnership.rst b/content-rst/legal/terms/partnership.rst similarity index 100% rename from content/legal/terms/partnership.rst rename to content-rst/legal/terms/partnership.rst diff --git a/content/legal/terms/partnership_tex.rst b/content-rst/legal/terms/partnership_tex.rst similarity index 100% rename from content/legal/terms/partnership_tex.rst rename to content-rst/legal/terms/partnership_tex.rst diff --git a/content/legal/terms/terms_of_sale.rst b/content-rst/legal/terms/terms_of_sale.rst similarity index 100% rename from content/legal/terms/terms_of_sale.rst rename to content-rst/legal/terms/terms_of_sale.rst diff --git a/content/legal/terms/terms_of_sale_tex.rst b/content-rst/legal/terms/terms_of_sale_tex.rst similarity index 100% rename from content/legal/terms/terms_of_sale_tex.rst rename to content-rst/legal/terms/terms_of_sale_tex.rst diff --git a/content/administration.md b/content/administration.md new file mode 100644 index 000000000..dcd03f850 --- /dev/null +++ b/content/administration.md @@ -0,0 +1,62 @@ +--- +hide-page-toc: true +nosearch: true +show-content: true +show-toc: true +--- + +# Database management + +These guides provide instructions on how to install, maintain and upgrade Odoo databases. + +:::{seealso} +{doc}`History of Versions ` +::: + +## Installation + +Depending on the intended use case, there are multiple ways to install Odoo - or not install it at +all. + +- {doc}`Online ` is the easiest way to use Odoo in production or to try it. +- {doc}`Packaged installers ` are suitable for testing Odoo and + developing modules. They can be used for long-term production with additional deployment and + maintenance work. +- {doc}`Source install ` provides greater flexibility, as it + allows, for example, running multiple Odoo versions on the same system. It is adequate to develop + modules and can be used as a base for production deployment. +- A [Docker](https://hub.docker.com/_/odoo/) base image is available for development or + deployment. + +(install-editions)= + +## Editions + +There are two different editions. + +**Odoo Community** is the free and open-source version of the software, licensed under the [GNU +LGPLv3](https://github.com/odoo/odoo/blob/master/LICENSE). It is the core upon which Odoo +Enterprise is built. + +**Odoo Enterprise** is the shared source version of the software, giving access to more +functionalities, including functional support, upgrades, and hosting. [Pricing](https://www.odoo.com/pricing-plan) starts from one app free. + +:::{tip} +{doc}`Switch from Community to Enterprise ` at +any time (except for the source install). +::: + +```{toctree} +:titlesonly: true + +administration/hosting +administration/odoo_online +administration/odoo_sh +administration/on_premise +administration/upgrade +administration/neutralized_database +administration/supported_versions +administration/mobile +administration/odoo_accounts +``` + diff --git a/content/administration/hosting.md b/content/administration/hosting.md new file mode 100644 index 000000000..178ae1ebe --- /dev/null +++ b/content/administration/hosting.md @@ -0,0 +1,121 @@ +# Hosting + +(hosting-change-solution)= + +## Change hosting solution + +The instructions to change the hosting type of a database depend on the current solution used and to +which solution the database should be moved. + +## Transferring an on-premise database + +### To Odoo Online + +:::{important} +- Odoo Online is *not* compatible with **non-standard apps**. +- The database's current version must be {doc}`supported `. +::: + +1. Create a {ref}`duplicate of the database `. + +2. In this duplicate, uninstall all **non-standard apps**. + +3. Use the database manager to grab a *dump with filestore*. + +4. [Submit a support ticket](https://www.odoo.com/help) including the following: + + - your **subscription number**, + - the **URL** you want to use for the database (e.g., `company.odoo.com`), and + - the **dump** as an attachment or as a link to the file (required for 60 MB+ files). + +5. Odoo then makes sure the database is compatible before putting it online. In case of technical + issues during the process, Odoo might contact you. + +:::{note} +If you have time constraints, [submit a support ticket](https://www.odoo.com/help) as soon as +possible to schedule the transfer. +::: + +### To Odoo.sh + +Follow the instructions found in {ref}`the Import your database section +` of the Odoo.sh *Create your project* documentation. + +## Transferring an Odoo Online database + +::::{important} +Odoo Online's {ref}`intermediary versions ` are not supported by Odoo.sh or +on-premise. Therefore, if the database to transfer is running an intermediary version, it must be +upgraded first to the next {ref}`major version `, waiting for its release if +necessary. + +```{eval-rst} +.. example:: + Transferring an online database running on Odoo 16.3 would require first upgrading it to Odoo + 17.0. +``` + +:::{tip} +Click the gear icon ({guilabel}`⚙`) next to the database name on the [Odoo Online database +manager](https://www.odoo.com/my/databases/) to display its version number. +::: + +:::{warning} +If there is an active Odoo subscription linked to the database being migrated, reach out to +the Customer Service Manager or [submit a support ticket](https://www.odoo.com/help) to +complete the subscription transfer. +::: +:::: + +### To on-premise + +1. Sign in to [the Odoo Online database manager](https://www.odoo.com/my/databases/) and click the + gear icon ({guilabel}`⚙`) next to the database name to {guilabel}`Download` a backup. If the + download fails due to the file being too large, [contact Odoo support](https://www.odoo.com/help). +2. Restore the database from the database manager on your local server using the backup. + +### To Odoo.sh + +1. Sign in to [the Odoo Online database manager](https://www.odoo.com/my/databases/) and click the + gear icon ({guilabel}`⚙`) next to the database name to {guilabel}`Download` a backup. If the + download fails due to the file being too large, [contact Odoo support](https://www.odoo.com/help). +2. Follow the instructions found in {ref}`the Import your database section + ` of the Odoo.sh *Create your project* documentation. + +## Transferring an Odoo.sh database + +### To Odoo Online + +:::{important} +Odoo Online is *not* compatible with **non-standard apps**. +::: + +1. Uninstall all **non-standard apps** in a staging build before doing it in the production build. + +2. [Create a support ticket](https://www.odoo.com/help) including the following: + + - your **subscription number**, + - the **URL** you want to use for the database (e.g., `company.odoo.com`), + - which **branch** should be migrated, + - in which **region** you want the database to be hosted (Americas, Europe, or Asia), + - which user(s) will be the **administrator(s)**, and + - **when** (and in which timezone) you want the database to be up and running. + +3. Odoo then makes sure the database is compatible before putting it online. In case of technical + issues during the process, Odoo might contact you. + +:::{note} +- If you have time constraints, [submit a support ticket](https://www.odoo.com/help) as soon as + possible to schedule the transfer. +- Select the **region** closest to most of your users to reduce latency. +- Future **administrator(s)** must have an Odoo.com account. +- The **date and time** you want the database to be up and running are helpful to organize the + switch from the Odoo.sh server to the Odoo Online servers. +- Databases are **not reachable** during their migration. +::: + +### To on-premise + +1. Download a {ref}`backup of your Odoo.sh production database `. +2. Restore the database from the database manager on your local server using the backup. + diff --git a/content/administration/mobile.md b/content/administration/mobile.md new file mode 100644 index 000000000..d2fea4194 --- /dev/null +++ b/content/administration/mobile.md @@ -0,0 +1,64 @@ +# Odoo mobile apps + +Two kind of Odoo mobile app exist: the progressive web app (PWA) and store apps. Using the PWA is +recommended. + +## Progressive web app (PWA) + +PWAs are web-based applications designed to function across different devices and platforms, +leveraging web browsers to deliver user experiences similar to native apps. + +The Odoo PWA features include: + +- Quick access by adding the PWA to a device's home screen +- Seamless and borderless navigation experience +- Push notifications +- SSO authentication + +To install the Odoo PWA, launch a browser supporting PWAs, and sign in to an Odoo database. The +instructions to install a PWA depend on the platform and browser used. + +```{eval-rst} +.. tabs:: + + .. tab:: Android + + **Chrome**: open Chrome's menu (:guilabel:`⋮`), select :guilabel:`Install app`, and tap + :guilabel:`Install`. + + **Firefox**: open Firefox's menu (:guilabel:`⋮`), select :guilabel:`Install`, and either touch + and hold the Odoo icon or tap :guilabel:`Add automatically`. + + The PWA can also be installed with **Samsung Internet**, **Edge**, and **Opera**. + + .. tab:: iOS + + **Safari**: open the **Share** menu by tapping the square with an arrow pointing upwards icon, + select :guilabel:`Add to Home Screen`, edit the PWA details if desired, and tap + :guilabel:`Add`. + + On iOS 16.4 and above, the PWA can also be installed with **Chrome**, **Firefox**, and + **Edge**. + + .. tab:: Desktop + + **Chrome** and **Edge**: click the installation icon at the right of the address bar and click + :guilabel:`Install`. +``` + +:::{seealso} +- [Google Chrome Help: Use progressive web apps](https://support.google.com/chrome/answer/9658361) +- [MDN Web Docs: Installing and uninstalling web apps](https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps/Guides/Installing) +- [Microsoft Support: Install, manage, or uninstall apps in Microsoft Edge](https://support.microsoft.com/en-us/topic/install-manage-or-uninstall-apps-in-microsoft-edge-0c156575-a94a-45e4-a54f-3a84846f6113) +::: + +## Store apps + +The Odoo mobile apps are available for download on the [Google Play Store](https://play.google.com/store/apps/details?id=com.odoo.mobile) and [Apple App Store](https://apps.apple.com/app/odoo/id1272543640). + +:::{important} +The iOS app cannot be updated and will 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/neutralized_database.md b/content/administration/neutralized_database.md new file mode 100644 index 000000000..5b540fb49 --- /dev/null +++ b/content/administration/neutralized_database.md @@ -0,0 +1,37 @@ +# Neutralized database + +A neutralized database is a non-production database on which several parameters are deactivated. +This enables one to carry out tests without the risk of launching specific automated processes that +could impact production data (e.g., sending emails to customers). Live access is removed and +turned into a testing environment. + +:::{note} +**Any testing database created is a neutralized database:** + +- testing backup databases +- duplicate databases +- for Odoo.sh: staging and development databases +::: + +:::{important} +A database can also be neutralized when upgrading, as it is vital to do some tests before +switching to a new version. +::: + +## Deactivated features + +Here is a non-exhaustive list of the deactivated features: + +- all planned actions (e.g., automatic invoicing of subscriptions, mass mailing, etc.) +- outgoing emails +- bank synchronization +- payment providers +- delivery methods +- {abbr}`IAP (In-App Purchase)` tokens +- website visibility (prevent search engines from indexing your site) + +:::{note} +**A red banner at the top of the screen is displayed on the neutralized database so that it can +be seen immediately.** +::: + diff --git a/content/administration/odoo_accounts.md b/content/administration/odoo_accounts.md new file mode 100644 index 000000000..46370f5fa --- /dev/null +++ b/content/administration/odoo_accounts.md @@ -0,0 +1,80 @@ +# Odoo.com accounts + +This documentation is dedicated to edits made to an Odoo.com account. The following processes +describe how to delete an Odoo.com account, and how to change the password on an Odoo.com account. + +## Delete Odoo.com account + +To delete an Odoo.com account, start by clicking the profile icon in the upper-right corner +(represented by the username and icon) to reveal a drop-down menu. From the drop-down menu, select +{guilabel}`My Odoo.com account`, which reveals the user portal. + +From the user portal, the delete option can be accessed by going to {menuselection}`My Account --> +Edit Security Settings --> Delete Account`. It can also be accessed by going to +[https://www.odoo.com/my/home](https://www.odoo.com/my/home). + +:::{danger} +Deleting an Odoo account is irreversible. Be careful performing this action, as the Odoo.com +account is **not** retrievable once deleted. +::: + +Upon clicking the {guilabel}`Delete Account` button, a pop-up window appears, requesting +confirmation for the account deletion. + +```{image} odoo_accounts/delete-account.png +:align: center +:alt: Clicking on the Delete Account button will populate a window verifying the change. +``` + +To confirm the deletion, enter the {guilabel}`Password` and the {guilabel}`Login` for the account +being deleted. Then, click the {guilabel}`Delete Account` button to confirm the deletion. + +(odoocom-change-password)= + +## Odoo.com account password change + +To change an Odoo.com account password, first login into the Odoo.com user account from the Odoo.com +login page. After logging-in, go to the upper-right corner of the screen, and click the {guilabel}`▼ +(down arrow)` icon next to the profile icon. Then, select {guilabel}`My Account`, and a portal +dashboard appears. + +To change the Odoo.com password, click on the {guilabel}`Edit Security Settings` link, below the +{menuselection}`Account Security` section. Next, make the necessary changes by typing in the current +{guilabel}`Password`, {guilabel}`New Password`, and verify the new password. Lastly, click on +{guilabel}`Change Password` to complete the password change. + +:::{note} +If a customer would like to change the login, contact Odoo support [here](https://www.odoo.com/help). +::: + +:::{note} +Passwords for Odoo.com users and portal users remain separate, even if the same email address is +used. +::: + +## Add two-factor authentication + +To add two-factor authentication, login into the Odoo.com user account from the Odoo.com login page. +After logging-in, go to the upper-right corner of the screen, and click the {guilabel}`▼ (down +arrow)` icon next to the {guilabel}`profile icon`. Then, select {guilabel}`My Account`, and a portal +dashboard appears. + +If the user would like to turn on two-factor authentication (2FA) for Odoo.com access, click on the +{guilabel}`Edit Security Settings` link below the {menuselection}`Account Security` section. + +Click on {guilabel}`Enable two-factor authentication` to turn on {abbr}`2FA (two-factor +authentication)`. Then, confirm the current password in the {guilabel}`Password` field. Next, click +on {guilabel}`Confirm Password`. Following that, activate {abbr}`2FA (two-factor authentication)` in +a {abbr}`2FA (two-factor authentication)` app (Google Authenticator, Authy, etc.), by scanning the +{guilabel}`QR code` or entering a {guilabel}`Verification Code`. + +Finally, click on {guilabel}`Enable two-factor authentication` to complete the setup. + +:::{note} +Under {guilabel}`My Account` Odoo.com users can also access the following: + +- {guilabel}`My Partner dashboard` +- {guilabel}`My In-App Services` +- {guilabel}`My Apps Dashboard` +::: + diff --git a/content/administration/odoo_online.md b/content/administration/odoo_online.md new file mode 100644 index 000000000..9c5b9802c --- /dev/null +++ b/content/administration/odoo_online.md @@ -0,0 +1,151 @@ +# Odoo Online + +[Odoo Online](https://www.odoo.com/trial) provides private databases which are fully managed and +hosted by Odoo. It can be used for long-term production or to test Odoo thoroughly, including +customizations that don't require code. + +:::{note} +Odoo Online is incompatible with custom modules or the Odoo App Store. +::: + +Odoo Online databases are accessed using any web browser and do not require a local installation. + +To quickly try out Odoo, shared [demo](https://demo.odoo.com) instances are available. No +registration is required, but each instance only lives for a few hours. + +## Database management + +To manage a database, go to the [database manager](https://www.odoo.com/my/databases) and sign in +as the database administrator. + +All the main database management options are available by clicking the database name, except the +upgrade option, which can be accessed by clicking the **arrow in a circle** icon next to the +database name. It is only displayed if an upgrade is available. + +```{image} odoo_online/database-manager.png +:alt: Accessing the database management options +``` + +- {ref}`odoo_online/upgrade` +- {ref}`odoo_online/duplicate` +- {ref}`odoo_online/rename` +- {ref}`odoo_online/download` +- {ref}`odoo_online/domains` +- {ref}`odoo_online/tags` +- {ref}`odoo_online/delete` +- {ref}`odoo_online/contact-support` +- {ref}`odoo_online/users` + +(odoo-online-upgrade)= + +## Upgrade + +Trigger a database upgrade. + +:::{seealso} +For more information about the upgrade process, check out the {ref}`Odoo Online upgrade +documentation `. +::: + +(odoo-online-duplicate)= + +## Duplicate + +Create an exact copy of the database, which can be used to perform testing without compromising +daily operations. + +:::{important} +- By checking {guilabel}`For testing purposes`, all external actions (emails, payments, delivery + orders, etc.) are disabled by default on the duplicated database. +- Duplicated databases expire automatically after 15 days. +- A maximum of five duplicates can be made per database. Under extraordinary circumstances, + contact [support](https://www.odoo.com/help) to raise the limit. +::: + +(odoo-online-rename)= + +## Rename + +Rename the database and its URL. + +(odoo-online-download)= + +## Download + +Download a ZIP file containing a backup of the database. + +:::{note} +Databases are backed up daily as per the [Odoo Cloud Hosting SLA](https://www.odoo.com/cloud-sla). +::: + +(odoo-online-domains)= + +## Domain names + +Use a custom {doc}`domain name ` to +access the database via another URL. + +:::{tip} +You can {ref}`register a domain name for free `. +::: + +(odoo-online-tags)= + +## Tags + +Add tags to easily identify and sort your databases. + +:::{tip} +You can search for tags in the search bar. +::: + +(odoo-online-delete)= + +## Delete + +Delete a database instantly. + +:::{danger} +Deleting a database means that all data is permanently lost. The deletion is instant and applies +to all users. It is recommended to create a backup of the database before deleting it. +::: + +Carefully read the warning message and only proceed if the implications of deleting a database are +fully understood. + +```{image} odoo_online/delete.png +:alt: The warning message displayed before deleting a database +``` + +:::{note} +- Only an administrator can delete a database. +- The database name is immediately made available to anyone. +- Deleting a database if it has expired or is linked to a subscription is impossible. In that + case, contact [Odoo Support](https://www.odoo.com/help). +::: + +(odoo-online-contact-support)= + +## Contact us + +Access the [Odoo.com support page](https://www.odoo.com/help) with the database's details already +pre-filled. + +(odoo-online-users)= + +## Invite / remove users + +To invite users, fill out the new user's email address and click {guilabel}`Invite`. To add multiple +users, click {guilabel}`Add more users`. + +```{image} odoo_online/invite-users.png +:alt: Inviting a user on a database +``` + +To remove users, select them and click {guilabel}`Remove`. + +:::{seealso} +- {doc}`/applications/general/users` +- {doc}`odoo_accounts` +::: + diff --git a/content/administration/odoo_sh.md b/content/administration/odoo_sh.md new file mode 100644 index 000000000..91a196106 --- /dev/null +++ b/content/administration/odoo_sh.md @@ -0,0 +1,12 @@ +--- +nosearch: true +--- + +# Odoo.sh + +```{toctree} +odoo_sh/overview +odoo_sh/getting_started +odoo_sh/advanced +``` + diff --git a/content/administration/odoo_sh/advanced.md b/content/administration/odoo_sh/advanced.md new file mode 100644 index 000000000..7f0e6fd97 --- /dev/null +++ b/content/administration/odoo_sh/advanced.md @@ -0,0 +1,14 @@ +--- +nosearch: true +--- + +# Advanced + +```{toctree} +:titlesonly: true + +advanced/containers +advanced/submodules +advanced/frequent_technical_questions +``` + diff --git a/content/administration/odoo_sh/advanced/containers.md b/content/administration/odoo_sh/advanced/containers.md new file mode 100644 index 000000000..db1c5725a --- /dev/null +++ b/content/administration/odoo_sh/advanced/containers.md @@ -0,0 +1,232 @@ +# Containers + +## Overview + +Each build is isolated within its own container (Linux namespaced container). + +The base is an Ubuntu system, where all of Odoo's required dependencies, +as well as common useful packages, are installed. + +If your project requires additional Python dependencies, or more recent releases, +you can define a {file}`requirements.txt` file in the root of your branches listing them. +The platform will take care to install these dependencies in your containers. +[The pip requirements specifiers](https://pip.pypa.io/en/stable/reference/pip_install/#requirement-specifiers) +documentation can help you write a {file}`requirements.txt` file. +To have a concrete example, +check out the [requirements.txt file of Odoo]({GITHUB_PATH}/requirements.txt). + +The {file}`requirements.txt` files of submodules are taken into account as well. The platform +looks for {file}`requirements.txt` files in each folder containing Odoo modules: Not in the module folder itself, +but in their parent folder. + +## Directory structure + +As the containers are Ubuntu based, their directory structure follows the linux Filesystem Hierarchy Standard. +[Ubuntu's filesystem tree overview](https://help.ubuntu.com/community/LinuxFilesystemTreeOverview#Main_directories) +explains the main directories. + +Here are the Odoo.sh pertinent directories: + +``` +. +├── home +│ └── odoo +│ ├── src +│ │ ├── odoo Odoo Community source code +│ │ │ └── odoo-bin Odoo server executable +│ │ ├── enterprise Odoo Enterprise source code +│ │ ├── themes Odoo Themes source code +│ │ └── user Your repository branch source code +│ ├── data +│ │ ├── filestore database attachments, as well as the files of binary fields +│ │ └── sessions visitors and users sessions +│ └── logs +│ ├── install.log Database installation logs +│ ├── odoo.log Running server logs +│ ├── update.log Database updates logs +│ └── pip.log Python packages installation logs +└── usr + ├── lib + │ ├── python2.7 + │ └── dist-packages Python 2.7 standard libraries + │ ├── python3 + │ └── dist-packages Python 3 standard libraries + │ └── python3.5 + │ └── dist-packages Python 3.5 standard libraries + ├── local + │ └── lib + │ ├── python2.7 + │ │ └── dist-packages Python 2.7 third-party libraries + │ └── python3.5 + │ └── dist-packages Python 3.5 third-party libraries + └── usr + └── bin + ├── python2.7 Python 2.7 executable + └── python3.5 Python 3.5 executable +``` + +Both Python 2.7 and 3.5 are installed in the containers. However: + +- If your project is configured to use Odoo 10.0, the Odoo server runs with Python 2.7. +- If your project is configured to use Odoo 11.0 or above, the Odoo server runs with Python 3.5. + +## Database shell + +While accessing a container with the shell, you can access the database using *psql*. + +```bash +odoo@odoo-addons-master-1.odoo.sh:~$ psql +psql (9.5.2, server 9.5.11) +SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off) +Type "help" for help. + +odoo-addons-master-1=> +``` + +**Be careful !** +[Use transactions](https://www.postgresql.org/docs/current/static/sql-begin.html) (*BEGIN...COMMIT/ROLLBACK*) +for every *sql* statements leading to changes +(*UPDATE*, *DELETE*, *ALTER*, ...), especially for your production database. + +The transaction mechanism is your safety net in case of mistake. +You simply have to rollback your changes to revert your database to its previous state. + +For example, it may happen that you forget to set your *WHERE* condition. + +```sql +odoo-addons-master-1=> BEGIN; +BEGIN +odoo-addons-master-1=> UPDATE res_users SET password = '***'; +UPDATE 457 +odoo-addons-master-1=> ROLLBACK; +ROLLBACK +``` + +In such a case, you can rollback to revert the unwanted changes that you just mistakenly did, and rewrite the statement: + +```sql +odoo-addons-master-1=> BEGIN; +BEGIN +odoo-addons-master-1=> UPDATE res_users SET password = '***' WHERE id = 1; +UPDATE 1 +odoo-addons-master-1=> COMMIT; +COMMIT +``` + +However, do not forget to either commit or rollback your transaction after having done it. +Open transactions may lock records in your tables +and your running database may wait for them to be released. It can cause a server to hang indefinitely. + +In addition, when possible, use your staging databases to test your statements first. It gives you an extra safety net. + +## Run an Odoo server + +You can start an Odoo server instance from a container shell. You won't be able to access it from the outside world +with a browser, but you can for instance: + +- use the Odoo shell, + +```bash +$ odoo-bin shell +>>> partner = env['res.partner'].search([('email', '=', 'asusteK@yourcompany.example.com')], limit=1) +>>> partner.name +'ASUSTeK' +>>> partner.name = 'Odoo' +>>> env['res.partner'].search([('email', '=', 'asusteK@yourcompany.example.com')], limit=1).name +'Odoo' +``` + +- install a module, + +```bash +$ odoo-bin -i sale --without-demo=all --stop-after-init +``` + +- update a module, + +```bash +$ odoo-bin -u sale --stop-after-init +``` + +- run the tests for a module, + +```bash +$ odoo-bin -i sale --test-enable --log-level=test --stop-after-init +``` + +In the above commands, the argument: + +- `--without-demo=all` prevents demo data to be loaded for all modules +- `--stop-after-init` will immediately shutdown the server instance after it completed the operations you asked. + +More options are available and detailed in the +{doc}`CLI documentation `. + +You can find in the logs (*~/logs/odoo.log*) the addons path used by Odoo.sh to run your server. +Look for "*odoo: addons paths*": + +``` +2018-02-19 10:51:39,267 4 INFO ? odoo: Odoo version {BRANCH} +2018-02-19 10:51:39,268 4 INFO ? odoo: Using configuration file at /home/odoo/.config/odoo/odoo.conf +2018-02-19 10:51:39,268 4 INFO ? odoo: addons paths: ['/home/odoo/data/addons/{BRANCH}', '/home/odoo/src/user', '/home/odoo/src/enterprise', '/home/odoo/src/themes', '/home/odoo/src/odoo/addons', '/home/odoo/src/odoo/odoo/addons'] +``` + +**Be careful**, especially with your production database. +Operations that you perform running this Odoo server instance are not isolated: +Changes will be effective in the database. Always, make your tests in your staging databases. + +## Debugging in Odoo.sh + +Debugging an Odoo.sh build is not really different than another Python app. This article only explains the specificities and limitations of the Odoo.sh platform, and assumes that you already know how to use a debugger. + +:::{note} +If you don't know how to debug a Python application yet, there are multiple introductory courses that can be easily found on the Internet. +::: + +You can use `pdb`, `pudb` or `ipdb` to debug your code on Odoo.sh. +As the server is run outside a shell, you cannot launch the debugger directly from your Odoo instance backend as the debugger needs a shell to operate. + +- [pdb](https://docs.python.org/3/library/pdb.html) is installed by default in every container. + +- If you want to use [pudb](https://pypi.org/project/pudb/) or [ipdb](https://pypi.org/project/ipdb/) you have to install it before. + + To do so, you have two options: + + > - temporary (only in the current build): + > + > ```bash + > $ pip install pudb --user + > ``` + > + > or + > + > ```bash + > $ pip install ipdb --user + > ``` + > + > - permanent: add `pudb` or `ipdb` to your project `requirements.txt` file. + +Then edit the code where you want to trigger the debugger and add this: + +```python +import sys +if sys.__stdin__.isatty(): + import pdb; pdb.set_trace() +``` + +The condition {code}`sys.__stdin__.isatty()` is a hack that detects if you run Odoo from a shell. + +Save the file and then run the Odoo Shell: + +```bash +$ odoo-bin shell +``` + +Finally, *via* the Odoo Shell, you can trigger the piece of code/function/method +you want to debug. + +```{image} containers/pdb_sh.png +:align: center +:alt: Console screenshot showing ``pdb`` running in an Odoo.sh shell. +``` + diff --git a/content/administration/odoo_sh/advanced/frequent_technical_questions.md b/content/administration/odoo_sh/advanced/frequent_technical_questions.md new file mode 100644 index 000000000..387ca9a44 --- /dev/null +++ b/content/administration/odoo_sh/advanced/frequent_technical_questions.md @@ -0,0 +1,56 @@ +(odoosh-advanced-frequent-technical-questions)= + +# Frequent Technical Questions + +## "Scheduled actions do not run at the exact time they were expected" + +On the Odoo.sh platform, we cannot guarantee an exact running time for scheduled actions. + +This is due to the fact that there might be multiple customers on the same server, and we must guarantee a fair share of the server for every customer. Scheduled actions are therefore implemented slightly differently than on a regular Odoo server, and are run on a *best effort* policy. + +:::{warning} +Do not expect any scheduled action to be run more often than every 5 min. +::: + +## Are there "best practices" regarding scheduled actions? + +**Odoo.sh always limits the execution time of scheduled actions (\*aka\* crons).** +Therefore, you must keep this fact in mind when developing your own crons. + +We advise that: + +- Your scheduled actions should work on small batches of records. +- Your scheduled actions should commit their work after processing each batch; + this way, if they get interrupted by the time-limit, there is no need to start over. +- Your scheduled actions should be + [idempotent](https://stackoverflow.com/a/1077421/3332416): they must not + cause side-effects if they are started more often than expected. + +(ip-address-change)= + +## How can I automate tasks when an IP address change occurs? + +**Odoo.sh notifies project administrators of IP address changes.** +Additionally, when the IP address of a production instance changes, an HTTP `GET` request is made +to the path `/_odoo.sh/ip-change` with the new IP address included as a query string parameter +(`new`), along with the previous IP address as an additional parameter (`old`). + +This mechanism allows custom actions to be applied in response to the IP address change +(e.g., sending an email, contacting a firewall API, configuring database objects, etc.) + +For security reasons, the `/_odoo.sh/ip-change` route is accessible only internally by the platform +itself and returns a `403` response if accessed through any other means. + +Here is a pseudo-implementation example: + +```python +class IPChangeController(http.Controller): + + @http.route('/_odoo.sh/ip-change', auth='public') + def ip_change(self, old=None, new=None): + _logger.info("IP address changed from %s to %s", old, new) + # Then perform whatever action required for your use case, e.g., update an + # ir.config_parameter, send an email, contact an external firewall service's API, ... + return 'ok' +``` + diff --git a/content/administration/odoo_sh/advanced/submodules.md b/content/administration/odoo_sh/advanced/submodules.md new file mode 100644 index 000000000..0bf67f748 --- /dev/null +++ b/content/administration/odoo_sh/advanced/submodules.md @@ -0,0 +1,108 @@ +(odoosh-advanced-submodules)= + +# Submodules + +## Overview + +A [Git submodule](https://git-scm.com/book/en/v2/Git-Tools-Submodules) allows you to integrate other Git projects +into your code, without the need to copy-paste all their code. + +Indeed, your custom modules can depend on modules from other repositories. +Regarding Odoo, this feature allows you to add modules from other Git repositories into the branches of your repository. +Adding these dependencies in your branch through submodules makes the deployment of your code and servers easier, +as you can clone the repositories added as submodules at the same time you clone your own repository. + +Besides, you can choose the branch of the repository added as submodule +and you have the control of the revision you want. +It's up to you to decide whether you want to pin the submodule to a specific revision and when you want to update +to a newer revision. + +In Odoo.sh, the submodules give you the possibility to use and depend on modules available in other repositories. +The platform will detect that you added modules through submodules in your branches +and add them to your addons path automatically so you can install them in your databases. + +If you add private repositories as submodules in your branches, +you need to configure a deploy key in your Odoo.sh project settings and in your repository settings. +Otherwise Odoo.sh won't be allowed to download them. +The procedure is detailed in the chapter {ref}`Settings > Submodules `. + +## Adding a submodule + +### With Odoo.sh (simple) + +:::{warning} +For now it is not possible to add **private** repositories with this method. You can nevertheless +do so {ref}`with Git `. +::: + +On Odoo.sh, in the branches view of your project, choose the branch in which you want to add a submodule. + +In the upper right corner, click on the *Submodule* button, and then on *Run*. + +```{image} submodules/advanced-submodules-button.png +:align: center +``` + +A dialog with a form is shown. Fill the inputs as follows: + +- Repository URL: The SSH URL of the repository. +- Branch: The branch you want to use. +- Path: The folder in which you want to add this submodule in your branch. + +```{image} submodules/advanced-submodules-dialog.png +:align: center +``` + +On Github, you can get the repository URL with the *Clone or download* button of the repository. Make sure to *use SSH*. + +```{image} submodules/advanced-submodules-github-sshurl.png +:align: center +``` + +(odoosh-advanced-submodules-withgit)= + +### With Git (advanced) + +In a terminal, in the folder where your Git repository is cloned, +checkout the branch in which you want to add a submodule: + +```bash +$ git checkout +``` + +Then, add the submodule using the command below: + +```bash +$ git submodule add -b : +``` + +Replace + +- *\:\* by the SSH URL of the repository you want to add as submodule, +- *\* by the branch you want to use in the above repository, +- *\* by the folder in which you want to add this submodule. + +Commit and push your changes: + +```bash +$ git commit -a && git push -u +``` + +Replace + +- \ by the repository on which you want to push your changes. For a standard Git setup, this is *origin*. +- \ by the branch on which you want to push your changes. + Most likely the branch you used {code}`git checkout` on in the first step. + +You can read the [git-scm.com documentation](https://git-scm.com/book/en/v2/Git-Tools-Submodules) +for more details about the Git submodules. +For instance, if you would like to update your submodules to have their latest revision, +you can follow the chapter +[Pulling in Upstream changes](https://git-scm.com/book/en/v2/Git-Tools-Submodules#_pulling_in_upstream_changes_from_the_submodule_remote). + +## Ignore modules + +If you're adding a repository that contains a lot of modules, you may want to ignore some of them in case there are any +that are installed automatically. To do so, you can prefix your submodule folder with a {code}`.`. The platform will +ignore this folder and you can hand pick your modules by creating symlinks to them from another folder. + diff --git a/content/administration/odoo_sh/getting_started.md b/content/administration/odoo_sh/getting_started.md new file mode 100644 index 000000000..75c221ee1 --- /dev/null +++ b/content/administration/odoo_sh/getting_started.md @@ -0,0 +1,18 @@ +--- +nosearch: true +--- + +# Get started + +```{toctree} +:titlesonly: true + +getting_started/create +getting_started/branches +getting_started/builds +getting_started/status +getting_started/settings +getting_started/online-editor +getting_started/first_module +``` + diff --git a/content/administration/odoo_sh/getting_started/branches.md b/content/administration/odoo_sh/getting_started/branches.md new file mode 100644 index 000000000..5e78204c7 --- /dev/null +++ b/content/administration/odoo_sh/getting_started/branches.md @@ -0,0 +1,555 @@ +# Branches + +## Overview + +The branches view gives you an overview of the different branches your repository has. + +```{image} branches/interface-branches.png +:align: center +``` + +(odoosh-gettingstarted-branches-stages)= + +## Stages + +Odoo.sh offers three different stages for your branches: production, staging and development. + +You can change the stage of a branch by drag and dropping it into the stage section title. + +```{image} branches/interface-branches-stagechange.png +:align: center +``` + +(stage-production)= + +### Production + +This is the branch holding the code on which your production database runs. +There can be only one production branch. + +When you push a new commit in this branch, +your production server is updated with the code of the new revision and is then restarted. + +If your changes require the update of a module, such as a change in a form view, +and you want it to be performed automatically, +increase the version number of the module in its manifest (*\_\_manifest\_\_.py*). +The platform will then take care to perform the update during which the +instance will be held temporarily unavailable for maintenance reason. + +This method is equivalent to perform an upgrade of the module through the Apps menu, +or through the {code}`-u` switch of +{doc}`the command line `. + +In the case the changes in the commit prevent the server to restart, +or if the modules update fails, +the server is automatically reverted to the previous successful code revision and +the database is roll-backed as it was before the update. +You still have access to the log of the failed update, so you can troubleshoot it. + +The demo data is not loaded, as it is not meant to be used in a production database. +The unit tests are not performed, as it would increase the unavailability time of the production +database during the updates. + +Partners using trial projects should be aware their production branch, along with all the staging branches, +will automatically be set back to the development stage after 30 days. + +### Staging + +Staging branches are meant to test your new features using the production data without compromising +the actual production database with test records. They will create databases that are neutralized +duplicates of the production database. + +The neutralization includes: + +- Disabling scheduled actions. If you want to test them, you can trigger their action manually or + re-enable them. Be aware that the platform will trigger them less often if no one is using the + database in order to save up resources. +- Disabling outgoing emails by intercepting them with a mailcatcher. An + {ref}`interface to view ` the emails sent by your + database is provided. That way, you do not have to worry about sending test emails to your contacts. +- Setting payment providers and shipping providers in test mode. +- Disabling IAP services + +The latest database will be kept alive indefinitely, older ones from the same branch may get garbage collected +to make room for new ones. It will be valid for 3 months, after which you will be expected to rebuild the branch. +If you make configuration or view changes in these databases, make sure to document them or write them directly +in the modules of the branch, using XML data files overriding the default configuration or views. + +The unit tests are not performed as, in Odoo, they currently rely on the demo data, which is not loaded in the +production database. In the future, if Odoo supports to run the unit tests without the demo data, +Odoo.sh will then consider running the tests on staging databases. + +### Development + +Development branches create new databases using the demo data to run the unit tests. +The installed modules are the ones included in your branches. You can change this list of modules +to install in your {ref}`project Settings `. + +When you push a new commit in one of these branches, +a new server is started, with a database created from scratch and the new revision of the branch. +The demo data is loaded, and the unit tests are performed by default. +This verifies your changes do not break any of the features tested by them. If you wish, you can +disable the tests or allow specific tests to be run with custom tags in the {ref}`branch's settings +`. + +Similar to staging branches, the emails are not sent but are intercepted by a mailcatcher and +scheduled actions are not triggered as long as the database is not in use. + +The databases created for development branches are meant to live around three days. +After that, they can be automatically garbage collected to make room for new databases without prior notice. + +(odoosh-gettingstarted-branches-mergingbranches)= + +### Merging your branches + +You can merge your branches easily by drag and dropping them into each other. + +```{image} branches/interface-branches-merge.png +:align: center +``` + +When you want to test the changes of your development branches with the production data, +you can either: + +- merge the development branch into your staging branch, by drag and dropping it onto the desired staging branch, +- drag and dropping the development branch on the staging section title, to make it become a staging branch. + +When your latest changes are ready for production, +you can drag and drop your staging branch onto your production branch +to merge and deploy in production your newest features. + +If you are bold enough, +you can merge your development branches into your production branch as well. +It just means you skip the validation of your changes with the production data through a staging branch. + +You can merge your development branches into each other, and your staging branches into each other. + +Of course, you can also use {code}`git merge` directly on your workstation to merge your branches. +Odoo.sh will be notified when new revisions have been pushed in your branches. + +Merging a staging branch in the production branch only merges the source code: Any configuration changes you made in the +staging databases are not passed to the production database. + +If you test configuration changes in staging branches, and want them to be applied in the production, you have to either: + +- write the configuration changes in XML data files + overriding the default configuration or views in your branches, + and then increase the version of your module in its manifest (*\_\_manifest\_\_.py*) to trigger the update of the module + when you merge your staging branch in your production branch. + This is the best practice for a better scalability of your developments as you will use the Git versioning features + for all your configuration changes, and therefore have a traceability for your changes. +- pass them manually from your staging to your production database, by copy/pasting them. + +(odoosh-gettingstarted-branches-tabs)= + +## Tabs + +### History + +An overview of your branch history: + +- The messages of the commits and their authors, +- The various events linked to the platform, such as stage changes, database imports, backup restores. + +```{image} branches/interface-branches-history.png +:align: center +``` + +For each event, a status is displayed in the top right-hand corner. +It can provide information about the ongoing operation on the database (installation, update, backup import, ...), +or its result (tests feedback, successful backup import, ...). +When an operation is successful, you can access the database thanks to the *connect* button. + +(odoosh-gettingstarted-branches-tabs-mails)= + +### Mails + +This tab contains the mail catcher. It displays an overview of the emails sent by your database. +The mail catcher is available for your development and +staging branches as the emails of your production database are really sent instead of being intercepted. + +```{image} branches/interface-branches-mails.png +:align: center +:scale: 50% +``` + +### Shell + +A shell access to your container. You can perform basic linux commands ({code}`ls`, {code}`top`) +and open a shell on your database by typing {code}`psql`. + +```{image} branches/interface-branches-shell.png +:align: center +``` + +You can open multiple tabs and drag-and-drop them to arrange the layout as you wish, +for instance side by side. + +:::{Note} +Long running shell instances are not guaranteed. Idle shells can be +disconnected at anytime in order to free up resources. +::: + +### Editor + +An online integrated development environment (IDE) to edit the source code. +You can also open terminals, Python consoles and even Odoo Shell consoles. + +```{image} branches/interface-branches-editor.png +:align: center +``` + +You can open multiple tabs and drag-and-drop them to arrange the layout as you wish, +for instance side by side. + +### Monitoring + +This link contains various monitoring metrics of the current build. + +```{image} branches/interface-branches-monitoring.png +:align: center +``` + +You can zoom, change the time range or select a specific metric on each graph. +On the graphs, annotations help you relate to changes on the build (database import, git push, etc...). + +(odoosh-logs)= + +### Logs + +A viewer to have a look to your server logs. + +```{image} branches/interface-branches-logs.png +:align: center +``` + +Different logs are available: + +- install.log: The logs of the database installation. In a development branch, the logs of the tests are included. +- pip.log: The logs of the Python dependencies installation. +- odoo.log: The logs of the running server. +- update.log: The logs of the database updates. +- pg_long_queries.log: The logs of psql queries that take an unusual amount of time. + +If new lines are added in the logs, they will be displayed automatically. +If you scroll to the bottom, the browser will scroll automatically each time a new line is added. + +You can pause the logs fetching by clicking on the according button in the upper right corner of the view. +The fetching is automatically stopped after 5 minutes. You can restart it using the play button. + +(odoo-sh-branches-backups)= + +### Backups + +A list of the backups available for download and restore, the ability to perform a manual backup and to import a +database. + +```{image} branches/interface-branches-backups.png +:align: center +``` + +Odoo.sh makes daily backups of the production database. It keeps 7 daily, 4 weekly and 3 monthly backups. +Each backup includes the database dump, the filestore (attachments, binary fields), logs and sessions. + +Staging and development databases are not backed up. +You nevertheless have the possibility to restore a backup of the production database in your staging branches, for +testing purposes, or to manually recover data that has been deleted by accident from the production database. + +The list contains the backups kept on the server your production database is hosted on. +This server only keeps one month of backups: 7 daily and 4 weekly backups. + +Dedicated backup servers keep the same backups, as well as 3 additional monthly backups. +To restore or download one of these monthly backups, please [contact us](https://www.odoo.com/help). + +If you merge a commit updating the version of one or several modules (in {file}`__manifest__.py`), or their linked python +dependencies (in {file}`requirements.txt`), then Odoo.sh performs a backup automatically (flagged with type Update in the list), +as either the container will be changed by the installation of new pip packages, either the database itself will be +changed with the module update triggered afterwards. In these two cases, we are doing a backup as it may potentially +break things. + +If you merge a commit that only changes some code without the above-mentioned modifications, then no backup is done +by Odoo.sh, as neither the container nor the database is modified so the platform considers this safe enough. Of course, +as an extra precaution, you can make a backup manually before making big changes in your production sources in case +something goes wrong (those manual backups are available for about one week). To avoid abuse, we limit manual backups +to 5 per day. + +The *import database* feature accepts database archives in the format provided by: + +- the standard Odoo databases manager, + (available for on-premise Odoo servers under {code}`/web/database/manager`) +- the Odoo online databases manager, +- the Odoo.sh backup download button of this *Backups* tab, +- the Odoo.sh dump download button in the {ref}`Builds view `. + +(odoo-sh-upgrade)= + +### Upgrade + +Available for production and staging branches for valid projects. + +:::{seealso} +{doc}`Upgrade documentation <../../upgrade>` +::: + +(odoosh-gettingstarted-branches-tabs-settings)= + +### Settings + +Here you can find a couple of settings that only apply to the currently selected branch. + +```{image} branches/interface-branches-settings.jpg +:align: center +``` + +**Behaviour upon new commit** + +For development and staging branches, you can change the branch's behavior upon receiving a new +commit. By default, a development branch will create a new build and a staging branch will update +the previous build (see the {ref}`Production Stage `). This is especially useful +should the feature you're working on require a particular setup or configuration, to avoid having +to manually set it up again on every commit. If you choose new build for a staging branch, it will +make a fresh copy from the production build every time a commit is pushed. A branch that is put +back from staging to development will automatically be set to 'Do nothing'. + +**Modules installation** + +Choose the modules to install automatically for your development builds. + +```{image} branches/interface-settings-modulesinstallation.png +:align: center +``` + +- *Install only my modules* will install the modules of the branch only. This is the default option. + The {ref}`submodules ` are excluded. +- *Full installation (all modules)* will install the modules of the branch, the modules included in the submodules + and all standard modules of Odoo. When running the full installation, the test suite is disabled. +- *Install a list of modules* will install the modules specified in the input just below this option. + The names are the technical name of the modules, and they must be comma-separated. + +If the tests are enabled, the standard Odoo modules suite can take up to 1 hour. +This setting applies to development builds only. +Staging builds duplicate the production build and the production build only installs base. + +**Test suite** + +For development branches, you can choose to enable or disable the test suite. It's enabled by default. +When the test suite is enabled, you can restrict them by specifying test tags {ref}`test tags +`. + +**Odoo Version** + +For development branches only, you can change the version of Odoo, should you want to test upgraded code or develop +features while your production database is in the process of being upgraded to a newer version. + +In addition, for each version you have two options regarding the code update. + +- You can choose to benefit from the latest bug, security and performance fixes automatically. The + sources of your Odoo server will be updated weekly. This is the 'Latest' option. +- You can choose to pin the Odoo sources to a specific revision by selecting them from a list of + dates. Revisions will expire after 3 months. You will be notified by mail when the expiration + date approaches and if you don't take action afterwards, you will automatically be set to the + latest revision. + +**Custom domains** + +Here you can configure additional domains for the selected branch. It's possible to add other +*\.odoo.com* domains or your own custom domains. For the latter you have to: + +- own or purchase the domain name, +- add the domain name in this list, +- in your registrar's domain name manager, + configure the domain name with a `CNAME` record set to your production database domain name. + +For instance, to associate *www.mycompany.com* to your database *mycompany.odoo.com*: + +- in Odoo.sh, add *www.mycompany.com* in the custom domains of your project settings, +- in your domain name manager (e.g. *godaddy.com*, *gandi.net*, *ovh.com*), + configure *www.mycompany.com* with a `CNAME` record with as value *mycompany.odoo.com*. + +Bare domains (e.g. *mycompany.com*) are not accepted: + +- they can only be configured using `A` records, +- `A` records only accept IP addresses as value, +- the IP address of your database can change, following an upgrade, a hardware failure or + your wish to host your database in another country or continent. + +Therefore, bare domains could suddenly no longer work because of this change of IP address. + +In addition, if you would like both *mycompany.com* and *www.mycompany.com* to work with your database, +having the first redirecting to the second is amongst the +[SEO best practices](https://support.google.com/webmasters/answer/7451184?hl=en) +(See *Provide one version of a URL to reach a document*) +in order to have one dominant URL. You can therefore just configure *mycompany.com* to redirect to *www.mycompany.com*. +Most domain managers have the feature to configure this redirection. This is commonly called a web redirection. + +**HTTPS/SSL** + +If the redirection is correctly set up, the platform will automatically generate an SSL certificate +with [Let's Encrypt](https://letsencrypt.org/about/) within the hour and your domain will be +accessible through HTTPS. + +While it is currently not possible to configure your own SSL certificates on the Odoo.sh platform +we are considering the feature if there is enough demand. + +**SPF and DKIM compliance** + +In case the domain of your users email addresses use SPF (Sender Policy Framework) or DKIM +(DomainKeys Identified Mail), don't forget to authorize Odoo as a sending host in your domain name +settings to increase the deliverability of your outgoing emails. The configuration steps are +explained in the documentation about {ref}`SPF ` and {ref}`DKIM +`. + +:::{Warning} +Forgetting to configure your SPF or DKIM to authorize Odoo as a sending host can lead to the +delivery of your emails as spam in your contacts inbox. +::: + +## Shell commands + +In the top right-hand corner of the view, different shell commands are available. + +```{image} branches/interface-branches-shellcommands.png +:align: center +``` + +Each command can be copied in the clipboard to be used in a terminal, +and some of them can be used directly from Odoo.sh by clicking the *run* button +in such case a popup will prompt the user in order to define eventual placeholders +such as ``, ``, ... + +### Clone + +Download the Git repository. + +```bash +$ git clone --recurse-submodules --branch master git@github.com:odoo/odoo.git +``` + +Clones the repository *odoo/odoo*. + +- {code}`--recurse-submodules`: Downloads the submodules of your repository. Submodules included in the submodules are downloaded as well. +- {code}`--branch`: checks out a specific branch of the repository, in this case *master*. + +The *run* button is not available for this command, as it is meant to be used on your machines. + +### Fork + +Create a new branch based on the current branch. + +```bash +$ git checkout -b feature-1 master +``` + +Creates a new branch called *feature-1* based on the branch *master*, and then checkouts it. + +```bash +$ git push -u origin feature-1 +``` + +Uploads the new branch *feature-1* on your remote repository. + +### Merge + +Merge the current branch in another branch. + +```bash +$ git merge staging-1 +``` + +Merges the branch *staging-1* in the current branch. + +```bash +$ git push -u origin master +``` + +Uploads the changes you just added in the *master* branch on your remote repository. + +### SSH + +#### Setup + +In order to use SSH, you have to set up your profile SSH public key (if it is not already done). +To do so, follow these steps: + +1. [Generate a new SSH key](https://help.github.com/en/github/authenticating-to-github/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent#generating-a-new-ssh-key) + +2. [Copy the SSH key to your clipboard](https://help.github.com/en/github/authenticating-to-github/adding-a-new-ssh-key-to-your-github-account) + (only apply the step 1) + +3. Paste the copied content to your profile SSH keys and press "Add" + + ```{image} branches/SSH-key-pasting.png + :align: center + ``` + +4. The key should appear below + + ```{image} branches/SSH-key-appearing.png + :align: center + ``` + +#### Connection + +To connect to your builds using ssh use the following command in a terminal: + +```bash +$ ssh @ +``` + +You will find a shortcut for this command into the SSH tab in the upper right corner. + +```{image} branches/SSH-panel.png +:align: center +``` + +Provided you have the {ref}`correct access rights ` on the project, +you'll be granted ssh access to the build. + +:::{Note} +Long running ssh connections are not guaranteed. Idle connections will be +disconnected in order to free up resources. +::: + +### Submodule + +Add a branch from another repository in your current branch as a *submodule*. + +*Submodules* allows you to use modules from other repositories in your project. + +The submodules feature is detailed in the chapter +{ref}`Submodules ` of this documentation. + +```bash +$ git submodule add -b master +``` + +Adds the branch *master* of the repository *\* as a submodule under the path *\* in your current branch. + +```bash +$ git commit -a +``` + +Commits all your current changes. + +```bash +$ git push -u origin master +``` + +Uploads the changes you just added in the *master* branch on your remote repository. + +### Delete + +Delete a branch from your repository. + +```bash +$ git push origin :master +``` + +Deletes the branch in your remote repository. + +```bash +$ git branch -D master +``` + +Deletes the branch in your local copy of the repository. + diff --git a/content/administration/odoo_sh/getting_started/builds.md b/content/administration/odoo_sh/getting_started/builds.md new file mode 100644 index 000000000..93f5009d4 --- /dev/null +++ b/content/administration/odoo_sh/getting_started/builds.md @@ -0,0 +1,118 @@ +(odoosh-gettingstarted-builds)= + +# Builds + +## Overview + +In Odoo.sh, a build is considered as a database loaded by an Odoo server +([odoo/odoo](https://github.com/odoo/odoo) & [odoo/enterprise](https://github.com/odoo/enterprise)) running on a specific revision of your project repository in +a containerized environment. Its purpose is to test the well-behavior of the server, the database +and the features with this revision. + +```{image} builds/interface-builds.png +:align: center +``` + +In this view, a row represents a branch, and a cell of a row represents a build of this branch. + +Most of the time, builds are created following pushes on your Github repository branches. +They can be created as well when you do other operations, +such as importing a database on Odoo.sh or asking a rebuild for a branch in your project. + +A build is considered successful if no errors or warnings come up during its creation. +A successful build is highlighted in green. + +A build is considered failed if errors come up during its creation. +A failed build is highlighted in red. + +If warnings come up during the creation, but there are no errors, the build is considered almost +successful. It is highlighted in yellow to notify the developer warnings were raised. + +Builds do not always create a database from scratch. For instance, when pushing a change on the +production branch, the build created just starts the server with your new revision and tries to load +the current production database on it. If no errors come up, the build is considered successful, and +otherwise failed. + +## Stages + +### Production + +The first build of a production branch creates a database from scratch. +If this build is successful, this database is considered as the production database of your project. + +From then, pushes on the production branch will create new builds that attempt to load the database +using a server running with the new revision. + +If the build is successful, or has warnings but no errors, the production database will now run with +this build, along with the revision associated to this build. + +If the build fails to load or update the database, then the previous successful build is re-used to +load the database, and therefore the database will run using a server running with the previous +successful revision. + +The build used to run the production database is always the first of the builds list. If a build +fails, it is put after the build currently running the production database. + +### Staging + +Staging builds duplicate the production database, +and try to load this duplicate with the revisions of the staging branches. + +Each time you push a new revision on a staging branch, the build created uses a new copy of the +production database. The databases are not re-used between builds of the same branch. This ensures: + +- staging builds use databases that are close to what the production looks like, so you do not make + your tests with outdated data, +- you can play around as much as you want in the same staging database, and you can then ask for a + rebuild when you want to restart with a new copy of the production. + +Nevertheless, this means that if you make configuration changes in staging databases and do not +apply them in the production, they will not be passed on the next build of the same staging branch. + +### Development + +Development builds create new databases, load the demo data and run the unit tests. + +A build will be considered failed and highlighted in red if tests fail during the installation, +as they are meant to raise errors if something wrong occurs. + +If all tests pass, and there is no error, the build will be considered successful. + +According to the list of modules to install and test, a development build can take up to 1 hour to +be ready. This is due to the large number of tests set in the default Odoo modules suite. + +## Features + +The production branch will always appear first, and then the other branches are ordered by last +build created. You can filter out the branches. + +```{image} builds/interface-builds-branches.png +:align: center +``` + +For each branch, you can access the last build's database using the *Connect* link and jump to the +branch code using the *Github* link. For other branches than the production, you can create a new +build which will use the latest revision of the branch using the link *rebuild*. This last link is +not available when there is already a build in progress for the branch. + +```{image} builds/interface-builds-build.png +:align: center +``` + +For each build, you can access the revision changes using the button with the Github icon. You can +access the build's database as the administrator using the *Connect* button. Also, you can access +the database with another user using the *Connect as* button, in the dropdown menu of the *Connect* +button. + +(odoosh-gettingstarted-builds-download-dump)= + +```{image} builds/interface-builds-build-dropdown.png +:align: center +``` + +(odoosh-gettingstarted-builds-dropdown-menu)= + +In the dropdown menu of the build, you can access the same features than in {ref}`the branches view +`: *Logs*, *Web Shell*, *Editor*, *Outgoing e-mails*. You also +have the possibility to *Download a dump* of the build's database. + diff --git a/content/administration/odoo_sh/getting_started/create.md b/content/administration/odoo_sh/getting_started/create.md new file mode 100644 index 000000000..aa6779193 --- /dev/null +++ b/content/administration/odoo_sh/getting_started/create.md @@ -0,0 +1,198 @@ +(odoosh-gettingstarted-create)= + +# Create your project + +## Deploy your platform + +Go to [Odoo.sh](https://www.odoo.sh/) and hit the *Deploy your platform* button. + +```{image} create/deploy.png +:align: center +``` + +## Sign in with Github + +Sign in with your Github account. If you do not have an account yet, hit the *Create an account* +link. + +```{image} create/github-signin.png +:align: center +``` + +## Authorize Odoo.sh + +Grant Odoo.sh the required accesses to your account by clicking the *Authorize* button. + +```{image} create/github-authorize.png +:align: center +``` + +Odoo.sh basically needs: + +- to know your Github login and email, +- to create a new repository in case you decide to start from scratch, +- to read your existing repositories, including the ones of your organizations, in case you want to + start from an existing repository, +- to create a webhook to be notified each time you push changes, +- to commit changes to make your deployment easier, merging branches or adding new [submodules](https://git-scm.com/book/en/v2/Git-Tools-Submodules) for example. + +## Submit your project + +Choose if you want to start from scratch by creating a new repository, or if you want to use an +existing repository. + +Then, choose a name or select the repository you want to use. + +Choose the Odoo version you want to use. If you plan to import an existing database or an existing +set of applications, you might need to choose the according version. If you start from scratch, use +the latest version. + +Enter your *subscription code*. This is also called *subscription referral*, *contract number* or +*activation code*. + +It should be the code of your Enterprise subscription that includes Odoo.sh. + +Partners can use their partnership codes to start a trial. Should their clients start a project, +they ought to get an Enterprise subscription including Odoo.sh and use its subscription code. The +partner will get 50% of the amount back as commission. Contact your sales representative or account +manager in order to get it. + +When submitting the form, if you are notified your subscription is not valid, it either means: + +- it is not an existing subscription, +- it is not a partnership subscription, +- it is an enterprise subscription, but which does not include Odoo.sh, +- it is neither a partnership subscription or an enterprise subscription (e.g. an online + subscription). + +In case of doubt with your subscription, please contact the [Odoo support](https://www.odoo.com/help). + +```{image} create/deploy-form.png +:align: center +``` + +## You're done ! + +You can start using Odoo.sh. Your first build is about to be created. You will soon be able to +connect to your first database. + +```{image} create/deploy-done.png +:align: center +``` + +(odoo-sh-import-your-database)= + +## Import your database + +You can import your database in your Odoo.sh project as long as it is in a {doc}`supported version +` of Odoo. + +### Push your modules in production + +If you use community or custom modules, add them in a branch in your Github repository. +Databases hosted on the Odoo.com online platform do not have any custom modules. +Users of these databases can therefore skip this step. + +You can structure your modules as you wish, Odoo.sh will automatically detect the folders containing +Odoo addons. For instance, you can put all your modules folder in the root directory of your +repository, or group the modules in folders by categories that you define (accounting, project, +...). + +For community modules available in public Git repositories, +you can also consider to add them using {ref}`Submodules `. + +Then, either {ref}`make this branch the production branch `, +or {ref}`merge it into your production branch `. + +### Download a backup + +#### On-premise databases + +Access the URL {file}`/web/database/manager` of your on-premise database and download a backup. + +:::{Warning} +If you cannot access the database manager, it may have been disabled by your system administrator. +See the {ref}`database manager security documentation `. +::: + +You will need the master password of your database server. If you do not have it, contact your +system administrator. + +```{image} create/create-import-onpremise-backup.png +:align: center +``` + +Choose a zip including the filestore as the backup format. + +```{image} create/create-import-onpremise-backup-dialog.png +:align: center +``` + +#### Odoo Online databases + +[Access your databases manager](https://accounts.odoo.com/my/databases/manage) and download a +backup of your database. + +```{image} create/create-import-online-backup.png +:align: center +``` + +:::{Warning} +Online versions (e.g. *saas-\**) are not supported on Odoo.sh. +::: + +### Upload the backup + +Then, in your Odoo.sh project, in the backups tab of your production branch, import the backup you +just downloaded. + +```{image} create/create-import-production.png +:align: center +``` + +Once the backup imported, you can access the database using the *Connect* button in the history of +the branch. + +```{image} create/create-import-production-done.png +:align: center +``` + +### Check your outgoing email servers + +There is a default mail server provided with Odoo.sh. +To use it, there must be no enabled outgoing mail server configured in your database in +{menuselection}`Settings --> Technical --> Outgoing Mail Servers` ({ref}`Developer mode +` must be activated). + +After the import of your database, all outgoing email servers are disabled so you use the Odoo.sh +email server provided by default. + +:::{warning} +Port 25 is (and will stay) closed. If you want to connect to an external SMTP server, you should +use ports 465 and 587. +::: + +### Check your scheduled actions + +All scheduled actions are disabled after the import. + +This is to prevent your newly imported database to perform actions that could impact your running +production, such as sending the mails remaining in the queue, processing mass mailings, or +third-party services synchronization (Calendars, files hosting, ...). + +If you plan to make the imported database your production, enable the scheduled actions you need. +You can check what is enabled in the database of origin and enable the same actions in the imported +database. Scheduled actions are located under {menuselection}`Settings --> Technical --> Automation +--> Scheduled Actions`. + +### Register your subscription + +Your subscription is unlinked after the import. + +The imported database is considered a duplicate by default and the enterprise subscription is +therefore removed, as you can only have one database linked per subscription. + +If you plan to make it your production, unlink your former database from the subscription, and +register the newly imported database. Read the {doc}`database registration documentation +<../../on_premise>` for instructions. + diff --git a/content/administration/odoo_sh/getting_started/first_module.md b/content/administration/odoo_sh/getting_started/first_module.md new file mode 100644 index 000000000..007114c87 --- /dev/null +++ b/content/administration/odoo_sh/getting_started/first_module.md @@ -0,0 +1,542 @@ +--- +substitutions: + pic1: |- + ```{image} first_module/firstmodule-development-+.png + :width: 45% + ``` + pic2: |- + ```{image} first_module/firstmodule-development-fork.png + :width: 45% + ``` +--- + +# Your first module + +## Overview + +This chapter helps you to create your first Odoo module and deploy it in your Odoo.sh project. + +This tutorial requires {ref}`you created a project on Odoo.sh `, and +you know your Github repository's URL. + +Basic use of Git and Github is explained. + +The below assumptions are made: + +- *~/src* is the directory where are located the Git repositories related to your Odoo projects, +- *odoo* is the Github user, +- *odoo-addons* is the Github repository, +- *feature-1* is the name of a development branch, +- *master* is the name of the production branch, +- *my_module* is the name of the module. + +Replace these by the values of your choice. + +## Create the development branch + +### From Odoo.sh + +In the branches view: + +- hit the {code}`+` button next to the development stage, + +- choose the branch *master* in the *Fork* selection, + +- type *feature-1* in the *To* input. + + {{ pic1 }} {{ pic2 }} + +Once the build created, you can access the editor and browse to the folder *~/src/user* to access +to the code of your development branch. + +```{image} first_module/firstmodule-development-editor.png +:align: center +``` + +```{image} first_module/firstmodule-development-editor-interface.png +:align: center +``` + +### From your computer + +Clone your Github repository on your computer: + +```bash +$ mkdir ~/src +$ cd ~/src +$ git clone https://github.com/odoo/odoo-addons.git +$ cd ~/src/odoo-addons +``` + +Create a new branch: + +```bash +$ git checkout -b feature-1 master +``` + +## Create the module structure + +### Scaffolding the module + +While not necessary, scaffolding avoids the tedium of setting the basic Odoo module structure. +You can scaffold a new module using the executable *odoo-bin*. + +From the Odoo.sh editor, in a terminal: + +```bash +$ odoo-bin scaffold my_module ~/src/user/ +``` + +Or, from your computer, if you have an {doc}`installation of Odoo <../../on_premise/source>`: + +```bash +$ ./odoo-bin scaffold my_module ~/src/odoo-addons/ +``` + +If you do not want to bother installing Odoo on your computer, +you can also {download}`download this module structure template ` in +which you replace every occurrences of *my_module* to the name of your choice. + +The below structure will be generated: + +``` +my_module +├── __init__.py +├── __manifest__.py +├── controllers +│   ├── __init__.py +│   └── controllers.py +├── demo +│   └── demo.xml +├── models +│   ├── __init__.py +│   └── models.py +├── security +│   └── ir.model.access.csv +└── views + ├── templates.xml + └── views.xml +``` + +:::{warning} +Do not use special characters other than the underscore ( _ ) for your module name, not even an +hyphen ( - ). This name is used for the Python classes of your module, and having classes name +with special characters other than the underscore is not valid in Python. +::: + +Uncomment the content of the files: + +- *models/models.py*, + an example of model with its fields, + +- *views/views.xml*, + a tree and a form view, with the menus opening them, + +- *demo/demo.xml*, + demo records for the above example model, + +- *controllers/controllers.py*, + an example of controller implementing some routes, + +- *views/templates.xml*, + two example qweb views used by the above controller routes, + +- *\_\_manifest\_\_.py*, + the manifest of your module, including for instance its title, description and data files to load. + You just need to uncomment the access control list data file: + + ```python + # 'security/ir.model.access.csv', + ``` + +### Manually + +If you want to create your module structure manually, +you can follow the {doc}`/developer/tutorials/server_framework_101` tutorial to understand +the structure of a module and the content of each file. + +## Push the development branch + +Stage the changes to be committed + +```bash +$ git add my_module +``` + +Commit your changes + +```bash +$ git commit -m "My first module" +``` + +Push your changes to your remote repository + +From an Odoo.sh editor terminal: + +```bash +$ git push https HEAD:feature-1 +``` + +The above command is explained in the section +{ref}`Commit & Push your changes +` of the +{ref}`Online Editor ` +chapter. +It includes the explanation regarding the fact you will be prompted to type your username and +password, and what to do if you use the two-factor authentication. + +Or, from your computer terminal: + +```bash +$ git push -u origin feature-1 +``` + +You need to specify *-u origin feature-1* for the first push only. +From that point, to push your future changes from your computer, you can simply use + +```bash +$ git push +``` + +## Test your module + +Your branch should appear in your development branches in your project. + +```{image} first_module/firstmodule-test-branch.png +:align: center +``` + +In the branches view of your project, +you can click on your branch name in the left navigation panel to access its history. + +```{image} first_module/firstmodule-test-branch-history.png +:align: center +``` + +You can see here the changes you just pushed, including the comment you set. +Once the database ready, you can access it by clicking the *Connect* button. + +```{image} first_module/firstmodule-test-database.png +:align: center +``` + +If your Odoo.sh project is configured to install your module automatically, +you will directly see it amongst the database apps. Otherwise, it will be available in the apps to +install. + +You can then play around with your module, create new records and test your features and buttons. + +## Test with the production data + +You need to have a production database for this step. You can create it if you do not have it yet. + +Once you tested your module in a development build with the demo data and believe it is ready, +you can test it with the production data using a staging branch. + +You can either: + +- Make your development branch a staging branch, by drag and dropping it onto the *staging* section + title. + + ```{image} first_module/firstmodule-test-devtostaging.png + :align: center + ``` + +- Merge it in an existing staging branch, by drag and dropping it onto the given staging branch. + + ```{image} first_module/firstmodule-test-devinstaging.png + :align: center + ``` + +You can also use the {code}`git merge` command to merge your branches. + +This will create a new staging build, which will duplicate the production database and make it run +using a server updated with your latest changes of your branch. + +```{image} first_module/firstmodule-test-mergedinstaging.png +:align: center +``` + +Once the database ready, you can access it using the *Connect* button. + +(odoosh-gettingstarted-firstmodule-productiondata-install)= + +### Install your module + +Your module will not be installed automatically, you have to install it from the apps menu. Indeed, +the purpose of the staging build is to test the behavior of your changes as it would be on your +production, and on your production you would not like your module to be installed automatically, but +on demand. + +Your module may not appear directly in your apps to install either, you need to update your apps +list first: + +- Activate the {ref}`developer mode ` + +- in the apps menu, click the *Update Apps List* button, + +- in the dialog that appears, click the *Update* button. + + ```{image} first_module/firstmodule-test-updateappslist.png + :align: center + ``` + +Your module will then appear in the list of available apps. + +```{image} first_module/firstmodule-test-mymoduleinapps.png +:align: center +``` + +## Deploy in production + +Once you tested your module in a staging branch with your production data, +and believe it is ready for production, you can merge your branch in the production branch. + +Drag and drop your staging branch on the production branch. + +```{image} first_module/firstmodule-test-mergeinproduction.png +:align: center +``` + +You can also use the {code}`git merge` command to merge your branches. + +This will merge the latest changes of your staging branch in the production branch, +and update your production server with these latest changes. + +```{image} first_module/firstmodule-test-mergedinproduction.png +:align: center +``` + +Once the database ready, you can access it using the *Connect* button. + +### Install your module + +Your module will not be installed automatically, +you have to install it manually as explained in the +{ref}`above section about installing your module in staging databases +`. + +## Add a change + +This section explains how to add a change in your module by adding a new field in a model and deploy +it. + +From the Odoo.sh editor, +: - browse to your module folder *~/src/user/my_module*, + - then, open the file *models/models.py*. + +Or, from your computer, +: - use the file browser of your choice to browse to your module folder + *~/src/odoo-addons/my_module*, + - then, open the file *models/models.py* using the editor of your choice, + such as *Atom*, *Sublime Text*, *PyCharm*, *vim*, ... + +Then, after the description field + +```python +description = fields.Text() +``` + +Add a datetime field + +```python +start_datetime = fields.Datetime('Start time', default=lambda self: fields.Datetime.now()) +``` + +Then, open the file *views/views.xml*. + +After + +```xml + +``` + +Add + +```xml + +``` + +These changes alter the database structure by adding a column in a table, +and modify a view stored in database. + +In order to be applied in existing databases, such as your production database, +these changes requires the module to be updated. + +If you would like the update to be performed automatically by the Odoo.sh platform when you push +your changes, increase your module version in its manifest. + +Open the module manifest *\_\_manifest\_\_.py*. + +Replace + +```python +'version': '0.1', +``` + +with + +```python +'version': '0.2', +``` + +The platform will detect the change of version and trigger the update of the module upon the new +revision deployment. + +Browse to your Git folder. + +Then, from an Odoo.sh terminal: + +```bash +$ cd ~/src/user/ +``` + +Or, from your computer terminal: + +```bash +$ cd ~/src/odoo-addons/ +``` + +Then, stage your changes to be committed + +```bash +$ git add my_module +``` + +Commit your changes + +```bash +$ git commit -m "[ADD] my_module: add the start_datetime field to the model my_module.my_module" +``` + +Push your changes: + +From an Odoo.sh terminal: + +```bash +$ git push https HEAD:feature-1 +``` + +Or, from your computer terminal: + +```bash +$ git push +``` + +The platform will then create a new build for the branch *feature-1*. + +```{image} first_module/firstmodule-test-addachange-build.png +:align: center +``` + +Once you tested your changes, you can merge your changes in the production branch, for instance by +drag-and-dropping the branch on the production branch in the Odoo.sh interface. As you increased the +module version in the manifest, the platform will update the module automatically and your new field +will be directly available. Otherwise you can manually update the module within the apps list. + +## Use an external Python library + +If you would like to use an external Python library which is not installed by default, +you can define a *requirements.txt* file listing the external libraries your modules depends on. + +:::{note} +- It is not possible to install or upgrade system packages on an Odoo.sh database (e.g., apt + packages). However, under specific conditions, packages can be considered for installation. + This also applies to **Python modules** requiring system packages for their compilation, and + **third-party Odoo modules**. +- **PostgreSQL extensions** are not supported on Odoo.sh. +- For more information, consult our [FAQ](https://www.odoo.sh/faq#install_dependencies). +::: + +The platform will use this file to automatically install the Python libraries your project needs. + +The feature is explained in this section by using the [Unidecode library](https://pypi.python.org/pypi/Unidecode) in your module. + +Create a file *requirements.txt* in the root folder of your repository + +From the Odoo.sh editor, create and open the file ~/src/user/requirements.txt. + +Or, from your computer, create and open the file ~/src/odoo-addons/requirements.txt. + +Add + +```text +unidecode +``` + +Then use the library in your module, for instance to remove accents from characters in the name +field of your model. + +Open the file *models/models.py*. + +Before + +```python +from odoo import models, fields, api +``` + +Add + +```python +from unidecode import unidecode +``` + +After + +```python +start_datetime = fields.Datetime('Start time', default=lambda self: fields.Datetime.now()) +``` + +Add + +```python +@api.model +def create(self, values): + if 'name' in values: + values['name'] = unidecode(values['name']) + return super(my_module, self).create(values) + +def write(self, values): + if 'name' in values: + values['name'] = unidecode(values['name']) + return super(my_module, self).write(values) +``` + +Adding a Python dependency requires a module version increase for the platform to install it. + +Edit the module manifest *\_\_manifest\_\_.py* + +Replace + +```python +'version': '0.2', +``` + +with + +```python +'version': '0.3', +``` + +Stage and commit your changes: + +```bash +$ git add requirements.txt +$ git add my_module +$ git commit -m "[IMP] my_module: automatically remove special chars in my_module.my_module name field" +``` + +Then, push your changes: + +In an Odoo.sh terminal: + +```bash +$ git push https HEAD:feature-1 +``` + +In your computer terminal: + +```bash +$ git push +``` + diff --git a/content/administration/odoo_sh/getting_started/online-editor.md b/content/administration/odoo_sh/getting_started/online-editor.md new file mode 100644 index 000000000..60b5de47d --- /dev/null +++ b/content/administration/odoo_sh/getting_started/online-editor.md @@ -0,0 +1,203 @@ +(odoosh-gettingstarted-online-editor)= + +# Online Editor + +## Overview + +The online editor allows you to edit the source code of your builds from a web browser. +It also gives you the possibility to open terminals, Python consoles, Odoo Shell consoles and +[Notebooks](https://jupyterlab.readthedocs.io/en/stable/user/notebook.html). + +```{image} online-editor/interface-editor.png +:align: center +``` + +You can access the editor of a build through +{ref}`the branches tabs `, +{ref}`the builds dropdown menu ` +or by adding */odoo-sh/editor* to your build domain name +(e.g. *https://odoo-addons-master-1.dev.odoo.com/odoo-sh/editor*). + +## Edit the source code + +The working directory is composed of the following folders: + +``` +. +├── home +│ └── odoo +│ ├── src +│ │ ├── odoo Odoo Community source code +│ │ │ └── odoo-bin Odoo server executable +│ │ ├── enterprise Odoo Enterprise source code +│ │ ├── themes Odoo Themes source code +│ │ └── user Your repository branch source code +│ ├── data +│ │ ├── filestore database attachments, as well as the files of binary fields +│ │ └── sessions visitors and users sessions +│ └── logs +│ ├── install.log Database installation logs +│ ├── odoo.log Running server logs +│ ├── update.log Database updates logs +│ └── pip.log Python packages installation logs +``` + +You can edit the source code (files under */src*) in development and staging builds. + +:::{note} +Your changes won't be propagated to a new build, you must commit them in your +source code if you want to make them persist. +::: + +For production builds, the source code is read-only, because applying local changes on a production +server is not a good practice. + +- The source code of your Github repository is located under */src/user*, + +- The source code of Odoo is located under + + - */src/odoo* ([odoo/odoo](https://github.com/odoo/odoo)), + - */src/enterprise* ([odoo/enterprise](https://github.com/odoo/enterprise)), + - */src/themes* ([odoo/design-themes](https://github.com/odoo/design-themes)). + +To open a file in the editor, just double-click on it in the file browser panel on the left. + +```{image} online-editor/interface-editor-open-file.png +:align: center +``` + +You can then begin to make your changes. You can save your changes with the menu +{menuselection}`File --> Save .. File` or by hitting the {kbd}`Ctrl+S` shortcut. + +```{image} online-editor/interface-editor-save-file.png +:align: center +``` + +If you save a Python file which is under your Odoo server addons path, +Odoo will detect it and reload automatically so your changes are reflected immediately, +without having to restart the server manually. + +```{image} online-editor/interface-editor-automaticreload.gif +:align: center +``` + +However, if the change is a data stored in database, such as the label of a field, or a view, +you have to update the according module to apply the change. +You can update the module of the currently opened file by using the menu +{menuselection}`Odoo --> Update current module`. Note that the file considered as currently opened +is the file focused in the text editor, not the file highlighted in the file browser. + +```{image} online-editor/interface-editor-update-current-module.png +:align: center +``` + +You can also open a terminal and execute the command: + +```bash +$ odoo-bin -u --stop-after-init +``` + +(odoosh-gettingstarted-online-editor-push)= + +## Commit & Push your changes + +You have the possibility to commit and push your changes to your Github repository. + +- Open a terminal ({menuselection}`File --> New --> Terminal`), +- Change the directory to *~/src/user* using {code}`cd ~/src/user`, +- Stage your changes using {code}`git add`, +- Commit your changes using {code}`git commit`, +- Push your changes using {code}`git push https HEAD:`. + +In this last command, + +- *https* is the name of your *HTTPS* Github remote repository + (e.g. ), +- HEAD is the reference to the latest revision you committed, +- \ must be replaced by the name of the branch to which you want to push the changes, + most-likely the current branch if you work in a development build. + +```{image} online-editor/interface-editor-commit-push.png +:align: center +``` + +:::{note} +The SSH Github remote is not used because your SSH private key +is not hosted in your build containers (for obvious security concerns) +nor forwarded through an SSH Agent (as you access this editor through a web browser) +and you therefore cannot authenticate yourself to Github using SSH. +You have to use the HTTPS remote of your Github repository to push your changes, +which is added automatically named as *https* in your Git remotes. +You will be prompted to enter your Github username and password. +If you activated the two-factor authentication on Github, +you can create a [personal access token](https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/) +and use it as password. Granting the `repo` permission suffices. +::: + +:::{note} +The Git source folder *~/src/user* is not checked out on a branch but rather on a detached revision: +This is because builds work on specific revisions rather than branches. +In other words, this means you can have multiple builds on the same branch, but on different revisions. +::: + +Once your changes are pushed, +according to your {ref}`branch push behavior `, +a new build may be created. You can continue to work in the editor you pushed from, +as it will have the same revision as the new build that was created, but always make sure to be +in an editor of a build using the latest revision of your branch. + +## Consoles + +You can open Python consoles, which are +[IPython interactive shells](https://ipython.readthedocs.io/en/stable/interactive/tutorial.html). +One of the most interesting addition to use a Python console +rather than a IPython shell within a terminal is the +[rich display](https://ipython.readthedocs.io/en/stable/config/integrating.html#rich-display) +capabilities. +Thanks to this, you will be able to display objects in HTML. + +You can for instance display cells of a CSV file using +[pandas](https://pandas.pydata.org/pandas-docs/stable/tutorials.html). + +```{image} online-editor/interface-editor-console-python-read-csv.png +:align: center +``` + +You can also open an Odoo Shell console to play around +with the Odoo registry and model methods of your database. You can also directly read or write +on your records. + +:::{warning} +In an Odoo Console, transactions are automatically committed. +This means, for instance, that changes in records are applied effectively in the database. +If you change the name of a user, the name of the user is changed in your database as well. +You therefore should use Odoo consoles carefully on production databases. +::: + +You can use *env* to invoke models of your database registry, e.g. {code}`env['res.users']`. + +```python +env['res.users'].search_read([], ['name', 'email', 'login']) +[{'id': 2, +'login': 'admin', +'name': 'Administrator', +'email': 'admin@example.com'}] +``` + +The class {code}`Pretty` gives you the possibility +to easily display lists and dicts in a pretty way, using the +[rich display](https://ipython.readthedocs.io/en/stable/config/integrating.html#rich-display) +mentioned above. + +```{image} online-editor/interface-editor-console-odoo-pretty.png +:align: center +``` + +You can also use +[pandas](https://pandas.pydata.org/pandas-docs/stable/tutorials.html) +to display graphs. + +```{image} online-editor/interface-editor-console-odoo-graph.png +:align: center +``` + diff --git a/content/administration/odoo_sh/getting_started/settings.md b/content/administration/odoo_sh/getting_started/settings.md new file mode 100644 index 000000000..f2325e1a4 --- /dev/null +++ b/content/administration/odoo_sh/getting_started/settings.md @@ -0,0 +1,337 @@ +--- +substitutions: + green: "```{raw} html\n\u25CF\n```" + orange: "```{raw} html\n\u25CF\n```" + red: "```{raw} html\n\u25CF\n```" +--- + +# Settings + +## Overview + +The settings allow you to manage the configuration of your project. + +```{image} settings/interface-settings.png +:align: center +``` + +## Project name + +The name of your project. + +```{image} settings/interface-settings-projectname.png +:align: center +``` + +This defines the address that will be used to access your production database. + +Addresses of your staging and development builds are derived from this name and assigned +automatically. However, when you change your project name, only future builds will use the new name. + +(odoosh-gettingstarted-settings-collaborators)= + +## Collaborators + +Manage the Github users who can access your project. + +```{image} settings/interface-settings-collaborators.png +:align: center +``` + +There are three levels of users: + +- {guilabel}`Admin`: has access to all features of an Odoo.sh project. +- {guilabel}`Tester`: has access to the *Staging* and *Development* databases and their tooling. + This role is for users conducting User Acceptance Tests. Testers can work with copies of + production data but cannot access the production database through the Odoo.sh tooling. +- {guilabel}`Developer`: has access only to the *Development* databases and their tooling. This + role is for developers who propose code modifications but are not allowed to access production + and staging databases through the Odoo.sh tooling. + +```{eval-rst} +.. list-table:: + :header-rows: 1 + :widths: auto + + * - + - + - Developer + - Tester + - Admin + * - Development + - History + - |green| + - |green| + - |green| + * - + - 1-click connect + - |green| + - |green| + - |green| + * - + - Logs + - |green| + - |green| + - |green| + * - + - Shell/SSH + - |green| + - |green| + - |green| + * - + - Mails + - |green| + - |green| + - |green| + * - + - Settings + - |green| + - |green| + - |green| + * - Staging + - History + - |green| + - |green| + - |green| + * - + - 1-click connect + - + - |green| + - |green| + * - + - Logs + - + - |green| + - |green| + * - + - Shell/SSH + - + - |green| + - |green| + * - + - Mails + - + - |green| + - |green| + * - + - Monitoring + - + - |green| + - |green| + * - + - Backups + - + - + - |green| + * - + - Upgrade + - + - |green| + - |green| + * - + - Settings + - + - |green| + - |green| + * - Production + - History + - |green| + - |green| + - |green| + * - + - 1-click connect + - + - + - |green| + * - + - Logs + - + - + - |green| + * - + - Shell/SSH + - + - + - |green| + * - + - Mails + - + - + - |green| + * - + - Monitoring + - + - + - |green| + * - + - Backups + - + - + - |green| + * - + - Upgrade + - + - + - |green| + * - + - Settings + - + - + - |green| + * - Status + - + - |green| + - |green| + - |green| + * - Settings + - + - + - + - |green| +``` + +:::{warning} +Those roles only apply to the usage of Odoo.sh. It is important to reflect the user roles +attribution within the repository on GitHub. Please refer to the GitHub documentation section on +[Managing a branch protection rule](https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-protected-branches/managing-a-branch-protection-rule) +for detailed guidance. +::: + +## Public Access + +Allow public access to your development builds. + +```{image} settings/interface-settings-public.png +:align: center +``` + +If activated, this option exposes the Builds page publicly, allowing visitors to view logs of development builds. + +Production and staging builds are excluded, visitors can only see their status. + +(odoosh-gettingstarted-settings-modules-installation)= + +## GitHub commit statuses + +This option enables Odoo.sh to push commit statuses to your GitHub repository when a build is +created or updated. It requires a GitHub token with permissions to push commit statuses to the +repository. Refer to [GitHub's documentation on personal access tokens](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens) +for instructions to create yours. + +:::{note} +GitHub's **fine-grained personal tokens** have an expiration date and will be disabled if they +fail to update the commit status. You can replace the token at any time on Odoo.sh. +::: + +The commit statuses pushed to GitHub can have the following contexts: + +- {guilabel}`ci/odoo.sh (dev)`: status of a development build +- {guilabel}`ci/odoo.sh (staging)`: status of a staging build +- {guilabel}`ci/odoo.sh (production)`: status of a production build +- {guilabel}`ci/odoo.sh (test_ci)`: testing the token from the Settings page will push a test + status on the last commit of your repository + +## Custom domains + +To configure additional domains please refer to the corresponding branch's {ref}`settings tab +`. + +(odoosh-gettingstarted-settings-submodules)= + +## Submodules + +Configure the deploy keys for the private repositories you use +as submodules in your branches to allow Odoo.sh to download them. + +:::{warning} +These settings are required for **private repositories** only. If you are looking on how to set +up your submodules, instructions are available in the chapter {ref}`Submodules +` of this documentation. +::: + +```{image} settings/interface-settings-submodules.png +:align: center +``` + +When a repository is private, it is not possible to publicly download its branches and revisions. +For that reason, you need to configure a deploy key for Odoo.sh, +so the remote Git server allows our platform to download the revisions +of this private repository. + +To configure the deploy key for a private repository, proceed as follows: + +- in the input, paste the SSH URL of your private sub-repository and click on *Add*, + + - e.g. *git@github.com:USERNAME/REPOSITORY.git* + - it can be another Git server than Github, such as Bitbucket, Gitlab or even your own self-hosted + server + +- copy the public key, + + - it should look like *ssh-rsa some...random...characters...here...==* + +- in the settings of the private sub-repository, add the public key amongst the deploy keys. + + - Github.com: {menuselection}`Settings --> Deploy keys --> Add deploy key` + - Bitbucket.com: {menuselection}`Settings --> Access keys --> Add key` + - Gitlab.com: {menuselection}`Settings --> Repository --> Deploy Keys` + - Self-hosted: append the key to the git user’s authorized_keys file in its .ssh directory + +## Storage Size + +This section shows the storage size used by your project. + +```{image} settings/interface-settings-storage.png +:align: center +``` + +Storage size is computed as follows: + +- the size of the PostgreSQL database +- the size of the disk files available in your container: database filestore, sessions storage directory... + +:::{warning} +In case you want to analyze disk usage, you can run the tool [ncdu](https://dev.yorhel.nl/ncdu/man) in your Web Shell. +::: + +Should your production database size grow to exceed what's provisioned in your subscription, it +will automatically be synchronized with it. + +## Database Workers + +Additional database workers can be configured here. More workers help increase the load your +production database is able to handle. If you add more, it will automatically be synchronized +with your subscription. + +```{image} settings/interface-settings-workers.png +:align: center +``` + +:::{Warning} +Adding more workers will not magically solve all performance issues. It only allows the server +to handle more connections at the same time. If some operations are unusually slow, it's most +likely a problem with the code, if it's not due to your own customizations you can open a ticket +[here](https://www.odoo.com/help). +::: + +## Staging Branches + +Additional staging branches allow you to develop and test more features at the same time. If you +add more, it will automatically be synchronized with your subscription. + +```{image} settings/interface-settings-staging-branches.png +:align: center +``` + +## Activation + +Shows the status of the project's activation. You can change the project's activation code if +needed. + +```{image} settings/interface-settings-activation.png +:align: center +``` + diff --git a/content/administration/odoo_sh/getting_started/status.md b/content/administration/odoo_sh/getting_started/status.md new file mode 100644 index 000000000..1c0921795 --- /dev/null +++ b/content/administration/odoo_sh/getting_started/status.md @@ -0,0 +1,11 @@ +# Status + +## Overview + +The status page shows statistics regarding the servers your project uses. It includes the servers +availability. + +```{image} status/interface-status.png +:align: center +``` + diff --git a/content/administration/odoo_sh/overview.md b/content/administration/odoo_sh/overview.md new file mode 100644 index 000000000..25bca7475 --- /dev/null +++ b/content/administration/odoo_sh/overview.md @@ -0,0 +1,12 @@ +--- +nosearch: true +--- + +# Overview + +```{toctree} +:titlesonly: true + +overview/introduction +``` + diff --git a/content/administration/odoo_sh/overview/introduction.md b/content/administration/odoo_sh/overview/introduction.md new file mode 100644 index 000000000..3acae7354 --- /dev/null +++ b/content/administration/odoo_sh/overview/introduction.md @@ -0,0 +1,11 @@ +# Introduction to Odoo.sh + +```{eval-rst} +.. youtube:: QuNsa9n9PMg + :align: right + :width: 700 + :height: 394 +``` + +The documentation will help you go live with your Odoo.sh project in no time. + diff --git a/content/administration/on_premise.md b/content/administration/on_premise.md new file mode 100644 index 000000000..fc431ca88 --- /dev/null +++ b/content/administration/on_premise.md @@ -0,0 +1,116 @@ +--- +show-content: true +--- + +# On-premise + +## Register a database + +To register your database, enter your subscription code in the banner in the app dashboard. If the +registration is successful, the banner will turn green and display the database expiration date. + +:::{tip} +The expiration date is also displayed at the bottom of the Settings page. +::: + +(on-premise-duplicate)= + +## Duplicate a database + +Duplicate a database by accessing the database manager on your server +(`/web/database/manager`). Typically, you want to duplicate your production database +into a neutralized testing database. It can be done by checking the neutralize box when prompted, +which executes all {file}`neutralize.sql` scripts for every installed module. + +## Common error messages and solutions + +### Registration error + +In case of a registration error, the following message should be displayed. + +```{image} on_premise/error-message-sub-code.png +:alt: Database registration error message +``` + +To resolve the issue: + +- Check the **validity of your Odoo Enterprise subscription** by verifying if your subscription + details have the tag {guilabel}`In Progress` on your [Odoo Account](https://accounts.odoo.com/my/subscription) or contact your Account Manager. + +- Ensure that **no other database is linked** to the subscription code, as only one database can be + linked per subscription. + + :::{tip} + If a test or a development database is needed, you can {ref}`duplicate a database + `. + ::: + +- Verify that **no databases share the same UUID** (Universally Unique Identifier) by opening your + [Odoo Contract](https://accounts.odoo.com/my/subscription). If two or more databases share the + same UUID, their name will be displayed. + + ```{image} on_premise/unlink-db-name-collision.png + :alt: Database UUID error message + ``` + + If that is the case, manually change the database(s) UUID or [send a support ticket](https://www.odoo.com/help). + +- As the update notification must be able to reach Odoo's subscription validation servers, ensure + your **network and firewall settings** allow the Odoo server to open outgoing connections + towards: + + - Odoo 18.0 and above: `services.odoo.com` on port `80` + - Odoo 17.0 and below: `services.openerp.com` on port `80` + + These ports must be kept open even after registering a database, as the update notification runs + once a week. + +### Too many users error + +If you have more users in a local database than provisioned in your Odoo Enterprise subscription, +the following message should be displayed. + +```{image} on_premise/add-more-users.png +:alt: Too many users on a database error message +``` + +When the message appears, you have 30 days to act before the database expires. The countdown is +updated every day. + +To resolve the issue, either: + +- **Add more users** to your subscription by clicking the {guilabel}`Upgrade your subscription` link + displayed in the message to validate the upsell quotation and pay for the extra users. +- {ref}`Deactivate users ` and **reject** the upsell quotation. + +Once your database has the correct number of users, the expiration message disappears automatically +after a few days, when the next verification occurs. + +### Database expired error + +If your database expires before you renew your subscription, the following message should be +displayed. + +```{image} on_premise/database-expired.png +:alt: Database expired error message +``` + +This message appears if you fail to act before the end of the 30-day countdown. + +To resolve the issue, either: + +- Click the {guilabel}`Renew your subscription` link displayed in the message and complete the + process. If you pay by wire transfer, your subscription will be renewed when the payment arrives + which can take a few days. Credit card payments are processed immediately. +- [Send a support ticket](https://www.odoo.com/help). + +```{toctree} +on_premise/packages +on_premise/source +on_premise/update +on_premise/deploy +on_premise/email_gateway +on_premise/geo_ip +on_premise/community_to_enterprise +``` + diff --git a/content/administration/on_premise/community_to_enterprise.md b/content/administration/on_premise/community_to_enterprise.md new file mode 100644 index 000000000..09f99f374 --- /dev/null +++ b/content/administration/on_premise/community_to_enterprise.md @@ -0,0 +1,107 @@ +(setup-enterprise)= + +# Switch from Community to Enterprise + +Depending on your current installation, there are multiple ways to upgrade +your community version. +In any case the basic guidelines are: + +- Backup your community database + + ```{image} community_to_enterprise/db_manager.png + :class: img-fluid + ``` + +- Shutdown your server + +- Install the web_enterprise module + +- Restart your server + +- Enter your Odoo Enterprise Subscription code + +```{image} community_to_enterprise/enterprise_code.png +:class: img-fluid +``` + +## On Linux, using an installer + +- Backup your community database + +- Stop the odoo service + + ```console + $ sudo service odoo stop + ``` + +- Install the enterprise .deb (it should install over the community package) + + ```console + $ sudo dpkg -i + ``` + +- Update your database to the enterprise packages using + + ```console + $ python3 /usr/bin/odoo-bin -d -i web_enterprise --stop-after-init + ``` + +- You should be able to connect to your Odoo Enterprise instance using your usual mean of identification. + You can then link your database with your Odoo Enterprise Subscription by entering the code you received + by e-mail in the form input + +## On Linux, using the source code + +There are many ways to launch your server when using sources, and you probably +have your own favourite. You may need to adapt sections to your usual workflow. + +- Shutdown your server + +- Backup your community database + +- Update the `--addons-path` parameter of your launch command (see {doc}`../on_premise/source`) + +- Install the web_enterprise module by using + + ```console + $ -d -i web_enterprise --stop-after-init + ``` + + Depending on the size of your database, this may take some time. + +- Restart your server with the updated addons path of point 3. + You should be able to connect to your instance. You can then link your database with your + Odoo Enterprise Subscription by entering the code you received by e-mail in the form input + +## On Windows + +- Backup your community database + +- Uninstall Odoo Community (using the Uninstall executable in the installation folder) - + PostgreSQL will remain installed + + ```{image} community_to_enterprise/windows_uninstall.png + :class: img-fluid + ``` + +- Launch the Odoo Enterprise Installer and follow the steps normally. When choosing + the installation path, you can set the folder of the Community installation + (this folder still contains the PostgreSQL installation). + Uncheck `Start Odoo` at the end of the installation + + ```{image} community_to_enterprise/windows_setup.png + :class: img-fluid + ``` + +- Using a command window, update your Odoo Database using this command (from the Odoo + installation path, in the server subfolder) + + ```console + $ ..\python\python.exe odoo-bin -d -i web_enterprise --stop-after-init + ``` + +- No need to manually launch the server, the service is running. + You should be able to connect to your Odoo Enterprise instance using your usual + mean of identification. You can then link your database with your Odoo Enterprise + Subscription by entering the code you received by e-mail in the form input + diff --git a/content/administration/on_premise/deploy.md b/content/administration/on_premise/deploy.md new file mode 100644 index 000000000..fa7336321 --- /dev/null +++ b/content/administration/on_premise/deploy.md @@ -0,0 +1,922 @@ +# System configuration + +This document describes basic steps to set up Odoo in production or on an +internet-facing server. It follows {doc}`installation <../on_premise>`, and is +not generally necessary for a development systems that is not exposed on the +internet. + +:::{warning} +If you are setting up a public server, be sure to check our {ref}`security` recommendations! +::: + +(dbfilter)= + +## dbfilter + +Odoo is a multi-tenant system: a single Odoo system may run and serve a number +of database instances. It is also highly customizable, with customizations +(starting from the modules being loaded) depending on the "current database". + +This is not an issue when working with the backend (web client) as a logged-in +company user: the database can be selected when logging in, and customizations +loaded afterwards. + +However it is an issue for non-logged users (portal, website) which aren't +bound to a database: Odoo needs to know which database should be used to load +the website page or perform the operation. If multi-tenancy is not used that is not an +issue, there's only one database to use, but if there are multiple databases +accessible Odoo needs a rule to know which one it should use. + +That is one of the purposes of {option}`--db-filter `: +it specifies how the database should be selected based on the hostname (domain) +that is being requested. The value is a [regular expression], possibly +including the dynamically injected hostname (`%h`) or the first subdomain +(`%d`) through which the system is being accessed. + +For servers hosting multiple databases in production, especially if `website` +is used, dbfilter **must** be set, otherwise a number of features will not work +correctly. + +### Configuration samples + +- Show only databases with names beginning with 'mycompany' + +in {ref}`the configuration file ` set: + +```ini +[options] +dbfilter = ^mycompany.*$ +``` + +- Show only databases matching the first subdomain after `www`: for example + the database "mycompany" will be shown if the incoming request + was sent to `www.mycompany.com` or `mycompany.co.uk`, but not + for `www2.mycompany.com` or `helpdesk.mycompany.com`. + +in {ref}`the configuration file ` set: + +```ini +[options] +dbfilter = ^%d$ +``` + +:::{note} +Setting a proper {option}`--db-filter ` is an important part +of securing your deployment. +Once it is correctly working and only matching a single database per hostname, it +is strongly recommended to block access to the database manager screens, +and to use the `--no-database-list` startup parameter to prevent listing +your databases, and to block access to the database management screens. +See also [security]. +::: + +## PostgreSQL + +By default, PostgreSQL only allows connection over UNIX sockets and loopback +connections (from "localhost", the same machine the PostgreSQL server is +installed on). + +UNIX socket is fine if you want Odoo and PostgreSQL to execute on the same +machine, and is the default when no host is provided, but if you want Odoo and +PostgreSQL to execute on different machines [^different-machines] it will +need to [listen to network interfaces] [^remote-socket], either: + +- Only accept loopback connections and [use an SSH tunnel] between the + machine on which Odoo runs and the one on which PostgreSQL runs, then + configure Odoo to connect to its end of the tunnel +- Accept connections to the machine on which Odoo is installed, possibly + over ssl (see [PostgreSQL connection settings] for details), then configure + Odoo to connect over the network + +### Configuration sample + +- Allow tcp connection on localhost +- Allow tcp connection from 192.168.1.x network + +in `/etc/postgresql//main/pg_hba.conf` set: + +```text +# IPv4 local connections: +host all all 127.0.0.1/32 md5 +host all all 192.168.1.0/24 md5 +``` + +in `/etc/postgresql//main/postgresql.conf` set: + +```text +listen_addresses = 'localhost,192.168.1.2' +port = 5432 +max_connections = 80 +``` + +(setup-deploy-odoo)= + +### Configuring Odoo + +Out of the box, Odoo connects to a local postgres over UNIX socket via port +5432\. This can be overridden using {ref}`the database options +` when your Postgres deployment is not +local and/or does not use the installation defaults. + +The {doc}`packaged installers ` will automatically +create a new user (`odoo`) and set it as the database user. + +- The database management screens are protected by the `admin_passwd` + setting. This setting can only be set using configuration files, and is + simply checked before performing database alterations. It should be set to + a randomly generated value to ensure third parties can not use this + interface. + +- All database operations use the {ref}`database options + `, including the database management + screen. For the database management screen to work requires that the PostgreSQL user + have `createdb` right. + +- Users can always drop databases they own. For the database management screen + to be completely non-functional, the PostgreSQL user needs to be created with + `no-createdb` and the database must be owned by a different PostgreSQL user. + + :::{warning} + the PostgreSQL user *must not* be a superuser + ::: + +#### Configuration sample + +- connect to a PostgreSQL server on 192.168.1.2 +- port 5432 +- using an 'odoo' user account, +- with 'pwd' as a password +- filtering only db with a name beginning with 'mycompany' + +in {ref}`the configuration file ` set: + +```ini +[options] +admin_passwd = mysupersecretpassword +db_host = 192.168.1.2 +db_port = 5432 +db_user = odoo +db_password = pwd +dbfilter = ^mycompany.*$ +``` + +(postgresql-ssl-connect)= + +### SSL Between Odoo and PostgreSQL + +Since Odoo 11.0, you can enforce ssl connection between Odoo and PostgreSQL. +in Odoo the db_sslmode control the ssl security of the connection +with value chosen out of 'disable', 'allow', 'prefer', 'require', 'verify-ca' +or 'verify-full' + +[PostgreSQL Doc](https://www.postgresql.org/docs/12/static/libpq-ssl.html) + +(builtin-server)= + +## Builtin server + +Odoo includes built-in HTTP, cron, and live-chat servers, using either multi-threading or +multi-processing. + +The **multi-threaded** server is a simpler server primarily used for development, demonstrations, +and its compatibility with various operating systems (including Windows). A new thread is spawned +for every new HTTP request, even for long-lived connections such as websocket. Extra daemonic cron +threads are spawned too. Due to a Python limitation (GIL), it doesn't make the best use of the +hardware. + +The multi-threaded server is the default server, also for docker containers. It is selected by +leaving the {option}`--workers ` option out or setting it to `0`. + +The **multi-processing** server is a full-blown server primarily used for production. It is not +liable to the same Python limitation (GIL) on resource usage and hence makes the best use of the +hardware. A pool of workers is created upon server startup. New HTTP requests are queued by the OS +until there are workers ready to process them. An extra event-driven HTTP worker for the live chat +is spawned on an alternative port. Extra cron workers are spawned too. A configurable process +reaper monitors resource usage and can kill/restart failed workers. + +The multi-processing server is opt-in. It is selected by setting the {option}`--workers +` option to a non-null integer. + +:::{note} +Because it is highly customized for Linux servers, the multi-processing server is not available +on Windows. +::: + +### Worker number calculation + +- Rule of thumb : (#CPU * 2) + 1 +- Cron workers need CPU +- 1 worker ~= 6 concurrent users + +### memory size calculation + +- We consider 20% of the requests are heavy requests, while 80% are simpler ones +- A heavy worker, when all computed field are well designed, SQL requests are well designed, ... is estimated to consume around 1GB of RAM +- A lighter worker, in the same scenario, is estimated to consume around 150MB of RAM + +Needed RAM = #worker * ( (light_worker_ratio * light_worker_ram_estimation) + (heavy_worker_ratio * heavy_worker_ram_estimation) ) + +### LiveChat + +In multi-processing, a dedicated LiveChat worker is automatically started and listens on +the {option}`--gevent-port `. By default, the HTTP requests will keep +accessing the normal HTTP workers instead of the LiveChat one. You must deploy a proxy in front of +Odoo and redirect incoming requests whose path starts with `/websocket/` to the LiveChat worker. +You must also start Odoo in {option}`--proxy-mode ` so it uses the real +client headers (such as hostname, scheme, and IP) instead of the proxy ones. + +### Configuration sample + +- Server with 4 CPU, 8 Thread +- 60 concurrent users +- 60 users / 6 = 10 \<- theoretical number of worker needed +- (4 * 2) + 1 = 9 \<- theoretical maximal number of worker +- We'll use 8 workers + 1 for cron. We'll also use a monitoring system to measure cpu load, and check if it's between 7 and 7.5 . +- RAM = 9 * ((0.8\*150) + (0.2\*1024)) ~= 3Go RAM for Odoo + +in {ref}`the configuration file `: + +```ini +[options] +limit_memory_hard = 1677721600 +limit_memory_soft = 629145600 +limit_request = 8192 +limit_time_cpu = 600 +limit_time_real = 1200 +max_cron_threads = 1 +workers = 8 +``` + +(https-proxy)= + +## HTTPS + +Whether it's accessed via website/web client or web service, Odoo transmits +authentication information in cleartext. This means a secure deployment of +Odoo must use HTTPS[^switching]. SSL termination can be implemented via +just about any SSL termination proxy, but requires the following setup: + +- Enable Odoo's {option}`proxy mode `. This should only be enabled when Odoo is behind a reverse proxy +- Set up the SSL termination proxy ([Nginx termination example]) +- Set up the proxying itself ([Nginx proxying example]) +- Your SSL termination proxy should also automatically redirect non-secure + connections to the secure port + +### Configuration sample + +- Redirect http requests to https +- Proxy requests to odoo + +in {ref}`the configuration file ` set: + +```ini +proxy_mode = True +``` + +in `/etc/nginx/sites-enabled/odoo.conf` set: + +```nginx +#odoo server +upstream odoo { + server 127.0.0.1:8069; +} +upstream odoochat { + server 127.0.0.1:8072; +} +map $http_upgrade $connection_upgrade { + default upgrade; + '' close; +} + +# http -> https +server { + listen 80; + server_name odoo.mycompany.com; + rewrite ^(.*) https://$host$1 permanent; +} + +server { + listen 443 ssl; + server_name odoo.mycompany.com; + proxy_read_timeout 720s; + proxy_connect_timeout 720s; + proxy_send_timeout 720s; + + # SSL parameters + ssl_certificate /etc/ssl/nginx/server.crt; + ssl_certificate_key /etc/ssl/nginx/server.key; + ssl_session_timeout 30m; + ssl_protocols TLSv1.2; + ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; + ssl_prefer_server_ciphers off; + + # log + access_log /var/log/nginx/odoo.access.log; + error_log /var/log/nginx/odoo.error.log; + + # Redirect websocket requests to odoo gevent port + location /websocket { + proxy_pass http://odoochat; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + proxy_set_header X-Forwarded-Host $http_host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Real-IP $remote_addr; + + add_header Strict-Transport-Security "max-age=31536000; includeSubDomains"; + proxy_cookie_flags session_id samesite=lax secure; # requires nginx 1.19.8 + } + + # Redirect requests to odoo backend server + location / { + # Add Headers for odoo proxy mode + proxy_set_header X-Forwarded-Host $http_host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Real-IP $remote_addr; + proxy_redirect off; + proxy_pass http://odoo; + + add_header Strict-Transport-Security "max-age=31536000; includeSubDomains"; + proxy_cookie_flags session_id samesite=lax secure; # requires nginx 1.19.8 + } + + # common gzip + gzip_types text/css text/scss text/plain text/xml application/xml application/json application/javascript; + gzip on; +} +``` + +### HTTPS Hardening + +Add the `Strict-Transport-Security` header to all requests, in order to prevent +browsers from ever sending a plain HTTP request to this domain. You will need +to maintain a working HTTPS service with a valid certificate on this domain at +all times, otherwise your users will see security alerts or be entirely unable +to access it. + +Force HTTPS connections during a year for every visitor in NGINX with the line: + +```nginx +add_header Strict-Transport-Security "max-age=31536000; includeSubDomains"; +``` + +Additional configuration can be defined for the `session_id` cookie. The `Secure` +flag can be added to ensure it is never transmitted over HTTP and `SameSite=Lax` +to prevent authenticated [CSRF]. + +```nginx +# requires nginx 1.19.8 +proxy_cookie_flags session_id samesite=lax secure; +``` + +## Odoo as a WSGI Application + +It is also possible to mount Odoo as a standard [WSGI] application. Odoo +provides the base for a WSGI launcher script as `odoo-wsgi.example.py`. That +script should be customized (possibly after copying it from the setup directory) to correctly set the +configuration directly in {mod}`odoo.tools.config` rather than through the +command-line or a configuration file. + +However the WSGI server will only expose the main HTTP endpoint for the web +client, website and webservice API. Because Odoo does not control the creation +of workers anymore it can not setup cron or livechat workers + +### Cron Workers + +Starting one of the built-in Odoo servers next to the WSGI server is required to process cron jobs. +That server must be configured to only process crons and not HTTP requests using the +{option}`--no-http ` cli option or the `http_enable = False` configuration +file setting. + +On Linux-like systems, using the multi-processing server over the multi-threading one is recommended +to benefit from better hardware usage and increased stability, i.e., using +the {option}`--workers=-1 ` and {option}`--max-cron-threads=n +` cli options. + +### LiveChat + +Using a gevent-compatible WSGI server is required for the correct operation of the live chat +feature. That server should be able to handle many simultaneous long-lived connections but doesn't +need a lot of processing power. All requests whose path starts with `/websocket/` should be +directed to that server. A regular (thread/process-based) WSGI server should be used for all other +requests. + +The Odoo cron server can also be used to serve the live chat requests. Just drop +the {option}`--no-http ` cli option from the cron server and make sure requests +whose path starts with `/websocket/` are directed to this server, either on +the {option}`--http-port ` (multi-threading server) or on +the {option}`--gevent-port ` (multi-processing server). + +(deploy-streaming)= + +## Serving static files and attachments + +For development convenience, Odoo directly serves all static files and attachments in its modules. +This may not be ideal when it comes to performances, and static files should generally be served by +a static HTTP server. + +### Serving static files + +Odoo static files are located in each module's {file}`static/` folder, so static files can be served +by intercepting all requests to {samp}`/{MODULE}/static/{FILE}`, and looking up the right module +(and file) in the various addons paths. + +It is recommended to set the `Content-Security-Policy: default-src 'none'` header on all images +delivered by the web server. It is not strictly necessary as users cannot modify/inject content +inside of modules' {file}`static/` folder and existing images are final (they do not fetch new +resources by themselves). However, it is good practice. + +Using the above NGINX (https) configuration, the following `map` and `location` blocks should be +added to serve static files via NGINX. + +```nginx +map $sent_http_content_type $content_type_csp { + default ""; + ~image/ "default-src 'none'"; +} + +server { + # the rest of the configuration + + location @odoo { + # copy-paste the content of the / location block + } + + # Serve static files right away + location ~ ^/[^/]+/static/.+$ { + # root and try_files both depend on your addons paths + root ...; + try_files ... @odoo; + expires 24h; + add_header Content-Security-Policy $content_type_csp; + } +} +``` + +The actual `root` and `try_files` directives are dependant on your installation, specifically on +your {option}`--addons-path `. + +```{eval-rst} +.. example:: + + .. tabs:: + + .. group-tab:: Debian package + + Say Odoo has been installed via the **debian packages** for Community and Enterprise, and + that the :option:`--addons-path ` is + ``'/usr/lib/python3/dist-packages/odoo/addons'``. + + The ``root`` and ``try_files`` should be: + + .. code-block:: nginx + + root /usr/lib/python3/dist-packages/odoo/addons; + try_files $uri @odoo; + + .. group-tab:: Git sources + + Say Odoo has been installed via the **sources**, that both the Community and Enterprise git + repositories were cloned in :file:`/opt/odoo/community` and :file:`/opt/odoo/enterprise` + respectively, and that the :option:`--addons-path ` is + ``'/opt/odoo/community/odoo/addons,/opt/odoo/community/addons,/opt/odoo/enterprise'``. + + The ``root`` and ``try_files`` should be: + + .. code-block:: nginx + + root /opt/odoo; + try_files /community/odoo/addons$uri /community/addons$uri /enterprise$uri @odoo; +``` + +### Serving attachments + +Attachments are files stored in the filestore which access is regulated by Odoo. They cannot be +directly accessed via a static web server as accessing them requires multiple lookups in the +database to determine where the files are stored and whether the current user can access them or +not. + +Nevertheless, once the file has been located and the access rights verified by Odoo, it is a good +idea to serve the file using the static web server instead of Odoo. For Odoo to delegate serving +files to the static web server, the [X-Sendfile](https://tn123.org/mod_xsendfile/) (apache) or +[X-Accel](https://www.nginx.com/resources/wiki/start/topics/examples/x-accel/) (nginx) extensions +must be enabled and configured on the static web server. Once it is set up, start Odoo with the +{option}`--x-sendfile ` CLI flag (this unique flag is used for both +X-Sendfile and X-Accel). + +:::{note} +- The X-Sendfile extension for apache (and compatible web servers) does not require any + supplementary configuration. + +- The X-Accel extension for NGINX **does** require the following additionnal configuration: + + ```nginx + location /web/filestore { + internal; + alias /path/to/odoo/data-dir/filestore; + } + ``` + + In case you don't know what is the path to your filestore, start Odoo with the + {option}`--x-sendfile ` option and navigate to the `/web/filestore` URL + directly via Odoo (don't navigate to the URL via NGINX). This logs a warnings, the message + contains the configuration you need. +::: + +(security)= + +## Security + +For starters, keep in mind that securing an information system is a continuous process, +not a one-shot operation. At any moment, you will only be as secure as the weakest link +in your environment. + +So please do not take this section as the ultimate list of measures that will prevent +all security problems. It's only intended as a summary of the first important things +you should be sure to include in your security action plan. The rest will come +from best security practices for your operating system and distribution, +best practices in terms of users, passwords, and access control management, etc. + +When deploying an internet-facing server, please be sure to consider the following +security-related topics: + +- Always set a strong super-admin admin password, and restrict access to the database + management pages as soon as the system is set up. See {ref}`db_manager_security`. + +- Choose unique logins and strong passwords for all administrator accounts on all databases. + Do not use 'admin' as the login. Do not use those logins for day-to-day operations, + only for controlling/managing the installation. + *Never* use any default passwords like admin/admin, even for test/staging databases. + +- Do **not** install demo data on internet-facing servers. Databases with demo data contain + default logins and passwords that can be used to get into your systems and cause significant + trouble, even on staging/dev systems. + +- Use appropriate database filters ( {option}`--db-filter `) + to restrict the visibility of your databases according to the hostname. + See {ref}`dbfilter`. + You may also use {option}`-d ` to provide your own (comma-separated) + list of available databases to filter from, instead of letting the system fetch + them all from the database backend. + +- Once your `db_name` and `dbfilter` are configured and only match a single database + per hostname, you should set `list_db` configuration option to `False`, to prevent + listing databases entirely, and to block access to the database management screens + (this is also exposed as the {option}`--no-database-list ` + command-line option) + +- Make sure the PostgreSQL user ({option}`--db_user `) is *not* a super-user, + and that your databases are owned by a different user. For example they could be owned by + the `postgres` super-user if you are using a dedicated non-privileged `db_user`. + See also {ref}`setup/deploy/odoo`. + +- Keep installations updated by regularly installing the latest builds, + either via GitHub or by downloading the latest version from + or + +- Configure your server in multi-process mode with proper limits matching your typical + usage (memory/CPU/timeouts). See also {ref}`builtin_server`. + +- Run Odoo behind a web server providing HTTPS termination with a valid SSL certificate, + in order to prevent eavesdropping on cleartext communications. SSL certificates are + cheap, and many free options exist. + Configure the web proxy to limit the size of requests, set appropriate timeouts, + and then enable the {option}`proxy mode ` option. + See also {ref}`https_proxy`. + +- If you need to allow remote SSH access to your servers, make sure to set a strong password + for **all** accounts, not just `root`. It is strongly recommended to entirely disable + password-based authentication, and only allow public key authentication. Also consider + restricting access via a VPN, allowing only trusted IPs in the firewall, and/or + running a brute-force detection system such as `fail2ban` or equivalent. + +- Consider installing appropriate rate-limiting on your proxy or firewall, to prevent + brute-force attacks and denial of service attacks. See also {ref}`login_brute_force` + for specific measures. + + Many network providers provide automatic mitigation for Distributed Denial of + Service attacks (DDOS), but this is often an optional service, so you should consult + with them. + +- Whenever possible, host your public-facing demo/test/staging instances on different + machines than the production ones. And apply the same security precautions as for + production. + +- If your public-facing Odoo server has access to sensitive internal network resources + or services (e.g. via a private VLAN), implement appropriate firewall rules to + protect those internal resources. This will ensure that the Odoo server cannot + be used accidentally (or as a result of malicious user actions) to access or disrupt + those internal resources. + Typically this can be done by applying an outbound default DENY rule on the firewall, + then only explicitly authorizing access to internal resources that the Odoo server + needs to access. + [Systemd IP traffic access control](http://0pointer.net/blog/ip-accounting-and-access-lists-with-systemd.html) + may also be useful to implement per-process network access control. + +- If your public-facing Odoo server is behind a Web Application Firewall, a load-balancer, + a transparent DDoS protection service (like CloudFlare) or a similar network-level + device, you may wish to avoid direct access to the Odoo system. It is generally + difficult to keep the endpoint IP addresses of your Odoo servers secret. For example + they can appear in web server logs when querying public systems, or in the headers + of emails posted from Odoo. + In such a situation you may want to configure your firewall so that the endpoints + are not accessible publicly except from the specific IP addresses of your WAF, + load-balancer or proxy service. Service providers like CloudFlare usually maintain + a public list of their IP address ranges for this purpose. + +- If you are hosting multiple customers, isolate customer data and files from each other + using containers or appropriate "jail" techniques. + +- Setup daily backups of your databases and filestore data, and copy them to a remote + archiving server that is not accessible from the server itself. + +- Deploying Odoo on Linux is strongly recommended over Windows. Should you choose nevertheless + to deploy on a Windows platform, a thorough security hardening review of the server should be + conducted and is outside of the scope of this guide. + +(login-brute-force)= + +### Blocking Brute Force Attacks + +For internet-facing deployments, brute force attacks on user passwords are very common, and this +threat should not be neglected for Odoo servers. Odoo emits a log entry whenever a login attempt +is performed, and reports the result: success or failure, along with the target login and source IP. + +The log entries will have the following form. + +Failed login: + +``` +2018-07-05 14:56:31,506 24849 INFO db_name odoo.addons.base.res.res_users: Login failed for db:db_name login:admin from 127.0.0.1 +``` + +Successful login: + +``` +2018-07-05 14:56:31,506 24849 INFO db_name odoo.addons.base.res.res_users: Login successful for db:db_name login:admin from 127.0.0.1 +``` + +These logs can be easily analyzed by an intrusion prevention system such as `fail2ban`. + +For example, the following fail2ban filter definition should match a +failed login: + +``` +[Definition] +failregex = ^ \d+ INFO \S+ \S+ Login failed for db:\S+ login:\S+ from +ignoreregex = +``` + +This could be used with a jail definition to block the attacking IP on HTTP(S). + +Here is what it could look like for blocking the IP for 15 minutes when +10 failed login attempts are detected from the same IP within 1 minute: + +``` +[odoo-login] +enabled = true +port = http,https +bantime = 900 ; 15 min ban +maxretry = 10 ; if 10 attempts +findtime = 60 ; within 1 min /!\ Should be adjusted with the TZ offset +logpath = /var/log/odoo.log ; set the actual odoo log path here +``` + +(db-manager-security)= + +### Database Manager Security + +{ref}`setup/deploy/odoo` mentioned `admin_passwd` in passing. + +This setting is used on all database management screens (to create, delete, +dump or restore databases). + +If the management screens must not be accessible at all, you should set `list_db` +configuration option to `False`, to block access to all the database selection and +management screens. + +:::{warning} +It is strongly recommended to disable the Database Manager for any internet-facing +system! It is meant as a development/demo tool, to make it easy to quickly create +and manage databases. It is not designed for use in production, and may even expose +dangerous features to attackers. It is also not designed to handle large databases, +and may trigger memory limits. + +On production systems, database management operations should always be performed by +the system administrator, including provisioning of new databases and automated backups. +::: + +Be sure to setup an appropriate `db_name` parameter +(and optionally, `dbfilter` too) so that the system can determine the target database +for each request, otherwise users will be blocked as they won't be allowed to choose the +database themselves. + +If the management screens must only be accessible from a selected set of machines, +use the proxy server's features to block access to all routes starting with `/web/database` +except (maybe) `/web/database/selector` which displays the database-selection screen. + +If the database-management screen should be left accessible, the +`admin_passwd` setting must be changed from its `admin` default: this +password is checked before allowing database-alteration operations. + +It should be stored securely, and should be generated randomly e.g. + +```console +$ python3 -c 'import base64, os; print(base64.b64encode(os.urandom(24)))' +``` + +which generates a 32-character pseudorandom printable string. + +### Reset the master password + +There may be instances where the master password is misplaced, or compromised, and needs to be +reset. The following process is for system administrators of an Odoo on-premise database detailing +how to manually reset and re-encrypt the master password. + +:::{seealso} +For more information about changing an Odoo.com account password, see this documentation: +{ref}`odoocom/change_password`. +::: + +When creating a new on-premise database, a random master password is generated. Odoo recommends +using this password to secure the database. This password is implemented by default, so there is a +secure master password for any Odoo on-premise deployment. + +:::{warning} +When creating an Odoo on-premise database the installation is accessible to anyone on the +internet, until this password is set to secure the database. +::: + +The master password is specified in the Odoo configuration file (`odoo.conf` or `odoorc` (hidden +file)). The Odoo master password is needed to modify, create, or delete a database through the +graphical user interface (GUI). + +#### Locate configuration file + +First, open the Odoo configuration file (`odoo.conf` or `odoorc` (hidden file)). + +```{eval-rst} +.. tabs:: + + .. tab:: Windows + + The configuration file is located at: `c:\\ProgramFiles\\Odoo{VERSION}\\server\\odoo.conf` + + .. tab:: Linux + + Depending on how Odoo is installed on the Linux machine, the configuration file is located in + one of two different places: + + - Package installation: `/etc/odoo.conf` + - Source installation: `~/.odoorc` +``` + +#### Change old password + +Once the appropriate file has been opened, proceed to modify the old password in the configuration +file to a temporary password. + +```{eval-rst} +.. tabs:: + + .. group-tab:: Graphical user interface + + After locating the configuration file, open it using a (:abbr:`GUI (graphical user + interface)`). This can be achieved by simply double clicking on the file. Then, the device + should have a default :abbr:`GUI (graphical user interface)` to open the file with. + + Next, modify the master password line `admin_passwd = $pbkdf2-sha…` to `admin_passwd = + newpassword1234`, for example. This password can be anything, as long as it is saved + temporarily. Make sure to modify all characters after the `=`. + + .. example:: + The line appears like this: + `admin_passwd = + $pbkdf2-sh39dji295.59mptrfW.9z6HkA$w9j9AMVmKAP17OosCqDxDv2hjsvzlLpF8Rra8I7p/b573hji540mk/.3ek0lg%kvkol6k983mkf/40fjki79m` + + The modified line appears like this: `admin_passwd = newpassword1234` + + .. group-tab:: Command-line interface + + Modify the master password line using the following Unix command detailed below. + + Connect to the Odoo server's terminal via Secure Shell (SSH) protocol, and edit the + configuration file. To modify the configuration file, enter the following command: + :command:`sudo nano /etc/odoo.conf` + + After opening the configuration file, modify the master password line `admin_passwd = + $pbkdf2-sha…` to `admin_passwd = newpassword1234`. This password can be anything, as long as + it is saved temporarily. Make sure to modify all characters after the `=`. + + .. example:: + The line appears like this: + `admin_passwd = + $pbkdf2-sh39dji295.59mptrfW.9z6HkA$w9j9AMVmKAP17OosCqDxDv2hjsvzlLpF8Rra8I7p/b573hji540mk/.3ek0lg%kvkol6k983mkf/40fjki79m` + + The modified line appears like this: `admin_passwd = newpassword1234` +``` + +:::{important} +It is essential that the password is changed to something else, rather than triggering a new +password reset by adding a semicolon `;` at the beginning of the line. This ensures the database +is secure throughout the entire password reset process. +::: + +#### Restart Odoo server + +After setting the temporary password, a restart of the Odoo server is **required**. + +```{eval-rst} +.. tabs:: + + .. group-tab:: Graphical user interface + + To restart the Odoo server, first, type `services` into the Windows :guilabel:`Search` bar. + Then, select the :guilabel:`Services` application, and scroll down to the :guilabel:`Odoo` + service. + + Next, right click on :guilabel:`Odoo`, and select :guilabel:`Start` or :guilabel:`Restart`. + This action manually restarts the Odoo server. + + .. group-tab:: Command-line interface + + Restart the Odoo server by typing the command: :command:`sudo service odoo15 restart` + + .. note:: + Change the number after `odoo` to fit the specific version the server is running on. +``` + +#### Use web interface to re-encrypt password + +First, navigate to `/web/database/manager` or `http://server_ip:port/web/database/manager` in a +browser. + +:::{note} +Replace `server_ip` with the IP address of the database. Replace `port` with the numbered port +the database is accessible from. +::: + +Next, click {guilabel}`Set Master Password`, and type in the previously-selected temporary password +into the {guilabel}`Master Password` field. Following this step, type in a {guilabel}`New Master +Password`. The {guilabel}`New Master Password` is hashed (or encrypted), once the +{guilabel}`Continue` button is clicked. + +At this point, the password has been successfully reset, and a hashed version of the new password +now appears in the configuration file. + +:::{seealso} +For more information on Odoo database security, see this documentation: +{ref}`db_manager_security`. +::: + +## Supported Browsers + +Odoo supports all the major desktop and mobile browsers available on the market, +as long as they are supported by their publishers. + +Here are the supported browsers: + +- Google Chrome +- Mozilla Firefox +- Microsoft Edge +- Apple Safari + +:::{warning} +Please make sure your browser is up-to-date and still supported by +its publisher before filing a bug report. +::: + +:::{note} +Since Odoo 13.0, ES6 is supported. Therefore, IE support is dropped. +::: + +[^different-machines]: to have multiple Odoo installations use the same PostgreSQL database, + or to provide more computing resources to both software. + +[^remote-socket]: technically a tool like [socat] can be used to proxy UNIX sockets across + networks, but that is mostly for software which can only be used over + UNIX sockets + +[^switching]: or be accessible only over an internal packet-switched network, but that + requires secured switches, protections against [ARP spoofing] and + precludes usage of WiFi. Even over secure packet-switched networks, + deployment over HTTPS is recommended, and possible costs are lowered as + "self-signed" certificates are easier to deploy on a controlled + environment than over the internet. + +(postgresql-connection-settings)= + +[arp spoofing]: https://en.wikipedia.org/wiki/ARP_spoofing +[csrf]: https://en.wikipedia.org/wiki/Cross-site_request_forgery +[listen to network interfaces]: https://www.postgresql.org/docs/12/static/runtime-config-connection.html +[nginx proxying example]: https://nginx.com/resources/admin-guide/reverse-proxy/ +[nginx termination example]: https://nginx.com/resources/admin-guide/nginx-ssl-termination/ +[posbox]: https://www.odoo.com/page/point-of-sale-hardware#part_2 +[postgresql connection settings]: https://www.postgresql.org/docs/12/static/runtime-config-connection.html +[regular expression]: https://docs.python.org/3/library/re.html +[socat]: http://www.dest-unreach.org/socat/ +[use an ssh tunnel]: https://www.postgresql.org/docs/12/static/ssh-tunnels.html +[wsgi]: https://wsgi.readthedocs.org/ + diff --git a/content/administration/on_premise/email_gateway.md b/content/administration/on_premise/email_gateway.md new file mode 100644 index 000000000..9fba20d67 --- /dev/null +++ b/content/administration/on_premise/email_gateway.md @@ -0,0 +1,49 @@ +# Email gateway + +The Odoo mail gateway allows you to inject directly all the received emails in Odoo. + +Its principle is straightforward: your SMTP server executes the "mailgate" script for every new +incoming email. + +The script takes care of connecting to your Odoo database through XML-RPC, and send the emails via +the `MailThread.message_process()` feature. + +## Prerequisites + +- Administrator access to the Odoo database. +- Your own mail server such as Postfix or Exim. +- Technical knowledge on how to configure an email server. + +## For Postfix + +In you alias config ({file}`/etc/aliases`): + +```text +email@address: "|/odoo-directory/addons/mail/static/scripts/odoo-mailgate.py -d -u -p " +``` + +:::{note} +Resources + +- [Postfix](http://www.postfix.org/documentation.html) +- [Postfix aliases](http://www.postfix.org/aliases.5.html) +- [Postfix virtual](http://www.postfix.org/virtual.8.html) +::: + +## For Exim + +```text +*: |/odoo-directory/addons/mail/static/scripts/odoo-mailgate.py -d -u -p +``` + +:::{note} +Resources + +- [Exim](https://www.exim.org/docs.html) +::: + +:::{tip} +If you do not have access/manage your email server, use {ref}`incoming mail servers +`. +::: + diff --git a/content/administration/on_premise/geo_ip.md b/content/administration/on_premise/geo_ip.md new file mode 100644 index 000000000..0f458a6e4 --- /dev/null +++ b/content/administration/on_premise/geo_ip.md @@ -0,0 +1,65 @@ +# Geo IP + +:::{note} +This documentation only applies to On-premise databases. +::: + +## Installation + +1. Download both the GeoLite2 City and Country + [databases](https://dev.maxmind.com/geoip/geoip2/geolite2/). You should end up with two files + called {file}`GeoLite2-City.mmdb` and {file}`GeoLite2-Country.mmdb`. + +2. Move the files to the folder {file}`/usr/share/GeoIP/`. + + ```bash + mv ~/Downloads/GeoLite2-City.mmdb /usr/share/GeoIP/ + mv ~/Downloads/GeoLite2-Country.mmdb /usr/share/GeoIP/ + ``` + +3. Restart the server + +::::{note} +If you don't want to locate the geoip database in {file}`/usr/share/GeoIP/`, use the +{option}`--geoip-city-db ` and +{option}`--geoip-country-db ` options of the Odoo command line +interface. These options take the absolute path to the GeoIP database file and use it as the +GeoIP database. For example: + +```bash +./odoo-bin --geoip-city-db= ~/Downloads/GeoLite2-City.mmdb +``` + +:::{seealso} +- {doc}`CLI documentation `. +::: +:::: + +## Test GeoIP geolocation in your Odoo website + +Edit a web page to include some geo-ip information such as the country name of the current +request IP address. To do so: + +1. Go to your website. Open the web page that you want to test `GeoIP`. + +2. Choose {menuselection}`Customize --> HTML/CSS/JS Editor`. + +3. Add the following piece of XML in the page : + + ```xml +

+ ``` + +4. Save and refresh the page. + +Geo-ip is working if you read your country name displayed in bold in the middle of the page. + +In case you read "**geoip failure**" instead then the geolocalization failed. The common causes are: + +1. The browsing IP address is the localhost (`127.0.0.1`) or a local area network one. If you + don't know, you can access your website using mobile data. +2. You are using a reverse-proxy (apache, nginx) in front of Odoo but didn't start Odoo with the + proxy-mode enabled. See {option}`proxy mode `. +3. The GeoIP database is corrupt, missing or unaccessible. In such case a warning was logged in the + server logs. + diff --git a/content/administration/on_premise/packages.md b/content/administration/on_premise/packages.md new file mode 100644 index 000000000..86cf2ea99 --- /dev/null +++ b/content/administration/on_premise/packages.md @@ -0,0 +1,173 @@ +# Packaged installers + +Odoo provides packaged installers for Debian-based Linux distributions (Debian, Ubuntu, etc.), +RPM-based Linux distributions (Fedora, CentOS, RHEL, etc.), and Windows for the Community and +Enterprise editions. + +Official **Community** nightly packages with all relevant dependency requirements are available on +the [nightly server](https://nightly.odoo.com). + +:::{note} +Nightly packages may be difficult to keep up to date. +::: + +Official **Community** and **Enterprise** packages can be downloaded from the [Odoo download page](https://www.odoo.com/page/download). + +:::{note} +It is required to be logged in as a paying on-premise customer or partner to download the +Enterprise packages. +::: + +(install-packages-linux)= + +## Linux + +### Prepare + +Odoo needs a [PostgreSQL](https://www.postgresql.org/) server to run properly. + +```{eval-rst} +.. tabs:: + + .. group-tab:: Debian/Ubuntu + + The default configuration for the Odoo 'deb' package is to use the PostgreSQL server on the + same host as the Odoo instance. Execute the following command to install the PostgreSQL + server: + + .. code-block:: console + + $ sudo apt install postgresql -y + + .. group-tab:: Fedora + + Make sure that the `sudo` command is available and well configured and, only then, execute the + following command to install the PostgreSQL server: + + .. code-block:: console + + $ sudo dnf install -y postgresql-server + $ sudo postgresql-setup --initdb --unit postgresql + $ sudo systemctl enable postgresql + $ sudo systemctl start postgresql +``` + +:::{warning} +`wkhtmltopdf` is not installed through **pip** and must be installed manually in [version 0.12.6](https://github.com/wkhtmltopdf/packaging/releases/tag/0.12.6.1-3) for it to support headers +and footers. Check out the [wkhtmltopdf wiki](https://github.com/odoo/odoo/wiki/Wkhtmltopdf) +for more details on the various versions. +::: + +### Repository + +Odoo S.A. provides a repository that can be used to install the **Community** edition by executing +the following commands: + +```{eval-rst} +.. tabs:: + + .. group-tab:: Debian/Ubuntu + + .. code-block:: console + + $ wget -q -O - https://nightly.odoo.com/odoo.key | sudo gpg --dearmor -o /usr/share/keyrings/odoo-archive-keyring.gpg + $ echo 'deb [signed-by=/usr/share/keyrings/odoo-archive-keyring.gpg] https://nightly.odoo.com/{CURRENT_MAJOR_BRANCH}/nightly/deb/ ./' | sudo tee /etc/apt/sources.list.d/odoo.list + $ sudo apt-get update && sudo apt-get install odoo + + Use the usual `apt-get upgrade` command to keep the installation up-to-date. + + .. group-tab:: Fedora + + .. code-block:: console + + $ sudo dnf config-manager --add-repo=https://nightly.odoo.com/{CURRENT_MAJOR_BRANCH}/nightly/rpm/odoo.repo + $ sudo dnf install -y odoo + $ sudo systemctl enable odoo + $ sudo systemctl start odoo +``` + +:::{note} +Currently, there is no nightly repository for the Enterprise edition. +::: + +### Distribution package + +Instead of using the repository, packages for both the **Community** and **Enterprise** editions can +be downloaded from the [Odoo download page](https://www.odoo.com/page/download). + +```{eval-rst} +.. tabs:: + + .. group-tab:: Debian/Ubuntu + + .. note:: + Odoo {CURRENT_MAJOR_VERSION} 'deb' package currently supports `Debian Buster + `_ and `Ubuntu 18.04 + `_ or above. + + Once downloaded, execute the following commands **as root** to install Odoo as a service, + create the necessary PostgreSQL user, and automatically start the server: + + .. code-block:: console + + # dpkg -i # this probably fails with missing dependencies + # apt-get install -f # should install the missing dependencies + # dpkg -i + + .. warning:: + - The `python3-xlwt` Debian package, needed to export into the XLS format, does not exist + in Debian Buster nor Ubuntu 18.04. If needed, install it manually with the following: + + .. code-block:: console + + $ sudo pip3 install xlwt + + - The `num2words` Python package - needed to render textual amounts - does not exist in + Debian Buster nor Ubuntu 18.04, which could cause problems with the `l10n_mx_edi` module. + If needed, install it manually with the following: + + .. code-block:: console + + $ sudo pip3 install num2words + + .. group-tab:: Fedora + + .. note:: + Odoo {CURRENT_MAJOR_VERSION} 'rpm' package supports Fedora 38. + + Once downloaded, the package can be installed using the 'dnf' package manager: + + .. code-block:: console + + $ sudo dnf localinstall odoo_{CURRENT_MAJOR_BRANCH}.latest.noarch.rpm + $ sudo systemctl enable odoo + $ sudo systemctl start odoo +``` + +(install-packages-windows)= + +## Windows + +> :::{warning} +> Windows packaging is offered for the convenience of testing or running single-user local +> instances but production deployment is discouraged due to a number of limitations and risks +> associated with deploying Odoo on a Windows platform. +> ::: + +1. Download the installer from the [nightly server](https://nightly.odoo.com) (Community only) or + the Windows installer from the [Odoo download page](https://www.odoo.com/page/download) (any + edition. + +2. Execute the downloaded file. + + :::{warning} + On Windows 8 and later, a warning titled *Windows protected your PC* may be displayed. Click + **More Info** and then **Run anyway** to proceed. + ::: + +3. Accept the [UAC](https://en.wikipedia.org/wiki/User_Account_Control) prompt. + +4. Go through the installation steps. + +Odoo launches automatically at the end of the installation. + diff --git a/content/administration/on_premise/source.md b/content/administration/on_premise/source.md new file mode 100644 index 000000000..65600569e --- /dev/null +++ b/content/administration/on_premise/source.md @@ -0,0 +1,506 @@ +# Source install + +The source 'installation' is not about installing Odoo but running it directly from the source +instead. + +Using the Odoo source can be more convenient for module developers as it is more easily accessible +than using packaged installers. + +It makes starting and stopping Odoo more flexible and explicit than the services set up by the +packaged installers. Also, it allows overriding settings using {ref}`command-line parameters +` without needing to edit a configuration file. + +Finally, it provides greater control over the system's setup and allows to more easily keep (and +run) multiple versions of Odoo side-by-side. + +## Fetch the sources + +There are two ways to obtain the source code of Odoo: as a ZIP **archive** or through **Git**. + +### Archive + +Community edition: + +- [Odoo download page](https://www.odoo.com/page/download) +- [GitHub Community repository](https://github.com/odoo/odoo) +- [Nightly server](https://nightly.odoo.com) + +Enterprise edition: + +- [Odoo download page](https://www.odoo.com/page/download) +- [GitHub Enterprise repository](https://github.com/odoo/enterprise) + +(install-source-git)= + +### Git + +:::{note} +It is required to have [Git](https://git-scm.com/) installed, and it is recommended to have a +basic knowledge of Git commands to proceed. +::: + +To clone a Git repository, choose between cloning with HTTPS or SSH. In most cases, the best option +is HTTPS. However, choose SSH to contribute to Odoo source code or when following the {doc}`Getting +Started developer tutorial `. + +```{eval-rst} +.. tabs:: + + .. group-tab:: Linux + + .. tabs:: + + .. tab:: Clone with HTTPS + + .. code-block:: console + + $ git clone https://github.com/odoo/odoo.git + $ git clone https://github.com/odoo/enterprise.git + + .. tab:: Clone with SSH + + .. code-block:: console + + $ git clone git@github.com:odoo/odoo.git + $ git clone git@github.com:odoo/enterprise.git + + .. group-tab:: Windows + + .. tabs:: + + .. tab:: Clone with HTTPS + + .. code-block:: doscon + + C:\> git clone https://github.com/odoo/odoo.git + C:\> git clone https://github.com/odoo/enterprise.git + + .. tab:: Clone with SSH + + .. code-block:: doscon + + C:\> git clone git@github.com:odoo/odoo.git + C:\> git clone git@github.com:odoo/enterprise.git + + .. group-tab:: Mac OS + + .. tabs:: + + .. tab:: Clone with HTTPS + + .. code-block:: console + + $ git clone https://github.com/odoo/odoo.git + $ git clone https://github.com/odoo/enterprise.git + + .. tab:: Clone with SSH + + .. code-block:: console + + $ git clone git@github.com:odoo/odoo.git + $ git clone git@github.com:odoo/enterprise.git +``` + +:::{note} +**The Enterprise git repository does not contain the full Odoo source code**. It is only a +collection of extra add-ons. The main server code is in the Community edition. Running the +Enterprise version means running the server from the Community version with the `addons-path` +option set to the folder with the Enterprise edition. It is required to clone both the Community +and Enterprise repositories to have a working Odoo Enterprise installation. +::: + +(install-source-prepare)= + +## Prepare + +### Python + +Odoo requires **Python 3.10** or later to run. + +:::{versionchanged} 17 Minimum requirement updated from Python 3.7 to Python 3.10. +::: + +```{eval-rst} +.. tabs:: + + .. group-tab:: Linux + + Use a package manager to download and install Python 3 if needed. + + .. group-tab:: Windows + + `Download the latest version of Python 3 `_ and + install it. + + During installation, check **Add Python 3 to PATH**, then click **Customize Installation** and + make sure that **pip** is checked. + + .. group-tab:: Mac OS + + Use a package manager (`Homebrew `_, `MacPorts `_) + to download and install Python 3 if needed. +``` + +:::{note} +If Python 3 is already installed, make sure that the version is 3.10 or above, as previous +versions are not compatible with Odoo. + +```{eval-rst} +.. tabs:: + + .. group-tab:: Linux + + .. code-block:: console + + $ python3 --version + + .. group-tab:: Windows + + .. code-block:: doscon + + C:\> python --version + + .. group-tab:: Mac OS + + .. code-block:: console + + $ python3 --version +``` + +Verify that [pip](https://pip.pypa.io) is also installed for this version. + +```{eval-rst} +.. tabs:: + + .. group-tab:: Linux + + .. code-block:: console + + $ pip3 --version + + .. group-tab:: Windows + + .. code-block:: doscon + + C:\> pip --version + + .. group-tab:: Mac OS + + .. code-block:: console + + $ pip3 --version +``` +::: + +### PostgreSQL + +Odoo uses PostgreSQL as its database management system. + +```{eval-rst} +.. tabs:: + + .. group-tab:: Linux + + Use a package manager to download and install PostgreSQL (supported versions: 12.0 or above). + It can be achieved by executing the following: + + .. code-block:: console + + $ sudo apt install postgresql postgresql-client + + .. group-tab:: Windows + + `Download PostgreSQL `_ (supported versions: 12.0 + or above) and install it. + + .. group-tab:: Mac OS + + Use `Postgres.app `_ to download and install PostgreSQL (supported + version: 12.0 or above). + + .. tip:: + To make the command line tools bundled with Postgres.app available, make sure to set up the + `$PATH` variable by following the `Postgres.app CLI tools instructions + `_. +``` + +By default, the only user is `postgres`. As Odoo forbids connecting as `postgres`, create a new +PostgreSQL user. + +```{eval-rst} +.. tabs:: + + .. group-tab:: Linux + + .. code-block:: console + + $ sudo -u postgres createuser -d -R -S $USER + $ createdb $USER + + .. note:: + Because the PostgreSQL user has the same name as the Unix login, it is possible to connect + to the database without a password. + + .. group-tab:: Windows + + #. Add PostgreSQL's `bin` directory (by default: + :file:`C:\\Program Files\\PostgreSQL\\\\bin`) to the `PATH`. + #. Create a postgres user with a password using the pg admin gui: + + #. Open **pgAdmin**. + #. Double-click the server to create a connection. + #. Select :menuselection:`Object --> Create --> Login/Group Role`. + #. Enter the username in the **Role Name** field (e.g., `odoo`). + #. Open the **Definition** tab, enter a password (e.g., `odoo`), and click **Save**. + #. Open the **Privileges** tab and switch **Can login?** to `Yes` and **Create database?** + to `Yes`. + + .. group-tab:: Mac OS + + .. code-block:: console + + $ sudo -u postgres createuser -d -R -S $USER + $ createdb $USER + + .. note:: + Because the PostgreSQL user has the same name as the Unix login, it is possible to connect + to the database without a password. +``` + +(install-dependencies)= + +### Dependencies + +```{eval-rst} +.. tabs:: + + .. group-tab:: Linux + + Using **distribution packages** is the preferred way of installing dependencies. + Alternatively, install the Python dependencies with **pip**. + + .. tabs:: + + .. tab:: Debian/Ubuntu + + On Debian/Ubuntu, the following commands should install the required packages: + + .. code-block:: console + + $ cd odoo #CommunityPath + $ sudo ./setup/debinstall.sh + + The `setup/debinstall.sh` script will parse the `debian/control + <{GITHUB_PATH}/debian/control>`_ file and install the found packages. + + .. tab:: Install with pip + + .. warning:: + Using pip may lead to security issues and broken dependencies; only do this if you + know what you are doing. + + As some of the Python packages need a compilation step, they require system libraries to + be installed. + + On Debian/Ubuntu, the following command should install these required libraries: + + .. code-block:: console + + $ sudo apt install python3-pip libldap2-dev libpq-dev libsasl2-dev + + Odoo dependencies are listed in the :file:`requirements.txt` file located at the root of + the Odoo Community directory. + + .. note:: + The Python packages in :file:`requirements.txt` are based on their stable/LTS + Debian/Ubuntu corresponding version at the moment of the Odoo release. For example, + for Odoo 15.0, the `python3-babel` package version is 2.8.0 in Debian Bullseye and + 2.6.0 in Ubuntu Focal. The lowest version is then chosen in the + :file:`requirements.txt`. + + .. tip:: + It can be preferable not to mix Python module packages between different instances of + Odoo or with the system. However, it is possible to use `virtualenv + `_ to create isolated Python environments. + + Navigate to the path of the Odoo Community installation (:file:`CommunityPath`) and run + **pip** on the requirements file to install the requirements for the current user. + + .. code-block:: console + + $ cd /CommunityPath + $ pip install -r requirements.txt + + .. group-tab:: Windows + + Before installing the dependencies, download and install the `Build Tools for Visual + Studio `_. Select **C++ build tools** in the + **Workloads** tab and install them when prompted. + + Odoo dependencies are listed in the `requirements.txt` file located at the root of the Odoo + Community directory. + + .. tip:: + It can be preferable not to mix Python module packages between different instances of + Odoo or with the system. However, it is possible to use `virtualenv + `_ to create isolated Python environments. + + Navigate to the path of the Odoo Community installation (`CommunityPath`) and run **pip** on + the requirements file in a terminal **with Administrator privileges**: + + .. code-block:: doscon + + C:\> cd \CommunityPath + C:\> pip install setuptools wheel + C:\> pip install -r requirements.txt + + .. group-tab:: Mac OS + + Odoo dependencies are listed in the `requirements.txt` file located at the root of the Odoo + Community directory. + + .. tip:: + It can be preferable not to mix Python module packages between different instances of + Odoo or with the system. However, it is possible to use `virtualenv + `_ to create isolated Python environments. + + Navigate to the path of the Odoo Community installation (`CommunityPath`) and run **pip** on + the requirements file: + + .. code-block:: console + + $ cd /CommunityPath + $ pip3 install setuptools wheel + $ pip3 install -r requirements.txt + + .. warning:: + Non-Python dependencies must be installed with a package manager (`Homebrew + `_, `MacPorts `_). + + #. Download and install the **Command Line Tools**: + + .. code-block:: console + + $ xcode-select --install + + #. Use the package manager to install non-Python dependencies. +``` + +:::{note} +For languages using a **right-to-left interface** (such as Arabic or Hebrew), the `rtlcss` +package is required. + +```{eval-rst} +.. tabs:: + + .. group-tab:: Linux + + #. Download and install **nodejs** and **npm** with a package manager. + #. Install `rtlcss`: + + .. code-block:: console + + $ sudo npm install -g rtlcss + + .. group-tab:: Windows + + #. Download and install `nodejs `_. + #. Install `rtlcss`: + + .. code-block:: doscon + + C:\> npm install -g rtlcss + + #. Edit the system environment's variable `PATH` to add the folder where `rtlcss.cmd` is + located (typically: :file:`C:\\Users\\\\AppData\\Roaming\\npm\\`). + + .. group-tab:: Mac OS + + #. Download and install **nodejs** with a package manager (`Homebrew `_, + `MacPorts `_). + #. Install `rtlcss`: + + .. code-block:: console + + $ sudo npm install -g rtlcss +``` +::: + +:::{warning} +`wkhtmltopdf` is not installed through **pip** and must be installed manually in [version 0.12.6](https://github.com/wkhtmltopdf/packaging/releases/tag/0.12.6.1-3) for it to support headers +and footers. Check out the [wkhtmltopdf wiki](https://github.com/odoo/odoo/wiki/Wkhtmltopdf) +for more details on the various versions. +::: + +(install-source-running-odoo)= + +## Running Odoo + +Once all dependencies are set up, Odoo can be launched by running `odoo-bin`, the command-line +interface of the server. It is located at the root of the Odoo Community directory. + +To configure the server, either specify {ref}`command-line arguments ` or +a {ref}`configuration file `. + +:::{tip} +For the Enterprise edition, add the path to the `enterprise` add-ons to the `addons-path` +argument. Note that it must come before the other paths in `addons-path` for add-ons to be loaded +correctly. +::: + +Common necessary configurations are: + +- PostgreSQL user and password. +- Custom addon paths beyond the defaults to load custom modules. + +A typical way to run the server would be: + +```{eval-rst} +.. tabs:: + + .. group-tab:: Linux + + .. code-block:: console + + $ cd /CommunityPath + $ python3 odoo-bin --addons-path=addons -d mydb + + Where `CommunityPath` is the path of the Odoo Community installation, and `mydb` is the name + of the PostgreSQL database. + + .. group-tab:: Windows + + .. code-block:: doscon + + C:\> cd CommunityPath/ + C:\> python odoo-bin -r dbuser -w dbpassword --addons-path=addons -d mydb + + Where `CommunityPath` is the path of the Odoo Community installation, `dbuser` is the + PostgreSQL login, `dbpassword` is the PostgreSQL password, and `mydb` is the name of the + PostgreSQL database. + + .. group-tab:: Mac OS + + .. code-block:: console + + $ cd /CommunityPath + $ python3 odoo-bin --addons-path=addons -d mydb + + Where `CommunityPath` is the path of the Odoo Community installation, and `mydb` is the name + of the PostgreSQL database. +``` + +After the server has started (the INFO log `odoo.modules.loading: Modules loaded.` is printed), open + in a web browser and log into the Odoo database with the base administrator +account: use `admin` as the email and, again, `admin` as the password. + +:::{tip} +- From there, create and manage new {doc}`users <../../applications/general/users>`. +- The user account used to log into Odoo's web interface differs from the {option}`--db_user + ` CLI argument. +::: + +:::{seealso} +{doc}`The list of CLI arguments for odoo-bin ` +::: + diff --git a/content/administration/on_premise/update.md b/content/administration/on_premise/update.md new file mode 100644 index 000000000..3763a108e --- /dev/null +++ b/content/administration/on_premise/update.md @@ -0,0 +1,145 @@ +(setup-update)= + +# Bugfix updates + +## Introduction + +In order to benefit from the latest improvements, security fixes, bug corrections and +performance boosts, you may need to update your Odoo installation from time to time. + +This guide only applies when are using Odoo on your own hosting infrastructure. +If you are using one of the Odoo Cloud solutions, updates are automatically performed for you. + +The terminology surrounding software updates is often confusing, so here are some preliminary +definitions: + +Updating (an Odoo installation) + +: Refers to the process of obtaining the latest revision of the source code for + your current Odoo Edition. For example, updating your Odoo Enterprise 13.0 to the + latest revision. + This does not directly cause any change to the contents of your Odoo database, and + can be undone by reinstalling the previous revision of the source code. + +Upgrading (an Odoo database) + +: Refers to a complex data processing operation where the structure and contents of your + database is permanently altered to make it compatible with a new release of Odoo. + This operation is irreversible and typically accomplished via Odoo's + [database upgrade service](https://upgrade.odoo.com), when you decide to + switch to a newer release of Odoo. + Historically, this process has also been known as a "migration" because it involves moving data + around inside the database, even though the database may end up at the same physical location + after the upgrade. + +This page describes the typical steps needed to *update* an Odoo installation to the latest +version. If you'd like more information about upgrading a database, please visit the +[Odoo Upgrade page](https://upgrade.odoo.com) instead. + +## In a nutshell + +Updating Odoo is accomplished by simply reinstalling the latest version of your Odoo +Edition on top of your current installation. This will preserve your data without any alteration, +as long as you do not uninstall PostgreSQL (the database engine that comes with Odoo). + +The main reference for updating is logically our {doc}`installation guide <../on_premise>`, +which explains the common installation methods. + +Updating is also most appropriately accomplished by the person who deployed Odoo initially, +because the procedure is very similar. + +:::{note} +We always recommend to download a complete new up-to-date Odoo version, rather than +manually applying patches, such as the security patches that come with Security +Advisories. +The patches are mainly provided for installations that are heavily customized, or for +technical personnel who prefer to apply minimal changes temporarily while testing a +complete update. +::: + +## Step 1: Download an updated Odoo version + +The central download page is . If you see a "Buy" link for the +Odoo Enterprise download, make sure you are logged into Odoo.com with the same login that is +linked to your Odoo Enterprise subscription. + +Alternatively, you can use the unique download link that was included with your Odoo Enterprise +purchase confirmation email. + +:::{note} +Downloading an updated version is not necessary if you installed via Github (see below) +::: + +## Step 2: Make a backup of your database + +The update procedure is quite safe and should not alter you data. However it's always best to take +a full database backup before performing any change on your installation, and to store it somewhere +safe, on a different computer. + +If you have not disabled the database manager screen (see {ref}`here ` why you should), you +can use it (link at bottom of your database selection screen) to download a backup of your +database(s). If you disabled it, use the same procedure than for your usual backups. + +## Step 3: Install the updated version + +Choose the method that matches your current installation: + +### Packaged Installers + +If you installed Odoo with an installation package downloaded on our website (the recommended method), +updating is very simple. +All you have to do is download the installation package corresponding to your system (see step #1) +and install it on your server. They are updated daily and include the latest security fixes. +Usually, you can simply double-click the package to install it on top of the current installation. +After installing the package, be sure to restart the Odoo service or reboot your server, +and you're all set. + +### Source Install (Tarball) + +If you have originally installed Odoo with the "tarball" version (source code archive), you have +to replace the installation directory with a newer version. First download the latest tarball +from Odoo.com. They are updated daily and include the latest security fixes (see step #1) +After downloading the package, extract it to a temporary location on your server. + +You will get a folder labeled with the version of the source code, for example "odoo-13.0+e.20190719", +that contains a folder "odoo.egg-info" and the actual source code folder named "odoo" (for Odoo 10 +and later) or "openerp" for older versions. +You can ignore the odoo.egg-info folder. Locate the folder where your current installation is deployed, +and replace it with the newer "odoo" or "openerp" folder that was in the archive you just extracted. + +Be sure to match the folder layout, for example the new "addons" folder included in the source code +should end up exactly at the same path it was before. Next, watch out for any specific configuration +files that you may have manually copied or modified in the old folder, and copy them over to the +new folder. +Finally, restart the Odoo service or reboot the machine, and you are all set. + +### Source Install (Github) + +If you have originally installed Odoo with a full Github clone of the official repositories, the +update procedure requires you to pull the latest source code via git. +Change into the directory for each repository (the main Odoo repository, and the Enterprise +repository), and run the following commands: + +``` +git fetch +git rebase --autostash +``` + +The last command may encounter source code conflicts if you had edited the Odoo source code locally. +The error message will give you the list of files with conflicts, and you will need to resolve +the conflicts manually, by editing them and deciding which part of the code to keep. + +Alternatively, if you prefer to simply discard the conflicting changes and restore the official +version, you can use the following command: + +``` +git reset --hard +``` + +Finally, restart the Odoo service or reboot the machine, and you should be done. + +### Docker + +Please refer to our [Docker image documentation](https://hub.docker.com/_/odoo/) for +specific update instructions. + diff --git a/content/administration/supported_versions.md b/content/administration/supported_versions.md new file mode 100644 index 000000000..556c3ec9c --- /dev/null +++ b/content/administration/supported_versions.md @@ -0,0 +1,108 @@ +--- +hide-page-toc: true +substitutions: + green: "```{raw} html\n\u25CF\n```" + red: "```{raw} html\n\u25CF\n```" +--- + +(supported-versions)= + +# Supported versions + +Odoo provides support and bug fixing **for the 3 last major versions** of Odoo. + +:::{note} +Odoo releases intermediary versions called **Online versions** on the {doc}`Odoo Online +` hosting every two months. Odoo Online users can then benefit from the latest +features of Odoo. + +- Admins of Odoo Online databases are invited to {doc}`upgrade ` them regularly. +- Online versions are *not* released for Odoo.sh and On-Premise installations. +- Online versions are listed below as *SaaS*. +::: + +This matrix shows the support status of every version. + +**Major releases are in bold type.** + +```{eval-rst} +.. list-table:: + :header-rows: 1 + :widths: auto + + * - + - Odoo Online + - Odoo.sh + - On-Premise + - Release date + - End of support + * - Odoo SaaS 18.1 + - |green| + - N/A + - N/A + - January 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 + * - **Odoo 17.0** + - |green| + - |green| + - |green| + - November 2023 + - October 2026 (planned) + * - **Odoo 16.0** + - |green| + - |green| + - |green| + - October 2022 + - October 2025 (planned) + * - **Odoo 15.0** + - |red| + - |red| + - |red| + - October 2021 + - October 2024 + * - **Odoo 14.0** + - |red| + - |red| + - |red| + - October 2020 + - November 2023 + * - Older versions + - |red| + - |red| + - |red| + - Before 2020 + - Before 2023 +``` + +:::{admonition} Legend +{{ green }} Supported version + +{{ red }} End-of-support + +N/A Never released for this platform +::: + +:::{important} +Even though we don't support older versions, you can always [upgrade from any version](https://upgrade.odoo.com/). +::: + diff --git a/content/administration/upgrade.md b/content/administration/upgrade.md new file mode 100644 index 000000000..4ec34b27c --- /dev/null +++ b/content/administration/upgrade.md @@ -0,0 +1,445 @@ +# Upgrade + +An upgrade involves moving a database from an older version to a newer supported version (e.g., from +Odoo 16.0 to Odoo 18.0). Regular upgrades are crucial as each version offers new features, bug +fixes, and security patches. Using a {doc}`supported version ` is strongly +recommended. Each major version is supported for three years. + +Depending on the hosting type and Odoo version used, a database upgrade can be **mandatory**. + +```{eval-rst} +.. tabs:: + + .. group-tab:: Odoo Online + + - If a database is on a **major version** (e.g., 16.0, 17.0, 18.0), an upgrade is mandatory + every two years. + - If a database is on a **minor version** (e.g., 17.1, 17.2, 17.4), an upgrade is mandatory + a few weeks after the next version is released. Minor versions are usually released every + two months. + + .. group-tab:: Odoo.sh + + After the initial three years of support, you will have another two years to complete the + upgrade. You will be notified when an upgrade is required. + + .. image:: upgrade/odoo-sh-message.png + :alt: The "unsupported version" popup on Odoo.sh. + + .. group-tab:: On-premise + + You can stay on the same version indefinitely, even if it is not recommended. Note that the + smaller the version gap, the easier the upgrade should be. +``` + +```{eval-rst} +.. spoiler:: Automatic upgrades: Odoo Online's Rolling Release process + + You will receive a notification in your database a few weeks before a mandatory upgrade will be + automatically carried out. You are in control of the process as long as the deadline is not + reached. + + .. image:: upgrade/rr-upgrade-message.png + :alt: The upgrade message prompt on the top right of the database + + Concretely, Odoo’s Upgrade Team performs a silent test upgrade of every database that should be + upgraded. If the test is successful and lasts less than 20 minutes, you can directly trigger the + upgrade from the database. If the test fails, you can test an upgrade using the `database manager + `_. + + When you are invited to upgrade, it is strongly recommended to :ref:`request an upgraded test + database ` first and spend time :ref:`testing ` it. + + An automatic upgrade to the next version will be triggered if no action is taken before the + specified due date. +``` + +An upgrade does not cover: + +> - Downgrading to a previous version of Odoo +> - {doc}`Switching editions ` (e.g., from Community to +> Enterprise) +> - {ref}`Changing hosting type ` (e.g., from on-premise to Odoo Online) +> - Migrating from another ERP to Odoo + +:::{warning} +If your database contains custom modules, it cannot be upgraded until a version of your custom +modules is available for the target version of Odoo. For customers maintaining their own custom +modules, we recommend to parallelize the process by {ref}`requesting an upgraded database +` while also {doc}`upgrading the source code of your custom +modules `. +::: + +(upgrade-nutshell)= + +## Upgrading in a nutshell + +1. Request an upgraded test database (see {ref}`obtaining an upgraded test database + `). +2. If applicable, upgrade the source code of your custom module to be compatible with the new + version of Odoo (see {doc}`/developer/howtos/upgrade_custom_db`). +3. Thoroughly test the upgraded database (see {ref}`testing the new version of the database + `). +4. Report any issue encountered during the testing to Odoo by going to the [Support page and + selecting "An issue related to my future upgrade (I am testing an upgrade)"](https://www.odoo.com/help?stage=migration). +5. Once all issues are resolved and you are confident that the upgraded database can be used as + your main database without any issues, plan the upgrade of your production database. +6. Request the upgrade for the production database, rendering it unavailable for the time it takes + to complete the process (see {ref}`upgrading the production database `). +7. Report any issue encountered during the upgrade to Odoo by going to the [Support page and + selecting "An issue related to my upgrade (production)"](https://www.odoo.com/help?stage=post_upgrade). + +(upgrade-request-test)= + +## Obtaining an upgraded test database + +The [Upgrade page](https://upgrade.odoo.com) is the main platform for requesting an upgraded +database. However, depending on the hosting type, you can upgrade from the command line +(on-premise), the Odoo Online [database manager](https://www.odoo.com/my/databases), or your +[Odoo.sh project](https://www.odoo.sh/project). + +:::{note} +The Upgrade platform follows the same [Privacy Policy](https://www.odoo.com/privacy) as the +other Odoo.com services. Visit the [General Data Protection Regulation page](https://www.odoo.com/gdpr) to learn more about how Odoo handles your data and privacy. +::: + +```{eval-rst} +.. tabs:: + + .. group-tab:: Odoo Online + + Odoo Online databases can be manually upgraded via the `database manager + `_. + + The database manager displays all databases associated with the user's account. Databases + not on the most recent version of Odoo display an arrow in a circle icon next to their name, + indicating that they can be upgraded. + + .. image:: upgrade/databases-page.png + :alt: The database manager with an upgrade button next to the name of a database. + + Click the **arrow in a circle** icon to start the upgrade process. In the popup, fill in: + + - The **version** of Odoo you want to upgrade to, usually the latest version + - The **email** address that should receive the link to the upgraded database + - The :guilabel:`Purpose` of the upgrade, which is automatically set to :guilabel:`Test` for + your first upgrade request + + .. image:: upgrade/upgrade-popup.png + :alt: The "Upgrade your database" popup. + + The :guilabel:`Upgrade in progress` tag is displayed next to the database name until + completion. Once the process succeeds, an email containing a link to the upgraded test + database is sent to the address provided. The database can also be accessed from the database + manager by clicking the dropdown arrow before the database name. + + .. image:: upgrade/access-upgraded-db.png + :alt: Clicking the menu arrow displays the upgraded test database. + + .. group-tab:: Odoo.sh + + Odoo.sh is integrated with the upgrade platform to simplify the upgrade process. + + .. image:: upgrade/odoo-sh-staging.png + :alt: Odoo.sh project and tabs + + The **latest production daily automatic backup** is then sent to the Upgrade platform. + + Once the upgrade platform is done upgrading the backup and uploading it on the branch, it is + put in a **special mode**: each time a **commit is pushed** on the branch, a **restore + operation** of the upgraded backup and an **update of all the custom modules** occur. This + allows you to test your custom modules on a pristine copy of the upgraded database. The log + file of the upgrade process can be found in your newly upgraded staging build by going to + :file:`~/logs/upgrade.log`. + + .. important:: + In databases where custom modules are installed, their source code must be up-to-date with + the target version of Odoo before the upgrade can be performed. If there are none, the + "update on commit" mode is skipped, the upgraded database is built as soon as it is + transferred from the upgrade platform, and the upgrade mode is exited. + + Check out the :doc:`/developer/howtos/upgrade_custom_db` page for more information. + + .. group-tab:: On-premise + + The standard upgrade process can be initiated by entering the following command line on the + machine where the database is hosted: + + .. code-block:: console + + $ python <(curl -s https://upgrade.odoo.com/upgrade) test -d -t + + .. note:: + This command has some requirements on the environment it runs in: + + - Some external commands that must be provided by the operating system, normally found in + any Linux distribution (including WSL). An error will be displayed if one or several of + them are missing. + - The system user that executes the command needs to be configured with access to the + database. Please refer to the PostgreSQL documentation of the `client environment + `_ or the `client password + file `_ for this requirement. + - The script needs to be able to reach one or multiple servers of the upgrade platform + both on TCP port 443 and to any random TCP port in the range between 32768 and 60999. + This can be in conflict with your restrictive firewall and may need an exception added + to the firewall configuration. + + The following command can be used to display the general help and the main commands: + + .. code-block:: console + + $ python <(curl -s https://upgrade.odoo.com/upgrade) --help + + An upgraded test database can also be requested via the `Upgrade page + `_. + + .. important:: + In databases where custom modules are installed, their source code must be up-to-date with + the target version of Odoo before the upgrade can be performed. Check out the + :doc:`/developer/howtos/upgrade_custom_db` page for more information. + + .. note:: + - For security reasons, only the person who submitted the upgrade request can download it. + - For storage reasons, the database's copy is submitted without a filestore to the upgrade + server. Therefore, the upgraded database does not contain the production filestore. + - Before restoring the upgraded database, its filestore must be merged with the production + filestore to be able to perform tests in the same conditions as it would be in the new + version. + - The upgraded database contains: + + - A `dump.sql` file containing the upgraded database + - A `filestore` folder containing files extracted from in-database records into + attachments (if there are any) and new standard Odoo files from the targeted Odoo + version (e.g., new images, icons, payment provider's logos, etc.). + This is the folder that should be merged with the production filestore + in order to get the full upgraded filestore. +``` + +:::{note} +You can request multiple test databases if you wish to test an upgrade more than once. +::: + +:::{note} +When an upgrade request is completed, an upgrade report is attached to the successful upgrade +email, and it becomes available in the Discuss app for users who are part of the "Administration +/ Settings" group. This report provides important information about the changes introduced by +the new version. +::: + +(upgrade-testing)= + +## Testing the new version of the database + +It is essential to test the upgraded test database to ensure that you are not stuck in your +day-to-day activities by a change in views, behavior, or an error message once the upgrade goes +live. + +:::{note} +Test databases are neutralized, and some features are disabled to prevent them from impacting the +production database: + +1. Scheduled actions are disabled. +2. Outgoing mail servers are disabled by archiving the existing ones and adding a fake one. +3. Payment providers and delivery carriers are reset to the test environment. +4. Bank synchronization is disabled. Should you want to test the synchronization, contact your + bank synchronization provider to get sandbox credentials. +::: + +Testing as many of your business flows as possible is strongly recommended to ensure they are +working correctly and to get more familiar with the new version. + +:::{admonition} Basic test checklist +- Are there views that are deactivated in your test database but active in your production + database? +- Are your usual views still displayed correctly? +- Are your reports (invoice, sales order, etc.) correctly generated? +- Are your website pages working correctly? +- Are you able to create and modify records? (sales orders, invoices, purchases, users, contacts, + companies, etc.) +- Are there any issues with your mail templates? +- Are there any issues with saved translations? +- Are your search filters still present? +- Can you export your data? +::: + +```{eval-rst} +.. spoiler:: Example of end-to-end testing + + - Checking a random product in your product catalog and comparing its test and production data to + verify everything is the same (product category, selling price, cost price, vendor, accounts, + routes, etc.). + - Buying this product (Purchase app). + - Confirming the reception of this product (Inventory app). + - Checking if the route to receive this product is the same in your production database + (Inventory app). + - Selling this product (Sales app) to a random customer. + - Opening your customer database (Contacts app), selecting a customer (or company), and checking + its data. + - Shipping this product (Inventory app). + - Checking if the route to ship this product is the same as in your production database + (Inventory app). + - Validating a customer invoice (Invoicing or Accounting app). + - Crediting the invoice (issuing a credit note) and checking if it behaves as in your production + database. + - Checking your reports' results (Accounting app). + - Randomly checking your taxes, currencies, bank accounts, and fiscal year (Accounting app). + - Making an online order (Website apps) from the product selection in your shop until the + checkout process and checking if everything behaves as in your production database. + + This list is **not** exhaustive. Extend the example to your other apps based on your use of Odoo. +``` + +If you face an issue while testing your upgraded test database, you can request the assistance of +Odoo by going to the [Support page and selecting "An issue related to my future upgrade (I am +testing an upgrade)"](https://www.odoo.com/help?stage=migration). In any case, it is essential to +report any problem encountered during the testing to fix it before upgrading your production +database. + +You might encounter significant differences with standard views, features, fields, and models during +testing. Those changes cannot be reverted on a case-by-case basis. However, if a change introduced +by a new version breaks a customization, it is the responsibility of the maintainer of your custom +module to make it compatible with the new version of Odoo. + +:::{tip} +Do not forget to test: + +- Integrations with external software (EDI, APIs, etc.) +- Workflows between different apps (online sales with eCommerce, converting a lead all the way to + a sales order, delivery of products, etc.) +- Data exports +- Automated actions +- Server actions in the action menu on form views, as well as by selecting multiple records on + list views +::: + +(upgrade-production)= + +## Upgrading the production database + +Once the {ref}`tests ` are completed and you are confident that the upgraded +database can be used as your main database without any issues, it is time to plan the go-live day. + +Your production database will be unavailable during its upgrade. Therefore, we recommend planning +the upgrade at a time when the use of the database is minimal. + +As the standard upgrade scripts and your database are constantly evolving, it is also recommended +to frequently request another upgraded test database to ensure that the upgrade process is still +successful, especially if it takes a long time to finish. **Fully rehearsing the upgrade process the +day before upgrading the production database is also recommended.** + +:::{important} +Going into production without first testing may lead to: + +- Users failing to adjust to the changes and new features +- Business interruptions (e.g., no longer having the possibility to validate an action) +- Poor customer experience (e.g., an eCommerce website that does not work correctly) +::: + +The process of upgrading a production database is similar to upgrading a test database, but with a +few exceptions. + +```{eval-rst} +.. tabs:: + + .. group-tab:: Odoo Online + + The process is similar to :ref:`obtaining an upgraded test database + `, except for the purpose option, which must be set to + :guilabel:`Production` instead of :guilabel:`Test`. + + .. warning:: + Once the upgrade is requested, the database will be unavailable until the upgrade is + finished. Once the process is completed, it is impossible to revert to the previous + version. + + .. group-tab:: Odoo.sh + + The process is similar to :ref:`obtaining an upgraded test database ` on + the :guilabel:`Production` branch. + + .. image:: upgrade/odoo-sh-prod.png + :alt: View from the upgrade tab + + The process is **triggered as soon as a new commit is made** on the branch. This + allows the upgrade process to be synchronized with the deployment of the custom modules' + upgraded source code. + If there are no custom modules, the upgrade process is triggered immediately. + + .. important:: + The database is unavailable throughout the process. If anything goes wrong, the platform + automatically reverts the upgrade, as it would be for a regular update. In case of success, + a backup of the database before the upgrade is created. + + The update of your custom modules must be successful to complete the entire upgrade process. + Make sure the status of your staging upgrade is :guilabel:`successful` before trying it in + production. More information on how to upgrade your custom modules can be found on + :doc:`/developer/howtos/upgrade_custom_db`. + + .. group-tab:: On-premise + + The command to upgrade a database to production is similar to the one of upgrading a test + database except for the argument `test`, which must be replaced by `production`: + + .. code-block:: console + + $ python <(curl -s https://upgrade.odoo.com/upgrade) production -d -t + + An upgraded production database can also be requested via the `Upgrade page + `_. + + Once the database is uploaded, any modification to your production database will **not** be + present on your upgraded database. This is why we recommend not using it during the upgrade + process. + + .. important:: + When requesting an upgraded database for production purposes, the copy is submitted without + a filestore. Therefore, the upgraded database filestore must be merged with the production + filestore before deploying the new version. +``` + +In case of an issue with your production database, you can request the assistance of Odoo by going +to the [Support page and selecting "An issue related to my upgrade (production)"](https://www.odoo.com/help?stage=post_upgrade). + +(upgrade-sla)= + +## Service-level agreement (SLA) + +With Odoo Enterprise, upgrading a database to the most recent version of Odoo is **free**, including +any support required to rectify potential discrepancies in the upgraded database. + +Information about the upgrade services included in the Enterprise Licence is available in the +{ref}`Odoo Enterprise Subscription Agreement `. However, this section clarifies what +upgrade services you can expect. + +(upgrade-sla-covered)= + +### Upgrade services covered by the SLA + +Databases hosted on Odoo's cloud platforms (Odoo Online and Odoo.sh) or self-hosted (On-Premise) can +benefit from upgrade services at all times for: + +- the upgrade of all **standard applications**; +- the upgrade of all **customizations created with the Studio app**, as long as Studio is still + installed and the respective subscription is still active; and +- the upgrade of all **developments and customizations covered by a maintenance of customizations + subscription**. + +Upgrade services are limited to the technical conversion and adaptation of a database (standard +modules and data) to make it compatible with the version targeted by the upgrade. + +(upgrade-sla-not-covered)= + +### Upgrade services not covered by the SLA + +The following upgrade-related services are **not** included: + +- the **cleaning** of pre-existing data and configurations while upgrading; +- the upgrade of **additional modules not covered by a maintenance contract** that are created + in-house or by third parties, including Odoo partners; and +- **training** on using the upgraded version's features and workflows. + +:::{seealso} +- {doc}`Odoo.sh documentation ` +- {doc}`Supported Odoo versions ` +::: + diff --git a/content/applications.md b/content/applications.md new file mode 100644 index 000000000..90b3da852 --- /dev/null +++ b/content/applications.md @@ -0,0 +1,27 @@ +--- +hide-page-toc: true +nosearch: true +show-content: true +show-toc: true +--- + +# User Docs + +Discover our user guides and configuration tutorials per application. + +```{toctree} +:maxdepth: 2 + +applications/essentials +applications/finance +applications/sales +applications/websites +applications/inventory_and_mrp +applications/hr +applications/marketing +applications/services +applications/productivity +applications/studio +applications/general +``` + diff --git a/content/applications/essentials.md b/content/applications/essentials.md new file mode 100644 index 000000000..c86f0c24d --- /dev/null +++ b/content/applications/essentials.md @@ -0,0 +1,12 @@ +# Odoo essentials + +```{toctree} +essentials/activities +essentials/reporting +essentials/search +essentials/contacts +essentials/export_import_data +essentials/in_app_purchase +essentials/keyboard_shortcuts +``` + diff --git a/content/applications/essentials/activities.md b/content/applications/essentials/activities.md new file mode 100644 index 000000000..a31cdf23d --- /dev/null +++ b/content/applications/essentials/activities.md @@ -0,0 +1,361 @@ +--- +substitutions: + clock: '{icon}`fa-clock-o` {guilabel}`(clock)` icon' +--- + +# Activities + +*Activities* are follow-up tasks tied to a record in an Odoo database. + +(activities-important)= + +The icon used to display activities varies, depending on the {ref}`activity type +`: + +- {icon}`fa-clock-o` {guilabel}`(clock)` icon: the default activities icon. +- {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-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. + +## Schedule activities + +Activities can be scheduled on any page of the database that contains a {ref}`chatter +` thread, {ref}`Kanban view `, {ref}`list view +`, or {ref}`activities view ` of an application. + +(activities-chatter)= + +### 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 +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. +``` + +(activities-kanban)= + +### Kanban view + +Activities can also be created from the {icon}`oi-view-kanban` {guilabel}`(Kanban)` view. + +To do so, click on the {{ clock }} located at the bottom of an individual record. + +Click {guilabel}`+ Schedule An Activity`, then proceed to {ref}`fill out the Schedule Activity form +`. + +```{image} activities/schedule-kanban-activity.png +:align: center +:alt: Kanban view of the CRM pipeline and the option to schedule an activity. +``` + +:::{note} +If a record already has a scheduled activity, the {{ clock }} is replaced by the icon that represents +the existing scheduled activity. Click on the activity type's icon to schedule another activity. +::: + +(activities-list)= + +### List view + +Activities can also be created from a {icon}`oi-view-list` {guilabel}`(list)` view. + +If the {guilabel}`Activities` column is hidden, reveal it using the {icon}`oi-settings-adjust` +{guilabel}`(settings adjust)` icon in the far-right of the top row. + +Then, click on the {{ clock }} for the record the activity is being added to, and click {guilabel}`+ +Schedule an activity`. Proceed to {ref}`fill out the Schedule Activity form ` that +appears. + +:::{note} +If a record already has a scheduled activity, the {{ clock }} is replaced by the icon that represents +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)= + +### Activity view + +Most applications in Odoo have an *Activity* view available. If available, a {{ clock }} is visible in +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 +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 +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 +total number of scheduled activities. + +:::{note} +Activity colors, and their relation to an activity's due date, are consistent throughout Odoo, +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 +`. + +```{image} activities/activity-view.png +:align: center +:alt: Activity view of the CRM pipeline and the option to schedule an activity. +``` + +(activities-form)= + +### Schedule Activity form + +Activities can be scheduled from many different places, such as from the {ref}`chatter +` of a record, or from one of multiple views in an application, when available: +the {ref}`Kanban view `, {ref}`list view `, or {ref}`activity +view `. + +Enter the following information on the form: + +- {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`. +- {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. + +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. + + 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. + + 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. + + :::{important} + The {guilabel}`Open Calendar` button **only** appears if the {guilabel}`Activity Type` is set + to either {guilabel}`Call` or {guilabel}`Meeting`. + ::: + +- {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. + +```{image} activities/schedule-pop-up.png +:align: center +:alt: View of CRM leads and the option to schedule an activity. +``` + +(activities-all)= + +## 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 +{{ clock }}. + +All activities for each application are further divided into subsections, indicating where in the +application the activity is to be completed. Each sub-section lists the number of scheduled +activities that are {guilabel}`Late`, due {guilabel}`Today`, and scheduled in the +{guilabel}`Future`. + +```{eval-rst} +.. example:: + 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. +``` + +### Request a document + +The option to {guilabel}`Request a Document` is available at the bottom of the list of {ref}`all +scheduled activities `, the option to {guilabel}`Request a Document` appears. Click +{guilabel}`Request a Document`, and a {guilabel}`Request a file` pop-up window appears. + +Enter the following information on the form: + +- {guilabel}`Document Name`: enter a name for the document being requested. +- {guilabel}`Request To`: select the user the document is being requested from using the drop-down + menu. +- {guilabel}`Due Date In`: enter a numerical value indicating when the document is due. Next to + this field, a {guilabel}`Days` field is visible. Click {guilabel}`Days`, the default option, to + reveal a drop-down menu. Select the desired time-frame option from the list. The options are + {guilabel}`Days`, {guilabel}`Weeks`, or {guilabel}`Months`. +- {guilabel}`Workspace`: using the drop-down menu, select the specific {ref}`Workspace + ` the document is being uploaded to. +- {guilabel}`Tags`: select any desired tags from the drop-down menu. The available tags displayed + are based on the tags configured for the selected {guilabel}`Workspace`. +- {guilabel}`Message`: enter a message to clarify the document request in this field. + +When all the fields are completed, click {guilabel}`Request` to send the document request. + +```{image} activities/request-doc.png +:align: center +:alt: The Request a file form, with all fields filled out to request a contract. +``` + +(activities-types)= + +## Activity types + +To view the currently configured types of activities in the database, navigate to +{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 +{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 + +To edit an existing {ref}`activity type `, click on the activity type, and the +activity type form loads. + +Make any desired changes to the activity type form. The form automatically saves, but it can be +saved manually at any time by clicking the {guilabel}`Save Manually` option, represented by a +{icon}`fa-cloud-upload` {guilabel}`(cloud upload)` icon, located in the top-left corner of the page. + +### 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. + +#### Activity Settings section + +- {guilabel}`Action`: using the drop-down menu, select an action associated with this new activity + type. Some actions trigger specific behaviors after an activity is scheduled, such as: + + - {guilabel}`Upload Document`: if selected, a link to upload a document is automatically added to + the planned activity in the chatter. + - {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* + application to be installed. + + :::{note} + Available activity types vary based on the installed applications in the database. + ::: + +- {guilabel}`Folder`: select a specific {ref}`workspace ` folder to save a + document to. This field **only** appears if {guilabel}`Upload Document` is selected for the + {guilabel}`Action`. + + Using the drop-down menu, select the {guilabel}`Folder` the document is saved to. + +- {guilabel}`Default User`: select a user from the drop-down menu to automatically assign this + activity to the selected user when this activity type is scheduled. If this field is left blank, + the activity is assigned to the user who creates the activity. + +- {guilabel}`Default Summary`: enter a note to include whenever this activity type is created. + + :::{note} + The information in the {guilabel}`Default User` and {guilabel}`Default Summary` fields are + included when an activity is created. However, they can be altered before the activity is + scheduled or saved. + ::: + +- {guilabel}`Keep Done`: tick this checkbox to keep activities that have been marked as `Done` + visible in the {ref}`activity view `. + +- {guilabel}`Default Note`: enter any notes to appear with the activity. + +#### Next Activity section + +It is possible to have another activity either suggested or triggered. To do so, configure the +{guilabel}`Next Activity` section. + +- {guilabel}`Chaining Type`: select either {guilabel}`Suggest Next Activity` or {guilabel}`Trigger + Next Activity` from the drop-down menu. Depending on the selected option, either the + {guilabel}`Suggest` or {guilabel}`Trigger` field is displayed. + + :::{note} + The {guilabel}`Chaining Type` field does **not** appear if {guilabel}`Upload Document` is + selected for the {guilabel}`Action`. + ::: + +- {guilabel}`Suggest/Trigger`: depending on what is selected for the {guilabel}`Chaining Type`, this + field either displays {guilabel}`Suggest` or {guilabel}`Trigger`. Using the drop-down menu, select + the activity to recommend or schedule as a follow-up task to the activity type. + +- {guilabel}`Schedule`: configure when the next activity is suggested or triggered. + + First, enter a numerical value indicating when the activity is suggested or triggered. + + Next to this field, a {guilabel}`Days` field is visible. Click {guilabel}`Days`, the default + option, to reveal a drop-down menu. Select the desired time-frame option from the list. The + options are {guilabel}`Days`, {guilabel}`Weeks`, or {guilabel}`Months`. + + Lastly, using the drop-down menu, select whether the activity is scheduled or triggered either + {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} +- {doc}`../productivity/discuss` +- {doc}`../productivity/discuss/team_communication` +- {doc}`../sales/crm/optimize/utilize_activities` +::: + diff --git a/content/applications/essentials/contacts.md b/content/applications/essentials/contacts.md new file mode 100644 index 000000000..d348bc03c --- /dev/null +++ b/content/applications/essentials/contacts.md @@ -0,0 +1,257 @@ +--- +show-content: true +--- + +# Contacts + +Contacts are created in the **Contacts** application for customers the company does business with +through Odoo. A contact is a repository of vital business information, facilitating communication +and business transactions. + +## Contact form + +To create a new contact, navigate to the {menuselection}`Contacts app`, and click +{guilabel}`Create`. A new form appears where various contact information can be added. + +### Contact type + +Odoo allows for both {guilabel}`Individual` and {guilabel}`Company` contacts. Select either +{guilabel}`Individual` or {guilabel}`Company`, depending on the type of contact that is being added. + +### Name + +First, fill in the name of the {guilabel}`Individual` or {guilabel}`Company`. This is how the name +appears throughout the database. This field is **mandatory**. + +:::{tip} +{guilabel}`Individual` contacts can have a {guilabel}`Company` contact linked to it. After +selecting {guilabel}`Individual`, a new {guilabel}`Company Name...` field appears below the +first name field. +::: + +### Address + +Next, enter the {guilabel}`Address` of the {guilabel}`Company` or {guilabel}`Individual`. + +:::{tip} +If the {guilabel}`Individual` option is chosen, then the *type of address* can be chosen from a +drop-down menu. Options for this drop-down menu include: {guilabel}`Contact`, {guilabel}`Invoice +Address`, {guilabel}`Delivery Address`, {guilabel}`Other Address`, and {guilabel}`Private +Address`. +::: + +### Additional fields + +Additional details are included on the initial form. The following fields are available: + +- {guilabel}`VAT`: Value Added Tax number. +- {guilabel}`Citizen Identification`: citizen or government identification number (only available + on {guilabel}`Individual`). +- {guilabel}`Job Position`: list the job position of the {guilabel}`Individual` (only available on + {guilabel}`Individual`). +- {guilabel}`Phone`: list phone number (with country code). Make a call, send an SMS, or WhatsApp + message by hovering over the field on the saved form, and clicking the desired option. +- {guilabel}`Mobile`: list mobile phone number (with country code). Make a call, send an SMS, or + WhatsApp message by hovering over the field on the saved form, and clicking on the desired option. +- {guilabel}`Email`: enter the email address with the domain. +- {guilabel}`Website`: enter the full website address, starting with `http` or `https`. +- {guilabel}`Title`: select {guilabel}`Doctor`, {guilabel}`Madam`, {guilabel}`Miss`, + {guilabel}`Mister`, {guilabel}`Professor`, or create a new one directly from this field. +- {guilabel}`Tags`: enter preconfigured tags by typing them in the field, or clicking the drop-down + menu, and selecting one. To create a new one, type the new tag in the field, and click + {guilabel}`Create` from the resulting drop-down menu. + +### Contacts & Addresses tab + +At the bottom of the contact form are several tabs. On the {guilabel}`Contacts & Addresses` tab, +contacts can be added that are associated with a {guilabel}`Company` and related addresses. For +example, a specific contact person for the company can be listed here. + +Multiple addresses can be added on both {guilabel}`Individual` and {guilabel}`Company` contacts. To +do so, click {guilabel}`Add` in the {guilabel}`Contacts & Addresses` tab. Doing so reveals a +{guilabel}`Create Contact` pop-up form, in which additional addresses can be configured. + +```{image} contacts/contact-form-add-address.png +:align: center +:alt: Add a contact/address to the contact form. +``` + +On the {guilabel}`Create Contact` pop-up form, start by clicking the default {guilabel}`Other +Address` field at the top to reveal a drop-down menu of address-related options. + +Select any of the following options: + +- {guilabel}`Contact`: adds another contact to the existing contact form. +- {guilabel}`Invoice Address`: adds a specific invoice address to the existing contact form. +- {guilabel}`Delivery Address`: adds a specific delivery address to the existing contact form. +- {guilabel}`Other Address`: adds an alternate address to the existing contact form. +- {guilabel}`Private Address`: adds a private address to the existing contact form. + +```{image} contacts/create-contact-window.png +:align: center +:alt: Create a new contact/address on a contact form. +``` + +Once an option is selected, enter the corresponding contact information that should be used for the +specified address type. + +Add the {guilabel}`Contact Name`, {guilabel}`Address`, {guilabel}`Email`, along with the +{guilabel}`Phone` and/or {guilabel}`Mobile` numbers below. + +Set the {guilabel}`Job Position`, which appears if the {guilabel}`Contact` address type has been +selected. This is similar to the {guilabel}`Individual` contact. + +To add a note, click on the text field next to {guilabel}`Notes`, and write anything that is +applicable to the customer or contact. + +Then, click {guilabel}`Save & Close` to save the address, and close the {guilabel}`Create Contact` +window. Or, click {guilabel}`Save & New` to save the address, and immediately input another one. + +### Sales & Purchase tab + +Next, is the {guilabel}`Sales & Purchases` tab, which only appears when the *Sales*, *Purchase*, +**or** *Point of Sale* applications are installed. + +The {guilabel}`Fiscal Position` can be set on the {guilabel}`Sales & Purchases` tab. Select a +{guilabel}`Fiscal Position` from the drop-down menu. + +#### Sales section + +Under the {guilabel}`Sales` heading, a specific {guilabel}`Salesperson` can be assigned to a +contact. To do that, click the {guilabel}`Salesperson` drop-down field, and select one. Create a new +{guilabel}`Salesperson` by typing the user's name, and making the appropriate selection. + +Certain {guilabel}`Payment Terms`, or a certain {guilabel}`Pricelist`, can also be set, if needed. +Click the drop-down menu next to {guilabel}`Payment Terms`, and change it to one of the preselected +{guilabel}`Payment Terms`, or {guilabel}`Create` a new one. Select the {guilabel}`Pricelist` +drop-down menu to choose the appropriate {guilabel}`Pricelist`. + +Click into the {guilabel}`Delivery Method` field to select an option from the drop-down menu. + +#### Point Of Sale section + +Under the {guilabel}`Point Of Sale` heading, enter a {guilabel}`Barcode` that can be used to +identify the contact. Use the {guilabel}`Loyalty Points` field to track points the user won as part +of a *Loyalty Program*. + +#### Purchase section + +Specify {guilabel}`Payment Terms`, {guilabel}`1099 Box` information, and a preferred +{guilabel}`Payment Method` here. A {guilabel}`Receipt Reminder` can be set here, as well. + +#### Misc section + +Under the {guilabel}`Misc.` heading, use {guilabel}`Reference` field to add any additional +information for this contact. If this contact should only be accessible for one company in a +multi-company database, select it from the {guilabel}`Company` field drop-down list. Use the +{guilabel}`Website` drop-down menu to restrict the publishing of this contact to one website (if +working on a database with multiple websites). Select one or more {guilabel}`Website Tags` to assist +in filtering published customers on the `/customers` website page. Select an {guilabel}`Industry` +for this contact from the drop-down menu. Use the {guilabel}`SLA Policies` field to assign a +*Helpdesk* SLA policy to this contact. + +### Accounting tab + +The {guilabel}`Accounting` tab appears when the *Accounting* application is installed. Here, a user +can add any related {guilabel}`Bank Accounts`, or set default {guilabel}`Accounting entries`. + +Under the {guilabel}`Miscellaneous` heading, use the {guilabel}`LEI` field to enter a Legal Entity +Identifier, if necessary. + +### Internal Notes tab + +Following the {guilabel}`Accounting` tab is the {guilabel}`Internal Notes` tab, where notes can be +left on this contact form, just like on the contact form noted above. + +### Partner Assignment tab + +Next is the {guilabel}`Partner Assignment` tab, which by default, includes a {guilabel}`Geolocation` +section, and other partner options, including {guilabel}`Partner Activation` and {guilabel}`Partner +Review` configurations. These are **only** present when the *Resellers* module is installed. + +:::{seealso} +Follow the {doc}`Resellers documentation <../sales/crm/track_leads/resellers>` for more +information on publishing partners on the website. +::: + +### Membership tab + +Finally, there is the {guilabel}`Membership` tab on contact forms, which can help users manage any +memberships that are being offered to this specific contact. It should be noted that this tab +**only** appears when the *Members* application is installed. + +#### Activate membership + +To activate a contact's membership, click {guilabel}`Buy Membership` in the {guilabel}`Membership` +tab of a contact form. On the pop-up window that appears, select a {guilabel}`Membership` from the +drop-down menu. Then, configure a {guilabel}`Member Price`. Click {guilabel}`Invoice Membership` +when both fields are filled in. + +Alternatively, to offer a free membership, tick the {guilabel}`Free Member` checkbox, in the +{guilabel}`Membership` tab of a contact form. + +:::{seealso} +Follow the {doc}`Members documentation <../sales/members>` for more information on publishing +members on the website. +::: + +## Smart buttons + +At the top of the contact form, there are some additional options available, known as *smart +buttons*. + +Here, Odoo displays a variety of records, related to this contact, that were created on other apps. +Odoo integrates information from every single app, so there are many smart buttons. + +```{eval-rst} +.. example:: + For example, there is an :guilabel:`Opportunities` smart button, where all the opportunities + related to this customer from the *CRM* app are accessible. +``` + +:::{tip} +If the corresponding applications are installed, their related smart buttons appear +automatically on a contact form. +::: + +A user can see any {guilabel}`Meetings`, {guilabel}`Sales`, {guilabel}`POS Orders`, +{guilabel}`Subscriptions`, project {guilabel}`Tasks`, and the {guilabel}`More` smart button reveals +additional options, via a drop-down menu. A user can even quickly access {guilabel}`Purchases`, +{guilabel}`Helpdesk` tasks, {guilabel}`On-time Rate` for deliveries, {guilabel}`Invoiced` +information, {guilabel}`Vendor Bills`, and the {guilabel}`Partner Ledger` connected to this contact. + +Deliveries, documents, loyalty cards, and direct debits are *also* linked to smart buttons, like +this, should there be any outstanding/on-file for this contact. + +If the contact is a partner, the user can visit their partner page on the Odoo-built website by +clicking the {guilabel}`Go to Website` smart button. + +### Archive contacts + +If a user decides they no longer want to have this contact active, the record can be archived. To do +that, go to the {icon}`fa-cog` {guilabel}`Action` menu at the top of the contact form, and click +{guilabel}`Archive`. + +Then, click {guilabel}`OK` from the resulting {guilabel}`Confirmation` pop-up window. + +With this contact successfully archived, as indicated by a banner at the top, they do not show up +in the main contacts page, but they can still be searched for with the {guilabel}`Archived` filter. + +:::{tip} +A contact can be *unarchived*, if the user decides to work with them again. To do that, just +click the {icon}`fa-cog` {guilabel}`Action` menu again at the top of the archived contact form, +and click {guilabel}`Unarchive`. Upon doing so, the {guilabel}`Archived` banner is removed, and +the contact is restored. +::: + +:::{seealso} +- {doc}`Add different addresses in CRM <../sales/sales/send_quotations/different_addresses>` +- [Odoo's eLearning Contacts tutorial](https://www.odoo.com/slides/slide/contacts-2527?fullscreen=1) +::: + +```{toctree} +:titlesonly: true + +contacts/merge +``` + diff --git a/content/applications/essentials/contacts/merge.md b/content/applications/essentials/contacts/merge.md new file mode 100644 index 000000000..16182efbd --- /dev/null +++ b/content/applications/essentials/contacts/merge.md @@ -0,0 +1,80 @@ +# Merge contacts + +Odoo's *Contacts* application allows user's to merge duplicate contacts, without losing any +information in the process. This keeps the database organized, and prevents contacts from being +contacted by more than one salesperson. + +(contacts-merge-duplicate)= + +## Merge duplicate contacts + +:::{danger} +Merging is an irreversible action. Do **not** merge contacts unless absolutely certain they +should be combined. +::: + +Navigate to the {menuselection}`Contacts app`, and select the {icon}`oi-view-list` +{guilabel}`(list)` icon. Select two or more duplicate contacts from the list, and tick the checkbox +(on the far-left) for the contacts that should be merged. Then, click the {icon}`fa-cog` +{guilabel}`Actions` icon, and select {guilabel}`Merge` from the resulting drop-down menu. + +```{image} merge/merge-menu.png +:align: center +:alt: The merge contacts option in the Contacts application. +``` + +This opens the {guilabel}`Merge` pop-up window. From here, review the details of the contacts before +confirming they should be merged. If any contacts in the list should **not** be merged, click the +{icon}`fa-times` {guilabel}`(delete)` icon at the far right of the contact. + +:::{tip} +Click the individual contact to open the record for that contact, and view additional +information. +::: + +```{image} merge/merge-window.png +:align: center +:alt: The merge pop-up window in the Contacts application. +``` + +Click the {guilabel}`Destination Contact` field, and select an option from the drop-down list. This +field defaults to the contact record that was created first in the system. + +After confirming the information on the pop-up window, click {guilabel}`Merge Contacts`. + +## Deduplicate contacts + +After the merge is finished, a pop-up window appears confirming it is complete. This pop-up window +also contains a {guilabel}`Deduplicate the other Contacts` button. This feature searches for +duplicated records, based on selected criteria, and merges them automatically, or after manual +approval. + +Click the {guilabel}`Deduplicate the other Contacts` button to open the {guilabel}`Deduplicate +Contacts` pop-up window. + +Select one or more fields to be used in the search for duplicated records. Duplicated contacts can +be searched, based on the following criteria: + +- {guilabel}`Email` +- {guilabel}`Name` +- {guilabel}`Is Company` +- {guilabel}`VAT` +- {guilabel}`Parent Company` + +:::{note} +If more than one field is selected, only records that have **all** fields in common are suggested +as duplicates. +::: + +If necessary, select criteria to be used to exclude potential duplicates from the search. Potential +duplicates can be excluded from the search, based on the following criteria: + +- {guilabel}`A user associated to the contact` +- {guilabel}`Journal Items associated to the contact` + +After confirming the search criteria, click either {guilabel}`Merge with Manual Check`, +{guilabel}`Merge Automatically`, or {guilabel}`Merge Automatically all process`. + +If {guilabel}`Merge with Manual Check` is selected, complete the merge by following the {ref}`steps +above `. + diff --git a/content/applications/essentials/export_import_data.md b/content/applications/essentials/export_import_data.md new file mode 100644 index 000000000..dcef26bdf --- /dev/null +++ b/content/applications/essentials/export_import_data.md @@ -0,0 +1,554 @@ +--- +substitutions: + actions: '{icon}`fa-cog` {guilabel}`Actions`' + list: '{icon}`oi-view-list` {guilabel}`(list)` icon' +--- + +# Export and import data + +In Odoo, it is sometimes necessary to export or import data for running reports, or for data +modification. This document covers the export and import of data into and out of Odoo. + +:::{important} +Sometimes, users run into a 'time out' error, or a record does not process, due to its size. This +can occur with large exports, or in cases where the import file is too large. To circumvent this +limitation surrounding the size of the records, process exports or imports in smaller batches. +::: + +(export-data)= + +## Export data from Odoo + +When working with a database, it is sometimes necessary to export data in a distinct file. Doing so +can aid in reporting on activities, although, Odoo provides a precise and easy reporting tool with +each available application. + +With Odoo, the values can be exported from any field in any record. To do so, activate the list view +({{ list }}), on the items that need to be exported, then select the records that should be exported. To +select a record, tick the checkbox next to the corresponding record. Finally, click on {{ actions }}, +then {guilabel}`Export`. + +```{image} export_import_data/list-view-export.png +:alt: View of the different things to enable/click to export data. +``` + +When clicking on {guilabel}`Export`, an {guilabel}`Export Data` pop-over window appears, with +several options for the data to export: + +```{image} export_import_data/export-data-overview.png +:alt: Overview of options to consider when exporting data in Odoo. +``` + +1. With the {guilabel}`I want to update data (import-compatable export)` option ticked, the system + only shows the fields that can be imported. This is helpful in the case where the {ref}`existing + records need to be updated `. This works like a filter. Leaving the box + unticked, gives many more field options because it shows all the fields, not just the ones that + can be imported. +2. When exporting, there is the option to export in two formats: `.csv` and `.xls`. With `.csv`, + items are separated by a comma, while `.xls` holds information about all the worksheets in a + file, including both content and formatting. +3. These are the items that can be exported. Use the {guilabel}`> (right arrow)` icon to display + more sub-field options. Use the {guilabel}`Search` bar to find specific fields. To use the + {guilabel}`Search` option more efficiently, click on all the {guilabel}`> (right arrows)` to + display all fields. +4. The {guilabel}`+ (plus sign)` icon button is present to add fields to the {guilabel}`Fields to + export` list. +5. The {guilabel}`↕️ (up-down arrow)` to the left of the selected fields can be used to move the + fields up and down, to change the order in which they are displayed in the exported file. + Drag-and-drop using the {guilabel}`↕️ (up-down arrow)` icon. +6. The {guilabel}`🗑️ (trash can)` icon is used to remove fields. Click on the {guilabel}`🗑️ (trash + can)` icon to remove the field. +7. For recurring reports, it is helpful to save export presets. Select all the needed fields, and + click on the template drop-down menu. Once there, click on {guilabel}`New template`, and give a + unique name to the export just created. Click the {guilabel}`💾 (floppy drive)` icon to save the + configuration. The next time the same list needs to be exported, select the related template that + was previously saved from the drop-down menu. + +:::{tip} +It is helpful to know the field's external identifier. For example, {guilabel}`Related Company` +in the export user interface is equal to *parent_id* (external identifier). This is helpful +because then, the only data exported is what should be modified and re-imported. +::: + +(import-data)= + +## Import data into Odoo + +Importing data into Odoo is extremely helpful during implementation, or in times where data needs to +be {ref}`updated in bulk `. The following documentation covers how to import +data into an Odoo database. + +:::{warning} +Imports are permanent and **cannot** be undone. However, it is possible to use filters (`created +on` or `last modified`) to identify records changed or created by the import. +::: + +:::{tip} +Activating {ref}`developer mode ` changes the visible import settings in the left +menu. Doing so reveals an {menuselection}`Advanced` menu. Included in this advanced menu are two +options: {guilabel}`Track history during import` and {guilabel}`Allow matching with subfields`. + +```{image} export_import_data/advanced-import.png +:alt: Advanced import options when developer mode is activated. +``` + +If the model uses openchatter, the {guilabel}`Track history during import` option sets up +subscriptions and sends notifications during the import, but leads to a slower import. + +Should the {guilabel}`Allow matching with subfields` option be selected, then all subfields +within a field are used to match under the {guilabel}`Odoo Field` while importing. +::: + +(essentials-export-import-data-get-started)= + +### Get started + +Data can be imported on any Odoo business object using either Excel (`.xlsx`) or {abbr}`CSV +(Comma-separated Values)` (`.csv`) formats. This includes: contacts, products, bank statements, +journal entries, and orders. + +Open the view of the object to which the data should be imported/populated, click the {icon}`fa-cog` +({guilabel}`gear`) icon and select {guilabel}`Import records`. + +```{image} export_import_data/import-button.png +:alt: Action menu revealed with the import records option highlighted. +``` + +Click {icon}`fa-download`{guilabel}`Import Template for Customers` at the center of the page to +download a {ref}`template ` and populate it with +the company's own data. Such templates can be imported in one click since the data mapping is +already preconfigured. + +To upload the downloaded template or your own file, follow the next steps: + +1. Click {guilabel}`Upload Data File` and select the desired file. +2. Adjust the {guilabel}`Formatting` options as needed (for CSV files only). +3. Ensure all data in the {guilabel}`File Column` is correctly mapped to the appropriate + {guilabel}`Odoo Field` and free of errors. +4. (Optional) Click {guilabel}`Load Data File` to reload the same file or upload a different one. +5. Click {guilabel}`Test` to verify that the data is valid. +6. Click {guilabel}`Import`. + +:::{note} +The {guilabel}`Formatting` options do **not** appear when importing the proprietary Excel file +type (i.e., `.xls` or `.xlsx`). +::: + +(essentials-export-import-data-adapt-a-template)= + +### Adapt a template + +Import templates are provided in the import tool of the most common data to import (contacts, +products, bank statements, etc.). Open them with any spreadsheet software (*Microsoft Office*, +*OpenOffice*, *Google Drive*, etc.). + +Once the template is downloaded, proceed to follow these steps: + +- Add, remove, and sort columns to best fit the data structure. +- It is strongly advised to **not** remove the {guilabel}`External ID` (ID) column (see why in the + next section). +- Set a unique ID to every record by dragging down the ID sequencing in the {guilabel}`External ID` + (ID) column. + +```{image} export_import_data/dragdown.gif +:alt: An animation of the mouse dragging down the ID column, so each record has a unique +: ID. +``` + +:::{note} +When a new column is added, Odoo may not be able to map it automatically, if its label does not +fit any field within Odoo. However, new columns can be mapped manually when the import is tested. +Search the drop-down menu for the corresponding field. + +```{image} export_import_data/field_list.png +:alt: Drop-down menu expanded in the initial import screen on Odoo. +``` + +Then, use this field's label in the import file to ensure future imports are successful. +::: + +:::{tip} +Another useful way to find out the proper column names to import is to export a sample file +using the fields that should be imported. This way, if there is not a sample import template, +the names are accurate. +::: + +(essentials-external-id)= + +### Import from another application + +The {guilabel}`External ID` (ID) is a unique identifier for the line item. Feel free to use one +from previous software to facilitate the transition to Odoo. + +Setting an ID is not mandatory when importing, but it helps in many cases: + +- {ref}`Update imports `: import the same file several times without + creating duplicates. +- {ref}`Import relation fields `. + +To recreate relationships between different records, the unique identifier from the original +application should be used to map it to the {guilabel}`External ID` (ID) column in Odoo. + +When another record is imported that links to the first one, use **XXX/ID** (XXX/External ID) for +the original unique identifier. This record can also be found using its name. + +:::{warning} +It should be noted that conflicts occur if two (or more) records have the same *External ID*. +::: + +### Field missing to map column + +Odoo heuristically tries to find the type of field for each column inside the imported file, based +on the first ten lines of the files. + +For example, if there is a column only containing numbers, only the fields with the *integer* type +are presented as options. + +While this behavior might be beneficial in most cases, it is also possible that it could fail, or +the column may be mapped to a field that is not proposed by default. + +If this happens, check the {guilabel}`Show fields of relation fields (advanced) option`, then a +complete list of fields becomes available for each column. + +```{image} export_import_data/field_list.png +:alt: Searching for the field to match the tax column. +``` + +### Change data import format + +:::{note} +Odoo can automatically detect if a column is a date, and tries to guess the date format from a +set of most commonly used date formats. While this process can work for many date formats, some +date formats are not recognizable. This can cause confusion, due to day-month inversions; it is +difficult to guess which part of a date format is the day, and which part is the month, in a +date, such as `01-03-2016`. +::: + +When importing a {abbr}`CSV (Comma-separated Values)` file, Odoo provides {guilabel}`Formatting` +options. + +To view which date format Odoo has found from the file, check the {guilabel}`Date Format` that is +shown when clicking on options under the file selector. If this format is incorrect, change it to +the preferred format using *ISO 8601* to define the format. + +:::{important} +*ISO 8601* is an international standard, covering the worldwide exchange, along with the +communication of date and time-related data. For example, the date format should be `YYYY-MM-DD`. +So, in the case of July 24th 1981, it should be written as `1981-07-24`. +::: + +:::{tip} +When importing Excel files (`.xls`, `.xlsx`), consider using *date cells* to store dates. This +maintains locale date formats for display, regardless of how the date is formatted in Odoo. When +importing a {abbr}`CSV (Comma-separated Values)` file, use Odoo's {guilabel}`Formatting` section +to select the date format columns to import. +::: + +### Import numbers with currency signs + +Odoo fully supports numbers with parenthesis to represent negative signs, as well as numbers with +currency signs attached to them. Odoo also automatically detects which thousand/decimal separator is +used. If a currency symbol unknown to Odoo is used, it might not be recognized as a number, and the +import crashes. + +:::{note} +When importing a {abbr}`CSV (Comma-separated Values)` file, the {guilabel}`Formatting` menu +appears on the left-hand column. Under these options, the {guilabel}`Thousands Separator` can be +changed. +::: + +Examples of supported numbers (using 'thirty-two thousand' as the figure): + +- 32.000,00 +- 32000,00 +- 32,000.00 +- -32000.00 +- (32000.00) +- \$ 32.000,00 +- (32000.00 €) + +Example that will not work: + +- ABC 32.000,00 +- \$ (32.000,00) + +:::{important} +A {guilabel}`() (parenthesis)` around the number indicates that the number is a negative value. +The currency symbol **must** be placed within the parenthesis for Odoo to recognize it as a +negative currency value. +::: + +### Import preview table not displayed correctly + +By default, the import preview is set on commas as field separators, and quotation marks as text +delimiters. If the {abbr}`CSV (Comma-separated Values)` file does not have these settings, modify +the {guilabel}`Formatting` options (displayed under the {guilabel}`Import` {abbr}`CSV +(Comma-separated Values)` file bar after selecting the {abbr}`CSV (Comma-separated Values)` file). + +:::{important} +If the {abbr}`CSV (Comma-separated Values)` file has a tabulation as a separator, Odoo does +**not** detect the separations. The file format options need to be modified in the spreadsheet +application. See the following {ref}`Change CSV file format ` +section. +::: + +(export-import-data-change-csv)= + +### Change CSV file format in spreadsheet application + +When editing and saving {abbr}`CSV (Comma-separated Values)` files in spreadsheet applications, the +computer's regional settings are applied for the separator and delimiter. Odoo suggests using +*OpenOffice* or *LibreOffice*, as both applications allow modifications of all three options (from +*LibreOffice* application, go to {menuselection}`'Save As' dialog box --> Check the box 'Edit filter +settings' --> Save`). + +Microsoft Excel can modify the encoding when saving ({menuselection}`'Save As' dialog box --> +'Tools' drop-down menu --> Encoding tab`). + +### Difference between Database ID and External ID + +Some fields define a relationship with another object. For example, the country of a contact is a +link to a record of the 'Country' object. When such fields are imported, Odoo has to recreate links +between the different records. To help import such fields, Odoo provides three mechanisms. + +:::{important} +**Only one** mechanism should be used per field that is imported. +::: + +For example, to reference the country of a contact, Odoo proposes three different fields to import: + +- {guilabel}`Country`: the name or code of the country +- {guilabel}`Country/Database ID`: the unique Odoo ID for a record, defined by the ID PostgreSQL + column +- {guilabel}`Country/External ID`: the ID of this record referenced in another application (or the + `.XML` file that imported it) + +For the country of Belgium, for example, use one of these three ways to import: + +- {guilabel}`Country`: `Belgium` +- {guilabel}`Country/Database ID`: `21` +- {guilabel}`Country/External ID`: `base.be` + +According to the company's need, use one of these three ways to reference records in relations. Here +is an example when one or the other should be used, according to the need: + +- Use {guilabel}`Country`: this is the easiest way when data comes from {abbr}`CSV (Comma-separated + Values)` files that have been created manually. +- Use {guilabel}`Country/Database ID`: this should rarely be used. It is mostly used by developers + as the main advantage is to never have conflicts (there may be several records with the same name, + but they always have a unique Database ID) +- Use {guilabel}`Country/External ID`: use *External ID* when importing data from a third-party + application. + +When *External IDs* are used, import {abbr}`CSV (Comma-separated Values)` files with the +{guilabel}`External ID` (ID) column defining the *External ID* of each record that is imported. +Then, a reference can be made to that record with columns, like `Field/External ID`. The following +two {abbr}`CSV (Comma-separated Values)` files provide an example for products and their categories. + +- {download}`CSV file for categories + ` +- {download}`CSV file for Products + ` + +(export-import-data-relation-fields)= + +### Import relation fields + +An Odoo object is always related to many other objects (e.g. a product is linked to product +categories, attributes, vendors, etc.). To import those relations, the records of the related object +need to be imported first, from their own list menu. + +This can be achieved by using either the name of the related record, or its ID, depending on the +circumstances. The ID is expected when two records have the same name. In such a case add `/ ID` +at the end of the column title (e.g. for product attributes: `Product Attributes / Attribute / ID`). + +#### Options for multiple matches on fields + +If, for example, there are two product categories with the child name `Sellable` (e.g. `Misc. +Products/Sellable` & `Other Products/Sellable`), the validation is halted, but the data may still be +imported. However, Odoo recommends that the data is not imported because it will all be linked to +the first `Sellable` category found in the *Product Category* list (`Misc. Products/Sellable`). +Odoo, instead, recommends modifying one of the duplicate's values, or the product category +hierarchy. + +However, if the company does not wish to change the configuration of product categories, Odoo +recommends making use of the *External ID* for this field, 'Category'. + +#### Import many2many relationship fields + +The tags should be separated by a comma, without any spacing. For example, if a customer needs to be +linked to both tags: `Manufacturer` and `Retailer` then 'Manufacturer,Retailer' needs to be encoded +in the same column of the {abbr}`CSV (Comma-separated Values)` file. + +- {download}`CSV file for Manufacturer, Retailer ` + +#### Import one2many relationships + +If a company wants to import a sales order with several order lines, a specific row **must** be +reserved in the {abbr}`CSV (Comma-separated Values)` file for each order line. The first order line +is imported on the same row as the information relative to order. Any additional lines need an +additional row that does not have any information in the fields relative to the order. + +As an example, here is a {abbr}`CSV (Comma-separated Values)` file of some quotations that can be +imported, based on demo data: + +- {download}`File for some Quotations + ` + +The following {abbr}`CSV (Comma-separated Values)` file shows how to import purchase orders with +their respective purchase order lines: + +- {download}`Purchase orders with their respective purchase order lines + ` + +The following {abbr}`CSV (Comma-separated Values)` file shows how to import customers and their +respective contacts: + +- {download}`Customers and their respective contacts + ` + +### Import image files + +To import image files along with the {ref}`uploaded ` +CSV or Excel file, follow the next steps: + +1. Add the image file names to the relevant {guilabel}`Image` column in the data file. +2. {ref}`Upload the data file ` or reload it by + clicking {guilabel}`Load Data File`. +3. Click {guilabel}`Upload your files` under the {guilabel}`Files to import` section. +4. Select the relevant image files. The number of files selected appears next to the button. +5. Click {guilabel}`Test` to verify that all data is valid. +6. Click {guilabel}`Import`. During the import process, Odoo performs a file check to automatically + link the uploaded images to the imported data file. If there is no match, the data file is + imported without any image. + +:::{note} +- The {guilabel}`Files to import` section is enabled if your product template has an + {guilabel}`Image` column with all fields populated. +- The image file names in the data file must correspond to the uploaded image files. +- When importing a large number of images, you can specify the maximum batch size in megabytes + and set a delay to prevent the system from becoming overloaded. To do so, {doc}`enable the + developer mode <../general/developer_mode>` and fill in the {guilabel}`Max size per + batch` and the {guilabel}`Delay after each batch` fields in the {guilabel}`Files to import` + section. By default, the delay meets the RPC/API call limit defined in the [Odoo Cloud - + Acceptable Use Policy](https://www.odoo.com/acceptable-use). +::: + +### Import records several times + +If an imported file contains one of the columns: {guilabel}`External ID` or {guilabel}`Database ID`, +records that have already been imported are modified, instead of being created. This is extremely +useful as it allows users to import the same {abbr}`CSV (Comma-separated Values)` file several +times, while having made some changes in between two imports. + +Odoo takes care of creating or modifying each record, depending if it is new or not. + +This feature allows a company to use the *Import/Export tool* in Odoo to modify a batch of records +in a spreadsheet application. + +### Value not provided for a specific field + +If all fields are not set in the CSV file, Odoo assigns the default value for every non-defined +field. But, if fields are set with empty values in the {abbr}`CSV (Comma-separated Values)` file, +Odoo sets the empty value in the field, instead of assigning the default value. + +### Export/import different tables from an SQL application to Odoo + +If data needs to be imported from different tables, relations need to be recreated between records +belonging to different tables. For instance, if companies and people are imported, the link between +each person and the company they work for needs to be recreated. + +To manage relations between tables, use the `External ID` facilities of Odoo. The `External ID` of a +record is the unique identifier of this record in another application. The `External ID` must be +unique across all records of all objects. It is a good practice to prefix this `External ID` with +the name of the application or table. (like, 'company_1', 'person_1' - instead of '1') + +As an example, suppose there is an SQL database with two tables that are to be imported: companies +and people. Each person belongs to one company, so the link between a person and the company they +work for must be recreated. + +Test this example, with a {download}`sample of a PostgreSQL database +`. + +First, export all companies and their *External ID*. In PSQL, write the following command: + +```sh +> copy (select 'company_'||id as "External ID",company_name as "Name",'True' as "Is a Company" from companies) TO '/tmp/company.csv' with CSV HEADER; +``` + +This SQL command creates the following {abbr}`CSV (Comma-separated Values)` file: + +```text +External ID,Name,Is a Company +company_1,Bigees,True +company_2,Organi,True +company_3,Boum,True +``` + +To create the {abbr}`CSV (Comma-separated Values)` file for people linked to companies, use the +following SQL command in PSQL: + +```sh +> copy (select 'person_'||id as "External ID",person_name as "Name",'False' as "Is a Company",'company_'||company_id as "Related Company/External ID" from persons) TO '/tmp/person.csv' with CSV +``` + +It produces the following {abbr}`CSV (Comma-separated Values)` file: + +```text +External ID,Name,Is a Company,Related Company/External ID +person_1,Fabien,False,company_1 +person_2,Laurence,False,company_1 +person_3,Eric,False,company_2 +person_4,Ramsy,False,company_3 +``` + +In this file, Fabien and Laurence are working for the Bigees company (`company_1`), and Eric is +working for the Organi company. The relation between people and companies is done using the +*External ID* of the companies. The *External ID* is prefixed by the name of the table to avoid a +conflict of ID between people and companies (`person_1` and `company_1`, who shared the same ID 1 in +the original database). + +The two files produced are ready to be imported in Odoo without any modifications. After having +imported these two {abbr}`CSV (Comma-separated Values)` files, there are four contacts and three +companies (the first two contacts are linked to the first company). Keep in mind to first import +the companies, and then the people. + +(essentials-update-data)= + +## Update data in Odoo + +Existing data can be updated in bulk through a data import, as long as the {ref}`External ID +` remains consistent. + +### Prepare data export + +To update data through an import, first navigate to the data to be updated, and select the {{ list }} to +activate list view. On the far-left side of the list, tick the checkbox for any record to be +updated. Then, click {{ actions }}, and select {icon}`fa-upload` {guilabel}`Export` from the drop-down +menu. + +On the resulting {guilabel}`Export Data` pop-up window, tick the checkbox labeled, {guilabel}`I want +to update data (import-compatible export)`. This automatically includes the *External ID* in the +export. Additionally, it limits the {guilabel}`Fields to export` list to **only** include fields +that are able to be imported. + +:::{note} +The {guilabel}`External ID` field does **not** appear in the {guilabel}`Fields to export` list +unless it is manually added, but it is still included in the export. However, if the {guilabel}`I +want to update data (import-compatible export)` checkbox is ticked, it is included in the export. +::: + +Select the required fields to be included in the export using the {ref}`options ` on +the pop-up window, then click {guilabel}`Export`. + +### Import updated data + +After exporting, make any necessary changes to the data file. When the file is ready, it can be +{ref}`imported ` by following the same process as a normal data import. + +:::{danger} +When updating data, it is extremely important that the *External ID* remain consistent, as +this is how the system identifies a record. If an ID is altered, or removed, the system may add a +duplicate record, instead of updating the existing one. +::: + diff --git a/content/applications/essentials/in_app_purchase.md b/content/applications/essentials/in_app_purchase.md new file mode 100644 index 000000000..0574c99f2 --- /dev/null +++ b/content/applications/essentials/in_app_purchase.md @@ -0,0 +1,199 @@ +--- +substitutions: + IAP: '{abbr}`IAP (In-app purchases)`' +--- + +# In-app purchases (IAP) + +In-app purchases (IAP) are optional services that enhance Odoo databases. Each service provides its +own specific features and functionality. A full list of services is available on the [Odoo IAP +Catalog](https://iap.odoo.com/iap/all-in-app-services). + +```{image} in_app_purchase/iap.png +:align: center +:alt: The IAP catalog with various services available on IAP.Odoo.com. +``` + +```{eval-rst} +.. example:: + The :guilabel:`SMS` service sends text messages to contacts directly from the database, and the + :guilabel:`Documents Digitization` service digitizes scanned or PDF vendor bills, expenses, and + resumes with optical character recognition (OCR) and artificial intelligence (AI). +``` + +{{ IAP }} services do **not** need to be configured or set up before use. Odoo users can simply click on +the service in the app to activate it. However, each service requires its own prepaid credits, and +when they run out, users **must** {ref}`buy more ` in order to keep using it. + +:::{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. +::: + +(in-app-purchase-portal)= + +## IAP services + +{{ IAP }} services are provided by Odoo, as well as third-parties, and have a wide range of uses. + +The following {{ IAP }} services are offered by Odoo: + +- {guilabel}`Documents Digitization`: digitizes scanned or PDF vendor bills, expenses, and resumes + with OCR and AI. +- {guilabel}`Partner Autocomplete`: automatically populates contact records with corporate data. +- {guilabel}`SMS`: sends SMS text messages to contacts directly from the database. +- {guilabel}`Lead Generation`: generates leads based on a set of criteria, and converts web visitors + into quality leads and opportunities. +- {guilabel}`Snailmail`: sends customer invoices and follow-up reports by post, worldwide. +- {guilabel}`Signer identification with itsme®️`: ask document signatories in Odoo *Sign* to provide + their identity using the *itsme®* identity platform, which is available in Belgium and the + Netherlands. + +For more information on every service currently available (offered from developers other than Odoo), +visit the [Odoo IAP Catalog](https://iap.odoo.com/iap/all-in-app-services). + +### Use IAP services + +{{ IAP }} services are automatically integrated with Odoo, and do **not** require users to configure any +settings. To use a service, simply interact with it wherever it appears in the database. + +```{eval-rst} +.. example:: + The following flow focuses on the *SMS* |IAP| service being used from a contact's record. + + This can be done by clicking the :guilabel:`📱 SMS` icon within the database. + + .. image:: in_app_purchase/sms-icon.png + :align: center + :alt: The SMS icon on a typical contact information form located within an Odoo database. + + One way to utilize the *SMS* |IAP| service with Odoo is showcased in the following steps: + + First, navigate to the :menuselection:`Contacts application`, and click on a contact with a + mobile phone number entered in either the :guilabel:`Phone` or :guilabel:`Mobile` field of the + contact form. + + Next, find the :guilabel:`📱 SMS` icon that appears to the right of the :guilabel:`Phone` or + :guilabel:`Mobile` fields. Click the :guilabel:`📱 SMS` icon, and a :guilabel:`Send SMS Text + Message` pop-up window appears. + + Type a message in the :guilabel:`Message` field of the pop-up window. Then, click the + :guilabel:`Send SMS` button. Odoo then sends the message, via SMS, to the contact, and logs what + was sent in the *chatter* of the contact's form. + + Upon sending the SMS message, the prepaid credits for the *SMS* |IAP| service are automatically + deducted from the existing credits. If there are not enough credits to send the message, Odoo + prompts the user to purchase more. +``` + +:::{seealso} +For more information on how to use various {{ IAP }} services, and for more in-depth instructions +related to SMS functionality in Odoo, review the documentation below: + +- {doc}`Lead mining <../sales/crm/acquire_leads/lead_mining>` +- {doc}`Enrich your contacts base with Partner Autocomplete + <../sales/crm/optimize/partner_autocomplete>` +- {doc}`SMS Marketing <../marketing/sms_marketing>` +::: + +(in-app-purchase-credits)= + +## IAP credits + +Every time an {{ IAP }} service is used, the prepaid credits for that service are spent. Odoo prompts +the purchase of more credits when there are not enough credits left to continue using a service. +Email alerts can also be set up for when {ref}`credits are low `. + +Credits are purchased in *Packs* from the [Odoo IAP Catalog](https://iap.odoo.com/iap/all-in-app-services), and pricing is specific to each service. + +```{eval-rst} +.. example:: + The `SMS service `_ has four packs available, in + denominations of: + + - :guilabel:`Starter Pack`: 10 credits + - :guilabel:`Standard Pack`: 100 credits + - :guilabel:`Advanced Pack`: 500 credits + - :guilabel:`Expert Pack`: 1,000 credits + + .. image:: in_app_purchase/packs.png + :align: center + :alt: Four different packs of credits for the SMS IAP service. + + The number of credits consumed depends on the length of the SMS and the country of destination. + + For more information, refer to the :doc:`SMS Pricing and FAQ + <../marketing/sms_marketing/pricing_and_faq>` documentation. +``` + +(iap-buying-credits)= + +### Buy credits + +If there are not enough credits to perform a task, the database automatically prompts the purchase +of more credits. + +Users can check the current balance of credits for each service, and manually purchase more credits, +by navigating to the {menuselection}`Settings app --> Contacts section`, and beneath the +{guilabel}`Odoo IAP` setting, click {guilabel}`View My Services`. + +Doing so reveals an {guilabel}`IAP Service` page, listing the various {{ IAP }} services in the +database. From here, click an {{ IAP }} service to open its {guilabel}`Account Information` page, where +additional credits can be purchased. + +#### Manually buy credits + +To manually buy credits in Odoo, follow these steps: + +First, go to the {menuselection}`Settings application` and type `IAP` in the {guilabel}`Search...` +bar. Alternatively users can scroll down to the {guilabel}`Contacts` section. Under the +{guilabel}`Contacts` section, where it says {guilabel}`Odoo IAP`, click {guilabel}`View My +Services`. + +```{image} in_app_purchase/view-services.png +:align: center +:alt: The Settings app showing the Odoo IAP heading and View My Services button. +``` + +Doing so reveals an {guilabel}`IAP Account` page, listing the various {{ IAP }} services in the +database. From here, click an {{ IAP }} service to open its {guilabel}`Account Information` page, where +additional credits can be purchased. + +On the {guilabel}`Account Information` page, click the {guilabel}`Buy Credit` button. Doing so loads +a {guilabel}`Buy Credits for (IAP Account)` page in a new tab. From here, click {guilabel}`Buy` on +the desired pack of credits. Then, follow the prompts to enter payment details, and confirm the +order. + +```{image} in_app_purchase/buy-pack.png +:align: center +:alt: The SMS service page on IAP.Odoo.com with four packs of credits available for +: purchase. +``` + +Once the transaction is complete, the credits are available for use in the database. + +(in-app-purchase-low-credits)= + +#### Low-credit notification + +It is possible to be notified when credits are low, in order to avoid running out of credits, while +using an {{ IAP }} service. To do that, follow this process: + +Go to the {menuselection}`Settings application`, and type `IAP` in the {guilabel}`Search...` bar. +Under the {guilabel}`Contacts` section, where it says {guilabel}`Odoo IAP`, click {guilabel}`View My +Services`. + +The available {{ IAP }} accounts appear in a list view on the {guilabel}`IAP Account` page. From here, +click on the desired {{ IAP }} account to view that service's {guilabel}`Account Information` page. + +On the {guilabel}`Account Information` page, tick the {guilabel}`Warn Me` checkbox. Doing so reveals +two fields on the form: {guilabel}`Threshold` and {guilabel}`Warning Email`. + +In the {guilabel}`Threshold` field, enter an amount of credits Odoo should use as the +minimum threshold for this service. In the {guilabel}`Warning Email` field, enter the email address +that receives the notification. + +Odoo sends a low-credit alert to the {guilabel}`Warning Email` when the balance of credits falls +below the amount listed as the {guilabel}`Threshold`. + diff --git a/content/applications/essentials/keyboard_shortcuts.md b/content/applications/essentials/keyboard_shortcuts.md new file mode 100644 index 000000000..aed9d8011 --- /dev/null +++ b/content/applications/essentials/keyboard_shortcuts.md @@ -0,0 +1,91 @@ +# Keyboard shortcuts + +Users in Odoo can utilize several keyboard shortcuts to navigate through modules, execute actions, +and manage data. + +:::{tip} +Hold {kbd}`Ctrl` to view the keyboard shortcuts assigned to each element on the interface. + +```{image} keyboard_shortcuts/menu-shortcuts.png +:align: center +:alt: A selection of keyboard shortcuts in Odoo. +``` +::: + +:::{important} +Some keyboard shortcuts may not be available on different versions of Odoo or effective depending +on browsers, extensions, or other individual settings. +::: + +## Keyboard shortcuts by operating system + +Below is a list of some of the most commonly used keyboard shortcuts within Odoo, listed by +operating system. + +```{eval-rst} +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - Description + - Windows / Linux + - macOS + * - Previous breadcrumb + - :kbd:`Alt` + :kbd:`B` + - :kbd:`Ctrl` + :kbd:`B` + * - Create new record + - :kbd:`Alt` + :kbd:`C` + - :kbd:`Ctrl` + :kbd:`C` + * - Odoo Home Page + - :kbd:`Alt` + :kbd:`H` + - :kbd:`Ctrl` + :kbd:`H` + * - Discard changes + - :kbd:`Alt` + :kbd:`J` + - :kbd:`Ctrl` + :kbd:`J` + * - Save changes + - :kbd:`Alt` + :kbd:`S` + - :kbd:`Ctrl` + :kbd:`S` + * - Next page + - :kbd:`Alt` + :kbd:`N` + - :kbd:`Ctrl` + :kbd:`N` + * - Previous page + - :kbd:`Alt` + :kbd:`P` + - :kbd:`Ctrl` + :kbd:`P` + * - Search + - :kbd:`Alt` + :kbd:`Q` + - :kbd:`Ctrl` + :kbd:`Q` + * - Select menus + - :kbd:`Alt` + :kbd:`1-9` + - :kbd:`Ctrl` + :kbd:`1-9` + * - Create a new To-Do + - :kbd:`Alt` + :kbd:`Shift` + :kbd:`T` + - :kbd:`Ctrl` + :kbd:`Shift` + :kbd:`T` + * - Search a Knowledge article + - :kbd:`Alt` + :kbd:`F` + - :kbd:`Ctrl` + :kbd:`F` + * - Share a Knowledge article + - :kbd:`Alt` + :kbd:`Shift` + :kbd:`S` + - :kbd:`Ctrl` + :kbd:`Shift` + :kbd:`S` + * - Open command palette + - :kbd:`Ctrl` + :kbd:`K` + - :kbd:`Command` + :kbd:`K` +``` + +:::{tip} +After opening the command palette, search using the following keyboard shortcuts: + +- {kbd}`/`: search for menus, applications, and modules. +- {kbd}`@`: search for users. +- {kbd}`#`: search for **Discuss** channels. +- {kbd}`?`: search for **Knowledge** articles. + +Enter a name (or term) in the search bar, or use the arrow keys to scroll through the available +options. Then, click {kbd}`Ctrl` + {kbd}`Enter` to open the selected app, module, or menu in a +new tab. + +```{image} keyboard_shortcuts/command-palete.png +:align: center +:alt: The command palette in Odoo, with the menu search option selected. +``` +::: + diff --git a/content/applications/essentials/reporting.md b/content/applications/essentials/reporting.md new file mode 100644 index 000000000..ba31d0353 --- /dev/null +++ b/content/applications/essentials/reporting.md @@ -0,0 +1,197 @@ +# Reporting + +You can find several reports under the {guilabel}`Reporting` menu of most apps that let you analyze +and visualize the data of your records. + +(reporting-views)= + +## Selecting a view + +Depending on the report, Odoo can display the data in various ways. Sometimes, a unique view +fully tailored to the report is available, while several views are available for others. However, +two generic views are dedicated to reporting: the graph and pivot views. + +(reporting-views-graph)= + +### Graph view + +The {ref}`graph view ` is used to visualize your records' data, helping you +identify patterns and trends. The view is often found under the {guilabel}`Reporting` menu of apps +but can be found elsewhere. Click the **graph view button** located at the top right to access +it. + +```{image} reporting/graph-button.png +:alt: Selecting the graph view +``` + +(reporting-views-pivot)= + +### Pivot view + +The {ref}`pivot view ` is used to aggregate your records' data and break it +down for analysis. The view is often found under the {guilabel}`Reporting` menu of apps but can be +found elsewhere. Click the **pivot view button** located at the top right to access it. + +```{image} reporting/pivot-button.png +:alt: Selecting the pivot view +``` + +(reporting-choosing-measures)= + +## Choosing measures + +After selecting a view, you should ensure only the relevant records are {doc}`filtered `. +Next, you should choose what is measured. By default, a measure is always selected. If you wish to +edit it, click {guilabel}`Measures` and choose one or, only for pivots, multiple measures. + +:::{note} +When you select a measure, Odoo aggregates the values recorded on that field for the filtered +records. Only numerical fields ({ref}`integer `, +{ref}`decimal `, {ref}`monetary +`) can be measured. In addition, the {guilabel}`Count` +option is used to count the total number of filtered records. +::: + +After choosing what you want to measure, you can define how the data should be {ref}`grouped +` depending on the dimension you want to analyze. By default, the data is often +grouped by *Date > Month*, which is used to analyze the evolution of a measure over the months. + +:::{tip} +When you filter a single time period, the option to compare it against another one appears. + +```{image} reporting/comparison.png +:alt: Using the comparison option +``` +::: + +```{eval-rst} +.. example:: + + .. tabs:: + + .. tab:: Select measures + + Among other measures, you could add the :guilabel:`Margin` and :guilabel:`Count` measures + to the Sales Analysis report. By default, the :guilabel:`Untaxed Amount` measure is + selected. + + .. image:: reporting/measures.png + :alt: Selecting different measures on the Sales Analysis report + + .. tab:: Group measures + + You could group the measures by :guilabel:`Product Category` at the level of rows on the + previous Sales Analysis report example. + + .. image:: reporting/single-group.png + :alt: Adding a group on the Sales Analysis report +``` + +(reporting-using-pivot)= + +## Using the pivot view + +Grouping data is quintessential to the pivot view. It enables drilling down the data to gain deeper +insights. While you can use the {guilabel}`Group By` option to quickly add a group at the level of +rows, as shown in the example above, you can also click the plus button ({guilabel}`➕`) next to the +{guilabel}`Total` header at the level of rows *and* columns, and then select one of the +**preconfigured groups**. To remove one, click the minus button ({guilabel}`➖`). + +Once you have added a group, you can add new ones on the opposite axis or the newly created +subgroups. + +```{eval-rst} +.. example:: + You could further divide the measures on the previous Sales Analysis report example by the + :guilabel:`Salesperson` group at the level of columns and by the :guilabel:`Order Date > Month` + group on the :guilabel:`All / Saleable / Office Furniture` product category. + + .. image:: reporting/multiple-groups.png + :alt: Adding multiple groups on the Sales Analysis report +``` + +:::{tip} +- Switch the rows and columns' groups by clicking the flip axis button ({guilabel}`⇄`). +- Click on a measure's label to sort the values by ascending (⏶) or descending (⏷) order. +- Download a `.xlsx` version of the pivot by clicking the download button ({guilabel}`⭳`). +::: + +(reporting-using-graph)= + +## Using the graph view + +Three graphs are available: the bar, line, and pie charts. + +**Bar charts** are used to show the distribution or a comparison of several categories. They are +especially useful as they can deal with larger data sets. + +**Line charts** are useful to show changing time series and trends over time. + +**Pie charts** are used to show the distribution or a comparison of a small number of categories +when they form a meaningful whole. + +```{eval-rst} +.. tabs:: + + .. tab:: Bar chart + + .. image:: reporting/bar.png + :alt: Viewing the Sales Analysis report as a bar chart + + .. tab:: Line chart + + .. image:: reporting/line.png + :alt: Viewing the Sales Analysis report as a line chart + + .. tab:: Pie chart + + .. image:: reporting/pie.png + :alt: Viewing the Sales Analysis report as a pie chart +``` + +:::{tip} +For **bar** and **line** charts, you can use the stacked option when you have at least two +groups, which then appear on top of each other instead of next to each other. + +```{eval-rst} +.. tabs:: + + .. tab:: Stacked bar chart + + .. image:: reporting/stacked-bar.png + :alt: Stacked bar chart example + + .. tab:: Regular bar chart + + .. image:: reporting/non-stacked-bar.png + :alt: Non-stacked bar chart example + + .. tab:: Stacked line chart + + .. image:: reporting/stacked-line.png + :alt: Stacked line chart example + + .. tab:: Regular line chart + + .. image:: reporting/non-stacked-line.png + :alt: Non-stacked line chart example +``` + +For **line** charts, you can use the cumulative option to sum values, which is especially useful +to show the change in growth over a time period. + +```{eval-rst} +.. tabs:: + + .. tab:: Cumulative line chart + + .. image:: reporting/cumulative.png + :alt: Cumulative line chart example + + .. tab:: Regular line chart + + .. image:: reporting/non-cumulative.png + :alt: Regular line chart example +``` +::: + diff --git a/content/applications/essentials/search.md b/content/applications/essentials/search.md new file mode 100644 index 000000000..34a826a85 --- /dev/null +++ b/content/applications/essentials/search.md @@ -0,0 +1,297 @@ +# Search, filter, and group records + +Odoo allows for the searching, filtering, and grouping of records in a view to display only the most +relevant records. The search bar is located at the top of the view, start typing to {ref}`search for +values `, or click the {guilabel}`🔽 (down arrow)` icon to access the {ref}`Filter +`, {ref}`Group By `, and {ref}`Favorites ` drop-down +menus. + +(search-values)= + +## Search for values + +Use the search field to quickly look for specific values, and add them as a filter. Type the value +to search for, and select the desired option from the drop-down menu to apply the search filter. + +```{eval-rst} +.. example:: + Instead of adding a :ref:`custom filter ` to select records where + *Mitchell Admin* is the salesperson on the *Sales Analysis* report (:menuselection:`Sales app --> + Reporting --> Sales`), search for `Mitch`, and click the :guilabel:`⏵ (right arrow)` next to + :guilabel:`Search Salesperson for: Mitch`, and select :guilabel:`Mitchell Admin`. + + .. image:: search/search-values.png + :align: center + :alt: Searching for a specific value on the Sales Analysis report +``` + +:::{note} +Using the search field is equivalent to using the *contains* operator when adding a {ref}`custom +filter `. If a partial value is entered, and the desired field is directly +selected (without selecting the {guilabel}`⏵ (right arrow)`), *all* records containing the typed +characters for the selected field are included. +::: + +(search-filters)= + +## Filters + +Filters are used to select records that meet specific criteria. The default selection of records is +specific to each view, but can be modified by selecting one (or several) {ref}`preconfigured filters +`, or by adding a {ref}`custom filter `. + +(search-preconfigured-filters)= + +### Preconfigured filters + +Modify the default selection of records by clicking the {guilabel}`🔽 (down arrow)` icon from the +search bar, and selecting one (or several) *preconfigured filters* from the {guilabel}`Filters` +drop-down menu. + +```{eval-rst} +.. example:: + On the *Sales Analysis* report (:menuselection:`Sales app --> Reporting --> Sales`), only records + that are at the *sales order* stage, with an *order date* within the last 365 days, are selected + by default. + + To also include records at the *quotation* stage, select :guilabel:`Quotations` from the + :guilabel:`Filters`. + + Furthermore, to *only* include sales order and quotation records from a specific year, like + 2024, for example, first remove the existing `Order Date: Last 365 Days` filter, by clicking the + :guilabel:`❌ (remove)` icon, then select :menuselection:`Order Date --> 2024`. + + .. image:: search/preconfigured-filters.png + :align: center + :alt: Using preconfigured filters on the Sales Analysis report +``` + +:::{note} +The preconfigured {guilabel}`Filters` are grouped, and each group is separated by a horizontal +line. Selecting preconfigured filters from the same group allows records to match *any* of the +applied conditions. However, selecting filters from different groups requires records to match +*all* of the applied conditions. +::: + +(search-custom-filters)= + +### Custom filters + +If the {ref}`preconfigured filters ` are not specific enough, add a +custom filter. To do so, click the {guilabel}`🔽 (down arrow)` icon in the search bar, then select +{menuselection}`Filters --> Add Custom Filter`. + +The {guilabel}`Add Custom Filter` pop-up window displays the matching option, filter rule, and a +toggle to {guilabel}`Include archived` records. + +```{image} search/custom-filter.png +:align: center +:alt: The Add Custom Filter pop-up window. +``` + +The default matching configuration is to {guilabel}`Match any of the following rules`, indicating +that each filter rule is applied independently. To change the matching configuration to +{guilabel}`Match all of the following rules`, at least two filter rules must be added to the custom +filter. + +- {guilabel}`Match all 🔽 of the following rules`: **all** of the filter rules must be met. + Logically, this is an *AND* (`&`) operation. +- {guilabel}`Match any 🔽 of the following rules`: **any** of the filter rules can be met. + Logically, this is an *OR* (`|`) operation. + +By default, a single filter rule is added to the custom filter. The following describes the +structure of a filter rule: + +1. The first inline field is the *field name* to filter by. Some fields have refined parameters that + are nested within another field. These fields have an {guilabel}`> (arrow)` icon beside them, + which can be selected to reveal the nested fields. +2. The second inline field is the conditional *operator* used to compare the field name to the + value. The {ref}`available conditional operators ` are specific to the + field's data type. +3. The third inline field is the variable *value* of the field name. The value input may appear as a + drop-down menu, a text input, a number input, a date/time input, a boolean selector, or it may be + blank, depending on the operator used and the field's data type. + +Three inline buttons are also available to the right of the rule's filter criteria: + +1. {guilabel}`➕ (plus sign)`: adds a new rule below the existing rule. + +2. {guilabel}`(Add branch)`: adds a new group of rules below the existing rule, with the + {guilabel}`any` and {guilabel}`all` matching options available to define how each rule within + this branch is applied to the filter. If the matching option is set to the same as the parent + group, the fields are moved to join the parent group. + + ```{eval-rst} + .. example:: + If the matching option is set to :guilabel:`Match all 🔽 of the following rules`, and a new + branch is added with its matching option changed from :guilabel:`any 🔽 of` to :guilabel:`all + 🔽 of`, the newly-added branch disappears, and its group of rules are moved to the parent + group. + ``` + +3. {guilabel}`🗑️ (garbage can)`: deletes the node. If a branch node is deleted, all children of + that node are deleted, as well. + +A new filter rule can be added to the custom filter by clicking the {guilabel}`New Rule` button. + +Once the filter criteria are defined, click {guilabel}`Add` to add the custom filter to the view. + +```{eval-rst} +.. example:: + To target all leads and opportunities from the :menuselection:`CRM` app that are in the *Won* + stage, and have an expected revenue greater than $1,000, the following should be entered: + + :guilabel:`Match all 🔽 (down arrow) of the following rules:` + + #. :guilabel:`Stage` :guilabel:`is in` :guilabel:`Won` + #. :guilabel:`Expected Revenue` :guilabel:`>` `1,000` + #. :guilabel:`any 🔽 (down arrow)` :guilabel:`of:` + + - :guilabel:`Type` :guilabel:`=` :guilabel:`Lead` + - :guilabel:`Type` :guilabel:`=` :guilabel:`Opportunity` + + .. image:: search/custom-filter-example.png + :align: center + :alt: Adding a custom filter to filter specific records in CRM. +``` + +:::{tip} +Activate {ref}`developer-mode` to reveal each field's technical name and data type, as well as +the {guilabel}`# Code editor` text area below the filter rules, to view and edit the domain +manually. +::: + +(search-group)= + +## Group records + +The display of records in a view can be clustered together, according to one of the *preconfigured +groups*. To do so, click the {guilabel}`🔽 (down arrow)` icon in the search bar, then select one of +the {guilabel}`Group By` options from the drop-down menu. + +```{eval-rst} +.. example:: + To group the records by salesperson on the *Sales Analysis* report (:menuselection:`Sales app --> + Reporting --> Sales`), click the :guilabel:`Salesperson` option from the :guilabel:`Group By` + drop-down menu. The view changes to group the records by salesperson, without filtering out any + records. + + .. image:: search/group.png + :align: center + :alt: Grouping records on the Sales Analysis report +``` + +It is possible to *customize groups* by using a field present on the model. To do so, click +{menuselection}`Add Custom Group`, and select a field from the drop-down menu. + +:::{note} +Several groups can be used at the same time. The first group that is selected is the main +cluster, the next one that is added further divides the main group's categories, and so on. +Furthermore, filters and groups can be used together to refine the view even more. +::: + +(search-comparison)= + +## Comparison + +Certain reporting dashboards include a {guilabel}`Comparison` section in the drop-down menus of +their {guilabel}`Search...` bars. This includes the {doc}`Overall Equipment Effectiveness +<../inventory_and_mrp/manufacturing/reporting/oee>` report for the *Manufacturing* app, and the +{doc}`Purchase <../inventory_and_mrp/purchase/advanced/analyze>` report for the *Purchase* app, +among others. + +The options in the {icon}`fa-adjust` {guilabel}`Comparison` section are used to compare data from +two different time periods. There are two comparison options to choose from: {guilabel}`(Time +Filter): Previous Period` and {guilabel}`(Time Filter): Previous Year`. + +:::{important} +For some reports, the {guilabel}`Comparison` section **only** appears in the +{guilabel}`Search...` bar drop-down menu if one (or more) time periods have been selected in the +{guilabel}`Filters` column. This is because, if no time period is specified, there is nothing to +compare. + +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` +{guilabel}`(pivot)` view, is selected. A {guilabel}`Comparison` option can be selected even if +another view is enabled, but doing so does **not** change the way data is displayed on the +report. +::: + +```{image} search/comparison-section.png +:align: center +:alt: The Search... bar for the production analysis report. +``` + +To view data using one of the two comparisons, begin by selecting a time period in the +{guilabel}`Filters` column of the {guilabel}`Search...` bar drop-down menu. Then, select either +{guilabel}`(Time Filter): Previous Period` or {guilabel}`(Time Filter): Previous Year` in the +{guilabel}`Comparison` section. + +With one of the {guilabel}`Comparison` options enabled, the report compares the data for the +selected period, with the data for the same unit of time (month, quarter, year), one period or year +prior. The way the data is displayed depends on the selected view: + +- The {icon}`fa-bar-chart` {guilabel}`(bar chart)` shows two bars, side-by-side, for each unit of + time for the selected time period. The left bar represents the selected time period, while the + right bar represents the previous time period. +- The {icon}`fa-line-chart` {guilabel}`(line chart)` is displayed with two lines, one representing + the selected time period, and the other representing the previous time period. +- The {icon}`fa-pie-chart` {guilabel}`(pie chart)` appears as a large circle with a smaller circle + inside. The larger circle represents the selected time period, while the smaller circle represents + the previous time period. +- The {icon}`oi-view-pivot` {guilabel}`(pivot table)` is displayed with each column split into two + smaller columns. The right column represents the selected time period, while the left column + represents the previous time period. + +```{eval-rst} +.. example:: + In the :guilabel:`Production Analysis` report of the :menuselection:`Manufacturing` app, data for + the second quarter of 2024 is compared to data for the second quarter of 2023. :guilabel:`Q2` is + selected in the :guilabel:`End Date` filter section of the :guilabel:`Search...` bar drop-down + menu. In the :guilabel:`Comparison` section, :guilabel:`End Date: Previous Year` is selected. + + The current year is 2024, so the larger circle shows data for the second quarter (Q2) of 2024. + The smaller circle shows data for the second quarter (Q2) of 2023, which is the same time period, + but one *year* prior. + + If :guilabel:`End Date: Previous Period` is selected instead, the smaller circle shows data for + the first quarter (Q1) of 2024, which is the same time period, but one *period* prior. + + .. image:: search/comparison.png + :align: center + :alt: The comparison view of the Production Analysis report. +``` + +(search-favorites)= + +## Favorites + +Favorites are a way to save a specific search for future use, or as the new default filter for the +view. + +To save the current view as a favorite, click the {guilabel}`🔽 (down arrow)` icon in the search +bar, then select the {guilabel}`Save current search` drop-down menu to display the following +options: + +- 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. 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 +:align: center +:alt: Saving a favorite search on the Sales Analysis report +``` + +Saved favorites can be accessed by clicking the {guilabel}`🔽 (down arrow)` icon in the search bar, +then selecting the saved filter in the {guilabel}`Favorites` drop-down menu. To remove a saved +favorite, click the {guilabel}`🗑️ (garbage can)` icon next to the favorited search. + +:::{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. +::: + diff --git a/content/applications/finance.md b/content/applications/finance.md new file mode 100644 index 000000000..9fed96743 --- /dev/null +++ b/content/applications/finance.md @@ -0,0 +1,13 @@ +--- +nosearch: true +--- + +# Finance + +```{toctree} +finance/accounting +finance/expenses +finance/payment_providers +finance/fiscal_localizations +``` + diff --git a/content/applications/finance/accounting.md b/content/applications/finance/accounting.md new file mode 100644 index 000000000..375b5c793 --- /dev/null +++ b/content/applications/finance/accounting.md @@ -0,0 +1,253 @@ +--- +show-content: true +--- + +# 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. + +:::{seealso} +[Odoo Tutorials: Accounting](https://www.odoo.com/slides/accounting-19) +::: + +```{eval-rst} +.. cards:: + + .. card:: Get started + :target: accounting/get_started + :large: + + Basic concepts of accounting and initial setup of your accounting + + .. card:: Taxes + :target: accounting/taxes + + Taxes, fiscal positions, and integrations + + .. card:: Customer invoices + :target: accounting/customer_invoices + + Customer invoices, payment terms, and electronic invoicing + + .. card:: Vendor bills + :target: accounting/vendor_bills + + Vendor bills, assets, and invoice digitization (OCR) + + .. card:: Payments + :target: accounting/payments + + Invoices and bills payments (online, checks, batches) and follow-up on invoices + + .. card:: Bank and cash accounts + :target: accounting/bank + + Bank synchronization, reconciliation, and cash registers + + .. card:: Reporting + :target: accounting/reporting + + Reporting, declarations, and analytic accounting +``` + +## Double-entry bookkeeping + +Odoo automatically creates all the underlying journal entries for all accounting transactions (e.g., +customer invoices, vendor bills, point-of-sales orders, expenses, inventory valuations, etc.). + +Odoo uses the double-entry bookkeeping system, whereby every entry needs a corresponding and +opposite counterpart in a different account, with one account debited and the other credited. +It ensures that all transactions are recorded accurately and consistently and that the accounts +always balance. + +:::{seealso} +{doc}`Accounting Cheat Sheet ` +::: + +## Accrual and cash basis + +Both accrual and cash basis accounting are supported in Odoo. This allows reporting income and +expense either when the transaction occurs (accrual basis) or when the payment is made or received +(cash basis). + +:::{seealso} +{doc}`Cash basis ` +::: + +(accounting-multi-company)= + +## Multi-company + +Several companies can be managed within the same database. Each company has its {doc}`chart of +accounts `, which is also useful to generate consolidation +reports. Users can access several companies but can only work on a single company's accounting at a +time. + +## Multi-currency environment + +A {doc}`multi-currency ` environment with an automated +exchange rate to ease international transactions is available in Odoo. Every transaction is recorded +in the company's default currency; for transactions occurring in another currency, Odoo stores both +the value in the company's currency and the transactions' currency value. Odoo generates currency +gains and losses after reconciling the journal items. + +:::{seealso} +{doc}`Manage a bank in a foreign currency ` +::: + +## Branch management + +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. + +## International standards + +Odoo Accounting supports more than 70 countries. It provides the central standards and mechanisms +common to all nations, and thanks to country-specific modules, local requirements are fulfilled. +Fiscal positions exist to address regional specificities like the chart of accounts, taxes, or any +other requirements. + +:::{seealso} +{doc}`Fiscal localization packages ` +::: + +## Accounts receivable and payable + +By default, there is a single account for the account receivable entries and one for the account +payable entries. As transactions are linked to your **contacts**, you can run a report per customer, +vendor, or supplier. + +The **Partner Ledger** report displays the balance of your customers and suppliers. It is available +by going to {menuselection}`Accounting --> Reporting --> Partner Ledger`. + +## Reporting + +The following financial {doc}`reports ` are available and updated in +real-time: + +```{eval-rst} ++-----------------------------------------------+ +| Financial reports | ++============+==================================+ +| Statement | Balance sheet | +| +----------------------------------+ +| | Profit and loss | +| +----------------------------------+ +| | Cash flow statement | +| +----------------------------------+ +| | Tax report | +| +----------------------------------+ +| | ES sales list | ++------------+----------------------------------+ +| Audit | General ledger | +| +----------------------------------+ +| | Trial balance | +| +----------------------------------+ +| | Journal report | +| +----------------------------------+ +| | Intrastat report | +| +----------------------------------+ +| | Check register | ++------------+----------------------------------+ +| Partner | Partner ledger | +| +----------------------------------+ +| | Aged receivable | +| +----------------------------------+ +| | Aged payable | ++------------+----------------------------------+ +| Management | Invoice analysis | +| +----------------------------------+ +| | Unrealized currency gains/losses | +| +----------------------------------+ +| | Depreciation schedule | +| +----------------------------------+ +| | Disallowed expenses | +| +----------------------------------+ +| | Budget analysis | +| +----------------------------------+ +| | Product margins | +| +----------------------------------+ +| | 1099 report | ++------------+----------------------------------+ +``` + +:::{tip} +{doc}`Create and customize reports ` with Odoo's report engine. +::: + +### Tax report + +Odoo computes all accounting transactions for the specific tax period and uses these totals to +calculate the tax obligation. + +:::{important} +Once the tax report has been generated for a period, Odoo locks it and prevents the creation of +new journal entries involving VAT. Any correction to customer invoices or vendor bills has to +be recorded in the next period. +::: + +:::{note} +Depending on the country's localization, an XML version of the tax report can be generated to be +uploaded to the VAT platform of the relevant taxation authority. +::: + +## Bank synchronization + +The bank synchronization system directly connects with your bank institution to automatically +import all transactions into your database. It gives an overview of your cash flow without logging +into an online banking system or waiting for paper bank statements. + +:::{seealso} +{doc}`Bank synchronization ` +::: + +## Inventory valuation + +Both periodic (manual) and perpetual (automated) inventory valuations are supported in Odoo. The +available methods are standard price, average price, {abbr}`LIFO (Last-In, First-Out)` and +{abbr}`FIFO (First-In, First-Out).` + +:::{seealso} +{doc}`../inventory_and_mrp/inventory/product_management/inventory_valuation/inventory_valuation_config` +::: + +## Retained earnings + +Retained earnings are the portion of income retained by a business. Odoo calculates current year +earnings in real-time, so no year-end journal or rollover is required. The profit +and loss balance is automatically reported on the balance sheet report. + +:::{seealso} +{doc}`Accounting Cheat Sheet ` +::: + +(fiduciaries)= + +## Fiduciaries + +The {guilabel}`Accounting Firms` mode can be activated by going to {menuselection}`Accounting --> +Configuration --> Settings --> Accounting Firms mode`. When enabled: + +- The document's sequence becomes editable on all documents; +- The {guilabel}`Total (tax incl.)` field appears to speed up and control the encoding by automating + line creation with the right account and tax; +- {guilabel}`Invoice Date` and {guilabel}`Bill Date` are pre-filled when encoding a transaction. +- A {guilabel}`Quick encoding` option is available for customer invoices and vendor bills. + +```{toctree} +:titlesonly: true + +accounting/get_started +accounting/taxes +accounting/customer_invoices +accounting/vendor_bills +accounting/payments +accounting/bank +accounting/reporting +``` + diff --git a/content/applications/finance/accounting/bank.md b/content/applications/finance/accounting/bank.md new file mode 100644 index 000000000..4ee9141ee --- /dev/null +++ b/content/applications/finance/accounting/bank.md @@ -0,0 +1,205 @@ +--- +show-content: true +--- + +# Bank and cash accounts + +You can manage as many bank or cash accounts as needed on your database. Configuring them correctly +allows you to have all your banking data up-to-date and ready for {doc}`reconciliation +` with your journal entries. + +In Odoo Accounting, each bank account has a dedicated journal set to post all entries in a dedicated +account. Both the journal and the account are automatically created and configured whenever you add +a bank account. + +:::{note} +Cash journals and accounts must be configured manually. +::: + +Bank journals are displayed by default on the {guilabel}`Accounting Dashboard` in the form of cards +which include action buttons. + +```{image} bank/card.png +:alt: Bank journals are displayed on the Accounting Dashboard and contain action buttons +``` + +(accounting-bank-manage)= + +## 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. + +:::{seealso} +{doc}`bank/bank_synchronization` +::: + +(accounting-bank-create)= + +### 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`. + +:::{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](https://www.youtube.com/watch?v=tVhhXw-VnGE) +::: + +(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. +::: + +```{toctree} +:titlesonly: true + +bank/bank_synchronization +bank/transactions +bank/reconciliation +bank/reconciliation_models +bank/internal_transfers +bank/foreign_currency +bank/loans +``` + diff --git a/content/applications/finance/accounting/bank/bank_synchronization.md b/content/applications/finance/accounting/bank/bank_synchronization.md new file mode 100644 index 000000000..23d96483f --- /dev/null +++ b/content/applications/finance/accounting/bank/bank_synchronization.md @@ -0,0 +1,201 @@ +--- +show-content: true +--- + +# Bank synchronization + +Odoo can synchronize directly with your bank institution to get all bank statements imported +automatically into your database. + +To check if your bank is compatible with Odoo, go to [Odoo Accounting Features](https://www.odoo.com/page/accounting-features), and click on +{guilabel}`See list of supported institutions`. + +Odoo supports more than 26,000 institutions around the world. + +To connect to the banks, Odoo uses multiple web-services: + +- **Plaid**: United States of America and Canada +- **Yodlee**: Worldwide +- {doc}`Salt Edge `: Worldwide +- {doc}`Ponto `: Europe +- {doc}`Enable Banking `: Scandinavian countries + +:::{seealso} +{doc}`transactions` +::: + +## Configuration + +### On-Premise users + +To be able to use this service, you need to have a valid Odoo Enterprise subscription. +So make sure that your database is registered with your Odoo Enterprise contract. +We also use a proxy between your database and the third party provider so, in case of +a connection error, please check that you don't have a firewall or a proxy blocking the +following address: + +- + +### First synchronization + +You can start synchronization either by going to the Accounting app and +{menuselection}`Accounting --> Configuration --> Add a Bank Account`. + +Now you can search for your bank institution. Select it and follow the steps to synchronize with it. + +:::{note} +If you have any issues during your first synchronization, please verify that your +web browser doesn't block pop-ups and that your ad-blocker is disabled. +::: + +:::{important} +When setting up the bank statement synchronization, Odoo automatically starts recording the +accounting transactions from the last transaction’s date +1 day (if the last transaction day is +31/12/2022, the recording starts on 01/01/2023). If the journal contains no transaction, Odoo +retrieves transactions as far back as possible. You can limit how far back Odoo retrieves +transactions by opening the Accounting app, going to {menuselection}`Accounting --> Lock Dates`, +and setting a date in the {guilabel}`Journal Entries Lock Date` field. +::: + +You must provide a phone number during your first synchronization to secure your account. We ask for +such information because we don't want your data falling into the wrong hands. Therefore, if we +detect suspicious activities on your account, we block all requests coming from your account, and +you need to reactivate it using that phone number. + +The third-party provider may request more information in order to connect with your bank +institution. This information is not stored on Odoo's servers. + +By default, transactions fetched from an online source are grouped inside the same statement, and +one bank statement is created per month. You can change the bank statement creation periodicity +in your journal settings. + +To view all your synchronizations, activate the {ref}`developer mode ` and go to +{menuselection}`Accounting --> Configuration --> Online Synchronization`. + +### Synchronize manually + +After your first synchronization, the created journals are synchronized by default every 12 hours. +If you wish, you can synchronize them manually by clicking on the {guilabel}`Synchronize Now` button +on the dashboard. + +Alternatively, activate the {ref}`developer mode `, go to +{menuselection}`Accounting --> Configuration --> Online Synchronization`, select your institution, +and then click the {guilabel}`Fetch transactions` button. + +:::{important} +Some institutions do not allow transactions to be fetched automatically. For such institutions, +during the automatic synchronization of the account, you receive an error message asking you to +disable the automatic synchronization. This message can be found in the chatter of your online +synchronizations. In this case, make sure to perform manual synchronizations. +::: + +## Issues + +### Synchronization in error + +To report a connection error to the [Odoo support](https://www.odoo.com/help), activate the +{ref}`developer mode `, go to {menuselection}`Accounting --> Configuration --> +Online Synchronization`, select the connection that failed, and copy the error description and the +reference. + +### Synchronization disconnected + +If your connection with the proxy is disconnected, you can reconnect with the proxy using the +{guilabel}`Fetch Account` button. + +:::{note} +If you are unable to reconnect using the {guilabel}`Reconnect` button, please contact the +[support](https://www.odoo.com/help) directly with your client id or the reference of the error +listed in the chatter. +::: + +(migrationonlinesync)= + +## Migration process for users having installed Odoo before December 2020 + +If you are on-premise, please first make sure that your source is up-to-date with the latest version +of Odoo. + +Users who have created a database before December 2020 need to install the new module manually to +use the new functionalities. + +To do so, go to {menuselection}`Apps --> Update Apps List`, remove the default filter in the search +bar and type `account_online_synchronization`. You can then click on {guilabel}`Install`. +Finally, make sure all your users refresh their Odoo page by pressing CTRL+F5. + +:::{Note} +- 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 + 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. +- By default, the `account_online_synchronization` module is installed automatically with + Accounting. +::: + +## FAQ + +### The synchronization is not working in real-time. Is that normal? + +The process is not intended to work in real-time as third party providers synchronize your accounts +at different intervals. To force the synchronization and fetch the statements, go to your +{guilabel}`Accounting Dashboard`, and click on the {guilabel}`Synchronize Now` button. Synchronize +and fetch transactions by activating the {ref}`developer mode ` and going to +{menuselection}`Accounting --> Configuration --> Online Synchronization`. Some providers only allow +one refresh per day, so it is possible that clicking on {guilabel}`Synchronize Now` does not get +your latest transactions if you already performed such action earlier in the day. + +A transaction can be visible on your bank account but not be fetched if it has the status +{guilabel}`Pending`. Only transactions with the {guilabel}`Posted` status will be retrieved. If the +transaction is not **Posted** yet, you will have to wait until the status changes. + +### Is the Online Bank Synchronization feature included in my contract? + +- **Community Edition**: No, this feature is not included in the Community Version. +- **Online Edition**: Yes, even if you benefit from the One App Free contract. +- **Enterprise Edition**: Yes, if you have a valid enterprise contract linked to your database. + +### Some banks have a status "Beta." What does this mean? + +This means that banking institutions are not yet fully supported by our Third Party Provider. Bugs +or other problems may arise. Odoo does not support technical problems that occur with banks in the +Beta phase, but the user may still choose to connect. Connecting with these banks contributes to the +development process since the Provider will have real data and feedback from the connection. + +### Why do my transactions only synchronize when I refresh manually? + +Some banks have additional security measures and require extra steps, such as an SMS/email +authentication code or another type of MFA. Because of this, the integrator cannot pull transactions +until the security code is provided. + +### Not all of my past transactions are in Odoo, why? + +For some institutions, transactions can only be fetched up to 3 months in the past. + +### Why don't I see any transactions? + +During your first synchronization, you selected the bank accounts you decided to synchronize with +Odoo. If you didn't synchronize any of your accounts, activate the {ref}`developer mode +`, go to {menuselection}`Accounting --> Configuration --> Online Synchronization`, +and click the {guilabel}`Fetch Account` button on the connection. + +There may also be no new transactions. + +If your bank account is properly linked to a journal and posted transactions are not visible in your +database, please [submit a support ticket](https://www.odoo.com/help). + +### How can I update my bank credentials? + +To update your credentials, activate the {ref}`developer mode ` and go to +{menuselection}`Accounting --> Configuration --> Online Synchronization`. Open the connection you +want to update your credentials and click the {guilabel}`Update Credentials` button. + +```{toctree} +:titlesonly: true + +bank_synchronization/saltedge +bank_synchronization/ponto +bank_synchronization/enablebanking +``` + diff --git a/content/applications/finance/accounting/bank/bank_synchronization/enablebanking.md b/content/applications/finance/accounting/bank/bank_synchronization/enablebanking.md new file mode 100644 index 000000000..f945dd234 --- /dev/null +++ b/content/applications/finance/accounting/bank/bank_synchronization/enablebanking.md @@ -0,0 +1,36 @@ +# Enable Banking + +**Enable Banking** is a third-party provider aggregating banking information from bank accounts all +in one place. It offers non-intrusive connectivity to ASPSPs' official APIs across Europe without +storing data. + +```{image} enablebanking/enablebanking.png +:alt: Enable Banking logo +``` + +**Odoo** synchronizes directly with banks to get access to all bank transactions and automatically +import them into your database. + +:::{seealso} +- {doc}`../bank_synchronization` +- [Enable Banking website](https://enablebanking.com/) +::: + +## Configuration + +### Link bank accounts with Odoo + +1. Start synchronization by clicking on {menuselection}`Accounting --> Configuration --> + Add a Bank Account`; + +2. Select your bank; + +3. Make sure you give your consent to share your account information with Odoo by clicking + {guilabel}`Continue authentication`; + + ```{image} enablebanking/enablebankingauth.png + :alt: Enable Banking authentication page + ``` + +4. Finally, you are redirected to your bank's login page. + diff --git a/content/applications/finance/accounting/bank/bank_synchronization/ponto.md b/content/applications/finance/accounting/bank/bank_synchronization/ponto.md new file mode 100644 index 000000000..6124c528b --- /dev/null +++ b/content/applications/finance/accounting/bank/bank_synchronization/ponto.md @@ -0,0 +1,112 @@ +# Ponto + +**Ponto** is a service that allows companies and professionals to aggregate their accounts in one +place and directly see all their transactions within one app. It is a third-party solution that is +continuously expanding the number of bank institutions that can be synchronized with Odoo. + +**Odoo** can synchronize directly with your bank to get all bank statements imported automatically +into your database. + +Ponto is a paid third-party provider that can handle the synchronization between your bank accounts +and Odoo. + +:::{seealso} +- {doc}`../bank_synchronization` +- {doc}`../transactions` +::: + +## Configuration + +### Link your bank accounts with Ponto + +1. Go to [Ponto's website (https://myponto.com)](https://myponto.com). + +2. Create an account if you don't have one yet. + +3. Once you are logged in, create an *organization*. + + ```{image} ponto/ponto-organization.png + :alt: Fill out the form to add an organization in Ponto. + ``` + +4. Go to {menuselection}`Accounts --> Live`, and click {guilabel}`Add account`. You might have to + add your **Billing Information** first. + +5. Select your country, your bank institutions, give your consent to Ponto, and follow the steps + on-screen to link your bank account with your Ponto account. + + ```{image} ponto/ponto-add-account.png + :alt: Add bank accounts to your Ponto account. + ``` + +6. Add all bank accounts you want to synchronize with your Odoo database and move to the next steps. + +### Link your Ponto account with your Odoo database + +1. Go to {menuselection}`Accounting --> Configuration --> Add a Bank Account`. + +2. Search for your institution and select it so you can verify that the third party provider is + Ponto. + +3. Click {guilabel}`Connect` and follow the steps. + +4. Select **all accounts** you want to access and synchronize in Odoo, even the ones coming from + other banking institutions. + + ```{image} ponto/ponto-select-accounts.png + :alt: Selection of the accounts you wish to synchronize with Odoo. + ``` + +5. Finish the flow. + +:::{note} +You have to authorize all the accounts you want to access in Odoo, but Odoo will filter the +accounts based on the institution you selected in the second step. +::: + +### Update your synchronization credentials + +To update your Ponto credentials or modify the synchronization settings, activate the +{ref}`developer mode `, go to {menuselection}`Accounting --> Configuration --> +Online Synchronization`, and select the institution from which you want to fetch the other +accounts. Click {guilabel}`Fetch Accounts` to start the flow. + +:::{note} +During the update, select **all accounts** you want to synchronize, even the ones coming from +other banking institutions. +::: + +### Fetch new accounts + +To add new online accounts to your connection, activate the {ref}`developer mode `, +go to {menuselection}`Accounting --> Configuration --> Online Synchronization`, and select the +institution from which you want to fetch the other accounts. Click {guilabel}`Fetch Accounts` to +start the flow. + +:::{note} +Don't forget to keep authorization for existing accounts (for all institutions that you have +synchronized with Ponto). +::: + +## FAQ + +### After my synchronization, no account appears + +You selected an institution from the list and did not authorize any accounts from this institution. + +### I have an error about that my authorization has expired + +Every **6 months** (180 days) you must re-authorize the connection between your bank account +and Ponto. This must be done from the [Ponto website](https://myponto.com). If you do not +do this, the synchronization will stop for these accounts. + +### I have some errors with my beta institution + +Ponto provides institutions in *beta*, these institutions are not directly supported by Odoo +and we advise you to contact Ponto directly. + +:::{important} +Using an institution in beta is beneficial for Ponto, it allows them to have real +feedback on the connection with the institution. +::: + diff --git a/content/applications/finance/accounting/bank/bank_synchronization/saltedge.md b/content/applications/finance/accounting/bank/bank_synchronization/saltedge.md new file mode 100644 index 000000000..b7358dd39 --- /dev/null +++ b/content/applications/finance/accounting/bank/bank_synchronization/saltedge.md @@ -0,0 +1,97 @@ +# Salt Edge + +**Salt Edge** is a third-party provider that aggregates banking information +from your bank accounts. It supports ~5000 institutions in more than 50 +countries. + +Odoo can synchronize directly with your bank to get all bank statements imported +automatically into your database. + +:::{seealso} +- {doc}`../bank_synchronization` +- {doc}`../transactions` +::: + +## Configuration + +### Link your bank accounts with Odoo + +1. Start synchronization by clicking on {menuselection}`Accounting --> Configuration + --> Add a Bank Account`. + +2. Select the institution you want to synchronize. You can see if Salt Edge is the + third party provider of the institution by selecting it. + +3. After giving your phone number, you are asked for an email address. This email + address is used to create your Salt Edge account. Please make sure you enter a + valid email address, as otherwise, you will not be able to access your Salt Edge + account. + + ```{image} saltedge/saltedge-contact-email.png + :alt: Email address to provide to Salt Edge for the creation of your account. + ``` + +4. After entering your email address, you are redirected to Salt Edge to continue + the synchronization process. + + ```{image} saltedge/saltedge-login-page.png + :alt: Salt Edge Login page. + ``` + +5. Make sure you give your consent by checking the consent checkbox. + + ```{image} saltedge/saltedge-give-consent.png + :alt: Salt Edge give consent page. + ``` + +6. Complete the synchronization by following the steps. + +### Update your credentials + +To update your Salt Edge credentials or modify the synchronization settings, activate the +{ref}`developer mode `, go to {menuselection}`Accounting --> Configuration --> +Online Synchronization`, and select the institution you want to update credentials. Click +{guilabel}`Update Credentials` to start the flow and follow the steps. + +Don't forget to check the consent checkbox. Otherwise, Odoo may not be able to access +your information. + +### Fetch new accounts + +To add new online accounts to your connection, activate the {ref}`developer mode `, +go to {menuselection}`Accounting --> Configuration --> Online Synchronization`, and select the +institution to fetch the new accounts. Click {guilabel}`Fetch Accounts` to start the flow and +follow the steps. + +:::{note} +Don't forget to check the consent checkbox. Otherwise, Odoo may not be able to access your +information. +::: + +## FAQ + +### I have an error when I try to delete my synchronization within Odoo + +Odoo can't permanently delete the connection you have created with the banking institution. However, +it can revoke the consent you gave so that Odoo won't be able to access your account anymore. The +error you are seeing is probably a message telling you that the consent was revoked, but the record +could not be deleted as it still exists within Salt edge. If you want to remove the connection +completely, please connect to your [Salt Edge account](https://www.saltedge.com/dashboard) +and manually delete your synchronization. Once this is done, you can go back to Odoo to delete the +record. + +### I have an error saying that I have already synchronized this account + +You have probably already synchronized your bank account with Salt Edge, please check on your +[dashboard](https://www.saltedge.com/dashboard) that you don't already have a connection with the +same credentials. + +If you already have a synchronization with the same credentials present on your Salt Edge +dashboard and this synchronization has not been created with Odoo, delete it and create it from your +Odoo database. + +If you already have a connection with the same credentials present on your Salt Edge dashboard +and this synchronization was created with Odoo, activate the {ref}`developer +mode `, go to {menuselection}`Accounting --> Configuration --> Online +Synchronization`, and click {guilabel}`Update Credentials` to reactivate the connection. + diff --git a/content/applications/finance/accounting/bank/foreign_currency.md b/content/applications/finance/accounting/bank/foreign_currency.md new file mode 100644 index 000000000..eb878ab45 --- /dev/null +++ b/content/applications/finance/accounting/bank/foreign_currency.md @@ -0,0 +1,117 @@ +# Manage a bank account in a foreign currency + +In Odoo, every transaction is recorded in the default currency of the company, and reports are all +based on that default currency. When you have a bank account in a foreign currency, for every +transaction, Odoo stores two values: + +- The debit/credit in the currency of the *company*; +- The debit/credit in the currency of the *bank account*. + +Currency rates are updated automatically using the web services of a banking institution. By +default, Odoo uses the European Central Bank's web services but other options are available. + +## Configuration + +### Activate multi-currencies + +To work with multiple currencies, go to {menuselection}`Accounting --> Configuration --> Settings +--> Currencies` and tick {guilabel}`Multi-Currencies`. Under {guilabel}`Post Exchange difference +entries in:`, provide a {guilabel}`Journal`, a {guilabel}`Gain Account`, a {guilabel}`Loss Account`, +and then click on {guilabel}`Save`. + +### Configure currencies + +Once Odoo is configured to support multiple currencies, they are all created by default, but not +necessarily active. To activate the new currencies, click on {guilabel}`Activate Other Currencies` +under the {guilabel}`Multi-Currencies` setting or go to {menuselection}`Accounting --> Configuration +--> Accounting: Currencies`. + +When the currencies are activated, you can choose to **automate** the currency rate update, or leave +it on **manual**. To configure the rate update, go back to {menuselection}`Accounting --> +Configuration --> Settings --> Currencies`, check {guilabel}`Automatic Currency Rates`, set +{guilabel}`Interval` to your desired frequency, and then click on {guilabel}`Save`. You also have +the option to choose the {guilabel}`Service` you wish to obtain currency rates from. + +Click on the Update now button ({guilabel}`🗘`) besides the {guilabel}`Next Run` field to update +the currency rates manually. + +### Create a new bank account + +In the accounting application, go to {menuselection}`Accounting --> Configuration --> Journals` and +create a new one. Enter a {guilabel}`Journal Name` and set the {guilabel}`Type` to `Bank`. In the +{guilabel}`Journal Entries` tab, enter a **short code**, a **currency**, and then finally click on +the {guilabel}`Bank Account` field to create a new account. In the pop-up window of the account +creation, enter a name, a code (ex.: 550007), set its type to `Bank and Cash`, set a currency type, +and save. When you are back on the **journal**, click on the {guilabel}`Account Number` field, and +in the pop-up window, fill out the {guilabel}`Account Number`, {guilabel}`Bank` of your account, and +save. + +```{image} foreign_currency/foreign-journal.png +:align: center +:alt: Example of a created bank journal. +``` + +Upon creation of the journal, Odoo automatically links the bank account to the journal. It can be +found under {menuselection}`Accounting --> Configuration --> Accounting: Chart of Accounts`. + +## Vendor bill in a foreign currency + +To pay a bill in a foreign currency, simply select the currency next to the {guilabel}`Journal` +field and register the payment. Odoo automatically creates and posts the foreign **exchange gain or +loss** as a new journal entry. + +```{image} foreign_currency/foreign-bill-currency.png +:align: center +:alt: How to set a bill currency. +``` + +:::{note} +Note that you can pay a foreign bill with another currency. In that case, Odoo automatically +converts between the two currencies. +::: + +## Unrealized Currency Gains/Losses Report + +This report gives an overview of all unrealized amounts in a foreign currency on your balance sheet, +and allows you to adjust an entry or manually set an exchange rate. To access this report, go to +{menuselection}`Reporting --> Management: Unrealized Currency Gains/Losses`. From here, you have +access to all open entries in your **balance sheet**. + +```{image} foreign_currency/foreign-gains-losses.png +:align: center +:alt: View of the Unrealized Gains/Losses journal. +``` + +If you wish to use a different currency rate than the one set in {menuselection}`Accounting --> +Configuration --> Settings --> Currencies`, click the {guilabel}`Exchange Rates` button and change +the rate of the foreign currencies in the report. + +```{image} foreign_currency/foreign-exchange-rates.png +:align: center +:alt: Menu to manually change exchange rates. +``` + +When manually changing **exchange rates**, a yellow banner appears allowing you to reset back to +Odoo's rate. To do so, simply click on {guilabel}`Reset to Odoo's Rate`. + +```{image} foreign_currency/foreign-reset-rates.png +:align: center +:alt: Banner to reset back to Odoo's rates. +``` + +In order to update your **balance sheet** with the amount of the {guilabel}`adjustment` column, +click on the {guilabel}`Adjustment Entry` button. In the pop-up window, select a +{guilabel}`Journal`, {guilabel}`Expense Account` and {guilabel}`Income Account` to calculate and +process the **unrealized gains and losses**. + +You can set the date of the report in the {guilabel}`Date` field. Odoo automatically reverses the +booking entry to the date set in {guilabel}`Reversal Date`. + +Once posted, the {guilabel}`adjustment` column should indicate `0.00`, meaning all **unrealized +gains/losses** have been adjusted. + +```{image} foreign_currency/foreign-adjustment.png +:align: center +:alt: Unrealized Currency Gains/Losses report once adjusted. +``` + diff --git a/content/applications/finance/accounting/bank/internal_transfers.md b/content/applications/finance/accounting/bank/internal_transfers.md new file mode 100644 index 000000000..f46c89325 --- /dev/null +++ b/content/applications/finance/accounting/bank/internal_transfers.md @@ -0,0 +1,73 @@ +# Internal transfers + +Internal money transfers can be handled in Odoo. At least two bank or cash accounts are needed to +make internal transfers. + +:::{seealso} +{ref}`How to add an additional bank account ` +::: + +## Configuration + +An internal transfer account is automatically created on your database based on your company's +{doc}`localization <../../fiscal_localizations>` and depending on your country’s legislation. To +modify the default {guilabel}`Internal Transfer` account, go to {menuselection}`Accounting --> +Configuration --> Settings` and scroll down to the {guilabel}`Default Accounts` section. + +## Register an internal transfer from one bank to another + +When money is transferred from one bank or cash account to another, that amount appears as two +transactions on the corresponding journals, whether the transactions are created manually, via +import, or via {doc}`bank synchronization `. When reconciling the transaction, +select the {guilabel}`Internal Transfers` {doc}`reconciliation model ` +button. This reconciliation model button writes the transaction off to the {guilabel}`Internal +Transfer` account. + +:::{tip} +Remember to reconcile the transaction for both the outgoing transaction on the journal that sends +the payment and the incoming transaction on the journal that receives the payment. +::: + +```{eval-rst} +.. example:: + Take, for example, a transfer of $1000 from Bank A to Bank B: + + - Bank journal (Bank A) + + .. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - **Account** + - **Debit** + - **Credit** + * - Bank A account + - + - $1,000 + * - **Internal transfer account** + - **$1,000** + - + + - Bank journal (Bank B) + + + .. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - **Account** + - **Debit** + - **Credit** + * - Bank B account + - $1,000 + - + * - **Internal transfer account** + - + - **$1,000** +``` + +:::{seealso} +{doc}`reconciliation` +{doc}`reconciliation_models` +::: + diff --git a/content/applications/finance/accounting/bank/loans.md b/content/applications/finance/accounting/bank/loans.md new file mode 100644 index 000000000..ada0e8d26 --- /dev/null +++ b/content/applications/finance/accounting/bank/loans.md @@ -0,0 +1,65 @@ +# Loans management + +Odoo's loan management gives a comprehensive list of all loans undertaken by your company in order +to maintain a holistic and forecasted view of upcoming due dates (e.g., cash forecast). Set up +amortization schedules—or import them—and let Odoo automatically handle monthly interest and +principal adjustments so that your financial reports are always accurate with minimal effort. + +## Create a new loan + +Create a new loan by going to {menuselection}`Accounting --> Accounting --> Loans`. When creating a +new loan, there are three options for how to create amortization schedules: + +- importing it from a supported file; +- calculating it from multiple input values (e.g., the {guilabel}`Amount Borrowed`, the + {guilabel}`Duration`, etc.) using the {guilabel}`Compute` button; +- manually filling in the lines of the schedule. + +In each case, three different fields are required for each line of the amortization schedule: the +{guilabel}`Date`, the {guilabel}`Principal`, and the {guilabel}`Interest`. + +The {guilabel}`Amount Borrowed`, {guilabel}`Interest`, and {guilabel}`Duration` fields will be red +if the sum of the lines does not match the total of the amortization schedule lines. + +## Loan entries mechanism + +When the amount borrowed is credited to a bank account, it should be transferred to a long-term +account (defined in the {guilabel}`Loan Settings` tab). Then, upon the validation of the loan, Odoo +creates the necessary journal entries so that there is always a holistic and forecasted view of +upcoming due dates. The entire process is completely automated with a long-term and short-term +principal reclassification mechanism. + +For each line of the amortization schedule, Odoo creates the following entries: + +A payment entry on the same date that +: - debits the principal amount to the long-term account; + - debits the interest amount to the expense account; + - credits the payment amount to the short-term account: this is the amount that will be + withdrawn by the bank. + +A reclassification entry on the same date that +: - debits the sum of the principal amounts of the next 12 months to the long-term account; + - credits the sum of the principal amounts of the next 12 months to the short-term account. + +A reversed entry of the reclassification entry on *the next day* that simply reverses the previous +one. + +With this mechanism, month after month, the short-term account is always up to date with the +current short-term due amounts. + +## Closing a loan + +By default, a loan will be closed whenever its last payment entry is posted. However, it can also +be manually closed (e.g., because it is being paid off early) by clicking on the {guilabel}`Close` +button. A wizard will appear asking from which date the loan should be closed. All draft entries +after this date will be deleted too. + +A loan can also be cancelled. In that case, all entries will be deleted even if they were already +posted. + +## Loans Analysis Report + +By going to {menuselection}`Accounting --> Reporting --> Loans Analysis`, you can access a +report with a pivot view of your ongoing loans. By default, the report shows the principal, +interest, and total payment for each year for the loan duration. + diff --git a/content/applications/finance/accounting/bank/reconciliation.md b/content/applications/finance/accounting/bank/reconciliation.md new file mode 100644 index 000000000..0a6db3bdd --- /dev/null +++ b/content/applications/finance/accounting/bank/reconciliation.md @@ -0,0 +1,144 @@ +# Bank reconciliation + +**Bank reconciliation** is the process of matching your {doc}`bank transactions ` 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. + +:::{seealso} +- [Odoo Tutorials: Bank reconciliation](https://www.odoo.com/slides/slide/bank-reconciliation-2724) +- {doc}`bank_synchronization` +- {doc}`transactions` +::: + +## Bank reconciliation view + +To access a bank journal's **reconciliation view**, go to your {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. + +```{image} reconciliation/bank-card.png +:alt: Reaching the bank reconciliation tool from your accounting dashboard +``` + +The bank reconciliation view is structured into three distinct sections: transactions, counterpart +entries, and resulting entry. + +```{image} reconciliation/user-interface.png +:alt: The user interface of the reconciliation view of a bank journal. +``` + +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. + +## 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 +`. + +1. Select a transaction among unmatched bank transactions. +2. 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 `. +3. 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 `. +4. Click the {guilabel}`Validate` button to confirm the reconciliation and move to the next + transaction. + +:::{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. +::: + +:::{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. +::: + +(reconciliation-existing-entries)= + +### Match existing entries + +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. + +:::{tip} +The search bar within the {guilabel}`Match Existing Entries` tab allows you to search for +specific journal items. +::: + +(reconciliation-batch-payments)= + +### Batch payments + +[Batch payments](payments/batch-payments) 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. + +(reconciliation-manual-operations)= + +### Manual operations + +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. + +:::{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. +::: + +:::{note} +Lines are silently reconciled unless a write-off entry is required, which launches a +reconciliation wizard. + +```{image} reconciliation/fully-paid.png +:alt: Click on fully paid to manually set an invoice as entirely paid. +``` +::: + +(reconciliation-button)= + +### Reconciliation model buttons + +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. + diff --git a/content/applications/finance/accounting/bank/reconciliation_models.md b/content/applications/finance/accounting/bank/reconciliation_models.md new file mode 100644 index 000000000..7d39afa86 --- /dev/null +++ b/content/applications/finance/accounting/bank/reconciliation_models.md @@ -0,0 +1,127 @@ +# 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`. + +:::{seealso} +- {doc}`bank_synchronization` +- [Odoo Tutorials: Reconciliation models](https://www.odoo.com/slides/slide/reconciliation-models-1841?fullscreen=1) +::: + +(models-type)= + +## Reconciliation model types + +The reconciliation models are available by going to {menuselection}`Accounting --> Configuration +--> Banks: Reconciliation Models`. 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. + +## Default reconciliation models + +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`. + +:::{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. + +```{image} reconciliation_models/list-view.png +:alt: Rearrange the sequence of models in the list view. +``` +::: + +### Invoices/Bills perfect match + +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. + +```{image} reconciliation_models/invoices-bills-perfect-match.png +:alt: Set rules to trigger the reconciliation. +``` + +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. + +### Invoices/Bills partial match if underpaid + +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. + +The reconciliation model {guilabel}`Type` is {guilabel}`Rule to match invoices/bills`, and the +{guilabel}`Payment tolerance` should be set. + +```{image} reconciliation_models/partial-match.png +:alt: Set rules to trigger the reconciliation. +``` + +:::{note} +The {guilabel}`Payment tolerance` is only applicable to lower payments. It is disregarded when an +overpayment is received. +::: + +:::{seealso} +{doc}`../customer_invoices/cash_discounts` +::: + +### Line with 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. + +```{image} reconciliation_models/bank-fees.png +:alt: Set rules to trigger the reconciliation. +``` + +:::{note} +[Regular expressions](https://regexone.com/), 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. + +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. + +```{image} reconciliation_models/regex.png +:alt: Using Regex in Odoo +``` +::: + +## Partner mapping + +Partner mapping allows you to establish rules for automatically matching transactions to the correct +partner account, saving time and reducing the risk of errors that can occur during manual +reconciliation. For example, you can create a partner mapping rule for incoming payments with +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 +``` + diff --git a/content/applications/finance/accounting/bank/transactions.md b/content/applications/finance/accounting/bank/transactions.md new file mode 100644 index 000000000..cc916e3f7 --- /dev/null +++ b/content/applications/finance/accounting/bank/transactions.md @@ -0,0 +1,139 @@ +# Transactions + +Importing transactions from your bank statements allows keeping track of bank account transactions +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. + +:::{note} +{ref}`Grouping transactions by statement ` is optional. +::: + +(transactions-import)= + +## Import transactions + +Odoo supports multiple file formats to import transactions: + +- SEPA recommended Cash Management format (CAMT.053) +- Comma-separated values (CSV) +- 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`. + +:::{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. + +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. + +:::{seealso} +{doc}`/applications/essentials/export_import_data` +::: + +(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. + +(transactions-statements)= + +## Statements + +A **bank statement** is a document provided by a bank or financial institution that lists the +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. + +:::{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 +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`. + +(transactions-statement-kanban)= + +### Statement creation from the kanban view + +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. + +```{image} transactions/statements-kanban.png +:alt: A "Statement" button is visible when hovering on the line separating two transactions. +``` + +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 + +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. + +(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`. + +:::{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). + +:::{note} +When a bank statement is generated to be printed, it is automatically added to the +{guilabel}`Attachments`. +::: + diff --git a/content/applications/finance/accounting/customer_invoices.md b/content/applications/finance/accounting/customer_invoices.md new file mode 100644 index 000000000..7697fc2e5 --- /dev/null +++ b/content/applications/finance/accounting/customer_invoices.md @@ -0,0 +1,239 @@ +--- +show-content: true +--- + +# Customer invoices + +A customer invoice is a document issued by a company for products and/or services sold to a +customer. It records receivables as they are sent to customers. Customer invoices can include +amounts due for the goods and/or services provided, applicable sales taxes, shipping and handling +fees, and other charges. Odoo supports multiple invoicing and payment workflows. + +:::{seealso} +{doc}`/applications/finance/accounting/customer_invoices/overview` +::: + +From draft invoice to profit and loss report, the process involves several steps once the goods (or +services) have been ordered/shipped (or rendered) to a customer, depending on the invoicing policy: + +- {ref}`accounting/invoice/creation` +- {ref}`accounting/invoice/confirmation` +- {ref}`accounting/invoice/sending` +- {ref}`accounting/invoice/paymentandreconciliation` +- {ref}`accounting/invoice/followup` +- {ref}`accounting/invoice/reporting` + +(accounting-invoice-creation)= + +## Invoice creation + +Draft invoices can be created directly from documents like sales orders or purchase orders or +manually from the {guilabel}`Customer Invoices` journal in the {guilabel}`Accounting Dashboard`. + +An invoice must include the required information to enable the customer to pay promptly for their +goods and services. Make sure the following fields are appropriately completed: + +- {guilabel}`Customer`: When a customer is selected, Odoo automatically pulls information from the + customer record like the invoice address, + {doc}`preferred payment terms `, + {doc}`fiscal positions `, receivable account, and more onto the invoice. + To change these values for this specific invoice, edit them directly on the invoice. To change + them for future invoices, change the values on the contact record. +- {guilabel}`Invoice Date`: If not set manually, this field is automatically set as the current date + upon confirmation. +- {guilabel}`Due Date` or {doc}`payment terms `: To specify when + the customer has to pay the invoice. +- {guilabel}`Journal`: Automatically set and can be changed if needed. +- {doc}`Currency `. If the invoice's currency differs from the + company's currency, the currency exchange rate is automatically displayed. + +In the {guilabel}`Invoice Lines` tab: + +- {guilabel}`Product`: Click {guilabel}`Add a line`, then search for and select the product. +- {guilabel}`Quantity` +- {guilabel}`Price` +- {doc}`Taxes ` (if applicable) + +To access the product catalog and view all items in an organized display, click {doc}`Catalog +`. +When the products and quantities are selected, click {guilabel}`Back to Invoice` to return to the +invoice; the selected catalog items will appear in the invoice lines. + +:::{tip} +To display the total amount of the invoice in words, go to {menuselection}`Accounting --> +Configuration --> Settings` and activate the {guilabel}`Total amount of invoice in letters` +option. +::: + +The {guilabel}`Journal Items` tab displays the accounting entries created. Additional invoice +information such as the {guilabel}`Customer Reference`, {guilabel}`Payment Reference`, {doc}`Fiscal +Positions `, {doc}`Incoterms `, and more can be +added or modified in the {guilabel}`Other Info` tab. + +:::{note} +Odoo initially creates invoices in {guilabel}`Draft` status. Draft invoices have no accounting +impact until they are {ref}`confirmed `. +::: + +:::{seealso} +{doc}`/applications/sales/sales/invoicing/proforma` +::: + +(accounting-invoice-confirmation)= + +## Invoice confirmation + +Click {guilabel}`Confirm` when the invoice is completed. The invoice's status changes to +{guilabel}`Posted`, and a journal entry is generated based on the invoice configuration. On +confirmation, Odoo assigns each invoice a unique number from a defined {doc}`sequence +`. + +:::{note} +- Once confirmed, an invoice can no longer be updated. Click {guilabel}`Reset to draft` if + changes are needed. +- If required, invoices and other journal entries can be locked once posted using the + {ref}`Secure posted entries with hash ` feature. +::: + +(accounting-invoice-sending)= + +## Invoice sending + +To set a preferred {guilabel}`Invoice sending` method for a customer, go to +{menuselection}`Accounting --> Customers --> Customers` and select the customer. In the +{guilabel}`Accounting` tab of the contact form, select the preferred {guilabel}`Invoice sending` +method in the {guilabel}`Customer Invoices` section. + +:::{note} +Sending letters in Odoo requires {doc}`In-App Purchase (IAP) <../../essentials/in_app_purchase>` +credit or tokens. +::: + +To send the invoice to the customer, navigate back to the invoice record and follow these steps: + +1. Click {guilabel}`Print & Send`. + +2. If the {ref}`default invoice layout ` has not been customized + yet, a {guilabel}`Configure your document layout` pop-up window appears. Configure the layout and + click {guilabel}`Continue`. + + :::{note} + - The document layout can be changed at any time in the general settings. + - To add a QR code for banking app payments to the invoice, enable the {guilabel}`QR Code` + option in the {guilabel}`Configure Your Document Layout` window. To modify this option, go + to {menuselection}`Accounting --> Configuration --> Settings`, scroll down to the + {guilabel}`Customer Payments` section, and enable/disable the {guilabel}`QR Codes` option. + ::: + +3. In the {guilabel}`Print & Send` window: + + - If a preferred {guilabel}`Invoice sending` method was set in the contact form, it is selected + by default. Select another one if needed. + - If no preferred {guilabel}`Invoice sending` method was set in the contact form, select the + method to use for sending the invoice to the customer. + +4. Click {guilabel}`Print & Send` if the {guilabel}`by Email` option is selected, or click + {guilabel}`Print`. + +(accounting-invoice-sending-multiple-invoices)= + +### Sending multiple invoices + +To send and print multiple invoices, go to {menuselection}`Accounting --> Customers --> Invoices`, +select them in the {guilabel}`Invoices` list view and click {guilabel}`Print & Send`. The +{guilabel}`Print & Send` window displays the selected invoice sending methods based on the preferred +method set. + +A banner is added to the selected invoices to indicate they are part of an ongoing send and print +batch. This helps prevent the process from being triggered manually again, as it may take some time +to complete for exceptionally large batches. + +To check all invoices that have not yet been sent, go to {menuselection}`Accounting --> Customers +--> Invoices`. In the {guilabel}`Invoices` list view, click into the search bar and filter on +{guilabel}`Not Sent`. + +(accounting-invoice-paymentandreconciliation)= + +## Payment and reconciliation + +In Odoo, an invoice is considered {guilabel}`Paid` when the associated accounting entry has been +reconciled with a corresponding bank transaction. + +:::{seealso} +- {doc}`payments` +- {doc}`bank/reconciliation` +::: + +(accounting-invoice-followup)= + +## Payment follow-up + +Odoo's {doc}`follow-up actions ` help companies follow up on customer invoices. +Different actions can be set up to remind customers to pay their outstanding invoices, depending on +how much the customer is overdue. These actions are bundled into follow-up levels that trigger when +an invoice is overdue by a certain number of days. If there are multiple overdue invoices for the +same customer, the actions are performed on the most overdue invoice. + +(accounting-invoice-reporting)= + +## Reporting + +(accounting-invoice-partner-reports)= + +### Partner reports + +(accounting-invoices-partner-ledger)= + +#### Partner Ledger + +The {guilabel}`Partner Ledger` report shows the balance of customers and suppliers. To access it, +go to {menuselection}`Accounting --> Reporting --> Partner Ledger`. + +(accounting-invoices-aging-report)= + +#### Aged Receivable + +To review outstanding customer invoices and their related due dates, use the {ref}`Aged Receivable +` report. To access it, go to {menuselection}`Accounting --> +Reporting --> Aged Receivable`. + +(accounting-invoices-aged-payable)= + +#### Aged Payable + +To review outstanding vendor bills and their related due dates, use the {ref}`Aged Payable +` report. To access it, go to {menuselection}`Accounting --> +Reporting --> Aged Payable`. + +(accounting-invoices-profit-and-loss)= + +### Profit and Loss + +The {ref}`Profit and Loss ` statement shows details of income +and expenses. + +(accounting-invoices-balance-sheet)= + +### Balance sheet + +The {ref}`Balance Sheet ` summarizes the company's assets, +liabilities, and equity at a specific time. + +```{toctree} +:titlesonly: true + +customer_invoices/overview +customer_invoices/customer_addresses +customer_invoices/payment_terms +customer_invoices/terms_conditions +customer_invoices/cash_discounts +customer_invoices/credit_notes +customer_invoices/cash_rounding +customer_invoices/deferred_revenues +customer_invoices/electronic_invoicing +customer_invoices/sequence +customer_invoices/snailmail +customer_invoices/epc_qr_code +customer_invoices/incoterms +``` + diff --git a/content/applications/finance/accounting/customer_invoices/cash_discounts.md b/content/applications/finance/accounting/customer_invoices/cash_discounts.md new file mode 100644 index 000000000..6c4555822 --- /dev/null +++ b/content/applications/finance/accounting/customer_invoices/cash_discounts.md @@ -0,0 +1,182 @@ +# Cash discounts and tax reduction + +**Cash discounts** are reductions in the amount a customer must pay for goods or services offered as +an incentive for paying their invoice promptly. These discounts are typically a percentage of the +total invoice amount and are applied if the customer pays within a specified time. Cash discounts +can help a company maintain a steady cash flow. + +```{eval-rst} +.. example:: + You issue a €100 invoice on the 1st of January. The full payment is due within 30 days, and you + also offer a 2% discount if your customer pays you within seven days. + + The customer can pay €98 up to the 8th of January. After that date, they would have to pay €100 + by the 31st of January. +``` + +A {ref}`tax reduction ` can also be applied depending on the country +or region. + +:::{seealso} +- {doc}`payment_terms` +- {doc}`../payments` +::: + +(cash-discounts-configuration)= + +## Configuration + +To grant cash discounts to customers, you must first verify the {ref}`gain and loss accounts +`. Then, configure {ref}`payment terms +` and add a cash discount by checking the {guilabel}`Early Discount` +checkbox and filling in the discount percentage, discount days, and {ref}`tax +reduction ` fields. + +(cash-discounts-gain-loss-accounts)= + +### Cash discount gain/loss accounts + +With a cash discount, the amount you earn depends on whether the customer benefits from the cash +discount or not. This inevitably leads to gains and losses, which are recorded on default accounts. + +To modify these accounts, go to {menuselection}`Accounting --> Configuration --> Settings`, and, in +the {guilabel}`Default Accounts` section, select the accounts you want to use for the +{guilabel}`Cash Discount Gain account` and {guilabel}`Cash Discount Loss account`. + +(cash-discounts-payment-terms)= + +### Payment terms + +Cash discounts are defined on {doc}`payment terms `. Configure them to your liking by +going to {menuselection}`Accounting --> Configuration --> Payment Terms`, and make sure to fill out +the discount percentage, discount days, and {ref}`tax reduction ` +fields. + +```{image} cash_discounts/payment-terms.png +:alt: |- +: Configuration of payment terms named "2/7 Net 30". The field "Description on Invoices" +: reads: "Payment terms: 30 Days, 2% Early Payment Discount under 7 days". +``` + +(cash-discounts-tax-reductions)= + +### Tax reductions + +Depending on the country or region, the base amount used to compute the tax can vary, which can lead +to a **tax reduction**. Since tax reductions are set on individual payment terms, each term can use +a specific tax reduction. + +To configure how the tax reduction is applied, go to a payment term with the {guilabel}`Early +Discount` checkbox enabled, and select one of the three following options: + +- Always (upon invoice) + : The tax is always reduced. The base amount used to compute the tax is the discounted amount, + whether the customer benefits from the discount or not. +- On early payment + : The tax is reduced only if the customer pays early. The base amount used to compute the tax is the + same as the sale: if the customer benefits from the reduction, then the tax is reduced. This means + that, depending on the customer, the tax amount can vary after the invoice is issued. +- Never + : The tax is never reduced. The base amount used to compute the tax is the full amount, whether the + customer benefits from the discount or not. + +```{eval-rst} +.. example:: + + You issue a €100 invoice (tax-excluded) on the 1st of January, with a 21% tax rate. The full + payment is due within 30 days, and you also offer a 2% discount if your customer pays you within + seven days. + + .. tabs:: + + .. tab:: Always (upon invoice) + + .. list-table:: + :header-rows: 1 + + * - Due date + - Total amount due + - Computation + * - 8th of January + - €118.58 + - €98 + (21% of €98) + * - 31st of January + - €120.58 + - €100 + (21% of €98) + + .. tab:: On early payment + + .. list-table:: + :header-rows: 1 + + * - Due date + - Total amount due + - Computation + * - 8th of January + - €118.58 + - €98 + (21% of €98) + * - 31st of January + - €121.00 + - €100 + (21% of €100) + + .. tab:: Never + + .. list-table:: + :header-rows: 1 + + * - Due date + - Total amount due + - Computation + * - 8th of January + - €119.00 + - €98 + (21% of €100) + * - 31st of January + - €121.00 + - €100 + (21% of €100) +``` + +:::{note} +- {ref}`Tax grids `, which are used for the tax report, are correctly + computed according to the {ref}`type of tax reduction ` you + configured. +- The **type of cash discount tax reduction** may be correctly pre-configured, depending on your + {ref}`fiscal localization package `. +::: + +(cash-discounts-customer-invoice)= + +## Apply a cash discount to a customer invoice + +On a customer invoice, apply a cash discount by selecting the {ref}`payment terms you created +`. Odoo automatically computes the correct amounts, tax amounts, due +dates, and accounting records. + +Under the {guilabel}`Journal Items` tab, you can display the discount details by clicking on the +"toggle" button and adding the {guilabel}`Discount Date` and {guilabel}`Discount Amount` columns. + +```{image} cash_discounts/invoice-journal-entry.png +:alt: "An invoice of \u20AC100.00 with \"2/7 Net 30\" selected as payment terms. The\ +: \ \"Journal Items\" tab\nis open, and the \"Discount Date\" and \"Discount Amount\"\ +: \ columns are displayed." +``` + +The discount amount and due date are also displayed on the generated invoice report sent to the +customer if the {guilabel}`Show installment dates` option is checked on the payment terms. + +```{image} cash_discounts/invoice-print.png +:alt: "An invoice of \u20AC100.00 with the following text added to the terms and conditions:\ +: \ \"30\nDays, 2% Early Payment Discount under 7 days. 118.58 \u20AC due if paid\ +: \ before 01/08/2023.\"" +``` + +### Payment reconciliation + +When you record a {doc}`payment <../payments>` or {doc}`reconcile your bank transactions +<../bank/reconciliation>`, Odoo takes the customer payment's date into account to determine if the +customer can benefit from the cash discount or not. + +:::{note} +If your customer pays the discount amount *after* the discount date, you can always decide to +mark the invoice as fully paid with a write-off or as partially paid. +::: + diff --git a/content/applications/finance/accounting/customer_invoices/cash_rounding.md b/content/applications/finance/accounting/customer_invoices/cash_rounding.md new file mode 100644 index 000000000..2a5d26a35 --- /dev/null +++ b/content/applications/finance/accounting/customer_invoices/cash_rounding.md @@ -0,0 +1,37 @@ +# Cash rounding + +**Cash rounding** is required when the lowest physical denomination +of currency, or the smallest coin, is higher than the minimum unit +of account. + +For example, some countries require their companies to round up or +down the total amount of an invoice to the nearest five cents, when +the payment is made in cash. + +## Configuration + +Go to {menuselection}`Accounting --> Configuration --> Settings` +and enable *Cash Rounding*, then click on *Save*. + +```{image} cash_rounding/cash_rounding01.png +:align: center +``` + +Go to {menuselection}`Accounting --> Configuration --> Cash Roundings`, +and click on *Create*. + +Define here your *Rounding Precision*, *Rounding Strategy*, and +*Rounding Method*. + +Odoo supports two **rounding strategies**: + +1. **Add a rounding line**: a *rounding* line is added on the invoice. + You have to define which account records the cash roundings. +2. **Modify tax amount**: the rounding is applied in the taxes section. + +## Apply roundings + +When editing a draft invoice, open the *Other Info* tab, go to the +*Accounting Information* section, and select the appropriate *Cash +Rounding Method*. + diff --git a/content/applications/finance/accounting/customer_invoices/credit_notes.md b/content/applications/finance/accounting/customer_invoices/credit_notes.md new file mode 100644 index 000000000..f550eb3a7 --- /dev/null +++ b/content/applications/finance/accounting/customer_invoices/credit_notes.md @@ -0,0 +1,118 @@ +# Credit notes and refunds + +A **credit/debit note**, or **credit/debit memo**, is a document issued to a customer that notifies +them that they have been *credited/debited* a certain amount. + +Several use cases can lead to a credit note, such as: + +> - a mistake in the invoice +> - a return of the goods, or a rejection of the services +> - the goods delivered are damaged + +Debit notes are less common but are most frequently used to track debts owed by customers or to +vendors because of modifications to confirmed customer invoices or vendor bills. + +:::{note} +Issuing a credit/debit note is the only legal way to cancel, refund, or modify a validated +invoice. Do not forget to **register the payment** afterward if you need to send money back to +your customer and/or validate the +{doc}`return ` if a storable product is +returned. +::: + +(accounting-issue-credit-note)= + +## Issue a credit note + +You can create a credit note from scratch by going to {menuselection}`Accounting --> Customers --> +Credit Notes`, and by clicking on {guilabel}`Create`. Filling out a credit note form works the same +way as an invoice form. + +However, most of the time, credit notes are generated directly from the related invoices. To do so, +go to {menuselection}`Accounting --> Customers --> Invoices`, open the related **customer invoice**, +and click on {guilabel}`Credit Note`. + +You can choose between three options: + +> - {guilabel}`Partial Refund` +> - {guilabel}`Full Refund` +> - {guilabel}`Full refund and new draft invoice` + +:::{note} +A credit note sequence starts with `R` and is followed by the number of the related document +(e.g., RINV/2019/0004 is related to the invoice INV/2019/0004). +::: + +### Partial refund + +When selecting the {guilabel}`Partial Refund` option, Odoo creates a draft credit note already +prefilled with all the necessary information from the original invoice. This is the option to choose +if you wish to do a partial refund or if you want to modify any detail of the credit note. + +:::{note} +This is the only option for invoices marked as *in payment* or *paid*. +::: + +### Full refund + +When selecting the {guilabel}`Full Refund` option, Odoo creates a credit note, automatically +validates it, and reconciles it with the related invoice. + +```{image} credit_notes/credit_notes02.png +:alt: Full refund credit note. +``` + +This is the option to choose for a full refund or to **cancel** a *validated* invoice. + +### Full refund and new draft invoice + +When selecting the {guilabel}`Full refund and new draft invoice` option, Odoo creates a credit note, +automatically validates it, reconciles it with the related invoice, and opens a new draft invoice +prefilled with the same details from the original invoice. + +This is the option to **modify** the content of a *validated* invoice. + +(accounting-issue-debit-note)= + +## Issue a debit note + +You can create a debit note from scratch by going to {menuselection}`Accounting --> Customers --> +Invoices` or by clicking on the related invoice you wish to issue a debit note for. On the invoice +form view, click {guilabel}`Cog icon (⚙) --> Debit Note`, fill in the information, and click +{guilabel}`Create Debit Note`. + +## Record a vendor refund + +**Vendor refunds** are recorded the same way as credit notes: + +You can either create a credit note from scratch by going to {menuselection}`Accounting --> Vendors +--> Refund`, and by clicking on {guilabel}`Create`; or by opening the related **vendor bill**, and +clicking on {guilabel}`Credit Note`. + +## Record a debit note + +**Debit notes** from vendors are recorded in a similar way to how they are issued to customers: + +Go to {menuselection}`Accounting --> Vendors --> Bills`, open the related bill you wish to record a +debit note for, and click {guilabel}`Cog icon (⚙) --> Debit Note`. Fill in the information, and click +{guilabel}`Create Debit Note`. + +## Journal entries + +Issuing a credit/debit note from an invoice/bill creates a **reverse entry** that zeroes out the +journal items generated by the original invoice. + +```{eval-rst} +.. example:: + The journal invoice of an entry: + + .. image:: credit_notes/credit_notes03.png + :alt: Invoice journal entry. + + And here is the credit note’s journal entry generated to reverse + the original invoice above: + + .. image:: credit_notes/credit_notes04.png + :alt: Credit note journal entry reverses the invoice journal entry. +``` + diff --git a/content/applications/finance/accounting/customer_invoices/customer_addresses.md b/content/applications/finance/accounting/customer_invoices/customer_addresses.md new file mode 100644 index 000000000..aeec68ec1 --- /dev/null +++ b/content/applications/finance/accounting/customer_invoices/customer_addresses.md @@ -0,0 +1,43 @@ +# Delivery and invoice addresses + +Companies often have multiple locations, and it is common that a customer invoice should be sent to +one address and the delivery should be sent to another. Odoo's **Customer Addresses** feature is +designed to handle this scenario by making it easy to specify which address to use for each case. + +:::{seealso} +{doc}`overview` +::: + +## Configuration + +To specify a sales order's invoice and delivery addresses, first go to {menuselection}`Accounting +--> Configuration --> Settings`. In the {guilabel}`Customer Invoices` section, enable +{guilabel}`Customer Addresses` and click {guilabel}`Save`. + +On quotations and sales orders, there are now fields for {guilabel}`Invoice Address` and +{guilabel}`Delivery Address`. If the customer has an invoice or delivery address listed on their +{ref}`contact record `, the corresponding field uses that +address, by default, but any contact's address can be used instead. + +:::{seealso} +For more information, refer to the documentation on {ref}`Contact Form Configuration +`. +::: + +## Invoice and deliver to different addresses + +Delivery orders and their delivery slip reports use the address set as the {guilabel}`Delivery +Address` on the sales order. By default, invoice reports show both the shipping address and the +invoice address to assure the customer that the delivery is going to the correct location. + +Emails also go to different addresses. The quotation and sales order are sent to the main contact's +email, as usual, but the invoice is sent to the email of the address set as the +{guilabel}`Invoice Address` on the sales order. + +:::{note} +- Reports, such as the delivery slip and invoice report, can be {doc}`customized using Studio + `. +- If {doc}`Send by Post ` is checked when you click {guilabel}`Send & Print`, the + invoice will be mailed to the invoice address. +::: + diff --git a/content/applications/finance/accounting/customer_invoices/deferred_revenues.md b/content/applications/finance/accounting/customer_invoices/deferred_revenues.md new file mode 100644 index 000000000..6c9105156 --- /dev/null +++ b/content/applications/finance/accounting/customer_invoices/deferred_revenues.md @@ -0,0 +1,195 @@ +# Deferred revenues + +**Deferred revenues**, or **unearned revenues**, are invoices addressed to customers +for goods yet to be delivered or services yet to be rendered. + +The company cannot report them on the current **profit and loss statement**, or *income statement*, +since the goods and services will be effectively delivered/rendered in the future. + +These future revenues must be deferred on the company's balance sheet among the current liabilities +until they can be **recognized**, at once or over a defined period, on the profit and loss +statement. + +For example, let's say a business sells a software license of \$1200 for 1 year. They immediately +invoice it to the customer but can't consider it earned yet, as the future months of licensing have +not yet been delivered. Therefore, they post this new revenue in a deferred revenue account and +recognize it on a monthly basis. Each month, for the next 12 months, \$100 will be recognized as +revenue. + +Odoo Accounting handles deferred revenues by spreading them in multiple entries that are posted +periodically. + +:::{note} +The server checks once a day if an entry must be posted. It might then take up to 24 hours before +you see a change from {guilabel}`Draft` to {guilabel}`Posted`. +::: + +## Configuration + +Make sure the default settings are correctly configured for your business. To do so, go to +{menuselection}`Accounting --> Configuration --> Settings`. The following options are available: + +Journal + +: The deferral entries are posted in this journal. + +Deferred Revenue + +: Revenues are deferred on this Current Liability account until they are recognized. + +Generate Entries + +: By default, Odoo {ref}`automatically generates ` + the deferral entries when you post a customer invoice. However, you can also choose to + {ref}`generate them manually ` by selecting the + {guilabel}`Manually & Grouped` option instead. + +Based on + +: Suppose an invoice of \$1200 must be deferred over 12 months. + + - The {guilabel}`Months` option accounts for \$100 each month prorated to the number of days in + that month (e.g., \$50 for the first month if the {guilabel}`Start Date` is set to the 15th of + the month). + - The {guilabel}`Full Months` option considers each month started to be full (e.g., \$100 for the + first month even if the {guilabel}`Start Date` is set to the 15th of the month); this means that + with the {guilabel}`Full Months` option, a full \$100 is recognized in the first partial month, + eliminating the need for a 13th month to recognize any remainder as would be the case when using + the {guilabel}`Months` option. + - The {guilabel}`Days` option accounts for different amounts depending on the number of days in + each month (e.g., ~\$102 for January and ~\$92 for February). + +(customer-invoices-deferred-generate-on-validation)= + +## Generate deferral entries on validation + +:::{tip} +Make sure the {guilabel}`Start Date` and {guilabel}`End Date` fields are visible in the +{guilabel}`Invoice Lines` tab. In most cases, the {guilabel}`Start Date` should be in the same +month as the {guilabel}`Invoice Date`. Deferred revenue entries are posted from the invoice +date and are displayed in the report accordingly. +::: + +For each line of the invoice that should be deferred, specify the start and end dates of the +deferral period. + +If the {guilabel}`Generate Entries` field in the **Settings** is set to {guilabel}`On invoice/bill +validation`, Odoo automatically generates the deferral entries when the invoice is validated. Click +the {guilabel}`Deferred Entries` smart button to see them. + +One entry, dated on the same day as the invoice's accounting date, moves the invoice amounts from +the income account to the deferred account. The other entries are deferral entries which, month +after month, move the invoice amounts from the deferred account to the income account to recognize +the revenue. + +```{eval-rst} +.. example:: + You can defer a January invoice of $1200 over 12 months by specifying a start date of 01/01/2023 + and an end date of 12/31/2023. At the end of August, $800 is recognized as an income, + whereas $400 remains on the deferred account. +``` + +## Reporting + +The deferred revenue report computes an overview of the necessary deferral entries for each account. +To access it, go to {menuselection}`Accounting --> Reporting --> Deferred Revenue`. + +To view the journal items of each account, click on the account name and then {guilabel}`Journal +Items`. + +```{image} deferred_revenues/deferred_revenue_report.png +:alt: Deferred revenue report +``` + +:::{note} +Only invoices whose accounting date is before the end of the period of the report +are taken into account. +::: + +(customer-invoices-deferred-generate-manually)= + +## Generate grouped deferral entries manually + +If you have a lot of deferred revenues and wish to reduce the number of journal entries created, you +can generate deferral entries manually. To do so, set the {guilabel}`Generate Entries` field in the +**Settings** to {guilabel}`Manually & Grouped`. Odoo then aggregates the deferred amounts in a +single entry. + +At the end of each month, go to {menuselection}`Accounting --> Reporting --> Deferred Revenue` and +click the {guilabel}`Generate Entries` button. This generates two deferral entries: + +- One dated at the end of the month which aggregates, for each account, all the deferred amounts + of that month. This means that a part of the deferred revenue is recognized at the end of that + period. +- The reversal of this created entry, dated on the following day (i.e., the first day of the + next month) to cancel the previous entry. + +```{eval-rst} +.. example:: + There are two invoices: + + - Invoice A: $1200 to be deferred from 01/01/2023 to 12/31/2023 + - Invoice B: $600 to be deferred from 01/01/2023 to 12/31/2023 + + In January + At the end of January, after clicking the :guilabel:`Generate Entries` button, there are the + following entries: + + - Entry 1 dated on the 31st January: + + - Line 1: Expense account -1200 -600 = **-1800** (cancelling the total of both invoices) + - Line 2: Expense account 100 + 50 = **150** (recognizing 1/12 of invoice A and invoice B) + - Line 3: Deferred account 1800 - 150 = **1650** (amount that has yet to be deferred later + on) + + - Entry 2 dated on the 1st February, the reversal of the previous entry: + + - Line 1: Expense account **1800** + - Line 2: Deferred account **-150** + - Line 3: Expense account **-1650** + + In February + At the end of February, after clicking the :guilabel:`Generate Entries` button, there are the + following entries: + + - Entry 1 dated on the 28th February: + + - Line 1: Expense account -1200 -600 = **-1800** (cancelling the total of both invoices) + - Line 2: Expense account 200 + 100 = **300** (recognizing 2/12 of invoice A and invoice B) + - Line 3: Deferred account 1800 - 300 = **1500** (amount that has yet to be deferred later + on) + + - Entry 2 dated on the 1st March, the reversal of the previous entry. + + From March to October + The same computation is done for each month until October. + + In November + At the end of November, after clicking the :guilabel:`Generate Entries` button, there are the + following entries: + + - Entry 1 dated on the 30th November: + + - Line 1: Expense account -1200 -600 = **-1800** (cancelling the total of both invoices) + - Line 2: Expense account 1100 + 550 = **1650** (recognizing 11/12 of invoice A and invoice + B) + - Line 3: Deferred account 1800 - 1650 = **150** (amount that has yet to be deferred later + on) + + - Entry 2 dated on the 1st December, the reversal of the previous entry. + + In December + There is no need to generate entries in December. Indeed, if we do the computation for + December, we have an amount of 0 to be deferred. + + In total + If we aggregate everything, we would have: + + - invoice A and invoice B + - two entries (one for the deferral and one for the reversal) for each month from January to + November + + Therefore, at the end of December, invoices A and B are fully recognized as income + only once in spite of all the created entries thanks to the reversal mechanism. +``` + diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing.md b/content/applications/finance/accounting/customer_invoices/electronic_invoicing.md new file mode 100644 index 000000000..8fc726e3c --- /dev/null +++ b/content/applications/finance/accounting/customer_invoices/electronic_invoicing.md @@ -0,0 +1,318 @@ +# 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. + +EDI feature enables automating the administration between companies and might also be required by +some governments for fiscal control or to facilitate the administration. + +Electronic invoicing of your documents such as customer invoices, credit notes or vendor bills is +one of the application of EDI. + +Odoo supports e-invoicing in many countries. Refer to the country's page for more details: + +- {doc}`Argentina ` +- {doc}`Austria ` +- {doc}`Belgium ` +- {doc}`Brazil ` +- {doc}`Chile ` +- {doc}`Colombia ` +- {doc}`Croatia ` +- {doc}`Denmark ` +- {doc}`Ecuador ` +- {doc}`Estonia ` +- {doc}`Finland ` +- {doc}`France ` +- {doc}`Germany ` +- {doc}`Hungary ` +- {doc}`Ireland ` +- {doc}`Italy ` +- {doc}`Latvia ` +- {doc}`Lithuania ` +- {doc}`Luxembourg ` +- {doc}`Mexico ` +- {doc}`Netherlands ` +- {doc}`Norway ` +- {doc}`Peru ` +- {doc}`Poland ` +- {doc}`Portugal ` +- {doc}`Romania ` +- {doc}`Slovenia ` +- {doc}`Spain ` +- {doc}`Spain - Basque Country ` +- {doc}`Uruguay ` + +:::{seealso} +{doc}`Fiscal localizations documentation <../../fiscal_localizations>` +::: + +(e-invoicing-configuration)= + +## Configuration + +By default, the format available in the {ref}`send window ` depends on your +customer's country. + +You can define a specific e-invoicing format for each customer. To do so, go to +{menuselection}`Accounting --> Customers --> Customers`, open the customer form, go to the +{guilabel}`Accounting` tab and select the appropriate format. + +```{image} electronic_invoicing/customer-form.png +:alt: Select an EDI format for a specific customer +``` + +### National electronic invoicing + +Depending on your company's country (e.g., {doc}`Italy <../../fiscal_localizations/italy>`, +{doc}`Spain <../../fiscal_localizations/spain>`, {doc}`Mexico +<../../fiscal_localizations/mexico>`, etc.), you may be required to issue e-invoicing documents in +a specific format for all your invoices. In this case, you can define a default e-invoicing format +for your sales journal. + +To do so, go to {menuselection}`Accounting --> Configuration --> Journals`, open your sales journal, +go to the {guilabel}`Advanced Settings` tab, and enable the formats you need for this journal. + +(e-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. +``` + +## Peppol + +The [Peppol](https://peppol.org/about/) 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. + +If not done yet, {ref}`install ` the {guilabel}`Peppol` module (`account_peppol`). + +:::{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**. +- 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) +::: + +### 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. +::: + +```{image} electronic_invoicing/peppol-registration-settings.png +:alt: Peppol registration button +``` + +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**. + +:::{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. +::: + +```{image} electronic_invoicing/peppol-registration-wizard.png +:alt: Peppol registration form +``` + +Fill in the following information: + +- 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. + +If you want to explore or demo Peppol, you can choose to register in {guilabel}`Demo` mode. +Otherwise, select {guilabel}`Live`. + +:::{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 +``` +::: + +:::{seealso} +- [Peppol EAS - European Commision](https://ec.europa.eu/digital-building-blocks/wikis/display/DIGITAL/Code+lists/) +- [Peppol Endpoint - OpenPeppol eDEC Code Lists](https://docs.peppol.eu/edelivery/codelists/) + (open the "Participant Identifier Schemes" as HTML page) +::: + +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. + +```{image} electronic_invoicing/peppol-phone-verification.png +:alt: phone validation +``` + +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. + +Then, set the default journal for receiving vendor bills in the {guilabel}`Incoming Invoices +Journal`. + +:::{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. +::: + +Your receiver application status should be updated soon after you are registered on the Peppol +network. + +```{image} electronic_invoicing/peppol-receiver.png +:alt: receiver application +``` + +All invoices and vendor bills can now be sent directly using the Peppol network. + +:::{important} +To update the email that Odoo can use to contact you, modify the email and click +{guilabel}`Update contact details`. +::: + +### Configure Peppol services + +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). + +### Contact verification + +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. + +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. + +```{image} electronic_invoicing/peppol-contact-verify.png +:alt: verify contact registration +``` + +:::{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. +::: + +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`. + +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`. + +```{image} electronic_invoicing/peppol-participant-format.png +:alt: verify contact ubl format +``` + +### Send invoices + +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. + +```{image} electronic_invoicing/peppol-send-print.png +:alt: Send peppol invoice +``` + +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. + +```{image} electronic_invoicing/peppol-ready-invoices.png +:alt: Filter Peppol ready invoices +``` + +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. + +```{image} electronic_invoicing/peppol-message-processing.png +:alt: Peppol message status +``` + +:::{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. +::: + +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. + +```{image} electronic_invoicing/peppol-fetch-message-status.png +:alt: Fetch invoice Peppol status +``` + +### Receive vendor bills + +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. + +```{image} electronic_invoicing/peppol-receive-bills.png +:alt: peppol receive bills +``` + +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`. + +```{image} electronic_invoicing/peppol-fetch-bills.png +:alt: Fetch bills from Peppol +``` + diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/argentina.md b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/argentina.md new file mode 100644 index 000000000..6f50ab73a --- /dev/null +++ b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/argentina.md @@ -0,0 +1,54 @@ +--- +orphan: true +--- + +# Odoo electronic invoicing in Argentina + +Odoo Invoicing is your trusted partner for safe, efficient, and legally compliant e-invoicing +solutions tailored to meet Argentina's regulatory standards and compatible with the requirements set +forth by the [Administración Federal de Ingresos Públicos (AFIP)](https://www.afip.gob.ar/). + +## Legal framework for e-invoicing in Argentina + +In Argentina, e-invoicing is regulated by the {abbr}`AFIP (Administración Federal de Ingresos +Públicos)` and is mandatory for most businesses to ensure tax compliance and transparency. The +primary regulations governing e-invoicing include: + +- [General Resolution No. 4290/2018](https://biblioteca.afip.gob.ar/search/query/norma.aspx?p=t:RAG|n:4290|o:3|a:2018|f:02/08/2018) + which establishes the mandatory use of electronic invoices for specific economic activities and + turnover thresholds. +- Fiscal code regulations: Requires electronic invoices for all VAT-registered businesses, including + B2B, {abbr}`B2G (business-to-government)`, and B2C transactions. +- Implementation of {abbr}`CAE (Código de Autorización Electrónico)`: Every electronic invoice must + include a {abbr}`CAE (Código de Autorización Electrónico)` issued by the {abbr}`AFIP + (Administración Federal de Ingresos Públicos)`, ensuring its validity and authenticity. + +## Compliance with Argentinian e-invoicing regulations + +Odoo Invoicing simplifies the process of adhering to Argentina's e-invoicing regulations, offering +features designed to ensure compliance: + +- **Supported formats**: Odoo supports Argentina's authorized e-invoice formats, including {abbr}`FE + (Factura Electrónica)` with {abbr}`AFIP (Administración Federal de Ingresos Públicos)`-compliant + digital validation, XML with {abbr}`CAE (Código de Autorización Electrónico)` authorization for + real-time integration with {abbr}`AFIP (Administración Federal de Ingresos Públicos)`, and + digitally signed PDF invoices featuring {abbr}`CAE (Código de Autorización Electrónico)` and + QR codes for secure validation. +- **Secure storage and retrieval**: Complying with Argentina’s ten-year storage requirement, Odoo + provides tamper-proof archiving and easy retrieval for audits or tax inspections. +- **Automatic VAT calculation and reporting**: Odoo ensures compliance with Argentina's VAT + regulations by automatically calculating VAT, incorporating it into invoices, and adhering to + legal reporting requirements for accurate tax submissions. + +:::{seealso} +{doc}`Argentinian fiscal localization documentation <../../../fiscal_localizations/argentina>` +::: + +:::{admonition} Disclaimer +This page provides a general overview of Argentine e-invoicing laws and how Odoo’s invoicing +module supports compliance with AFIP regulations and the Fiscal Code. It is not intended as legal +advice. We recommend consulting with a tax advisor or legal professional familiar with +Argentinian e-invoicing regulations to ensure compliance tailored to your specific business +needs. +::: + diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/austria.md b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/austria.md new file mode 100644 index 000000000..25eaafca2 --- /dev/null +++ b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/austria.md @@ -0,0 +1,51 @@ +--- +orphan: true +--- + +# Odoo electronic invoicing in Austria + +Odoo Invoicing is your trusted partner for safe, efficient, and legally compliant e-invoicing +solutions tailored to Austria's regulatory standards, and compatible with the European [Peppol](https://peppol.org/about/) framework. + +## Legal framework for e-invoicing in Austria + +In Austria, businesses must adhere to e-invoicing laws that ensure secure, authentic, and storable +transactions. The main regulation governing e-invoicing requirements in Austria is the [Austrian VAT +Act (UStG)](https://www.ris.bka.gv.at/GeltendeFassung.wxe?Abfrage=Bundesnormen&Gesetzesnummer=10004873) +and its related e-invoicing standards for public procurement ([BGBI. I Nr. 32/2019](https://360.lexisnexis.at/d/rechtsnorm-ris/32_bundesgesetz_mit_dem_das_beamten_dienstrechtsge/b_bgbl_2019_2019_I_32_46c550bf37)), +which aligns with [EU Directive 2014/55/EU](https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX%3A32014L0055). +These laws mandate that all businesses engaged in {abbr}`B2G (business-to-government)` transactions +must use e-invoicing, and increasingly, e-invoicing is encouraged for B2B transactions to improve +tax compliance and transparency. + +## Compliance with Austrian 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 format**: Odoo supports standard e-invoice formats such as PDF with digital signatures + and XML in {abbr}`UBL (Universal Business Language)` format, which are fully compatible with + e-rechnung.gv.at, Austria's central electronic invoicing platform for public procurement + transactions. Any platform can be used if connected to the authentication services of the Federal + Service Portal ({abbr}`USP (Unternehmensserviceportal)`) e-rechnung.gv.at for e-invoicing + transmission. +- **Secure storage and retrieval**: In accordance with the Austrian requirement to store invoices + for a minimum of seven years, Odoo securely archives all invoices in a tamper-proof system, + ensuring that they can be easily retrieved during audits. +- **Automatic VAT calculation and reporting**: Odoo Invoicing helps businesses stay in line with + Austrian VAT requirements by automatically calculating and including VAT in invoices and ensuring + that each invoice follows the legal format for B2B and {abbr}`B2G (business-to-government)` + transactions. + +:::{seealso} +{doc}`Austria fiscal localization documentation <../../../fiscal_localizations/austria>` +::: + +:::{admonition} Disclaimer +This page provides an overview of Austrian e-invoicing laws and how Odoo Invoicing supports +compliance with the Austrian VAT Act (UStG) and related regulations. It does does not constitute +legal advice. We recommend consulting with a tax advisor or legal professional familiar with +Austrian e-invoicing regulations to ensure full compliance tailored to your specific business +requirements. +::: + diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/basque_country.md b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/basque_country.md new file mode 100644 index 000000000..79857c6a2 --- /dev/null +++ b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/basque_country.md @@ -0,0 +1,49 @@ +--- +orphan: true +--- + +# Odoo electronic invoicing in the Basque Country + +Odoo Invoicing is your trusted partner for safe, efficient, and legally compliant e-invoicing +solutions tailored to meet Basque Country's regulatory standards. + +## Legal framework for e-invoicing in the Basque Country + +In the Basque Country, electronic invoicing is governed by Spanish national legislation and regional +implementations, including the [Ley de Facturación Electrónica](https://www.facturae.gob.es/face/Paginas/FACE.aspx) +and compliance with [EU Directive 2014/55/EU](https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX%3A32014L0055). +For {abbr}`B2G (business-to-government)` transactions, e-invoicing is mandatory, and suppliers must +submit e-invoices through the FACe platform or the regional system, e-Factura Euskadi, specifically +designed for the Basque Country. These platforms ensure the secure submission of invoices to public +administrations. While B2B e-invoicing is not yet mandatory, its use is growing, supported by the +implementation of the TicketBAI system, which is specific to the Basque Country and promotes tax +transparency. + +## Compliance with Basque e-invoicing regulations + +Odoo Invoicing is fully prepared to help businesses meet the Basque Country's e-invoicing +requirements while complying with broader Spanish and EU standards. Here is how Odoo ensures +compliance: + +- **Supported formats**: Odoo supports formats such as Facturae XML, required for compliance with + the FACe and e-Factura Euskadi platforms. Additionally, Odoo integrates with the TicketBAI system, + ensuring all invoices meet the technical and legal standards for secure submission to tax + authorities. Odoo enables businesses to submit e-invoices seamlessly to the FACe platform for + national compliance and the e-Factura Euskadi system for regional public administration + transactions. Furthermore, Odoo supports compliance with the TicketBAI initiative, specific to the + Basque Country. +- **Secure storage and retrieval**: In accordance with regulations requiring invoices to be stored + for a minimum of 6 years, Odoo provides a secure, tamper-proof archive for all invoices, allowing + easy access for audits and tax reviews. +- **Automatic VAT calculation and reporting**: Odoo Invoicing automates VAT calculations, ensuring + invoices adhere to Basque Country VAT requirements for B2G and B2B transactions while facilitating + compliance with the SII (Immediate Supply of Information) system for real-time VAT reporting. + +:::{admonition} Disclaimer +This page provides an overview of e-invoicing laws in the Basque Country and how Odoo Invoicing +supports compliance with the Ley de Facturación Electrónica, e-Factura Euskadi, TicketBAI system, +and FACe platform. It is not intended as legal advice. We recommend consulting with a tax advisor +or legal professional familiar with e-invoicing regulations in the Basque Country to ensure +compliance tailored to your specific business needs. +::: + diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/belgium.md b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/belgium.md new file mode 100644 index 000000000..d6b41b863 --- /dev/null +++ b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/belgium.md @@ -0,0 +1,52 @@ +--- +orphan: true +--- + +# Odoo electronic invoicing in Belgium + +Odoo Invoicing is your trusted partner for safe, efficient, and legally compliant e-invoicing +solutions tailored to Belgium's regulatory standards, and compatible with the European [Peppol](https://peppol.org/about/) framework. + +## Legal framework for e-invoicing in Belgium + +In Belgium, businesses must adhere to e-invoicing laws that ensure secure, authentic, and storable +transactions. The primary regulation governing e-invoicing requirements in Belgium is the [Belgian +VAT Code](https://finances.belgium.be/fr/sur_le_spf/r%C3%A9glementation/r%C3%A9glementation-2023/tva) +and its related [e-invoicing standards for public procurement](https://www.ejustice.just.fgov.be/cgi_loi/article.pl?language=fr&sum_date=&pd_search=2023-09-21&numac_search=2023045155&page=1&lg_txt=F&caller=list&2023045155=0&trier=promulgation&fr=f&nm_ecran=2023045155&choix1=et&choix2=et), +which align with [EU Directive 2014/55/EU](https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX%3A32014L0055). +These laws mandate that all businesses engaged in {abbr}`B2G (business-to-government)` transactions +must use e-invoicing via Mercurius, Belgium's official electronic invoicing platform for public +procurement transactions. Additionally, Belgium is part of the Peppol network, which provides a +standardized framework for cross-border e-invoicing across Europe. Increasingly, e-invoicing is also +encouraged for B2B transactions to enhance tax compliance and transparency. + +## Compliance with Belgian 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: + +- **Peppol-compliant formats**: Odoo supports the standardized XML ({abbr}`UBL (Universal Business + Language)`) format for Peppol, ensuring compliance with both Belgian and European e-invoicing + standards. This ensures your invoices meet the legal requirements for public procurement in + Belgium and other EU countries. Odoo enables businesses to send e-invoices directly to government + entities in compliance with Belgian regulations through Belgium’s Mercurius platform for public + procurement. +- **Secure storage and retrieval**: In accordance with Belgian requirements to store invoices for a + minimum of seven years, Odoo securely archives all invoices in a tamper-proof system, ensuring + that they can be easily retrieved during audits. +- **Automatic VAT calculation and reporting**: Odoo Invoicing helps businesses comply with Belgian + VAT requirements by automatically calculating and including VAT in invoices and ensuring that each + invoice follows the legal format for B2B and {abbr}`B2G (business-to-government)` transactions. + +:::{seealso} +{doc}`Belgium fiscal localization documentation <../../../fiscal_localizations/belgium>` +::: + +:::{admonition} Disclaimer +This page provides an overview of Belgian e-invoicing laws and how Odoo Invoicing supports +compliance with the Belgian VAT Code, Peppol standards, and related regulations. It does not +constitute legal advice. We recommend consulting with a tax advisor or legal professional +familiar with Belgian e-invoicing regulations to ensure full compliance tailored to your specific +business requirements. +::: + diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/brazil.md b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/brazil.md new file mode 100644 index 000000000..776e55f2d --- /dev/null +++ b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/brazil.md @@ -0,0 +1,53 @@ +--- +orphan: true +--- + +# Odoo electronic invoicing in Brazil + +Odoo Invoicing is your trusted partner for safe, efficient, and legally compliant e-invoicing +solutions tailored to meet Brazil's regulatory standards and compatible with the requirements set +forth by the [Secretaria da Fazenda (SEFAZ)](https://www.gov.br/receitafederal/pt-br). + +## Legal framework for e-invoicing in Brazil + +In Brazil, e-invoicing is highly regulated and mandatory for most businesses to ensure tax +compliance and transparency. The key regulations governing e-invoicing include: + +- {abbr}`NF-e (Nota Fiscal Eletrônica)`: A mandatory e-invoice for goods and services used in B2B + and {abbr}`B2G (business-to-government)` transactions. +- {abbr}`CT-e (Conhecimento de Transporte Eletrônico)`: Specific to freight and logistics services. +- {abbr}`NFS-e (Nota Fiscal de Serviços Eletrônica)`: Issued for service-based transactions, with + implementation varying by municipality. +- Integration with {abbr}`SEFAZ (Secretaria da Fazenda)`: Every electronic invoice must be + authorized by {abbr}`SEFAZ (Secretaria da Fazenda)` and issued with a unique authorization code + (Autorização de Uso). + +## Compliance with Brazilian e-invoicing regulations + +Odoo Invoicing simplifies the process of adhering to Brazil’s complex e-invoicing regulations, +offering features designed to ensure compliance: + +- **Supported formats**: Odoo supports Brazil's authorized e-invoice formats, including {abbr}`NF-e + (Nota Fiscal Eletrônica)` for goods and services compliant with {abbr}`SEFAZ (Secretaria da + Fazenda)`, {abbr}`NFS-e (Nota Fiscal de Serviços Eletrônica)` customizable for municipal + requirements, {abbr}`CT-e (Conhecimento de Transporte Eletrônico)` for logistics and + transportation, and digital PDF invoices with {abbr}`SEFAZ (Secretaria da Fazenda)` authorization + codes and QR codes. +- **Secure storage and retrieval**: Complying with Brazil's five-year storage requirement, Odoo + offers tamper-proof archiving for easy retrieval during audits or inspections. +- **Automatic tax calculation and reporting**: Odoo automates tax calculations for ICMS, IPI, and + ISS, ensuring compliance with regional tax rules and generating reports compatible with + {abbr}`SEFAZ (Secretaria da Fazenda)` and municipal requirements. + +:::{seealso} +{doc}`Brazilian fiscal localization documentation <../../../fiscal_localizations/brazil>` +::: + +:::{admonition} Disclaimer +This page provides a general overview of Brazilian e-invoicing laws and how Odoo’s invoicing +module supports compliance with {abbr}`SEFAZ (Secretaria da Fazenda)` regulations. It is not +intended as legal advice. We recommend consulting with a tax advisor or legal professional +familiar with Brazilian e-invoicing regulations to ensure compliance tailored to your specific +business needs. +::: + diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/chile.md b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/chile.md new file mode 100644 index 000000000..92c22bcbb --- /dev/null +++ b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/chile.md @@ -0,0 +1,51 @@ +--- +orphan: true +--- + +# Odoo electronic invoicing in Chile + +Odoo Invoicing is your trusted partner for safe, efficient, and legally compliant e-invoicing +solutions tailored to meet Chile's regulatory requirements and compatible with standards set by the +[Servicio de Impuestos Internos (SII)](https://homer.sii.cl/). + +## Legal framework for e-invoicing in Chile + +Chile is a pioneer in mandatory electronic invoicing, with comprehensive regulations to ensure tax +compliance and enhance transparency. Key elements include: + +- **Factura Electrónica**: Mandatory for most businesses to issue invoices digitally through the + {abbr}`SII (Servicio de Impuestos Internos)`'s system. +- **Boleta Electrónica**: Required for retail transactions to report sales and tax information. +- **Guía de Despacho Electrónica**: Necessary for tracking the transport of goods. +- **Integration with SII**: All electronic invoices must be validated by the {abbr}`SII (Servicio + de Impuestos Internos)`, assigned a unique Folio authorization code, and reported for tax + purposes. + +## Compliance with Chilean e-invoicing regulations + +Odoo Invoicing simplifies adherence to Chile's e-invoicing requirements with features designed to +ensure compliance: + +- **Supported formats**: Odoo supports all major Chilean e-invoice formats, including Factura + Electrónica, Boleta Electrónica, and Guía de Despacho Electrónica, ensuring {abbr}`SII (Servicio + de Impuestos Internos)` compatibility with digital validation and Folio assignment. +- **Integration with SII**: Odoo seamlessly connects with {abbr}`SII (Servicio de Impuestos + Internos)`'s systems, automating invoice submission and ensuring real-time validation for + compliant issuance. +- **Secure storage and retrieval**: Complying with Chile's mandatory storage period of six years, + Odoo provides tamper-proof archiving for invoices, enabling easy access for audits or tax + inspections. +- **Automatic tax calculation and reporting**: Odoo automates calculations for VAT (IVA) and other + applicable taxes, ensuring accurate invoicing and adherence to Chile's tax reporting standards. + +:::{seealso} +{doc}`Chilean fiscal localization documentation <../../../fiscal_localizations/chile>` +::: + +:::{admonition} Disclaimer +This page provides a general overview of Chilean e-invoicing laws and how Odoo supports +compliance with {abbr}`SII (Servicio de Impuestos Internos)` regulations. It is not intended as +legal or tax advice. We recommend consulting a tax advisor or legal professional familiar with +Chilean e-invoicing regulations to ensure compliance tailored to your specific business needs. +::: + diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/colombia.md b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/colombia.md new file mode 100644 index 000000000..f60759382 --- /dev/null +++ b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/colombia.md @@ -0,0 +1,50 @@ +--- +orphan: true +--- + +# Odoo electronic invoicing in Colombia + +Odoo Invoicing is your trusted partner for safe, efficient, and legally compliant e-invoicing +solutions tailored to meet Colombia's regulatory requirements and fully compatible with the +guidelines established by the [Dirección de Impuestos y Aduanas Nacionales (DIAN)](https://www.dian.gov.co/). + +## Legal framework for e-invoicing in Colombia + +Colombia has implemented mandatory e-invoicing for most businesses to enhance tax compliance and +improve transparency. Key elements include: + +- **Factura Electrónica**: Mandatory for B2B, B2C, and {abbr}`B2G (business-to-government)` + transactions, requiring compliance with {abbr}`DIAN (Dirección de Impuestos y Aduanas + Nacionales)`'s technical specifications. +- **Integration with DIAN**: All electronic invoices must be submitted to {abbr}`DIAN (Dirección de + Impuestos y Aduanas Nacionales)` for validation, where they are assigned a unique {abbr}`CUFE + (Código Único de Factura Electrónica)` authorization code. +- **Adoption of XML Standards**: Colombian e-invoicing uses XML as the standard format for + electronic invoices, ensuring interoperability and standardized reporting. + +## Compliance with Colombian e-invoicing regulations + +Odoo Invoicing simplifies the complexities of e-invoicing compliance in Colombia, offering tailored +features: + +- **Supported formats**: Odoo supports Factura Electrónica in {abbr}`DIAN (Dirección de Impuestos y + Aduanas Nacionales)`-compliant XML formats, including legally required {abbr}`CUFE (Código Único + de Factura Electrónica)` codes and additional fields for B2B, B2C, and {abbr}`B2G + (business-to-government)` transactions. +- **Secure storage and retrieval**: In compliance with Colombia's six-year mandatory storage + requirement, Odoo provides tamper-proof invoice archiving, ensuring easy access for audits or + inspections. +- **Automatic tax calculation and reporting**: Odoo automates tax calculations for VAT (IVA) and + other applicable taxes, ensuring accuracy and compliance with DIAN's tax reporting standards. + +:::{seealso} +{doc}`Colombian fiscal localization documentation <../../../fiscal_localizations/colombia>` +::: + +:::{admonition} Disclaimer +This page provides a general overview of Colombian e-invoicing regulations and how Odoo supports +compliance with DIAN requirements. It is not intended as legal or tax advice. We recommend +consulting with a tax advisor or legal professional familiar with Colombian e-invoicing +regulations to ensure compliance tailored to your specific business needs. +::: + diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/croatia.md b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/croatia.md new file mode 100644 index 000000000..4aa84fa05 --- /dev/null +++ b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/croatia.md @@ -0,0 +1,49 @@ +--- +orphan: true +--- + +# Odoo electronic invoicing in Croatia + +Odoo Invoicing is our trusted partner for safe, efficient, and legally compliant e-invoicing +solutions tailored to Croatia's regulatory standards. + +## Legal framework for e-invoicing in Croatia + +In Croatia, businesses must comply with e-invoicing regulations to ensure secure, authentic, and +storable transactions. The main legal framework governing e-invoicing in Croatia is the +Fiscalization Act and its related requirements for public procurement, which are aligned with [EU +Directive 2014/55/EU](https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX%3A32014L0055) on +e-invoicing in public procurement. Under these regulations, all businesses involved in {abbr}`B2G +(business-to-government)` transactions are required to use electronic invoicing via the {abbr}`CIS +(Central Invoice System)`, Croatia’s official platform for public sector e-invoicing. Croatia is +also part of the Peppol network, facilitating standardized cross-border e-invoicing within the +European Union. Furthermore, e-invoicing is increasingly encouraged for B2B transactions, promoting +greater transparency and tax compliance. + +## Compliance with Croatian 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 standard e-invoice formats, such as PDF with digital + signatures and XML in {abbr}`UBL (Universal Business Language)` format, which are fully compatible + with Croatia's {abbr}`CIS (Central Invoice System)` for public procurement transactions. + Additionally, Odoo enables transmission of e-invoices through any platform connected to the Peppol + network, as the *Servis eRačun za državu* reached via Peppol, ensuring compliance with both + Croatian and EU standards. +- **Secure storage and retrieval**: In accordance with Croatian regulations to store invoices for a + minimum of eleven years, Odoo securely archives all invoices in a tamper-proof system, ensuring + they can be easily retrieved during audits. +- **Automatic VAT calculation and reporting**: Odoo Invoicing helps businesses stay in line with + Croatian VAT requirements by automatically calculating and including VAT in invoices and ensuring + that each invoice follows the legal format for both B2B and {abbr}`B2G (business-to-government)` + transactions. + +:::{admonition} Disclaimer +This page provides an overview of Croatian e-invoicing laws and how Odoo Invoicing supports +compliance with the Fiscalization Act, Peppol standards, and other relevant regulations. It does +not constitute legal adviceWe recommend consulting with a tax advisor or legal professional +familiar with Croatian e-invoicing regulations to ensure compliance tailored to your specific +business needs. +::: + diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/denmark.md b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/denmark.md new file mode 100644 index 000000000..2fcdf84a2 --- /dev/null +++ b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/denmark.md @@ -0,0 +1,46 @@ +--- +orphan: true +--- + +# 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](https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX%3A32014L0055), +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/ecuador.md b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/ecuador.md new file mode 100644 index 000000000..994d3a92e --- /dev/null +++ b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/ecuador.md @@ -0,0 +1,49 @@ +--- +orphan: true +--- + +# Odoo electronic invoicing in Ecuador + +Odoo Invoicing is your trusted partner for safe, efficient, and legally compliant e-invoicing +solutions tailored to meet Ecuador's regulatory requirements and fully compatible with the +guidelines established by the [Servicio de Rentas Internas (SRI)](https://www.sri.gob.ec/web/intersri/home). + +## Legal framework for e-invoicing in Ecuador + +Ecuador has implemented mandatory electronic invoicing for most businesses aimed to enhance tax +compliance and transparency. Key elements include: + +- **Factura Electrónica**: All businesses must issue electronic invoices in XML format for B2B, B2C, + and {abbr}`B2G (business-to-government)` transactions, ensuring compliance with {abbr}`SRI + (Servicio de Rentas Internas)`'s technical specifications. +- **Transmission Requirements**: E-invoices must be transmitted to the SRI within 24 hours of + issuance. +- **Record Storage**: E-invoices, including the {abbr}`SRI (Servicio de Rentas Internas)`'s + acceptance messages, must be stored for a minimum of seven years. + +## Compliance with Ecuadorian e-invoicing regulations + +Odoo Invoicing simplifies compliance with Ecuador's e-invoicing requirements by offering tailored +features: + +- **Supported formats**: Odoo supports the Ecuadorian e-invoice format (XML) and ensures + compatibility with the {abbr}`SRI (Servicio de Rentas Internas)`'s system for validation and + authorization, including the necessary digital signature. +- **Secure storage and retrieval**: In compliance with Ecuador's seven-year storage requirement, + Odoo offers tamper-proof archiving so that invoices can be easily accessed during audits or + inspections. +- **Automatic tax calculation and reporting**: Odoo automates tax calculations for VAT (IVA) and + other applicable taxes, ensuring accurate invoicing and adherence to Ecuador's tax reporting + standards. + +:::{seealso} +{doc}`Ecuadorian fiscal localization documentation <../../../fiscal_localizations/ecuador>` +::: + +:::{admonition} Disclaimer +This page provides a general overview of Ecuadorian e-invoicing regulations and how Odoo supports +compliance with SRI requirements. It is not intended as legal or tax advice. We recommend +consulting with a tax advisor or legal professional familiar with Ecuador's e-invoicing +regulations to ensure compliance tailored to your specific business needs. +::: + diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/estonia.md b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/estonia.md new file mode 100644 index 000000000..b62cb899e --- /dev/null +++ b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/estonia.md @@ -0,0 +1,46 @@ +--- +orphan: true +--- + +# Odoo electronic invoicing in Estonia + +Odoo Invoicing is your trusted partner for safe, efficient, and legally compliant e-invoicing +solutions tailored to Estonia's regulatory standards. + +## Legal framework for e-invoicing in Estonia + +In Estonia, businesses must comply with e-invoicing regulations to ensure secure, authentic, and +storable transactions. The main legal framework governing e-invoicing in Estonia is the [Accounting +Act](https://www.riigiteataja.ee/en/eli/ee/514052021001/consolide/current) and its provisions +related to e-invoicing, which align with [EU Directive 2014/55/EU](https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX%3A32014L0055) +on e-invoicing in public procurement. Since 2019, {abbr}`B2G (business-to-government)` transactions +must use electronic invoices via Estonia's Rik's e-Invoicing System, the government's platform for +public sector e-invoicing. Estonia is also part of the Peppol network, which ensures standardized +cross-border e-invoicing across Europe. Additionally, the use of e-invoicing is encouraged for B2B +transactions, promoting better transparency, efficiency, and compliance with VAT requirements. + +## Compliance with Estonian 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 standard e-invoice formats, such as XML in {abbr}`UBL + (Universal Business Language)` format, which is fully compatible with Estonia's Rik’s e-Invoicing + System for public procurement transactions. Additionally, Odoo enables seamless transmission of + e-invoices through platforms connected to the Peppol network, ensuring compliance with Estonian + and EU e-invoicing standards. +- **Secure storage and retrival**: In accordance with Estonian regulations to store invoices for a + minimum of seven years, Odoo securely archives all invoices in a tamper-proof system, making them + easily retrievable during audits. +- **Automatic VAT calculation and reporting**: Odoo Invoicing automates VAT calculations and ensures + invoices are formatted to meet Denmark’s legal requirements for {abbr}`B2G + (business-to-government)` and B2B transactions, helping businesses compliant with local tax laws. + +:::{admonition} Disclaimer +This page provides an overview of Estonian e-invoicing laws and how Odoo Invoicing supports +compliance with the Accounting Act, Peppol standards, and other relevant regulations. It does not +constitute legal advice. We recommend consulting with a tax advisor or legal professional +familiar with Estonian e-invoicing regulations to ensure compliance tailored to your specific +business needs. +::: + diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/finland.md b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/finland.md new file mode 100644 index 000000000..765a671bd --- /dev/null +++ b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/finland.md @@ -0,0 +1,46 @@ +--- +orphan: true +--- + +# Odoo electronic invoicing in Finland + +Odoo Invoicing is your trusted partner for safe, efficient, and legally compliant e-invoicing +solutions tailored to Finland's regulatory standards. + +## Legal framework for e-invoicing in Finland + +In Finland, businesses must comply with e-invoicing regulations to ensure secure, authentic, and +storable transactions. The primary legal framework governing e-invoicing is the [Act on Electronic +Invoicing (241/2019)](https://www.finlex.fi/fi/laki/alkup/2019/20190241#Pidp446241968), which +aligns with [EU Directive 2014/55/EU](https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX%3A32014L0055) +on electronic invoicing in public procurement. Under Finnish law, all {abbr}`B2G +(business-to-government)` transactions require the use of electronic invoices via Apix Messaging or +other Peppol-connected platforms, Finland’s standard for public sector e-invoicing. Finland is also +part of the Peppol network, ensuring interoperability and standardization for cross-border +e-invoicing within the EU. Additionally, e-invoicing is widely adopted for B2B transactions, +promoting efficient processes and improved tax compliance. + +## 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. +- **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. +- **Automatic VAT calculation and reporting**: Odoo Invoicing ensures compliance with Finnish VAT + requirements by automatically calculating and including VAT in invoices and formatting them to + meet the legal standards for both B2B and {abbr}`B2G (business-to-government)` transactions. + +:::{admonition} Disclaimer +This page provides an overview of Finnish e-invoicing laws and how Odoo Invoicing supports +compliance with the Act on Electronic Invoicing, Peppol standards, and other relevant +regulations. It is not intended as legal advice. We recommend consulting with a tax advisor or +legal professional familiar with Finnish e-invoicing regulations to ensure compliance tailored to +your specific business needs. +::: + diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/france.md b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/france.md new file mode 100644 index 000000000..f66325fea --- /dev/null +++ b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/france.md @@ -0,0 +1,49 @@ +--- +orphan: true +--- + +# 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](https://www.legifrance.gouv.fr/jorf/id/JORFTEXT000038410002), which is aligned with [EU Directive +2014/55/EU](https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX%3A32014L0055), 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.md b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/germany.md new file mode 100644 index 000000000..e3838b488 --- /dev/null +++ b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/germany.md @@ -0,0 +1,47 @@ +--- +orphan: true +--- + +# 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](https://www.bgbl.de/xaver/bgbl/start.xav?start=%2F%2F*%5B%40attr_id%3D%27bgbl117s0770.pdf%27%5D#__bgbl__%2F%2F*%5B%40attr_id%3D%27bgbl117s0770.pdf%27%5D__1733401471138), +which is aligned with [EU Directive 2014/55/EU](https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX%3A32014L0055), +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/hungary.md b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/hungary.md new file mode 100644 index 000000000..64250f54e --- /dev/null +++ b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/hungary.md @@ -0,0 +1,45 @@ +--- +orphan: true +--- + +# Odoo electronic invoicing in Hungary + +Odoo Invoicing is your trusted partner for safe, efficient, and legally compliant e-invoicing +solutions tailored to Hungary's regulatory standards. + +## Legal framework for e-invoicing in Hungary + +In Hungary, businesses must adhere to e-invoicing regulations to ensure secure, authentic, and +storable transactions. The primary legal framework is the Hungarian VAT Act (Act CXXVII of 2007), +which mandates real-time reporting of invoices to the NAV Online invoice system, Hungary's +government e-invoicing platform. As of 2021, all B2B and B2C invoices must be reported in real-time, +regardless of value. Hungary's regulations do not currently require {abbr}`B2G +(business-to-government)` e-invoicing, but public sector invoicing is encouraged via the Peppol +network. Common formats for e-invoicing include XML for NAV submissions and other structured formats +to streamline compliance. + +## Compliance with Hungarian e-invoicing regulations + +Odoo invoicing module is designed to help businesses meet Hungary's e-invoicing and VAT reporting +requirements. Here is how Odoo ensures compliance: + +- **Supported Formats**: Odoo supports the standardized XML format required for integration with the + NAV (Nemzeti Adó és Vámhivatal) Online Invoice System, ensuring seamless real-time invoice + reporting. The module also supports formats compatible with Peppol for cross-border transactions, + promoting compliance with EU e-invoicing standards. Odoo enables businesses to automatically + report invoices to the Hungarian tax authorities in real-time, as required by law. +- **Secure storage and retrieval**: In accordance with Hungarian regulations, which mandate storing + invoices for a minimum of eight years, Odoo securely archives all invoices in a tamper-proof + system, allowing for easy retrieval during audits. +- **Automatic VAT calculation and reporting**: Odoo Invoicing automates VAT calculations and ensures + invoices meet the strict requirements of the Hungarian VAT Act, simplifying compliance for B2B and + B2C transactions. + +:::{admonition} Disclaimer +This page provides an overview of Hungarian e-invoicing laws and how Odoo Invoicing supports +compliance with the Hungarian VAT Act, NAV Online Invoice System, Peppol standards, and other +relevant regulations. It does not constitute legal advice. We recommend consulting with a tax +advisor or legal professional familiar with Hungarian e-invoicing regulations to ensure +compliance tailored to your specific business needs. +::: + diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/ireland.md b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/ireland.md new file mode 100644 index 000000000..dba8e61ac --- /dev/null +++ b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/ireland.md @@ -0,0 +1,45 @@ +--- +orphan: true +--- + +# Odoo electronic invoicing in Ireland + +Odoo Invoicing is your trusted partner for safe, efficient, and legally compliant e-invoicing +solutions tailored to Ireland's regulatory standards. + +## Legal framework for e-invoicing in Ireland + +In Ireland, businesses must comply with e-invoicing regulations to ensure secure, authentic, and +storable transactions. The legal framework for e-invoicing is primarily shaped by [EU Directive +2014/55/EU](https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX%3A32014L0055), which +mandates the use of electronic invoicing in {abbr}`B2G (business-to-government)` transactions. Irish +public sector bodies must accept electronic invoices that comply with the European Standard EN +16931\. E-invoicing in the public sector is facilitated through the Peppol network, providing a +streamlined and standardized platform for invoicing. While not mandatory for B2B transactions, +e-invoicing is increasingly encouraged to enhance efficiency, transparency, and compliance. + +## Compliance with Irish e-invoicing regulations + +Odoo Invoicing is equipped to meet Ireland's e-invoicing requirements, ensuring businesses +can operate with confidence. Here is how Odoo ensures compliance: + +- **Supported formats**: Odoo supports the XML and {abbr}`UBL (Universal Business Language)` formats + required for Peppol compliance and ensures compatibility with the European Standard EN 16931, + which is the basis for public sector e-invoicing in Ireland. Odoo seamlessly integrates with the + Peppol network, enabling businesses to send compliant e-invoices directly to Irish public sector + bodies and facilitating cross-border invoicing in line with EU standards. +- **Secure storage and retrieval**: In accordance with Irish regulations that require businesses to + retain invoices for a minimum of six years, Odoo securely archives all invoices in a tamper-proof + system, ensuring they can be easily accessed during audits or inspections. +- **Automatic VAT calculation and reporting**: Odoo Invoicing ensures full compliance with Irish VAT + regulations by automatically calculating and including VAT in invoices, while formatting them to + meet the legal requirements for both B2B and {abbr}`B2G (business-to-government)` transactions. + +:::{admonition} Disclaimer +This page provides an overview of Irish e-invoicing laws and how Odoo Invoicing supports +compliance with EU Directive 2014/55/EU, Peppol standards, and other relevant regulations. It +does not constitute legal advice. We recommend consulting with a tax advisor or legal +professional familiar with Irish e-invoicing regulations to ensure compliance tailored to your +specific business needs. +::: + diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/italy.md b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/italy.md new file mode 100644 index 000000000..b10bc42ef --- /dev/null +++ b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/italy.md @@ -0,0 +1,50 @@ +--- +orphan: true +--- + +# Odoo electronic invoicing in Italy + +Odoo Invoicing is your trusted partner for safe, efficient, and legally compliant e-invoicing +solutions tailored to Italy's regulatory standards. + +## Legal framework for e-invoicing in Italy + +Italy has one of the most advanced e-invoicing frameworks in Europe, governed by the [Italian budget +law](https://www.gazzettaufficiale.it/eli/id/2022/12/29/22G00211/sg) and regulations issued by the +Agenzia delle Entrate. Since 2019, e-invoicing is mandatory for B2B, B2C, and {abbr}`B2G +(business-to-government)` transactions. All e-invoices must be submitted through the {abbr}`Sdi +(Sistema di Interscambio)`, the Italian government's centralized exchange system. The format for +e-invoices is FatturaPA, a structured XML format specifically designed for compliance with Italian +regulations. As part of its compliance with [EU Directive 2014/55/EU](https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX%3A32014L0055), +Italy also supports Peppol standards for cross-border e-invoicing. + +## Compliance with Italian e-invoicing regulations + +Odoo Invoicing is fully equipped to meet Italy's e-invoicing requirements. Here is how Odoo ensures +compliance: + +- **Supported formats**: Odoo supports the FatturaPA XML format required by the {abbr}`Sdi (Sistema + di Interscambio)` for all domestic e-invoices, as well as {abbr}`UBL (Universal Business + Language)` XML for cross-border invoicing via the Peppol network, ensuring compliance with both + Italian and EU standards. Odoo has an easy access to the {abbr}`Sdi (Sistema di Interscambio)` + platform, allowing businesses to send, validate, and track invoices in real-time, ensuring + seamless compliance with Italian regulations. +- **Secure storage and retrieval**: In accordance with Italian law, which requires invoices to be + stored for a minimum of ten years, Odoo securely archives all invoices in a tamper-proof system, + ensuring they can be easily retrieved for audits or inspections. +- **Automatic VAT calculation and reporting**: Odoo Invoicing automates VAT calculations and ensures + invoices adhere to the strict formatting and reporting requirements of Italian law for B2B, B2C, + and {abbr}`B2G (business-to-government)` transactions. + +::::{seealso} +> {doc}`Italy fiscal localization documentation <../../../fiscal_localizations/italy>` + +:::{admonition} Disclaimer +This page provides an overview of Italian e-invoicing laws and how Odoo Invoicing supports +compliance with the Italian Budget Law, {abbr}`Sdi (Sistema di Interscambio)`, FatturaPA format, +Peppol standards, and other relevant regulations. It does not constitute legal advice. We +recommend consulting with a tax advisor or legal professional familiar with Italian e-invoicing +regulations to ensure compliance tailored to your specific business needs. +::: +:::: + diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/latvia.md b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/latvia.md new file mode 100644 index 000000000..64cfa9f21 --- /dev/null +++ b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/latvia.md @@ -0,0 +1,44 @@ +--- +orphan: true +--- + +# Odoo electronic invoicing in Latvia + +Odoo Invoicing is your trusted partner for safe, efficient, and legally compliant e-invoicing +solutions tailored to Latvia's regulatory standards. + +## Legal framework for e-invoicing in Latvia + +In Latvia, electronic invoicing is governed by the [Law on Accounting](https://eur-lex.europa.eu/legal-content/LV/TXT/PDF/?uri=CELEX:72014L0055LVA_270633) +and regulations aligned with [EU Directive 2014/55/EU](https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX%3A32014L0055), +mandating the use of e-invoicing in {abbr}`B2G (business-to-government)` transactions. All public +sector invoices must be sent in the European Standard EN 16931 format through platforms such as +eInvoicing.lv, Latvia’s official e-invoicing infrastructure. Latvia is also connected to the Peppol +network, facilitating standardized cross-border e-invoicing across the European Union. + +## Compliance with Latvian e-invoicing regulations + +Odoo Invoicing is designed to help businesses comply with Latvia's specific e-invoicing +requirements. Here is how Odoo ensures compliance: + +- **Supported formats**: Odoo supports the XML {abbr}`UBL (Universal Business Language)` format, + compliant with European Standard EN 16931, which is required for public sector e-invoicing in + Latvia. Odoo also facilitates e-invoicing through the Peppol network, ensuring seamless + cross-border compatibility. Odoo integrates with Latvian e-invoicing platforms, such as + eInvoicing.lv, allowing businesses to send compliant e-invoices directly to government entities + while adhering to legal standards. +- **Secure storage and retrieval**: In accordance with Latvian regulations requiring invoices to be + stored for a minimum of five years, Odoo securely archives all invoices in a tamper-proof system, + ensuring they can be easily accessed during audits or inspections. +- **Automatic VAT calculation and reporting**: Odoo Invoicing automates VAT calculations and ensures + invoices adhere to the legal requirements for {abbr}`B2G (business-to-government)` and B2B + transactions, helping businesses comply with Latvian VAT laws. + +:::{admonition} Disclaimer +This page provides an overview of Latvian e-invoicing laws and how Odoo Invoicing supports +compliance with the Law on Accounting, European Standard EN 16931, eInvoicing.lv, Peppol +standards, and other relevant regulations. It does not constitute legal advice. We recommend +consulting with a tax advisor or legal professional familiar with Latvian e-invoicing regulations +to ensure compliance tailored to your specific business needs. +::: + diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/lithuania.md b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/lithuania.md new file mode 100644 index 000000000..90edf5b73 --- /dev/null +++ b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/lithuania.md @@ -0,0 +1,45 @@ +--- +orphan: true +--- + +# Odoo electronic invoicing in Lithuania + +Odoo Invoicing is your trusted partner for safe, efficient, and legally compliant e-invoicing +solutions tailored to Lithuania's regulatory standards. + +## Legal framework for e-invoicing in Lithuania + +In Lithuania, e-invoicing is regulated under the [Law on Accounting](https://www.e-tar.lt/portal/lt/legalAct/207ad17030a011e78397ae072f58c508) +and aligned with [EU Directive 2014/55/EU](https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX%3A32014L0055) +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. + +## 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. +- **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. +- **Automatic VAT calculation and reporting**: Odoo Invoicing automates VAT calculations and ensures + invoices meet Lithuania’s VAT requirements for both B2G and B2B transactions, reducing the risk of + non-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. +::: + diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/luxembourg.md b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/luxembourg.md new file mode 100644 index 000000000..cf83eb85c --- /dev/null +++ b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/luxembourg.md @@ -0,0 +1,47 @@ +--- +orphan: true +--- + +# Odoo electronic invoicing in Luxembourg + +Odoo Invoicing is your trusted partner for safe, efficient, and legally compliant e-invoicing +solutions tailored to Luxembourg's regulatory standards. + +## Legal framework for e-invoicing in Luxembourg + +In Luxembourg, e-invoicing is regulated in accordance with [EU Directive 2014/55/EU](https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX%3A32014L0055), +requiring the use of electronic invoicing in {abbr}`B2G (business-to-government)` transactions. +Public sector entities in Luxembourg must accept e-invoices in the European Standard EN 16931 +format. The government supports e-invoicing through the Peppol network, ensuring streamlined +communication and compliance for cross-border transactions. While e-invoicing is not yet mandatory +for B2B transactions, its adoption is encouraged to promote operational efficiency and tax +compliance across industries. + +## Compliance with Luxembourgish e-invoicing regulations + +Odoo invoicing is equipped to support businesses in adhering to Luxembourg's e-invoicing standards. +Here is how Odoo ensures compliance: + +- **Supported formats**: Odoo supports the XML {abbr}`UBL (Universal Business Language)` format, + compliant with European Standard EN 16931, meeting the requirements for public sector e-invoicing + in Luxembourg. It also facilitates e-invoicing through the Peppol network, ensuring + interoperability for cross-border invoicing. +- **Secure storage and retrieval**: In line with Luxembourg’s requirement to retain invoices for a + minimum of ten years, Odoo securely archives all invoices in a tamper-proof system, ensuring easy + access during audits or inspections. +- **Automatic VAT calculation and reporting**: Odoo Invoicing ensures full compliance with + Luxembourg's VAT regulations by automating VAT calculations and formatting invoices to meet the + legal standards for {abbr}`B2G (business-to-government)` and B2B transactions. + +:::{seealso} +{doc}`Luxembourg fiscal localization documentation <../../../fiscal_localizations/luxembourg>` +::: + +:::{admonition} Disclaimer +This page provides an overview of Luxembourg's e-invoicing laws and how Odoo Invoicing supports +compliance with EU Directive 2014/55/EU, European Standard EN 16931, Peppol standards, and other +relevant regulations. It does not constitute legal advice. We recommend consulting with a tax +advisor or legal professional familiar with Luxembourg’s e-invoicing regulations to ensure +compliance tailored to your specific business needs. +::: + diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/mexico.md b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/mexico.md new file mode 100644 index 000000000..ac27944e8 --- /dev/null +++ b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/mexico.md @@ -0,0 +1,57 @@ +--- +orphan: true +--- + +# Odoo electronic invoicing in Mexico + +Odoo Invoicing is your trusted partner for safe, efficient, and legally compliant e-invoicing +solutions tailored to meet Mexico's regulatory requirements and fully compatible with the guidelines +established by the {abbr}`SAT (Servicio de Administración Tributaria)`. + +## Legal framework for e-invoicing in Mexico + +Mexico has one of the most advanced e-invoicing systems globally, with electronic invoicing +{abbr}`CFDI (Comprobante Fiscal Digital por Internet)` being mandatory for most taxpayers. Key +elements include: + +- **CFDI**: A mandatory electronic invoice format for B2B, B2C, and {abbr}`B2G + (business-to-government)` transactions, fully compliant with SAT requirements. +- **Digital tax receipt validation**: All {abbr}`CFDIs (Comprobante Fiscal Digital por Internet)` + must be digitally signed and validated by {abbr}`SAT (Servicio de Administración + Tributaria)`-authorized {abbr}`PACs (authorized certification providers)` before issuance. +- **Complementos**: Specific complements are required for certain transaction types, such as + payroll or foreign trade. +- **XML Format**: The XML format is mandatory, ensuring interoperability and compliance with + {abbr}`SAT (Servicio de Administración Tributaria)`'s technical standards. + +## Compliance with Mexican e-invoicing regulations + +Odoo Invoicing simplifies compliance with Mexico’s e-invoicing requirements by offering tailored +features: + +- **Supported formats**: Odoo supports {abbr}`CFDI (Comprobante Fiscal Digital por Internet)` in + {abbr}`SAT (Servicio de Administración Tributaria)`-compliant XML formats, including all + mandatory fields, digital signatures, and complements for specialized transactions. +- **Integration with PACs**: Odoo integrates with {abbr}`SAT (Servicio de Administración + Tributaria)`-authorized {abbr}`PACs (authorized certification providers)` to automate the + validation, certification, and issuance of {abbr}`CFDIs (Comprobante Fiscal Digital por + Internet)`, ensuring real-time compliance. +- **Secure storage and retrieval**: In compliance with Mexico's five-year mandatory storage + requirement, Odoo provides tamper-proof archiving for easy access to invoices during audits + or inspections. +- **Automatic tax calculation and reporting**: Odoo automates tax calculations for VAT (IVA) and + other applicable taxes, ensuring accuracy and compliance with {abbr}`SAT (Servicio de + Administración Tributaria)`'s tax reporting standards. + +:::{seealso} +{doc}`Mexican fiscal localization documentation <../../../fiscal_localizations/mexico>` +::: + +:::{admonition} Disclaimer +This page provides a general overview of Mexican e-invoicing regulations and how Odoo supports +compliance with {abbr}`SAT (Servicio de Administración Tributaria)` requirements. It is not +intended as legal or tax advice. We recommend consulting with a tax advisor or legal professional +familiar with Mexico's e-invoicing regulations to ensure compliance tailored to your specific +business needs. +::: + diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/netherlands.md b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/netherlands.md new file mode 100644 index 000000000..fd0e3691d --- /dev/null +++ b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/netherlands.md @@ -0,0 +1,46 @@ +--- +orphan: true +--- + +# Odoo electronic invoicing in the Netherlands + +Odoo Invoicing is your trusted partner for safe, efficient, and legally compliant e-invoicing +solutions tailored to the Netherlands' regulatory standards. + +## Legal framework for e-invoicing in the Netherlands + +In the Netherlands, e-invoicing is regulated under [EU Directive 2014/55/EU](https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX%3A32014L0055), +requiring {abbr}`B2G (business-to-government)` transactions to adhere to the European Standard EN +16931\. Public sector entities must accept e-invoices through platforms such as Digipoort, the Dutch +government's official gateway for electronic data exchange. The Netherlands is also a prominent +member of the Peppol network, which enables secure and standardized e-invoicing for cross-border +transactions across Europe. While e-invoicing is not yet mandatory for B2B transactions, it is +strongly encouraged to enhance transparency and efficiency in business processes. + +## Compliance with Dutch e-invoicing regulations + +Odoo invoicing is equipped to support businesses with the Netherlands' e-invoicing requirements. +Here is how Odoo ensures compliance: + +- **Supported formats**: Odoo supports {abbr}`UBL (Universal Business Language)` XML, which is the + standard format for e-invoicing in the Netherlands. It ensures compatibility with both Digipoort + for domestic B2G transactions and the Peppol network for international e-invoicing. +- **Secure storage and retrieval**: In accordance with Dutch regulations, which require businesses + to store invoices for a minimum of seven years, Odoo securely archives all invoices in a + tamper-proof system, ensuring they are accessible during audits or inspections. +- **Automatic VAT calculation and reporting**: Odoo Invoicing automates VAT calculations and formats + invoices to meet Dutch VAT requirements, ensuring compliance with legal standards for both + {abbr}`B2G (business-to-government)` and B2B transactions. + +:::{seealso} +{doc}`Netherlands fiscal localization documentation <../../../fiscal_localizations/netherlands>` +::: + +:::{admonition} Disclaimer +This page provides an overview of Dutch e-invoicing laws and how Odoo Invoicing supports +compliance with EU Directive 2014/55/EU, Digipoort, Peppol standards, and other relevant +regulations. It does not constitute legal advice. We recommend consulting with a tax advisor or +legal professional familiar with Dutch e-invoicing regulations to ensure compliance tailored to +your specific business needs. +::: + diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/norway.md b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/norway.md new file mode 100644 index 000000000..c2b878f7e --- /dev/null +++ b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/norway.md @@ -0,0 +1,43 @@ +--- +orphan: true +--- + +# Odoo electronic invoicing in Norway + +Odoo Invoicing is your trusted partner for safe, efficient, and legally compliant e-invoicing +solutions tailored to Norway's regulatory standards. + +## Legal framework for e-invoicing in Norway + +In Norway, e-invoicing is governed by regulations aligned with [EU Directive 2014/55/EU](https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX%3A32014L0055), +requiring {abbr}`B2G (business-to-government)` transactions to comply with mandatory e-invoicing +standards. Norwegian public sector entities mandate the use of the EHF (Elektronisk Handelsformat) +standard for e-invoices, ensuring uniformity and security. Norway is a member of the Peppol network, +which supports standardized and interoperable cross-border e-invoicing throughout Europe. Although +not mandatory for B2B transactions, e-invoicing is widely encouraged and adopted across the private +sector to boost efficiency, transparency, and compliance. + +## Compliance with Norwegian e-invoicing regulations + +Odoo invoicing is designed to fully support businesses in meeting Norway's e-invoicing standards. +Here is how Odoo ensures compliance: + +- **Supported formats**: Odoo supports the EHF (Elektronisk Handelsformat) standard, which is + required for public sector e-invoicing in Norway. Odoo is also compatible with {abbr}`UBL + (Universal Business Language)` XML for transactions through the Peppol network, ensuring adherence + to both Norwegian and EU e-invoicing requirements. +- **Secure storage and retrieval**: In compliance with Norwegian regulations that mandate the + retention of invoices for a minimum of five years, Odoo securely archives all invoices in a + tamper-proof system, ensuring accessibility and security during audits or inspections. +- **Automatic VAT calculation and reporting**: Odoo Invoicing automates VAT calculations, ensuring + that invoices meet Norwegian VAT requirements while adhering to the correct format for both + {abbr}`B2G (business-to-government)` and B2B transactions. + +:::{admonition} Disclaimer +This page provides an overview of Norwegian e-invoicing laws and how Odoo Invoicing supports +compliance with the EHF 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 Norwegian e-invoicing regulations to ensure compliance tailored to your specific +business needs. +::: + diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/peru.md b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/peru.md new file mode 100644 index 000000000..ae6be1a72 --- /dev/null +++ b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/peru.md @@ -0,0 +1,54 @@ +--- +orphan: true +--- + +# Odoo electronic invoicing in Peru + +Odoo Invoicing provides secure, efficient, and legally compliant e-invoicing solutions tailored to +meet Peru’s regulatory requirements and fully compatible with the guidelines established by the +[Superintendencia Nacional de Aduanas y de Administración Tributaria (SUNAT)](https://www.sunat.gob.pe/). + +## Legal framework for e-invoicing in Peru + +Peru has mandated electronic invoicing for most taxpayers to enhance tax compliance, reduce fraud, +and improve transparency. Key elements include: + +- **Comprobante de Pago Electrónico (CPE)**: A mandatory electronic document required for B2B, B2C, + and {abbr}`B2G (business-to-government)` transactions, fully compliant with {abbr}`SUNAT + (Superintendencia Nacional de Aduanas y de Administración Tributaria)`'s technical specifications. +- **Integration with SUNAT**: E-invoices must be submitted to {abbr}`SUNAT (Superintendencia + Nacional de Aduanas y de Administración Tributaria)` for validation and authorization. Upon + approval, {abbr}`SUNAT (Superintendencia Nacional de Aduanas y de Administración Tributaria)` + assigns a unique identification code to the invoice. +- **XML Format**: All electronic invoices must be issued in XML format, ensuring standardization and + interoperability. +- **Mandatory adoption timeline**: Electronic invoicing is mandatory for most businesses, with + specific deadlines for smaller entities. + +## Compliance with Peruvian e-invoicing regulations + +Odoo Invoicing simplifies compliance with Peru’s e-invoicing requirements by offering tailored +features: + +- **Supported formats**: Odoo supports the Peruvian {abbr}`CPE (Comprobante de Pago Electrónico` in + {abbr}`SUNAT (Superintendencia Nacional de Aduanas y de Administración Tributaria)`-compliant XML + formats, including all required fields and authorization codes. +- **Secure storage and retrieval**: In compliance with Peru's five-year mandatory storage + requirement, Odoo offers tamper-proof archiving, ensuring easy access for audits or inspections. +- **Automatic tax calculation and reporting**: Odoo automates tax calculations for {abbr}`IGV + (Impuesto General a las Ventas) and other applicable taxes, ensuring accuracy and compliance + with :abbr:`SUNAT (Superintendencia Nacional de Aduanas y de Administración Tributaria)`'s + reporting standards. + +:::{seealso} +{doc}`Peruvian fiscal localization documentation <../../../fiscal_localizations/peru>` +::: + +:::{admonition} Disclaimer +This page provides a general overview of Peruvian e-invoicing regulations and how Odoo supports +compliance with {abbr}`SUNAT (Superintendencia Nacional de Aduanas y de Administración +Tributaria)` requirements. It is not intended as legal or tax advice. We recommend consulting +with a tax advisor or legal professional familiar with Peru's e-invoicing regulations to ensure +compliance tailored to your specific business needs. +::: + diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/poland.md b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/poland.md new file mode 100644 index 000000000..d7c02f8de --- /dev/null +++ b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/poland.md @@ -0,0 +1,44 @@ +--- +orphan: true +--- + +# 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](https://isap.sejm.gov.pl/isap.nsf/DocDetails.xsp?id=WDU20230001598) +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](https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX%3A32014L0055), B2B +e-invoicing is mandatory for all businesses starting July 2024, following Poland's adoption of the +e-invoicing scheme. E-invoices must be issued in the FA_VAT (structured XML) format and transmitted +through the KSeF platform, ensuring compliance with tax reporting and transparency goals. + +## Compliance with Polish e-invoicing regulations + +Odoo Invoicing is fully equipped to help businesses comply with Poland's evolving e-invoicing +requirements. Here is how Odoo ensures compliance: + +- **Supported formats**: Odoo supports the FA_VAT (structured XML) format required for submission to + the KSeF platform. It also supports Peppol BIS Billing 3.0 for cross-border transactions, ensuring + compliance with Polish and European standards. Odoo enables businesses to issue and transmit + structured e-invoices to public authorities and other businesses through the KSeF platform. + Additionally, Odoo facilitates cross-border invoicing through the Peppol network. +- **Secure storage and retrieval**: In accordance with Polish regulations, which require invoices to + be stored for at least five years, Odoo securely archives all invoices in a tamper-proof system, + ensuring easy access for audits and compliance checks. +- **Automatic VAT calculation and reporting**: Odoo Invoicing automates VAT calculations and ensures + invoices meet Polish VAT requirements for both B2G and B2B transactions, streamlining compliance + and tax reporting processes. + +:::{admonition} Disclaimer +This page provides an overview of Polish e-invoicing laws and how Odoo Invoicing supports +compliance with the VAT Act, KSeF platform, Peppol standards, and other relevant regulations. It +does not constitute legal advice. We recommend consulting with a tax advisor or legal +professional familiar with Polish e-invoicing regulations to ensure compliance tailored to your +specific business needs. +::: + diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/portugal.md b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/portugal.md new file mode 100644 index 000000000..4b2e31528 --- /dev/null +++ b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/portugal.md @@ -0,0 +1,47 @@ +--- +orphan: true +--- + +# Odoo electronic invoicing in Portugal + +Odoo Invoicing is your trusted partner for safe, efficient, and legally compliant e-invoicing +solutions tailored to Portugal's regulatory standards. + +## Legal framework for e-invoicing in Portugal + +In Portugal, e-invoicing is regulated under the Portuguese VAT Code and in compliance with [EU +Directive 2014/55/EU](https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX%3A32014L0055) for +{abbr}`B2G (business-to-government)` transactions. E-invoicing has been mandatory for public sector +suppliers since 2021. Businesses must use structured e-invoices in the {abbr}`CIUS-PT (Customizable +Invoice User Specification for Portugal)` format, which aligns with European standards. While B2B +e-invoicing is not yet mandatory, its adoption is encouraged to improve tax compliance and +efficiency. Additionally, e-invoices must be validated and certified under Portugal's SAF-T (PT) +system, which integrates with the tax authority for reporting. + +## Compliance with Portuguese e-invoicing regulations + +Odoo Invoicing is fully equipped to meet Portugal's e-invoicing and tax reporting requirements. Here +is how Odoo ensures compliance: + +- **Supported formats**: Odoo supports the {abbr}`CIUS-PT (Customizable Invoice User Specification + for Portugal)` format, ensuring compatibility with Portugal's public procurement e-invoicing + requirements. For cross-border transactions, Odoo also supports the Peppol BIS Billing 3.0 format, + facilitating seamless compliance with EU standards. Integration with SAF-T (PT) and Tax Authority + Systems enables businesses to generate, validate, and report certified e-invoices to the tax + authority in compliance with local regulations. +- **Secure storage and retrieval**: In accordance with Portuguese regulations, which require + invoices to be stored for at least ten years, Odoo securely archives all invoices in a + tamper-proof system, ensuring they are accessible for audits and inspections. +- **Automatic VAT calculation and reporting**: Odoo Invoicing automates VAT calculations and ensures + that invoices meet Portuguese VAT requirements for both {abbr}`B2G (business-to-government)` and + B2B transactions, supporting efficient and accurate tax reporting. + +:::{admonition} Disclaimer +This page provides an overview of Portuguese e-invoicing laws and how Odoo Invoicing supports +compliance with the VAT Code, {abbr}`CIUS-PT (Customizable Invoice User Specification for +Portugal)` format, SAF-T (PT) system, Peppol standards, and other relevant regulations. It does +not constitute legal advice. We recommend consulting with a tax advisor or legal professional +familiar with Portuguese e-invoicing regulations to ensure compliance tailored to your specific +business needs. +::: + diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/romania.md b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/romania.md new file mode 100644 index 000000000..4444e5357 --- /dev/null +++ b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/romania.md @@ -0,0 +1,54 @@ +--- +orphan: true +--- + +# Odoo electronic invoicing in Romania + +Odoo Invoicing is your trusted partner for safe, efficient, and legally compliant e-invoicing +solutions tailored to Romania's regulatory standards. + +## Legal framework for e-invoicing in Romania + +In Romania, e-invoicing is regulated under the [Fiscal Code](http://www.dreptonline.ro/carti/start_carte.php?id_carte=324) +and aligned with [EU Directive 2014/55/EU](https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX%3A32014L0055), +which mandates e-invoicing for {abbr}`B2G (business-to-government)` transactions. Romania has +implemented the RO e-Factura system, the national platform for issuing and receiving electronic +invoices in a standardized format. The use of RO e-Factura is mandatory for {abbr}`B2G +(business-to-government)` transactions and for specific high-risk B2B sectors, with further +expansion anticipated. Romania is also integrated with the Peppol network, facilitating cross-border +e-invoicing and compliance within the European Union. + +## Compliance with Romanian e-invoicing regulations + +Odoo invoicing module is fully equipped to help businesses comply with Romania’s specific +e-invoicing requirements. Here’s how Odoo supports compliance: + +- **Supported formats**: Odoo supports XML in {abbr}`UBL (Universal Business Language)` and the + structured formats required by RO e-Factura, ensuring compliance with Romania's e-invoicing + standards for B2G and high-risk B2B transactions. Additionally, Odoo supports formats compatible + with the Peppol network, enabling seamless cross-border invoicing. Odoo integrates with the RO + e-Factura system, allowing businesses to generate, validate, and submit e-invoices directly to + Romanian public authorities or private entities as required by law. Odoo helps businesses comply + with eTransport requirements by generating and managing the data necessary for reporting the + movement of high-fiscal risk goods. This includes shipment details such as the nature of the + goods, vehicle information, and delivery destinations, ensuring timely submission to the + {abbr}`ANAF (Romanian National Agency for Fiscal Administration)`. +- **Secure storage and retrieval**: In compliance with Romanian regulations, which require invoices + to be stored for a minimum of ten years, Odoo securely archives all invoices in a tamper-proof + system, ensuring accessibility during audits or inspections. +- **Automatic VAT calculation and reporting**: Odoo Invoicing automates VAT calculations and formats + invoices to comply with Romanian VAT requirements, ensuring accuracy and adherence to legal + standards for both {abbr}`B2G (business-to-government)` and B2B transactions. + +:::{seealso} +{doc}`Romania fiscal localization documentation <../../../fiscal_localizations/romania>` +::: + +:::{admonition} Disclaimer +This page provides an overview of Romanian e-invoicing laws and how Odoo Invoicing supports +compliance with the Fiscal Code, RO e-Factura, Peppol standards, and other relevant regulations. +It does not constitute legal advice. We recommend consulting with a tax advisor or legal +professional familiar with Romanian e-invoicing regulations to ensure compliance tailored to your +specific business needs. +::: + diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/slovenia.md b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/slovenia.md new file mode 100644 index 000000000..1a2e64502 --- /dev/null +++ b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/slovenia.md @@ -0,0 +1,44 @@ +--- +orphan: true +--- + +# 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](https://www.uradni-list.si/glasilo-uradni-list-rs/vsebina/2019-01-2291?sop=2019-01-2291) +and complies with [EU Directive 2014/55/EU](https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX%3A32014L0055), +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/electronic_invoicing/spain.md b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/spain.md new file mode 100644 index 000000000..4f60893e4 --- /dev/null +++ b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/spain.md @@ -0,0 +1,50 @@ +--- +orphan: true +--- + +# Odoo electronic invoicing in Spain + +Odoo Invoicing is your trusted partner for safe, efficient, and legally compliant e-invoicing +solutions tailored to Spain's regulatory standards. + +## Legal framework for e-invoicing in Spain + +In Spain, e-invoicing is governed by the [Ley de Facturación Electrónica](https://www.facturae.gob.es/face/Paginas/FACE.aspx) +and aligned with [EU Directive 2014/55/EU](https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX%3A32014L0055), +mandating e-invoicing for {abbr}`B2G (business-to-government)` transactions. All invoices to public +sector entities must be submitted through the FACe platform, Spain’s official electronic invoicing +hub, using the required Facturae format. Additionally, the {abbr}`SII (Immediate Supply of +Information)` system mandates near real-time reporting of VAT-related invoice data for certain +companies, reinforcing transparency and compliance. While e-invoicing is not yet mandatory for B2B +transactions, its adoption is expected to expand in the near future. + +## Compliance with Spanish e-invoicing regulations + +Odoo Invoicing is fully equipped to help businesses meet Spain's e-invoicing and VAT reporting +requirements. Here is how Odoo ensures compliance: + +- **Supported formats**: Odoo supports the Facturae (XML) format required by the FACe platform for + public sector e-invoicing in Spain. It is also compatible with XML in {abbr}`UBL (Universal + Business Language)` formats used within the Peppol network for cross-border transactions. Odoo + integrates with FACe, allowing businesses to submit e-invoices directly to Spanish public + authorities. Odoo also facilitates compliance with the SII system, enabling automated and near + real-time reporting of VAT-related data to the Spanish Tax Agency. +- **Secure storage and retrieval**: In compliance with Spanish regulations requiring invoices to be + stored for a minimum of four years, Odoo securely archives all invoices in a tamper-proof system, + ensuring easy access during audits or inspections. +- **Automatic VAT calculation and reporting**: Odoo Invoicing automates VAT calculations and ensures + invoices are formatted to meet Spanish requirements for both {abbr}`B2G (business-to-government)` + and B2B transactions, helping businesses comply with national and EU standards. + +:::{seealso} +{doc}`Spain fiscal localization documentation <../../../fiscal_localizations/spain>` +::: + +:::{admonition} Disclaimer +This page provides an overview of Spanish e-invoicing laws and how Odoo Invoicing supports +compliance with the Ley de Facturación Electrónica, FACe platform, SII system, Peppol standards, +and other relevant regulations. It does not constitute legal advice. We recommend consulting with +a tax advisor or legal professional familiar with Spanish e-invoicing regulations to ensure +compliance tailored to your specific business needs. +::: + diff --git a/content/applications/finance/accounting/customer_invoices/electronic_invoicing/uruguay.md b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/uruguay.md new file mode 100644 index 000000000..e288c4c3c --- /dev/null +++ b/content/applications/finance/accounting/customer_invoices/electronic_invoicing/uruguay.md @@ -0,0 +1,56 @@ +--- +orphan: true +--- + +# Odoo electronic invoicing in Uruguay + +Odoo Invoicing is your trusted partner for safe, efficient, and legally compliant e-invoicing +solutions tailored to meet Uruguay's regulatory requirements and fully compatible with the +guidelines established by the [Dirección General Impositiva (DGI)](https://www.gub.uy/direccion-general-impositiva/). + +## Legal framework for e-invoicing in Uruguay + +Uruguay has mandated electronic invoicing under the {abbr}`CFE (Comprobante Fiscal Electrónico)` +system, which applies to most businesses to promote tax transparency and streamline financial +transactions. Key elements include: + +- **Comprobante Fiscal Electrónico**: A mandatory e-invoice format required for B2B, B2C, and + {abbr}`B2G (business-to-government)` transactions, fully compliant with {abbr}`DGI (Dirección + General Impositiva)`'s technical standards. +- **Integration with DGI**: All {abbr}`CFE (Comprobante Fiscal Electrónico)` must be submitted to + the {abbr}`DGI (Dirección General Impositiva)` for validation. Upon approval, the {abbr}`CFE + (Comprobante Fiscal Electrónico)` receives a unique identification code and authorization for + issuance. +- **XML Format**: Uruguay mandates the use of XML as the standard format for e-invoices, ensuring + compatibility and interoperability with various systems. +- **Adoption Timeline**: E-invoicing is mandatory for most businesses, with specific deadlines for + smaller enterprises to transition into the system. + +## Compliance with Uruguayan e-invoicing regulations + +Odoo Invoicing simplifies the complexities of compliance with Uruguay's e-invoicing requirements by +offering tailored features: + +- **Supported formats**: Odoo supports the {abbr}`CFE (Comprobante Fiscal Electrónico)` format in + {abbr}`DGI (Dirección General Impositiva)`-compliant XML, including all legally required fields, + such as the unique identification code, authorization number, and digital signature. Odoo allows + the automated submission, validation, and issuance through the {abbr}`DGI (Dirección General + Impositiva)`'s e-invoicing platform to ensure compliance in real time. +- **Secure storage and retrieval**: In line with Uruguay’s mandatory five-year storage requirement, + Odoo provides tamper-proof archiving solutions, ensuring easy access to invoices for audits or + inspections. +- **Automatic tax calculation and reporting**: Odoo automates tax calculations for IVA (Value-Added + Tax) and other applicable taxes, ensuring accuracy and compliance with {abbr}`DGI (Dirección + General Impositiva)`'s reporting standards. + +:::{seealso} +{doc}`Uruguayan fiscal localization documentation <../../../fiscal_localizations/uruguay>` +::: + +:::{admonition} Disclaimer +This page provides a general overview of Uruguayan e-invoicing regulations and how Odoo supports +compliance with DGI requirements. It is not intended as legal or tax advice. We recommend +consulting with a tax advisor or legal professional familiar with Uruguay's e-invoicing +regulations to ensure full compliance tailored to your specific business requirements. +::: + diff --git a/content/applications/finance/accounting/customer_invoices/epc_qr_code.md b/content/applications/finance/accounting/customer_invoices/epc_qr_code.md new file mode 100644 index 000000000..2d566212f --- /dev/null +++ b/content/applications/finance/accounting/customer_invoices/epc_qr_code.md @@ -0,0 +1,63 @@ +# EPC QR codes + +European Payments Council quick response codes, or **EPC QR codes**, are two-dimensional barcodes +that customers can scan with their **mobile banking applications** to initiate a **SEPA credit +transfer (SCT)** and pay their invoices instantly. + +In addition to bringing ease of use and speed, it greatly reduces typing errors that would +potentially make for payment issues. + +:::{note} +This feature is only available for companies in several European countries such as Austria, +Belgium, Finland, Germany, and the Netherlands. +::: + +:::{seealso} +- {doc}`../bank` +- [Odoo Academy: QR Code on Invoices for European Customers](https://www.odoo.com/r/VuU) +::: + +## Configuration + +Go to {menuselection}`Accounting --> Configuration --> Settings` and activate the {guilabel}`QR +Codes` feature in the {guilabel}`Customer Payments` section. + +### Configure your bank account's journal + +Make sure that your {guilabel}`Bank Account` is correctly configured in Odoo with your IBAN and BIC. + +To do so, go to {menuselection}`Accounting --> Configuration --> Journals`, open your bank journal, +then fill out the {guilabel}`Account Number` and {guilabel}`Bank` under the {guilabel}`Bank Account +Number` column. + +```{image} epc_qr_code/bank-journal.png +:alt: Bank account number column in the bank journal +``` + +## Issue invoices with EPC QR codes + +EPC QR codes are added automatically to your invoices. Customers whose bank supports making payments +via EPC QR codes will be able to scan the code and pay the invoice. + +Go to {menuselection}`Accounting --> Customers --> Invoices`, and create a new invoice. + +Before posting it, open the {guilabel}`Other Info` tab. Odoo automatically fills out the +{guilabel}`Recipient Bank` field with your IBAN. + +:::{note} +In the {guilabel}`Other Info` tab, the account indicated in the {guilabel}`Recipient Bank` field +is used to receive your customer's payment. Odoo automatically populates this field with your +IBAN by default and uses it to generate the EPC QR code. +::: + +When the invoice is printed or previewed, the QR code is included at the bottom. + +```{image} epc_qr_code/invoice-qr-code.png +:alt: QR code on a customer invoice +``` + +:::{tip} +If you want to issue an invoice without an EPC QR code, remove the IBAN indicated in the +{guilabel}`Recipient Bank` field, under the {guilabel}`Other Info` tab of the invoice. +::: + diff --git a/content/applications/finance/accounting/customer_invoices/incoterms.md b/content/applications/finance/accounting/customer_invoices/incoterms.md new file mode 100644 index 000000000..bfef450b2 --- /dev/null +++ b/content/applications/finance/accounting/customer_invoices/incoterms.md @@ -0,0 +1,58 @@ +# Incoterms + +{abbr}`Incoterms (International Commercial Terms)` are standardized trade terms used in +international transactions to define the rights and responsibilities of buyers and sellers. They +establish the obligations related to the delivery of goods, the transfer of risks, and the +distribution of costs between the parties involved. Incoterms specify important details, such as the +point at which the risk and costs transfer from the seller to the buyer, the responsibility for +transportation, insurance, customs clearance, and other relevant aspects of the transaction. + +:::{note} +By default, all 11 Incoterms are available in Odoo: + +- **EXW**: Ex works +- **FCA**: Free carrier +- **FAS**: Free alongside ship +- **FOB**: Free on board +- **CFR**: Cost and freight +- **CIF**: Cost, insurance and freight +- **CPT**: Carriage paid to +- **CIP**: Carriage and insurance paid to +- **DPU**: Delivered at place unloaded +- **DAP**: Delivered at place +- **DDP**: Delivered duty paid +::: + +:::{seealso} +- {doc}`../reporting/intrastat` +- {doc}`../customer_invoices` +- {doc}`../vendor_bills` +::: + +(incoterms-invoices)= + +## Define an Incoterm + +To define an Incoterm manually, create an invoice or bill, click the {guilabel}`Other Info` tab, and +select the {guilabel}`Incoterm`. + +### Incoterm location + +A location relevant to the chosen Incoterm can be added to the invoice or bill under +{guilabel}`Other Info` in the {guilabel}`Incoterm Location` field. + +```{eval-rst} +.. example:: + If the chosen Incoterm code is `CIF` (Cost, Insurance, Freight), the associated location might be + the destination port where the goods will be delivered. +``` + +(incoterms-default)= + +## Default Incoterm configuration + +You can set a default Incoterm rule to **automatically** populate the Incoterm field on all newly +created invoices and bills. Under {menuselection}`Accounting/Invoicing --> Configuration --> +Settings`, scroll down to the {guilabel}`Customer Invoices` section, and select an Incoterm in the +{guilabel}`Default Incoterm` field. + diff --git a/content/applications/finance/accounting/customer_invoices/overview.md b/content/applications/finance/accounting/customer_invoices/overview.md new file mode 100644 index 000000000..05fd8098d --- /dev/null +++ b/content/applications/finance/accounting/customer_invoices/overview.md @@ -0,0 +1,148 @@ +# Invoicing processes + +Depending on your business and the application you use, there are +different ways to automate the customer invoice creation in Odoo. +Usually, draft invoices are created by the system (with information +coming from other documents like sales order or contracts) and +accountant just have to validate draft invoices and send the invoices in +batch (by regular mail or email). + +Depending on your business, you may opt for one of the following way to +create draft invoices: + +## Sales + +### Sales Order ‣ Invoice + +In most companies, salespeople create quotations that become sales order +once they are validated. Then, draft invoices are created based on the +sales order. You have different options like: + +- Invoice manually: use a button on the sale order to trigger the draft + invoice +- Invoice before delivery: invoice the full order before triggering the + delivery order +- Invoice based on delivery order: see next section + +Invoice before delivery is usually used by the eCommerce application +when the customer pays at the order and we deliver afterwards. +(pre-paid) + +For most other use cases, it's recommended to invoice manually. It +allows the salesperson to trigger the invoice on demand with options: +invoice the whole order, invoice a percentage (advance), invoice some +lines, invoice a fixed advance. + +This process is good for both services and physical products. + +:::{seealso} +- {doc}`/applications/sales/sales/invoicing/proforma` +::: + +### Sales Order ‣ Delivery Order ‣ Invoice + +Retailers and eCommerce usually invoice based on delivery orders, +instead of sales order. This approach is suitable for businesses where +the quantities you deliver may differs from the ordered quantities: +foods (invoice based on actual Kg). + +This way, if you deliver a partial order, you only invoice for what you +really delivered. If you do back orders (deliver partially and the rest +later), the customer will receive two invoices, one for each delivery +order. + +:::{seealso} +- {doc}`/applications/sales/sales/invoicing/invoicing_policy` +::: + +### eCommerce Order ‣ Invoice + +An eCommerce order will also trigger the creation of the order when it +is fully paid. If you allow paying orders by check or wire transfer, +Odoo only creates an order and the invoice will be triggered once the +payment is received. + +## Contracts + +### Regular Contracts ‣ Invoices + +If you use contracts, you can trigger invoice based on time and material +spent, expenses or fixed lines of services/products. Every month, the +salesperson will trigger invoice based on activities on the contract. + +Activities can be: + +- fixed products/services, coming from a sale order linked to this contract +- materials purchased (that you will re-invoice) +- time and material based on timesheets or purchases (subcontracting) +- expenses like travel and accommodation that you re-invoice to the customer + +You can invoice at the end of the contract or trigger intermediate +invoices. This approach is used by services companies that invoice +mostly based on time and material. For services companies that invoice +on fix price, they use a regular sales order. + +:::{seealso} +- {doc}`/applications/sales/sales/invoicing/time_materials` +- {doc}`/applications/sales/sales/invoicing/expense` +- {doc}`/applications/sales/sales/invoicing/milestone` +::: + +### Recurring Contracts ‣ Invoices + +For subscriptions, an invoice is triggered periodically, automatically. +The frequency of the invoicing and the services/products invoiced are +defined on the contract. + +:::{seealso} +- {doc}`/applications/sales/subscriptions` +::: + +## Others + +### Creating an invoice manually + +Users can also create invoices manually without using contracts or a +sales order. It's a recommended approach if you do not need to manage +the sales process (quotations), or the delivery of the products or +services. + +Even if you generate the invoice from a sales order, you may need to +create invoices manually in exceptional use cases: + +- if you need to create a refund +- If you need to give a discount +- if you need to change an invoice created from a sales order +- if you need to invoice something not related to your core business + +### Specific modules + +Some specific modules are also able to generate draft invoices: + +- **membership**: invoice your members every year +- **repairs**: invoice your after-sale services + +### Resequencing of the invoices + +It remains possible to resequence the invoices but with some restrictions: + +1. The feature does not work when entries are previous to a lock date. +2. The feature does not work if the sequence is inconsistent with the month of the entry. +3. It does not work if the sequence leads to a duplicate. +4. The order of the invoice remains unchanged. +5. It is useful for people who use a numbering from another software and who want to continue the + current year without starting over from the beginning. + +### Invoice digitization with optical character recognition (OCR) + +**Invoice digitization** is the process of automatically encoding traditional paper invoices into +invoices forms in your accounting. + +Odoo uses OCR and artificial intelligence technologies to recognize the content of the documents. +Vendor bills and customer invoices forms are automatically created and populated based on scanned +invoices. + +:::{seealso} +- {doc}`/applications/finance/accounting/vendor_bills/invoice_digitization` +::: + diff --git a/content/applications/finance/accounting/customer_invoices/payment_terms.md b/content/applications/finance/accounting/customer_invoices/payment_terms.md new file mode 100644 index 000000000..1a3e4a654 --- /dev/null +++ b/content/applications/finance/accounting/customer_invoices/payment_terms.md @@ -0,0 +1,152 @@ +# Payment terms and installment plans + +**Payment terms** specify all the conditions of a sale's payment to help ensure customers pay their +invoices correctly and on time. + +Payment terms are generally defined on documents such as sales orders, customer invoices, and +vendor bills. Payment terms cover: + +- The due date(s) +- Early payment discounts +- Any other conditions on the payment + +An **installment plan** allows the customers to pay an invoice in parts, with the amounts and +payment dates defined beforehand by the seller. + +```{eval-rst} +.. example:: + Immediate Payment + The full payment is due on the day of the invoice's issuance. + 15 Days (or Net 15) + The full payment is due 15 days after the invoice date. + 21 MFI + The full payment is due by the 21st of the month following the invoice date. + 30% Advance End of Following Month + 30% is due on the day of the invoice's issuance. The remaining balance is due at the end of the + following month. + 2% 10, Net 30 EOM + A 2% :doc:`cash discount ` if the payment is received within ten days. + Otherwise, the full payment is due at the end of the month following the invoice date. +``` + +:::{note} +- Payment terms are not to be confused with {doc}`down payment invoices + `. If, for a specific order, you issue + multiple invoices to your customer, that is neither a payment term nor an installment plan but + an invoicing policy. +- This page is about the *payment terms* feature, not {doc}`terms & conditions + `, which can be used to declare contractual obligations regarding content + use, return policies, and other policies surrounding the sale of goods and services. +::: + +:::{seealso} +- [Odoo Tutorials: payment terms](https://www.odoo.com/slides/slide/payment-terms-1679) +- {doc}`cash_discounts` +::: + +## Configuration + +To create new payment terms, follow these steps: + +1. Go to {menuselection}`Accounting --> Configuration --> Payment Terms` and click on + {guilabel}`New`. + +2. Enter a name in the {guilabel}`Payment Terms` field. This field is the name displayed both + internally and on sales orders. + +3. Tick the {guilabel}`Early Discount` checkbox and fill out the discount percentage, discount days, + and {ref}`tax reduction ` fields to add a {doc}`cash discount + `, if desired. + +4. In the {guilabel}`Due Terms` section, add a set of rules (terms) to define what needs to be paid + and by which due date(s). Defining terms automatically calculates the payments' due date(s). This + is particularly helpful for managing **installment plans** ({dfn}`payment terms with multiple + terms`). + + To add a term, click on {guilabel}`Add a line`, define the discount's value and type in the + {guilabel}`Due` fields, then fill out the {guilabel}`After` fields to determine the due date. + +5. Enter the text to be displayed on the document (sales order, invoice, etc.) in the gray textbox + in the {guilabel}`Preview` column. + +6. Tick the {guilabel}`Show installment dates` checkbox to display a breakdown of each payment and + its due date on the invoice report, if desired. + +:::{tip} +To instead specify a number of days *before the end of the month*, use a negative value in the +{guilabel}`After` field. +::: + +To test that your payment terms are configured correctly, enter an invoice date on the +{guilabel}`Example` line to generate the payments that would be due and their due dates +using these payment terms. + +:::{important} +Terms are computed in the order of their due dates. +::: + +```{eval-rst} +.. example:: + In the following example, 30% is due on the day of issuance, and the remaining 70% is due at the + end of the following month. + + .. image:: payment_terms/configuration.png + :alt: Example of Payment Terms. The first line is the 30% due immediately. The second line is + the remaining 70% due at the end of the following month. +``` + +## Using payment terms + +Payment terms can be defined using the {guilabel}`Payment Terms` field on: + +- **Contacts:** To automatically set default payment terms on a contact's new sales orders, + invoices, and bills. This can be modified in the contact form, under the {guilabel}`Sales & + Purchase` tab. +- **Quotations/Sales Orders:** To set specific payment terms automatically on all invoices generated + from a quotation or sales order. + +Payment terms can be defined using the {guilabel}`Due Date` field, with the {guilabel}`Terms` +drop-down list on: + +- **Customer invoices:** To set specific payment terms on an invoice. +- **Vendor bills:** To set specific payment terms on a bill. + +:::{tip} +Setting payment terms on a vendor bill is mostly useful for managing vendor terms with multiple +installments or cash discounts. Otherwise, manually setting the **due date** is enough. If +payment terms are already defined, empty the field to select a date. +::: + +## Journal entries + +Invoices with specific payment terms generate different *journal entries*, with one *journal item* +for every computed *due date*. + +This makes for easier {doc}`follow-ups ` and +{doc}`reconciliation ` since Odoo takes each +due date into account, rather than just the balance due date. It also helps to get an accurate +{ref}`aged receivable report `. + +```{eval-rst} +.. example:: + .. image:: payment_terms/journal-entry.png + :alt: The amount debited to the account receivable is split into two journal items with + distinct due dates + + In this example, an invoice of $1000 has been issued with the following payment terms: *30% is + due on the day of issuance, and the remaining 70% is due at the end of the following month.* + + +----------------------+-------------+---------+---------+ + | Account | Due date | Debit | Credit | + +======================+=============+=========+=========+ + | Account Receivable | February 21 | 300 | | + +----------------------+-------------+---------+---------+ + | Account Receivable | March 31 | 700 | | + +----------------------+-------------+---------+---------+ + | Product Sales | | | 1000 | + +----------------------+-------------+---------+---------+ + + The $1000 debited to the account receivable is split into two distinct journal items. Both of + them have their own due date. +``` + diff --git a/content/applications/finance/accounting/customer_invoices/sequence.md b/content/applications/finance/accounting/customer_invoices/sequence.md new file mode 100644 index 000000000..3d790e63a --- /dev/null +++ b/content/applications/finance/accounting/customer_invoices/sequence.md @@ -0,0 +1,74 @@ +# Invoice sequence + +When confirming an invoice, Odoo generates a unique invoice reference number. By default, Odoo uses +the following sequence format `INV/year/incrementing-number` (e.g., `INV/2025/00001`), which +restarts from `00001` each year. + +However, it is possible to {ref}`change the sequence format ` and +its periodicity, and to {ref}`mass-resequence invoices `. + +:::{note} +Changes made to reference numbers are logged in the chatter. +::: + +(accounting-invoice-resequencing)= + +## Changing the default sequence + +To customize the default sequence, open the last confirmed invoice, click {guilabel}`Reset to +Draft`, and edit the invoice's reference number. + +```{image} sequence/reference-number.png +:alt: Editing the reference number of an invoice. +``` + +Odoo then explains how the detected format will be applied to all future invoices. For example, if +the current invoice's month is added, the sequence's periodicity will change to every month instead +of every year. + +```{image} sequence/sequence-dialog.png +:alt: Editing the reference number of an invoice. +``` + +:::{tip} +The sequence format can be edited directly when creating the first invoice of a given sequence +period. +::: + +(accounting-invoice-mass-resequencing)= + +## Mass-resequencing invoices + +It can be helpful to resequence multiple invoice numbers. For example, when importing invoices from +another invoicing or accounting system and the reference originates from the previous software, +continuity for the current year must be maintained without restarting from the beginning. + +:::{note} +This feature is only available to users with administrator or advisor access. +::: + +Follow these steps to resequence invoice numbers: + +1. Activate the {ref}`developer mode `. + +2. From the {guilabel}`Accounting Dashboard`, open the {guilabel}`Customer Invoices` journal. + +3. Select the invoices that need a new sequence. + +4. Click the {icon}`fa-cog` {guilabel}`Actions` menu and select {guilabel}`Resequence`. + +5. In the {guilabel}`Ordering` field, choose to + + - {guilabel}`Keep current order`: The order of the numbers remains the same. + - {guilabel}`Reorder by accounting date`: The number is reordered by accounting date. + +6. Set the {guilabel}`First New Sequence`. + +7. {guilabel}`Preview Modifications` and click {guilabel}`Confirm`. + +The first invoice using the new sequence appears in red in the {guilabel}`Customer Invoices` list. + +```{image} sequence/invoice-sequencing.png +:alt: Resequence options window +``` + diff --git a/content/applications/finance/accounting/customer_invoices/snailmail.md b/content/applications/finance/accounting/customer_invoices/snailmail.md new file mode 100644 index 000000000..8afdc02c3 --- /dev/null +++ b/content/applications/finance/accounting/customer_invoices/snailmail.md @@ -0,0 +1,54 @@ +(customer-invoices-snailmail)= + +# Snailmail + +Sending direct mail can be an effective strategy for grabbing people's attention, especially when +their email inboxes are overflowing. With Odoo, you have the ability to send invoices and follow-up +reports through postal mail worldwide, all from within your database. + +## Configuration + +Go to {menuselection}`Accounting --> Configuration --> Settings --> Customer invoices` section to +activate {guilabel}`Snailmail`. + +To make it a by-default feature, select {guilabel}`Send by Post` in the {guilabel}`Default Sending +Options` section. + +```{image} snailmail/setup-snailmail.png +:align: center +:alt: Under settings enable the snailmail feature in Odoo Accounting +``` + +## Send invoices by post + +Open your invoice, click on {guilabel}`Send & Print` and select {guilabel}`Send by Post`. Make sure +your customer’s address is set correctly, including the country, before sending the letter. + +:::{important} +Your document must respect the following rules to pass the validation before being sent: + +- Margins must be **5 mm** on all sides. As Odoo forces the outer margins by filling them with + white before sending the snailmail, it can results in the user's custom being cut off if it + protrudes into the margins. To check the margins, activate the {ref}`developer mode + `, go to {menuselection}`General Settings --> Technical --> Reporting + section: Paper Format`. +- A square of **15mm by 15mm** on the bottom left corner has to stay clear. +- The postage area has to stay clear ({download}`download the snailmail PDF template + ` for more details). +- Pingen (Odoo Snailmail service provider) scans the area to process the address, so if something + gets written outside the area, it is not counted as part of the address. +::: + +## Pricing + +Snailmail is an {doc}`/applications/essentials/in_app_purchase` service that requires prepaid stamps +(=credits) to work. Sending one document consumes one stamp. + +To buy stamps, go to {menuselection}`Accounting --> Configuration --> Settings --> Customer +invoices: Snailmail`, click on {guilabel}`Buy credits`, or go to {menuselection}`Settings --> In-App +Purchases: Odoo IAP`, and click on {guilabel}`View my Services`. + +:::{seealso} +[Odoo's IAP Privacy Policy](https://iap.odoo.com/privacy#header_4) +::: + diff --git a/content/applications/finance/accounting/customer_invoices/terms_conditions.md b/content/applications/finance/accounting/customer_invoices/terms_conditions.md new file mode 100644 index 000000000..a8da63b8c --- /dev/null +++ b/content/applications/finance/accounting/customer_invoices/terms_conditions.md @@ -0,0 +1,42 @@ +# Default terms and conditions (T&C) + +Specifying terms and conditions is essential to establish important contractual points, such as +return and refunds, warranty, and after-sale services. + +You can add default terms and conditions at the bottom of all customer invoices, sales orders, and +quotations, either as text or a link to a web page. + +:::{seealso} +[Odoo Tutorial: Terms & Conditions](https://www.odoo.com/slides/slide/terms-conditions-1680) +::: + +## Configuration + +Go to {menuselection}`Accounting --> Configuration --> Settings`. Under the {guilabel}`Customer +Invoices`, enable {guilabel}`Default Terms & Conditions`. By default, the {guilabel}`Add a Note` +option is selected, and the terms and conditions are displayed at the bottom of the document. Enter +the terms and conditions in the text box below. + +```{image} terms_conditions/terms-note.png +:alt: Example of terms and conditions as a note +``` + +:::{tip} +You can also add a PDF version of your terms and conditions as an attachment when sending the +document via email. Edit the email templates if you want to include them by default. +::: + +Alternatively, to display the terms and conditions on a web page, select the {guilabel}`Add a link +to a Web Page` option and click {guilabel}`Save`. Click {guilabel}`Update Terms`, edit the +content, and click {guilabel}`Save`. The link to that page is then added as a note in your document. + +:::{note} +You can edit the layout and content of the page using the {doc}`Website +` app. If the Website app is activated, the {guilabel}`Edit in +Website Builder` option then replaces {guilabel}`Update Terms`. +::: + +```{image} terms_conditions/terms-webpage.png +:alt: Example of terms and conditions as a web page +``` + diff --git a/content/applications/finance/accounting/get_started.md b/content/applications/finance/accounting/get_started.md new file mode 100644 index 000000000..ce19a8bee --- /dev/null +++ b/content/applications/finance/accounting/get_started.md @@ -0,0 +1,198 @@ +--- +show-content: true +--- + +# Get started + +When you first open your Odoo Accounting app, the {guilabel}`Accounting Dashboard` welcomes you with +a step-by-step onboarding banner, a wizard that helps you get started. This onboarding banner is +displayed until you choose to close it. + +The settings visible in the onboarding banner can still be modified later by going to +{menuselection}`Accounting --> Configuration --> Settings`. + +:::{note} +Odoo Accounting automatically installs the appropriate **Fiscal Localization Package** for your +company, according to the country selected at the creation of the database. This way, the right +accounts, reports, and taxes are ready-to-go. {ref}`Click here ` +for more information about Fiscal Localization Packages. +::: + +## Accounting onboarding banner + +The step-by-step Accounting onboarding banner is composed of four steps: + +```{image} get_started/accounting-onboarding-banner.png +:alt: Step-by-step onboarding banner in Odoo Accounting +``` + +1. {ref}`accounting-setup-periods` +2. {ref}`accounting-setup-bank` +3. {ref}`accounting-setup-taxes` +4. {ref}`accounting-setup-chart` + +(accounting-setup-periods)= + +### Accounting Periods + +Define the **Fiscal Years**’ opening and closing dates, which are used to generate reports +automatically, and set your **Tax Return Periodicity**, along with a reminder to never miss a tax +return deadline. + +By default, the opening date is set on the 1st of January and the closing date on the 31st of +December, as this is the most common use. + +:::{note} +You can also change these settings by going to {menuselection}`Accounting --> Configuration --> +Settings --> Fiscal Periods` and updating the values. +::: + +(accounting-setup-bank)= + +### Bank Account + +Connect your bank account to your database and have your bank statements synced automatically. To do +so, find your bank in the list, click {guilabel}`Connect`, and follow the instructions on-screen. + +:::{note} +{doc}`Click here ` for more information about this feature. +::: + +If your Bank Institution can’t be synchronized automatically, or if you prefer not to sync it with +your database, you can also configure your bank account manually by typing its name, clicking +{guilabel}`Create your Bank Account`, and filling out the form. + +- {guilabel}`Name`: the bank account's name, as displayed in Odoo. +- {guilabel}`Account Number`: your bank account number (IBAN in Europe). +- {guilabel}`Bank`: click {guilabel}`Create and edit` to configure the bank's details. Add the + bank institution's {guilabel}`Name` and its {guilabel}`Identifier Code` (BIC or SWIFT). +- {guilabel}`Code`: this code is your Journal's {guilabel}`Short Code`, as displayed in Odoo. + By default, Odoo creates a new Journal with this short code. +- {guilabel}`Journal`: This field is displayed if you have an existing bank journal that is not + linked yet to a bank account. If so, then select the {guilabel}`Journal` you want to use to record + the financial transactions linked to this bank account or create a new one by clicking + {guilabel}`Create and Edit`. + +:::{note} +- You can add as many bank accounts as needed with this tool by going to + {menuselection}`Accounting --> Configuration --> Add a Bank Account`. +- {doc}`Click here ` for more information about Bank Accounts. +::: + +(accounting-setup-taxes)= + +### Taxes + +This menu allows you to create new taxes, (de)activate, or modify existing taxes. Depending on the +{doc}`localization package <../fiscal_localizations>` installed on your database, taxes required for +your country are already configured. + +:::{note} +{doc}`Click here ` for more information about taxes. +::: + +(accounting-setup-chart)= + +### Chart of Accounts + +With this menu, you can add accounts to your **Chart of Accounts** and indicate their initial +opening balances. + +Basic settings are displayed on this page to help you review your Chart of Accounts. To access all +the settings of an account, click on the {guilabel}`Setup` button at the end of the line. + +```{image} get_started/setup_chart_of_accounts.png +:alt: Setup of the Chart of Accounts and their opening balances in Odoo Accounting +``` + +:::{note} +{doc}`Click here ` for more information on how to configure your +Chart of Accounts. +::: + +## Invoicing onboarding banner + +There is another step-by-step onboarding banner that helps you take advantage of your Odoo Invoicing +and Accounting apps. The Invoicing onboarding banner is the one that welcomes you if you use the +Invoicing app rather than the Accounting app. + +If you have Odoo Accounting installed on your database, you can reach it by going to +{menuselection}`Accounting --> Customers --> Invoices`. + +The Invoicing onboarding banner consists of four main steps: + +```{image} get_started/invoicing-onboarding-banner.png +:alt: Step-by-step onboarding banner in Odoo Invoicing +``` + +1. {ref}`invoicing-setup-company` +2. {ref}`invoicing-setup-layout` +3. {ref}`invoicing-setup-invoice` +4. {ref}`invoicing-setup-payments` + +(invoicing-setup-company)= + +### Company Data + +Add your company’s details, such as the name, address, logo, website, phone number, email address, +and Tax ID or VAT number. These details are then displayed on your documents, such as invoices. + +:::{note} +You can also change the company's details by going to {menuselection}`Settings --> General +Settings`, scrolling down to the {guilabel}`Companies` section, and {guilabel}`Update Info`. +::: + +(invoicing-setup-layout)= + +### Documents Layout + +Customize the {ref}`default invoice layout `. + +:::{note} +You can also change the invoice layout by going to {menuselection}`Settings --> General +Settings`, scrolling down to the {guilabel}`Companies` section, and clicking {guilabel}`Configure +Document Layout`. +::: + +(invoicing-setup-invoice)= + +### Create Invoice + +Create your first invoice. + +:::{tip} +Add your **bank account number** and a link to your **General Terms & Condition** in the footer. +This way, your contacts can find the full content of your GT&C online without having to print +them on the invoices you issue. +::: + +(invoicing-setup-payments)= + +### Online Payments + +Get started with Stripe and enable secure integrated credit and debit card payments within Odoo. + +:::{tip} +To use other payment providers, go to +{guilabel}`Invoicing --> Configuration --> Payment Providers` and +{doc}`enable the desired providers <../payment_providers>`. +::: + +:::{seealso} +- {doc}`bank` +- {doc}`get_started/chart_of_accounts` +- {doc}`bank/bank_synchronization` +- {doc}`../fiscal_localizations` +- [Odoo Tutorials: Accounting and Invoicing - Getting started [video]](https://www.odoo.com/slides/slide/getting-started-1692) +::: + +```{toctree} +:titlesonly: true + +get_started/cheat_sheet +get_started/chart_of_accounts +get_started/multi_currency +get_started/avg_price_valuation +get_started/tax_units +``` + diff --git a/content/applications/finance/accounting/get_started/avg_price_valuation.md b/content/applications/finance/accounting/get_started/avg_price_valuation.md new file mode 100644 index 000000000..1a05c97ac --- /dev/null +++ b/content/applications/finance/accounting/get_started/avg_price_valuation.md @@ -0,0 +1,432 @@ +--- +substitutions: + AVCO: '{abbr}`AVCO (Average Cost Valuation)`' +--- + +# Average price on returned goods + +(inventory-avg-cost-definition)= + +*Average cost valuation* (AVCO) is an inventory valuation method that evaluates cost based on the +total cost of goods bought or produced during a period, divided by the total number of items +on-hand. Inventory valuation is used to: + +- reflect the value of a company's assets; +- keep track of the amount of unsold goods; +- account for monetary value in goods that have yet to generate profit; +- report on flow of goods throughout the quarter. + +Because {{ AVCO }} uses the weighted average to evaluate the cost, it is a good fit for companies that +sell only a few different products in large quantities. In Odoo, this costing analysis is +*automatically updated* each time products are received. + +Thus, when shipments are returned to their supplier, Odoo automatically generates accounting entries +to reflect the change in inventory valuation. However, Odoo does **not** automatically update the +{{ AVCO }} calculation, because {ref}`this can potentially create inconsistencies with inventory +valuation `. + +:::{note} +This document addresses a specific use case for theoretical purposes. For instructions on how to +set up and use {{ AVCO }}, refer to the {doc}`inventory valuation configuration +<../../../inventory_and_mrp/inventory/product_management/inventory_valuation/inventory_valuation_config>` +doc. +::: + +:::{seealso} +- {doc}`Using inventory valuation + <../../../inventory_and_mrp/inventory/product_management/inventory_valuation/using_inventory_valuation>` +- {ref}`Other inventory valuation methods ` +::: + +## Configuration + +To use average cost inventory valuation on a product, navigate to {menuselection}`Inventory --> +Configuration --> Product Categories` and select the category that will be using {{ AVCO }}. On the +product category page, set {guilabel}`Costing Method` to `Average Cost (AVCO)` and +{guilabel}`Inventory Valuation` to `Automated`. + +:::{seealso} +{doc}`Inventory valuation configuration +<../../../inventory_and_mrp/inventory/product_management/inventory_valuation/inventory_valuation_config>` +::: + +## Using average cost valuation + +The average cost method adjusts the inventory valuation when products are received in the warehouse. +This section explains how it works, but if the explanation is unnecessary, skip to the {ref}`return +to supplier use case ` section. + +(inventory-avg-cost-formula)= + +### Formula + +When new products arrive, the new average cost for each product is recomputed using the formula: + +$$ +Avg~Cost = \frac{(Old~Qty \times Old~Avg~Cost) + (Incoming~Qty \times Purchase~Price)}{Final~Qty} +$$ + +- **Old Qty**: product count in stock before receiving the new shipment; +- **Old Avg Cost**: calculated average cost for a single product from the previous inventory + valuation; +- **Incoming Qty**: count of products arriving in the new shipment; +- **Purchase Price**: estimated price of products at the reception of products (since vendor bills + may arrive later). The amount includes not only the price for the products, but also added costs, + such as shipping, taxes, and {doc}`landed costs + <../../../inventory_and_mrp/inventory/product_management/inventory_valuation/landed_costs>`. At + reception of the vendor bill, this price is adjusted; +- **Final Qty**: quantity of on-hand stock after the stock move. + +(inventory-avg-cost-definite-rule)= + +:::{important} +When products leave the warehouse, the average cost **does not** change. Read about why the +average cost valuation is **not** adjusted {ref}`here `. +::: + +(inventory-avg-cost-math-table)= + +### Compute average cost + +To understand how the average cost of a product changes with each shipment, consider the following +table of warehouse operations and stock moves. Each is a different example of how the average cost +valuation is affected. + +| Operation | Incoming Value | Inventory Value | Qty On Hand | Avg Cost | +| ----------------------------- | -------------- | --------------- | ----------- | -------- | +| | | \$0 | 0 | \$0 | +| Receive 8 tables at \$10/unit | 8 * \$10 | \$80 | 8 | \$10 | +| Receive 4 tables at \$16/unit | 4 * \$16 | \$144 | 12 | \$12 | +| Deliver 10 tables | -10 * \$12 | \$24 | 2 | \$12 | + +(inventory-avg-cost-ex-1)= + +```{eval-rst} +.. exercise:: + Ensure comprehension of the above computations by reviewing the "Receive 8 tables at $10/unit" + example. + + Initially, the product stock is 0, so all values are $0. + + In the first warehouse operation, `8` tables are received at `$10` each. The average cost is + calculated using the :ref:`formula `: + + .. math:: + Avg~Cost = \frac{0 + 8 \times $10}{8} = \frac{$80}{8} = $10 + + - Since the *incoming quantity* of tables is `8` and the *purchase price* for each is `$10`, + - The inventory value in the numerator is evaluated to `$80`; + - `$80` is divided by the total amount of tables to store, `8`; + - `$10` is the average cost of a single table from the first shipment. + + To verify this in Odoo, in the *Purchase* app, order `8` quantities of a new product, `Table`, + with no previous stock moves, for `$10` each. + + In the table's :guilabel:`Product Category` field in the :guilabel:`General Information` tab of + the product form, click the :guilabel:`➡️ (arrow)` icon, to open an :guilabel:`External Link` to + edit the product category. Set the :guilabel:`Costing Method` to `Average Cost (AVCO)` and + :guilabel:`Inventory Valuation` to `Automated`. + + Then, return to the purchase order. Click :guilabel:`Confirm Order`, and click :guilabel:`Receive + Products` to confirm receipt. + + Next, check the inventory valuation record generated by the product reception by navigating to + :menuselection:`Inventory --> Reporting --> Inventory Valuation`. Select the drop-down for + `Table`, and view the :guilabel:`Total Value` column for the *valuation layer* (:dfn:`inventory + valuation at a specific point in time = on-hand quantity * unit price`). The 8 tables in-stock + are worth $80. + + .. image:: avg_price_valuation/inventory-val-8-tables.png + :align: center + :alt: Show inventory valuation of 8 tables in Odoo. +``` + +:::{tip} +When the product category's {guilabel}`Costing Method` is set to {guilabel}`AVCO`, then the +average cost of a product is also displayed on the {guilabel}`Cost` field, under the +{guilabel}`General Information` tab, on the product page itself. +::: + +#### Product delivery (use case) + +For outgoing shipments, {ref}`outbound products have no effect on the average cost valuation +`. Although the average cost valuation is not recalculated, the +inventory value still decreases because the product is removed from stock and delivered to the +customer location. + +```{eval-rst} +.. exercise:: + To demonstrate that the average cost valuation is not recalculated, examine the "Deliver 10 + tables" example. + + .. math:: + Avg~Cost = \frac{12 \times $12 + (-10) \times $12}{12-10} = \frac{24}{2} = $12 + + #. Because 10 tables are being sent out to customers, the *incoming quantity* is `-10`. The + previous average cost (`$12`) is used in lieu of a vendor's *purchase price*; + #. The *incoming inventory value* is `-10 * $12 = -$120`; + #. The old *inventory value* (`$144`) is added to the *incoming inventory value* (`-$120`), so + `$144 + -$120 = $24`; + #. Only `2` tables remain after shipping out `10` tables from `12`. So the current *inventory + value* (`$24`) is divided by the on-hand quantity (`2`); + #. `$24 / 2 = $12`, which is the same average cost as the previous operation. + + To verify this in Odoo, sell `10` tables in the *Sales* app, validate the delivery, and then + review the inventory valuation record by going to in :menuselection:`Inventory --> Reporting --> + Inventory Valuation`. In the topmost valuation layer, delivering `10` tables reduces the + product's value by `-$120`. + + **Note**: What is not represented in this stock valuation record is the revenue made from this + sale, so this decrease is not a loss to the company. + + .. image:: avg_price_valuation/inventory-val-send-10-tables.png + :align: center + :alt: Show how deliveries decrease inventory valuation. +``` + +(inventory-avg-cost-return)= + +## Return items to supplier (use case) + +Because the price paid to suppliers can differ from the price the product is valued at with the +{{ AVCO }} method, Odoo handles returned items in a specific way. + +1. Products are returned to suppliers at the original purchase price, but; +2. The internal cost valuation remains unchanged. + +The above {ref}`example table ` is updated as follows: + +| Operation | Qty\*Avg Cost | Inventory Value | Qty On Hand | Avg Cost | +| ----------------------------- | ------------- | --------------- | ----------- | -------- | +| | | \$24 | 2 | \$12 | +| Return 1 table bought at \$10 | -1 * \$12 | \$12 | 1 | \$12 | + +In other words, returns to vendors are perceived by Odoo as another form of a product exiting the +warehouse. To Odoo, because the table is valued at \$12 per unit, the inventory value is reduced by +`$12` when the product is returned; the initial purchase price of `$10` is unrelated to the table's +average cost. + +```{eval-rst} +.. example:: + To return a single table that was purchased for `$10`, navigate to the receipt in the *Inventory* + app for the :ref:`8 tables purchased in Exercise 1 ` by going to the + :guilabel:`Inventory Overview`, clicking on :guilabel:`Receipts`, and selecting the desired + receipt. + + Then, click :guilabel:`Return` on the validated delivery order, and modify the quantity to `1` in + the reverse transfer window. This creates an outgoing shipment for the table. Select + :guilabel:`Validate` to confirm the outgoing shipment. + + Return to :menuselection:`Inventory --> Reporting --> Inventory Valuation` to see how the + outgoing shipment decreases the inventory value by $12. + + .. image:: avg_price_valuation/inventory-valuation-return.png + :align: center + :alt: Inventory valuation for return. +``` + +(inventory-avg-price-leaving-inventory)= + +### Eliminate stock valuation errors in outgoing products + +Inconsistencies can occur in a company's inventory when the average cost valuation is recalculated +on outgoing shipments. + +To demonstrate this error, the table below displays a scenario in which 1 table is shipped to a +customer and another is returned to a supplier at the purchased price. + +| Operation | Qty\*Price | Inventory Value | Qty On Hand | Avg Cost | +| ----------------------------------------- | ---------- | --------------- | ----------- | -------- | +| | | \$24 | 2 | \$12 | +| Ship 1 product to customer | -1 * \$12 | \$12 | 1 | \$12 | +| Return 1 product initially bought at \$10 | -1 * \$10 | **\$2** | **0** | \$12 | + +In the final operation above, the final inventory valuation for the table is `$2` even though there +are `0` tables left in stock. + +:::{admonition} Correct method +Use the average cost to value the return. This does not mean the company gets \$12 back for a \$10 +purchase; the item returned for \$10 is valued internally at \$12. The inventory value change +represents a product worth \$12 no longer being accounted for in company assets. +::: + +## Anglo-Saxon accounting + +In addition to using {{ AVCO }}, companies that use **Anglo-Saxon accounting** also keep a holding +account that tracks the amount to be paid to vendors. Once a vendor delivers an order, **inventory +value** increases based on the vendor price of the products that have entered the stock. The holding +account (called **stock input**) is credited and only reconciled once the vendor bill is received. + +:::{seealso} +- {ref}`Anglo-Saxon vs. Continental ` +::: + +The table below reflects journal entries and accounts. The *stock input* account stores the money +intended to pay vendors when the vendor bill has not yet been received. To balance accounts when +returning products that have a price difference between the price the product is **valued at** and +the price it was bought for, a *price difference* account is created. + +(inventory-avg-price-price-table)= + +| Operation | Stock Input | Price Diff | Inventory Value | Qty On Hand | Avg Cost | +| --------------------------------------- | ----------- | ---------- | --------------- | ----------- | -------- | +| | | | \$0 | 0 | \$0 | +| Receive 8 tables at \$10 | (\$80) | | \$80 | 8 | \$10 | +| Receive vendor bill \$80 | \$0 | | \$80 | 8 | \$10 | +| Receive 4 tables at \$16 | (\$64) | | \$144 | 12 | \$12 | +| Receive vendor bill \$64 | \$0 | | \$144 | 12 | \$12 | +| Deliver 10 tables to customer | \$0 | | \$24 | 2 | \$12 | +| Return 1 table initially bought at \$10 | **\$10** | **\$2** | **\$12** | 1 | \$12 | +| Receive vendor refund \$10 | \$0 | \$2 | \$12 | 1 | \$12 | + +### Product reception + +#### Summary + +At product reception, Odoo ensures companies can pay for goods that were purchased by preemptively +moving an amount matching the price of received goods into the {doc}`liability account +`, **Stock Input**. Then, once the bill +has been received, the amount in the holding account is transferred to *Accounts Payable*. Transfers +into this account means the bill has been paid. **Stock Input** is reconciled once the vendor bill +is received. + +Inventory valuation is a method of calculating how much each in-stock product is worth internally. +Since there is a difference between the price the product is **valuated at** and the price the +product was actually **purchased for**, the **Inventory Valuation** account is unrelated to the +crediting and debiting operations of the **Stock Input** account. + +To conceptualize all this, follow the breakdown below. + +#### Accounts balanced at received products + +In this example, a company starts with zero units of a product, `table`, in stock. Then, 8 tables +are received from the vendor: + +1. The **Stock Input** account stores `$80` of credit owed to the vendor. The amount in this account + is unrelated to the inventory value. +2. `$80` worth of tables came **in** (**debit** the *Inventory Value* account `$80`), and +3. `$80` must be paid **out** for received goods (**credit** the *Stock Input* account `$80`). + +##### In Odoo + +Odoo generates an accounting journal entry when shipments that use {{ AVCO }} costing method are +received. Configure a {guilabel}`Price Difference Account` by selecting the {guilabel}`➡️ (arrow)` +icon next to the {guilabel}`Product Category` field on the product page. + +Under {guilabel}`Account Properties`, create a new {guilabel}`Price Difference Account` by typing in +the name of the account and clicking {guilabel}`Create and Edit`. Then set the account +{guilabel}`Type` as `Expenses`, and click {guilabel}`Save`. + +```{image} avg_price_valuation/create-price-difference.png +:align: center +:alt: Create price difference account. +``` + +Then, receive the shipment in the *Purchase* app or *Inventory* app, and navigate to the +{menuselection}`Accounting app --> Accounting --> Journal Entries`. In the list, find the +{guilabel}`Reference` that matches the warehouse reception operation for the relevant product. + +```{image} avg_price_valuation/search-for-entry-of-tables.png +:align: center +:alt: Show accounting entry of 8 tables from the list. +``` + +Click on the line for 8 tables. This accounting journal entry shows that when the 8 tables were +received, the `Stock Valuation` account increased by `$80`. Conversely, the **Stock Input** account +(set as `Stock Interim (Received)` account by default) is credited `$80`. + +```{image} avg_price_valuation/accounting-entry-8-tables.png +:align: center +:alt: Debit stock valuation and credit stock input 80 dollars. +``` + +#### Accounts balanced at received vendor bill + +In this example, a company starts with zero units of a product, table, in stock. Then, 8 tables are +received from the vendor. When the bill is received from vendor for 8 tables: + +1. Use `$80` in the **Stock Input** account to pay the bill. This cancels out and the account now + holds `$0`. +2. Debit **Stock Input** `$80` (to reconcile this account). +3. Credit **Accounts payable** `$80`. This account stores the amount the company owes others, so + accountants use the amount to write checks to vendors. + +##### In Odoo + +Once the vendor requests payment, navigate to the {menuselection}`Purchase app --> Orders --> +Purchase` and select the {abbr}`PO (Purchase Order)` for 8 tables. Inside the {abbr}`PO (Purchase +Order)`, select {guilabel}`Create Bill`. + +Switch to the {guilabel}`Journal Items` tab to view how `$80` is transferred from the holding +account, `Stock Interim (Received)` to `Accounts Payable`. {guilabel}`Confirm` the bill to record +the payment to the vendor. + +```{image} avg_price_valuation/receive-8-table-bill.png +:align: center +:alt: Show bill linked to the purchase order for 8 tables. +``` + +### On product delivery + +In the {ref}`above example table `, when 10 products are delivered +to a customer, the **Stock Input** account is untouched because there are no new products coming in. +To put it simply: + +1. **Inventory valuation** is credited `$120`. Subtracting from inventory valuation represents + `$120` worth of products exiting the company. +2. Debit **Accounts Receivable** to record revenue from the sale. + +```{image} avg_price_valuation/sell-10-tables.png +:align: center +:alt: Show journal items linked to sale order. +``` + +```{eval-rst} +.. spoiler:: Understand Anglo-Saxon expensing + + In the accounting journal entry invoicing a customer for 10 tables, the accounts **Product + Sales**, **Tax Received**, and **Accounts Receivable** all pertain to the sale of the product. + **Accounts Receivable** is the account where the customer payment will be received. + + Anglo-Saxon accounting recognizes the cost of goods sold (COGS) once the sale is made. So, up + until the product is sold, scrapped, or returned, costs of keeping the product in stock are not + accounted for. The **Expense** account is debited `$120` to log the costs of storing 10 tables + during this period of time. +``` + +### On product return + +In the {ref}`above example table `, when returning 1 product to a +vendor purchased at `$10`, a company expects `$10` in the **Accounts Payable** account from the +vendor. However, **Stock Input** account must be debited `$12` because the average cost is `$12` at +the time of the return. The missing `$2` is accounted for in the {guilabel}`Price Difference +Account`, which is set up in the product's {guilabel}`Product Category`. + +:::{note} +Behavior of *price difference accounts* varies from localization. In this case, the account is +intended to store differences between vendor price and *automated* inventory valuation methods. +::: + +Summary: + +1. Debit **Stock Input** account `$10` to move the table from stock to stock input. This move is to + indicate that the table is to be processed for an outgoing shipment. +2. Debit **Stock Input** an additional `$2` to account for the **Price Difference**. +3. Credit **Stock Valuation** `$12` because the item is leaving the stock. + +```{image} avg_price_valuation/expensing-price-difference-account.png +:align: center +:alt: 2 dollar difference expensed in Price Difference account. +``` + +Once the vendor's refund is received, + +1. Credit **Stock Input** account `$10` to reconcile the price of the table. +2. Debit **Accounts Payable** `$10` to have the accountants collect and register the payment in + their journal. + +```{image} avg_price_valuation/return-credit-note.png +:align: center +:alt: Return to get 10 dollars back. +``` + diff --git a/content/applications/finance/accounting/get_started/chart_of_accounts.md b/content/applications/finance/accounting/get_started/chart_of_accounts.md new file mode 100644 index 000000000..4253103dd --- /dev/null +++ b/content/applications/finance/accounting/get_started/chart_of_accounts.md @@ -0,0 +1,185 @@ +# Chart of accounts + +The **chart of accounts (COA)** is the list of all the accounts used to record financial +transactions in the general ledger of an organization. The chart of accounts can be found under +{menuselection}`Accounting --> Configuration --> Chart of Accounts`. + +When browsing your chart of accounts, you can sort the accounts by {guilabel}`Code`, +{guilabel}`Account Name`, or {guilabel}`Type`, but other options are available in the drop-down menu + +```{image} chart_of_accounts/drop-down.png +:alt: Drop-down toggle button +``` + +```{image} chart_of_accounts/chart-of-accounts-sort.png +:alt: Group the accounts by type in Odoo Accounting +``` + +(chart-of-account-create)= + +## Configuration of an account + +The country you select during the creation of your database (or additional company in your database) +determines which {doc}`fiscal localization package <../../fiscal_localizations>` is installed by +default. This package includes a standard chart of accounts already configured according to the +country's regulations. You can use it directly or set it according to your company's needs. + +To create a new account, go to {menuselection}`Accounting --> Configuration --> Chart of Accounts`, +click {guilabel}`Create`, and fill in (at the minimum) the required fields +({guilabel}`Code, Account Name, Type`). + +:::{warning} +It is not possible to modify the **fiscal localization** of a company once a journal entry has +been posted. +::: + +### Code and name + +Each account is identified by its {guilabel}`Code` and {guilabel}`Name`, which also indicate the +account's purpose. + +(chart-of-account-type)= + +### Type + +Correctly configuring the **account type** is critical as it serves multiple purposes: + +- Information on the account's purpose and behavior +- Generate country-specific legal and financial reports +- Set the rules to close a fiscal year +- Generate opening entries + +To configure an account type, open the {guilabel}`Type` field's drop-down selector and select the +corresponding type from the following list: + +```{eval-rst} ++---------------+--------------+-------------------------+ +| 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 | ++---------------+--------------+-------------------------+ +``` + +#### Assets + +Some **account types** can **automate** the creation of {ref}`asset ` entries. +To **automate** entries, click {guilabel}`View` on an account line and go to the +{guilabel}`Automation` tab. + +You have three choices for the {guilabel}`Automation` tab: + +1. {guilabel}`No`: this is the default value. Nothing happens. +2. {guilabel}`Create in draft`: whenever a transaction is posted on the account, a draft entry is + created but not validated. You must first fill out the corresponding form. +3. {guilabel}`Create and validate`: you must also select a {guilabel}`Deferred Expense Model`. + Whenever a transaction is posted on the account, an entry is created and immediately validated. + +### Default taxes + +In the {guilabel}`View` menu of an account, select a **default tax** to be applied when this +account is chosen for a product sale or purchase. + +### Tags + +Some accounting reports require **tags** to be set on the relevant accounts. To add a tag, under +{guilabel}`View`, click the {guilabel}`Tags` field and select an existing tag or {guilabel}`Create` +a new one. + +### Account groups + +**Account groups** are useful to list multiple accounts as *sub-accounts* of a bigger account and +thus consolidate reports such as the **Trial Balance**. By default, groups are handled automatically +based on the code of the group. For example, a new account `131200` is going to be part of the group +`131000`. You can attribute a specific group to an account in the {guilabel}`Group` field under +{guilabel}`View`. + +#### Create account groups manually + +:::{note} +Regular users should not need to create account groups manually. The following section is only +intended for rare and advanced use cases. +::: + +To create a new account group, activate {ref}`developer mode ` and head to +{menuselection}`Accounting --> Configuration --> Account Groups`. Here, create a new group and enter +the {guilabel}`name, code prefix, and company` to which that group account should be available. Note +that you must enter the same code prefix in both {guilabel}`From` and {guilabel}`to` fields. + +```{image} chart_of_accounts/account-groups.png +:alt: Account groups creation. +``` + +To display your **Trial Balance** report with your account groups, go to +{menuselection}`Accounting --> Reporting --> Trial Balance`, then open the {guilabel}`Options` menu +and select {guilabel}`Hierarchy and Subtotals`. + +```{image} chart_of_accounts/chart-of-accounts-groups.png +:alt: Account Groups in the Trial Balance in Odoo Accounting +``` + +### 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. + +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 +``` + +### Deprecated + +It is not possible to delete an account once a transaction has been recorded on it. You can make +them unusable by using the **Deprecated** feature: check the {guilabel}`Deprecated` box in the +account's settings, and {guilabel}`Save`. + +:::{seealso} +- {doc}`cheat_sheet` +- {doc}`../vendor_bills/assets` +- {doc}`../vendor_bills/deferred_expenses` +- {doc}`../customer_invoices/deferred_revenues` +- {doc}`../../fiscal_localizations` +- [Odoo Tutorials: Chart of accounts](https://www.odoo.com/slides/slide/chart-of-accounts-1630) +- [Odoo Tutorials: Update your chart of accounts](https://www.odoo.com/slides/slide/update-your-chart-of-accounts-1658) +::: + diff --git a/content/applications/finance/accounting/get_started/cheat_sheet.md b/content/applications/finance/accounting/get_started/cheat_sheet.md new file mode 100644 index 000000000..fd8ec2dcb --- /dev/null +++ b/content/applications/finance/accounting/get_started/cheat_sheet.md @@ -0,0 +1,274 @@ +--- +code-column: true +custom-css: accounting.css +custom-js: accounts.js,chart-of-accounts.js,entries.js,misc.js,reconciliation.js +--- + +# Accounting cheat sheet + +```{eval-rst} +.. h:div:: intro-list + + .. rst-class:: intro-balance + + The **Balance Sheet** is a snapshot of the company's finances at a specific date (as opposed to + the Profit and Loss, which is an analysis over a period). + + * .. rst-class:: intro-assets + + **Assets** represent the company's wealth and the goods it owns. Fixed assets include buildings + and offices, while current assets include bank accounts and cash. The money owed by a client is + an asset. An employee is not an asset. + + * .. rst-class:: intro-liabilities + + **Liabilities** are obligations from past events that the company will have to pay in the + future (utility bills, debts, unpaid suppliers). Liabilities could also be defined as a source + of financing which is provided to the company, also called *leverage*. + + * .. rst-class:: intro-equity + + **Equity** is the amount of the funds contributed by the owners of the company (founders or + shareholders) plus previously retained earnings (or losses). Each year, net profits (or losses) + may be reported as retained earnings or distributed to the shareholders (as a dividend). +``` + +What is owned (an asset) has been financed through debts to reimburse (liabilities) or equity +(profits, capital). + +A difference is made between **assets** and **expenses**: +: - An **asset** is a resource with economic value that an individual, corporation, or country owns + or controls with the expectation that it will provide a future benefit. Assets are reported on + a company's balance sheet. They are bought or created to increase a firm's value or benefit its + operations. + - An **expense** is the costs of operations a company bears to generate revenues. + +```{eval-rst} +.. h:div:: intro-list + + .. rst-class:: intro-p-l + + The **profit and loss** (P&L) report shows the company's performance over a specific period of + time, usually a quarter or a fiscal year. + + * .. rst-class:: intro-gross-profit + + The **revenue** refers to the money earned by the company by selling goods and/or services. + + * .. rst-class:: intro-gross-profit + + The **cost of goods sold** (COGS, or also known as "Cost of Sale") refers to the sale of + goods' costs (e.g., the cost of the materials and labor used to create the goods). + + * .. rst-class:: intro-gross-profit + + The **Gross profit** equals the revenues from sales minus the cost of goods sold. + + * .. rst-class:: intro-opex + + **Operating expenses** (OPEX) include administration, sales and R&D salaries, rent and + utilities, miscellaneous costs, insurances, and anything beyond the costs of products sold + or the cost of sale. +``` + +```{eval-rst} +.. h:div:: doc-aside accounts-table + + .. placeholder +``` + +```{eval-rst} +.. rst-class:: doc-aside +``` + +```{eval-rst} +.. highlights:: Assets = Liabilities + Equity +``` + +## Chart of accounts + +The **chart of accounts** lists all the company's accounts: both Balance sheet accounts and P&L +accounts. Every transaction is recorded by debiting and crediting multiple accounts in a journal +entry. In a way, a chart of accounts is like a company's DNA! + +Every account listed in the chart of accounts belongs to a specific category. In Odoo, each account +has a unique code and belongs to one of these categories: + +- **Equity and subordinated debts** + : - **Equity** is the amount of money invested by a company's shareholders to finance the + company's activities. + - **Subordinated debts** are the amount of money lent by a third party to a company to finance + its activities. In the event of the dissolution of a company, these third parties are + reimbursed before the shareholders. +- **Fixed assets** are tangible (i.e., physical) items or properties that a company purchases and + uses to produce its goods and services. Fixed assets are long-term assets. This means the assets + have a useful life of more than one year. They also include properties, plants, and equipments + (also known as "PP&E") and are recorded on the balance sheet with that classification. +- **Current assets and liabilities** + : - The **current assets** account is a balance sheet line item listed under the Assets section, + which accounts for all company-owned assets that can be converted to cash within one year. + Current assets include cash, cash equivalents, accounts receivable, stock inventory, + marketable securities, prepaid liabilities, and other liquid assets. + - **Current liabilities** are a company's short-term financial obligations due within one year. + An example of a current liability is money owed to suppliers in the form of accounts payable. +- **Bank and cash accounts** + : - A **bank account** is a financial account maintained by a bank or other financial institution + in which the financial transactions between the bank and a customer are recorded. + - A **cash account**, or cash book, may refer to a ledger in which all cash transactions are + recorded. The cash account includes both the cash receipts and the cash payment journals. +- **Expenses and income** + : - An **expense** is the costs of operations a company bears to generate revenues. It is simply + defined as the cost one is required to spend on obtaining something. Common expenses include + supplier payments, employee wages, factory leases, and equipment depreciation. + - The term "**income**" generally refers to the amount of money, property, and other transfers + of value received over a set period of time in exchange for services or products. + +### Example + +```{eval-rst} +.. h:div:: example + + \*: Customer Refund and Customer Payment boxes cannot be simultaneously selected as they are contradictory. +``` + +```{eval-rst} +.. h:div:: doc-aside + + .. highlights:: Balance = Debit - Credit + + .. h:div:: chart-of-accounts + + .. placeholder +``` + +(cheat-sheet-journals)= + +## Journal entries + +Every financial document of the company (e.g., an invoice, a bank statement, a pay slip, a capital +increase contract) is recorded as a journal entry, impacting several accounts. + +For a journal entry to be balanced, the sum of all its debits must be equal to the sum of all its +credits. + +```{eval-rst} +.. h:div:: doc-aside journal-entries + + examples of accounting entries for various transactions. (see entries.js) +``` + +(accounting-reconciliation)= + +## Reconciliation + +{doc}`Reconciliation <../../accounting/bank/reconciliation>` is the process of linking +journal items of a specific account and matching credits and debits. + +Its primary purpose is to link payments to their related invoices to mark them as paid. This is done +by doing a reconciliation on the accounts receivable account and/or the accounts payable account. + +Reconciliation is performed automatically by the system when: + +- the payment is registered directly on the invoice +- the links between the payments and the invoices are detected at the bank matching process + +```{eval-rst} +.. h:div:: doc-aside reconciliation-example + + .. rubric:: Customer Statement Example + + .. rst-class:: table-sm d-c-table + + +-------------------------+-------------------------+-----------------------+ + |Accounts Receivable |Debit |Credit | + +=========================+=========================+=======================+ + |Invoice 1 |100 | | + +-------------------------+-------------------------+-----------------------+ + |Partial payment 1/2 | |70 | + +-------------------------+-------------------------+-----------------------+ + |Invoice 2 |65 | | + +-------------------------+-------------------------+-----------------------+ + |Partial payment 2/2 | |30 | + +-------------------------+-------------------------+-----------------------+ + |Payment 2 | |65 | + +-------------------------+-------------------------+-----------------------+ + |Invoice 3 |50 | | + +-------------------------+-------------------------+-----------------------+ + | | | | + +-------------------------+-------------------------+-----------------------+ + |Total to pay |50 | | + +-------------------------+-------------------------+-----------------------+ +``` + +## Bank Reconciliation + +Bank reconciliation is the matching of bank statement lines (provided by your bank) with +transactions recorded internally (payments to suppliers or from customers). For each line in a bank +statement, it can be: + +- **matched with a previously recorded payment**: a payment is registered when a check is received + from a customer, then matched when checking the bank statement. +- **recorded as a new payment**: the payment's journal entry is created and reconciled with the + related invoice when processing the bank statement. +- **recorded as another transaction**: bank transfer, direct charge, etc. + +Odoo should automatically reconcile most transactions; only a few should need manual review. When +the bank reconciliation process is finished, the balance on the bank account in Odoo should match +the bank statement's balance. + +```{eval-rst} +.. rst-class:: checks-handling +``` + +## Checks Handling + +There are two approaches to managing checks and internal wire transfers: + +- Two journal entries and a reconciliation +- One journal entry and a bank reconciliation + +```{eval-rst} +.. h:div:: doc-aside + + The first journal entry is created by registering the payment on the + invoice. The second one is created when registering the bank statement. + + .. rst-class:: table-sm d-c-table + + +-------------------------+--------------+------------+---------------+ + |Account |Debit |Credit |Reconciliation | + +=========================+==============+============+===============+ + |Account Receivable | |100 |Invoice ABC | + +-------------------------+--------------+------------+---------------+ + |Undeposited funds |100 | |Check 0123 | + +-------------------------+--------------+------------+---------------+ + + .. rst-class:: table-sm d-c-table + + +-------------------------+--------------+------------+---------------+ + |Account |Debit |Credit |Reconciliation | + +=========================+==============+============+===============+ + |Undeposited funds | |100 |Check 0123 | + +-------------------------+--------------+------------+---------------+ + |Bank |100 | | | + +-------------------------+--------------+------------+---------------+ +``` + +```{eval-rst} +.. h:div:: doc-aside + + A journal entry is created by registering the payment on the invoice. When + reconciling the bank statement, the statement line is linked to the + existing journal entry. + + .. rst-class:: table-sm d-c-table + + +-------------------------+--------------+------------+---------------+---------------+ + |Account |Debit |Credit |Reconciliation |Bank Statement | + +=========================+==============+============+===============+===============+ + |Account Receivable | |100 |Invoice ABC | | + +-------------------------+--------------+------------+---------------+---------------+ + |Bank |100 | | |Statement XYZ | + +-------------------------+--------------+------------+---------------+---------------+ +``` + diff --git a/content/applications/finance/accounting/get_started/multi_currency.md b/content/applications/finance/accounting/get_started/multi_currency.md new file mode 100644 index 000000000..df064a112 --- /dev/null +++ b/content/applications/finance/accounting/get_started/multi_currency.md @@ -0,0 +1,162 @@ +# Multi-currency system + +Odoo allows you to issue invoices, receive bills, and record transactions in currencies other than +the main currency configured for your company. You can also set up bank accounts in other currencies +and run reports on your foreign currency activities. + +:::{seealso} +- {doc}`../bank/foreign_currency` +::: + +(multi-currency-config)= + +## Configuration + +(multi-currency-config-main-currency)= + +### Main currency + +The **main currency** is defined by default according to the company's country. You can change it by +going to {menuselection}`Accounting --> Configuration --> Settings --> Currencies` and changing the +currency in the {guilabel}`Main Currency` setting. + +(multi-currency-config-enable)= + +### Enable foreign currencies + +Go to {menuselection}`Accounting --> Configuration --> Currencies`, and enable the currencies you +wish to use by toggling the {guilabel}`Active` button. + +```{image} multi_currency/enable-foreign-currencies.png +:align: center +:alt: Enable the currencies you wish to use. +``` + +(multi-currency-config-rates)= + +### Currency rates + +#### Manual update + +To manually create and set a currency rate, go to {menuselection}`Accounting --> Configuration --> +Currencies`, click on the currency you wish to change the rate of, and under the {guilabel}`Rates` +tab, click {guilabel}`Add a line` to create a new rate. + +```{image} multi_currency/manual-rate-update.png +:align: center +:alt: Create or modify the currency rate. +``` + +#### Automatic update + +When you activate a second currency for the first time, {guilabel}`Automatic Currency Rates` appears +under {menuselection}`Accounting Dashboard --> Configuration --> Settings --> Currencies`. By +default, you have to click on the **Update now** button ({guilabel}`🗘`) to update the rates. + +Odoo can update the rates at regular intervals. To do so, change the {guilabel}`Interval` from +{guilabel}`Manually` to {guilabel}`Daily`, {guilabel}`Weekly`, or {guilabel}`Monthly`. You can also +select the web service from which you want to retrieve the latest currency rates by clicking on the +{guilabel}`Service` field. + +(multi-currency-config-exch-diff)= + +### Exchange difference entries + +Odoo automatically records exchange differences entries on dedicated accounts, in a dedicated +journal. + +You can define which journal and accounts to use to **post exchange difference entries** by +going to {menuselection}`Accounting --> Configuration --> Settings --> Default Accounts` and editing +the {guilabel}`Journal`, {guilabel}`Gain Account`, and {guilabel}`Loss Account`. + +```{eval-rst} +.. example:: + If you receive a payment for a customer invoice one month after it was issued, the exchange rate + has likely changed since. Therefore, this fluctuation implies some profit or loss due to the + exchange difference, which Odoo automatically records in the default **Exchange Difference** + journal. +``` + +(multi-currency-config-coa)= + +### Chart of accounts + +Each account can have a set currency. By doing so, all moves relevant to the account are forced to +have that account's currency. + +To do so, go to {menuselection}`Accounting --> Configuration --> Charts of Accounts` and select a +currency in the field {guilabel}`Account Currency`. If left empty, all active currencies are handled +instead of just one. + +(multi-currency-config-journals)= + +### Journals + +If a currency is set on a **journal**, that journal only handles transactions in that currency. + +To do so, go to {menuselection}`Accounting --> Configuration --> Journals`, open the journal you +want to edit, and select a currency in the field {guilabel}`Currency`. + +```{image} multi_currency/journal-currency.png +:align: center +:alt: Select the currency for the journal to handle. +``` + +(multi-currency-mca)= + +## Multi-currency accounting + +(multi-currency-mca-documents)= + +### Invoices, bills, and other documents + +For all documents, you can select the currency and journal to use for the transaction on the +document itself. + +```{image} multi_currency/currency-field.png +:align: center +:alt: Select the currency and journal to use. +``` + +(multi-currency-mca-payment)= + +### Payment registration + +To register a payment in a currency other than your company's main currency, click on the +{guilabel}`Register Payment` payment button of your document and, in the pop-up window, select a +**currency** in the {guilabel}`Amount` field. + +```{image} multi_currency/register-payment.png +:align: center +:alt: Select the currency and journal to use before registering the payment. +``` + +(multi-currency-mca-statements)= + +### Bank transactions + +When creating or importing bank transactions, the amount is in the company's main currency. To input +a **foreign currency**, select a currency in the {guilabel}`Foreign Currency`. Once selected, enter +the {guilabel}`Amount` in your main currency for it to automatically get converted in the foreign +currency in the {guilabel}`Amount in Currency field`. + +```{image} multi_currency/foreign-fields.png +:align: center +:alt: The extra fields related to foreign currencies. +``` + +When reconciling, Odoo displays both the foreign currency amount and the equivalent amount in your +company's main currency. + +(multi-currency-mca-exch-entries)= + +### Exchange rate journal entries + +To see **exchange difference journal entries**, go to {menuselection}`Accounting Dashboard --> +Accounting --> Journals: Miscellaneous`. + +```{image} multi_currency/exchange-journal-currency.png +:align: center +:alt: Exchange rate journal entry. +``` + diff --git a/content/applications/finance/accounting/get_started/tax_units.md b/content/applications/finance/accounting/get_started/tax_units.md new file mode 100644 index 000000000..e25c1f5ad --- /dev/null +++ b/content/applications/finance/accounting/get_started/tax_units.md @@ -0,0 +1,72 @@ +# Tax units + +:::{important} +This is only applicable to multi-company environments. +::: + +A **tax unit** is a group of VAT-taxable enterprises that are legally independent of each other but +are closely linked financially, organizationally, and economically and therefore considered the same +VAT-taxable enterprise. **Tax units** are not mandatory, but if created, constituent companies of +the unit must belong to the same **country**, use the same **currency**, and one company must be +designated as the **representative** company of the **tax unit**. **Tax units** receive a specific +**tax ID** intended only for **tax returns**. **Constituent** companies keep their **tax ID** used +for **commercial purposes**. + +```{eval-rst} +.. example:: + Enterprise **A** owes €300.000,00 of VAT taxes and enterprise **B** can recover €280.000,00 of + VAT taxes. They form up as a **tax unit** so that the two amounts balance out and must conjointly + only pay €20.000,00 of VAT taxes. +``` + +## Configuration + +To create a **tax unit**, go to {menuselection}`Accounting --> Configuration --> Tax Units`, and +click {guilabel}`New`. Enter a **name** for the unit, select a {guilabel}`Country`, the +{guilabel}`Companies` to incorporate in the unit, the {guilabel}`Main Company`, and the +{guilabel}`Tax ID` of the **constituent** company of that tax unit. + +### Fiscal position + +As transactions between constituents of the same **tax unit** are not subject to VAT, it is possible +to create a {doc}`tax mapping (fiscal position) <../taxes/fiscal_positions>` to avoid the +application of VAT on inter-constituent transactions. + +Be sure a constituent company has been selected before, then go to {menuselection}`Accounting --> +Configuration --> Fiscal Positions`, and {guilabel}`Create` a new **fiscal position**. Click the +{guilabel}`Tax Mapping` tab, select the {guilabel}`Tax on Product` usually applied for +**non-constituent** transactions, and in {guilabel}`Tax to Apply`, select the 0% tax to apply for +**constituent** transactions. + +Do the same for the {guilabel}`Account Mapping` tab if required, and repeat this process for +**each** constituent company on your database. + +```{eval-rst} +.. Example:: + Depending on your :doc:`localization package `, taxes + may vary from the screenshot displayed. + + .. image:: tax_units/fiscal-positions.png + :alt: Tax mapping of fiscal position for tax unit +``` + +Then, assign the fiscal position by opening the **Contacts** app. Search for a **constituent** +company, and open the contact's **card**. Click the {guilabel}`Sales & Purchase` tab, and in the +{guilabel}`Fiscal Position` field, input the **fiscal position** created for the **tax unit**. +Repeat the process for each **constituent** company card form, on each company database. + +:::{seealso} +{doc}`../taxes/fiscal_positions`. +::: + +## Tax report + +The **representative** company can access the aggregated tax report of the **tax unit** by going to +{menuselection}`Accounting --> Reporting --> Tax Report`, and selecting the **tax unit** in +{guilabel}`Tax Unit`. This report contains the aggregated transactions of all **constituents** and +the .XML export contains the name and VAT number of the **main** company. + +```{image} tax_units/report.png +:alt: tax unit tax report +``` + diff --git a/content/applications/finance/accounting/payments.md b/content/applications/finance/accounting/payments.md new file mode 100644 index 000000000..0cfecd8fb --- /dev/null +++ b/content/applications/finance/accounting/payments.md @@ -0,0 +1,395 @@ +--- +show-content: true +--- + +# Payments + +In Odoo, payments can either be automatically linked to an invoice or bill or be stand-alone records +for use at a later date: + +- If a payment is **linked to an invoice or bill**, it reduces/settles the amount due on the + invoice. Multiple payments on the same invoice are possible. +- If a payment is **not linked to an invoice or bill**, the customer has an outstanding credit with + the company, or the company has an outstanding debit with a vendor. Those outstanding amounts + reduce/settle unpaid invoices/bills. + +:::{seealso} +- {doc}`Internal transfers ` +- {doc}`bank/reconciliation` +- [Odoo Tutorials: Bank Configuration](https://www.odoo.com/slides/slide/bank-configuration-6832) +::: + +(accounting-payments-payment-methods)= + +## Payment methods + +Several payment methods are available in Odoo to allow different configurations for different types +of payments. Examples of payment methods include manual payments (such as cash), {doc}`checks +`, and batch payment files (such as {ref}`NACHA +` and {doc}`SEPA `). Payment methods can be +configured in the {guilabel}`Incoming Payments` and {guilabel}`Outgoing Payments` tabs of a bank or +cash journal. + +:::{seealso} +{doc}`../../sales/point_of_sale/payment_methods` for Point of Sale +::: + +(accounting-payments-preferred-payment-methods)= + +### Preferred payment method + +A contact's preferred payment method can be set so that when a payment is created for that contact, +the payment method is automatically selected by default. Invoices and bills can be filtered by +{guilabel}`Payment Method` to simplify {ref}`group ` payments. + +To set a preferred {guilabel}`Payment Method` for a customer or a vendor, go to +{menuselection}`Accounting --> Customers --> Customers` or {menuselection}`Accounting --> Vendors +--> Vendors` and select the customer or vendor. In the {guilabel}`Sales & Purchase` tab of the +contact form, select the preferred {guilabel}`Payment Method` in the {guilabel}`Sales` section for +invoice payments or for vendor bill payments in the {guilabel}`Purchase` section. + +:::{tip} +Access a full list of all contacts from the {guilabel}`Customers` or {guilabel}`Vendors` list +view by removing the {guilabel}`Customers` or {guilabel}`Vendors` filter. Alternatively, access +the full contact list through the Contacts app. +::: + +(accounting-payments-from-invoice-bill)= + +## Registering payment from an invoice or bill + +To register a payment for an invoice or a bill, follow these steps: + +1. Click {guilabel}`Pay` on a customer invoice or vendor bill. In the {guilabel}`Pay` window, select + the {guilabel}`Journal` and the {guilabel}`Payment Date`. +2. If previously set, the contact's preferred {guilabel}`Payment Method` is automatically selected + by default but can be updated if necessary. +3. If using {doc}`payment terms `, the {guilabel}`Amount` is + automatically set based on the installment amounts defined by the payment term. To pay the full + amount instead, click {guilabel}`full amount`. +4. If necessary, edit the {guilabel}`Memo`. +5. Click {guilabel}`Create Payment`. + +After the payment is registered, the customer invoice or vendor bill is marked as +{guilabel}`In payment`. + +```{eval-rst} +.. tabs:: + + .. 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 + :guilabel:`Payments` smart button. + + When the invoice or vendor bill is :doc:`reconciled ` with a bank + transaction, its status is updated to :guilabel:`Paid`. + + .. note:: + - If a bank transaction is reconciled in a different currency, a journal entry is + automatically created to post the currency exchange gains/loss amount. + - When a bank transaction is reconciled with an invoice with cash-basis, a journal entry is + automatically created to post the cash-basis tax amount. + + .. group-tab:: Using outstanding accounts + + 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 + **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`. + + The :icon:`fa-info-circle` information icon next to the payment line displays more + information about the payment. To access additional information, such as the related journal, + click :guilabel:`View`. + + .. image:: payments/information-icon.png + :alt: See detailed information of a payment. + + .. note:: + - Unreconciling a payment unlinks it from the invoice or bill but does not delete the + payment. + - If a payment is (un)reconciled in a different currency, a journal entry is automatically + created to post the currency exchange gains/losses (reversal) amount. + - If a payment is (un)reconciled on an invoice with cash-basis taxes, a journal entry is + automatically created to post the cash-basis tax (reversal) amount. + + .. tip:: + If the main bank account is set as the outstanding account on the bank journal's payment + method, registering the full payment on an invoice or bill moves the invoice/bill directly + to the :guilabel:`Paid` status without requiring bank reconciliation. +``` + +(accounting-payments-not-tied)= + +## Registering payments not tied to an invoice or bill + +When a new payment is registered via {menuselection}`Customers / Vendors --> Payments`, it is not +directly linked to an invoice or bill. + +```{eval-rst} +.. tabs:: + + .. 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 + 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. + + .. group-tab:: Using outstanding accounts + + Instead, the payment's journal entry matches the :guilabel:`outstanding account` with the + account receivable or the account payable until the payment is manually matched with its + related invoice or bill. Then, :doc:`reconciling ` the payment with the + bank transaction completes the payment workflow. +``` + +(accounting-payments-payments-matching)= + +### Payments matching + +:::{note} +During the {doc}`bank reconciliation ` process, a remaining balance is +identified if the total debits and credits do not match when records are compared with bank +transactions. This balance must either be reconciled later or written off immediately. +::: + +(accounting-payments-matching-invoices-bills)= + +#### For a single invoice or bill + +```{eval-rst} +.. tabs:: + + .. group-tab:: Without outstanding accounts + + By default, payments in Odoo do not create journal entries. As a result, there is no payment + to match. + + .. group-tab:: Using outstanding accounts + + A blue banner appears when validating a new invoice/bill and an **outstanding payment** exists + for this specific customer or vendor. To match it with the invoice or bill, click + :guilabel:`Add` under :guilabel:`Outstanding Credits` or :guilabel:`Outstanding Debits`. + + .. image:: payments/add-option.png + :alt: Shows the Add option to reconcile an invoice or a bill with a payment. + + The invoice or bill is then marked as :guilabel:`In payment` until the payment is + :doc:`reconciled ` with its corresponding :doc:`bank transaction(s) + `. +``` + +(accounting-payments-auto-reconcile-tool)= + +#### For multiple invoices or bills + +```{eval-rst} +.. tabs:: + + .. group-tab:: Without outstanding accounts + + By default, payments in Odoo do not create journal entries. As a result, there is no payment + to match, but this feature can still be used to match miscellaneous journal items. + + .. group-tab:: Using outstanding accounts + + The :guilabel:`Payments matching` or :guilabel:`Auto-reconcile` tool allows reconciling + journal items with each other (i.e., payments with customer invoices or vendor bills) either + individually or in batches. Access the :guilabel:`Accounting Dashboard`, click the + :icon:`fa-ellipsis-v` (:guilabel:`ellipsis`) button from the :guilabel:`Customer + Invoices` or :guilabel:`Vendor Bills` journals, and select :guilabel:`Payments Matching`. + Alternatively, go to :menuselection:`Accounting --> Accounting --> Reconcile`. + + To manually :guilabel:`Reconcile` journal items, select the individual items from the list + view and click :guilabel:`Reconcile`. +``` + +(accounting-payments-auto-reconcile-feature)= + +##### Auto-Reconcile Feature + +```{eval-rst} +.. tabs:: + + .. group-tab:: Without outstanding accounts + + To use the :guilabel:`Auto-Reconcile` feature, follow these steps: + + #. In the :guilabel:`Journal Items to reconcile` list view, click :guilabel:`Auto-Reconcile` + next to the receivable or payable account (or a specific contact's group of journal items + in that account). + #. In the :guilabel:`Reconcile automatically` window, click :guilabel:`Reconcile`. + + .. group-tab:: Using outstanding accounts + + To use the :guilabel:`Auto-Reconcile` feature, follow these steps: + + #. In the :guilabel:`Journal Items to reconcile` list view, click :guilabel:`Auto-Reconcile` + next to the receivable or payable account (or a specific contact's group of journal items + in that account). + #. In the :guilabel:`Reconcile Automatically` window, set the + :guilabel:`Reconcile` field depending on how you want to match journal items: + + - :guilabel:`Perfect Match`: Each debit journal item will be matched with + the corresponding credit journal item of the same value. + - :guilabel:`Clear Accounts`: All reconciled journal items will have the same + matching number, as they are selected from the same account. + + #. Click :guilabel:`Reconcile`. + + Invoices and bills are automatically matched to their corresponding payments and marked as + :guilabel:`In payment` until they are :doc:`reconciled ` with their + corresponding :doc:`bank transactions `. +``` + +(accounting-payments-group-payments)= + +## Registering payments on multiple invoices/credit notes or bills/refunds (group payments) + +To register payments on multiple invoices/credit notes or bills/refunds, follow these steps: + +1. Go to {menuselection}`Accounting --> Customers --> Invoices/Credit Notes` or + {menuselection}`Accounting --> Vendors --> Bills/Refunds`. +2. In the list view, click into the search bar, group by {guilabel}`Payment Method`, select the + relevant invoices/credit notes or bills/refunds and click {guilabel}`Pay`. +3. In the {guilabel}`Pay` window, select the {guilabel}`Journal` and the {guilabel}`Payment Date`. +4. If previously set, the contact's preferred {guilabel}`Payment Method` is automatically selected + by default but can be updated if necessary. +5. If using {doc}`payment terms `, the {guilabel}`Amount` is + automatically set based on the installment amounts defined by the payment term. To pay the full + amount instead, click {guilabel}`full amount`. +6. To combine all payments from the same contact into a single payment, enable the {guilabel}`Group + Payments` option, or leave it unchecked to create separate payments. +7. Click {guilabel}`Create payment`. + +```{eval-rst} +.. tabs:: + + .. group-tab:: Without outstanding accounts + + The invoices or bills are then marked as :guilabel:`In payment` until they are + :doc:`reconciled ` with the bank transactions. + + .. group-tab:: Using outstanding accounts + + The invoices or bills are then marked as :guilabel:`In payment` until the bank transactions + are :doc:`reconciled ` with the payments. +``` + +(accounting-payments-batch-payments)= + +## Registering a single payment for multiple customers or vendors (batch payments) + +Batch payments allow grouping payments from multiple contacts to ease {doc}`reconciliation +`. They are also useful when depositing {doc}`checks ` to the +bank or for generating bank payment files such as {doc}`SEPA ` or {ref}`NACHA +`. To do so, go to {menuselection}`Accounting --> Customers --> Payments` or +{menuselection}`Accounting --> Vendors --> Payments`. In the payments list view, select the payments +to be grouped in a batch, click {icon}`fa-cog` {guilabel}`Actions`, and select {guilabel}`Create +Batch Payment`. + +:::{note} +All payments in a batch must have the same {ref}`payment method +`. +::: + +:::{seealso} +- {doc}`payments/batch` +- {doc}`payments/batch_sdd` +::: + +(accounting-payments-matching)= + +### Payments matching + +The {guilabel}`Payments matching` tool opens all unreconciled journal items and allows them to be +processed individually, matching all payments and journal items. Go to the +{guilabel}`Accounting Dashboard`, go to {menuselection}`Accounting --> Accounting --> Reconcile` or +click the {icon}`fa-ellipsis-v` ({guilabel}`ellipsis`) button from the {guilabel}`Customer +Invoices` or {guilabel}`Vendor Bills` journals, and select {guilabel}`Payments Matching`. + +```{image} payments/payments-journal.png +:alt: Payments matching menu in the drop-down menu. +``` + +:::{note} +During the {doc}`reconciliation `, if the sum of the debits and credits does +not match, there is a remaining balance. This either needs to be reconciled at a later date or +written off directly. +::: + +(accounting-payments-partial-payment)= + +## Registering a partial payment + +To register a partial payment, click on {guilabel}`Pay` from the related invoice or bill. + +```{eval-rst} +.. tabs:: + + .. group-tab:: Without outstanding accounts + + In the case of a partial payment (when the :guilabel:`Amount` paid is less than the total + remaining amount on the invoice or the bill), fill in the :guilabel:`Amount` in the + :guilabel:`Pay` window. + + .. group-tab:: Using outstanding accounts + + In the case of a partial payment (when the :guilabel:`Amount` paid is less than the total + remaining amount on the invoice or the bill), the :guilabel:`Payment Difference` field + displays the outstanding balance. There are two options: + + - :guilabel:`Keep open`: Keep the invoice or the bill open and mark it with a + :guilabel:`Partial` banner; + - :guilabel:`Mark as fully paid`: Select an account in the :guilabel:`Post Difference In` + field and change the :guilabel:`Label` if needed. A journal entry will be created to balance + the accounts payable or receivable with the selected account. + + .. image:: payments/partial-payment.png + :alt: register a partial payment +``` + +(accounting-payments-reconciling-payments)= + +## Reconciling payments with bank transactions + +```{eval-rst} +.. tabs:: + + .. group-tab:: Without outstanding accounts + + Once a payment has been registered, the status of the invoice or bill is :guilabel:`In + payment`. The next step is :doc:`reconciling ` the related :doc:`bank + transaction ` line with the invoice or bill to finalize the payment + workflow and mark the invoice or bill as :guilabel:`Paid`. + + .. group-tab:: Using outstanding accounts + + Once a payment has been registered, the status of the invoice or bill is :guilabel:`In + payment`. The next step is :doc:`reconciling ` the payment with the + related :doc:`bank transaction ` line to finalize the payment workflow and + mark the invoice or bill as :guilabel:`Paid`. +``` + +```{toctree} +:titlesonly: true + +payments/online +payments/checks +payments/batch +payments/batch_sdd +payments/follow_up +payments/pay_sepa +payments/pay_checks +payments/forecast +payments/trusted_accounts +``` + diff --git a/content/applications/finance/accounting/payments/batch.md b/content/applications/finance/accounting/payments/batch.md new file mode 100644 index 000000000..58e6f2b1a --- /dev/null +++ b/content/applications/finance/accounting/payments/batch.md @@ -0,0 +1,71 @@ +# Batch payments by bank deposit + +A **batch deposit** is a convenient way to group customer payments and deposit them into your bank +account. The feature lets you list multiple payments and generate a detailed deposit slip with a +batch reference. This reference can be used when reconciling to match bank statement lines with +transactions in the batch deposit. + +## Configuration + +Go to {menuselection}`Accounting --> Configuration --> Settings --> Customer Payments` and tick +{guilabel}`Batch Payments` to activate the feature. + +## Deposit multiple payments in batch + +(batch-payments-register-payments)= + +### Register payments + +Before performing a batch deposit, it is necessary to register each transaction's payment. To do so, +open the corresponding customer invoice and click {guilabel}`Register Payment`. In the pop-up +window, select the {guilabel}`Journal` linked to your bank account and {guilabel}`Batch Deposit` as +the {guilabel}`Payment Method`, and click {guilabel}`Create Payment`. + +```{image} batch/batch-payments.png +:alt: Registering a customer payment as part of a batch deposit +``` + +### Add payments to a batch deposit + +To add payments to a batch deposit, go to {menuselection}`Accounting --> Customers --> Batch +Payments`, and click {guilabel}`New`. Next, select the {guilabel}`Bank` and choose {guilabel}`Batch +Deposit` as the {guilabel}`Payment Method`. + +```{image} batch/batch-customer-payment.png +:alt: Filling out a new inbound batch payment form +``` + +Click {guilabel}`Add a line`. In the pop-up window, tick all payments to include in the batch +deposit, then click {guilabel}`Select`. + +```{image} batch/batch-lines-selection.png +:alt: Selecting all payments to include in the batch deposit +``` + +Once done, click {guilabel}`Validate` to finalize the batch deposit. + +:::{tip} +Click {guilabel}`Print` to download a PDF file to include with the deposit slip. +::: + +### Bank reconciliation + +Once the bank transactions are on your database, you can reconcile bank statement lines with the +batch payment. To do so, go to the {guilabel}`Accounting Dashboard` and click {guilabel}`Reconcile +Items` on the related bank account. Go to the {guilabel}`Batch Payments` tab to select a specific +batch and click {guilabel}`Validate` to finalize the process. + +```{image} batch/batch-reconciliation.png +:alt: Reconciling the batch payment with all its transactions +``` + +:::{note} +If a specific payment could not be processed by the bank or is missing, remove the related +payment before reconciling. +::: + +:::{seealso} +- {doc}`../payments` +- {doc}`batch_sdd` +::: + diff --git a/content/applications/finance/accounting/payments/batch_sdd.md b/content/applications/finance/accounting/payments/batch_sdd.md new file mode 100644 index 000000000..1b2498f2a --- /dev/null +++ b/content/applications/finance/accounting/payments/batch_sdd.md @@ -0,0 +1,131 @@ +# Batch payments: SEPA Direct Debit (SDD) + +SEPA, the Single Euro Payments Area, is a payment-integration initiative of the European Union for +simplification of bank transfers denominated in euros. With **SEPA Direct Debit** (SDD), your +customers can sign a mandate that authorizes you to collect future payments from their bank +accounts. This is particularly useful for recurring payments based on a subscription. + +You can record customer mandates in Odoo, and generate `.xml` files containing pending payments made +with an SDD mandate. + +:::{note} +SDD is supported by all SEPA countries, which includes the 27 member states of the European +Union as well as additional countries. + +[List of all SEPA countries](https://www.europeanpaymentscouncil.eu/document-library/other/epc-list-sepa-scheme-countries) + +. +::: + +## Configuration + +Go to {menuselection}`Accounting app --> Configuration --> Settings`, activate +{guilabel}`SEPA Direct Debit (SDD)`, and click on {guilabel}`Save`. Enter your company's +{guilabel}`Creditor Identifier`. This number is provided by your bank institution, or the authority +responsible for delivering them. + +```{image} batch_sdd/creditor-identifier.png +:align: center +:alt: Add a SEPA Creditor Identifier to Odoo Accounting +``` + +## SEPA Direct Debit Mandates + +### Create a mandate + +The {abbr}`SDD (sepa direct debit)` Mandate is the document that your customers sign to authorize +you to collect money directly from their bank accounts. + +To create a new mandate, go to {menuselection}`Accounting app --> Customers --> +Direct Debit Mandates`, on {guilabel}`Create`, and fill out the form. Export the PDF file by +clicking on {guilabel}`Print`. It is then up to your customer to sign this document. Once done, +upload the signed file and click on {guilabel}`Validate` to start running the mandate. + +:::{important} +Make sure that the **IBAN bank accounts details** are correctly recorded on the debtor’s contact +form, under the {guilabel}`Accounting` tab, and in your own {doc}`Bank Account <../bank>` settings. +::: + +### SEPA Direct Debit as a payment method + +SDD can be used as a payment method both on your **eCommerce** or on the **Customer Portal** by +activating SDD as a **Payment Provider**. With this method, your customers can create their mandates. +To ensure the validity of the information given by the customer, they will have to confirm each +mandate with one successful bank transfer of the expected amount. + +To do so, go to {menuselection}`Accounting app --> Configuration --> Payment Providers`, click on +{guilabel}`SEPA Direct Debit`. + +:::{important} +Make sure to change the {guilabel}`State` field to {guilabel}`Enabled` and set the provider as +"Published" so that it is available for your customers. +::: + +Customers using SDD as payment method get prompted to add their IBAN, email address, and to sign +their SEPA Direct Debit mandate. + +```{eval-rst} +.. todo:: + Add link to future **Payment Provider** documentation. +``` + +### Close or revoke a mandate + +Direct debit mandates are closed automatically after their {guilabel}`End Date`. If this field is +left blank, the mandate keeps being **Active** until it is **Closed** or **Revoked**. + +Clicking on {guilabel}`Close` updates the mandate’s end day to the current day. This means that +invoices issued after the present day will not be processed with an SDD payment. + +Clicking on {guilabel}`Revoke` disables the mandate immediately. No SDD payment can be registered +anymore, regardless of the invoice’s date. However, payments that have already been registered are +still included in the next SDD `.xml` file. + +:::{warning} +Once a mandate has been {guilabel}`closed` or {guilabel}`revoked`, it cannot be reactivated. +::: + +## Get paid with SEPA Direct Debit batch payments + +### Customer invoices + +You can register SDD payments for invoices issued to customers who have an active SDD mandate. + +To do so, open the invoice, click on {guilabel}`Register Payment`, and choose +{guilabel}`SEPA Direct Debit` as payment method. + +### Generate SEPA Direct Debit `.XML` files to submit payments + +`.xml` files with all SDD payment instructions can be uploaded to your online banking interface +to process all payments at once. + +:::{note} +The files generated by Odoo follow the SEPA Direct Debit **PAIN.008.001.02** specifications, as +required by the SEPA customer-to-bank [implementation guidelines](https://www.europeanpaymentscouncil.eu/document-library/implementation-guidelines/sepa-credit-transfer-customer-psp-implementation), +which ensures compatibility with the banks. +::: + +To generate your `.xml` file of multiple pending SDD payments, you can create a batch payment. +To do so, go to {menuselection}`Accounting app --> Customers --> Payments`, select the needed +payments, then click on {guilabel}`Action`, and finally {guilabel}`Create a batch Payment`. Once +you click on {guilabel}`Validate`, the `.xml` file is directly available for download. + +```{image} batch_sdd/xml.png +:align: center +:alt: Generate an .XML file for your SDD payments in Odoo Accounting +``` + +Finally, upload this file to your online banking interface to process the payments. + +:::{tip} +You can retrieve all the generated SDD `.xml` files by going to +{menuselection}`Accounting app --> Customers --> Batch Payments`. +::: + +:::{seealso} +- {doc}`batch` +- {doc}`../bank` +- [List of all SEPA countries](https://www.europeanpaymentscouncil.eu/document-library/other/epc-list-sepa-scheme-countries) +- [Sepa guidelines](https://www.europeanpaymentscouncil.eu/document-library/implementation-guidelines/sepa-credit-transfer-inter-psp-implementation-guidelines) +::: + diff --git a/content/applications/finance/accounting/payments/checks.md b/content/applications/finance/accounting/payments/checks.md new file mode 100644 index 000000000..14b3b7b14 --- /dev/null +++ b/content/applications/finance/accounting/payments/checks.md @@ -0,0 +1,118 @@ +# Checks + +There are two ways to handle payments received by checks in Odoo, either by using {ref}`outstanding +accounts ` or by {ref}`bypassing the reconciliation process +`. + +**Using outstanding accounts is recommended**, as your bank account balance stays accurate by taking +into account checks yet to be cashed. + +:::{note} +Both methods produce the same data in your accounting at the end of the process. But if you +have checks that have not been cashed in, the **Outstanding Account** method reports these +checks in the **Outstanding Receipts** account. However, funds appear in your bank account +whether or not they are reconciled, as the bank value is reflected at the moment of the bank +statement. +::: + +:::{seealso} +- {ref}`Outstanding accounts ` +- {ref}`Bank reconciliation ` +::: + +(checks-outstanding-account)= + +## Method 1: Outstanding account + +When you receive a check, you {doc}`record a payment <../bank/reconciliation>` by check on the +invoice. Then, when your bank account is credited with the check's amount, you reconcile the payment +and statement to move the amount from the **Outstanding Receipt** account to the **Bank** account. + +:::{tip} +You can create a new payment method named *Checks* if you would like to identify such payments +quickly. To do so, go to {menuselection}`Accounting --> Configuration --> Journals --> Bank`, +click the {guilabel}`Incoming Payments` tab, and {guilabel}`Add a line`. As {guilabel}`Payment +Method`, select {guilabel}`Manual`, and enter `Checks` as name. +::: + +(checks-reconciliation-bypass)= + +## Method 2: Reconciliation bypass + +When you receive a check, you {doc}`record a payment <../bank/reconciliation>` on the related +invoice. The amount is then moved from the **Account Receivable** to the **Bank** account, bypassing +the reconciliation and creating only **one journal entry**. + +To do so, you *must* follow the following setup. Go to {menuselection}`Accounting --> Configuration +--> Journals --> Bank`. Click the {guilabel}`Incoming Payments` tab and then {guilabel}`Add a line`, +select {guilabel}`Manual` as {guilabel}`Payment Method`, and enter `Checks` as {guilabel}`Name`. +Click the toggle menu button, tick {guilabel}`Outstanding Receipts accounts`, and in the +{guilabel}`Outstanding Receipts accounts` column, and set the {guilabel}`Bank` account for the +**Checks** payment method. + +```{image} checks/outstanding-payment-accounts.png +:alt: Bypass the Outstanding Receipts account using the Bank account. +``` + +## Payment registration + +:::{note} +By default, there are two ways to register payments made by check: + +- **Manual**: for single checks; +- **Batch**: for multiple checks at once. + +This documentation focuses on **single-check** payments. For **batch deposits**, see {doc}`the +batch payments documentation `. +::: + +Once you receive a customer check, go to the related invoice ({menuselection}`Accounting --> +Customer --> Invoices)`, and click {guilabel}`Register Payment`. Fill in the payment information: + +- {guilabel}`Journal: Bank`; +- {guilabel}`Payment method`: {guilabel}`Manual` (or **Checks** if you have created a specific + payment method); +- {guilabel}`Memo`: enter the check number; +- Click {guilabel}`Create Payment`. + +```{image} checks/payment-checks.png +:alt: Check payment info +``` + +The generated journal entries are different depending on the payment registration method chosen. + +## Journal entries + +### Outstanding account + +The invoice is marked as {guilabel}`In Payment` as soon as you record the payment. This operation +produces the following **journal entry**: + +| Account | Statement Match | Debit | Credit | +| -------------------- | --------------- | ------ | ------ | +| Account Receivable | | | 100.00 | +| Outstanding Receipts | | 100.00 | | + +Then, once you receive the bank statements, match this statement with the check of the **Outstanding +Receipts** account. This produces the following **journal entry**: + +| Account | Statement Match | Debit | Credit | +| -------------------- | --------------- | ------ | ------ | +| Outstanding Receipts | X | | 100.00 | +| Bank | | 100.00 | | + +If you use this approach to manage received checks, you get the list of checks that have not been +cashed in the **Outstanding Receipt** account (accessible, for example, from the general ledger). + +### Reconciliation bypass + +The invoice is marked as {guilabel}`Paid` as soon as you record the check. + +With this approach, you bypass the use of **outstanding accounts**, effectively getting only one +journal entry in your books and bypassing the reconciliation: + +| Account | Statement Match | Debit | Credit | +| ------------------ | --------------- | ------ | ------ | +| Account Receivable | X | | 100.00 | +| Bank | | 100.00 | | + diff --git a/content/applications/finance/accounting/payments/follow_up.md b/content/applications/finance/accounting/payments/follow_up.md new file mode 100644 index 000000000..31e25443b --- /dev/null +++ b/content/applications/finance/accounting/payments/follow_up.md @@ -0,0 +1,96 @@ +# Follow-up on invoices + +A follow-up message can be sent to customers when a payment is overdue. Odoo helps you identify late +payments and allows you to schedule and send the appropriate reminders using **follow-up actions** +that automatically trigger one or more actions according to the number of overdue days. You can send +your follow-ups via different means, such as email, post, or SMS. + +:::{seealso} +- [Odoo Tutorials: Payment Follow-up](https://www.odoo.com/slides/slide/payment-follow-up-1682) +::: + +## Configuration + +To configure a {guilabel}`Follow-Up Action`, go to {menuselection}`Accounting --> Configuration --> +Follow-up Levels`, and select or create (a) new follow-up level(s). Several follow-up actions are +available by default under the {guilabel}`Notification` tab, and the **name** as well as the +**number of days** can be changed. The follow-up {guilabel}`Actions` available are: + +- {guilabel}`Send Email`; +- {ref}`Send a Letter `; +- {ref}`Send an SMS message `. + +You can use a pre-filled template for your messages by selecting a {guilabel}`Content Template`. To +change the template used, hover over the field and click the {guilabel}`-->`. If enabled, SMS +messages have a specific {guilabel}`Sms Template` field. + +It is possible to automatically send a reminder by enabling the {guilabel}`Automatic` option, and +attaching the *open* invoice(s) by enabling {guilabel}`Attach Invoices`, within a specific follow-up +action. + +By clicking on the {guilabel}`Activity` tab, scheduling activities (tasks) is possible. That way, +an activity is automatically scheduled when the follow-up is triggered. To do so, enable +{guilabel}`Schedule Activity`, and select a {guilabel}`Responsible` person for the task. Choose an +{guilabel}`Activity Type`, and enter a {guilabel}`Summary` on how to handle the activity, if +desired. + +:::{tip} +Set a negative number of days to send a reminder before the actual due date. +::: + +## Follow-up reports + +Overdue invoices you need to follow up on are available in {menuselection}`Accounting --> Customers +--> Follow-up Reports`. By default, Odoo filters by {guilabel}`Overdue Invoices`, but you can also +filter by {guilabel}`In need of action` in the {guilabel}`Filters` menu. + +When selecting an invoice, you can see all of the customer's unpaid invoices (overdue or not), with +the due dates of late invoices appearing in red. You can exclude invoices from a reminder by +clicking {guilabel}`Exclude from Follow-ups`. You can set either {guilabel}`Automatic` or +{guilabel}`Manual` reminders as well as a {guilabel}`Responsible` person for that customer. + +To send reminders, click on {guilabel}`Follow up`, and select the action(s) you want to perform +from: + +- {guilabel}`Print`; +- {guilabel}`Email`; +- {guilabel}`Sms`; +- {guilabel}`By post`. + +You can {guilabel}`Attach Invoices` and change the content templates from this view. When done, +click {guilabel}`Send` or {guilabel}`Send & Print`. + +:::{note} +- The contact information on the invoice or the contact form is used to send the reminder. +- When the reminder is sent, it is documented in the chatter of the invoice. +- If it is not the right time for a reminder, you can specify the {guilabel}`Next Reminder` date. + You will get the next report according to the next reminder date set. +::: + +:::{tip} +Reconcile all bank statements right before launching the follow-up process to avoid sending a +reminder to a customer that has already paid. +::: + +### Debtor's trust level + +To know whether a customer usually pays late or not, you can set a trust level by marking them as +{guilabel}`Good Debtor`, {guilabel}`Normal Debtor`, or {guilabel}`Bad Debtor` on their follow-up +report. To do so, click on the bullet next to the customer's name and select a trust level. + +```{image} follow_up/debtor-level.png +:alt: Set debtor's trust level +``` + +### Send reminders in batches + +You can send reminder emails in batches from the {guilabel}`Follow-up Reports` page. To do so, +select all the reports you would like to process, click on the {guilabel}`Action` gear icon, and +select {guilabel}`Process follow-ups`. + +:::{seealso} +- {doc}`/applications/essentials/in_app_purchase` +- {doc}`/applications/marketing/sms_marketing/pricing_and_faq` +- {doc}`../customer_invoices/snailmail` +::: + diff --git a/content/applications/finance/accounting/payments/forecast.md b/content/applications/finance/accounting/payments/forecast.md new file mode 100644 index 000000000..5357d2ccb --- /dev/null +++ b/content/applications/finance/accounting/payments/forecast.md @@ -0,0 +1,45 @@ +# Forecast future bills to pay + +In Odoo, you can manage payments by setting automatic **Payments Terms** and **follow-ups**. + +## Configuration: payment terms + +In order to track vendor conditions, we use **Payment Terms** in Odoo. They allow keeping track of +due dates on invoices. Examples of **Payment Terms** are: + +- 50% within 30 days +- 50% within 45 days + +To create them, go to {menuselection}`Accounting --> Configuration --> Invoicing: Payment Terms` and +click on {guilabel}`Create` to add new terms or click existing ones to modify them. + +:::{seealso} +[Odoo Tutorials: Payment Terms](https://www.odoo.com/slides/slide/payment-terms-1679?fullscreen=1) +::: + +Once **Payment Terms** are defined, you can assign them to your vendor by default. To do so, go to +{menuselection}`Vendors --> Vendors`, select a vendor, click the {guilabel}`Sales & Purchase` tab, +and select a specific **Payment Term**. This way, every time you purchase from this vendor, Odoo +automatically proposes the chosen Payment Term. + +:::{note} +If you do not set a specific Payment Term on a vendor, you can still set one on the vendor bill. +::: + +## Forecast bills to pay with the aged payable report + +To track amounts to be paid to the vendors, use the **Aged Payable** report. To access it, go to +{menuselection}`Accounting --> Reporting --> Partner Reports: Aged Payable`. This report gives you a +summary per vendor of the amounts to pay, compared to their due date (the due date being computed on +each bill using the terms). This report tells you how much you will have to pay within the following +months. + +## Select bills to pay + +You can get a list of all your vendor bills by going to {menuselection}`Vendors --> Bills`. To view +only the bills that you need to pay, click {menuselection}`Filters --> Bills to Pay`. To view only +overdue payments, select the {guilabel}`Overdue` filter instead. + +You can also group bills by their due date by clicking {menuselection}`Group By --> Due Date` and +selecting a time period. + diff --git a/content/applications/finance/accounting/payments/online.md b/content/applications/finance/accounting/payments/online.md new file mode 100644 index 000000000..0bba3d76c --- /dev/null +++ b/content/applications/finance/accounting/payments/online.md @@ -0,0 +1,52 @@ +--- +show-content: true +--- + +# 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 +method, making the payment process much easier. + +```{image} online/online-payment-providers.png +:align: center +:alt: Payment provider choice after having clicked on "Pay Now" +``` + +## Configuration + +Make sure your {doc}`payment providers are correctly configured <../../payment_providers>`. + +:::{note} +By default, "{doc}`Wire Transfer `" is the +only payment provider activated, but you still have to fill out the payment details. +::: + +To activate the Invoice Online Payment, go to {menuselection}`Accounting --> Configuration --> +Settings --> Customer Payments`, enable **Invoice Online Payment**, and click on *Save*. + +## Customer Portal + +After issuing the invoice, click on *Send & Print* and send the invoice by email to the customer. +They will receive an email with a link that redirects them to the invoice on their **Customer +Portal**. + +```{image} online/view-invoice.png +:alt: Email with a link to view the invoice online on the Customer Portal. +``` + +They can choose which Payment Provider to use by clicking on *Pay Now*. + +```{image} online/pay-now.png +:alt: '"Pay now" button on an invoice in the Customer Portal.' +``` + +:::{seealso} +- {doc}`/applications/finance/payment_providers` +::: + diff --git a/content/applications/finance/accounting/payments/online/install_portal_patch.md b/content/applications/finance/accounting/payments/online/install_portal_patch.md new file mode 100644 index 000000000..aaed99972 --- /dev/null +++ b/content/applications/finance/accounting/payments/online/install_portal_patch.md @@ -0,0 +1,76 @@ +# 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/payments/pay_checks.md b/content/applications/finance/accounting/payments/pay_checks.md new file mode 100644 index 000000000..b75bd2832 --- /dev/null +++ b/content/applications/finance/accounting/payments/pay_checks.md @@ -0,0 +1,55 @@ +# Pay by checks + +Once you decide to pay a supplier bill, you can select to pay by check. You can then print all the +payments registered by check. Finally, the bank reconciliation process will match the checks you +sent to suppliers with actual bank statements. + +## Configuration + +### Activate checks payment methods + +To activate the checks payment method, go to {menuselection}`Accounting --> Configuration --> +Settings`, and scroll down to the {guilabel}`Vendor Payments` section. There, you can activate the +payment method as well as set up the {guilabel}`Check Layout`. + +:::{note} +- Once the {guilabel}`Checks` setting is activated, the **Checks** payment method is + automatically set up in the {guilabel}`Outgoing Payments` tabs of **bank** journals. +- Some countries require specific modules to print checks; such modules may be installed by + default. For instance, the {guilabel}`U.S. Checks Layout` module is required to print U.S. + checks. +::: + +## Compatible check stationery for printing checks + +### United States + +For the United States, Odoo supports by default the check formats of: + +- **Quickbooks & Quicken**: check on top, stubs in the middle and bottom; +- **Peachtree**: check in the middle, stubs on top and bottom; +- **ADP**: check in the bottom, and stubs on the top. + +## Pay a supplier bill with a check + +Paying a supplier with a check is done in three steps: + +1. registering a payment +2. printing checks in batch for all registered payments +3. reconciling bank statements + +### Register a payment by check + +To register a payment, open any supplier bill from the menu {menuselection}`Purchases --> Vendor +Bills`. +Once the supplier bill is validated, you can register a payment. Set the {guilabel}`Payment Method` +to {guilabel}`Checks` and validate the payment. + +### Print checks + +On your {guilabel}`Accounting Dashboard` in the {guilabel}`Bank` Journal, you can see the +number of checks registered. By clicking on {guilabel}`Checks to print` you have got the possibility +to print the reconciled checks. + +To print all checks in batch, select all payments from the list view and click on {guilabel}`Print`. + diff --git a/content/applications/finance/accounting/payments/pay_sepa.md b/content/applications/finance/accounting/payments/pay_sepa.md new file mode 100644 index 000000000..06a17457a --- /dev/null +++ b/content/applications/finance/accounting/payments/pay_sepa.md @@ -0,0 +1,83 @@ +# Pay with SEPA + +SEPA, the Single Euro Payments Area, is a payment-integration initiative of the European Union to +simplify bank transfers denominated in euros. SEPA allows you to send payment orders to your +bank to automate bank wire transfers. + +SEPA is supported by the banks of the 27 EU member states, as well as: + +EFTA countries: + +- Iceland; +- Liechtenstein; +- Norway; +- Switzerland. + +Non-EEA SEPA countries: + +- Andorra; +- Monaco; +- San Marino; +- United Kingdom; +- Vatican City State. + +Non-EEA territories: + +- Saint-Pierre-et-Miquelon; +- Guernsey; +- Jersey; +- Isle of Man. + +When paying a bill in Odoo, you can select SEPA mandates as a payment option. At the end of the day, +you can generate the SEPA file containing all bank wire transfers and upload it to your online +banking interface to process the payments. + +By default, the file follows the SEPA Credit Transfer **'pain.001.001.03'** specifications. This is +a well-defined standard among banks. However, for Swiss and German companies, other formats are used +**'pain.001.001.03.ch.02'** for Switzerland and **'pain.001.003.03'** for Germany. + +Once the payments are processed by your bank, you can directly import the account statement in +Odoo. The bank reconciliation process will seamlessly match the SEPA orders you sent to your bank +with actual bank statements. + +## Configuration + +### Activate SEPA Credit Transfer (SCT) + +To pay suppliers with SEPA, you must activate the **SEPA Credit Transfer** setting. To do so, go to +{menuselection}`Accounting --> Configuration --> Settings --> Vendor Payments: SEPA Credit Transfer +(SCT)`. By activating the setting and filling out your company data, you will be able to use the +SCT option when paying your vendor. + +:::{note} +According to the localization package installed, the **SEPA Direct Debit** and **SEPA Credit +Transfer** modules may be installed by default. If not, they need to be {ref}`installed `. +::: + +### Activate SEPA payment methods on banks + +From the accounting dashboard, click on the drop-down menu ({guilabel}`⋮`) on your bank journal and +select {guilabel}`Configuration`. Click the {guilabel}`Outgoing Payments` tab, and, if not already +present, add {guilabel}`SEPA Credit Transfer` under {guilabel}`Payment Method`. + +Make sure to specify the IBAN account number (domestic account numbers do not work with SEPA) and +the BIC (bank identifier code) in the {guilabel}`Journal Entries` tab. + +### Registering payments + +You can register any vendor payments made with SEPA. To do so, go to {menuselection}`Accounting --> +Vendors --> Payments`. When creating your payment, select {guilabel}`SEPA Credit Transfer` as the +{guilabel}`Payment Method`. + +The first time you pay a vendor with SEPA, you have to fill in the {guilabel}`Recipient Bank +Account` field with the bank name, IBAN, and BIC (Bank Identifier Code). Odoo automatically verifies +if the IBAN format is respected. + +For future payments to this vendor, Odoo will automatically suggest you the bank account, but it +remains possible to select a new one. + +Once your payment is registered, do not forget to confirm it. You can also pay vendor bills from the +bill directly using the {guilabel}`Register Payment` button at the top of a vendor bill. +The form is the same, but the payment is directly linked to the bill and will be automatically +reconciled with it. + diff --git a/content/applications/finance/accounting/payments/trusted_accounts.md b/content/applications/finance/accounting/payments/trusted_accounts.md new file mode 100644 index 000000000..311d6926d --- /dev/null +++ b/content/applications/finance/accounting/payments/trusted_accounts.md @@ -0,0 +1,66 @@ +# Trusted accounts (send money) + +To protect users from sending money to scammers, vendor bank account numbers must be marked as +trusted before you can use them to make an outgoing payment. + +To do so, open the vendor bank account and click on the {guilabel}`Send Money` toggle switch button. + +```{image} trusted_accounts/send-money-toggle.png +:align: center +:alt: Example of a vendor bank account with the "Send Money" toggle button switched +: to "trusted." +``` + +:::{note} +All accounts are initially marked as untrusted. +::: + +## Phishing attacks + +A **phishing attack** is an online scam designed to trick individuals or companies into giving away +sensitive information or money by sending out fraudulent communication. Fraudsters pretend to be +legitimate companies and may use partial information to give credibility to their requests. + +There are several types of phishing attacks, including **invoice fraud**. In this case, the +fraudster pretends to be a genuine supplier following up on unpaid bills or sending a new invoice, +but with different payment information than usual and with fake contact details. + +To protect yourself from these types of phishing attacks, remain vigilant when you receive +unexpected invoices or payment requests. + +:::{important} +In case of doubt, **we recommend contacting the vendor by phone**. Make sure to call an official +phone number by searching yourself, as the URLs, email addresses, and phone numbers written in +the communication you received may be fake. +::: + +### Elements to check + +There are several elements you can check by yourself when you receive an outgoing payment request to +a new account: + +Communication style + +: Fraudulent emails and invoices often use a different communication style, such as **different + wording**, and may include **spelling and grammatical mistakes**. Examine and **compare** them + with previous ones that you know to be authentic (e.g., payment instructions, language, company + logo, etc.).\* + +Urgency + +: Invoice frauds often use **urgent or threatening language** and change the **payment deadline**. + Check if you really received a late payment reminder previously. + +Type of account + +: A company is unlikely to replace a bank account with a **money transfer service**. + +Email and links domain names + +: Double-check the **email address domain** (`example@domain.com`). However, be wary that fraudsters + can make their email addresses look genuine or even hack email addresses from your vendor's + employees or even someone within your own organization. + + Hover over the links in your email and check that the URLs they redirect to are genuine. Your + internet browser usually displays the link's target at the bottom left of the window. + diff --git a/content/applications/finance/accounting/reporting.md b/content/applications/finance/accounting/reporting.md new file mode 100644 index 000000000..89344dedd --- /dev/null +++ b/content/applications/finance/accounting/reporting.md @@ -0,0 +1,139 @@ +--- +show-content: true +--- + +# Reporting + +Odoo includes **generic** and **dynamic** reports available for all countries, regardless of the +{doc}`localization package <../../finance/fiscal_localizations>` installed: + +- {ref}`accounting/reporting/balance-sheet` +- {ref}`accounting/reporting/profit-and-loss` +- {ref}`accounting/reporting/executive-summary` +- {ref}`accounting/reporting/general-ledger` +- {ref}`accounting/reporting/aged-receivable` +- {ref}`accounting/reporting/aged-payable` +- {ref}`accounting/reporting/cash-flow-statement` +- {ref}`accounting/reporting/tax-report` + +To expand the lines of a report and view its details, click the {icon}`fa-caret-right` +({guilabel}`right arrow`) on the left. Then click the {icon}`fa-caret-down` ({guilabel}`down arrow`) +to the right of the account, journal entry, payment, invoice, etc. to {guilabel}`Annotate` and view +the details. + +```{image} reporting/reporting-annotate.png +:alt: Annotate reports. +``` + +To export reports in PDF or XLSX format, click {guilabel}`PDF` at the top or click the +{icon}`fa-caret-down` ({guilabel}`down arrow`) icon next to the {guilabel}`PDF` button and +select {guilabel}`XLSX`. + +To compare values across periods, click the {guilabel}`Comparison` menu and select the periods you +want to compare. + +```{image} reporting/reporting-comparison.png +:alt: Comparison menu to compare time periods. +``` + +(accounting-reporting-balance-sheet)= + +## Balance Sheet + +The {guilabel}`Balance Sheet` shows a snapshot of your organization's assets, liabilities, and +equity at a particular date. + +(accounting-reporting-profit-and-loss)= + +## Profit and Loss + +The {guilabel}`Profit and Loss` report (or **Income Statement**) shows your company's net income by +deducting expenses from revenue for the reporting period. + +(accounting-reporting-executive-summary)= + +## Executive Summary + +The {guilabel}`Executive Summary` provides an overview of all the important figures for overseeing +your company's performance. + +It includes the following items: + +- {guilabel}`Performance`: + : - {guilabel}`Gross profit margin`: + : The contribution of all sales your business makes **minus** any direct costs needed to + make those sales (labor, materials, etc.). + - {guilabel}`Net profit margin`: + : The contribution of all sales made by your business **minus** any direct costs needed to + make those sales *and* fixed overheads your company has (electricity, rent, taxes + to be paid as a result of those sales, etc.). + - {guilabel}`Return on investment (per annum)`: + : The ratio of the net profit to the amount of assets the company used to make those profits. +- {guilabel}`Position`: + : - {guilabel}`Average debtors days`: + : The average number of days it takes your customers to (fully) pay you across all your + customer invoices. + - {guilabel}`Average creditors days`: + : The average number of days it takes you to (fully) pay your suppliers across all your bills. + - {guilabel}`Short-term cash forecast`: + : How much cash is expected in or out of your business in the next month, i.e., the balance of + your **Sales account** for the month **minus** the balance of your **Purchases account** for + the month. + - {guilabel}`Current assets to liabilities`: + : Also referred to as the **current ratio**, this is the ratio of current assets ({dfn}`assets + that could be turned into cash within a year`) to the current liabilities ({dfn}`liabilities + that will be due in the next year`). It is typically used to measure a company's ability to + service its debt. + +(accounting-reporting-general-ledger)= + +## General Ledger + +The {guilabel}`General Ledger` report shows all transactions from all accounts for a selected date +range. The initial summary report shows the totals for each account. To expand an account and view +its details, click the {icon}`fa-caret-right` ({guilabel}`right arrow`) on the left. +This report is useful for reviewing each transaction that occurred during a specific period. + +(accounting-reporting-aged-receivable)= + +## Aged Receivable + +The {guilabel}`Aged Receivable` report shows the sales invoices awaiting payment during a selected +month and several months prior. + +(accounting-reporting-aged-payable)= + +## Aged Payable + +The {guilabel}`Aged Payable` report displays information on individual bills, credit notes, and +overpayments you owe and how long these have gone unpaid. + +(accounting-reporting-cash-flow-statement)= + +## Cash Flow Statement + +The {guilabel}`Cash Flow Statement` shows how changes in balance sheet accounts and income affect +cash and cash equivalents and breaks the analysis down to operating, investing, and financing +activities. + +(accounting-reporting-tax-report)= + +## Tax Report + +The {guilabel}`Tax Report` shows the {guilabel}`NET` and {guilabel}`TAX` amounts for all the +taxes grouped by type ({guilabel}`Sales`/{guilabel}`Purchases`). + +```{toctree} +:titlesonly: true + +reporting/tax_returns +reporting/tax_carryover +reporting/analytic_accounting +reporting/budget +reporting/intrastat +reporting/data_inalterability +reporting/silverfin +reporting/customize +reporting/year_end +``` + diff --git a/content/applications/finance/accounting/reporting/analytic_accounting.md b/content/applications/finance/accounting/reporting/analytic_accounting.md new file mode 100644 index 000000000..8376d7e77 --- /dev/null +++ b/content/applications/finance/accounting/reporting/analytic_accounting.md @@ -0,0 +1,139 @@ +# 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. + +(accounting-analytic-accounting-configuration)= + +## Configuration + +Enable the {guilabel}`Analytic Accounting` feature by going to {menuselection}`Accounting --> +Configuration --> Settings --> Analytics`. + +(accounting-analytic-accounting-analytic-accounts)= + +## Analytic accounts + +The analytic accounts give an overview of your 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: + +- {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; + +Then, fill in your {doc}`budget ` information. + +(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 +``` + +The following information must be completed: + +- {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}`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}`Color`: select the color of the tag related to this specific plan; + +- {guilabel}`Company`: add the company to which the plan applies; + +You can also fine-tune your plans' applicability by filling in the {guilabel}`Applicability` tab: + +- {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. + +Two smart buttons are available in the top-right corner: + +> - {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. + +:::{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. +::: + +(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 +accounts by modifying the percentage. + +```{image} analytic_accounting/analytic_distribution.png +:align: center +:alt: create a distribution template +``` + +(analytic-distribution-models)= + +(accounting-analytic-accounting-analytic-distribution-models)= + +### Analytic distribution models + +The 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. + +:::{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. +::: + diff --git a/content/applications/finance/accounting/reporting/budget.md b/content/applications/finance/accounting/reporting/budget.md new file mode 100644 index 000000000..ec7451149 --- /dev/null +++ b/content/applications/finance/accounting/reporting/budget.md @@ -0,0 +1,173 @@ +# Budgets + +{ref}`Analytic budgets ` track specific activities and projects +using analytic accounts, helping businesses make informed decisions about specific departments, +projects, or other groups of transactions. In contrast, {ref}`financial budgets +` are tied to the general ledger accounts that appear on the profit +and loss and focus on the company's overall economic position. + +(accounting-budgets-analytic-budgets)= + +## Analytic budgets + +Analytic budgets allow for allocating and tracking income and expenses in detail, breaking down +costs and revenues by specific projects, departments, or groups of transactions. Analytic budgets +can be applied across various departments or projects to measure profitability and performance. Odoo +manages analytic budgets using {doc}`analytic accounting `. + +To activate the option for creating analytic budgets, go to {menuselection}`Accounting --> +Configuration --> Settings`, and enable {guilabel}`Budget Management` in the {guilabel}`Analytics` +section. + +:::{important} +Odoo structures budgets using {ref}`plans ` and +{ref}`accounts `, which must be configured +*before* creating a budget. +::: + +(accounting-budgets-analytic-budget-set)= + +### Set an analytic budget + +To create a new budget, go to {menuselection}`Accounting --> Accounting --> Analytic Budgets` and +click {guilabel}`New`. Make sure the following fields are appropriately completed: {guilabel}`Budget +Name`, {guilabel}`Period`, and {guilabel}`Budget Type`. + +Click {guilabel}`Add a line` in the {guilabel}`Budget Lines` tab to structure the budget with the +{ref}`analytic plans ` and {ref}`accounts +` previously created. While the {ref}`analytic +plans ` correspond to the column names, select the +{ref}`analytic accounts ` to define the budget +lines and set the amounts for each in the {guilabel}`Budgeted` column. Once all the budget lines are +settled, click {guilabel}`Open`. If changes need to be made once the budget's status is +{guilabel}`Open`, there are two options: + +- {guilabel}`Reset to Draft`: To overwrite the data, then reopen the budget. +- {guilabel}`Revise`: A new budget will be created. Once it is {guilabel}`Open`, a {guilabel}`Rev` + reference is added to the {guilabel}`Budget Name`. The original budget is then + {guilabel}`Revised`. + +(accounting-budgets-analytic-budget-check)= + +### Check an analytic budget + +Once the budget is {guilabel}`Open`, two additional columns are available: {guilabel}`Committed` and +{guilabel}`Achieved`. These columns' amounts are automatically calculated based on the related +{ref}`analytic distribution ` of journal +items. When the {ref}`analytic distribution ` +of a journal item within the budget's period is updated, the budget's columns for the analytic +account(s) selected in the distribution are automatically updated. The {guilabel}`Achieved` amount +reflects the current result according to the items of confirmed journal entries for the associated +{ref}`analytic account `. In contrast, the +{guilabel}`Committed` amount displays the full value of the {guilabel}`Achieved` amount, plus any +confirmed sales or purchase orders that have not yet been invoiced or billed. + +:::{note} +- When a line in a request for quotation or purchase order includes an analytic distribution, a + {guilabel}`Budget` smart button appears, providing a link to the {ref}`budget report + ` for more details. +- For {guilabel}`Open` budgets, if a request for quotation or a purchase order is created using + the associated analytic distribution and exceeds the allocated budget amount, the corresponding + purchase order line is highlighted in red. +::: + +To reveal the {guilabel}`Theoretical` amount or percentage, use the {icon}`oi-settings-adjust` +({guilabel}`adjust settings`) icon in the {guilabel}`Budget Lines`' header. The +{guilabel}`Theoretical` amount represents the amount of money that could theoretically have been +spent or should have been received based on the current date relative to the start/end dates. Click +{guilabel}`Details` to open a filtered view of the {ref}`budget report +` related to that specific budget line. + +```{image} budget/budget.png +:alt: open budget with committed, achieved, and theoretical amounts +``` + +:::{note} +Deleting a budget is only allowed in the {guilabel}`Draft` and {guilabel}`Cancelled` stages. +::: + +To view the budget lines of one or multiple budgets directly from the {guilabel}`Budgets` list view, +select the budget(s) and click {guilabel}`Budget Lines`. + +(accounting-budgets-analytic-budget-generate)= + +### Generate periodic budgets + +To create periodic budgets (monthly, quarterly, and yearly) for the selected {guilabel}`Analytic +Plans`, click {guilabel}`Generate`. A new budget is created for each {guilabel}`Period` between the +start and end dates: + +- If a single analytic plan is selected, each budget includes a line for each account in that + analytic plan. +- If multiple analytic plans are selected, each budget includes a line for each account/analytic + plan combination. + +To generate periodic budgets, follow these steps: + +1. In the {guilabel}`Budgets` list view, click {guilabel}`Generate`. + +2. In the {guilabel}`Generate Budget` window, set the dates and select the {guilabel}`Period` and + the {guilabel}`Analytic Plans`. + + ```{image} budget/generate-budgets.png + :alt: all the options to generate periodical budgets + ``` + +3. Click {guilabel}`Split` to create the periodic budgets. + +4. Click {guilabel}`Budgets` in the top-left corner to return to the {guilabel}`Budgets` list view. + +5. One by one, click on the different periodic budgets with the {guilabel}`Draft` status to open + them and set the amounts in the {guilabel}`Budgeted` column for each analytic account linked to + the chosen analytic plans. + +6. Click {guilabel}`Open` for each periodic budget. + +(accounting-budgets-analytic-budget-reporting)= + +### Reporting + +To perform various reporting actions, go to {menuselection}`Accounting --> Reporting --> +Budget Report`, then: + +- Track, analyze, and compare budget data. +- Filter and group data using the {icon}`fa-plus-square` ({guilabel}`plus-square`) or + {icon}`fa-minus-square` {guilabel}`(minus-square)` icon. +- Drill down into the report to see more details on the actual amounts and transactions. +- Export the data for further analysis or reporting needs. + +(accounting-budgets-financial)= + +## Financial budgets + +Financial budgets are structured around specific income and expense accounts and transactions for +official financial reporting and compliance purposes. + +:::{note} +Financial budgets are available on the {ref}`Profit and Loss +` report. +::: + +(accounting-budgets-financial-budget-set)= + +### Set a financial budget + +To create a new financial budget, follow these steps: + +1. Go to {menuselection}`Accounting --> Reporting --> Profit and Loss` to open the + {ref}`Profit and Loss ` report. +2. Click the {icon}`fa-calendar` {guilabel}`(calendar)` button to use the date selector and choose a + period. +3. Click the {icon}`fa-bar-chart` {guilabel}`Budget` button and name the budget. A new column + labeled with the budget name will appear next to the {guilabel}`Balance` column. +4. Assign amounts to each account requiring analysis. +5. A new {guilabel}`%` column will appear to the right of the new budget column, indicating the + current status. + +Different financial budgets can be created using these steps for comparison purposes. + +:::{note} +The date selector enables the division of periods and navigation between periods, automatically +updating the amounts accordingly. +::: + diff --git a/content/applications/finance/accounting/reporting/customize.md b/content/applications/finance/accounting/reporting/customize.md new file mode 100644 index 000000000..b5a18a8ba --- /dev/null +++ b/content/applications/finance/accounting/reporting/customize.md @@ -0,0 +1,355 @@ +# 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**. + +:::{important} +Activate the {ref}`developer mode ` to access the accounting report creation +interface. +::: + +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 `. + +```{image} customize/engine-accounting-reports.png +:align: center +:alt: Accounting reports engine. +``` + +(customize-reports-root)= + +## Root reports + +Root reports can be regarded as generic, neutral accounting reports. They serve as models on which +local accounting versions are built. If a report has no root report, it is considered to be a root +report itself. + +```{eval-rst} +.. example:: + 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`. + +:::{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 + +Variants are country-specific versions of root reports and, therefore, always refer to a root +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. + +```{eval-rst} +.. example:: + In the following image, :guilabel:`VAT Report (BE)` is the variant of the root :guilabel:`Generic + Tax report`. + + .. image:: customize/engine-variant.png + :align: center + :alt: Report variant selection. +``` + +## 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. + +```{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. + +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. + +:::{note} +Depending on the engine, {guilabel}`subformulas` may also be required. +::: + +### 'Odoo Domain' engine + +With this 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: + +`sum` + +: The result is the sum of all the balances of the matched move lines. + +`sum_if_pos` + +: The result is the sum of all the balances of the matched move lines if this amount is positive. + Otherwise, it is `0`. + +`sum_if_neg` + +: The result is the sum of all the balances of the matched move lines if this amount is negative. + 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. + +You can also put a `-` sign at the beginning of the subformula to **reverse** the sign of the +result. + +```{image} customize/engine-expressions.png +:align: center +:alt: Expression line within a line report +``` + +### 'Tax Tags' 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 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)**. + +```{eval-rst} +.. 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`. +``` + +### 'Aggregate Other Formulas' 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**). + +**Subformulas** can be one of the following: + +`if_above(CUR(amount))` + +: The value of the arithmetic expression will be returned only if it is greater than the provided + bound. Otherwise, the result will be `0`. + +`if_below(CUR(amount))` + +: The value of the arithmetic expression will be returned only if it is lower than the provided + bound. Otherwise, the result will be `0`. + +`if_between(CUR1(amount1), CUR2(amount2))` + +: The value of the arithmetic expression will be returned only if it is strictly between the + provided bounds. Otherwise, it will be brought back to the closest bound. + +`if_other_expr_above(LINE_CODE.EXPRESSION_LABEL, CUR(amount))` + +: The value of the arithmetic expression will be returned only if the value of the expression + denoted by the provided line code and expression label is greater than the provided bound. + Otherwise, the result will be `0`. + +`if_other_expr_below(LINE_CODE.EXPRESSION_LABEL, CUR(amount))` + +: The value of the arithmetic expression will be returned only if the value of the expression + denoted by the provided line code and expression label is lower than the provided bound. + Otherwise, the result will be `0`. + +`CUR` is the currency code in capital letters, and `amount` is the amount of the bound expressed in +that currency. + +You can also use the `cross_report` subformula to match an expression found in another report. + +### 'Prefix of Account Codes' engine + +This engine is used to match amounts made on accounts using the prefixes of these accounts' codes as +variables in an arithmetic expression. + +```{eval-rst} +.. example:: + | `21` + | Arithmetic expressions can also be a single prefix, such as here. +``` + +```{eval-rst} +.. example:: + | `21 + 10 - 5` + | This formula adds the balances of the move lines made on accounts whose codes start with `21` + and `10`, and subtracts the balance of the ones on accounts with the prefix `5`. +``` + +It is also possible to ignore a selection of sub-prefixes. + +```{eval-rst} +.. example:: + | `21 + 10\\(101, 102) - 5\\(57)` + | This formula works the same way as the previous example but ignores the prefixes `101`, `102`, + and `57`. +``` + +You can apply 'sub-filtering' on **credits and debits** using the `C` and `D` suffixes. In this +case, an account will only be considered if its prefix matches, *and* if the total balance of the +move lines made on this account is **credit/debit**. + +```{eval-rst} +.. example:: + Account `210001` has a balance of -42 and account `210002` has a balance of 25. The formula + `21D` only matches the account `210002`, and hence returns 25. `210001` is not matched, as its + balance is *credit*. +``` + +Prefix exclusions can be mixed with the `C` and `D` suffixes. + +```{eval-rst} +.. example:: + | `21D + 10\\(101, 102)C - 5\\(57)` + | This formula adds the balances of the move lines made on accounts whose code starts with `21` + *if* it is debit (`D`) and `10` *if* it is credit (`C`), but ignores prefixes `101`, `102`, and + subtracts the balance of the ones on accounts with the prefix `5`, ignoring the prefix `57`. +``` + +To match the letter `C` or `D` in a prefix and not use it as a suffix, use an empty exclusion `()`. + +```{eval-rst} +.. example:: + | `21D\\()` + | This formula matches accounts whose code starts with `21D`, regardless of their balance sign. +``` + +In addition to using code prefixes to include accounts, you can also match them with **account +tags**. This is especially useful, for example, if your country lacks a standardized chart of +accounts, where the same prefix might be used for different purposes across companies. + +```{eval-rst} +.. example:: + | `tag(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. + +```{eval-rst} +.. example:: + | `tag(my_module.my_tag)` + | This formula matches accounts whose associated tags include the tag denoted by + *my_module.my_tag*. +``` + +You can also use arithmetic expressions with tags, possibly combining them with prefix selections. + +```{eval-rst} +.. example:: + | `tag(my_module.my_tag) + tag(42) + 10` + | The balances of accounts tagged as *my_module.my_tag* will be summed with those of accounts + linked to the tag with ID *42* and accounts with the code prefix `10` +``` + +`C` and `D` suffixes can be used in the same way with tags. + +```{eval-rst} +.. example:: + | `tag(my_module.my_tag)C` + | This formula matches accounts with the tag *my_module.my_tag* and a credit balance. +``` + +Prefix exclusion also works with tags. + +```{eval-rst} +.. example:: + | `tag(my_module.my_tag)\\(10)` + | This formula matches accounts with the tag *my_module.my_tag* and a code not starting with + `10`. + +``` + +### '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. + +**Formulas** can be one of the following: + +`sum` + +: If the result must be the sum of all the external values in the period. + +`most_recent` + +: If the result must be the value of the latest external value in the period. + +In addition, **subformulas** can be used in two ways: + +`rounding=X` + +: Replacing `X` with a number instructs to round the amount to X decimals. + +`editable` + +: Indicates this expression can be edited manually, triggering the display of an icon in the + report, allowing the user to perform this action. + +:::{note} +Manual values are created at the `date_to` currently selected in the report. +::: + +Both subformulas can be mixed by separating them with a `;`. + +```{eval-rst} +.. example:: + | `editable;rounding=2` + | is a correct subformula mixing both behaviors. +``` + +### 'Custom Python Function' 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. + +## Columns + +Reports can have an **indefinite number** of columns to display. Each column gets its values from +the **expressions** declared on the **lines**. The field {guilabel}`expression_label` of the column +gives the label of the expressions whose value is displayed. If a line has no **expression** in that +field, then nothing is displayed for it in this column. If multiple columns are required, you must +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. + diff --git a/content/applications/finance/accounting/reporting/data_inalterability.md b/content/applications/finance/accounting/reporting/data_inalterability.md new file mode 100644 index 000000000..03a56a1b4 --- /dev/null +++ b/content/applications/finance/accounting/reporting/data_inalterability.md @@ -0,0 +1,118 @@ +# Data inalterability check report + +Tax authorities in some countries require companies to **prove their posted accounting entries are +unaltered**, meaning that once an entry has been secured, it can no longer be changed. + +To do so, Odoo creates a unique fingerprint for each secured entry thanks to the **SHA-256 algorithm**. +This fingerprint is called a hash. The hash is generated by taking an entry's essential data +(the values of the `name`, `date`, `journal_id`, `company_id`, `debit`, `credit`, `account_id`, and +`partner_id` fields), concatenating it, and inputting it to the SHA-256 hash function, which then +outputs a fixed size (256-bit) string of characters. The hash function is deterministic ({dfn}`the +same input always creates the same output`): any minor modification to the original data would +completely change the resulting hash. Consequently, the SHA-256 algorithm is often used, among +others, for data integrity verification purposes. + +In addition, the previous entry's hash is always added to the next entry to form a **hash chain**. +This is used to ensure a new entry is not added afterward between two secured entries, as doing so +would break the hash chain. + +:::{note} +Hashes generated by the SHA-256 algorithm are theoretically not unique, as there is a finite +number of possible values. However, this number is exceptionally high: 2²⁵⁶, which is a lot +bigger than the number of atoms in the known universe. This is why hashes are considered unique +in practice. +::: + +(data-inalterability-inalterability-features)= + +## Inalterability features + +Inalterability features can be enabled by activating the {ref}`secure posted entries with hash +` option on any journal or using the {ref}`secure entries wizard +`. + +- Two indicators are added to the journal entry's form view. + They show whether the entry is secured or not. + + - A {icon}`fa-lock` or {icon}`fa-unlock` ({guilabel}`lock icon`) next to the {guilabel}`Posted` state. + - A {guilabel}`Secured` checkbox in the {guilabel}`Other info` tab. + +- A {guilabel}`Not Secured` filter is available on journal entries and journal items' list views. + It can be used to find posted journal entries that are not secured yet. + +- The option to open the {ref}`secure entries wizard ` is displayed in the + {guilabel}`Accounting` menu. + +(data-inalterability-restricted)= + +## Secure posted entries with hash + +To activate the hashing function on a specific journal, go to {menuselection}`Accounting --> +Configuration --> Journals`. Open a sales, purchase, or miscellaneous journal, go to the +{guilabel}`Advanced Settings` tab, and enable {guilabel}`Secure Posted Entries with Hash`. +Journals for which the feature is activated are called "restricted". + +To compute the hash of an entry, Odoo retrieves the predecessor entries of the chain (i.e., the +entries with the same sequence prefix) and hashes them in a continuous way from the last hashed +entry to the new entry to hash. + +:::{warning} +Once you post an entry in a restricted journal, you cannot disable the feature anymore, nor edit +any secured entry. +::: + +(data-inalterability-wizard)= + +## Secure entries wizard + +You can also use the {guilabel}`Secure Entries` Wizard to secure all journal entries, +in **all** journals, up to a specific date. + +:::{note} +The wizard operates independently of the journal settings and journal types. +::: + +To open it, activate the {ref}`developer mode `, go to {menuselection}`Accounting +--> Accounting`, and click on {guilabel}`Secure Entries`. If the {ref}`inalterability features +` are activated, it is also visible outside the debug +mode. + +To secure entries, select a date up to which all entries should be secured and press +{guilabel}`Secure Entries`. + +:::{warning} +After securing the entries, you can no longer edit them. +::: + +:::{note} +It can happen that entries that are past the selected date are secured. +This is possible since the hash chain corresponds to the sequence prefix, +ordered by sequence number. +::: + +(data-inalterability-report)= + +## Report download + +To download the data inalterability check report, go to {menuselection}`Accounting --> Configuration +--> Settings --> Reporting` and click on {guilabel}`Download the Data Inalterability Check Report`. + +The report's first section is an overview of all journal sequence prefixes containing hashed entries. +In the {guilabel}`Restricted` column, you can see whether or not a journal has the {ref}`secure +posted entries with hash ` option (V) activated or not (X). The +{guilabel}`Check` column tells you whether all entries are correctly hashed. + +```{image} data_inalterability/journal-overview.png +:align: center +:alt: Configuration report for two journals +``` + +The second section gives a more detailed result of the data consistency check for each hashed +journal sequence prefix. You can view the first hashed entry and its corresponding hash, +as well as the last hashed entry and its corresponding hash. + +```{image} data_inalterability/data-consistency-check.png +:align: center +:alt: Data consistency check report for a journal +``` + diff --git a/content/applications/finance/accounting/reporting/intrastat.md b/content/applications/finance/accounting/reporting/intrastat.md new file mode 100644 index 000000000..b3f567130 --- /dev/null +++ b/content/applications/finance/accounting/reporting/intrastat.md @@ -0,0 +1,188 @@ +# Intrastat + +Intrastat is the data collection and statistics production system for goods traded among EU member +states. It collects data on: + +- Commercial transactions of goods for use, consumption, investment, or resale with ownership + transfer; +- Goods movements without transfer of ownership (e.g., stock relocations or moves of goods + before or after outsourced production or processing, and after maintenance or repair); +- Returns of goods. + +:::{note} +Although the Intrastat system continues to be used, the term Intrastat is not used in the [latest +legislation](http://data.europa.eu/eli/reg/2019/2152/2022-01-01), referring instead to +*intra-Union trade in goods statistics*. +::: + +:::{seealso} +[Eurostat Statistics Explained - Glossary: Intrastat](https://ec.europa.eu/eurostat/statistics-explained/index.php?title=Glossary:Intrastat) +::: + +(intrastat-general-configuration)= + +## General configuration + +Enable the Intrastat report by going to {menuselection}`Accounting --> Configuration --> Settings`. +Under the {guilabel}`Customer Invoices` section, tick {guilabel}`Intrastat` and then +{guilabel}`Save`. + +(intrastat-default-transaction-codes)= + +### Default transaction codes: invoice and refund + +You can set a default {ref}`transaction code ` for all newly created +invoice and refund transactions. Under {menuselection}`Accounting --> Configuration --> Settings`, +select a {guilabel}`Default invoice transaction code` and/or a {guilabel}`Default refund transaction +code` and then {guilabel}`Save`. The code will be set automatically on all respective invoice lines. + +(intrastat-region-code)= + +### Region code + +The region code is **only used by Belgian companies**. Under {menuselection}`Accounting --> +Configuration --> Settings`, select the {guilabel}`Company Intrastat Region` where the company is +located and then {guilabel}`Save`. + +:::{tip} +If your warehouses are located in more than one region, you can define the region code at the +level of each warehouse instead. To do so, go to {menuselection}`Inventory --> Configuration --> +Warehouses`, select a warehouse, set its {guilabel}`Intrastat region`, and then {guilabel}`Save`. + +```{image} intrastat/warehouse-region.png +:align: center +:alt: Adding the Intrastat region to a warehouse +``` +::: + +(intrastat-product-configuration)= + +## Product configuration + +All products must be properly configured to be included in the Intrastat report. + +(intrastat-commodity-code)= + +### Commodity code + +Commodity codes are internationally recognized reference numbers used to classify goods depending on +their **nature**. Intrastat uses the [Combined Nomenclature](https://taxation-customs.ec.europa.eu/customs-4/calculation-customs-duties/customs-tariff/combined-nomenclature_en). + +To add a commodity code, go to {menuselection}`Accounting --> Customers --> Products` and select a +product. Under the {guilabel}`Accounting` tab, set the product's {guilabel}`Commodity Code`. + +:::{seealso} +[National Bank of Belgium - Intrastat commodity codes](https://www.nbb.be/en/statistics/foreign-trade/nomenclature-and-codes) +::: + +(intrastat-quantity)= + +### Quantity: weight and supplementary unit + +Depending on the nature of the goods, it is necessary to specify either the product's weight in +kilos (without packaging) or the product's supplementary unit, such as square meter (`m2`), number +of items (`p/st`), liter (`l`), or gram (`g`). + +To add a product's weight or supplementary unit, go to {menuselection}`Accounting --> Customers --> +Products` and select a product. Under the {guilabel}`Accounting` tab, depending on the commodity +code set, either fill in the product {guilabel}`Weight` or its {guilabel}`Supplementary Units`. + +(intrastat-origin-country)= + +### Country of origin + +To add the product's country of origin, go to {menuselection}`Accounting --> Customers --> Products` +and select a product. Under the {guilabel}`Accounting` tab, set the {guilabel}`Country of Origin`. + +(intrastat-invoice-bill-configuration)= + +## Invoices and bills configuration + +Once products are properly configured, several settings must be configured on the invoices and bills +you create. + +(intrastat-transaction-code)= + +### Transaction code + +Transaction codes are used to identify a transaction's nature. {ref}`Default transaction codes +` can be set for invoice and refund transactions. + +To set a transaction code on an invoice line, create an invoice or a bill, click the columns +selection button, tick {guilabel}`Intrastat`, and use the newly-added {guilabel}`Intrastat` column +to select a transaction code. + +```{image} intrastat/intrastat-column.png +:align: center +:alt: Adding the Intrastat column to an invoice or bill +``` + +:::{seealso} +[National Bank of Belgium - Intrastat: Nature of transactions from January 2022](https://www.nbb.be/doc/dd/onegate/data/new_natures_of_transaction_2022_en.pdf) +::: + +(intrastat-partner-country)= + +### Partner country + +The partner country represents the vendor's country for bills and the customer's country for +invoices. It is automatically filled in using the country set in the contact's {guilabel}`Country` +field. + +To edit the partner country manually, create an invoice or a bill, click the {guilabel}`Other Info` +tab, and select the {guilabel}`Intrastat Country`. + +(intrastat-transport-code)= + +### Transport code + +The transport code identifies the presumed **mode of transport** used to send the goods (arrival or +dispatch). + +To add the transport code, create an invoice or a bill, go to the {guilabel}`Other info` tab, +and select the {guilabel}`Intrastat Transport Mode`. + +(intrastat-value)= + +### Value of the goods + +The value of a good is the untaxed {guilabel}`Subtotal` ({guilabel}`Price` multiplied by +{guilabel}`Quantity`) of an invoice line. + +(intrastat-partner)= + +## Partner configuration + +Two fields from the partner's contact form are used with Intrastat: {guilabel}`VAT` and +{guilabel}`Country`. The country can be {ref}`manually set ` on the +invoice or bill. + +## Generate the Intrastat report + +Generate the report by going to {menuselection}`Accounting --> Reporting --> Audit Reports: +Intrastat Report`. It is automatically computed based on the {ref}`default configuration +` and the information found on the {ref}`products +`, {ref}`invoices and bills +`, and {ref}`partners `. + +Export the report as a PDF, XLSX, or XML file to post it to your legal administration. + +Each report line refers to a single invoice line and contains the following information: + +- Invoice or bill reference number; +- System, which is a code automatically generated depending on whether the document is an invoice + (dispatch) or a bill (arrival); +- {ref}`Country `, which is the vendor's country for arrivals and the + customer's country for dispatches; +- {ref}`Transaction Code `; +- (If your company is located in Belgium) {ref}`Region Code `; +- {ref}`Commodity Code `; +- {ref}`Origin Country `; +- {ref}`Partner VAT `; +- {ref}`Transport Code `; +- {doc}`Incoterm Code <../customer_invoices/incoterms>`; +- {ref}`Weight `; +- {ref}`Supplementary Units `; and +- {ref}`Value `, which is always expressed in euros even if the original invoice or + bill used another currency. + diff --git a/content/applications/finance/accounting/reporting/silverfin.md b/content/applications/finance/accounting/reporting/silverfin.md new file mode 100644 index 000000000..675bd46b4 --- /dev/null +++ b/content/applications/finance/accounting/reporting/silverfin.md @@ -0,0 +1,69 @@ +# Silverfin integration + +[Silverfin](https://www.silverfin.com) is a third-party service provider that offers a cloud +platform for accountants. + +Odoo and Silverfin provide an integration to automate the synchronization of data. + +## Configuration + +To configure this integration, you need to input the following data into your Silverfin account: + +- user's email address +- {ref}`Odoo API key ` +- URL of the Odoo database +- name of your Odoo database + +(silverfin-api-key)= + +### Odoo API key + +You can create Odoo external API keys either {ref}`for a single database ` +(hosting: Odoo Online, On-premise, and Odoo.sh) or {ref}`for all databases managed by a single user +` (hosting: Odoo Online). + +:::{important} +- These API keys are personal and provide full access to your user account. Store it securely. +- You can copy the API key only at its creation. It is not possible to retrieve it later. +- If you need it again, create a new API key (and delete the old one). +::: + +:::{seealso} +{doc}`/developer/reference/external_api` +::: + +(silverfin-api-singledb)= + +#### Per database + +To add an API key to a **single** database, connect to the database, enable the {ref}`developer +mode `, click on the user menu, and then {guilabel}`My Profile` / +{guilabel}`Preferences`. Under the {guilabel}`Account Security` tab, click on {guilabel}`New API +Key`, confirm your password, give a descriptive name to your new key, and copy the API key. + +```{image} silverfin/api-key-db.png +:alt: creation of an Odoo external API key for a database +``` + +:::{seealso} +{ref}`api/external_api/keys` +::: + +(silverfin-api-multipledb)= + +#### For all databases (fiduciaries) + +To add an API key to **all** databases managed by a single user at the same time **(the easiest +method for fiduciaries)**, navigate to [Odoo's website](https://www.odoo.com) and sign in with +your administrator account. Next, open [your account security settings in developer mode](https://www.odoo.com/my/security?debug=1), click on {guilabel}`New API Key`, confirm your +password, give a descriptive name to your new key, and copy the new API key. + +:::{tip} +Open the [database manager](https://www.odoo.com/my/databases) to view all databases that will +be linked to the single API key. +::: + +```{image} silverfin/api-key-user.png +:alt: creation of an Odoo external API key for an Odoo user +``` + diff --git a/content/applications/finance/accounting/reporting/tax_carryover.md b/content/applications/finance/accounting/reporting/tax_carryover.md new file mode 100644 index 000000000..269f08e63 --- /dev/null +++ b/content/applications/finance/accounting/reporting/tax_carryover.md @@ -0,0 +1,40 @@ +# Tax carryover + +When performing tax reports, the **tax carryover** feature allows carrying amounts from one period +to another without creating new entries. + +It has been created to meet the legal requirements of specific locations, where amounts must be +transferred from period to period (for example, because the total of the line is negative). + +The feature is activated by default in countries where it is required, such as Belgium, France, and +Italy. There is no specific configuration required. + +Let’s take an example of a Belgian company that created a credit note of 100 for one of their +customers. The due tax is 21%. + +```{image} tax_carryover/belgian-example.png +:align: center +:alt: Illustration with a credit note +``` + +In this case, as per local regulation, grid 81 of the tax report may contain a negative amount. But +it must be declared to the government as zero, and the negative amount should be carried over to the +next period. + +If we go to {menuselection}`Accounting app --> Reporting --> Tax Report`, a pop-up on line 81 +explains that the amount will be carried over in the next period. + +```{image} tax_carryover/pop-up.png +:align: center +:alt: pop-up message stating the amount will be carried over to the next period +``` + +At the time of the tax closing period, the tax report shows that the amount was carried over from +the previous period. It also indicates the amount that will be carried over to this line in the next +period based on the existing transactions and the carryover from the previous period. + +```{image} tax_carryover/tax-return.png +:align: center +:alt: Illustration of the tax return +``` + diff --git a/content/applications/finance/accounting/reporting/tax_returns.md b/content/applications/finance/accounting/reporting/tax_returns.md new file mode 100644 index 000000000..d26382c75 --- /dev/null +++ b/content/applications/finance/accounting/reporting/tax_returns.md @@ -0,0 +1,114 @@ +# Tax return (VAT declaration) + +Companies with a registered {abbr}`VAT (Value Added Tax)` number must submit a **tax return** on +a monthly or quarterly basis, depending on their turnover and the registration regulation. A tax +return - or VAT return - gives the tax authorities information about the taxable transactions made +by the company. The **output tax** is charged on the number of goods and services sold by a +business, while the **input tax** is the tax added to the price when goods or services are +purchased. Based on these values, the company can calculate the tax amount they have to pay or be +refunded. + +:::{note} +You can find additional information about VAT and its mechanism on this page from the European +Commission: ["What is VAT?"](https://ec.europa.eu/taxation_customs/business/vat/what-is-vat_en). +::: + +(tax-returns-prerequisites)= + +## Prerequisites + +(tax-returns-periodicity)= + +### Tax Return Periodicity + +The configuration of the **Tax Return Periodicity** allows Odoo to compute your tax return correctly +and also to send you a reminder to never miss a tax return deadline. + +To do so, go to {menuselection}`Accounting --> Configuration --> Settings`. Under the +{guilabel}`Tax Return Periodicity`, you can set: + +- {guilabel}`Periodicity`: define here whether you submit your tax return on a monthly or quarterly + basis; +- {guilabel}`Reminder`: define when Odoo should remind you to submit your tax return; +- {guilabel}`Journal`: select the journal in which to record the tax return. + +:::{note} +This is usually configured during the {doc}`app's initial set up <../get_started>`. +::: + +(tax-returns-tax-grids)= + +### Tax Grids + +Odoo generates tax reports based on the {guilabel}`Tax Grids` settings that are configured on your +taxes. Therefore, it is crucial to make sure that all recorded transactions use the right taxes. +You can see the {guilabel}`Tax Grids` by opening the {guilabel}`Journal Items` tab of any +invoice and bill. + +```{image} tax_returns/tax_return_grids.png +:alt: see which tax grids are used to record transactions in Odoo Accounting +``` + +To configure your tax grids, go to {menuselection}`Accounting --> Configuration --> Taxes`, +and open the tax you want to modify. There, you can edit your tax settings, along with the tax +grids that are used to record invoices or refunds. + +:::{note} +Taxes and reports are usually already pre-configured in Odoo: a {ref}`fiscal localization package +` is installed according to the country you select at the creation +of your database. +::: + +(tax-returns-close)= + +## Close a tax period + +(tax-returns-lock-date)= + +### Tax lock date + +Any new transaction whose accounting date prior to the {guilabel}`Lock Tax Return` date has its tax +values moved to the next open tax period. This is useful to make sure that no change can be made to +a report once its period is closed. + +Therefore, we recommend locking your tax date before working on your +{guilabel}`Closing Journal Entry`. +This way, other users cannot modify or add transactions that would have an impact on the +{guilabel}`Closing Journal Entry`, which can help you avoid some tax declaration errors. + +To check the current {guilabel}`Lock Tax Return` date, or to edit it, go to +{menuselection}`Accounting --> Accounting --> Lock Dates`. + +(tax-returns-report)= + +### Tax return + +Once all the transactions involving taxes have been posted for the period you want to report, open +the {guilabel}`Tax Return` report by going to {menuselection}`Accounting --> Reporting --> Tax +Return`. Select the period you want to declare using the date filter to have an overview of the tax +return. Then, click {guilabel}`Closing Entry` to create a tax closing journal entry. Odoo +automatically proposes the details of the journal entry. Make any necessary changes and click +{guilabel}`Post`. + +From the report, click {guilabel}`PDF` to download a PDF of the tax return. Alternatively, click the +{icon}`fa-cog` ({guilabel}`gear`) icon, then click {guilabel}`Download Excel` to download an XLSX of +the tax return. To save the report to the Documents app, click the {icon}`fa-cog` ({guilabel}`gear`) +icon, then click {guilabel}`Copy to Documents`. Select the format to {guilabel}`Export to`, the +{guilabel}`Documents Name`, the {guilabel}`Folder` to store it in, and add any {guilabel}`Tags`. + +The report includes all the values to report to the tax authorities, along with the amount to be +paid or refunded. + +:::{note} +If you forgot to lock your tax date before clicking on {guilabel}`Closing Journal Entry`, then +Odoo automatically locks your fiscal period on the same date as the accounting date of your +entry. This safety mechanism can prevent some fiscal errors, but it is advised to lock your tax +date manually before, as described above. +::: + +:::{seealso} +- {doc}`../taxes` +- {doc}`../get_started` +- {doc}`../../fiscal_localizations` +::: + diff --git a/content/applications/finance/accounting/reporting/year_end.md b/content/applications/finance/accounting/reporting/year_end.md new file mode 100644 index 000000000..f7976292e --- /dev/null +++ b/content/applications/finance/accounting/reporting/year_end.md @@ -0,0 +1,115 @@ +# Year-end closing + +Year-end closing is vital for maintaining financial accuracy, complying with regulations, making +informed decisions, and ensuring transparency in reporting. + +(year-end-fiscal-years)= + +## Fiscal years + +By default, the fiscal year is set to last 12 months and end on December 31st. However, its duration +and end date can vary due to cultural, administrative, and economic considerations. + +To modify these values, go to {menuselection}`Accounting --> Configuration --> Settings`. Under the +{guilabel}`Fiscal Periods` section, change the {guilabel}`Last Day` field if necessary. + +If the period lasts *more* than or *less* than 12 months, enable {guilabel}`Fiscal Years` and +{guilabel}`Save`. Go back to the {guilabel}`Fiscal Periods` section and click {guilabel}`➜ Fiscal +Years`. From there, click {guilabel}`Create`, give it a {guilabel}`Name`, and both a +{guilabel}`Start Date` and {guilabel}`End Date`. + +:::{note} +Once the set fiscal period is over, Odoo automatically reverts to the default periodicity, taking +into account the value specified in the {guilabel}`Last Day` field. +::: + +(year-end-checklist)= + +## Year-end checklist + +### Before closure + +Before closing a fiscal year, ensure first everything is accurate and up-to-date: + +- Make sure all bank accounts are fully {doc}`reconciled <../bank/reconciliation>` up to year-end, + and confirm that the ending book balances match the bank statement balances. +- Verify that all {doc}`customer invoices <../customer_invoices>` have been entered and + approved and that there are no draft invoices. +- Confirm that all {doc}`vendor bills <../vendor_bills>` have been entered and agreed upon. +- Validate all {doc}`expenses <../../expenses>`, ensuring their accuracy. +- Corroborate that all {doc}`received payments <../payments>` have been encoded and recorded + accurately. +- Close all {ref}`suspense accounts `. +- Book all {doc}`depreciation <../vendor_bills/assets>` and {doc}`deferred revenue + <../customer_invoices/deferred_revenues>` entries. + +### Closing a fiscal year + +Then, to close the fiscal year: + +- Run a {ref}`tax report `, and verify that all tax information is + correct. + +- Reconcile all accounts on the {ref}`balance sheet `: + + - Update the bank balances in Odoo according to the actual balances found on the bank statements. + - Reconcile all transactions in the cash and bank accounts by running the {ref}`aged receivables + ` and {ref}`aged payables + ` reports. + - Audit all accounts, being sure to fully understand all transactions and their nature, making + sure to include loans and fixed assets. + - Optionally, {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. + +Next, the accountant likely verifies balance sheet items and book entries for: + +> - year-end manual adjustments, +> - work in progress, +> - depreciation journal entries, +> - loans, +> - tax adjustments, +> - etc. + +If the accountant is going through the year-end audit, they may want to have paper copies of all +balance sheet items (such as loans, bank accounts, prepayments, sales tax statements, etc.) to +compare these with the balances in Odoo. + +:::{tip} +During this process, it is good practice to set a {guilabel}`Journal Entries Lock Date` to the +last day (inclusive) of the preceding fiscal year by going to {menuselection}`Accounting --> +Accounting --> Lock Dates`. This way, the accountant can be confident that nobody changes the +transactions while auditing the books. Users from the *accountant* access group can still create +and modify entries. +::: + +#### Current year's earnings + +Odoo uses a unique account type called **current year's earnings** to display the amount difference +between the **income** and **expenses** accounts. + +:::{note} +The chart of accounts can only contain one account of this type. By default, it is a 999999 +account named {guilabel}`Undistributed Profits/Losses`. +::: + +To allocate the current year's earnings, create a miscellaneous entry to book them to any equity +account. Once done, confirm whether or not the current year's earnings in the **balance sheet** is +correctly reporting a balance of zero. If that is the case, set an {guilabel}`All Users Lock Date` +to the last day of the fiscal year by going to {menuselection}`Accounting --> Accounting --> Lock +Dates`. + +:::{tip} +Install the {guilabel}`Irreversible Lock Date` (`account_lock`) module to make the {guilabel}`All +Users Lock Date` *irreversible* once set. +::: + +:::{note} +A specific year-end closing entry is **optional** in order to close out the **profit and loss +statement**. The reports are created in real-time, meaning that the profit and loss statement +corresponds directly with the year-end date specified in Odoo. Therefore, any time the **income +statement** is generated, the beginning date corresponds with the beginning of the **fiscal +year** and all account balances should equal zero. +::: + diff --git a/content/applications/finance/accounting/taxes.md b/content/applications/finance/accounting/taxes.md new file mode 100644 index 000000000..4eafbc171 --- /dev/null +++ b/content/applications/finance/accounting/taxes.md @@ -0,0 +1,365 @@ +--- +show-content: true +--- + +# Taxes + +There are numerous types of **taxes**, and their application varies greatly, depending mostly on +your company's localization. To make sure they are recorded with accuracy, Odoo's tax engine +supports all kinds of uses and computations. + +(taxes-default)= + +## Default taxes + +**Default taxes** define which taxes are automatically selected when creating a new product. They +are also used to prefill the {guilabel}`Taxes` field when adding a new line on an invoice in +{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`. + +```{image} taxes/default-taxes.png +:alt: Define which taxes to use by default on Odoo +``` + +:::{note} +**Default taxes** are automatically set up according to the country selected at the creation of +your database, or when you set up a {ref}`fiscal localization package +` for your company. +::: + +(taxes-list-activation)= + +## Activate sales taxes from the list view + +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 +activated by default. To activate taxes relevant to your business, go to {menuselection}`Accounting +--> Configuration --> Taxes` and enable the toggle button under the {guilabel}`Active` column. + +```{image} taxes/list.png +:alt: Activate pre-configured taxes in Odoo Accounting +``` + +(taxes-configuration)= + +## Configuration + +To edit or create a **tax**, go to {menuselection}`Accounting --> Configuration --> Taxes` and open +a tax or click on {guilabel}`New`. + +```{image} taxes/edit.png +:alt: Edition of a tax in Odoo Accounting +``` + +### Basic options + +(taxes-name)= + +#### Tax name + +The **tax name** is displayed for backend users in the {guilabel}`Taxes` field in +{doc}`sales orders <../../sales/sales>`, {doc}`invoices `, product forms, etc. + +(taxes-computation)= + +#### Tax computation + +- **Group of Taxes** + + The tax is a combination of multiple sub-taxes. You can add as many taxes as you want, in the + order you want them to be applied. + + :::{important} + Make sure that the tax sequence is correct, as the order in which they are may impact the + taxes' amounts computation, especially if one of the taxes {ref}`affects the base of the + subsequent ones `. + ::: + +- **Fixed** + + The tax has a fixed amount in the default currency. The amount remains the same, regardless of the + sales price. + +```{eval-rst} +.. example:: + A product has a sales price of $1000, and we apply a $10 *fixed* tax. We then have: + + +-------------+-------------+----------+----------+ + | Product | Price | Tax | Total | + | sales price | without tax | | | + +=============+=============+==========+==========+ + | 1,000 | 1,000 | 10 | 1,010.00 | + +-------------+-------------+----------+----------+ +``` + +- **Percentage of price** + + The *sales price* is the taxable basis: the tax amount is computed by multiplying the sales price + by the tax percentage. + +```{eval-rst} +.. example:: + A product has a sales price of $1000, and we apply a *10% of Price* tax. We then have: + + +-------------+-------------+----------+----------+ + | Product | Price | Tax | Total | + | sales price | without tax | | | + +=============+=============+==========+==========+ + | 1,000 | 1,000 | 100 | 1,100.00 | + +-------------+-------------+----------+----------+ +``` + +- **Percentage of Price Tax Included** + + The **total** is the taxable basis: the tax amount is a percentage of the total. + +```{eval-rst} +.. example:: + A product has a Sales Price of $1000, and we apply a *10% of Price Tax Included* tax. We then + have: + + +-------------+-------------+----------+----------+ + | Product | Price | Tax | Total | + | sales price | without tax | | | + +=============+=============+==========+==========+ + | 1,000 | 1,000 | 111.11 | 1,111.11 | + +-------------+-------------+----------+----------+ +``` + +- **Python code** + + A tax defined as **Python code** consists of two snippets of Python code that are executed in a + local environment containing data such as the unit price, product or partner. + {guilabel}`Python Code` defines the amount of the tax, and {guilabel}`Applicable Code` defines if + the tax is to be applied. The formula is found at the bottom of the {guilabel}`Definition` tab. + +```{eval-rst} +.. example:: + :guilabel:`Python Code`: `result = price_unit * 0.10` + :guilabel:`Applicable Code`: `result = true` +``` + +(taxes-active)= + +#### Active + +Only **active** taxes can be added to new documents. + +:::{important} +It is not possible to delete taxes that have already been used. Instead, you can deactivate them +to prevent future use. +::: + +:::{note} +This field can be modified from the {ref}`list view `. +::: + +(taxes-scope)= + +#### Tax type + +The {guilabel}`Tax Type` determines the tax application, which also restricts where it is displayed. + +- **Sales**: Customer invoices, product customer taxes, etc. +- **Purchase**: Vendor bills, product vendor taxes, etc. +- **None** + +:::{tip} +You can use {guilabel}`None` for taxes that you want to include in a {ref}`Group of Taxes +` but that you do not want to list along with other sales or purchase taxes. +::: + +#### Tax scope + +The {guilabel}`Tax Scope` restricts the use of taxes to a type of product, either **goods** or +**services**. + +(taxes-definition-tab)= + +### Definition tab + +Allocate with precision the amount of the taxable basis or percentages of the computed tax to +multiple accounts and tax grids. + +```{image} taxes/definition.png +:alt: Allocate tax amounts to the right accounts and tax grids +``` + +- **Based On**: + + - {guilabel}`Base`: the price on the invoice line + - {guilabel}`% of tax`: a percentage of the computed tax. + +- **Account**: if defined, an additional journal item is recorded. + +- **Tax Grids**: used to generate {doc}`tax reports ` + automatically, according to your country's regulations. + +(taxes-advanced-tab)= + +### Advanced options tab + +(taxes-label-invoices)= + +#### Label on invoices + +The tax label is displayed on each invoice line in the {guilabel}`Taxes` column. This is visible to +*front-end* users on exported invoices, in customer portals, etc. + +```{image} taxes/invoice-label.png +:alt: The label on invoices is displayed on each invoice line +``` + +(taxes-tax-group)= + +#### Tax group + +Select which **tax group** the tax belongs to. The tax group name is the displayed above the +**total** line on exported invoices and in customer portals. + +Tax groups include different iterations of the same tax. This can be useful when you must record +the same tax differently according to {doc}`fiscal positions `. + +```{eval-rst} +.. example:: + + .. image:: taxes/invoice-tax-group.png + :alt: The Tax Group name is different from the Label on Invoices + + In the example above, the :guilabel:`0% EU S` tax for intra-community customers in Europe records + the amount on specific accounts and tax grids. However, it remains a 0% tax to the customer. This + is why the label indicates :guilabel:`0% EU S`, and the tax group name above the + :guilabel:`Total` line indicates :guilabel:`VAT 0%`. +``` + +:::{important} +Taxes have three different labels, each one having a specific use. Refer to the following table +to see where they are displayed. + +| {ref}`Tax Name ` | {ref}`Label on Invoice ` | {ref}`Tax Group ` | +| ---------------------------- | ---------------------------------------------- | ----------------------------------------------------- | +| Backend | {guilabel}`Taxes` column on exported invoices | Above the {guilabel}`Total` line on exported invoices | +::: + +(taxes-analytic-cost)= + +#### Include in analytic cost + +With this option activated, the tax amount is assigned to the same **analytic account** as the +invoice line. + +(taxes-included-in-price)= + +#### Included in price + +With this option activated, the total (including the tax) equals the **sales price**. + +`Total = Sales Price = Computed Tax-Excluded price + Tax` + +```{eval-rst} +.. example:: + A product has a sales price of $1000, and we apply a *10% of Price* tax, which is *included in + the price*. We then have: + + +-------------+-------------+----------+----------+ + | Product | Price | Tax | Total | + | sales price | without tax | | | + +=============+=============+==========+==========+ + | 1,000 | 900.10 | 90.9 | 1,000.00 | + +-------------+-------------+----------+----------+ +``` + +:::{note} +If you need to define prices accurately, both tax-included and tax-excluded, please refer to the +following documentation: {doc}`taxes/B2B_B2C`. +::: + +:::{note} +By default, only the {guilabel}`Tax excluded` column is displayed on invoices. To display the +{guilabel}`Tax included` column, click the **dropdown toggle** button and check +{guilabel}`Tax incl.`. + +```{image} taxes/toggle-button.png +``` +::: + +(taxes-base-subsequent)= + +#### Affect base of subsequent taxes + +With this option, the total tax-included becomes the taxable basis for the other taxes applied to +the same product. + +You can configure a new {ref}`group of taxes ` to include this tax or add it +directly to a product line. + +```{image} taxes/subsequent-line.png +:alt: The eco-tax is taken into the basis of the 21% VAT tax +``` + +:::{warning} +The order in which you add the taxes on a product line has no effect on how amounts are computed. +If you add taxes directly on a product line, only the tax sequence determines the order in which +they are applied. + +To reorder the sequence, go to {menuselection}`Accounting --> Configuration --> Taxes`, and drag +and drop the lines with the handles next to the tax names. + +```{image} taxes/list-sequence.png +:alt: The taxes' sequence in Odoo determines which tax is applied first +``` +::: + +## Extra taxes + +"Extra taxes" is a broad term referring to additional taxes beyond the standard or basic taxes +imposed by governments. These extra taxes can be **luxury** taxes, **environmental** taxes, +**import** or **export duties** taxes, etc. + +:::{note} +The method to compute these taxes varies across different countries. We recommend consulting your +country's regulations to understand how to calculate them for your business. +::: + +To compute an extra tax in Odoo, {ref}`create a tax `, enter a tax name, select +a {ref}`Tax Computation `, set an {guilabel}`Amount`, and in the +{guilabel}`Advanced Options` tab, check {guilabel}`Affect Base of Subsequent Taxes`. Then, drag and +drop the taxes in the {ref}`order they should be computed `. + +```{eval-rst} +.. example:: + - In Belgium, the formula to compute an environmental tax is: `(product price + environmental + tax) x sales tax`. Therefore, our environmental tax has to come *before* the sales tax in the + computation sequence. + - In our case, we created a 5% environmental tax (Ecotax) and put it *before* the Belgian base + tax of 21%. + + .. image:: taxes/ecotax.png + :alt: Environmental tax sequence in Belgium. +``` + +:::{seealso} +- {doc}`taxes/fiscal_positions` +- {doc}`taxes/B2B_B2C` +- {doc}`reporting/tax_returns` +::: + +```{toctree} +:titlesonly: true + +taxes/cash_basis +taxes/retention +taxes/vat_verification +taxes/fiscal_positions +taxes/avatax +taxes/eu_distance_selling +taxes/B2B_B2C +``` + diff --git a/content/applications/finance/accounting/taxes/B2B_B2C.md b/content/applications/finance/accounting/taxes/B2B_B2C.md new file mode 100644 index 000000000..fc2fe4b6e --- /dev/null +++ b/content/applications/finance/accounting/taxes/B2B_B2C.md @@ -0,0 +1,178 @@ +# 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%: + +- 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: + +- **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: + +- 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. +::: + +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. +::: + +## 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. + +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: + +1. always store the default price **tax excluded** on the product form, and + apply a tax (price excluded on the product form) +2. create a pricelist with prices in **tax included**, for specific + customers +3. create a fiscal position that switches the tax excluded to a tax + included +4. 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 + +(b2b-b2c-ecommerce)= + +### eCommerce + +If you only use B2C or B2B prices on your website, simply select the appropriate setting in the +**Website** app settings. + +If you have both B2B and B2C prices on a single website, please follow these instructions: + +1. Activate the {ref}`developer mode ` and go to {menuselection}`General Settings + --> Users & Companies --> Groups`. +2. Open either `Technical / Tax display B2B` or `Technical / Tax display B2C`. +3. Under the {guilabel}`Users` tab, add the users requiring access to the price type. Add B2C users + in the B2C group and B2B users in the B2B group. + +### 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. + +```{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, 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: + +```{image} B2B_B2C/price_B2C_B2B02.png +:align: center +``` + +### 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) + +```{image} B2B_B2C/price_B2C_B2B03.png +:align: center +``` + +## 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€. + +```{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€. + +```{image} B2B_B2C/price_B2C_B2B05.png +:align: center +``` + +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. + +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. + diff --git a/content/applications/finance/accounting/taxes/avatax.md b/content/applications/finance/accounting/taxes/avatax.md new file mode 100644 index 000000000..f7982b584 --- /dev/null +++ b/content/applications/finance/accounting/taxes/avatax.md @@ -0,0 +1,438 @@ +--- +show-content: true +--- + +# AvaTax integration + +Avalara's *AvaTax* is a cloud-based tax software. Integrating *AvaTax* with Odoo provides real-time +and region-specific tax calculations when users sell, purchase, and invoice items in Odoo. *AvaTax* +tax calculation is supported with every United Nations charted country, including inter-border +transactions. + +:::{important} +*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`. +::: + +*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 +circumstances (like, tax holidays, and product exemptions). Companies who integrate with *AvaTax* +can maintain control of tax-calculations in-house with this simple {abbr}`API (application +programming interface)` integration. + +:::{important} +Some limitations exist in Odoo while using AvaTax for tax calculation: + +- AvaTax uses the company address by default. To use the warehouse address, enable {doc}`Allow + Ship Later <../../../sales/point_of_sale/shop/ship_later>` in the **POS** app settings. +- Excise tax is **not** supported. This includes tobacco/vape taxes, fuel taxes, and other + specific industries. +::: + +:::{seealso} +Avalara's support documents: [About AvaTax](https://community.avalara.com/support/s/document-item?language=en_US) +::: + +## Set up on AvaTax + +To use *AvaTax*, an account with Avalara is required for the setup. If one has not been set up yet, +connect with Avalara to purchase a license: [Avalara: Let's Talk](https://www.avalara.com/us/en/get-started.html). + +:::{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`. +::: + +Then, [create a basic company profile](https://www.odoo.com/r/2k0). + +### Create basic company profile + +Collect essential business details for the next step: locations where tax is collected, +products/services sold (and their sales locations), and customer tax exemptions, if applicable. +Follow the Avalara documentation for creating a basic company profile: + +1. [Add company information](https://www.odoo.com/r/XZDW). +2. [Tell us where the company collects and pays tax](https://www.odoo.com/r/E6g). +3. [Verify jurisdictions and activate the company](https://www.odoo.com/r/NIy). +4. [Add other company locations for location-based filing](https://www.odoo.com/r/GF4). +5. [Add a marketplace to the company profile](https://www.odoo.com/r/QA5). + +(avatax-create-avalara-credentials)= + +### Connect to AvaTax + +After creating the basic company profile in Avalara, connect to *AvaTax*. This step links Odoo and +*AvaTax* bidirectionally. + +Navigate to either Avalara's [sandbox](https://sandbox.admin.avalara.com/) or [production](https://admin.avalara.com/) environment. This will depend on which type of Avalara account the +company would like to integrate. + +:::{seealso} +[Sandbox vs production environments in Avalara](https://knowledge.avalara.com/bundle/fzc1692293626742/page/sandbox-vs-production.html). +::: + +Log in to create the {guilabel}`License Key`. Go to {menuselection}`Settings --> License and API +Keys`. Click {guilabel}`Generate License Key`. + +:::{important} +A warning appears stating: `If your business app is connected to Avalara solutions, the +connection will be broken until you update the app with the new license key. This action cannot +be undone.` + +Generating a new license key breaks the connection with existing business apps using the *AvaTax* +integration. Make sure to update these apps with the new license key. +::: + +If this will be the first {abbr}`API (application programming interface)` integration being made +with *AvaTax* and Odoo, then click {guilabel}`Generate license key`. + +If this is an additional license key, ensure the previous connection can be broken. There is +**only** one license key associated with each of the Avalara sandbox and production accounts. + +:::{warning} +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. +::: + +## Odoo configuration + +Before using *AvaTax*, there are some additional configurations in Odoo to ensure tax calculations +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)= + +### Fiscal country + +To set the {guilabel}`Fiscal Country`, navigate to {menuselection}`Accounting app --> Configuration +--> Settings`. + +:::{seealso} +{doc}`../../fiscal_localizations` +::: + +Under the {guilabel}`Taxes` section, set the {guilabel}`Fiscal Country` feature to {guilabel}`United +States`, {guilabel}`Canada`, or {guilabel}`Brazil`. Then, click {guilabel}`Save`. + +### Company settings + +All companies operating under the Odoo database should have a full and complete address listed in +the settings. Navigate to the {menuselection}`Settings app`, and under the {guilabel}`Companies` +section, ensure there is only one company operating the Odoo database. Click {guilabel}`Update Info` +to open a separate page to update company details. + +If there are multiple companies operating in the database, click {guilabel}`Manage Companies` to +load a list of companies to select from. Update company information by clicking into the specific +company. + +Database administrators should ensure that the {guilabel}`Street...`, {guilabel}`Street2...`, +{guilabel}`City`, {guilabel}`State`, {guilabel}`ZIP`, and {guilabel}`Country` are all updated for +the companies. + +This ensures accurate tax calculations and smooth end-of-year accounting operations. + +:::{seealso} +- {doc}`../../../general/companies` +- {doc}`../get_started` +::: + +### Module installation + +Next, ensure that the Odoo *AvaTax* module is installed. To do so, navigate to the +{menuselection}`Apps application`. In the {guilabel}`Search...` bar, type in `avatax`, and press +{kbd}`Enter`. The following results populate: + +```{eval-rst} +.. list-table:: + :header-rows: 1 + :widths: 25 25 50 + + * - Name + - Technical name + - Description + * - :guilabel:`Avatax` + - `account_avatax` + - Default *AvaTax* module. This module adds the base *AvaTax* features for tax calculation. + * - :guilabel:`Avatax for geo localization` + - `account_avatax_geolocalize` + - This module includes the features required for integration of *AvaTax* into geo-localization + in Odoo. + * - :guilabel:`Avatax for SO` + - `account_avatax_sale` + - Includes the information needed for tax calculation on sales orders in Odoo. + * - :guilabel:`Avatax for Inventory` + - `account_avatax_stock` + - Includes tax calculation in Odoo Inventory. + * - :guilabel:`Amazon/Avatax Bridge` + - `sale_amazon_avatax` + - Includes tax calculation features between the *Amazon Connector* and Odoo. + * - :guilabel:`Avatax Brazil` + - `l10n_br_avatax` + - Includes information for tax calculation in the Brazil localization. + * - :guilabel:`Avatax Brazil for Services` + - `l10n_br_avatax_services` + - This module includes the required features for tax calculation for services in the Brazil + localization. + * - :guilabel:`Avatax Brazil Sale for Services` + - `l10n_br_edi_sale_services` + - This module includes the required features for tax calculation for the sale of services in + the Brazil localization. This includes electronic data interchange (EDI). + * - :guilabel:`Test SOs for the Brazilian AvaTax` + - `l10n_br_test_avatax_sale` + - This module includes the required features for test sales orders in the Brazil localization. +``` + +Click the {guilabel}`Install` button on the module labeled, {guilabel}`Avatax`: `account_avatax`. +Doing so installs the following modules: + +- {guilabel}`Avatax`: `account_avatax` +- {guilabel}`Avatax for SO`: `account_avatax_sale` +- {guilabel}`Avatax for Inventory`: `account_avatax_stock` + +Should *AvaTax* be needed for geo-localization, or with the *Amazon Connector*, then install those +modules individually by clicking on {guilabel}`Install` on {guilabel}`Avatax for geo localization` +and {guilabel}`Amazon/Avatax Bridge`, respectively. + +:::{seealso} +For localization specific *AvaTax* instructions, view the following {doc}`fiscal localization +<../../fiscal_localizations>` documentation: + +- {doc}`../../fiscal_localizations/brazil` +- {doc}`../../fiscal_localizations/united_states` +::: + +(avatax-credentials)= + +### Odoo AvaTax settings + +To integrate the *AvaTax* {abbr}`API (application programming interface)` with Odoo, go to +{menuselection}`Accounting app --> Configuration --> Settings` section. The {guilabel}`AvaTax` +fields in the {guilabel}`Taxes` section is where the *AvaTax* configurations are made, and the +credentials are entered in. + +First, tick the checkbox to the left of the {guilabel}`AvaTax` settings, to activate *AvaTax* on the +database. This is a quick, convenient way to activate and deactivate *AvaTax* tax calculation on the +Odoo database. + +```{image} avatax/avatax-configuration-settings.png +:align: center +:alt: Configure AvaTax settings +``` + +#### Prerequisites + +First, select the {guilabel}`Environment` in which the company wishes to use *AvaTax* in. It can +either be {guilabel}`Sandbox` or {guilabel}`Production`. + +:::{seealso} +For help determining which *AvaTax* environment to use (either {guilabel}`Production` or +{guilabel}`Sandbox`), visit: [Sandbox vs Production environments](https://knowledge.avalara.com/bundle/fzc1692293626742/page/sandbox-vs-production.html). +::: + +#### Credentials + +Now, the credentials can be entered in. The *AvaTax* {guilabel}`Account ID` should be entered in the +{guilabel}`API ID` field, and the {guilabel}`License Key` should be entered in the {guilabel}`API +Key` field. + +:::{important} +The {guilabel}`Account ID` can be found by logging into the *AvaTax* portal ([sandbox](https://sandbox.admin.avalara.com/) or [production](https://admin.avalara.com/)). In the +upper-right corner, click on the initials of the user and {guilabel}`Account`. The +{guilabel}`Account ID` is listed first. + +To access the {guilabel}`License Key` see this documentation: +{ref}`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 +be accessed in the Avalara management portal. + +First, log into the *AvaTax* portal ([sandbox](https://sandbox.admin.avalara.com/) or [production](https://admin.avalara.com/)). Then, navigate to {menuselection}`Settings --> Manage Companies`. +The {guilabel}`Company Code` value is located in the row of the {guilabel}`Company` in the +{guilabel}`Company Code` column. + +```{image} avatax/company-code.png +:align: center +:alt: AvaTax company code highlighted on the company details page. +``` + +#### Transaction options + +There are two transactional settings in the Odoo *AvaTax* settings that can be configured: +{guilabel}`Use UPC` and {guilabel}`Commit Transactions`. + +If the checkbox next to {guilabel}`Use UPC` is ticked, the transactions will use Universal Product +Codes (UPC), instead of custom defined codes in Avalara. Consult a certified public accountant (CPA) +for specific guidance. + +Should the {guilabel}`Commit Transactions` checkbox be ticked, then, the transactions in the Odoo +database will be committed for reporting in *AvaTax*. + +#### Address validation + +The *Address Validation* feature ensures that the most up-to-date address by postal standards is set +on a contact in Odoo. This is important to provide accurate tax calculations for customers. + +:::{important} +The {guilabel}`Address Validation` feature only works with partners/customers in North America. +::: + +Additionally, tick the checkbox next to the {guilabel}`Address validation` field. + +:::{important} +For accurate tax calculations, it is best practice to enter a complete address for the contacts +saved in the database. However, *AvaTax* can still function by implementing a best effort attempt +using only the {guilabel}`Country`, {guilabel}`State`, and {guilabel}`Zip code`. These are the +three minimum required fields. +::: + +{guilabel}`Save` the settings to implement the configuration. + +:::{tip} +Manually {guilabel}`Validate` the address by navigating to the {menuselection}`Contacts app`, and +selecting a contact. Now that the *AvaTax* module has been configured on the database, a +{guilabel}`Validate` button appears directly below the {guilabel}`Address`. + +Click {guilabel}`Validate`, and a pop-up window appears with a {guilabel}`Validated Address` and +{guilabel}`Original Address` listed. If the {guilabel}`Validated Address` is the correct mailing +address for tax purposes, click {guilabel}`Save Validated`. + +```{image} avatax/validate-address.png +:align: center +:alt: |- +: Validate address pop-up window in Odoo with "Save Validated" button and "Validated +: Address" highlighted. +``` +::: + +:::{warning} +All previously-entered addresses for contacts in the Odoo database will need to be validated +using the manually validate process outlined above. Addresses are not automatically validated if +they were entered previously. This only occurs upon tax calculation. +::: + +#### Test connection + +After entering all the above information into the *AvaTax* setup on Odoo, click {guilabel}`Test +connection`. This ensures the {guilabel}`API ID` and {guilabel}`API KEY` are correct, and a +connection is made between Odoo and the *AvaTax* application programming interface (API). + +#### 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)= + +### Fiscal position + +Next, navigate to {menuselection}`Accounting app --> Configuration --> Accounting: Fiscal +Positions`. A {guilabel}`Fiscal Position` is listed named, {guilabel}`Automatic Tax Mapping +(AvaTax)`. Click it to open *AvaTax's* fiscal position configuration page. + +Here, ensure that the {guilabel}`Use AvaTax API` checkbox is ticked. + +Optionally, tick the checkbox next to the field labeled: {guilabel}`Detect Automatically`. Should +this option be ticked, then, Odoo will automatically apply this {guilabel}`Fiscal Position` for +transactions in Odoo. + +Enabling {guilabel}`Detect Automatically` also makes specific parameters, such as {guilabel}`VAT +required`, {guilabel}`Foreign Tax ID`, {guilabel}`Country Group`, {guilabel}`Country`, +{guilabel}`Federal States`, or {guilabel}`Zip Range` appear. Filling these parameters filters the +{guilabel}`Fiscal Position` usage. Leaving them blank ensures all calculations are made using this +{guilabel}`Fiscal Position`. + +:::{warning} +Should the {guilabel}`Detect Automatically` checkbox not be ticked, each customer will need to +have the {guilabel}`Fiscal Position` set on their {guilabel}`Sales and Purchase` tab of the +contact record. To do so, navigate to {menuselection}`Sales app --> Order --> Customers`, or +{menuselection}`Contacts app --> Contacts`. Then, select a customer or contact to set the fiscal +position on. + +Navigate to the {guilabel}`Sales and Purchase` tab, and down to the section labeled, +{guilabel}`Fiscal Position`. Set the {guilabel}`Fiscal Position` field to the fiscal position +for the customer. +::: + +:::{seealso} +{doc}`fiscal_positions` +::: + +#### AvaTax accounts + +Upon selecting the checkbox option for {guilabel}`Use AvaTax API` a new {guilabel}`AvaTax` tab +appears. Click into this tab to reveal two different settings. + +The first setting is the {guilabel}`AvaTax Invoice Account`, while the second is, {guilabel}`AvaTax +Refund Account`. Ensure both accounts are set for smooth end-of-year record keeping. Consult a +certified public accountant (CPA) for specific guidance on setting both accounts. + +Click {guilabel}`Save` to implement the changes. + +### Tax mapping + +The *AvaTax* integration is available on sale orders and invoices with the included *AvaTax* fiscal +position. + +:::{tip} +Additionally, there is a {guilabel}`Tax Mapping` tab and {guilabel}`Account Mapping` tab in the +{guilabel}`Automatic Tax Mapping (AvaTax)` fiscal position, where mapping for products can also +be configured. To access {guilabel}`Fiscal Positions` navigate to {menuselection}`Accounting app +--> Configuration --> Accounting: Fiscal Positions`. +::: + +#### Product category mapping + +Before using the integration, specify an {guilabel}`Avatax Category` on the product categories. +Navigate to {menuselection}`Inventory app --> Configuration --> Product Categories`. Select the +product category to add the {guilabel}`AvaTax Category` to. In the {guilabel}`AvaTax Category` +field, select a category from the drop-down menu, or {guilabel}`Search More...` to open the complete +list of options. + +```{image} avatax/avatax-category.png +:align: center +:alt: Specify AvaTax Category on products. +``` + +#### Product mapping + +*AvaTax* Categories may be set on individual products, as well. To set the {guilabel}`Avatax +Category` navigate to {menuselection}`Inventory app --> Products --> Products`. Select the product +to add the {guilabel}`Avatax Category` to. Under the {guilabel}`General Information` tab, on the +far-right, is a selector field labeled: {guilabel}`Avatax Category`. Finally, click the drop-down +menu, and select a category, or {guilabel}`Search More...` to find one that is not listed. + +:::{note} +If both the product, and its category, have an {guilabel}`AvaTax Category` set, the product's +{guilabel}`AvaTax Category` takes precedence. +::: + +```{image} avatax/override-avatax-product-category.png +:align: center +:alt: Override product categories as needed. +``` + +:::{important} +Mapping an {guilabel}`AvaTax Category` on either the *Product* or *Product Category* should be +completed for every *Product* or *Product Category*, depending on the route that is chosen. +::: + +:::{seealso} +- {doc}`fiscal_positions` +- {doc}`avatax/avatax_use` +- {doc}`avatax/avalara_portal` +- [US Tax Compliance: Avatax elearning video](https://www.odoo.com/slides/slide/us-tax-compliance-avatax-2858?fullscreen=1) +::: + +```{toctree} +:titlesonly: true + +avatax/avatax_use +avatax/avalara_portal +``` + diff --git a/content/applications/finance/accounting/taxes/avatax/avalara_portal.md b/content/applications/finance/accounting/taxes/avatax/avalara_portal.md new file mode 100644 index 000000000..8d99fbf6d --- /dev/null +++ b/content/applications/finance/accounting/taxes/avatax/avalara_portal.md @@ -0,0 +1,253 @@ +(avatax-portal)= + +# Avalara (Avatax) portal + +Avalara's (*AvaTax*) management console offers account management options including: viewing/editing +the transactions sent from Odoo to *AvaTax*, details on how the taxes are calculated, tax reporting, +tax exemption management, and tax return resources. + +:::{tip} +Avalara is the software developer of the tax software, *AvaTax*. +::: + +To access the console, first, navigate to either Avalara's [sandbox](https://sandbox.admin.avalara.com/) or [production](https://admin.avalara.com/) environment. +This will depend on which type of account was set in the {doc}`integration <../avatax>`. Log in to +the management console. + +```{image} avalara_portal/avalara-portal.png +:align: center +:alt: Avalara dashboard after logging into management portal. +``` + +:::{seealso} +For more information see Avalara's documentation: [Activate your Communications Customer Portal +account](https://community.avalara.com/support/s/document-item?language=en_US&bundleId=qvv1656594440497&topicId=Activate_your_Communications_Customer_Portal_account.html&_LANG=enus). +::: + +(avalara-portal-transactions)= + +## Transactions + +To access transactions, click in the {guilabel}`Transactions` link on the main dashboard upon +logging into the {ref}`avatax/portal`. To manually access the *Transactions* page, while logged into +the Avalara console, navigate to {menuselection}`Transactions --> Transactions`. + +```{image} avalara_portal/avalara-transactions.png +:align: center +:alt: Avalara portal with the transactions shortcut highlighted. +``` + +### Edit transaction + +Click into a transaction to reveal more details about the transaction. These details include +sections on {guilabel}`Invoice detail`, {guilabel}`Additional info`, and {guilabel}`Customer info`. +Click {icon}`fa-pencil` {guilabel}`Edit document details` to make changes to the transaction. + +A {guilabel}`Discount` can be added to adjust the invoice. This is especially useful in cases where +the transaction has already synced with Avalara / *AvaTax*, and changes need to be made afterward. + +(avalara-portal-filter)= + +### Filter + +Filter transactions on the {guilabel}`Transactions` page, by setting the {guilabel}`From` and +{guilabel}`To` fields, and configuring other fields to filter by, including: + +- {guilabel}`Document Status`: any of the following options, {guilabel}`All`, {guilabel}`Voided`, + {guilabel}`Committed`, {guilabel}`Uncommitted`, or {guilabel}`Locked`. +- {guilabel}`Document Code`: any of the following options, {guilabel}`Exactly match`, + {guilabel}`Starts with`, or {guilabel}`Contains`. +- {guilabel}`Customer/Vendor Code`: the customer/vendor code in Odoo (e.g. `Contact18`). +- {guilabel}`Country`: the country this tax was calculated in; this is a text field. +- {guilabel}`Region`: the region of the country, which varies based on the {guilabel}`Country` + selection. + +Click {icon}`fa-plus` {guilabel}`Filters` to access the following filter conditions: + +- {guilabel}`Document Type`: any of the following selections, {guilabel}`All`, {guilabel}`Sales + Invoice`, {guilabel}`Purchase Invoice`, {guilabel}`Return Invoice`, {guilabel}`Inventory Transfer + Inbound Invoice`, {guilabel}`Inventory Transfer Outbound Invoice`, or {guilabel}`Customs + Invoice`. +- {guilabel}`Import ID`: represents the import ID of the document. + +### Sort by + +On the {guilabel}`Transactions` page, transactions will be listed below, according to the set +{ref}`avalara/portal-filter`, located in the top half of the page. The following columns are +available by default, to sort by ascending or descending order: + +- {guilabel}`Doc Code`: either of the following options, {guilabel}`Exactly match`, + {guilabel}`Starts with`, or {guilabel}`Contains`. +- {guilabel}`Doc Status`: either of the following options, {guilabel}`All`, {guilabel}`Voided`, + {guilabel}`Committed`, {guilabel}`Uncommitted`, or {guilabel}`Locked`. +- {guilabel}`Cust/Vendor Code` : this is the customer/vendor code in Odoo (e.g. Contact18). +- {guilabel}`Region`: this is the region of the country, this will vary based on the + {guilabel}`Country` selection. +- {guilabel}`Amount`: the numeric amount of the total amount on the Odoo document. +- {guilabel}`Tax`: the numeric amount of the tax applied to the total. + +```{image} avalara_portal/transactions.png +:align: center +:alt: Transactions page on the Avalara portal with the filter and sort-by options highlighted. +``` + +#### Customize columns + +Additional columns can be added by clicking the {icon}`fa-cog` {guilabel}`Customize columns`. On the +resulting popover window, click the drop-down menu for the {guilabel}`column` that should be +changed. + +The following columns can be added for additional transactional information: + +- {guilabel}`AvaTax calculated`: the amount of tax calculated by *AvaTax*. +- {guilabel}`Country`: the country this tax was calculated in; this is a text field. +- {guilabel}`Cust/vendor code`: the customer/vendor code in Odoo (e.g. `Contact18`). +- {guilabel}`Currency`: the standardized abbreviation for the currency the amount total is in. +- {guilabel}`Doc date`: the document's date of creation. +- {guilabel}`Doc status`: any of the following options, {guilabel}`All`, {guilabel}`Voided`, + {guilabel}`Committed`, {guilabel}`Uncommitted`, or {guilabel}`Locked`. +- {guilabel}`Doc type`: any of the following selections, {guilabel}`All`, {guilabel}`Sales + Invoice`, {guilabel}`Purchase Invoice`, {guilabel}`Return Invoice`, {guilabel}`Inventory Transfer + Inbound Invoice`, {guilabel}`Inventory Transfer Outbound Invoice`, or {guilabel}`Customs + Invoice`. +- {guilabel}`Import ID`: represents the import ID of the document. +- {guilabel}`Last modified`: timestamp of the last time the document was modified. +- {guilabel}`Location code`: the location code used to calculate the tax, based on the delivery + address. +- {guilabel}`PO number`: the purchase order number. +- {guilabel}`Reference code`: the Odoo reference code (e.g. NV/2024/00003) +- {guilabel}`Region`: the region of the country,which varies based on the {guilabel}`Country` + selection. +- {guilabel}`Salesperson code`: the numeric ID of the user assigned to the sales order in Odoo. +- {guilabel}`Tax date`: the month/day/year of the tax calculation. +- {guilabel}`Tax override type`: where an exemption would appear, should there be none, the field + populates with {guilabel}`None`. + +To add a new column click the {icon}`fa-plus` {guilabel}`Column`. + +:::{seealso} +For more information on *AvaTax* transactions, refer to this Avalara documentation: [Transactions](https://community.avalara.com/support/s/document-item?language=en_US&bundleId=qvv1656594440497&topicId=transactions.html&_LANG=enus). +::: + +### Import-export + +While on the {ref}`avalara/portal-transactions`, click {icon}`fa-download` {guilabel}`Import +transactions` or {icon}`fa-upload` {guilabel}`Export transactions` to import or export transactions. + +### Reports + +To access reporting, navigate to the {menuselection}`Reports` link in the top menu of the Avalara +management console. Next, select from one of the available reporting tabs: {guilabel}`Transactions +reports`, {guilabel}`Liability & tax return reports`, or {guilabel}`Exemption reports`. + +:::{tip} +Additionally, there is a {guilabel}`Favorites` tab and {guilabel}`Downloads` tab. The +{guilabel}`Favorites` tab contains any favorited report configurations for the Avalara user. The +{guilabel}`Downloads` tab contains a list view where the user can download the high-volume +transaction reports created in the last 30 days. +::: + +Make a selection for the {guilabel}`Report Category`, and the {guilabel}`Report Name`, under the +{guilabel}`Select a report` section. + +Next, fill out the {guilabel}`Select report details` section. These options will vary based on the +tab selected above. + +Depending on the report size, the following two options are available in the section labeled, +{guilabel}`Select the approximate number of transactions for your report`: {guilabel}`Create and +download the report instantly` (for small reports) and {guilabel}`Create and download the report in +the background` (for larger reports). Select one or the other depending on the volume of +transactions in this report. + +Finally, under the section labeled, {guilabel}`Report preview and export` make a selection of the +file type to download. Either a {guilabel}`.PDF` or {guilabel}`.XLS` can be chosen. Alternatively, +the file can be previewed by selecting the {guilabel}`Preview` option. + +After making all the configurations, click {guilabel}`Create report` to download the report. Click +{icon}`fa-star-o` {guilabel}`Make this report a favorite` to save the report configuration to the +user's favorites. + +After the report is created, click {icon}`fa-download` {guilabel}`Download` to download the file to +the device. + +:::{tip} +Select a pre-configured report from the {guilabel}`Frequently used reports` section of the +reporting dashboard. + +Access this list by clicking on the {guilabel}`Reports` option in the top menu of the Avalara +management console, and scroll to the bottom of the page. +::: + +:::{seealso} +[See Avalara's documentation: Reports in AvaTax](https://community.avalara.com/support/s/document-item?language=en_US&bundleId=rjq1671176624730&topicId=Reports_in_AvaTax.html&_LANG=enus). +::: + +## Add more jurisdictions + +Additional jurisdictions (tax locations) can be added in the Avalara management console. Navigate to +either Avalara's [sandbox](https://sandbox.admin.avalara.com/) or [production](https://admin.avalara.com/) environment. This will depend on which type of account was set in the +{doc}`integration <../avatax>`. + +Next, navigate to {menuselection}`Settings --> Where you collect tax`. Choose between the three +different tabs, depending on the business need. The first tab is {guilabel}`Sales and use tax`, +where tax can be collected for the United States. Click the {icon}`fa-plus` {guilabel}`Add to where +you collect sales and use tax` to add another location where the company collects sales and use tax. + +The second option, is the {guilabel}`VAT/GST` tab where the {icon}`fa-plus` {guilabel}`Add a country +or territory where you collect VAT/GST` can be selected to add another country or territory where +the company collects VAT/GST. + +Finally, on the far-right, is the {guilabel}`Customs duty` tab, where a country can be added where +the company collects customs duty. Simply click on the {icon}`fa-plus` {guilabel}`Add a country +where you calculate customs duty` icon below the tab. + +```{image} avalara_portal/where-you-collect-tax.png +:align: center +:alt: |- +: AvaTax management console, on the Where you collect tax page, with the add button and +: sales and use tax tab highlighted. +``` + +:::{seealso} +[See Avalara's documentation: Add local jurisdiction taxes](https://community.avalara.com/support/s/document-item?language=en_US&bundleId=bla1700809896571_bla1700809896571&topicId=nbw1698727575499.html&_LANG=enus). +::: + +## Tax exemption certificate + +Tax exemption certificates for customers can be added into the Avalara management console, so that +*AvaTax* is aware of which customers may be exempt from paying certain taxes. To add an *exception +certificate* navigate to {menuselection}`Exemptions --> Customer certificates`. From there, click on +the {icon}`fa-plus` {guilabel}`Add a certificate` to configure an exemption. + +:::{warning} +An Avalara subscription to Exemption Certificate Management (ECM) is required in order to attach +certificate images, and to be ready for an audit. For more on subscribing to this add-on, visit +[Avalara](https://community.avalara.com/support/s/document-item?language=en_US&bundleId=hff1682048150115_hff1682048150115&topicId=fol1682356576230.html&_LANG=enus). +::: + +## End-of-year operations + +Avalara's services include tax return services, for when it is time to file taxes at the end of the +year. To access Avalara's tax services log, into the [management portal](https://admin.avalara.com/). Then, from the main dashboard, click {guilabel}`Returns`. Avalara +will prompt the Avalara user to log in for security purposes, and redirect the user to the *Returns* +portal. + +```{image} avalara_portal/avalara-returns.png +:align: center +:alt: Avalara portal with the returns shortcut highlighted. +``` + +Click {guilabel}`Get started` to begin the tax return process. For more information, refer to this +Avalara documentation: [About Managed Returns](https://community.avalara.com/support/s/document-item?language=en_US&bundleId=hps1656397152776_hps1656397152776&topicId=Learn_about_Managed_Returns.html&_LANG=enus). + +:::{tip} +Alternatively, click on the {menuselection}`Returns` button in the top menu of the Avalara +management console. +::: + +:::{seealso} +- {doc}`../avatax` +- {doc}`avatax_use` +- [US Tax Compliance: Avatax elearning video](https://www.odoo.com/slides/slide/us-tax-compliance-avatax-2858?fullscreen=1) +::: + diff --git a/content/applications/finance/accounting/taxes/avatax/avatax_use.md b/content/applications/finance/accounting/taxes/avatax/avatax_use.md new file mode 100644 index 000000000..f4413ab93 --- /dev/null +++ b/content/applications/finance/accounting/taxes/avatax/avatax_use.md @@ -0,0 +1,169 @@ +# AvaTax use + +AvaTax is a tax calculation software that can be integrated with Odoo in the United States and +Canada. Once the {doc}`integration setup <../avatax>` is complete, the calculated tax is simple and +automatic. + +## Tax calculation + +Automatically calculate taxes on Odoo quotations and invoices with AvaTax by confirming the +documents during the sales flow. Alternatively, calculate the taxes manually by clicking the +{guilabel}`Compute Taxes` button, while these documents are in draft stage. + +:::{tip} +Clicking the {guilabel}`Compute Taxes` button recalculates taxes, if any product lines are edited +on the invoice. +::: + +```{image} avatax_use/calculate-avatax.png +:align: center +:alt: Sales quotation with the confirm and compute taxes button highlighted. +``` + +The tax calculation is triggered during the following {ref}`automatic trigger +` and {ref}`manual trigger ` circumstances. + +(avatax-automatic-triggers)= + +### Automatic triggers + +- When the sales rep sends the quote by email with {guilabel}`Send by email` button (pop-up). +- When the customer views the online quote on the portal. +- When a quote is confirmed and becomes a sales order. +- When the customer views the invoice on the portal. +- When a draft invoice is validated. +- When the customer views the subscription in the portal. +- When a subscription generates an invoice. +- When the customer gets to the last screen of the eCommerce checkout. + +(avatax-manual-triggers)= + +### Manual triggers + +- {guilabel}`Compute Taxes` button at the bottom of the quote. +- {guilabel}`Compute Taxes` button at the top of the invoice. + +Use each of these buttons to manually re-calculate the sales tax. + +:::{tip} +Use the {guilabel}`Avalara Partner Code` field that is available on customer records, quotations, +and invoices to cross-reference data in Odoo and AvaTax. This field is located under the +{menuselection}`Other info` tab of the sales order or quotation in the {guilabel}`Sales` section. + +On the customer record, navigate to *Contacts app* and select a contact. Then open the +{guilabel}`Sales & Purchase` tab and the {guilabel}`Avalara Partner Code` under the +{guilabel}`Sales` section. +::: + +:::{important} +The {guilabel}`Automatic Tax Mapping (AvaTax)` fiscal position is also applied on those Odoo +documents, like subscriptions. +::: + +:::{seealso} +- {doc}`../fiscal_positions` +::: + +## AvaTax synchronization + +Synchronization occurs with AvaTax, when the *invoice* is created in Odoo. This means the sales tax +is recorded with Avalara (AvaTax software developer). + +To do so, navigate to {menuselection}`Sales app --> Orders --> Quotations`. Select a quotation from +the list. + +After confirming a quotation and validating the delivery, click {guilabel}`Create Invoice`. Indicate +whether it is a {guilabel}`Regular invoice`, {guilabel}`Down payment (percentage)`, or +{guilabel}`Down payment (fixed amount)`. + +Then click {guilabel}`Create and view invoice`. The recorded taxes can be seen in the +{guilabel}`Journal Items` tab of the invoice. There will be different taxes depending on the +location of the {guilabel}`Delivery Address`. + +```{image} avatax_use/journal-items.png +:align: center +:alt: Journal items highlighted on a invoice in Odoo. +``` + +Finally, press the {guilabel}`Confirm` button to complete the invoice and synchronize with the +AvaTax portal. + +:::{warning} +An invoice cannot be {guilabel}`Reset to draft` because this causes de-synchronization with the +AvaTax Portal. Instead, click {guilabel}`Add credit note` and state: `Sync with AvaTax Portal`. +See this documentation: {doc}`../../../accounting/customer_invoices/credit_notes`. +::: + +## Fixed price discounts + +Add a fixed price discount to a valuable customer, by clicking {guilabel}`Add a line` on the +customer's invoice. Add the product discount, and set the {guilabel}`Price` to either a positive or +negative value. To recalculate the taxes, click {guilabel}`Compute Taxes`. + +:::{tip} +Tax calculation can even be done on negative subtotals and credit notes. +::: + +## Logging + +It is possible to log Avalara/*AvaTax* actions in Odoo for further analysis, or verification of +functionality. Logging is accessible through the *AvaTax* settings. + +To start logging *AvaTax* actions, first, navigate to the {menuselection}`Accounting app --> +Configuration --> Settings`. + +Then, in the {guilabel}`Taxes` section, under the {guilabel}`AvaTax` settings, click +{guilabel}`Start logging for 30 minutes`. + +Upon starting the log process, Odoo will log all Avalara/*AvaTax* actions performed in the database. + +To view the logs, click on {guilabel}`Show logs` to the right of the {guilabel}`Start logging for 30 +minutes`. This reveals a detailed list of Avalara/*AvaTax* actions. This list is sortable by the +following columns: + +- {guilabel}`Created on`: timestamp of the *AvaTax* calculation. +- {guilabel}`Created by`: numeric value of the user in the database. +- {guilabel}`Database name`: name of the database. +- {guilabel}`Type`: two values can be chosen for this field, {guilabel}`Server` or + {guilabel}`Client`. +- {guilabel}`Name`: Avalara service name. In this case, it will be *AvaTax*. +- {guilabel}`Level`: by default, this will be `INFO`. +- {guilabel}`Path`: indicates the path taken to make the calculation. +- {guilabel}`Line`: indicates the line the calculation is made on. +- {guilabel}`Function`: indicates the calculation taken on the line. + +```{image} avatax_use/logging.png +:align: center +:alt: Avalara logging page with top row of list highlighted. +``` + +Click into the log line to reveal another field, called {guilabel}`Message`. + +This field populates a raw transcription of the transaction, which involves the creation (or +adjustment) of a sales invoice using the Avalara *AvaTax* API. + +The transaction includes details, such as addresses for shipping from and to, line items describing +the products or services, tax codes, tax amounts, and other relevant information. + +The {guilabel}`Message` contains the calculated taxes for different jurisdictions and confirms the +creation (or adjustment) of the transaction. + +:::{tip} +Custom fields can be made using Odoo *Studio*. Click the {icon}`fa-ellipsis-v` +{guilabel}`(ellipsis)` menu to the far-right of the header row. Then click {icon}`fa-plus` +{guilabel}`Add custom field`. This action opens Odoo *Studio*. +::: + +:::{important} +Odoo *Studio* requires a *custom* pricing plan. Consult the database's customer success manager +for more information on switching plans. Or to see if Odoo *Studio* is included in the database's +current pricing plan. See this documentation: {doc}`../../../../studio`. +::: + +:::{seealso} +- {doc}`../avatax` +- {doc}`avalara_portal` +- [US Tax Compliance: Avatax elearning video](https://www.odoo.com/slides/slide/us-tax-compliance-avatax-2858?fullscreen=1) +- {doc}`../fiscal_positions` +::: + diff --git a/content/applications/finance/accounting/taxes/cash_basis.md b/content/applications/finance/accounting/taxes/cash_basis.md new file mode 100644 index 000000000..017623ac6 --- /dev/null +++ b/content/applications/finance/accounting/taxes/cash_basis.md @@ -0,0 +1,129 @@ +# Cash basis taxes + +Cash basis taxes are due when the payment is made, as opposed to standard taxes that are due when +the invoice is confirmed. Reporting your income and expenses to the government based on the cash +basis method is mandatory in some countries and under some conditions. + +```{eval-rst} +.. example:: + You sell a product in the 1st quarter of your fiscal year, and the payment is received in the 2nd + quarter. Based on the cash basis method, the tax you must pay is for the 2nd quarter. +``` + +## Configuration + +Go to {menuselection}`Accounting --> Configuration --> Settings` and under the {guilabel}`Taxes` +section, enable {guilabel}`Cash Basis`. + +Then, define the {guilabel}`Tax Cash Basis Journal`. Click on the external link button next to the +journal to update its default properties such as the {guilabel}`Journal Name`, {guilabel}`Type` or +{guilabel}`Short Code`. + +```{image} cash_basis/tax_cash_basis_journal.png +:align: center +:alt: Select your Tax Cash Basis Journal and click on the external link +``` + +:::{note} +By default, the journal entries of the {guilabel}`Cash Basis Taxes` journal are named using the +{guilabel}`CABA` short code. +::: + +Once this is done, go to {menuselection}`Accounting --> Configuration --> Accounting: Taxes` to +configure your taxes. You can either {guilabel}`Create` a new tax or update an existing one by +clicking on it. + +The {guilabel}`Account` column reflects the proper transitional accounts to post taxes until the +payment is registered. + +```{image} cash_basis/account_column.png +:align: center +:alt: |- +: Fill in the account column with a transitional accounts where taxes go until the payment +: is registered +``` + +In the {guilabel}`Advanced Options` tab, decide of the {guilabel}`Tax Exigilibity`. Select +{guilabel}`Based on Payment`, so the tax is due when the payment of the invoice is received. You can +then also define the {guilabel}`Cash Basis Transition Account` where the tax amount is recorded as +long as the original invoice has not been reconciled. + +```{image} cash_basis/advanced_options.png +:align: center +:alt: |- +: Fill in the Cash Basis Transition Account where taxes amounts go until payment +: reconciliation. +``` + +## Impact of cash basis taxes on accounting + +To illustrate the impact of cash basis taxes on accounting transactions, let's take an example with +the sales of a product that costs 1,000\$, with a cash basis tax of 15%. + +```{image} cash_basis/customer_invoice_with_cbt.png +:align: center +:alt: true +``` + +The following entries are created in your accounting, and the tax report is currently empty. + +```{eval-rst} ++----------------------------+----------------------------+ +|**Customer journal (INV)** | ++============================+============================+ +| **Debit** |**Credit** | ++----------------------------+----------------------------+ +| Receivable $1,150 | | ++----------------------------+----------------------------+ +| |Income $1,000 | ++----------------------------+----------------------------+ +| |Temporary tax account $150 | ++----------------------------+----------------------------+ +``` + +When the payment is then received, it is registered as below : + +```{eval-rst} ++----------------------------+----------------------------+ +| **Bank journal (BANK)** | ++============================+============================+ +| **Debit** |**Credit** | ++----------------------------+----------------------------+ +| Bank $1,150 | | ++----------------------------+----------------------------+ +| |Receivable $1,150 | ++----------------------------+----------------------------+ +``` + +:::{note} +Once the payment is registered, you can use the {guilabel}`Cash Basis Entries` smart button on +the invoice to access them directly. +::: + +Finally, upon reconciliation of the invoice with the payment, the below entry is automatically +created: + +```{eval-rst} ++----------------------------+----------------------------+ +| **Tax Cash Basis Journal (Caba)** | ++============================+============================+ +| **Debit** |**Credit** | ++----------------------------+----------------------------+ +| Income account $1,000 | | ++----------------------------+----------------------------+ +| Temporary tax account $150 | | ++----------------------------+----------------------------+ +| | Income account $1,000 | ++----------------------------+----------------------------+ +| | Tax Received $150 | ++----------------------------+----------------------------+ +``` + +The journal items {guilabel}`Income account` vs. {guilabel}`Income account` are neutral, but they +are needed to ensure correct tax reports in Odoo with accurate base tax amounts. + +Using a default {guilabel}`Base Tax Received Account` is recommended so your balance is at zero and +your income account is not polluted by unnecessary accounting movements. To do so, go to +{menuselection}`Configuration --> Settings --> Taxes`, and select a +{guilabel}`Base Tax Received Account` under {guilabel}`Cash Basis`. + diff --git a/content/applications/finance/accounting/taxes/eu_distance_selling.md b/content/applications/finance/accounting/taxes/eu_distance_selling.md new file mode 100644 index 000000000..5a8da6abd --- /dev/null +++ b/content/applications/finance/accounting/taxes/eu_distance_selling.md @@ -0,0 +1,68 @@ +# EU intra-community distance selling + +EU intra-community distance selling involves the cross-border trade of goods and services from +vendors registered for VAT purposes to individuals (B2C) located in a European Union member state. +The transaction is conducted remotely, typically through online platforms, mail orders, telephone, +or other means of communication. + +EU intra-community distance selling is subject to specific VAT rules and regulations. The vendor +must charge VAT per the VAT rate applicable in the buyer's country. + +:::{note} +This remains applicable even if the vendor is located outside of the European Union. +::: + +## Configuration + +The **EU Intra-community Distance Selling** feature helps you comply with this regulation by +creating and configuring new **fiscal positions** and **taxes** based on your company's country. To +enable it, go to {menuselection}`Accounting --> Configuration --> Settings --> Taxes`, tick +{guilabel}`EU Intra-community Distance Selling`, and {guilabel}`Save`. + +```{image} eu_distance_selling/enable-feature.png +:alt: EU intra-community Distance Selling feature in Odoo Accounting settings +``` + +:::{tip} +Whenever you add or modify taxes, you can automatically update your fiscal positions. To do so, +go to {menuselection}`Accounting/Invoicing --> Settings --> Taxes --> EU Intra-community Distance +Selling` and click on the {guilabel}`Refresh tax mapping`. +::: + +:::{note} +We highly recommend checking that the proposed mapping is suitable for the products and services +you sell before using it. +::: + +:::{seealso} +- {doc}`../taxes` +- {doc}`../../fiscal_localizations` +- {doc}`fiscal_positions` +::: + +## One-Stop Shop (OSS) + +The {abbr}`OSS (One-Stop Shop)` system introduced by the European Union simplifies VAT collection +for **cross-border** sales of goods and services. It primarily applies to business-to-consumer +**(B2C)** cases. With the OSS, businesses can register for VAT in their home country and use a +single online portal to handle VAT obligations for their sales within the EU. There are **two +primary schemes**: the **Union OSS** scheme for cross-border services and the **Import OSS** scheme +for goods valued at or below €150. + +### Reports + +To generate **OSS sales** or **OSS imports** reports and submit them onto the OSS portal, go to +{menuselection}`Accounting --> Reporting --> Tax Report`, click {guilabel}`Report: Generic Tax +report`, and select either {guilabel}`OSS Sales` or {guilabel}`OSS Imports`. Once selected, click on +{guilabel}`PDF`, {guilabel}`XLSX`, or {guilabel}`XML` in the top-left corner. This generates the +currently-opened report in the selected format. Once generated, log into the platform of your +competent federal authority to submit it onto the OSS portal. + +```{image} eu_distance_selling/oss-report.png +:alt: OSS reports view +``` + +:::{seealso} +- [European Commission: OSS | Taxation and Customs Union](https://ec.europa.eu/taxation_customs/business/vat/oss_en) +::: + diff --git a/content/applications/finance/accounting/taxes/fiscal_positions.md b/content/applications/finance/accounting/taxes/fiscal_positions.md new file mode 100644 index 000000000..f9fbacead --- /dev/null +++ b/content/applications/finance/accounting/taxes/fiscal_positions.md @@ -0,0 +1,120 @@ +# Fiscal positions (tax and account mapping) + +Default taxes and accounts are set on products and customers to create new transactions on the fly. +However, depending on the customers' and providers' localization and business type, using different +taxes and accounts for a transaction might be necessary. + +**Fiscal positions** allow the creation of rules to adapt the taxes and accounts used for a +transaction automatically. + +They can be applied {ref}`automatically `, {ref}`manually +`, or {ref}`assigned to a partner `. + +:::{note} +Several default fiscal positions are available as part of your {ref}`fiscal localization +package `. +::: + +## Configuration + +> (fiscal-positions-mapping)= + +### Tax and account mapping + +To edit or create a fiscal position, go to {menuselection}`Accounting --> Configuration --> Fiscal +Positions`, and open the entry to modify or click on {guilabel}`New`. + +The mapping of taxes and accounts is based on the default taxes and accounts defined in the +product form. + +- To map to another tax or account, fill out the right column ({guilabel}`Tax to Apply`/ + {guilabel}`Account to Use Instead`). + +```{image} fiscal_positions/fiscal-positions-tax-mapping.png +:align: center +:alt: Example of a fiscal position's tax mapping +``` + +```{image} fiscal_positions/fiscal-positions-account-mapping.png +:align: center +:alt: Example of a fiscal position's account mapping +``` + +- To remove a tax, leave the field {guilabel}`Tax to Apply` empty. +- To replace a tax with several other taxes, add multiple lines using the same {guilabel}`Tax on + Product`. + +:::{note} +The mapping only works with *active* taxes. Therefore, make sure they are active by going to +{menuselection}`Accounting --> Configuration --> Taxes`. +::: + +## Application + +(fiscal-positions-automatic)= + +### Automatic application + +To automatically apply a fiscal position following a set of conditions, go to +{menuselection}`Accounting --> Configuration --> Fiscal Positions`, open the fiscal position to +modify, and tick {guilabel}`Detect Automatically`. + +From there, several conditions can be activated: + +- {guilabel}`VAT Required`: the customer's VAT number must be present on their contact form. +- {guilabel}`Country Group` and {guilabel}`Country`: the fiscal position is only applied to the + selected country or country group. + +```{image} fiscal_positions/fiscal-positions-automatic.png +:align: center +:alt: Example of a fiscal position automatic application settings +``` + +:::{note} +- If the {doc}`Verify VAT Numbers ` feature is enabled, any fiscal positions + with {guilabel}`VAT required` enabled will require Intra-Community valid VAT numbers to apply + automatically. +- Taxes on **eCommerce orders** are automatically updated once the customer has logged in or + filled out their billing details. +::: + +:::{important} +The fiscal positions' **sequence** defines which fiscal position is applied if all conditions +set on multiple fiscal positions are met simultaneously. + +For example, suppose the first fiscal position in a sequence targets *country A* while the second +fiscal position targets a *country group* that comprises *country A*. In that case, only the +first fiscal position will be applied to customers from *country A*. +::: + +(fiscal-positions-manual)= + +### Manual application + +To manually select a fiscal position, open a sales order, invoice, or bill, go to the +{guilabel}`Other Info` tab and select the desired {guilabel}`Fiscal Position` before adding product +lines. + +```{image} fiscal_positions/fiscal-positions-manual.png +:align: center +:alt: Selection of a fiscal position on a sales order, invoice, or bill +``` + +(fiscal-positions-partner)= + +### Assign to a partner + +To define which fiscal position must be used by default for a specific partner, go to +{menuselection}`Accounting --> Customers --> Customers`, select the partner, open the +{guilabel}`Sales & Purchase` tab, and select the {guilabel}`Fiscal Position`. + +```{image} fiscal_positions/fiscal-positions-customer.png +:align: center +:alt: Selection of a fiscal position on a customer +``` + +:::{seealso} +- {doc}`../taxes` +- {doc}`B2B_B2C` +::: + diff --git a/content/applications/finance/accounting/taxes/retention.md b/content/applications/finance/accounting/taxes/retention.md new file mode 100644 index 000000000..d4fbe191d --- /dev/null +++ b/content/applications/finance/accounting/taxes/retention.md @@ -0,0 +1,43 @@ +# Withholding taxes + +A **withholding tax**, also known as retention tax, mandates the payer of a customer invoice to +deduct a tax from the payment and remit it to the government. Typically, a tax is included in the +subtotal to calculate the total amount paid, while withholding taxes are directly subtracted from +the payment. + +## Configuration + +In Odoo, a withholding tax is defined by creating a negative tax. To create one, go +to {menuselection}`Accounting --> Configuration --> Taxes` and, in the {guilabel}`Amount` field, +enter a negative amount. + +```{image} retention/negative-amount.png +:alt: negative tax amount in field +``` + +Then, go to the {menuselection}`Advanced Options` tab and create a retention {guilabel}`Tax Group`. + +```{image} retention/tax-group.png +:alt: tax group for retention tax. +``` + +:::{tip} +If the retention is a percentage of a regular tax, create a {guilabel}`Tax` with a +{guilabel}`Tax Computation` as a {guilabel}`Group of Taxes`. Then, set both the regular tax and +the retention one in the {guilabel}`Definition` tab. +::: + +## Retention taxes on invoices + +Once the retention tax has been created, it can be used on customer forms, sales orders, and +customer invoices. +Several taxes can be applied on a single customer invoice line. + +```{image} retention/invoice-tax.png +:alt: invoice lines with taxes +``` + +:::{seealso} +{doc}`../taxes` +::: + diff --git a/content/applications/finance/accounting/taxes/vat_verification.md b/content/applications/finance/accounting/taxes/vat_verification.md new file mode 100644 index 000000000..4796725d3 --- /dev/null +++ b/content/applications/finance/accounting/taxes/vat_verification.md @@ -0,0 +1,42 @@ +# VAT numbers verification (VIES) + +[VAT Information Exchange System](https://ec.europa.eu/taxation_customs/vies/#/vat-validation), or +**VIES**, is a tool provided by the European Commission that allows you to check the validity of VAT +numbers for companies registered in the European Union. + +Odoo's VAT Validation feature uses the VIES to verify your contacts' VAT numbers directly from +Odoo's interface. + +:::{note} +Regardless of whether or not the Verify VAT Numbers feature is enabled, Odoo checks the format of +a contact's VAT against the [expected format of VAT numbers](https://en.wikipedia.org/wiki/VAT_identification_number) from that country. +::: + +## VIES VAT number verification + +To activate this feature, go to {menuselection}`Accounting --> Configuration --> Settings`. In the +{guilabel}`Taxes` section, enable the {guilabel}`Verify VAT Numbers` feature, and click on +{guilabel}`Save`. + +Once the {guilabel}`Verify VAT Numbers` feature is enabled, if the contact's {guilabel}`Tax ID` +field is populated *and* its country is different from your company's country, Odoo displays an +{guilabel}`Intra-Community Valid` checkbox. Odoo tests the VAT number through the VIES and +automatically checks or unchecks the {guilabel}`Intra-Community Valid` checkbox depending on the +validity of the VAT number. + +```{image} vat_verification/intra-community-valid.png +:alt: Intra-community valid checkbox on the contact record +``` + +:::{important} +It is possible to manually override the {guilabel}`Intra-Community Valid` field on a contact in +case the automatic VIES check is incorrect (for example, if the company was recently created and +its VAT is not yet in the VIES). This change is logged in the chatter for transparency. +::: + +:::{note} +Odoo can {ref}`automatically apply fiscal positions `. If the Verify VAT +Numbers feature is enabled, any fiscal positions with VAT required enabled will require +Intra-Community valid VAT numbers to apply automatically. +::: + diff --git a/content/applications/finance/accounting/vendor_bills.md b/content/applications/finance/accounting/vendor_bills.md new file mode 100644 index 000000000..e55db0f6f --- /dev/null +++ b/content/applications/finance/accounting/vendor_bills.md @@ -0,0 +1,120 @@ +--- +show-content: true +--- + +# Vendor bills + +In Odoo, we can register vendor bills **manually** or **automatically**, while the +**Aged Payable report** provides an overview of all outstanding bills to help us pay the correct +amounts on time. + +:::{seealso} +- Tutorial [Registering a vendor bill](https://www.odoo.com/slides/slide/registering-a-vendor-bill-1683?fullscreen=1) +- {doc}`/applications/inventory_and_mrp/purchase/manage_deals/manage` +::: + +## Bill creation + +### Manually + +Create a vendor bill manually by going to {menuselection}`Accounting --> Vendors --> Bills` and +clicking {guilabel}`Create`. + +### Automatically + +Vendor bills can be automatically created by **sending an email** to an {ref}`email alias +` associated with the purchase journal, or by **uploading a PDF** +in {menuselection}`Accounting --> Vendors --> Bills` and then clicking {guilabel}`Upload`. + +## Bill completion + +Whether the bill is created manually or automatically, make sure the following fields are +appropriately completed: + +- {guilabel}`Vendor`: Odoo automatically fills some information based on the vendor's registered + information, previous purchase orders, or bills. +- {guilabel}`Bill Reference`: add the sales order reference provided by the vendor and is used to do + the {ref}`matching ` when you receive the products. +- {guilabel}`Auto-Complete`: select a past bill/purchase order to automatically complete the + document. The {guilabel}`Vendor` field should be completed prior to completing this field. +- {guilabel}`Bill Date`: is the issuance date of the document. +- {guilabel}`Accounting Date`: is the date on which the document is registered in your accounting. +- {guilabel}`Payment Reference`: when registering the payment, it is automatically indicated in the + {guilabel}`Memo` field. +- {guilabel}`Recipient Bank`: to indicate to which account number the payment has to be made. +- {guilabel}`Due Date` or {guilabel}`Terms` to pay the bill. +- {guilabel}`Journal`: select in which journal the bill should be recorded and the {doc}`Currency + `. + +```{image} vendor_bills/bill-completion.png +:alt: filling the vendor bill +``` + +:::{note} +- Bills can be {doc}`digitized ` for + automatic completion by clicking {guilabel}`Send for Digitization`. +- If you upload the bill, the PDF document is displayed on the right of the screen, allowing you + to easily fill in the bill information. +::: + +## Bill confirmation + +Click {guilabel}`Confirm` when the document is completed. The status of your document changes to +{guilabel}`Posted` and a journal entry is generated based on the configuration on the invoice. + +:::{note} +Once confirmed, it is no longer possible to update it. Click {guilabel}`Reset to draft` if +changes are required. +::: + +## Bill Payment + +Upon payment of the vendor bill, click on {guilabel}`Register Payment` to open a new payment window. + +Select the {guilabel}`Journal`, the {guilabel}`Payment Method`, the {guilabel}`Amount` you wish to +pay (full or partial payment), and the {guilabel}`Currency`. In the case of a partial payment (when +the {guilabel}`Amount` paid is less than the total remaining amount on the vendor bill), the +{guilabel}`Payment Difference` field displays the outstanding balance. +You have two options: + +- {guilabel}`Keep open`: to keep the bill open and mark it with a {guilabel}`Partial` banner; +- {guilabel}`Mark as fully paid`: In this case, select an account in the + {guilabel}`Post Difference In` field and change the {guilabel}`Label` if needed. A journal entry + will be created to balance the account receivable with the selected account. + +```{image} vendor_bills/partial-payment.png +:alt: register a partial payment +``` + +The {guilabel}`Memo` field is filled automatically if the {guilabel}`Payment Reference` has been +set correctly in the vendor bill. If the field is empty, select the vendor invoice number as a +reference. + +Once confirmed, an {guilabel}`In Payment` banner appears on the bill until it is {doc}`reconciled +`. + +## Aged payable report + +To get an overview of your open vendor bills and their related due dates, you can use the +**Aged Payable report**. Go to {menuselection}`Accounting --> Reporting --> Partner Reports: Aged +payable`. + +Click on a vendor's name to open up the details of all outstanding bills, the amounts due, the due +dates, etc. + +:::{Note} +- By clicking the {guilabel}`Save` button, you can export the information available on the screen + as a PDF or XLSX file and save it in the folder of your choice. +- You might receive several bills for the same purchase order if your vendor is in back-order and + is sending you invoices as they ship the products, or if your vendor is sending you a partial + bill or asking for a deposit. +::: + +```{toctree} +:titlesonly: true + +vendor_bills/invoice_digitization +vendor_bills/assets +vendor_bills/deferred_expenses +``` + diff --git a/content/applications/finance/accounting/vendor_bills/assets.md b/content/applications/finance/accounting/vendor_bills/assets.md new file mode 100644 index 000000000..bec4f5e2f --- /dev/null +++ b/content/applications/finance/accounting/vendor_bills/assets.md @@ -0,0 +1,257 @@ +# Non-current assets and fixed assets + +**Non-current Assets**, also known as **long-term assets**, are investments that are expected to be +realized after one year. They are capitalized rather than being expensed and appear on the company's +balance sheet. Depending on their nature, they may undergo **depreciation**. + +**Fixed Assets** are a type of Non-current Assets and include the properties bought for their +productive aspects, such as buildings, vehicles, equipment, land, and software. + +For example, let's say we buy a car for \$ 27,000. We plan to amortize it over five years, and we +will sell it for \$ 7,000 afterward. Using the linear, or straight-line, depreciation method, +\$ 4,000 are expensed each year as **depreciation expenses**. After five years, the **Accumulated +Depreciation** amount reported on the balance sheet equals \$ 20,000, leaving us with \$ 7,000 of +**Not Depreciable Value**, or Salvage value. + +Odoo Accounting handles depreciation by creating all depreciation entries automatically in *draft +mode*. They are then posted periodically. + +Odoo supports the following **Depreciation Methods**: + +- Straight Line +- Declining +- Declining Then Straight Line + +:::{note} +The server checks once a day if an entry must be posted. It might then take up to 24 hours before +you see a change from *draft* to *posted*. +::: + +## Prerequisites + +Such transactions must be posted on an **Assets Account** rather than on the default +expense account. + +### Configure an Assets Account + +To configure your account in the **Chart of Accounts**, go to {menuselection}`Accounting --> +Configuration --> Chart of Accounts`, click on *Create*, and fill out the form. + +```{image} assets/assets01.png +:align: center +:alt: Configuration of an Assets Account in Odoo Accounting +``` + +:::{note} +This account's type must be either *Fixed Assets* or *Non-current Assets*. +::: + +### Post an expense to the right account + +#### Select the account on a draft bill + +On a draft bill, select the right account for all the assets you are buying. + +```{image} assets/assets02.png +:align: center +:alt: Selection of an Assets Account on a draft bill in Odoo Accounting +``` + +(product-assets-account)= + +#### Choose a different Expense Account for specific products + +Start editing the product, go to the *Accounting* tab, select the right **Expense Account**, and +save. + +```{image} assets/assets03.png +:align: center +:alt: Change of the Assets Account for a product in Odoo +``` + +:::{tip} +It is possible to {ref}`automate the creation of assets entries ` for these +products. +::: + +(journal-assets-account)= + +#### Change the account of a posted journal item + +To do so, open your Purchases Journal by going to {menuselection}`Accounting --> Accounting --> +Purchases`, select the journal item you want to modify, click on the account, and select the right +one. + +```{image} assets/assets04.png +:align: center +:alt: Modification of a posted journal item's account in Odoo Accounting +``` + +## Assets entries + +(create-assets-entry)= + +### Create a new entry + +An **Asset entry** automatically generates all journal entries in *draft mode*. They are then posted +one by one at the right time. + +To create a new entry, go to {menuselection}`Accounting --> Accounting --> Assets`, click on +*Create*, and fill out the form. + +Click on **select related purchases** to link an existing journal item to this new entry. Some +fields are then automatically filled out, and the journal item is now listed under the **Related +Purchase** tab. + +```{image} assets/assets05.png +:align: center +:alt: Assets entry in Odoo Accounting +``` + +Once done, you can click on *Compute Depreciation* (next to the *Confirm* button) to generate all +the values of the **Depreciation Board**. This board shows you all the entries that Odoo will post +to depreciate your asset, and at which date. + +```{image} assets/assets06.png +:align: center +:alt: Depreciation Board in Odoo Accounting +``` + +#### What does "Prorata Temporis" mean? + +The **Prorata Temporis** feature is useful to depreciate your assets the most accurately possible. + +With this feature, the first entry on the Depreciation Board is computed based on the time left +between the *Prorata Date* and the *First Depreciation Date* rather than the default amount of time +between depreciations. + +For example, the Depreciation Board above has its first depreciation with an amount of \$ 241.10 +rather than \$ 4,000.00. Consequently, the last entry is also lower and has an amount of \$ 3758.90. + +#### What are the different Depreciation Methods + +The **Straight Line Depreciation Method** divides the initial Depreciable Value by the number of +depreciations planned. All depreciation entries have the same amount. + +The **Declining Depreciation Method** multiplies the Depreciable Value by the **Declining Factor** +for each entry. Each depreciation entry has a lower amount than the previous entry. The last +depreciation entry doesn't use the declining factor but instead has an amount corresponding to the +balance of the depreciable value so that it reaches \$0 by the end of the specified duration. + +The **Declining Then Straight Line Depreciation Method** uses the Declining Method, but with a +minimum Depreciation equal to the Straight Line Method. This method ensures a fast depreciation +at the beginning, followed by a constant one afterward. + +### Assets from the Purchases Journal + +You can create an asset entry from a specific journal item in your **Purchases Journal**. + +To do so, open your Purchases Journal by going to {menuselection}`Accounting --> Accounting --> +Purchases`, and select the journal item you want to record as an asset. Make sure that it is posted +in the right account (see: {ref}`journal-assets-account`). + +Then, click on *Action*, select **Create Asset**, and fill out the form the same way you would do to +{ref}`create a new entry `. + +```{image} assets/assets07.png +:align: center +:alt: Create Asset Entry from a journal item in Odoo Accounting +``` + +## Modification of an Asset + +You can modify the values of an asset to increase or decrease its value. + +To do so, open the asset you want to modify, and click on *Modify Depreciation*. Then, fill out the +form with the new depreciation values and click on *Modify*. + +A **decrease in value** posts a new Journal Entry for the **Value Decrease** and modifies all the +future *unposted* Journal Entries listed in the Depreciation Board. + +An **increase in value** requires you to fill out additional fields related to the account movements +and creates a new Asset entry with the **Value Increase**. The Gross Increase Asset Entry can be +accessed with a Smart Button. + +```{image} assets/assets08.png +:align: center +:alt: Gross Increase smart button in Odoo Accounting +``` + +## Disposal of Fixed Assets + +To **sell** an asset or **dispose** of it implies that it must be removed from the Balance Sheet. + +To do so, open the asset you want to dispose of, click on *Sell or Dispose*, and fill out the form. + +```{image} assets/assets09.png +:align: center +:alt: Disposal of Assets in Odoo Accounting +``` + +Odoo Accounting then generates all the journal entries necessary to dispose of the asset, including +the gain or loss on sale, which is based on the difference between the asset's book value at the +time of the sale and the amount it is sold for. + +:::{note} +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 Models + +You can create **Assets Models** to create your Asset entries faster. It is particularly useful if +you recurrently buy the same kind of assets. + +To create a model, go to {menuselection}`Accounting --> Configuration --> Assets Models`, click on +*Create*, and fill out the form the same way you would do to create a new entry. + +:::{tip} +You can also convert a *confirmed Asset entry* into a model by opening it from +{menuselection}`Accounting --> Accounting --> Assets` and then, by clicking on the button *Save +Model*. +::: + +### Apply an Asset Model to a new entry + +When you create a new Asset entry, fill out the **Fixed Asset Account** with the right asset +account. + +New buttons with all the models linked to that account appear at the top of the form. Clicking on a +model button fills out the form according to that model. + +```{image} assets/assets10.png +:align: center +:alt: Assets model button in Odoo Accounting +``` + +(assets-automation)= + +## Automate the Assets + +When you create or edit an account of which the type is either *Non-current Assets* or *Fixed +Assets*, you can configure it to create assets for the expenses that are credited on it +automatically. + +You have three choices for the **Automate Assets** field: + +1. **No:** this is the default value. Nothing happens. +2. **Create in draft:** whenever a transaction is posted on the account, a draft *Assets entry* is + created, but not validated. You must first fill out the form in {menuselection}`Accounting --> + Accounting --> Assets`. +3. **Create and validate:** you must also select an Asset Model (see: [Assets Models]). Whenever a + transaction is posted on the account, an *Assets entry* is created and immediately validated. + +```{image} assets/assets11.png +:align: center +:alt: Automate Assets on an account in Odoo Accounting +``` + +:::{tip} +You can, for example, select this account as the default **Expense Account** of a product to +fully automate its purchase. (see: {ref}`product-assets-account`). +::: + +:::{seealso} +- {doc}`../get_started/chart_of_accounts` +::: + diff --git a/content/applications/finance/accounting/vendor_bills/deferred_expenses.md b/content/applications/finance/accounting/vendor_bills/deferred_expenses.md new file mode 100644 index 000000000..274a2445f --- /dev/null +++ b/content/applications/finance/accounting/vendor_bills/deferred_expenses.md @@ -0,0 +1,195 @@ +# Deferred expenses + +**Deferred expenses** and **prepayments** (also known as **prepaid expenses**) are both costs that +have already occurred for products or services yet to be received. + +Such costs are **assets** for the company that pays them since it already paid for products and +services but has either not yet received them or not yet used them. The company cannot report them +on the current **profit and loss statement**, or *income statement*, since the payments will be +effectively expensed in the future. + +These future expenses must be deferred on the company's balance sheet until the moment in time they +can be **recognized**, at once or over a defined period, on the profit and loss statement. + +For example, let's say we pay \$1200 at once for one year of insurance. We already pay the cost now +but haven't used the service yet. Therefore, we post this new expense in a *prepayment account* and +decide to recognize it on a monthly basis. Each month, for the next 12 months, \$100 will be +recognized as an expense. + +Odoo Accounting handles deferred expenses by spreading them across multiple entries that are +posted periodically. + +:::{note} +The server checks once a day if an entry must be posted. It might then take up to 24 hours before +you see a change from {guilabel}`Draft` to {guilabel}`Posted`. +::: + +## Configuration + +Make sure the default settings are correctly configured for your business. To do so, go to +{menuselection}`Accounting --> Configuration --> Settings`. The following options are available: + +Journal + +: The deferral entries are posted in this journal. + +Deferred Expense + +: Expenses are deferred on this Current Asset account until they are recognized. + +Generate Entries + +: By default, Odoo {ref}`automatically generates ` + the deferral entries when you post a vendor bill. However, you can also choose to + {ref}`generate them manually ` by selecting the + {guilabel}`Manually & Grouped` option instead. + +Based on + +: Suppose a bill of \$1200 must be deferred over 12 months. + + - The {guilabel}`Months` option accounts for \$100 each month prorated to the number of days in + that month (e.g., \$50 for the first month if the {guilabel}`Start Date` is set to the 15th of + the month). + - The {guilabel}`Full Months` option considers each month started to be full (e.g., \$100 for the + first month even if the {guilabel}`Start Date` is set to the 15th of the month); this means that + with the {guilabel}`Full Months` option, a full \$100 is recognized in the first partial month, + eliminating the need for a 13th month to recognize any remainder as would be the case when using + the {guilabel}`Months` option. + - The {guilabel}`Days` option accounts for different amounts depending on the number of days in + each month (e.g., ~\$102 for January and ~\$92 for February). + +(vendor-bills-deferred-generate-on-validation)= + +## Generate deferral entries on validation + +:::{tip} +Make sure the {guilabel}`Start Date` and {guilabel}`End Date` fields are visible in the +{guilabel}`Invoice Lines` tab. In most cases, the {guilabel}`Start Date` should be in the same +month as the {guilabel}`Bill Date`. Deferred expense entries are posted from the bill date and +are displayed in the report accordingly. +::: + +For each line of the bill that should be deferred, specify the start and end dates of the deferral +period. + +If the {guilabel}`Generate Entries` field is set to {guilabel}`On invoice/bill validation`, Odoo +automatically generates the deferral entries when the bill is validated. Click on the +{guilabel}`Deferred Entries` smart button to see them. + +One entry, dated on the same day as the bill's accounting date, moves the bill amounts from the +expense account to the deferred account. The other entries are deferral entries which will, month +after month, move the bill amounts from the deferred account to the expense account to recognize +the expense. + +```{eval-rst} +.. example:: + You can defer a January bill of $1200 over 12 months by specifying a start date of 01/01/2023 + and an end date of 12/31/2023. At the end of August, $800 is recognized as an expense, + whereas $400 remains on the deferred account. +``` + +## Reporting + +The deferred expense report computes an overview of the necessary deferral entries for each account. +To access it, go to {menuselection}`Accounting --> Reporting --> Deferred Expense`. + +To view the journal items of each account, click on the account name and then {guilabel}`Journal +Items`. + +```{image} deferred_expenses/deferred_expense_report.png +:alt: Deferred expense report +``` + +:::{note} +Only bills whose accounting date is before the end of the period of the report +are taken into account. +::: + +(vendor-bills-deferred-generate-manually)= + +## Generate grouped deferral entries manually + +If you have a lot of deferred revenues and wish to reduce the number of journal entries created, you +can generate deferral entries manually. To do so, set the {guilabel}`Generate Entries` field in the +**Settings** to {guilabel}`Manually & Grouped`. Odoo then aggregates the deferred amounts in a +single entry. + +At the end of each month, go to the Deferred Expenses report and click the +{guilabel}`Generate Entries` button. This generates two deferral entries: + +- One dated at the end of the month which aggregates, for each account, all the deferred amounts + of that month. This means that at the end of that period, a part of the deferred expense is + recognized. +- The reversal of this created entry, dated on the following day (i.e., the first day of the + next month) to cancel the previous entry. + +```{eval-rst} +.. example:: + + There are two bills: + + - Bill A: $1200 to be deferred from 01/01/2023 to 12/31/2023 + - Bill B: $600 to be deferred from 01/01/2023 to 12/31/2023 + + In January + At the end of January, after clicking the :guilabel:`Generate Entries` button, + there are the following entries: + + - Entry 1 dated on the 31st January: + + - Line 1: Expense account -1200 -600 = **-1800** (cancelling the total of both bills) + - Line 2: Expense account 100 + 50 = **150** (recognizing 1/12 of bill A and bill B) + - Line 3: Deferred account 1800 - 150 = **1650** (amount that has yet to be deferred later + on) + + - Entry 2 dated on the 1st February, the reversal of the previous entry: + + - Line 1: Expense account **1800** + - Line 2: Deferred account **-150** + - Line 3: Expense account **-1650** + + In February + At the end of February, after clicking the :guilabel:`Generate Entries` button, + there are the following entries: + + - Entry 1 dated on the 28th February: + + - Line 1: Expense account -1200 -600 = **-1800** (cancelling the total of both bills) + - Line 2: Expense account 200 + 100 = **300** (recognizing 2/12 of bill A and bill B) + - Line 3: Deferred account 1800 - 300 = **1500** (amount that has yet to be deferred later + on) + + - Entry 2 dated on the 1st March, the reversal of the previous entry. + + From March to October + The same computation is done for each month until October. + + In November + At the end of November, after clicking the :guilabel:`Generate Entries` button, + there are the following entries: + + - Entry 1 dated on the 30th November: + + - Line 1: Expense account -1200 -600 = **-1800** (cancelling the total of both bills) + - Line 2: Expense account 1100 + 550 = **1650** (recognizing 11/12 of bill A and bill B) + - Line 3: Deferred account 1800 - 1650 = **150** (amount that has yet to be deferred later + on) + + - Entry 2 dated on the 1st December, the reversal of the previous entry. + + In December + There is no need to generate entries in December. Indeed, if we do the computation for + December, we will have an amount of 0 to be deferred. + + In total + If we aggregate everything, we would have: + + - bill A and bill B + - two entries (one for the deferral and one for the reversal) for each month from January to + November + + Therefore, at the end of December, bills A and B are fully recognized as expense only once in + spite of all the created entries thanks to the reversal mechanism. +``` + diff --git a/content/applications/finance/accounting/vendor_bills/invoice_digitization.md b/content/applications/finance/accounting/vendor_bills/invoice_digitization.md new file mode 100644 index 000000000..7a8020bac --- /dev/null +++ b/content/applications/finance/accounting/vendor_bills/invoice_digitization.md @@ -0,0 +1,96 @@ +# AI-powered document digitization + +**Invoice digitization** is the process of converting paper documents into vendor bill and customer +invoice forms in your accounting. + +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. + +:::{seealso} +- [Test Odoo's invoice digitization](https://www.odoo.com/app/invoice-automation) +- [Odoo Tutorials: Vendor Bill Digitization](https://www.odoo.com/slides/slide/vendor-bill-digitization-7065) +::: + +## 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. + +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. + +## Invoice upload + +### Upload invoices manually + +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`. + +(invoice-digitization-email-alias)= + +### Upload invoices using an email alias + +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. + +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`. + +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. + +:::{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`). +::: + +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 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`. + +## Invoice digitization + +According to your settings, the document is either processed automatically, or you need to click on +{guilabel}`Send for digitization` to do it manually. + +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. + +## Data recognition with AI + +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. + +## Pricing + +The **invoice digitization** is an In-App Purchase (IAP) service that requires prepaid credits to +work. Digitizing one document consumes 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`. + +:::{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. +::: + +:::{seealso} +- [Our Privacy Policy](https://iap.odoo.com/privacy#header_6) +- {doc}`/applications/essentials/in_app_purchase` +::: + diff --git a/content/applications/finance/expenses.md b/content/applications/finance/expenses.md new file mode 100644 index 000000000..143971e73 --- /dev/null +++ b/content/applications/finance/expenses.md @@ -0,0 +1,113 @@ +--- +show-content: true +--- + +# Expenses + +Odoo **Expenses** streamlines the management of expenses. After an employee submits their expenses +in Odoo, they are reviewed by management and accounting teams. Once approved, payments can then be +processed, and disbursed back to the employee for reimbursement. + +:::{seealso} +[Odoo Expenses: product page](https://www.odoo.com/app/expenses) +::: + +## Set expense categories + +The first step to track expenses is to configure the different types of expenses for the company +(managed as *expense categories* in Odoo). Each category can be as specific or generalized as +needed. Go to {menuselection}`Expenses app --> Configuration --> Expense Categories` to view the +current expensable categories in a default list view. + +```{image} expenses/categories.png +:align: center +:alt: Set expense costs on products. +``` + +To create a new expense category, click {guilabel}`New`. A product form will appear, with the +description field labeled {guilabel}`Product Name`. + +:::{note} +Expense categories are managed like products in Odoo. The expense category form follows the +standard product form in Odoo, and the information entered is similar. Expense products will be +referred to as expense categories throughout this document since the main menu refers to these as +{guilabel}`Expense Categories`. +::: + +Only two fields are required, the {guilabel}`Product Name` and the {guilabel}`Unit of Measure`. +Enter the {guilabel}`Product Name` in the field, and select the {guilabel}`Unit of Measure` from the +drop-down menu (most products will be set to {guilabel}`Units`). + +:::{tip} +The *Sales* app is where specification on the units of measure are created and edited (e.g. +units, miles, nights, etc.). Go to {menuselection}`Sales app --> Configuration --> Settings` and +ensure `Units of Measure` is enabled in the `Product Catalog` section. Click on the +{guilabel}`Units of Measure` internal link to {doc}`view, create, and edit the units of measure +<../inventory_and_mrp/inventory/product_management/configure/uom>`. +::: + +```{image} expenses/new-expense-product.png +:align: center +:alt: Set expense costs on products. +``` + +The {guilabel}`Cost` field on the product form is populated with a value of `0.00` by default. When +a specific expense should always be reimbursed for a particular price, enter that amount in the +{guilabel}`Cost` field. Otherwise, leave the {guilabel}`Cost` set to `0.00`, and employees will +report the actual cost when submitting an expense report. + +:::{note} +The {guilabel}`Cost` field is always visible on the expense category form, but the +{guilabel}`Sales Price` field is *only* visible if the {guilabel}`Sales Price` is selected under +the {guilabel}`Re-Invoice Expenses` section. Otherwise, the {guilabel}`Sales Price` field is +hidden. +::: + +```{eval-rst} +.. example:: + Here are some examples for when to set a specific :guilabel:`Cost` on a product vs. leaving the + :guilabel:`Cost` at `0.00`: + + - **Meals**: set the :guilabel:`Cost` to `0.00`. When an employee logs an expense for a meal, + they enter the actual amount of the bill and will be reimbursed for that amount. An expense for + a meal costing $95.23 would equal a reimbursement for $95.23. + - **Mileage**: set the :guilabel:`Cost` to `0.30`. When an employee logs an expense for + "mileage", they enter the number of miles driven in the :guilabel:`Quantity` field, and are + reimbursed 0.30 per mile they entered. An expense for 100 miles would equal a reimbursement for + $30.00. + - **Monthly Parking**: set the :guilabel:`Cost` to `75.00`. When an employee logs an expense for + "monthly parking", the reimbursement would be for $75.00. + - **Expenses**: set the :guilabel:`Cost` to `0.00`. When an employee logs an expense that is not + a meal, mileage, or monthly parking, they use the generic :guilabel:`Expenses` product. An + expense for a laptop costing $350.00 would be logged as an :guilabel:`Expenses` product, and + the reimbursement would be for $350.00. +``` + +Select an {guilabel}`Expense Account` if using the Odoo *Accounting* app. It is recommended to check +with the accounting department to determine the correct account to reference in this field as it +will affect reports. + +Set a tax on each product in the {guilabel}`Vendor Taxes` and {guilabel}`Customer Taxes` fields, if +applicable. It is considered good practice to use a tax that is configured with {ref}`Tax Included +in Price `. Taxes will be automatically configured if this is set. + +:::{seealso} +- {doc}`expenses/log_expenses` +- {doc}`expenses/expense_reports` +- {doc}`expenses/approve_expenses` +- {doc}`expenses/post_expenses` +- {doc}`expenses/reimburse` +- {doc}`expenses/reinvoice_expenses` +::: + +```{toctree} +:titlesonly: true + +expenses/log_expenses +expenses/expense_reports +expenses/approve_expenses +expenses/post_expenses +expenses/reimburse +expenses/reinvoice_expenses +``` + diff --git a/content/applications/finance/expenses/approve_expenses.md b/content/applications/finance/expenses/approve_expenses.md new file mode 100644 index 000000000..2da8b18b0 --- /dev/null +++ b/content/applications/finance/expenses/approve_expenses.md @@ -0,0 +1,121 @@ +# Approve expenses + +In Odoo, not just anyone can approve expense reports, only users with the necessary rights (or +permissions) can. This means that a user **must** have at least *Team Approver* rights for the +*Expenses* app. Employees with the necessary rights can review expense reports, approve or reject +them, and provide feedback thanks to the integrated communication tool. + +Please refer to the {doc}`access rights documentation ` to learn more +about managing users and their access rights. + +## View expense reports + +Users who are able to approve expense reports, typically managers, can easily view all expense +reports they have access rights to. Go to {menuselection}`Expenses app --> Expense Reports`, to view +the {guilabel}`All Reports` dashboard. + +A list of all expense reports with a status of either {guilabel}`To Submit`, {guilabel}`Submitted`, +{guilabel}`Approved`, {guilabel}`Posted`, or {guilabel}`Done` appears. Expense reports with a status +of {guilabel}`Refused` are hidden, by default. + +```{image} approve_expenses/expense-reports-list.png +:align: center +:alt: Reports to validate are found on the Reports to Approve page. +``` + +## Approve expense reports + +Expense reports can be approved in two ways: {ref}`individually ` or {ref}`in +bulk `. + +:::{important} +Only reports with a status of {guilabel}`Submitted` can be approved. + +It is recommended to display only {guilabel}`Submitted` reports by ticking the checkbox beside +the {guilabel}`Submitted` filter, in the left column, under the {guilabel}`Status` section. + +If a report is **not** able to be approved, the {guilabel}`Approve Report` button **does not** +appear on the {guilabel}`All Reports` page. +::: + +(expenses-individual)= + +### Approve individual reports + +To approve an individual report, navigate to {menuselection}`Expenses app --> Expense Reports`, and +click on an individual report to view the report form. + +From here, several options are presented: {guilabel}`Approve`, {guilabel}`Refuse`, and +{guilabel}`Reset to draft`. + +Click {guilabel}`Approve` to approve the report. + +(expenses-multiple)= + +### Approve multiple reports + +To approve multiple expense reports at once, first navigate to {menuselection}`Expenses app --> +Expense Reports` to view a list of expense reports. Next, select the reports to approve by ticking +the checkbox next to each report being approved, or tick the checkbox next to the +{guilabel}`Employee` column title to select all the reports in the list. + +Next, click the {guilabel}`Approve Report` button. + +```{image} approve_expenses/approve-report.png +:align: center +:alt: Approve multiple reports by clicking the checkboxes next to each report. +``` + +:::{tip} +It is possible for team managers to view all the expense reports for just their team members. + +To do so, while on the {guilabel}`All Reports` page, click the {icon}`fa-caret-down` +{guilabel}`(down arrow)` to the right of the search bar, then click {guilabel}`My Team` in the +{icon}`fa-filter` {guilabel}`Filters` section. + +This presents all the reports for only the manager's team. + +```{image} approve_expenses/my-team-filter.png +:align: center +:alt: Select the My Team filter. +``` +::: + +## Refuse expense reports + +Expense reports can **only** be refused on the individual expense report, and **not** from the +{guilabel}`All Reports` dashboard. To open an individual expense report, navigate to +{menuselection}`Expenses app --> Expense Reports`, then click on an individual expense report to +view the report form. + +If more information is needed, such as a missing receipt, communicate any necessary information +requests in the *chatter* of the report form. On the individual expense report, click +{guilabel}`Send message` to open a message text box. + +Type in a message, tagging the proper people, and post it to the *chatter* by clicking +{guilabel}`Send`. The message is posted in the chatter, and the tagged people are notified, via +email. + +:::{note} +The only people that can be tagged in a message are *followers* of the specific report. To see +who is a follower, click the {icon}`fa-user-o` {guilabel}`(user)` icon to display the followers +of the expense report. + +```{image} approve_expenses/chatter.png +:align: center +:alt: Send messages in the chatter. +``` +::: + +To refuse an expense report, click {guilabel}`Refuse`, and a {guilabel}`Refuse Expense` pop-up +window appears. Enter a brief explanation for the refusal beneath the {guilabel}`REASON TO REFUSE +EXPENSE` field, then click {guilabel}`Refuse`. + +```{image} approve_expenses/refuse-expense.png +:align: center +:alt: Send messages in the chatter. +``` + +Once the expense report is refused, the status changes to {guilabel}`Refused`, and the only button +that appears in the top-left is {guilabel}`Reset to Draft`. + diff --git a/content/applications/finance/expenses/expense_reports.md b/content/applications/finance/expenses/expense_reports.md new file mode 100644 index 000000000..c65626d51 --- /dev/null +++ b/content/applications/finance/expenses/expense_reports.md @@ -0,0 +1,135 @@ +# Expense reports + +When expenses are ready to submit (such as, at the end of a business trip, or once a month), an +*expense report* needs to be created. Open the main {menuselection}`Expenses app` dashboard, which +displays the {guilabel}`My Expenses` dashboard, by default. Alternatively, navigate to +{menuselection}`Expenses app --> My Expenses --> My Expenses`. + +Expenses are color-coded by status. Any expense with a status of {guilabel}`To Report` (expenses +that still need to be added to an expense report) is shown in blue text. All other statuses +({guilabel}`To Submit`, {guilabel}`Submitted`, and {guilabel}`Approved`) the text appears in black. + +(expenses-create-report)= + +## Create expense reports + +First, select each desired expense to be added to the report on the {guilabel}`My Expenses` +dashboard, by ticking the checkbox next to each entry, or quickly select all the expenses in the +list by ticking the checkbox next to the {guilabel}`Expense Date` column title, if needed. + +Another way to quickly add all expenses that are not on a expense report, is to click the +{guilabel}`Create Report` button, *without* selecting any expenses, and Odoo automatically selects +all expenses with a status of {guilabel}`To Submit` that are not already on a report. + +```{image} expense_reports/create-report.png +:align: center +:alt: Select the expenses to submit, then create the report. +``` + +:::{note} +Any expense can be selected from the {guilabel}`My Expenses` list, except for expenses with a +status of {guilabel}`Approved`. + +The {guilabel}`Create Report` button is visible as long as there is a minimum of one expense on +the list with a status of either {guilabel}`To Report` or {guilabel}`To Submit`. + +When the {guilabel}`Create Report` button is clicked, all expenses with a status of {guilabel}`To +Submit` that are *not* currently on another expense report appears in the newly-created expense +report. + +If all expenses on the {guilabel}`My Expenses` report are already associated with another expense +report, an {guilabel}`Invalid Operation` pop-up window appears, stating {guilabel}`You have no +expenses to report.` +::: + +Once the expenses have been selected, click the {guilabel}`Create Report` button. The new report +appears with all the expenses listed in the {guilabel}`Expense` tab. If there is a receipt attached +to an individual expense, a {icon}`fa-paperclip` {guilabel}`(paperclip)` icon appears between the +{guilabel}`Customer to Reinvoice` and {guilabel}`Analytic Distribution` columns. + +When the report is created, the date range for the expenses appears in the {guilabel}`Expense Report +Summary` field, by default. It is recommended to edit this field with a short summary for each +report to help keep expenses organized. Enter a description for the expense report, such as `Client +Trip NYC`, or `Office Supplies for Presentation`, in the {guilabel}`Expense Report Summary` field. + +The {guilabel}`Employee`, {guilabel}`Paid By`, and {guilabel}`Company` fields autopoulate with the +information listed on the individual expenses. + +Next, select a {guilabel}`Manager` from the drop-down menu to assign a manager to review the report. +If needed, update the {guilabel}`Journal` field, using the drop-down menu. + +```{image} expense_reports/expense-report-summary.png +:align: center +:alt: Enter a short description and select a manager for the report. +``` + +If some expenses are missing from the report, they can still be added from this report form. To do +so, click {guilabel}`Add a line` at the bottom of the {guilabel}`Expense` tab. + +An {guilabel}`Add: Expense Lines` pop-up window appears, displaying all the available expenses (with +a {guilabel}`To Submit` status) that can be added to the report. + +If a new expense needs to be added that does **not** appear on the list, click {guilabel}`New` to +{doc}`create a new expense <../expenses/log_expenses>` and add it to the report. + +Tick the checkbox next to each expense being added, then click {guilabel}`Select`. + +Doing so removes the pop-up window, and the items now appear on the report. + +```{image} expense_reports/add-an-expense-line.png +:align: center +:alt: Add more expenses to the report before submitting. +``` + +:::{note} +Expense reports can be created in one of three places: + +1. Navigate to the main {menuselection}`Expenses app` dashboard (also accessible, via + {menuselection}`Expenses app --> My Expenses --> My Expenses`) +2. Navigate to {menuselection}`Expenses app --> My Expenses --> My Reports` +3. Navigate to {menuselection}`Expenses app --> Expense Reports` + +In any of these views, click {guilabel}`New` to create a new expense report. +::: + +(expenses-submit)= + +## Submit expense reports + +When an expense report is completed, the next step is to submit the report to a manager for +approval. To view all expense reports, navigate to {menuselection}`Expenses app --> My Expenses --> +My Reports`. Open the specific report from the list of expense reports. + +:::{note} +Reports must be individually submitted, and **cannot** be submitted in batches. +::: + +If the list is large, grouping the results by status may be helpful, since only reports with a +{guilabel}`To Submit` status need to be submitted; reports with an {guilabel}`Approved` or +{guilabel}`Submitted` status do not. + +The {guilabel}`To Submit` expenses are identifiable by the {guilabel}`To Submit` status, and by the +blue text, while all other expense text appears in black. + +```{image} expense_reports/expense-status.png +:align: center +:alt: Submit the report to the manager. +``` + +:::{note} +The status of each report is shown in the {guilabel}`Status` column. If the {guilabel}`Status` +column is not visible, click the {icon}`oi-settings-adjust` {guilabel}`(additional options)` icon +at the end of the row, and tick the checkbox beside {guilabel}`Status` from the resulting +drop-down menu. +::: + +Click on a report to open it, then click {guilabel}`Submit To Manager`. After submitting a report, +the next step is to wait for the manager to approve it. + +:::{important} +{doc}`Approving <../expenses/approve_expenses>` expenses, {doc}`posting +<../expenses/post_expenses>` expenses, and {doc}`reimbursing <../expenses/reimburse>` expenses +are **only** for users with the appropriate {doc}`access rights documentation +`. +::: + diff --git a/content/applications/finance/expenses/log_expenses.md b/content/applications/finance/expenses/log_expenses.md new file mode 100644 index 000000000..f7f24f30b --- /dev/null +++ b/content/applications/finance/expenses/log_expenses.md @@ -0,0 +1,252 @@ +# Log expenses + +Before expenses can be reimbursed, each individual expense needs to be logged in the database. +Expense records can be created in three different ways: {ref}`manually enter an expense record +`, {ref}`upload a receipt `, or {ref}`email a +receipt ` to a preconfigured email address. + +(expenses-manual-expense)= + +## Manually enter expenses + +To record a new expense, open the {menuselection}`Expenses app`, which displays the {guilabel}`My +Expenses` page, by default. + +:::{tip} +This view can also be accessed from {menuselection}`Expenses app --> My Expenses --> My +Expenses`. +::: + +Then, click {guilabel}`New`, and then fill out the following fields on the form that appears: + +- {guilabel}`Description`: Enter a short description for the expense. This should be concise and + informative, such as `lunch with client` or `hotel for conference`. + +- {guilabel}`Category`: Select the expense category from the drop-down menu that most closely + corresponds to the expense. + +- {guilabel}`Total`: Enter the total amount paid for the expense in one of two ways: + + 1. If the expense is for a single item/expense, and the category selected was for a single item, + enter the cost in the {guilabel}`Total` field (the {guilabel}`Quantity` field is hidden). + + 2. If the expense is for multiples of the same item/expense with a fixed price, the + {guilabel}`Unit Price` is displayed. Enter the quantity in the {guilabel}`Quantity` field, and + the total cost is automatically updated with the correct total. The total cost appears below + the {guilabel}`Quantity`. + + ```{eval-rst} + .. example:: + In the case of mileage driven, the :guilabel:`Unit Price` is populated as the cost *per + mile*. Set the :guilabel:`Quantity` to the *number of miles driven*, and the total is + calculated. + ``` + +- {guilabel}`Included Taxes`: If taxes were configured on the expense category, the tax percentage + and amount appear automatically after entering either the {guilabel}`Total` or the + {guilabel}`Quantity`. + + :::{note} + When a tax is configured on an expense category, the {guilabel}`Included Taxes` value updates + in real time, as the {guilabel}`Total` or {guilabel}`Quantity` is updated. + ::: + +- {guilabel}`Employee`: Using the drop-down menu, select the employee this expense is for. + +- {guilabel}`Paid By`: Click the radio button to indicate who paid for the expense, and should be + reimbursed. Select either {guilabel}`Employee (to reimburse)` or {guilabel}`Company`. Depending on + the expense category selected, this field may not appear. + +- {guilabel}`Expense Date`: Using the calendar popover window that appears when this field is + clicked, enter the date the expense was incurred. + +- {guilabel}`Account`: Using the drop-down menu, select the expense account the expense should be + logged in. + +- {guilabel}`Customer to Reinvoice`: If the expense is something that should be paid for by a + customer, select the {abbr}`SO (Sales Order)` and customer that should be invoiced for this + expense from the drop-down menu. All sales orders in the drop-down menu list both the {abbr}`SO + (Sales Order)`, as well as the company the sales order is written for. After the expense is saved, + the customer name disappears, and only the {abbr}`SO (Sales Order)` is visible on the expense. + + ```{eval-rst} + .. example:: + A customer wishes to have an on-site meeting for the design and installation of a custom + garden, and agrees to pay for the expenses associated with it (such as travel, hotel, meals, + etc). All expenses tied to that meeting would indicate the sales order for the custom garden + (which also references the customer) as the :guilabel:`Customer to Reinvoice`. + ``` + +- {guilabel}`Analytic Distribution`: Select the account the expense should be written against from + the drop-down menu for either {guilabel}`Projects`, {guilabel}`Departments`, or both. Multiple + accounts can be listed for each category, if needed. Adjust the percentage for each analytic + account by typing in the percentage value next to each account. + +- {guilabel}`Company`: If multiple companies are set up, select the company the expense should be + filed for from the drop-down menu. The current company automatically populates this field. + +- {guilabel}`Notes...`: If any notes are needed to clarify the expense, enter them in the notes + field. + +```{image} log_expenses/expense-filled-in.png +:align: center +:alt: A filled in expense form for a client lunch. +``` + +### Attach receipts + +After the expense record is created, the next step is to attach a receipt. Click the +{guilabel}`Attach Receipt` button, and a file explorer appears. Navigate to the receipt to be +attached, and click {guilabel}`Open`. + +The new receipt is recorded in the *chatter*, and the number of receipts appears next to the +{icon}`fa-paperclip` {guilabel}`(paperclip)` icon. Multiple receipts can be attached to an +individual expense record, as needed. + +```{image} log_expenses/receipt-icon.png +:align: center +:alt: Attach a receipt and it appears in the chatter. +``` + +(expenses-upload-receipt)= + +## Upload expenses + +It is possible to have expense records created automatically, by uploading a PDF receipt. This +feature requires the enabling of a setting, and the purchasing of {abbr}`IAP (in-app purchases)` +credits. + +### Digitalization settings + +To enable receipt scanning, navigate to {menuselection}`Expenses app --> Configuration --> +Settings`, and tick the checkbox beside the {guilabel}`Expense Digitization (OCR)` option. Then, +click {guilabel}`Save`. When enabled, additional options appear. Click on the corresponding radio +button to select one of the following options: + +- {guilabel}`Do not digitize`: turns off receipt digitization. +- {guilabel}`Digitize on demand only`: only digitizes receipts when requested. A + {guilabel}`Digitize document` button appears on expense records. When clicked, the receipt is + scanned and the expense record is updated. +- {guilabel}`Digitize automatically`: automatically digitizes all receipts when they are uploaded. + +Beneath these options are two additional links. Click the {icon}`fa-arrow-right` {guilabel}`Buy +credits` link to purchase credits for receipt digitization. Click the {icon}`fa-arrow-right` +{guilabel}`View My Services` link to view a list of all current services, and their remaining credit +balances. + +For more information on document digitization and {abbr}`IAPs (in-app purchases)`, refer to the +{doc}`In-app purchase (IAP) <../../essentials/in_app_purchase>` documentation. + +:::{note} +When the {guilabel}`Expense Digitization (OCR)` option is enabled, a necessary module is +installed, so receipts can be scanned. Disabling this option uninstalls the module. + +If, at some point, there is a desire to temporarily stop digitizing receipts, select the +{guilabel}`Do not digitize` option. The reason this option is available is so the module is not +uninstalled, allowing for digitization to be enabled in the future by selecting one of the other +two options. +::: + +### Upload receipts + +Open the {guilabel}`Expenses app`, and from the {guilabel}`My Expenses` dashboard, click +{guilabel}`Upload`, and a file explorer appears. Navigate to the desired receipt, select it, then +click {guilabel}`Open`. + +```{image} log_expenses/upload.png +:align: center +:alt: |- +: Create an expense by scanning a receipt. Click Scan at the top of the Expenses dashboard +: view. +``` + +The receipt is scanned, and a new expense record is created. The {guilabel}`Expense Date` field is +populated with today's date, along with any other fields based on the scanned data, such as the +{guilabel}`Total`. + +Click on the new entry to open the individual expense form, and make any changes, if needed. The +scanned receipt appears in the *chatter*. + +(expenses-email-expense)= + +## Email expenses + +Instead of individually creating each expense in the **Expenses** app, expenses can be automatically +created by sending an email to an email alias. + +To do so, an email alias must first be configured. Navigate to {menuselection}`Expenses app --> +Configuration --> Settings`. Ensure the checkbox beside {guilabel}`Incoming Emails` is ticked. The +default email alias is *expense@(domain).com*. Change the email alias by entering the desired email +in the field to the right of {guilabel}`Alias`. Then, click {guilabel}`Save`. + +```{image} log_expenses/alias-email.png +:align: center +:alt: Te default email that populates the expenses email alias. +``` + +:::{note} +If the domain alias needs to be set up, {icon}`fa-arrow-right` {guilabel}`Setup your domain +alias` appears beneath the {guilabel}`Incoming Emails` checkbox, instead of the email address +field. + +```{image} log_expenses/email-alias.png +:align: center +:alt: Create the domain alias by clicking the link. +``` + +Refer to the {doc}`/applications/websites/website/configuration/domain_names` documentation for +setup instructions and more information. + +Once the domain alias is configured, the email address field is visible beneath the +{guilabel}`Incoming Emails` feature on the {guilabel}`Settings` page in the **Expenses** app. +::: + +Once the email address has been entered, emails can be sent to that alias to create new expenses, +without having to be in the Odoo database. + +To submit an expense via email, create a new email, and enter the product's *internal reference* +code (if available) and the amount of the expense as the subject of the email. Next, attach the +receipt to the email. Odoo creates the expense by taking the information in the email subject, and +combining it with the receipt. + +To check an expense category's internal reference, go to {menuselection}`Expenses app --> +Configuration --> Expense Categories`. If an internal reference is listed on the expense category, +it is listed in the {guilabel}`Internal Reference` column. + +```{image} log_expenses/ref.png +:align: center +:alt: Internal reference numbers are listed in the main Expense Categories view. +``` + +To add an internal reference on an expense category, click on the category to open the expense +category form. Enter the {guilabel}`Internal Reference` in the corresponding field. Beneath the +{guilabel}`Internal Reference` field, this sentence appears: {guilabel}`Use this reference as a +subject prefix when submitting by email.` + +```{image} log_expenses/mileage-internal-reference.png +:align: center +:alt: Internal reference numbers are listed in the main Expense Products view. +``` + +```{eval-rst} +.. example:: + If submitting an expense, via email, for a $25.00 meal during a work trip, the email subject + would be `FOOD $25.00`. + + Explanation: + + - The :guilabel:`Internal Reference` for the expense category `Meals` is `FOOD` + - The :guilabel:`Cost` for the expense is `$25.00` +``` + +:::{note} +For security purposes, only authenticated employee emails are accepted by Odoo when creating an +expense from an email. To confirm an authenticated employee email address, go to the employee +card in the {menuselection}`Employees app`, and refer to the {guilabel}`Work Email` field. + +```{image} log_expenses/authenticated-email-address.png +:align: center +:alt: Create the domain alias by clicking the link. +``` +::: + diff --git a/content/applications/finance/expenses/post_expenses.md b/content/applications/finance/expenses/post_expenses.md new file mode 100644 index 000000000..571db915e --- /dev/null +++ b/content/applications/finance/expenses/post_expenses.md @@ -0,0 +1,79 @@ +# Post expenses + +Once an expense report is {doc}`approved <../expenses/approve_expenses>`, the next step is to post +the expense report to the proper accounting journal. + +:::{important} +To post expense reports to an accounting journal, the user **must** have the following +{doc}`access rights <../../general/users/access_rights>`: + +- Accounting: *Accountant* or *Adviser* +- Expenses: *Manager* +::: + +Only expense reports with an *Approved* status can post the expenses to a journal. To view all +expense reports, navigate to {menuselection}`Expenses app --> Expense Reports`. Next, to view +**only** approved expense reports that need to be posted, adjust the filters on the left side, so +only the {guilabel}`Approved` checkbox is ticked. + +```{image} post_expenses/post-reports.png +:align: center +:alt: View reports to post by clicking on expense reports, then reports to post. +``` + +:::{note} +The default {guilabel}`All Reports` dashboard displays all expense reports, except reports with a +status of {guilabel}`Refused`. +::: + +Expense reports can be posted to accounting journals in two ways: {ref}`individually +` or {ref}`in bulk `. + +(expenses-post-individual)= + +## Post individual reports + +To post an individual report, navigate to {menuselection}`Expenses app --> Expense Reports`, and +click on an individual report with a {guilabel}`Status` of {guilabel}`Approved`, to view the report +form. In this view, several options are presented: {guilabel}`Post Journal Entries`, +{guilabel}`Report In Next Payslip`, {guilabel}`Refuse`, or {guilabel}`Reset to Draft`. + +Click {guilabel}`Post Journal Entries` to post the report. + +The accounting journal the expenses are posted to is listed in the {guilabel}`Journal` field of the +expense report. + +After posting the expenses to an accounting journal, a {guilabel}`Journal Entry` smart button +appears at the top of the screen. Click the {guilabel}`Journal Entry` smart button, and the details +for the journal entry appear, with a status of {guilabel}`Posted`. + +(expenses-post-multiple)= + +## Post multiple reports + +To post multiple expense reports at once, navigate to {menuselection}`Expenses app --> Expense +Reports` to view a list of expense reports. Next, select the reports to approve by ticking the +checkbox next to each report being approved. + +:::{note} +Only expense reports with a status of {guilabel}`Approved` are able to post the expenses to an +accounting journal. If an expense report is selected that **cannot** be posted, such as an +unapproved report, or the report has already been posted to a journal, the {guilabel}`Post +Entries` button is **not** visible. +::: + +:::{tip} +To select **only** approved expense reports, adjust the filters on the left side, so that only +the {guilabel}`Approved` checkbox is ticked. Next, tick the checkbox next to the +{guilabel}`Employee` column title to select **all** the {guilabel}`Approved` reports in the list +at once. +::: + +Next, click the {guilabel}`Post Entries` button. + +```{image} post_expenses/post-entries.png +:align: center +:alt: Post multiple reports at a time from the Expense Reports view, with the Approved +: filter. +``` + diff --git a/content/applications/finance/expenses/reimburse.md b/content/applications/finance/expenses/reimburse.md new file mode 100644 index 000000000..e2f1aaabc --- /dev/null +++ b/content/applications/finance/expenses/reimburse.md @@ -0,0 +1,145 @@ +# Reimburse employees + +After an expense report is {doc}`posted to an accounting journal <../expenses/post_expenses>`, the +next step is to reimburse the employee. Just like approving and posting expenses, employees can be +reimbursed in two ways: with cash, check, or direct deposit ({ref}`individually +` or {ref}`in bulk `), or {ref}`reimbursed in a +payslip `. + +## Settings + +Reimbursements can be paid via paycheck, check, cash, or bank transfer. To set up payment options, +first configure the various settings by navigating to {menuselection}`Expenses app --> +Configuration --> Settings`. + +To reimburse employees for expenses {ref}`in their paychecks `, tick the +checkbox beside the {guilabel}`Reimburse in Payslip` option in the {guilabel}`Expenses` section. + +Next, set how payments are made in the {guilabel}`Accounting` section. Click the drop-down menu +under {guilabel}`Payment Methods`, and select the desired payment option. Default options include +paying by {guilabel}`Manual (Cash)`, {guilabel}`Checks (Bank)`, {guilabel}`NACHA (Bank)`, and +others. Leaving this field blank allows for **all** available payment options to be used. + +When all desired configurations are complete, click {guilabel}`Save` to activate the settings. + +(expenses-reimburse-single)= + +## Reimburse individually + +To reimburse an individual expense report, first navigate to {menuselection}`Expenses app --> +Expense Reports`. All expense reports are presented in a default list view. Click on the expense +report being reimbursed to view the report details. + +:::{important} +**Only** expense reports with a status of {guilabel}`Posted` can be reimbursed. +::: + +Click the {guilabel}`Register Payment` button in the top-left corner of the expense report, and a +{guilabel}`Register Payment` pop-up window appears. Enter the following information in the pop-up +window: + +- {guilabel}`Journal`: Select the accounting journal to post the payment to using the drop-down + menu. The default options are {guilabel}`Bank` or {guilabel}`Cash`. +- {guilabel}`Payment Method`: Select how the payment is made using the drop-down menu. If + {guilabel}`Cash` is selected for the {guilabel}`Journal`, the only option available is + {guilabel}`Manual`. If {guilabel}`Bank` is selected for the {guilabel}`Journal`, the default + options are {guilabel}`Manual` or {guilabel}`Checks`. +- {guilabel}`Recipient Bank Account`: Select the employee's bank account the payment is being sent + to. If the employee has a bank account on file in the {ref}`Private Information tab + ` of their employee form in the **Employees** app, that bank account + populates this field, by default. +- {guilabel}`Amount`: The total amount being reimbursed populates this field, by default. The + currency, located to the right of the field, can be modified using the drop-down menu. +- {guilabel}`Payment Date`: Enter the date the payments are issued in this field. The current date + populates this field, by default. +- {guilabel}`Memo`: The text entered in the {doc}`Expense Report Summary + <../expenses/expense_reports>` field of the expense report populates this field, by default. + +```{image} reimburse/payment.png +:align: center +:alt: |- +: The Register Payment pop-up window filled out for an individual expense report +: reimbursement. +``` + +When the fields of the pop-up window are completed, click the {guilabel}`Create Payment` button to +register the payment, and reimburse the employee. + +(expenses-reimburse-bulk)= + +## Reimburse in bulk + +To reimburse multiple expense reports at once, navigate to {menuselection}`Expenses app --> Expense +Reports` to view all expense reports in a list view. Next, adjust the {guilabel}`STATUS` filters on +the left side to only present expense reports with a status of {guilabel}`Posted`. + +:::{tip} +Adjusting the {guilabel}`STATUS` filters to only show {guilabel}`Posted` expense reports is not +necessary, but removes the step of selecting each individual report in the list. +::: + +Tick the checkbox next to the {guilabel}`Employee` column title to select all the reports in the +list. Once ticked, the number of selected expense reports appears at the top of the page +({guilabel}`(#) Selected`). Additionally, a {guilabel}`Register Payment` button also appears in the +upper-left corner. + +```{image} reimburse/multiple-reports.png +:align: center +:alt: Expense reports filtered by the status Posted, making the Register Payment button +: visible. +``` + +Click the {guilabel}`Register Payment` button, and a {guilabel}`Register Payment` pop-up window +appears. Enter the following information in the pop-up window: + +- {guilabel}`Journal`: Select the accounting journal the payment should be posted to, using the + drop-down menu. The default options are {guilabel}`Bank` or {guilabel}`Cash`. +- {guilabel}`Payment Method`: Select how the payment is made using the drop-down menu. If + {guilabel}`Cash` is selected for the {guilabel}`Journal`, the only option available is + {guilabel}`Manual`. If {guilabel}`Bank` is selected for the {guilabel}`Journal`, the default + options are {guilabel}`Manual` or {guilabel}`Checks`. +- {guilabel}`Group Payments`: When multiple expense reports are selected for the same employee, this + option appears. Tick the checkbox to have only one payment made, rather than issuing multiple + payments to the same employee. +- {guilabel}`Payment Date`: Enter the date the payments are issued. The current date populates this + field, by default. + +```{image} reimburse/register.png +:align: center +:alt: The Register Payment pop-up window filled out. +``` + +When the fields on the pop-up window are completed, click the {guilabel}`Create Payments` button to +register the payments, and reimburse the employees. + +(expenses-reimburse-payslip)= + +## Report in next payslip + +If the *Reimburse in Payslip* option is activated on the *Settings* page, payments can be added to +their next payslip, instead of issued manually. + +:::{important} +Reimbursing expenses on payslips can **only** be done individually, on an expense report with a +status of *Approved*. Once an expense report has a status of *Posted*, the option to reimburse in +the following payslip does **not** appear. +::: + +Navigate to {menuselection}`Expenses app --> Expense Reports`, and click on the individual expense +report being reimbursed on the following paycheck. Click the {guilabel}`Report in Next Payslip` +smart button, and the expenses are added to the next payslip issued for that employee. Additionally, +a message is logged in the chatter stating the expense is added to the following payslip. + +```{image} reimburse/pay-via-payslip.png +:align: center +:alt: The Report in Next Payslip button, visible with an expense report status of Approved. +``` + +The status for the expense report remains {guilabel}`Approved`. The status only changes to +{guilabel}`Posted` (and then {guilabel}`Done`), when the paycheck is processed. + +:::{seealso} +Refer to the {doc}`Payslips <../../hr/payroll/payslips>` documentation for more information about +processing paychecks. +::: + diff --git a/content/applications/finance/expenses/reinvoice_expenses.md b/content/applications/finance/expenses/reinvoice_expenses.md new file mode 100644 index 000000000..c7c88594b --- /dev/null +++ b/content/applications/finance/expenses/reinvoice_expenses.md @@ -0,0 +1,155 @@ +# Re-invoice expenses + +If expenses are tracked on customer projects, they can be automatically charged back to the +customer. This is done by {ref}`creating an expense `, referencing the +sales order the expense is added to, and then {ref}`creating an expense report +`. + +Next, managers {ref}`approve the expense report `, before the accounting +department {ref}`posts the journal entries `. + +Finally, once the expense report is posted to a journal, the expenses appears on the specified +{abbr}`SO (Sales Order)`. The {abbr}`SO (Sales Order)` is then {ref}`invoiced `, +thus charging the customer for the expenses. + +:::{important} +Approving expenses, posting expenses to accounting, and reinvoicing expenses on {abbr}`SOs (Sales +Orders)` is **only** possible for users with the appropriate {doc}`access rights +<../../general/users/access_rights>`. +::: + +:::{seealso} +This document provides lower-level instructions for the creation, submission, approval, and +posting of expenses. For fully-detailed instructions for any of these steps, refer to the +following documentation: + +- {doc}`Log expenses <../expenses/log_expenses>` +- {doc}`Expense reports <../expenses/expense_reports>` +- {doc}`Approving expenses <../expenses/approve_expenses>` +- {doc}`Posting expenses in accounting <../expenses/post_expenses>` +::: + +## Setup + +First, specify the invoicing policy for each expense category. Navigate to {menuselection}`Expenses +app --> Configuration --> Expense Categories`. Click on an expense category to view the expense +category form. Under the {guilabel}`INVOICING` section, click the radio button next to the desired +selection for {guilabel}`Re-Invoice Expenses`: + +- {guilabel}`No`: The expense category cannot be re-invoiced. +- {guilabel}`At cost`: The expense category invoices expenses at the cost set on the expense + category form. +- {guilabel}`Sales price`: The expense category invoices at the sales price set on the expense form. + +(expenses-reinvoice-create)= + +## Create an expense + +First, when {doc}`creating a new expense <../expenses/log_expenses>`, the correct information needs +to be entered to re-invoice the expense to a customer. Using the drop-down menu, select the +{abbr}`SO (Sales Order)` to add the expense to in the {guilabel}`Customer to Reinvoice` field. + +Next, select the {guilabel}`Analytic Distribution` the expense is posted to. Multiple accounts can +be selected, if desired. + +To add another {guilabel}`Analytic Distribution`, click on the line to reveal the +{guilabel}`Analytic` pop-over window. Click {guilabel}`Add a line`, then select the desired +{guilabel}`Analytic Distribution` from the drop-down field. If selecting more than one +{guilabel}`Analytic Distribution`, the {guilabel}`Percentage` fields **must** be modified. By +default, both fields are populated with `100%`. Adjust the percentages for all the fields, so the +total of all selected accounts equals `100%`. + +```{eval-rst} +.. example:: + A painting company agrees to paint an office building that houses two different companies. During + the estimate, a meeting is held at the office location to discuss the project. + + Both companies agree to pay for the travel expenses for the painting company employees. When + creating the expenses for the mileage and hotels, **both companies** are listed in the + :guilabel:`Analytic Distribution` line, for 50% each. +``` + +(expenses-reinvoice-report)= + +## Create an expense report + +After the expenses are created, the expense report must be {ref}`created ` +and {ref}`submitted `, in the same manner as all other expenses. + +Once the expense report is submitted, a {icon}`fa-money` {guilabel}`Sales Orders` smart button +appears at the top-center of both the expense report, and each individual expense record being +reinvoiced. + +```{image} reinvoice_expenses/reinvoice-expense.png +:align: center +:alt: Ensure the customer to be invoiced is called out on the expense. +``` + +:::{important} +Selecting the proper {abbr}`SO (Sales Order)` in the {guilabel}`Customer to Reinvoice` field is +**critical**, since this is how expenses are automatically invoiced after an expense report is +approved. + +The {guilabel}`Customer to Reinvoice` field can be modified *only* until an expense report is +**approved**. After an expense report is approved, the {guilabel}`Customer to Reinvoice` field is +no longer able to be modified. +::: + +(expenses-reinvoice-approve)= + +## Approve and post expenses + +Before {doc}`approving an expense report <../expenses/approve_expenses>`, ensure the +{guilabel}`Analytic Distribution` section is populated for every expense line. + +If an {guilabel}`Analytic Distribution` entry is missing, assign the correct accounts from the +drop-down menu, then click {guilabel}`Approve`. + +```{image} reinvoice_expenses/analytic-dist.png +:align: center +:alt: The expense report with all the Analytic Distribution lines populated. +``` + +:::{note} +The {guilabel}`Approve` button **only** appears after an expense report has been {ref}`submitted +`. +::: + +The accounting department is typically responsible for {doc}`posting journal entries +<../expenses/post_expenses>`. To post expenses to an accounting journal, click {guilabel}`Post +Journal Entries`. Once an expense report is approved, it can then be posted. + +The {abbr}`SO (Sales Order)` is **only** updated *after* the journal entries are posted. Once the +journal entries are posted, the expenses now appear on the referenced {abbr}`SO (Sales Order)`. + +(expenses-reinvoice)= + +## Invoice expenses + +After the expense report has been approved, and the journal entries have been posted, the {abbr}`SO +(Sales Order)` is updated, and the customer can be invoiced. + +Select the expense report, and click the {icon}`fa-money` {guilabel}`Sales Orders` smart button to +open the {abbr}`SO (Sales Order)`. The expenses to be re-invoiced now appear on the {abbr}`SO (Sales +Order)`. + +:::{note} +More than one {abbr}`SO (Sales Order)` can be referenced on an expense report. If more than one +{abbr}`SO (Sales Order)` is referenced, clicking the {guilabel}`Sales Orders` smart button opens +a list displaying all the {abbr}`SOs (Sales Order)` associated with that expense report. Click on +a {abbr}`SO (Sales Order)` to open the individual {abbr}`SO (Sales Order)` details. +::: + +The expenses are listed in the {abbr}`SO (Sales Order)` {guilabel}`Order Lines` tab. + +```{image} reinvoice_expenses/so-details.png +:align: center +:alt: See the expenses listed on the sales order after clicking into it. +``` + +Next, click {guilabel}`Create Invoice`, and a {guilabel}`Create invoices` pop-up window appears. +Select if the invoice is a {guilabel}`Regular invoice`, a {guilabel}`Down payment (percentage)`, or +a {guilabel}`Down payment (fixed amount)`. Then, click {guilabel}`Create Draft Invoice`. Doing so +creates a draft invoice for the customer. Click {guilabel}`Confirm` to confirm the invoice, and the +customer is invoiced for the expenses. + diff --git a/content/applications/finance/fiscal_localizations.md b/content/applications/finance/fiscal_localizations.md new file mode 100644 index 000000000..dda24653d --- /dev/null +++ b/content/applications/finance/fiscal_localizations.md @@ -0,0 +1,205 @@ +--- +show-content: true +--- + +# Fiscal localizations + +Fiscal localizations are country-specific modules that allow you to be compliant with a country's +fiscal requirements. Most of these modules are related to the {ref}`Accounting +` or {ref}`Payroll ` app, but they +can also be necessary for other apps such as Point of Sale, eCommerce, etc., depending on a +country's fiscal requirements. + +(fiscal-localizations-packages)= + +## Configuration + +Odoo should automatically install the required fiscal localization modules based on the company's +country when the related app is installed. Refer to the {ref}`list of countries +` to view the currently supported countries and access their +specific documentation. + +:::{note} +Each company in a multi-company environment can use different fiscal localization modules. +::: + +(fiscal-localizations-accounting)= + +### Accounting + +Verify the right package of modules is installed by going to {menuselection}`Accounting --> +Configuration --> Settings` and checking the {guilabel}`Package` field under the {guilabel}`Fiscal +Localization` section. Select another one if necessary. + +:::{warning} +Selecting another package is only possible if no entry has been posted. +::: + +These packages require fine-tuning the chart of accounts, activating the taxes to be used, +configuring the country-specific statements and certifications, and sometimes more. + +(fiscal-localizations-payroll)= + +### Payroll + +Localization settings can be accessed by going to {menuselection}`Payroll --> Configuration --> +Settings` and searching for the country's **Localization** section. + +(fiscal-localizations-countries-list)= + +## List of countries + +Fiscal 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. +::: + +- Algeria +- {doc}`Argentina ` +- {doc}`Australia ` +- {doc}`Austria ` +- Bangladesh +- {doc}`Belgium ` +- Benin +- Bolivia +- {doc}`Brazil ` +- Burkina Faso +- Bulgaria +- Cameroon +- {doc}`Canada ` +- Central African Republic +- Chad +- {doc}`Chile ` +- China +- {doc}`Colombia ` +- Comoros +- Congo +- Costa Rica +- Croatia +- Cyprus +- Czech Republic +- Democratic Republic of the Congo +- Denmark +- Dominican Republic +- {doc}`Ecuador ` +- {doc}`Egypt ` +- Equatorial Guinea +- Estonia +- Ethiopia +- Finland +- {doc}`France ` +- Gabon +- {doc}`Germany ` +- Guinea +- Greece +- Guatemala +- Guinea-Bissau +- Honduras +- {doc}`Hong Kong ` +- Hungary +- {doc}`India ` +- {doc}`Indonesia ` +- {doc}`Italy ` +- Ivory Coast +- Japan +- Jordan +- Kazakhstan +- {doc}`Kenya ` +- Kuwait +- Latvia +- Lithuania +- {doc}`Luxembourg ` +- Mali +- Malta +- Mauritius +- {doc}`Malaysia ` +- {doc}`Mexico ` +- Mongolia +- Morocco +- Mozambique +- {doc}`Netherlands ` +- {doc}`New Zealand ` +- Niger +- Nigeria +- Norway +- Pakistan +- Panama +- {doc}`Peru ` +- {doc}`Philippines ` +- Poland +- Portugal +- Qatar +- {doc}`Romania ` +- Rwanda +- {doc}`Saudi Arabia ` +- Senegal +- Serbia +- {doc}`Singapore ` +- Slovakia +- Slovenia +- South Africa +- {doc}`Spain ` +- Sweden +- {doc}`Switzerland ` +- Taiwan +- Tanzania +- {doc}`Thailand ` +- Tunisia +- Türkiye +- Uganda +- Ukraine +- {doc}`United Arab Emirates ` +- {doc}`United Kingdom ` +- {doc}`United States of America ` +- {doc}`Uruguay ` +- Venezuela +- {doc}`Vietnam ` +- Zambia + +:::{seealso} +{doc}`Employment Hero Payroll documentation ` +::: + +```{toctree} +:titlesonly: true + +fiscal_localizations/argentina +fiscal_localizations/australia +fiscal_localizations/austria +fiscal_localizations/belgium +fiscal_localizations/brazil +fiscal_localizations/canada +fiscal_localizations/chile +fiscal_localizations/colombia +fiscal_localizations/ecuador +fiscal_localizations/egypt +fiscal_localizations/france +fiscal_localizations/germany +fiscal_localizations/hong_kong +fiscal_localizations/india +fiscal_localizations/indonesia +fiscal_localizations/italy +fiscal_localizations/kenya +fiscal_localizations/luxembourg +fiscal_localizations/malaysia +fiscal_localizations/mexico +fiscal_localizations/netherlands +fiscal_localizations/new_zealand +fiscal_localizations/peru +fiscal_localizations/philippines +fiscal_localizations/romania +fiscal_localizations/saudi_arabia +fiscal_localizations/singapore +fiscal_localizations/spain +fiscal_localizations/switzerland +fiscal_localizations/thailand +fiscal_localizations/united_arab_emirates +fiscal_localizations/united_kingdom +fiscal_localizations/united_states +fiscal_localizations/uruguay +fiscal_localizations/vietnam +fiscal_localizations/employment_hero +``` + diff --git a/content/applications/finance/fiscal_localizations/argentina.md b/content/applications/finance/fiscal_localizations/argentina.md new file mode 100644 index 000000000..d3b709a19 --- /dev/null +++ b/content/applications/finance/fiscal_localizations/argentina.md @@ -0,0 +1,1213 @@ +# Argentina + +## Webinars + +Below you can find videos with a general description of the localization, and how to configure it. + +- [Webinar - Localización de Argentina](https://www.youtube.com/watch?v=_H1HbU-wKVg). +- [eCommerce - Localización de Argentina](https://www.youtube.com/watch?v=5gUi2WWfRuI). + +:::{seealso} +- [Smart Tutorial - Localización de Argentina](https://www.odoo.com/slides/smart-tutorial-localizacion-de-argentina-130) +- {doc}`Documentation on e-invoicing's legality and compliance in Argentina + <../accounting/customer_invoices/electronic_invoicing/argentina>` +::: + +## Configuration + +### Modules installation + +{ref}`Install ` the following modules to get all the features of the Argentinean +localization: + +```{eval-rst} +.. list-table:: + :header-rows: 1 + :widths: 25 25 50 + + * - Name + - Technical name + - Description + * - :guilabel:`Argentina - Accounting` + - `l10n_ar` + - Default :ref:`fiscal localization package `, which represents + the minimal configuration to operate in Argentina under the :abbr:`AFIP (Administración + Federal de Ingresos Públicos)` regulations and guidelines. + * - :guilabel:`Argentinean Accounting Reports` + - `l10n_ar_reports` + - VAT Book report and VAT summary report. + * - :guilabel:`Argentinean Electronic Invoicing` + - `l10n_ar_edi` + - Includes all technical and functional requirements to generate electronic invoices via web + service, based on the AFIP regulations. + * - :ref:`Argentinean eCommerce ` + - `l10n_ar_website_sale` + - (optional) Allows the user to see Identification Type and AFIP Responsibility in the + eCommerce checkout form in order to create electronic invoices. + * - :ref:`Argentina - Payment Withholdings ` + - `l10n_ar_withholding` + - Allows registering withholdings during the payment of an invoice. +``` + +(argentina-configure-your-company)= + +### Configure your company + +Once the localization modules are installed, the first step is to set up the company's data. In +addition to the basic information, a key field to fill in is the {guilabel}`AFIP Responsibility +Type`, which represents the fiscal obligation and structure of the company. + +```{image} argentina/select-responsibility-type.png +:align: center +:alt: Select AFIP Responsibility Type. +``` + +### Chart of account + +In Accounting, there are three different {guilabel}`Chart of Accounts` packages to choose from. +They are based on a company's AFIP responsibility type, and consider the difference between +companies that do not require as many accounts as the companies that have more complex fiscal +requirements: + +- Monotributista (227 accounts); +- IVA Exento (290 accounts); +- Responsable Inscripto (298 Accounts). + +```{image} argentina/select-fiscal-package.png +:align: center +:alt: Select Fiscal Localization Package. +``` + +### Configure master data + +#### Electronic Invoice Credentials + +##### Environment + +The AFIP infrastructure is replicated in two separate environments, **testing** and **production**. + +Testing is provided so that the companies can test their databases until they are ready to move +into the **Production** environment. As these two environments are completely isolated from each +other, the digital certificates of one instance are not valid in the other one. + +To select a database environment, go to {menuselection}`Accounting --> Settings --> Argentinean +Localization` and choose either {guilabel}`Prueba (Testing)` or {guilabel}`Produccion (Production)`. + +```{image} argentina/select-environment.png +:align: center +:alt: 'Select AFIP database environment: Testing or Production.' +``` + +##### AFIP certificates + +The electronic invoice and other AFIP services work with {guilabel}`Web Services (WS)` provided by +the AFIP. + +In order to enable communication with the AFIP, the first step is to request a {guilabel}`Digital +Certificate` if you do not have one already. + +1. {guilabel}`Generate Certificate Sign Request (Odoo)`. When this option is selected, a file with + extension `.csr` (certificate signing request) is generated to be used in the AFIP portal to + request the certificate. + + ```{image} argentina/request-certificate.png + :alt: Request a certificate. + ``` + +2. {guilabel}`Generate Certificate (AFIP)`. Access the AFIP portal and follow the instructions + described in [this document](https://drive.google.com/file/d/17OKX2lNWd1bjUt3NxfqcCKBkBh-Xlpo-/view) to get a certificate. + +3. {guilabel}`Upload Certificate and Private Key (Odoo)`. Once the certificate is generated, upload + it to Odoo using the {guilabel}`Pencil` icon next to the field {guilabel}`Certificado` and select + the corresponding file. + + ```{image} argentina/upload-certificate-private-key.png + :alt: Upload Certificate and Private Key. + ``` + +:::{tip} +In case you need to configure the Homologation Certificate, please refer to the AFIP official +documentation: [Homologation Certificate](http://www.afip.gob.ar/ws/documentacion/certificados.asp). Furthermore, Odoo allows the user +to test electronic invoicing locally without a Homologation Certificate. The following message +will be in the chatter when testing locally: + +```{image} argentina/local-testing.png +:align: center +:alt: |- +: Invoice validated locally because it is in a testing environment without testing +: certificate/keys. +``` +::: + +#### Partner + +##### Identification type and VAT + +As part of the Argentinean localization, document types defined by the AFIP are now available in the +**Partner form**. Information is essential for most transactions. There are six +{guilabel}`Identification Types` available by default, as well as 32 inactive types. + +```{image} argentina/identification-types.png +:align: center +:alt: A list of AR Localization document types in Odoo, as defined by AFIP. +``` + +:::{note} +The complete list of {guilabel}`Identification Types` defined by the AFIP is included in Odoo, +but only the common ones are active. +::: + +##### AFIP responsibility type + +In Argentina, the document type and corresponding transactions associated with customers and +vendors is defined by the AFIP Responsibility type. This field should be defined in the **Partner +form**. + +```{image} argentina/select-afip-responsibility-type.png +:align: center +:alt: Select AFIP Responsibility Type. +``` + +#### Taxes + +As part of the localization module, the taxes are created automatically with their related +financial account and configuration, e.g., 73 taxes for {guilabel}`Responsable Inscripto`. + +```{image} argentina/automatic-tax-configuration.png +:align: center +:alt: A list of AR Localization taxes with financial amount and configuration in Odoo. +``` + +##### Taxes types + +Argentina has several tax types, the most common ones are: + +- {guilabel}`VAT`: this is the regular VAT and can have various percentages; +- {guilabel}`Perception`: advance payment of a tax that is applied on invoices; +- {guilabel}`Retention`: advance payment of a tax that is applied on payments. + +##### Special taxes + +Some Argentinean taxes are not commonly used for all companies, and those less common options are +labeled as inactive in Odoo by default. Before creating a new tax, be sure to check if that tax is +not already included as inactive. + +```{image} argentina/special-inactive-taxes.png +:align: center +:alt: |- +: A list showing less common Argentinean tax options, which are labeled as inactive in Odoo +: by default. +``` + +(document-types)= + +#### Document types + +In some Latin American countries, like Argentina, some accounting transactions such as invoices and +vendor bills are classified by document types defined by the governmental fiscal authorities. In +Argentina, the [AFIP](https://www.afip.gob.ar/) is the governmental fiscal authority that +defines such transactions. + +The document type is an essential piece of information that needs to be clearly displayed in +printed reports, invoices, and journal entries that list account moves. + +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 (this data +is created automatically when the localization module is installed). + +The information required for the {guilabel}`Document Types` is included by default so the user does +not need to fill anything on this view: + +```{image} argentina/default-document-type-info.png +:align: center +:alt: A list of document types in Odoo. +``` + +:::{note} +There are several {guilabel}`Document Types` types that are inactive by default, but can be +activated as needed. +::: + +##### Letters + +For Argentina, the {guilabel}`Document Types` include a letter that helps indicate the type of +transaction or operation. For example, when an invoice is related to a(n): + +- {guilabel}`B2B transaction`, a document type {guilabel}`A` must be used; +- {guilabel}`B2C transaction`, a document type {guilabel}`B` must be used; +- {guilabel}`Exportation Transaction`, a document type {guilabel}`E` must be used. + +The documents included in the localization already have the proper letter associated with each +{guilabel}`Document Type`, so there is no further configuration necessary. + +```{image} argentina/document-types-grouped-by-letters.png +:align: center +:alt: document types grouped by letters. +``` + +##### Use on invoices + +The {guilabel}`Document Type` on each transaction will be determined by: + +- The journal entry related to the invoice (if the journal uses documents); +- The onditions applied based on the type of issuer and receiver (e.g., the type of fiscal regime of + the buyer and the type of fiscal regime of the vendor). + +### Journals + +In the Argentinean localization, the journal can have a different approach depending on its usage +and internal type. To configure journals, go to {menuselection}`Accounting --> Configuration --> +Journals`. + +For sales and purchase journals, it's possible to activate the option {guilabel}`Use Documents`, +which enables a list of {guilabel}`Document Types` that can be related to the invoices and vendor +bills. For more detail on invoices, please refer to the section {ref}`2.3 document types +`. + +If the sales or purchase journals do not have the {guilabel}`Use Documents` option activated, they +will not be able to generate fiscal invoices, meaning, their use case will be mostly limited to +monitoring account moves related to internal control processes. + +#### AFIP information (also known as AFIP Point of Sale) + +The {guilabel}`AFIP POS System` is a field only visible for the **Sales** journals and defines the +type of AFIP POS that will be used to manage the transactions for which the journal is created. + +The AFIP POS defines the following: + +1. the sequences of document types related to the web service; +2. the structure and data of the electronic invoice file. + +```{image} argentina/sales-journal.png +:align: center +:alt: A AFIP POS System field which is available on Sales journals in Odoo. +``` + +##### Web services + +**Web services** help generate invoices for different purposes. Below are a few options to choose +from: + +- {guilabel}`wsfev1: Electronic Invoice`: is the most common service, which is used to generate + invoices for document types A, B, C, M with no detail per item; +- {guilabel}`wsbfev1: Electronic Fiscal Bond`: is for those who invoice capital goods and wish to + access the benefit of the Electronic Tax Bonds granted by the Ministry of Economy. For more + details go to: [Fiscal Bond](https://www.argentina.gob.ar/acceder-un-bono-por-fabricar-bienes-de-capital); +- {guilabel}`wsfexv1: Electronic Exportation Invoice`: is used to generate invoices for + international customers and transactions that involve exportation processes, the document type + related is type "E". + +```{image} argentina/web-services.png +:align: center +:alt: Web Services. +``` + +Here are some useful fields to know when working with web services: + +- {guilabel}`AFIP POS Number`: is the number configured in the AFIP to identify the operations + related to this AFIP POS; + +- {guilabel}`AFIP POS Address`: is the field related to the commercial address registered for the + POS, which is usually the same address as the company. For example, if a company has multiple + stores (fiscal locations) then the AFIP will require the company to have one AFIP POS per + location. This location will be printed in the invoice report; + +- {guilabel}`Unified Book`: when the AFIP POS System is Preimpresa, then the document types + (applicable to the journal) with the same letter will share the same sequence. For example: + + - Invoice: FA-A 0001-00000002; + - Credit Note: NC-A 0001-00000003; + - Debit Note: ND-A 0001-00000004. + +#### Sequences + +For the first invoice, Odoo synchronizes with the AFIP automatically and displays the last sequence +used. + +:::{note} +When creating {guilabel}`Purchase Journals`, it's possible to define whether they are related to +document types or not. In the case where the option to use documents is selected, there would be +no need to manually associate the document type sequences, since the document number is provided +by the vendor. +::: + +## Usage and testing + +### Invoice + +The information below applies to invoice creation once the partners and journals are created and +properly configured. + +#### Document type assignation + +When the partner is selected, the {guilabel}`Document Type` field will be filled in automatically +based on the AFIP document type: + +- **Invoice for a customer IVA Responsable Inscripto, prefix A** is the type of document that shows + all the taxes in detail along with the customer's information. + + ```{image} argentina/prefix-a-invoice-for-customer.png + :alt: Invoice for a customer IVA Responsable Inscripto, prefix A. + ``` + +- **Invoice for an end customer, prefix B** is the type of document that does not detail the taxes, + since the taxes are included in the total amount. + + ```{image} argentina/prefix-b-invoice-for-end-customer.png + :alt: Invoice for an end customer, prefix B. + ``` + +- **Exportation Invoice, prefix E** is the type of document used when exporting goods that shows + the incoterm. + + ```{image} argentina/prefix-e-exporation-invoice.png + :alt: Exportation Invoice, prefix E + ``` + +Even though some invoices use the same journal, the prefix and sequence are given by the +{guilabel}`Document Type` field. + +The most common {guilabel}`Document Type` will be defined automatically for the different +combinations of AFIP responsibility type but it can be updated manually by the user before +confirming the invoice. + +#### Electronic invoice elements + +When using electronic invoices, if all the information is correct then the invoice is posted in the +standard way unless there is an error that needs to be addressed. When error messages pop up, they +indicate both the issue that needs attention along with a proposed solution. If an error persists, +the invoice remains in draft until the issue is resolved. + +Once the invoice is posted, the information related to the AFIP validation and status is displayed +in the AFIP tab, including: + +- {guilabel}`AFIP Autorisation`: CAE number; +- {guilabel}`Expiration Date`: deadline to deliver the invoice to the customers (normally 10 days + after the CAE is generated); +- {guilabel}`Result:` indicates if the invoice has been {guilabel}`Aceptado en AFIP` and/or + {guilabel}`Aceptado con Observaciones`. + +```{image} argentina/afip-status.png +:align: center +:alt: AFIP Status. +``` + +#### Invoice taxes + +Based on the {guilabel}`AFIP Responsibility type`, the VAT tax can apply differently on the PDF +report: + +- {guilabel}`A. Tax excluded`: in this case the taxed amount needs to be clearly identified in the + report. This condition applies when the customer has the following AFIP Responsibility type of + **Responsable Inscripto**; + + ```{image} argentina/tax-amount-excluded.png + :alt: Tax excluded. + ``` + +- {guilabel}`B. Tax amount included`: this means that the taxed amount is included as part of the + product price, subtotal, and totals. This condition applies when the customer has the following + AFIP Responsibility types: + + - IVA Sujeto Exento; + - Consumidor Final; + - Responsable Monotributo; + - IVA liberado. + + ```{image} argentina/tax-amount-included.png + :align: center + :alt: Tax amount included. + ``` + +#### Special use cases + +##### Invoices for services + +For electronic invoices that include {guilabel}`Services`, the AFIP requires to report the service +starting and ending date, this information can be filled in the tab {guilabel}`Other Info`. + +```{image} argentina/invoices-for-services.png +:align: center +:alt: Invoices for Services. +``` + +If the dates are not selected manually before the invoice is validated, the values will be filled +automatically with the first and last day of the invoice's month. + +```{image} argentina/service-dates.png +:align: center +:alt: Service Dates. +``` + +##### Exportation invoices + +Invoices related to {guilabel}`Exportation Transactions` require that a journal uses the AFIP POS +System **Expo Voucher - Web Service** so that the proper document type(s) can be associated. + +```{image} argentina/exporation-journal.png +:align: center +:alt: Exporation journal. +``` + +When the customer selected in the invoice is configured with an AFIP responsibility type +{guilabel}`Cliente / Proveedor del Exterior` - {guilabel}`Ley N° 19.640`, Odoo automatically +assigns the: + +- Journal related to the exportation Web Service; +- Exportation document type; +- Fiscal position: Compras/Ventas al exterior; +- Concepto AFIP: Products / Definitive export of goods; +- Exempt Taxes. + +```{image} argentina/export-invoice.png +:align: center +:alt: Export invoice fields autofilled in Odoo. +``` + +:::{note} +The Exportation Documents require Incoterms to be enabled and configured, which can be found in +{menuselection}`Other Info --> Accounting`. +::: + +```{image} argentina/export-invoice-incoterm.png +:align: center +:alt: Export invoice - Incoterm. +``` + +##### Fiscal bond + +The {guilabel}`Electronic Fiscal Bond` is used for those who invoice capital goods and wish to +access the benefit of the Electronic Tax Bonds granted by the Ministry of Economy. + +For these transactions, it is important to consider the following requirements: + +- Currency (according to the parameter table) and invoice quotation; + +- Taxes; + +- Zone; + +- Detail each item; + + - Code according to the Common Nomenclator of Mercosur (NCM); + - Complete description; + - Unit Net Price; + - Quantity; + - Unit of measurement; + - Bonus; + - VAT rate. + +##### Electronic credit invoice MiPyme (FCE) + +For SME invoices, there are several document types that are classified as **MiPyME**, which are +also known as **Electronic Credit Invoice** (or **FCE** in Spanish). This classification develops a +mechanism that improves the financing conditions for small and medium-sized businesses, and allows +them to increase their productivity, through the early collection of credits and receivables issued +to their clients and/or vendors. + +For these transactions it's important to consider the following requirements: + +- specific document types (201, 202, 206, etc); +- the emitter should be eligible by the AFIP to MiPyME transactions; +- the amount should be bigger than 100,000 ARS; +- A bank account type CBU must be related to the emisor, otherwise the invoice cannot be validated, + having an error message such as the following. + +```{image} argentina/bank-account-relation-error.png +:align: center +:alt: Bank account relation error. +``` + +To set up the {guilabel}`Transmission Mode`, go to settings and select either {guilabel}`SDC` or +{guilabel}`ADC`. + +```{image} argentina/transmission-mode.png +:align: center +:alt: Transmission Mode. +``` + +To change the {guilabel}`Transmission Mode` for a specific invoice, go to the {guilabel}`Other Info` +tab and change it before confirming. + +:::{note} +Changing the {guilabel}`Transmission Mode` will not change the mode selected in +{guilabel}`Settings`. +::: + +```{image} argentina/transmission-mode-on-invoice.png +:align: center +:alt: Transmission Mode on Invoice. +``` + +When creating a {guilabel}`Credit/Debit` note related to a FCE document: + +- use the {guilabel}`Credit and Debit Note` buttons, so all the information from the invoice is + transferred to the new {guilabel}`Credit and Debit Note`; +- the document letter should be the same as than the originator document (either A or B); +- the same currency as the source document must be used. When using a secondary currency there is + an exchange difference if the currency rate is different between the emission day and the payment + date. It is possible to create a credit/debit note to decrease/increase the amount to pay in ARS. + +```{image} argentina/credit-debit-notes-button.png +:align: center +:alt: Credit & debit notes buttons. +``` + +When creating a {guilabel}`Credit Note` we can have two scenarios: + +1. the FCE is rejected so the {guilabel}`Credit Note` should have the field {guilabel}`FCE, is + Cancellation?` as *True*; or; +2. the {guilabel}`Credit Note`, is created to annulate the FCE document, in this case the field + {guilabel}`FCE, is Cancellation?` must be *empty* (false). + +```{image} argentina/fce-es-cancelation.png +:align: center +:alt: "FCE: Es Cancelaci\xF3n?" +``` + +(argentina-invoice-printed-report)= + +#### Invoice printed report + +The {guilabel}`PDF Report` related to electronic invoices that have been validated by the AFIP +includes a barcode at the bottom of the format which represents the CAE number. The expiration date +is also displayed as it is a legal requirement. + +```{image} argentina/invoice-printed-report.png +:align: center +:alt: Invoice printed report. +``` + +#### Troubleshooting and auditing + +For auditing and troubleshooting purposes, it is possible to obtain detailed information of an +invoice number that has been previously sent to the AFIP. To retrieve this information, activate the +{ref}`developer mode `, then go to the {menuselection}`Accounting` menu and click on +the button {guilabel}`Consult Invoice` button in AFIP. + +```{image} argentina/consult-invoice-in-afip.png +:align: center +:alt: Consult invoice in AFIP. +``` + +```{image} argentina/consult-invoice-in-afip-details.png +:align: center +:alt: Details of invoice consulted in AFIP. +``` + +It is also possible to retrieve the last number used in AFIP for a specific document type and POS +Number as a reference for any possible issues on the sequence synchronization between Odoo and +AFIP. + +```{image} argentina/consult-last-invoice-number.png +:align: center +:alt: Consult the last invoice number. +``` + +### Vendor bills + +Based on the purchase journal selected for the vendor bill, the {guilabel}`Document Type` is now a +required field. This value is auto-populated based on the AFIP Responsibility type of Issuer and +Customer, but the value can be changed if necessary. + +```{image} argentina/changing-journal-document-type.png +:align: center +:alt: Changing journal and document type. +``` + +The {guilabel}`Document Number` field needs to be registered manually and the format will be +validated automatically. However, in case the format is invalid, a user error will be displayed +indicating the correct format that is expected. + +```{image} argentina/vendor-bill-document-number.png +:align: center +:alt: Vendor bill document number. +``` + +The vendor bill number is structured in the same way as the customer invoices, excepted that the +document sequence is entered by the user using the following format: *Document Prefix - Letter - +Document Number*. + +#### Validate vendor bill number in AFIP + +As most companies have internal controls to verify that the vendor bill is related to an AFIP valid +document, an automatic validation can be set in {menuselection}`Accounting --> Settings --> +Argentinean Localization --> Validate document in the AFIP`, considering the following levels: + +- {guilabel}`Not available:` the verification is not done (this is the default value); +- {guilabel}`Available:` the verification is done. In case the number is not valid, it only displays + a warning but still allows the vendor bill to be posted; +- {guilabel}`Required:` the verification is done, and it does not allow the user to post the vendor + bill if the document number is not valid. + +```{image} argentina/verify-vendor-bills.png +:align: center +:alt: Verify Vendor Bills validity in AFIP. +``` + +##### Validate vendor bills in Odoo + +With the vendor validation settings enabled, a new button shows up on the vendor bills inside of +Odoo, labeled {guilabel}`Verify on AFIP`, which is located next to the {guilabel}`AFIP +Authorization code` field. + +```{image} argentina/verify-on-afip.png +:align: center +:alt: Verify on AFIP. +``` + +In case the vendor bill cannot be validated in AFIP, a value of {guilabel}`Rejected` will be +displayed on the dashboard and the details of the invalidation will be added to the chatter. + +```{image} argentina/afip-auth-rejected.png +:align: center +:alt: AFIP authorization Rejected. +``` + +#### Special use cases + +##### Untaxed concepts + +There are some transactions that include items that are not a part of the VAT base amount, such as +fuel and gasoline invoices. + +The vendor bill will be registered using one item for each product that is part of the VAT base +amount, and an additional item to register the amount of the exempt concept. + +```{image} argentina/vat-exempt.png +:align: center +:alt: VAT exempt. +``` + +##### Perception taxes + +The vendor bill will be registered using one item for each product that is part of the VAT base +amount, and the perception tax can be added in any of the product lines. As a result, there will be +one tax group for the VAT and another for the perception. The perception default value is always +{guilabel}`0.10`. + +To edit the VAT perception and set the correct amount, you should use the {guilabel}`Pencil` icon +that is the next to the {guilabel}`Perception` amount. After the VAT perception amount has been set, +the invoice can then be validated. + +```{image} argentina/enter-perception-amount.png +:align: center +:alt: Enter the perception amount. +``` + +(l10n-ar-payment-withholdings)= + +### Withholding management + +The Argentinean fiscal localization module is already loaded with the necessary withholdings +records, which can be seen by navigating to {menuselection}`Accounting app --> Configuration --> +Taxes` and removing the default {guilabel}`Sale or Purchase` filter. To verify these records, the +**Argentina Payment Withholdings** (`l10n_ar_withholding`) module must be {ref}`installed +`: + +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. + +```{image} argentina/l10n-ar-outstanding-payments.png +:alt: An outstanding payment account must be set. +``` + +This configuration is crucial for the proper accounting of withholding transactions with clients +and vendors. + +:::{note} +In Argentina, withholdings represent the cancellation of a specific portion of the total debt +owed to a supplier or a reduction in the total payment to be collected from a customer. +Therefore, one or multiple withholdings can be recorded for each payment applied to an invoice. +::: + +#### Configuration + +While Odoo already creates most of the required withholdings inside the {guilabel}`Taxes` +menu, in several cases, it is necessary to apply or modify certain configurations to correctly +calculate the withholding amount on vendor payments. The following withholding types are available: + +- {ref}`Earnings ` +- {ref}`Earnings Scale ` +- {ref}`IIBB Total Amount ` +- {ref}`IIBB Non-Taxable ` + +(l10n-ar-earnings-withholdings)= + +##### Earnings + +For {guilabel}`Earnings` withholdings, Odoo already has a record for each regime group, which is +stated under the name of the tax and the AFIP code. + +Each of these records are ready to be used. As a good practice, the configuration should be double +checked to make sure the configuration is updated and well-applied. The fields to validate are: + +- {guilabel}`Amount`: This is the percentage of the total payment amount which is withheld. +- {guilabel}`Non-Taxable Amount`: Up to this amount, the withholding does not apply. +- {guilabel}`Minimum Withholding`: If the calculated withholding amount is smaller than this value, + the total withholding amount is set to `0.0`. +- {guilabel}`Withholding Sequence`: This field helps to automate the capture of a withholding number + under the payment line. If this field is not set, a number is manually captured while adding a + withholding to a payment. + +```{image} argentina/l10n-ar-earnings.png +:alt: Earnings withholding type. +``` + +(l10n-ar-earnings-scale-withholdings)= + +##### Earnings Scale + +In this particular case, a percentage does not need to be set. Instead, this withholding is +calculated based on the value of the {guilabel}`Scale` field. + +To view, modify, or create new scales, navigate to {menuselection}`Accounting app --> Configuration +--> Earnings Scale`. By default, the Argentinian localization is preconfigured with two main scales. +However, scales should be created and updated as necessary to suit a business's needs. + +:::{note} +Earnings scales are cumulative, which means that Odoo keeps track of the different records +created for a bill and automatically calculates the proper withholding amount. +::: + +(l10n-ar-iib-total-amount-withholdings)= + +##### IIBB Total Amount + +In this case, the necessary records related to the applicable province need to be created. The +withholding amount is calculated based on the percentage {guilabel}`Amount` set on the tax +configuration. Since Odoo does not automatically synchronize the percentages applicable to each +province, this information needs to be manually updated. + +The recommendation, in this case, is to always duplicate and apply the different configurations for +each record to safeguard any technical configurations that allow the proper calculation and +accounting of the withholding. + +(l10n-ar-iib-nontax-withholdings)= + +##### IIBB Untaxed + +The configuration of non-taxable gross income withholdings is very similar to that of a {ref}`total +amount withholding `, so the percentage {guilabel}`Amount` in +each of the records needs to be maintained. However, Odoo comes preconfigured with several records +that apply to different provinces. The difference, in this case, is that it is not necessary to +establish a non-taxable amount or minimum withholding for this record type. + +#### Partner withholding assignation + +Once the proper configuration is set on each possible withholding for partners, the applicable +withholdings need to be assigned to each contact. To do this, open the {guilabel}`Contacts` app and +select the desired partner. In the {guilabel}`Accounting` tab, find the {guilabel}`Purchase +Withholdings` table. + +By using the additional fields {guilabel}`From Date` and {guilabel}`To Date`, the applicability of +multiple withholdings can be automated across different date ranges. The {guilabel}`ref` field +allows you to apply an internal control number to each withholding line, which is just for internal +reference, so it does not affect any transactions and is not visible on them. These fields are +accessible from the {icon}`oi-settings-adjust` {guilabel}`(adjust settings)` menu. + +- {guilabel}`From Date`: the start of the withholding date range. +- {guilabel}`To Date`: the end of the withholding date range. +- {guilabel}`ref`: apply an internal control number to each withholding line that is only visible + for internal reference and does not affect any transactions. + +#### Automatic withholding calculation and application per payment + +By applying new payments to vendor bills, Odoo automatically applies and calculates the proper +withholding into the payment. Based on the record's configuration, it may be necessary to use a +reference number for each withholding line. + +More withholdings can be added, or computed withholdings can be edited if necessary. + +```{image} argentina/l10n-ar-payment.png +:alt: Payment with applied withholdings. +``` + +:::{important} +The total amount of the debt to be canceled is the total amount of the payment. However, Odoo +still captures the net amount (i.e. the amount to be reconciled with the bank), which will be +represented as the payment amount after the withholding application. + +```{image} argentina/l10n-ar-payment-registered.png +:alt: Payment registered form. +``` +::: + +### Check management + +To install the *Third Party and Deferred/Electronic Checks Management* module, go to +{menuselection}`Apps` and search for the module by its technical name `l10n_latam_check` and click +the {guilabel}`Activate` button. + +```{image} argentina/l10n-latam-check-module.png +:align: center +:alt: l10n_latam_check module. +``` + +This module enables the required configuration for journals and payments to: + +- Create, manage, and control your different types of checks +- Optimize the management of *own checks* and *third party checks* +- Have an easy and effective way to manage expiration dates from your own and third party checks + +Once all the configurations are made for the Argentinian electronic invoice flow, it is also needed +to complete certain configurations for the own checks and the third party checks flows. + +#### Own checks + +Configure the bank journal used to create your own checks by going to {menuselection}`Accounting --> +Configuration --> Journals`, selecting the bank journal, and opening the {guilabel}`Outgoing +Payments` tab. + +- {guilabel}`Checks` should be available as a {guilabel}`Payment Method`. If not, click + {guilabel}`Add a line` and type `Checks` under {guilabel}`Payment Method` to add them +- Enable the {guilabel}`Use electronic and deferred checks` setting. + +:::{note} +This last configuration **disables** the printing ability but enables to: + +- Enter check numbers manually +- Adds a field to allocate the payment date of the check +::: + +```{image} argentina/bank-journal-conf.png +:align: center +:alt: Bank journal configurations. +``` + +##### Management of own checks + +Own checks can be created directly from the vendor bill. For this process, click on the +{guilabel}`Register Payment` button. + +On the payment registration modal, select the bank journal from which the payment is to be made and +set the {guilabel}`Check Cash-In Date`, and the {guilabel}`Amount`. + +```{image} argentina/payment-popup-vendorbill.png +:align: center +:alt: Payment pop-up window with own check options enabled. +``` + +:::{note} +To manage current checks, the {guilabel}`Check Cash-In Date` field must be left blank or filled +in with the current date. To manage deferred checks, the {guilabel}`Check Cash-In Date` must be +set in the future. +::: + +To manage your existing own checks, navigate to {menuselection}`Accounting --> Vendors --> Own +Checks`. This window shows critical information such as the dates when checks need to be paid, the +total quantity of checks, and the total amount paid in checks. + +```{image} argentina/checks-menu-vendorbill.png +:align: center +:alt: Own checks menu location. +``` + +It is important to note that the list is pre-filtered by checks that are still *not reconciled* with +a bank statement - that were not yet debited from the bank - which can be verified with the +{guilabel}`Is Matched with a Bank Statement` field. If you want to see all of your own checks, +delete the {guilabel}`No Bank Matching` filter by clicking on the {guilabel}`X` symbol. + +```{image} argentina/check-menu-list-vendorbill.png +:align: center +:alt: Own checks menu organization and filtering. +``` + +##### Cancel an own check + +To cancel an own check created in Odoo, navigate to {menuselection}`Accounting --> Vendors --> Own +Checks` and select the check to be cancelled, then click on the {guilabel}`Void Check` button. This +will break the reconciliation with the vendor bills and the bank statements and leave the check in a +**cancelled** state. + +```{image} argentina/empty-check-button.png +:align: center +:alt: Empty Check button to cancel Own Checks +``` + +#### Third party checks + +In order to register payments using third party checks, two specific journals need to be configured. +To do so, navigate to {menuselection}`Accounting --> Configuration --> Journals` and create two new +journals: + +- `Third Party Checks` +- `Rejected Third Party Checks` + +:::{note} +You can manually create more journals if you have multiple points of sale and need journals for +those. +::: + +To create the *Third Party Checks* journal, click the {guilabel}`New` button and configure the +following: + +- Type `Third Party Checks` as the {guilabel}`Journal Name` +- Select {guilabel}`Cash` as {guilabel}`Type` +- In the {guilabel}`Journal Entries` tab, set {guilabel}`Cash Account`: to `1.1.1.02.010 Cheques de + Terceros`, input a {guilabel}`Short Code` of your choice, and select a {guilabel}`Currency` + +```{image} argentina/auto-cash-account.png +:align: center +:alt: Automatically created cash account. +``` + +The available payment methods are listed in the *payments* tabs: + +- For new incoming third party checks, go to {menuselection}`Incoming Payments tab --> Add a line` + and select {guilabel}`New Third Party Checks`. This method is used to create *new* third party + checks. +- For incoming and outgoing existing third party checks, go to {menuselection}`Incoming Payments tab + --> Add a line` and select {guilabel}`Existing Third Party Checks`. Repeat the same step for the + {guilabel}`Outgoing Payments` tab. This method is used to receive and/or pay vendor bills using + already *existing* checks, as well as for internal transfers. + +:::{tip} +You can delete pre-existing payment methods appearing by default when configuring the third +party checks journals. +::: + +```{image} argentina/auto-payment-methods.png +:align: center +:alt: Payment methods automatically created. +``` + +The *Rejected Third Party Checks* journal also needs to be created and/or configured. This journal +is used to manage rejected third party checks and can be utilized to send checks rejected at the +moment of collection or when coming from vendors when rejected. + +To create the *Rejected Third Party Checks* journal, click the {guilabel}`New` button and configure +the following: + +- Type `Rejected Third Party Checks` as the {guilabel}`Journal Name` +- Select {guilabel}`Cash` as {guilabel}`Type` +- In the {guilabel}`Journal Entries` tab, set {guilabel}`Cash Account`: to `1.1.1.01.002 Rejected + Third Party Checks`, input a {guilabel}`Short Code` of your choice, and select a + {guilabel}`Currency` + +Use the same payment methods as the *Third Party Checks* journal. + +##### New third party checks + +To register a *new* third party check for a customer invoice, click the {guilabel}`Register Payment` +button. In the pop-up window, you must select {guilabel}`Third Party Checks` as journal for the +payment registration. + +Select {guilabel}`New Third Party Checks` as {guilabel}`Payment Method`, and fill in the +{guilabel}`Check Number`, {guilabel}`Payment Date`, and {guilabel}`Check Bank`. Optionally, you can +manually add the {guilabel}`Check Issuer Vat`, but this is automatically filled by the customer's +VAT number related to the invoice. + +```{image} argentina/third-party-payment-popup.png +:align: center +:alt: Payment pop-up window with New Third Party Check options enabled. +``` + +##### Existing third party checks + +To pay a vendor bill with an *existing* check, click the {guilabel}`Register Payment` button. In the +pop-up window, you must select {guilabel}`Third Party Checks` as journal for the payment +registration. + +Select {guilabel}`Existing Third Party Checks` as {guilabel}`Payment Method`, and select a check +from the {guilabel}`Check` field. The field shows all **available existing checks** to be used as +payment for vendor bills. + +```{image} argentina/existing-third-party-popup.png +:align: center +:alt: Payment pop-up window with Existing Third Party Check options enabled. +``` + +When an **existing third party check** is used, you can review the operations related to it. For +example, you can see if a third party check made to pay a customer invoice was later used as an +existing third party check to pay a vendor bill. + +To do so, either go to {menuselection}`Accounting --> Customers --> Third Party Checks` or +{menuselection}`Accounting --> Vendors --> Own Checks` depending on the case, and click on a check. +In the {guilabel}`Check Current Journal` field, click on {guilabel}`=> Check Operations` to bring up +the check's history and movements. + +```{image} argentina/check-operations-menulist.png +:align: center +:alt: Check Operations menu. +``` + +The menu also displays critical information related to these operations, such as: + +- The {guilabel}`Payment Type`, allowing to classify whether it is a payment *sent* to a vendor or a + payment *received* from a customer +- The {guilabel}`Journal` in which the check is currently registered +- The **partner** associated with the operation (either customer or vendor). + +(argentina-ecommerce-electronic-invoicing)= + +### Ecommerce electronic invoicing + +{ref}`Install ` the *Argentinian eCommerce* (`l10n_ar_website_sale`) module to +enable the following features and configurations: + +- Clients being able to create online accounts for eCommerce purposes. +- Support for required fiscal fields in the eCommerce application. +- Receive payments for sale orders online. +- Generate electronic documents from the eCommerce application. + +#### Configuration + +Once all of the configurations are made for the Argentinian {ref}`electronic invoice +` flow, it is also necessary to complete certain configurations to +integrate the eCommerce flow. + +##### Client account registration + +To configure your website for client accounts, follow the instructions in the {doc}`checkout +<../../websites/ecommerce/checkout_payment_shipping/checkout>` documentation. + +##### Automatic invoice + +Configure your website to generate electronic documents in the sales process by navigating to +{menuselection}`Website --> Configuration --> Settings` and activating the {guilabel}`Automatic +Invoice` feature in the {guilabel}`Invoicing` section to automatically generate the required +electronic documents when the online payment is confirmed. + +```{image} argentina/l10nar-automatic-invoicing-ecommerce.png +:align: center +:alt: Feature activated to invoice automatically. +``` + +Since an online payment needs to be confirmed for the {guilabel}`Automatic Invoice` feature to +generate the document, a {doc}`payment provider <../payment_providers>` **must** be configured for +the related website. + +##### Products + +To allow your products to be invoiced when an online payment is confirmed, navigate to the desired +product from {menuselection}`Website --> eCommerce --> Products`. In the {guilabel}`General +Information` tab, set the {guilabel}`Invoicing Policy` to {guilabel}`Ordered quantities` and define +the desired {guilabel}`Customer Taxes`. + +#### Invoicing flow for eCommerce + +Once the configurations mentioned above are all set, clients can complete the following required +steps in the *Argentinian eCommerce* flow to input fiscal fields in the checkout process. + +Fiscal fields are available for input in the checkout process once the {guilabel}`Country` field is +set as `Argentina`. Inputting the fiscal data enables the purchase to conclude in the corresponding +electronic document. + +```{image} argentina/l10nar-fiscal-fields-ar-ecommerce.png +:align: center +:alt: Fiscal required fields for electronic invoicing. +``` + +When the client makes a successful purchase and payment, the necessary invoice is generated with +the corresponding layout and fiscal stamps stated in the {ref}`Invoice printed report +`. + +:::{seealso} +{doc}`Client account creation <../../websites/ecommerce/checkout_payment_shipping/checkout>` +::: + +### Liquidity product direct sales + +Liquidity product direct sales are used for sales involving third parties. For such +sales, the seller and the proprietary company of the goods can each register their corresponding +sales and purchases. + +:::{note} +{ref}`Install ` the *Argentinian Electronic Invoicing* module (`l10n_ar_edi`) to +use this feature. +::: + +#### Configuration + +##### Purchase journal + +A purchase journal is needed to generate an electronic vendor bill with a document type *Liquidity +Product*. This journal needs to be synchronized with the AFIP as it will be used to generate the +liquidity product electronic document. + +To modify the existing purchase journal or create a new one, navigate to {menuselection}`Accounting +--> Configuration --> Journals`. Then, select the existing purchase journal or click the +{guilabel}`New` button, and fill in the following required information: + +- {guilabel}`Type`: select {guilabel}`Purchase`. +- {guilabel}`Use Documents`: check this field to to be able select the electronic document type. +- {guilabel}`Is AFIP POS`: check this field to be able to generate electronic documents. +- {guilabel}`AFIP POS System`: select {guilabel}`Electronic Invoice - Web Service` from the + drop-down menu in order to send the electronic document to AFIP via web service. +- {guilabel}`AFIP POS Number`: is the number configured in the AFIP to identify the operations + related to this AFIP POS. +- {guilabel}`AFIP POS Address`: is the field related to the commercial address registered for the + POS, which is usually the same address as the company. For example, if a company has multiple + stores (fiscal locations) then the AFIP will require the company to have one AFIP POS per + location. This location will be printed in the invoice report. + +```{image} argentina/l10n-ar-purchase-journal.png +:align: center +:alt: l10n_ar Purchase Journal Configuration. +``` + +##### Sales journal + +A sales journal is needed to register the invoice when a product is sold to a third party that will +then sell the same product. This journal will not be synced with AFIP as the invoice will not be +electronic. + +To modify the existing sales journal or create a new one, navigate to +{menuselection}`Accounting --> Configuration --> Journals`. Then, selecting the sales journal or +click the {guilabel}`New` button, and fill in the following required information: + +- {guilabel}`Type`: select {guilabel}`Sales`. +- {guilabel}`Use Documents`: check this field on the journal to select the electronic document type + (in this case the electronic invoice). + +```{image} argentina/l10n-ar-sales-journal.png +:align: center +:alt: l10n_ar Sales Journal Configuration. +``` + +#### Invoicing flow + +Once the configurations are all set, the *Liquidity Product Vendor Bill* will be generated by the +company that is selling the product on behalf of another party. For example, a distributor of a +specific product. + +## Reports + +As part of the localization installation, financial reporting for Argentina is available in the +{guilabel}`Accounting` dashboard. To access these reports, navigate to {menuselection}`Accounting +--> Reporting --> Argentinean Statements`. + +To access the VAT book report, go to {menuselection}`Accounting --> Reporting --> Tax Report`, click +the {icon}`fa-book` ({guilabel}`book`), and select {guilabel}`Argentinean VAT book (AR)`. + +:::{note} +The VAT book report can be exported as a `.zip` file by selecting it in the dropdown menu in the +top-left corner. +::: + +### VAT summary + +This pivot table is designed to check the monthly VAT totals. This report is for internal use and is +not sent to the AFIP. + +### IIBB - Sales by jurisdiction + +This pivot table allows you to validate the gross income in each jurisdiction. It serves as an +affidavit for the corresponding taxes due but is not submitted to the AFIP. + +```{image} argentina/iibb-sales-jurisdiction.png +:alt: IIBB Sales by jurisdiction. +``` + +### IIBB - Purchases by jurisdiction + +This pivot table allows you to validate the gross purchases in each jurisdiction. It serves as an +affidavit for the corresponding taxes due but is not submitted to the AFIP. + +```{image} argentina/iibb-purchases-jurisdiction.png +:alt: IIBB Purchases by jurisdiction. +``` + diff --git a/content/applications/finance/fiscal_localizations/australia.md b/content/applications/finance/fiscal_localizations/australia.md new file mode 100644 index 000000000..23bb68e5b --- /dev/null +++ b/content/applications/finance/fiscal_localizations/australia.md @@ -0,0 +1,1448 @@ +# Australia + +## Modules + +```{eval-rst} +.. list-table:: + :widths: 25 25 50 + :header-rows: 1 + + * - Name + - Technical name + - Description + * - :guilabel:`Australia - Accounting` + - `l10n_au` + - The base :ref:`accounting ` module for the Australian localization. It + is installed automatically when the :guilabel:`Australia` :ref:`fiscal localization package + ` is selected. This module also installs the :ref:`ABA Credit + Transfer ` module. + * - :guilabel:`Australian Reports - Accounting` + - `l10n_au_reports` + - Adds the :ref:`Taxable Payments Annual Report (TPAR) ` and the :ref:`Business + Activity Statement (BAS) ` report. It is installed automatically when the + :guilabel:`Australia` :ref:`fiscal localization package ` is + selected. + * - :guilabel:`Australia - Payroll` + - `l10n_au_hr_payroll` + - The base :ref:`payroll ` module for the Australian localization. + * - :guilabel:`Australia - Payroll with Accounting` + - `l10n_au_hr_payroll_account` + - Contains the necessary accounting data for the Australian payroll rules. It is installed + automatically when the :ref:`Payroll Entries option ` is enabled. + * - :guilabel:`Employment Hero Payroll` + - `l10n_employment_hero` + - Synchronizes all pay runs from :ref:`Employment Hero ` + with Odoo's journal entries. +``` + +(australia-accounting)= + +## Accounting + +### Taxes and GST + +In Australia, the standard **Goods and Services Tax (GST)** rate is 10%, but different rates and +exemptions exist for specific categories of goods and services. + +```{image} australia/default-taxes.png +:alt: Default GST rates +``` + +:::{note} +The taxes impact the {ref}`BAS report `. +::: + +#### Tax mapping + +Within the Australian localization, tax names encompass the tax rate as an integral part of their +naming convention. Despite the high number of {doc}`taxes <../accounting/taxes>` configured in Odoo, +their rates are often similar (0% or 10%). + +##### GST sales taxes + +The **GST sales** taxes available in Odoo are listed below. + +```{eval-rst} +.. list-table:: + :widths: 20 50 30 + :header-rows: 1 + + * - GST name + - Description + - Label on invoices + * - 10% GST + - GST Sales + - 10% GST + * - 0% EX + - GST Free on Export Sales + - 0% GST Free + * - 0% F + - GST Free Sales + - 0% Exempt + * - 0% INP + - Input Taxed Sales + - 0% Input Taxed Sales + * - 100% Adj + - This is for adjustment, amounts can be modified to fit your needs + - Tax Adjustments (Sales) +``` + +##### GST purchase taxes + +The **GST purchase** taxes available in Odoo are listed below. + +```{eval-rst} +.. list-table:: + :widths: 20 50 30 + :header-rows: 1 + + * - GST name + - Description + - Label on invoices + * - 10% GST + - GST Purchases + - 10% GST + * - 10% C + - Capital Purchases + - 10% Capital Purchases + * - 10% INP + - Purchases for Input Taxed Sales + - 10% Purchases for Input Taxed Sales + * - 10% PRIV + - Purchases for private use or not deductible + - 10% Purchases for Private Use + * - 0% F + - GST Free Purchases + - 0% GST Free + * - 0% TPS + - Purchase (Taxable Imports) - Tax Paid Separately + - 0% GST Paid Separately + * - 100% ONLY + - GST Only on Imports + - GST Only on Imports + * - 100% Adj + - Tax Adjustments (Purchases) + - Tax Adjustments (Purchases) + * - 100% DGST + - Deferred GST Liability + - 100% DGST + * - No ABN + - Tax Withheld for Partners without ABN + - Withholding Tax for No ABN + * - PAYGW - W3 + - Other amounts withheld (excluding any amount shown at W2 or W4) + - Other Amounts Withheld (W3) +``` + +###### Variants + +Businesses from certain industries need to report payments made to subcontractors from relevant +services during the financial year. Odoo combines the use of taxes and fiscal positions to report +these payments on the {ref}`TPAR `. In order to be compliant with the TPAR's +obligations, two variants of the main purchase taxes are available in Odoo, but they are inactive by +default. + +```{eval-rst} +.. example:: + + For the *10% GST* tax, the variants are: + + .. list-table:: + :widths: 20 40 20 20 + :header-rows: 1 + + * - Tax name + - Description + - Reports impacted + - Default status + * - 10% GST + - Default 10% GST tax + - BAS + - Active + * - 10% GST TPAR + - TPAR variant of the tax, if the contractor provided an ABN + - | BAS + | TPAR + - Inactive + * - 10% GST TPAR NO ABN + - TPAR variant of the tax, if the contractor did not provide an ABN + - | BAS + | TPAR + - Inactive +``` + +#### Deferred GST + +Odoo allows companies under the [Deferred Goods and Services Tax (DGST) scheme](https://www.ato.gov.au/businesses-and-organisations/gst-excise-and-indirect-taxes/gst/in-detail/rules-for-specific-transactions/international-transactions/deferred-gst?=redirected_deferredGSTscheme) +to automate their deferred GST flows. + +##### Configuration + +It is recommended to: + +- go to {menuselection}`Accounting --> Configuration --> Settings` and set the {guilabel}`Tax Return + Periodicity` to {guilabel}`monthly` (= monthly BAS); and +- create a new journal to store all deferred GST entries by going to {menuselection}`Accounting + --> Configuration --> Journals --> New`, and selecting {guilabel}`Miscellaneous` as its + {guilabel}`Type` when configuring it. + +By default, a tax (*100% DGST*, inactive by default) and an account (*21340 Deferred GST Liability*) +are available for Australian companies. Activate the tax by going to {menuselection}`Accounting --> +Configuration --> Taxes`. Search for the {guilabel}`Name` `100% DGST` (remove the default filter if +necessary), and click the {guilabel}`Activate` toggle switch. + +##### Flow + +###### 1. Importing goods: purchase order and vendor bill + +When importing goods from abroad, the GST liability can now be deferred for companies under the DGST +scheme. On the purchase order, select the {guilabel}`0% TPS` tax (tax paid separately) for the +relevant order lines. + +```{image} australia/dgst-po-tax.png +:alt: Setting the 0% TPS tax on a purchase order +``` + +###### 2. Recording the DGST balance on the BAS report + +When the Australian Taxation Office (ATO) is advised electronically of the aggregated liability for +the company by the Integrated Cargo System (ICS), the GST balance deferred during the previous month +becomes available on the ATO's BAS portal. + +:::{important} +Odoo does not yet fetch the DGST balance automatically from the ATO. A manual entry with the +liability amount needs to be created in Odoo. We recommend using a new journal for this purpose +since deferrals will be recurring. +::: + +Go to {menuselection}`Accounting --> Journal Entries --> New`. On the first journal item line, add +the {guilabel}`Account` `21340 Deferred GST Liability` and the deferred GST balance as a +{guilabel}`Credit`. To resume the example shown above, we credit \$2,000 and save. + +```{image} australia/dgst-balance-credit.png +:alt: Creating a journal entry with the DGST account +``` + +An auto-balancing line is created, along with journal items correctly assigning the right values in +the BAS {guilabel}`Tax Grids`. Sections *G11*, *G18*, *7A*, and *ONLY* are updated correctly. + +```{image} australia/dgst-tax-grids.png +:alt: The journal entry with the auto-balancing line and BAS tax grids +``` + +After posting the journal entry, the BAS report displays the correct values for each section, along +with the DGST offset. + +### Reports + +(australia-bas)= + +#### Business Activity Statement (BAS) + +The **BAS report** is a critical tax reporting requirement for businesses registered for GST in +Australia. The BAS is used to report and remit various taxes to the ATO. With the Odoo BAS feature, +businesses can report on the following: + +- GST +- PAYG tax withheld +- DGST + +Access the report from the Accounting dashboard by clicking {guilabel}`BAS Report (AU)` under the +{guilabel}`Miscellaneous Operations` section. + +```{image} australia/bas-report.png +:alt: BAS report example +``` + +The base and tax amounts are collected from the **tax grid**, which is pre-configured in the system. +The tax grid can also be manually set up for any additional special use-case of GST (e.g., wine +equalization tax). Once the tax for each account is set up, the system automatically slots journal +items into the correct tax category. This ensures the BAS report is accurate and reflective of the +business's financial activities. + +```{image} australia/gst-grids.png +:alt: GST grids example +``` + +Besides the GST sections, the BAS report also includes the **PAYG** tax withheld components (*W1* to +*W5*, then *summary, section 4*). This integration ensures that all payroll-related withholding +taxes are accurately captured and reflected within the report. + +```{image} australia/payg.png +:alt: PAYG tax withheld and summary of BAS report example +``` + +The module incorporates built-in rules that facilitate the automatic calculation of taxes for types +W1 to W5. For a detailed walkthrough and more information on the calculation process for these +taxes, refer to the {ref}`Payroll section `. + +##### Closing + +When it is time to file the tax return with the ATO, click {guilabel}`Closing Entry`. The tax return +period can be configured under {menuselection}`Accounting --> Configuration --> Settings --> Tax +Return Periodicity`. The start date of the tax return period can also be defined on the report +itself through the period button ({icon}`fa-calendar` *period* *year*). + +:::{seealso} +{doc}`Year-end closing <../accounting/reporting/year_end>` +::: + +:::{note} +Odoo uses calendar quarters rather than the Australian FY quarters, which means *July to +September* is *Q3* in Odoo. +::: + +Before closing the entry for the first time, the default **GST payable account** and **GST +receivable account** need to be set. A notification pops up and redirects the user to the tax groups +configuration. + +```{image} australia/bas-accounts.png +:alt: BAS report tax groups +``` + +Once the GST payable and GST receivable accounts are set up, the BAS report generates an accurate +journal closing entry automatically, which balances out the GST balance with the GST clearing +account. + +The balance between GST receivable and payable is set against the tax clearing account defined on +the tax group. The amount to be paid to or received from the ATO can be reconciled against a bank +statement. + +```{image} australia/bas-taxes.png +:alt: BAS report tax payment +``` + +:::{important} +The BAS report is not directly submitted to the ATO. Odoo helps you automatically compute the +necessary values in each section, with the possibility to audit them to better understand the +history behind these numbers. Businesses can copy these values and enter them on the [ATO portal](https://www.ato.gov.au/businesses-and-organisations/preparing-lodging-and-paying/business-activity-statements-bas/how-to-lodge-your-bas). +::: + +(australia-tpar)= + +#### Taxable Payments Annual Report (TPAR) + +Odoo allows businesses to report payments made to contractors or subcontractors during the financial +year. This is done by generating a **TPAR**. If you are unsure your business needs this report, +refer to the [ATO's TPAR web page](https://www.ato.gov.au/businesses-and-organisations/preparing-lodging-and-paying/reports-and-returns/taxable-payments-annual-report). + +Access the TPAR in Odoo by going to {menuselection}`Accounting --> Reporting --> Taxable Payments +Annual Reports (TPAR)`. + +##### Configuration + +First, it is required to assign fiscal positions to your contractors before billing them to update +the TPAR. To do so, go to {menuselection}`Accounting --> Vendors --> Vendors`, select a contractor, +and set a {guilabel}`Fiscal Position` under the {guilabel}`Sales & Purchase` tab. + +```{image} australia/tpar-fiscal-positions.png +:alt: TPAR fiscal position on a vendor +``` + +Based on the chosen fiscal position, the correct tax mapping will apply to the contractor's vendor +bills. + +```{image} australia/tpar-vendor-bill-tax.png +:alt: TPAR vendor bill tax mapping +``` + +The TPAR includes the following information from contractors: + +- {guilabel}`ABN` +- {guilabel}`Total GST` (the total tax paid) +- {guilabel}`Gross Paid` (the amounts are displayed after a vendor bill has been marked as paid) +- {guilabel}`Tax Withheld` (displayed if the contractor is registered with a fiscal position set to + {guilabel}`TPAR without ABN`) + +The TPAR can be exported to multiple formats: PDF, XLSX, and TPAR. + +(australia-remittance)= + +### Remittance advice + +A remittance advice is a document used as proof of payment to a business. In Odoo, it can be +accessed by going to {menuselection}`Accounting --> Vendors --> Payments`, selecting the payment(s), +and clicking {menuselection}`Print --> Payment Receipt`. + +```{image} australia/remittance.png +:alt: Remittance advice example +``` + +(australia-peppol)= + +### E-invoicing + +#### Peppol + +Odoo is compliant with Australia's [Peppol requirements](https://peppol.org/learn-more/country-profiles/australia/). Set up your customers and vendors +by going to {menuselection}`Accounting --> Customers --> Customers` or {menuselection}`Vendors --> +Vendors`, selecting one, clicking the {guilabel}`Accounting` tab, and configuring the +{guilabel}`Electronic Invoicing` section as needed. + +```{image} australia/partner-einvoicing.png +:alt: Electronic invoicing settings for a partner +``` + +:::{important} +Validating an invoice or credit note for a partner on the Peppol network will download a +compliant XML file that can be manually uploaded to your Peppol network. Odoo is currently in the +process of becoming an access point for the ANZ region. +::: + +(australia-aba)= + +### ABA files for batch payments + +An ABA file is a digital format developed by the [Australian Banking Association](https://www.ausbanking.org.au/). It is designed for business customers to facilitate bulk payment +processing by uploading a single file from their business management software. + +The main advantage of using ABA files is to improve payment and matching efficiency. This is +achieved by consolidating numerous payments into one file for batch processing, which can be +submitted to all Australian banks. + +#### Configuration + +##### Batch payments + +Go to {menuselection}`Accounting --> Configuration --> Settings` and enable {guilabel}`Batch +Payments`. + +##### Bank journal + +Go to {menuselection}`Accounting --> Configuration --> Journals` and select the {guilabel}`Bank` +journal. Enter the {guilabel}`Account Number`, click {guilabel}`Create and edit...`, and fill in the +following fields: + +- {guilabel}`Bank` +- {guilabel}`BSB` +- {guilabel}`Account Holder` + +Then, toggle on the {guilabel}`Send Money` switch and click {guilabel}`Save & Close`. + +:::{note} +Using the {guilabel}`Currency` field is optional. +::: + +Back on the {guilabel}`Journal Entries` tab, fill in the following fields under the {guilabel}`ABA` +section: + +- {guilabel}`BSB`: the BSB code from the bank account is used to fill in this field. +- {guilabel}`Financial Institution Code`: the official 3-letter abbreviation of the bank (e.g., + `WBC` for Westpac) +- {guilabel}`Supplying User Name`: 6-digit number provided by the bank. Contact your bank or check + its website if you do not know it. +- {guilabel}`APCA Identification Number`: 6-digit number provided by the bank. Contact your bank or + check its website if you do not know it. +- {guilabel}`Include Self Balancing Transaction`: selecting this option adds an additional + : "self-balancing" transaction to the end of the ABA file, which is required by some banks. + +##### Customers' and vendors' bank accounts + +Go to {menuselection}`Accounting --> Customers --> Customers` or {menuselection}`Accounting --> +Vendors --> Vendors` and select a customer or vendor. Open the {guilabel}`Accounting` tab, and, +under the {guilabel}`Bank Accounts` section, click {guilabel}`Add a line` to fill in their: + +- {guilabel}`Account Number` +- {guilabel}`Bank` +- {guilabel}`BSB` +- {guilabel}`Account Holder` + +Then, toggle on the {guilabel}`Send Money` switch and click {guilabel}`Save & Close`. + +#### Generating an ABA file + +To generate an ABA file, create a vendor bill, confirm it, and ensure the vendor's banking +information is set up correctly. + +Next, click {guilabel}`Pay` on the vendor bill, and select, for the following fields: + +- {guilabel}`Journal`: {guilabel}`Bank` +- {guilabel}`Payment Method`: {guilabel}`ABA Credit Transfer` +- {guilabel}`Recipient Bank Account`: the vendor's account number + +Once payments are created, go to {menuselection}`Accounting --> Vendors --> Payments`, select the +payments to be included in the batch, and click {guilabel}`Create Batch`. Verify all information is +correct and click {guilabel}`Validate`. Once validated, the ABA file is available in the **chatter** +on the right. + +After uploading the file to your bank's portal, an ABA transaction line will appear in your bank +feed at the following bank feed iteration. You will need to reconcile it against the **batch +payment** made in Odoo. + +## Industry-specific features + +### Starshipit shipping + +Starshipit is a shipping service operator that facilitates the integration of Australasian shipping +couriers with Odoo. Refer to the {doc}`Starshipit documentation +<../../inventory_and_mrp/inventory/shipping_receiving/setup_configuration/starshipit_shipping>` for +detailed information. + +:::{seealso} +[Starshipit Odoo webinar recording](https://www.youtube.com/watch?v=TcDWnoYLXWg) +::: + +(australia-buynow-paylater)= + +### Buy Now, Pay Later solutions + +*Buy Now, Pay Later* solutions are popular payment methods for eShops in Australia. Some of these +solutions are available via [Stripe](https://stripe.com/en-au/payments/payment-methods) and +[AsiaPay](https://www.asiapay.com.au/payment.html#option). + +:::{seealso} +- {doc}`Stripe payment provider <../payment_providers/stripe>` +- {doc}`AsiaPay payment provider <../payment_providers/asiapay>` +::: + +### POS terminals + +To establish a direct connection between Odoo and a POS terminal in Australia, a **Stripe** payment +terminal is required. Odoo supports the **EFTPOS** payment solution in Australia. + +:::{note} +A Stripe payment terminal is not required to use Odoo as the main POS system. However, without +one, cashiers must manually enter the final payment amount on the terminal. +::: + +:::{seealso} +- {doc}`Stripe payment provider <../payment_providers/stripe>` +- {doc}`Stripe payment terminal <../../sales/point_of_sale/payment_methods/terminals/stripe>` +- [Stripe.com terminal documentation](https://stripe.com/docs/terminal) +::: + +(australia-payroll)= + +## Payroll + +:::{important} +Odoo is currently in the process of becoming compliant with STP Phase 2 and SuperStream. An +announcement will be made as soon as companies can use Odoo for payroll as a one-stop platform. +::: + +### Setting up employees + +#### Employee settings + +Create an employee by going to {menuselection}`Employees --> New`. Go to the {guilabel}`Settings` +tab, and configure the {guilabel}`Australian Payroll` section, for example checking if they are +{guilabel}`Non-resident`, if they benefit from the {guilabel}`Tax-free Threshold`, their +{guilabel}`TFN Status`, {guilabel}`Employee Type`, etc. + +```{image} australia/payroll-employee-settings.png +:alt: Employee settings tab for the Australian payroll localization +``` + +#### Employee private information + +In addition, some personal employee information is required for payroll compliance with Single Touch +Payroll, and to process superannuation payments. Open the employee's {guilabel}`Private Information` +tab and fill in the following fields: + +- {guilabel}`Private Address` +- {guilabel}`Private Email` +- {guilabel}`Private Phone` +- {guilabel}`Date of Birth` + +```{image} australia/payroll-employee-private.png +:alt: Employee private information tab for the Australian payroll localization +``` + +:::{note} +Odoo will remind you to complete the required data at different stages of the process. +::: + +#### Super accounts and funds + +You can add the superannuation details of new employees under the employee's {guilabel}`Super +Accounts` tab. Click {guilabel}`Add a line` and make sure to include the {guilabel}`Member Since` +date, {guilabel}`Member Number`, and {guilabel}`Super Fund`. + +:::{tip} +Use the {guilabel}`Proportion` field if an employee's contributions should sent to multiple +funds at a time. +::: + +```{image} australia/payroll-super-account.png +:alt: Configuring a super fund and super account for the Australian payroll localization +``` + +To create a new {guilabel}`Super Fund`, start typing its name and click {guilabel}`Create and +edit...`. Fill in its: + +- {guilabel}`Address` +- {guilabel}`ABN` +- {guilabel}`Type` (APRA / SMSF) +- unique identifier ({guilabel}`USI` for APRA, {guilabel}`ESA` for SMSF) +- (for SMFS only) {guilabel}`Bank Account` + +```{image} australia/payroll-super-fund.png +:alt: Configuring a super fund for the Australian payroll localization +``` + +:::{tip} +Manage all super accounts and funds by going to {menuselection}`Payroll --> Configuration --> +Super Funds` or {menuselection}`Super Accounts`. +::: + +:::{important} +Odoo is currently in the process of becoming SuperStream-compliant. +::: + +#### Contracts + +Once the employee has been created, create their employment contract by clicking the {icon}`fa-book` +{guilabel}`Contracts` smart button, or by going to {menuselection}`Employees --> Employees --> +Contracts`. + +:::{note} +Only one contract can be active per employee at a time. However, an employee can be assigned +consecutive contracts during their employment. +::: + +##### Employment contract creation: recommended steps + +```{image} australia/payroll-contract-flow.png +:alt: Recommended steps to create an employment contract +``` + +###### 1. Basic contractual information + +- Select the {guilabel}`Contract Start Date` and {guilabel}`Working Schedule` (set, or flexible for + casual workers). +- Keep the {guilabel}`Salary Structure Type` set to {guilabel}`Australian Employee`. This structure + covers all of the ATO's tax schedules. + +(australia-payroll-work-entry-source)= + +- (if using the Attendances or Planning app) Select the {guilabel}`Work Entry Source` to define how + working hours and days are accounted for on the employee's payslip. + + - {guilabel}`Working Schedule`: work entries are automatically generated based on the employee's + working schedule, starting from the contract's start date. + + ```{eval-rst} + .. example:: + An employee works 38 hours a week, their contract begins on 01/01, today's date is 16/01, and + the user generates a pay run from 14/01 to 20/01. The working hours on the payslip will be + automatically calculated to be 38 hours (5 * 7.36 hours) if no unpaid leave is taken. + ``` + + - {guilabel}`Attendances`: the working schedule is ignored, and work entries are only generated + after clocking in and out of the Attendances app. Note that attendances can be imported. + + - {guilabel}`Planning`: the working schedule is ignored, and work entries are generated from + planning shifts in the Planning app. + + :::{important} + Timesheets do not impact work entries in Odoo. If you need to import your timesheets in Odoo, + import them by going to {menuselection}`Payroll --> Work Entries --> Work Entries` instead. + ::: + +###### 2. Salary Information tab + +- {guilabel}`Wage Type`: select {guilabel}`Fixed Wage` for full-time and part-time employees, and + {guilabel}`Hourly Wage` for casual workers. The latter allows you to add a {guilabel}`Casual + Loading` percentage. + + :::{note} + For hourly workers, the {guilabel}`Hourly Wage` field should exclude casual loading. + ::: + +- {guilabel}`Schedule Pay`: in Australia, only the following pay run frequencies are accepted: + {guilabel}`Daily`, {guilabel}`Weekly`, {guilabel}`Bi-weekly` (or fortnightly), + {guilabel}`Monthly`, and {guilabel}`Quarterly`. + +- {guilabel}`Wage` /*period*: assign a wage to the contract according to their pay frequency. On + payslips, the corresponding annual and hourly rates will be computed automatically. + +###### 3. Australia tab + +```{image} australia/payroll-contract-australia.png +:alt: Australia tab of a contract +``` + +- {guilabel}`General` + + - Add the {guilabel}`Regular Pay Day` if relevant. + - Enable {guilabel}`Report in BAS - W3` if you choose to add PAYG withholding amounts in BAS + section W3 instead of W2 (refer to the [ATO's web page on PAYG withholding](https://www.ato.gov.au/businesses-and-organisations/preparing-lodging-and-paying/business-activity-statements-bas/in-detail/instructions/payg-withholding-how-to-complete-your-activity-statement-labels#W3Otheramountswithheldexcludinganyamount) + for more information). + +- {guilabel}`Leave loading / workplace giving` + + - Define whether your employees are {guilabel}`Eligible for Leave Loading`. + - Set the {guilabel}`Workplace Giving Employee` amount in exchange for deductions. + - Set the {guilabel}`Salary Sacrificed Workplace Giving` amount (e.g., receiving a benefit instead + of a deduction). + +- {guilabel}`Super contributions` + + - Add the {guilabel}`Extra Negotiated Super %` on top of the *super guarantee*. + - Add the {guilabel}`Extra Compulsory Super %` as per industrial agreements or awards obligations. + +- {guilabel}`Salary sacrifice` + + - {guilabel}`Salary Sacrifice Superannuation` allows employees to sacrifice part of their salary + in favor of reportable employer superannuation contributions (RESC). + + - {guilabel}`Salary Sacrifice Other Benefits` allows them to sacrifice part of their salary + towards some other form of benefit (refer to the [ATO's web page on Salary sacrificing for + employees](https://www.ato.gov.au/individuals-and-families/jobs-and-employment-types/working-as-an-employee/salary-sacrificing-for-employees) + for more information). + + :::{note} + As of Odoo 18, salary sacrificing for other benefits currently does not impact fringe + benefits tax (FBT) reporting. + ::: + +(australia-payroll-salary-attachments)= + +###### 4. Salary attachments + +If the employee is to receive additional recurring payments every pay run, whether indefinitely or +for a set number of periods, click the {icon}`fa-book` {guilabel}`Salary Attachments` smart button +on the contract. Choose a {guilabel}`Type` and a {guilabel}`Description`. + +:::{note} +Around 32 recurring salary attachment types exist for Australia. These are mostly related to +allowances and child support. [Contact us](https://www.odoo.com/help) for more information as +to whether allowances from your industry can be covered. +::: + +###### 5. Run the contract + +```{image} australia/payroll-contract-run.png +:alt: Example of a running contract +``` + +Once all the information has been completed, change the contract stage from {guilabel}`New` to +{guilabel}`Running`. + +### Prepare pay runs + +#### Regular + +Pay runs are created by going to {menuselection}`Payroll --> Payslips --> Batches`. After clicking +{guilabel}`New`, enter a {guilabel}`Batch Name`, select a {guilabel}`Period`, and click +{guilabel}`Generate Payslips`. + +```{image} australia/payroll-payslips-generation.png +:alt: Steps to generate payslips +``` + +Employees on a pay run can be filtered down by {guilabel}`Department` and {guilabel}`Job Position`. +There is no limit to the amount of payslips that can be created in one batch. After clicking +{guilabel}`Generate`, one payslip is created per employee in the {guilabel}`Waiting` stage, in which +they can be reviewed and amended before validation. + +```{image} australia/payroll-waiting-payslips.png +:alt: Generated payslips in the waiting stage +``` + +On the payslip form view, there are two types of inputs: + +- {guilabel}`Worked days` are computed based on the {ref}`work entry source set on the employee's + contract `. {ref}`Work entries can be configured + ` according to different types: attendance, overtime, + Saturday rate, Sunday rate, public holiday rate, etc. +- {guilabel}`Other inputs` are individual payments or amounts of {ref}`different types + ` (allowances, lump sums, deductions, termination payments, + leaves, etc.) that have little to do with the hours worked during the current pay period. The + {ref}`previously configured salary attachments ` are simply + recurring other inputs attached to a contract. + +```{image} australia/payroll-payslips-inputs.png +:alt: Worked days and other inputs of a payslip +``` + +Under the {guilabel}`Salary Computation` tab, Odoo automatically computes payslip rules based on +employees, contracts, worked hours, other input types, and salary attachments. + +The salary structure *Australian Employee* has 35 payslip rules that automatically compute and +dynamically display according to the payslip inputs. + +```{eval-rst} +.. example:: + + .. image:: australia/payroll-payslip-salary.png + :alt: Salary computation tab of a payslip + + The following rules apply for that pay period in the above example: + + - :guilabel:`Basic Salary`: pre-sacrifice gross salary + - :guilabel:`Ordinary Time Earnings`: amount to which the super guarantee percentage needs to be + applied + - :guilabel:`Salary Sacrifice Total`: includes the $150 sacrificed to superannuation + - :guilabel:`Taxable Allowance Payments`: includes the $10 allowance (*cents per KM* in this + case) + - :guilabel:`Taxable Salary`: gross salary amount minus non-taxable amounts + - :guilabel:`Salary Withholding` and :guilabel:`Total Withholding`: amounts to be withheld from + the taxable salary + - :guilabel:`Net Salary`: the employee's net wage + - :guilabel:`Concessional Super Contribution`: in this scenario, the amount sacrificed to + superannuation, payable to the employee's super fund in addition to the super guarantee + - :guilabel:`Super Guarantee`: as of 01 July 2024, it is computed as 11.5% of the ordinary time + earnings amount +``` + +:::{note} +As of Odoo 18, the most recent tax schedule rates (2024-2025) have been updated for all salary +rules and computations. +::: + +#### Out-of-cycle + +In Australia, payslips created without a batch are considered to be *out-of-cycle* runs. Create them +by going to {menuselection}`Payroll --> Payslips --> Individual Payslips`. The same payslip rules +apply, but the way these payslips are submitted to the ATO in the frame of Single Touch Payroll +(STP) is slightly different. + +:::{important} +As of Odoo 18, adding an out-of-cycle payslip to an existing batch is **not** recommended. +::: + +### Finalise pay runs + +#### Validate payslips + +Once all payslip data is deemed correct, click {guilabel}`Create Draft Entry` on the payslip batch. +This can also be done payslip by payslip for control reasons. + +This has several impacts: + +- Marking the batch and its payslips as {guilabel}`Done`. +- Creating a draft accounting entry per payslip or one entry for the whole batch, depending on your + payroll settings. At this stage, accountants can post entries to affect the balance sheet, P&L + report, and BAS report. +- Preparing the STP submission (or payroll data to be filed to the ATO as part of STP compliance). + This needs to be performed by the {guilabel}`STP Responsible` user, defined under + {menuselection}`Payroll --> Configuration --> Settings`. +- Preparing super contribution lines as part of SuperStream compliance. This needs to be done by the + {guilabel}`HR Super Send` user selected under {menuselection}`Payroll --> Configuration --> + Settings`. + +```{image} australia/payroll-stp-record.png +:alt: Example of a draft payslip +``` + +#### Submit payroll data to the ATO + +:::{important} +Odoo is currently in the process of becoming compliant with STP Phase 2, and this step described +above does not submit data yet to the ATO. +::: + +As per ATO requirements, STP submission for a pay run needs to be done on or before the payday. For +this reason, submit your STP data to the ATO first before proceeding with payment. To do so, click +{guilabel}`Submit to ATO` on the payslip batch. + +On the STP record for this pay run, a few useful information is displayed: + +- a warning message if important information is missing, +- an automatically generated activity for the STP responsible user, and +- a summary of payslips contained in this pay run, auditable from this view. + +```{image} australia/payroll-stp-record.png +:alt: Example of an STP record +``` + +Once the STP record is ready to go, click {guilabel}`Submit to ATO`, then read and accept the +related terms and conditions. + +#### Pay employees + +Once the ATO submission is complete, you can proceed to pay your employees. To facilitate the +payment matching process, remember to post the payslip-related journal entries prior to validating a +payment. + +Although you may decide to pay your employees individually, we recommend creating a batch payment +from your payslip batch. To do so, click {guilabel}`Pay` on the payslip batch, and select +{guilabel}`ABA Credit Transfer` as the {guilabel}`Payment Method`. + +```{image} australia/payroll-payment-method.png +:alt: Selecting the payment method for a payslip batch +``` + +This has two impacts: + +- Marking the batch and its payslips as {guilabel}`Paid`. +- Creating a {guilabel}`Payment Batch` linked to the payslip batch. + +```{image} australia/payroll-paid-batch.png +:alt: Example of a paid batch of payslips +``` + +When receiving the bank statement in Odoo, you can now match the statement line with the batch +payment in one click. The payment is not reconciled against the payslip batch, and all individual +payslips. + +```{image} australia/payroll-reconciliation.png +:alt: Steps to reconcile a bank statement with a batch payment. +``` + +#### Impact on accounting + +Depending on the employee and contract configuration, the journal entry linked to a payslip will be +more or less exhaustive. + +```{eval-rst} +.. example:: + For instance, here is the journal entry generated by the employee Marcus Cook configured above. + + .. image:: australia/payroll-accounting-entry.png + :alt: Example of a journal entry for a payslip +``` + +Once posted, predefined accounts will impact the company's balance sheet (PAYGW, wages, and +superannuation liabilities) and profit & loss report (wages and superannuation expenses). In +addition, the employee's gross wage and PAYG withholding will update the BAS report for the relevant +period (see Tax Grid: W1 and W2). Accounts can be adjusted to the company's chart of accounts. + +```{image} australia/payroll-bas.png +:alt: Example of a BAS report PAYG tax witheld section +``` + +### Other payroll flows + +#### Paying super contributions + +:::{important} +Odoo has a partnership with a clearing house to process both superannuation payments and data to +the right funds in one click, via direct debit. Odoo is currently in the process of becoming +compliant with SuperStream, and an announcement will be made as soon as superannuation +contributions can be processed via Odoo's payroll solution. +::: + +Once a quarter (or more frequently, in preparation for [Payday Super](https://www.ato.gov.au/about-ato/new-legislation/in-detail/superannuation/payday-superannuation)), +you have to process superannuation payments to your employees' super funds. To do so, go to +{menuselection}`Payroll --> Reporting --> Super Contributions`. + +```{image} australia/payroll-superfile.png +:alt: Example of a super file +``` + +When ready to pay, add the {guilabel}`Bank Journal` that will be used to pay the super from, then +click {guilabel}`Lock` to prevent the contributions from subsequent payslips from being added to +that file. Instead, a new Super file will be created. + +Once the payment has been processed, it can be traced back to the Super file and matched with a bank +statement. + +```{image} australia/payroll-superfile-payment.png +:alt: Example of a super file payment +``` + +#### Terminating employees + +Employees can be terminated by going to {menuselection}`Payroll --> Reporting --> Terminate +Employee`. + +The following fields must be completed: + +- {guilabel}`Contract End Date`: once the termination is validated, this date will be added to the + contract automatically, and mark the contract as {guilabel}`Expired` when the date has been + reached. +- {guilabel}`Cessation Type Code`: a mandatory field for the ATO's STP reporting. +- {guilabel}`Termination Type`: the type of redundancy (genuine or non-genuine) affects the + computation of unused annual and long service leave withholding. + +```{image} australia/payroll-termination.png +:alt: Terminating the contract of an employee +``` + +The balance of unused annual leaves and long service leaves is displayed for reference. + +Confirming the termination creates an out-of-cycle payslip with the tag {guilabel}`final pay`. It +computes the worked days until the contract end date, in addition to the employee's unused annual +and long service leave entitlements. + +```{image} australia/payroll-termination-payslip.png +:alt: Example of an out-of-cycle payslip of a terminated employee +``` + +Odoo automatically computes unused leave entitlements based on the employee's current hourly rate +leave loading (for annual leaves only), and the remaining leave balance. However, these amounts can +be manually edited in the {guilabel}`Other Inputs` table if necessary. + +Employment Termination Payments (ETP) can also be added to the {guilabel}`Other Inputs` table. Odoo +has a comprehensive list of excluded and non-excluded ETPs for companies to select from. + +```{image} australia/payroll-termination-etp.png +:alt: Adding employment termination payments +``` + +:::{note} +Withholding for unused leaves and ETPs is computed according to the ATO's [Schedule 7](https://www.ato.gov.au/tax-rates-and-codes/payg-withholding-schedule-7-tax-table-for-unused-leave-payments-on-termination-of-employment) +and [Schedule 11](https://www.ato.gov.au/tax-rates-and-codes/payg-withholding-schedule-11-tax-table-for-employment-termination-payments) +and updated as of 01 July 2024. +::: + +:::{tip} +Once an employee has been terminated and the last detailed of their employment resolved, you can +archive the employee by clicking the {icon}`fa-cog` ({guilabel}`Actions`) icon, then +{icon}`oi-archive` {guilabel}`Archive` on the employee's form view. +::: + +#### Switching from another STP software to Odoo + +When switching from another STP-enabled software to Odoo, you might need to maintain the continuity +in the YTD values of your employees. Odoo allows importing employees' YTD values by going to +{menuselection}`Payroll --> Configuration --> Settings` and clicking {guilabel}`Import YTD +Balances`. + +```{image} australia/payroll-ytd-button.png +:alt: Import YTD balances button +``` + +For the ATO to recognize the employee records of your previous software and keep a continuity in +Odoo, you must enter the: + +- {guilabel}`Previous BMS ID` (one per database) +- {guilabel}`Previous Payroll ID` (one per employee) + +Ask your previous software provider if you cannot find its BMS ID or your employees' payroll IDs. + +```{image} australia/payroll-ytd-import.png +:alt: Importing YTD balances +``` + +This will give you the opportunity to add your employees' YTD opening balances in the current +fiscal year. The ATO reports on a lot of different types of YTD. These are represented by the 13 +following {guilabel}`Salary Rules` in Odoo. + +```{image} australia/payroll-ytd-salary-rules.png +:alt: Salary rules for an employee +``` + +```{eval-rst} +.. example:: + Let us say that the employee Marcus Cook has been transitioned from another STP-enabled software + on September 1. Marcus has received two monthly payslips in his previous software (for July and + August). Here are the YTD balances Marcus's company needs to transfer to Odoo: + + .. list-table:: + :header-rows: 1 + + * - YTD category + - YTD balance to transfer + * - Gross (normal attendance) + - $13,045.45 + * - Gross (overtime) + - $1,000 + * - Paid leave + - $954.55 + * - Laundry allowance + - $200 + * - Total withholding + - $2,956 + * - Super Guarantee + - $1,610 +``` + +If some YTD balances need to be reported with more granularity to the ATO, you can use the salary +rule's inputs. + +```{eval-rst} +.. example:: + For instance, the *Basic Salary* rule can contain six inputs, and three are necessary in our + example: regular gross amounts, overtime, and paid leaves. These are all reported differently in + terms of YTD amounts. + + .. image:: australia/payroll-ytd-basic-rule.png + :alt: Adding YTD inputs + + The finalized YTD opening balances for Marcus Cook look like the following. + + .. image:: australia/payroll-ytd-final.png + :alt: Example of finalized YTD opening balances +``` + +As a result, YTD computations on payslips are based on the employee's opening balances instead of +starting from zero. + +#### STP finalisation + +:::{important} +Odoo is currently in the process of becoming compliant with STP Phase 2, and the finalisation +flows described below do not yet submit data to the ATO. +::: + +##### EOFY finalisation + +Employers reporting through STP must make a finalization declaration by 14 July each year. To do so, +go to {menuselection}`Payroll --> Reporting --> STP Finalisation`. + +```{image} australia/payroll-stp-eofy-finalisation.png +:alt: EOFY finalisation of an employee +``` + +Both active and terminated employees to finalise are displayed. + +```{image} australia/payroll-stp-eofy-list.png +:alt: List of employees to finalise +``` + +From the finalisation form view, you can proceed with a final audit of all employees' payslips +during the relevant financial year. Once ready, click {guilabel}`Submit to ATO`. When you have made +the finalisation declaration, employees will see the status of their payment information change to +{guilabel}`Tax ready` on their online income statement after the end of the financial year. + +##### Individual finalisation + +Odoo also allows you to finalise employees individually during the year. This can be useful when: + +- one-off payments are made after a first finalisation; and +- finalisation after termination of employment during the year. + +To proceed with an individual finalisation, go to {menuselection}`Payroll --> Reporting --> STP +Finalisation`, leave the {guilabel}`EOFY Declaration` checkbox unticked, and manually add employees +to be finalised. + +```{image} australia/payroll-stp-individual.png +:alt: Individual EOFY finalisation +``` + +Even if you finalise an employee record partway through the financial year, the ATO will not +pre-fill the information into the employee's tax return until after the end of the financial year. + +#### Adjustments + +:::{important} +Odoo is currently in the process of becoming compliant with STP Phase 2, and the adjustment flows +described below do not yet submit data to the ATO. +::: + +##### Amend finalisation + +If you need to amend YTD amounts for an employee after a finalisation declaration was made, it is +still possible to remove the finalisation indicator for that employee. To do so, go to +{menuselection}`Payroll --> Reporting --> STP Finalisation`, select the employee, and leave the +{guilabel}`Finalisation` checkbox unticked. + +```{image} australia/payroll-stp-amend.png +:alt: Amending YTD amounts for an employee +``` + +When ready, click {guilabel}`Submit to ATO` to file the finalisation update to the ATO. + +Once the correct YTD details are ready for that employee after amendment, finalise that employee +again. + +:::{note} +The ATO expects employers to correct errors within 14 days of detection or, if your pay cycle is +longer than 14 days (e.g., monthly), by the date you would be due to lodge the next regular pay +event. Finalisation amendments can be done through STP up to five years after the end of the +financial year. +::: + +Finalising and amending finalisation for a single employee can also be useful when rehiring an +employee within the same financial year. + +##### Full file replacements + +An employer can make full file replacements of pay runs to replace the last lodgement sent to the +ATO if it turns out to contain significantly inaccurate data. + +To do so, open the last STP submission and click {guilabel}`Replace File`. Then, select which +payslips need to be reset by ticking the {guilabel}`Reset Payslip` checkbox. + +```{image} australia/payroll-stp-reset-payslips.png +:alt: Replace file button +``` + +Resetting payslips does not create new payslips or a new pay run, but instead: + +- The payslips batch is reset from {guilabel}`Paid` or {guilabel}`Done` to {guilabel}`Confirmed`. +- The status of the reset payslips revert back to {guilabel}`Draft`. +- The correct payslips remain paid and matched against the original payment. +- A new STP submission is created to replace the former one. For traceability purposes, the former + STP submission is not deleted but marked as replaced. + +First, correct the reset payslips and create their draft entry. Once done, the {guilabel}`Submit to +ATO` reappears on the payslip batch to process the full file replacement. + +```{image} australia/payroll-stp-resubmit.png +:alt: Resubmitting a payslip batch +``` + +When ready, submit the pay run to the ATO once again. Please note that full file replacements are +only meant as a last resort to amend a substantial amount of erroneous data. When possible, the ATO +recommends correcting an incorrect payslips by submitting a correction as part of the next pay run +or via update event. + +Moreover, it is not possible to submit a second full file replacement of the same submission, and a +full file replacement can only be done once every 24 hours. + +##### Zero out YTD values + +In case of a mid-year change of several key identifiers, YTD values need to be zeroed out, and then +re-posted with the updated key identifier. + +For the following **company identifiers**, all employees need to be zeroed out: + +- ABN +- Branch Code +- BMS ID + +For the following **employee identifiers**, only individual employees can be zeroed out: + +- TFN +- Payroll ID + +1. Before updating any key identifiers, create a new STP submission by going to + {menuselection}`Payroll --> Reporting --> Single Touch Payroll` and: + + - Change the {guilabel}`Submission Type` to {guilabel}`Update`. + - Tick the {guilabel}`Zero Out YTD` checkbox. + - Click {guilabel}`Add a line` to specify which employees. + - Click {guilabel}`Submit to ATO`. + + ```{image} australia/payroll-stp-zero-out.png + :alt: Creating a new STP submission to zero out YTD values + ``` + +2. Once that is done, modify the key identifier(s) to amend. + +3. Finally, go back to {menuselection}`Payroll --> Reporting --> Single Touch Payroll` to create and + submit a new {guilabel}`Update`, this time without ticking the {guilabel}`Zero Out YTD` checkbox. + This will notify the ATO that the previously recorded YTD balances are to be adjusted to the new + key identifiers. + +### Payroll links to other apps + +#### Time Off + +The {doc}`Time Off app <../../hr/time_off>` is natively integrated with the Payroll app in Odoo. +Different types of leaves will populate payslips based on the concept of *work entries*. + +Go to {menuselection}`Time Off --> Configuration --> Time Off Types`, and for each type, configure +the following two fields under the {guilabel}`Payroll` section: + +- {guilabel}`Work Entry Type`: defines which work entry should be selected on the {guilabel}`Worked + Days` table of the payslip. +- {guilabel}`Unused Leave Type`: choose between {guilabel}`Annual`, {guilabel}`Long Service`, or + {guilabel}`Personal Leave`. If {guilabel}`Personal Leave` is selected, the remaining leave balance + for this time off type will not show up as an entitlement at the time of termination. Unused + leaves of the type {guilabel}`Annual` will include leave loading if the employee is eligible for + it. + +```{image} australia/payroll-time-off.png +:alt: Configuring time off types +``` + +#### Expenses + +The {doc}`Expenses app <../expenses>` is also natively integrated with the Payroll app in Odoo. +First of all, go to {menuselection}`Expenses --> Configuration --> Settings` and enable +{guilabel}`Reimburse in Payslip`. + +When an employee on your payroll submits an approved expense to be reimbursed, you can reimburse +them using two ways: + +- If the expense is to be reimbursed outside of a pay run, click {guilabel}`Post Journal Entries`. + The payment must be made manually. +- If the expense is to be reimbursed as part of the next pay run, click {guilabel}`Report in Next + Payslip` instead. + +```{image} australia/payroll-expenses-reimburse.png +:alt: Two ways of reimbursing an expense +``` + +After an expense has been added to the next payslip, you can find it in the {guilabel}`Other Inputs` +table. This input type is then computed as an addition to the net salary. + +```{image} australia/payroll-expenses-payslip.png +:alt: The expense reimbursement on a payslip +``` + +After paying the employee, the payslip's journal item related to the employee's reimbursement is +automatically matched against the expense's vendor bill. + +```{image} australia/payroll-expenses-journal.png +:alt: The payslip's journal item related to the employee's expense reimbursement +``` + +### Advanced configurations + +(australia-payroll-other-input-types)= + +#### Other input types + +You can access other input types by going to {menuselection}`Payroll --> Configuration --> Other +Input Types`. There are 63 other input types related to Australia. We do not recommend using the +other ones as part of your payroll solution, since they cannot be used in the frame of STP. You can +archive or delete them. + +On each input type, the following fields are important: + +- {guilabel}`Payment Type` classifies input types in six categories: + + 1. {guilabel}`Allowance`: a separate amount you pay to your employees in addition to salary and + wages. Some of these allowances are mandated by modern awards: laundry, transport, etc. + + :::{important} + [Contact us](https://www.odoo.com/help) if you plan to use allowances subject to varied + rates of withholding (such as *cents per KM* or *travel allowances*) to see whether Odoo + currently covers your business case. + ::: + + :::{note} + - As of Odoo 18, some allowances such as {guilabel}`Laundry: Allowance for approved + uniforms` are managed by two other inputs: one to lodge the amount paid up to the ATO + limit, and the other one to lodge the amount exceeding the ATO limit. This is necessary + for Odoo to compute PAYGW correctly. + - Some businesses may require to shift the reporting of an allowance from {guilabel}`OTE` to + {guilabel}`Salary & Wages` depending on the employee. In this case, you must duplicate and + re-configure an existing other input type. For example, {guilabel}`Work-Related + Non-Expense` allowance is {guilabel}`OTE` by default. + ::: + + 2. {guilabel}`Deduction`: union fees and child support deductions are considered deductions. + + 3. {guilabel}`ETP`: employment termination payments. These are either considered excluded or + non-excluded (see [ATO's web page on ETP components taxation](https://www.ato.gov.au/individuals-and-families/jobs-and-employment-types/working-as-an-employee/leaving-your-job/employment-termination-payments-for-employees/how-etp-components-are-taxed)). + + 4. {guilabel}`Leave`: leave-related other inputs that are not pertaining to a single pay period + (lump sum, cashing out leaves while in service, unused leaves, etc.). + + 5. {guilabel}`Lump Sum`: return to work and lump sum E (for back payments) fall under this + category. + + 6. {guilabel}`Other`: other payments with their own specific logic. + +- {guilabel}`PAYGW Treatment` affects how Odoo withholds tax for this input type: + {guilabel}`Regular`, {guilabel}`No PAYG Withholding`, and {guilabel}`Excess Only` (for + allowances). + +- {guilabel}`Superannuation Treatment`: {guilabel}`OTE`, {guilabel}`Salary & Wages`, and + {guilabel}`Not Salary & Wages`. + +- {guilabel}`STP Code`: only visible in {ref}`developer mode `, this field tells + Odoo how to report the gross value of this payment to the ATO. We do not recommend changing the + value of this field if it was already set by default. + +Grouping other input types by {guilabel}`Payment Type` can help you understand the different +scenarios in which these inputs can be used. + +```{image} australia/payroll-other-input-types.png +:alt: Other input types grouped by payment type +``` + +(australia-payroll-work-entry-types)= + +#### Work entry types + +A *work entry type* is a type of attendance for employees (e.g., attendance, paid leave, overtime, +etc.). A few work entry types are created by default in every Australian database. + +```{image} australia/payroll-work-entry-types.png +:alt: Default work entry types for the Australian localization +``` + +Before using Odoo's payroll solution for Australia, it is recommended you trim work entry types to +keep the ones you need only by going to {menuselection}`Payroll --> Configuration --> Work Entry +Types` + +For each type, make sure to configure the following fields for Australia: + +- {guilabel}`Is OTE`: determines whether time spent in this category can be considered ordinary time + earnings, meaning that the superannuation guarantee rate will apply (e.g., regular attendance, + paid leave, etc.). +- {guilabel}`Penalty Rate`: used to determine the percentage of penalty that applies to time spent + in this category. It is important that you configure the penalty rate that applies in your state + or industry according to the type of work (e.g., Saturday rate, Sunday rate, overtime rate, etc.). +- {guilabel}`STP Code`: only visible in {ref}`developer mode `, this field tells + Odoo how to report the time spent in this category to the ATO. We do not recommend changing the + value of this field if it was already set by default. + +```{image} australia/payroll-work-entry-types-configuration.png +:alt: Configuring a work entry type +``` + +### Current limitations + +As of Odoo 18, we do not recommend companies to use the Payroll app for the following business +flows: + +- Income stream types: Foreign Employment Income +- Tax treatment category: actors & performers +- Death benefits reporting +- Reporting obligations for WPN (instead of ABN) +- Allowances subject to a varied rate of withholding (such as *cents per kilometer* allowance and + *travel allowances*) + +[Contact us](https://www.odoo.com/help) if you would like to make sure whether Odoo fits your +payroll requirements in Australia. + +(australia-payroll-employment-hero)= + +### Employment Hero integration + +If your business is already up and running with Employment Hero, you can use the connector as an +alternative payroll solution. The Employment Hero module synchronizes payslip accounting entries +(e.g., expenses, social charges, liabilities, taxes) automatically from Employment Hero to Odoo. +Payroll administration is still done in Employment Hero; Odoo only records the journal entries. + +#### Configuration + +1. {ref}`Install ` the Employment Hero Payroll module (`l10n_employment_hero`). + +2. Configure the Employment Hero API by going to {menuselection}`Accounting --> Configuration --> + Settings`. More fields become visible after ticking the {guilabel}`Enable Employment Hero + Integration` checkbox. + + ```{image} australia/payroll-employment-hero-settings.png + :alt: Enabling the Employment Hero integration + ``` + + - Find the {guilabel}`API Key` in the {guilabel}`My Account` section of the Employment Hero + platform. + + ```{image} australia/payroll-employment-hero-api-key.png + :alt: Finding the Employment Hero API key under the My Account section + ``` + + - The {guilabel}`Payroll URL` is pre-filled with `https://keypay.yourpayroll.com.au`. + + :::{warning} + Do not change the pre-filled {guilabel}`Payroll URL`. + ::: + + - Find the {guilabel}`Business Id` in the Employment Hero URL (e.g., `189241`). + + ```{image} australia/payroll-employment-hero-business-id.png + :alt: Finding the Employment Hero Business ID in the URL + ``` + + - Select any Odoo journal as the {guilabel}`Payroll Journal` to post the payslip entries. + +3. 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 {menuselection}`Matching Employment Hero Tax` field. + +#### The API explained + +The API syncs the journal entries from Employment Hero to Odoo and leaves them in draft mode. The +reference includes the Employment Hero payslip entry ID in brackets for the user to easily retrieve +the same record in Employment Hero and Odoo. + +```{image} australia/payroll-employment-hero-journal.png +:alt: Employment Hero journal entries in Odoo +``` + +By default, the synchronization happens once per week. It is possible to fetch the records manually +by going to {menuselection}`Accounting --> Configuration --> Settings` and, in the +{guilabel}`Employment Hero`, clicking {guilabel}`Fetch Payruns Manually`. + +Employment Hero payslip entries also work based on double-entry bookkeeping. The accounts used by +Employment Hero are defined in the Payroll settings section. + +```{image} australia/payroll-employment-hero-accounts.png +:alt: Finding the Employment Hero accounts +``` + +For the API to work, you must create the same accounts as the default accounts of your Employment +Hero business (same name and same code) in Odoo. You also need to choose the correct account types +in Odoo to generate accurate financial reports. + diff --git a/content/applications/finance/fiscal_localizations/austria.md b/content/applications/finance/fiscal_localizations/austria.md new file mode 100644 index 000000000..4482f84ca --- /dev/null +++ b/content/applications/finance/fiscal_localizations/austria.md @@ -0,0 +1,128 @@ +# Austria + +## Configuration + +{ref}`Install ` the following modules to get all the features of the Austrian +localization. + +```{eval-rst} +.. list-table:: + :header-rows: 1 + + * - Name + - Technical name + - Description + * - :guilabel:`Austria - Accounting` + - `l10n_at` + - Default :ref:`fiscal localization package `. + * - :guilabel:`Austria - Accounting Reports` + - `l10n_at_reports` + - Adds localized versions of financial reports + * - :guilabel:`Austrian SAF-T Export` + - `l10n_at_saft` + - Adds the SAF-T export. +``` + +:::{seealso} +{doc}`Documentation on e-invoicing’s legality and compliance in Austria +<../accounting/customer_invoices/electronic_invoicing/austria>` +::: + +## Financial reports + +The following localized reports are available: + +> - Balance sheet according to [§ 224 UGB](https://www.ris.bka.gv.at/NormDokument.wxe?Abfrage=Bundesnormen&Gesetzesnummer=10001702&Artikel=&Paragraf=224&Anlage=&Uebergangsrecht=) +> - Profit and loss according to [§ 231 UGB](https://www.ris.bka.gv.at/NormDokument.wxe?Abfrage=Bundesnormen&Gesetzesnummer=10001702&Artikel=&Paragraf=231&Anlage=&Uebergangsrecht=) (Gesamtkostenverfahren) + +:::{seealso} +{doc}`Accounting reporting documentation <../accounting/reporting>` +::: + +## SAF-T (Standard Audit File for Tax) + +The Austrian tax office may request a SAF-T. The Austrian SAF-T Export module allows exporting the +report in XML format. + +### Configuration + +This section explains how to configure the database to ensure all the information required by the +SAF-T is available. If anything is missing, a warning message listing which information is needed +will be displayed during the export. + +#### Company information + +Open the database {guilabel}`Settings`. Under the {guilabel}`Companies` section, click +{guilabel}`Update Info` and ensure the following fields are correctly filled in: + +- {guilabel}`Address`, by providing at least the following information: + + - {guilabel}`Street` + - {guilabel}`City` + - {guilabel}`ZIP` + - {guilabel}`Country` + +- {guilabel}`Phone` + +- {guilabel}`Company ID` by providing your company's tax ID + +- {guilabel}`Tax ID` by providing, if you have one, your {abbr}`UID-Nummer + (Umsatzsteueridentifikationsnummer)` (including the country prefix) + +##### Contact person + +At least one **contact person** must be linked to your company in the {guilabel}`Contacts` app, and: + +> - Ensure the contact type is set to {guilabel}`Individual`. +> - Select your company in the {guilabel}`Company name` field. +> - Provide at least one phone number using the {guilabel}`Phone` or {guilabel}`Mobile` field. + +#### Customer and supplier information + +Using the {guilabel}`Contacts` app, fill in the {guilabel}`Address` of any partner that appears in +your invoices, vendor bills, or payments. + +For partners that are companies, fill in the VAT number (including the country prefix) in the +{guilabel}`Tax ID` field. + +#### Accounting settings + +Go to {menuselection}`Accounting --> Configuration --> Settings`. Under the {guilabel}`Austrian +localization` section, fill in the following fields: + +- {guilabel}`ÖNACE-Code` +- {guilabel}`Profit Assessment Method` + +:::{seealso} +[ÖNACE information on the Austrian Economic Chambers website](https://www.wko.at/service/zahlen-daten-fakten/oenace.html) +::: + +#### Chart of accounts mapping + +The Austrian SAF-T specifications define a chart of accounts (COA). All relevant accounts for the +SAF-T export must be annotated with a fitting account from this COA. + +The needed mapping information is supplied by adding tags to the accounts. For example, adding the +`1000` tag to an account maps it (virtually) to the SAF-T COA account with the code `1000`. Any +number can be used as long as there is an account in the SAF-T COA with that code. + +The {guilabel}`Austria - Accounting` module adds a tag for each SAF-T COA account. Furthermore, it +automatically maps many accounts from the default Austrian COA. + +You can try exporting the SAF-T report to check if there are unmapped accounts (or mapped to +multiple SAF-T accounts). A warning will be displayed if there is any issue with your configuration +or the mapping. Clicking {guilabel}`View Problematic Accounts` lets you view them. + +:::{seealso} +{doc}`Chart of accounts documentation <../accounting/get_started/chart_of_accounts>` +::: + +### Exporting the SAF-T report + +To export the SAF-T report, go to {menuselection}`Accounting --> Reports --> General Ledger`. Click +the right side of the {guilabel}`PDF` button and select {guilabel}`SAF-T`. + +```{image} austria/austria-saft-button.png +:alt: The SAF-T button to export the file in XML format +``` + diff --git a/content/applications/finance/fiscal_localizations/belgium.md b/content/applications/finance/fiscal_localizations/belgium.md new file mode 100644 index 000000000..9a098bbc0 --- /dev/null +++ b/content/applications/finance/fiscal_localizations/belgium.md @@ -0,0 +1,624 @@ +# Belgium + +(belgium-configuration)= + +## Configuration + +Install the {guilabel}`🇧🇪 Belgium` {ref}`fiscal localization package +` to get all the default accounting features of the Belgian +localization, following the {abbr}`IFRS(International Financial Reporting Standards)` rules. + +:::{seealso} +{doc}`Documentation on e-invoicing’s legality and compliance in Belgium +<../accounting/customer_invoices/electronic_invoicing/belgium>` +::: + +(belgium-coa)= + +## Chart of accounts + +You can reach the {guilabel}`Chart of accounts` by going to {menuselection}`Accounting --> +Configuration --> Accounting: Chart of Accounts`. + +The Belgian chart of accounts includes pre-configured accounts as described in the {abbr}`PCMN(Plan +Comptable Minimum Normalisé)`. To add a new account, click {guilabel}`New`. A new line appears. Fill +it in, click {guilabel}`Save`, and then {guilabel}`Setup` to configure it further. + +:::{seealso} +{doc}`../accounting/get_started/chart_of_accounts` +::: + +(belgium-taxes)= + +## Taxes + +Default Belgian taxes are created automatically when the {guilabel}`Belgium - Accounting` and +the {guilabel}`Belgium - Accounting Reports` modules are installed. Each tax impacts the Belgian +{guilabel}`Tax Report`, available by going to {menuselection}`Accounting --> Reporting --> +Statements Reports: Tax Report`. + +In Belgium, the standard VAT rate is **21%**, but there are lower rates for some categories of goods +and services. An intermediate rate of **12%** is applied on social housing and food served in +restaurants, while a reduced rate of **6%** applies to most basic goods, such as food, water supply, +books, and medicine. A **0%** rate applies to some exceptional goods and services, such as some +daily and weekly publications, as well as recycled goods. + +(belgium-non-deductible)= + +### Non-deductible taxes + +In Belgium, some taxes are not fully deductible, such as taxes on the maintenance of cars. This +means a part of these taxes is considered as an expense. + +In Odoo, you can configure non-deductible taxes by creating tax rules for these taxes and linking +them to the corresponding accounts. This way, the system automatically calculates the taxes and +allocates them to the appropriate accounts. + +To configure a new non-deductible tax, go to {menuselection}`Accounting --> Configuration --> +Accounting: Taxes`, and click {guilabel}`New`: + +1. {guilabel}`Add a line` and select {guilabel}`Base` in the {guilabel}`Based On` column; +2. {guilabel}`Add a line`, then select {guilabel}`on tax` in the {guilabel}`Based on` column and + enter the **non-deductible** percentage in the {guilabel}`%` column; +3. On the {guilabel}`of tax` line, select the {guilabel}`Tax Grid(s)` related to your tax; +4. {guilabel}`Add a line` with the **deductible** percentage in the {guilabel}`%` column; +5. Set {guilabel}`of tax` in {guilabel}`Based On`; +6. Select {guilabel}`411000 VAT recoverable` as account, and select the related tax grid. + +Once you have created a non-deductible tax, you can apply it to your transactions by selecting the +appropriate tax during the encoding of bills and credit notes. The system automatically calculates +the tax amount and allocates it to the corresponding accounts based on the tax rules configured. + +```{eval-rst} +.. example:: + With the Belgian localization, the **21% car** tax is created by default (50% non-deductible). + + .. image:: belgium/deductible-tax.png + :alt: Example of not-fully deductible tax +``` + +:::{seealso} +- {doc}`Taxes <../accounting/taxes>` +- {doc}`../accounting/reporting/tax_returns` +::: + +(belgium-reports)= + +## Reports + +Here is the list of Belgian-specific reports available: + +- Balance sheet; +- Profit & loss; +- Tax report; +- Partner VAT Listing; +- EC Sales List; +- Intrastat. + +You can access Belgian-specific versions of reports by clicking on the **book** icon when on a +report and selecting its Belgian version: **(BE)**. + +```{image} belgium/belgian-reports.png +:alt: Belgian version of reports +``` + +:::{seealso} +{doc}`../accounting/reporting` +::: + +(belgium-disallowed-expenses)= + +### Disallowed expenses report + +**Disallowed expenses** are expenses that can be deducted from your accounting result but not from +your fiscal result. + +The **disallowed expenses report** is available by going to {menuselection}`Accounting --> Reporting +--> Management: Disallowed Expenses`. It allows financial results in real-time, and periodic +changes. This report is generated based on the **disallowed expenses categories** that you can reach +by going to {menuselection}`Accounting --> Configuration --> Management: Disallowed Expenses +Categories`. Some categories already exist by default but do not have any rates. Click on +{guilabel}`Set Rates` to update a specific category. + +:::{tip} +- You can add multiple rates for various dates. In that case, the rate used to calculate the + expense depends on the date at which it is calculated, and the rate set for that date. +- If you have the **Fleet** app installed, tick the {guilabel}`Car Category` box when applicable. + This makes the vehicle mandatory while booking a vendor bill. +::: + +To link a disallowed expenses category with a specific account, go to {menuselection}`Accounting --> +Configuration --> Accounting: Chart of Accounts`. Find the account you want, and click on +{guilabel}`Setup`. Add the {guilabel}`Disallowed Expense category` in the {guilabel}`Disallowed +Expenses` field. From now, when an expense is created with this account, the disallowed expense is +calculated based on the rate mentioned in the {guilabel}`Disallowed Expense category`. + +Let's take an example reflecting **restaurant** and **car expenses**. + +(belgium-restaurant-expenses)= + +#### Restaurant expenses + +In Belgium, 31% of **restaurant** expenses are non-deductible. Create a new **disallowed expenses +category** and set both {guilabel}`Related Account(s)` and {guilabel}`Current Rate`. + +```{image} belgium/restaurant-expenses.png +:alt: Disallowed expenses categories +``` + +(belgium-vehicle-split)= + +#### Car expenses: vehicle split + +In Belgium, the deductible percentage varies from car to car and, therefore, should be indicated for +each vehicle. To do so, open {menuselection}`Fleet` and select a vehicle. In the {guilabel}`Tax +info` tab, go to the {guilabel}`Disallowed Expenses Rate` section and click on {guilabel}`Add a +line`. Add a {guilabel}`Start Date` and a {guilabel}`%`. The amounts go in the same account for all +car expenses. + +When you create a bill for car expenses, you can link each expense to a specific car by filling the +{guilabel}`Vehicle` column, so the right percentage is applied. + +```{image} belgium/car-bill.png +:alt: Disallowed expenses categories +``` + +The {guilabel}`vehicle split` option available in the disallowed expenses report allows you to see +the rate and disallowed amount for each car. + +```{image} belgium/vehicle-split.png +:alt: Disallowed expenses categories +``` + +(belgium-forms)= + +## Fee form 281.50 and form 325 + +(belgium-281-50)= + +### Fee form 281.50 + +Annually, a **281.50 fee form** must be reported to the fiscal authorities. To do so, the tag +`281.50` must be added on the **contact form** of the entities concerned by the **281.50** fee. To +add the tag, open {menuselection}`Contacts`, select the person or company you want to create a +**281.50 fee form** for, and add the `281.50` tag in the {guilabel}`Tags` field. + +```{image} belgium/281-50.png +:alt: add the tag 281.50 on a contact form +``` + +:::{note} +Make sure the **street, zip code, country**, and **VAT number** are also informed on the +**Contact form**. +::: + +Then, depending on the nature of the expense, add the corresponding `281.50` tag on the impact +accounts. To do so, go to {menuselection}`Accounting --> Configuration --> Accounting: Chart of +Accounts`, and click on {guilabel}`Setup` to add the corresponding `281.50` tag on the impacted +accounts, i.e., {guilabel}`281.50 - Commissions`, depending on the nature of the expense. + +(belgium-325)= + +### Form 325 + +You can create a **325 form** by going to {menuselection}`Accounting --> Reporting --> Belgium: +Create 325 form`. A new page pops up: select the right options and click {guilabel}`Generate 325 +form`. To open an already generated **325 form**, go to {menuselection}`Accounting --> Reporting --> +Belgium: Open 325 forms`. + +```{image} belgium/325-form.png +:alt: Add the tag 281-50 on a contact form +``` + +(belgium-coda-soda)= + +## CODA and SODA statements + +(belgium-coda)= + +### CODA + +**CODA** is an electronic XML format used to import Belgian bank statements. You can download CODA +files from your bank and import them directly into Odoo by clicking {guilabel}`Import file` from +your {guilabel}`Bank` journal on your dashboard. + +```{image} belgium/coda-import.png +:alt: Import CODA files +``` + +:::{seealso} +{ref}`Import bank files ` +::: + +(belgium-soda)= + +### SODA + +**SODA** is an electronic XML format used to import accounting entries related to salaries. SODA +files can be imported into the journal you use to record salaries by going to your Accounting +**dashboard** and clicking {guilabel}`Upload` in the related journal card form. + +Once your **SODA** files are imported, the entries are created automatically in your salary journal. + +```{image} belgium/soda-import.png +:alt: Import SODA files +``` + +(belgium-einvoicing)= + +### CodaBox + +**CodaBox** is a service that allows Belgian accounting firms to access their clients' bank +information and statements. Odoo provides a way to import such statements automatically. + +:::{note} +As an accounting firm, you must manage your clients on separate databases and configure them +individually to avoid mixing up their data. The connection must be made by the accounting firm +with valid CodaBox Connect credentials. +::: + +#### Configuration + +The configuration must be done on each client database. In the following +instructions, we will refer to your client's company as *Company* and to your +accounting firm as *Accounting Firm*. + +You must first {ref}`install ` {guilabel}`CodaBox` to start. + +:::{important} +Make sure the company settings are correctly configured, i.e., the country is set to +{guilabel}`Belgium`, the {guilabel}`Tax ID` and {guilabel}`Accounting Firm` fields are filled, as +well as the {guilabel}`Tax ID` of the {guilabel}`Accounting Firm`. +::: + +##### Configure the journals + +```{eval-rst} +.. tabs:: + + .. tab:: For CODA files + + #. :doc:`Create a new bank journal <../accounting/bank>`. + #. Set the right IBAN in the :guilabel:`Account Number` field. + #. Select :guilabel:`CodaBox synchronization` as the :guilabel:`Bank Feed`. + + .. image:: belgium/codabox_configuration_coda_journal.png + :align: center + :alt: Configuration of a CODA journal. + + .. tip:: + When working with bank transactions that use different currencies, it is recommended to + create multiple journals with the same bank account but different currencies. + + .. tab:: For SODA files + + #. Create a new miscellaneous journal. + #. Go to :menuselection:`Accounting --> Configuration --> Settings`, then go to the + :guilabel:`CodaBox` section. + #. Select the journal you just created in the SODA journal field. + + .. image:: belgium/codabox_configuration_soda_setting.png + :align: center + :alt: Configuration of a SODA journal. +``` + +(belgium-codabox-configuration-connection)= + +##### Configure the connection + +1. Go to {menuselection}`Accounting --> Configuration --> Settings`, then go to the + {guilabel}`CodaBox` section. + +2. Click on {guilabel}`Manage Connection` to open the connection wizard, which shows the + {guilabel}`Accounting Firm VAT` number and the {guilabel}`Company VAT` number that will be used + for the connection. + +3. If this is your **first connection**, click on {guilabel}`Create connection`. + The wizard confirms that the connection has been created on **Odoo's side**. Follow the steps + to validate the connection on **CodaBox's side**, too. + + If this is **not your first connection**, the {guilabel}`Accounting Firm Password` provided by + Odoo during the first connection will be requested to create a new connection. + + > :::{note} + > This {guilabel}`Accounting Firm Password` is unique to Odoo and must be stored securely + > on your side. + > ::: + +The {guilabel}`Status` should have now switched to {guilabel}`Connected`. + +#### Synchronization + +Once the connection is established, Odoo can be synchronized with CodaBox. + +```{eval-rst} +.. tabs:: + + .. tab:: For CODA files + + CODA files are automatically imported from CodaBox every 12 hours. You do + not have to do anything. However, if you wish, it can also be done manually, + by clicking on :guilabel:`Fetch from CodaBox` in the Accounting Dashboard. + + .. tab:: For SODA files + + SODA files are automatically imported from CodaBox once a day as a draft. You do not have to + do anything. However, if you wish, it can also be done manually by clicking on + :guilabel:`Fetch from CodaBox` in the Accounting Dashboard. + + By default, if an account in the SODA file is not mapped to an account in Odoo, the Suspense + Account (499000) is used, and a note is added to the created journal entry. + + .. note:: + You can access the mapping between the SODA and Odoo accounts by going to + :menuselection:`Accounting --> Configuration --> Settings` and clicking on the + :guilabel:`Open SODA Mapping` button in the :guilabel:`CodaBox` section. + +``` + +#### Potential issues + +- **CodaBox is not configured. Please check your configuration.** + + Either the {guilabel}`Company VAT` or the {guilabel}`Accounting Firm VAT` is not set. + +- **No connection exists with these accounting firms and company VAT numbers.** + **Please check your configuration.** + + > This can happen when checking the connection status, and the {guilabel}`Accounting Firm VAT` and + > {guilabel}`Company VAT` combination still needs to be registered. This may happen if you have + > changed the {guilabel}`Company VAT` after the connection was established. For security reasons, + > you have to {ref}`recreate a connection ` + > for this {guilabel}`Company VAT`. + +- **It seems that your CodaBox connection is not valid anymore. Please connect again.** + + > This can happen if you revoke Odoo's access to your CodaBox account or still need to complete + > the configuration process. In this case, you must revoke the connection and create a new one. + +- **The provided password is not valid for this accounting firm.** + **You must reuse the password you received from Odoo during your first connection.** + + > The password you provided is different from the one you received from Odoo during your first + > connection. You must use the password you received from Odoo during your first connection to + > create a new connection for this accounting firm. If you have lost your password, you must first + > revoke the Odoo connection on CodaBox's side (i.e., on your myCodaBox portal). Then, you can + > revoke the connection on Odoo's side and + > {ref}`create a new one `. + +- **It seems that the company or accounting firm VAT number you provided is not valid.** + **Please check your configuration.** + + > Either the {guilabel}`Company VAT` or the {guilabel}`Accounting Firm VAT` is not in a valid + > Belgian format. + +- **It seems that the accounting firm VAT number you provided does not exist in CodaBox.** + **Please check your configuration.** + + > The {guilabel}`Accounting Firm VAT` number you provided is not registered in CodaBox. + > You may not have a valid CodaBox license linked to this VAT number. + +- **It seems you have already created a connection to CodaBox with this accounting firm.** + **To create a new connection, you must first revoke the old one on myCodaBox portal.** + + > You must go to your myCodaBox portal and revoke Odoo's access to your CodaBox account. + > Then, you can {ref}`create a new connection ` + > on Odoo's side. + +:::{tip} +To revoke the connection between Odoo and CodaBox, go to +{menuselection}`Accounting --> Configuration --> Settings`, scroll down to the +{guilabel}`CodaBox` section, click on {guilabel}`Manage Connection`, then click on +{guilabel}`Revoke`. +::: + +## Electronic invoicing + +Odoo supports the **Peppol BIS Billing 3.0 (UBL)** electronic invoicing format. To enable it for a +customer, go to {menuselection}`Accounting --> Customers --> Customers`, open their contact form, +and under the {guilabel}`Accounting` tab, select the {guilabel}`Peppol BIS Billing 3.0` format. + +:::{seealso} +{doc}`../accounting/customer_invoices/electronic_invoicing` +::: + +(belgium-cash-discount)= + +## Cash discount + +In Belgium, if an early payment discount is offered on an invoice, the tax is calculated based on +the discounted total amount, whether the customer benefits from the discount or not. + +To apply the right tax amount and report it correctly in your VAT return, set the tax reduction as +{guilabel}`Always (upon invoice)`. + +:::{seealso} +{doc}`../accounting/customer_invoices/cash_discounts` +::: + +(belgium-pos-restaurant-certification)= + +## Fiscal certification: POS restaurant + +In Belgium, the owner of a cooking business such as a restaurant or food truck is required by law to +use a government-certified **Cash Register System** for their receipts. This applies if their yearly +earnings (excluding VAT, drinks, and take-away food) exceed 25,000 euros. + +This government-certified system entails the use of a {ref}`certified POS system +`, along with a device called a {ref}`Fiscal Data Module ` (or +**black box**) and a {ref}`VAT Signing Card `. + +:::{important} +Do not forget to register as *foodservice industry manager* on the [Federal Public Service +Finance registration form](https://www.systemedecaisseenregistreuse.be/fr/enregistrement). +::: + +(belgium-certified-pos)= + +### Certified POS system + +The Odoo POS system is certified for the major versions of databases hosted on **Odoo Online**, +**Odoo.sh**, and **On-Premise**. Please refer to the following table to ensure that your POS system +is certified. + +```{eval-rst} +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - + - Odoo Online + - Odoo.sh + - On-Premise + * - Odoo 18.0 + - Certified + - Certified + - Certified + * - Odoo 17.0 + - Certified + - Certified + - Certified + * - Odoo 16.0 + - Certified + - Certified + - Certified + * - Odoo 15.0 + - Certified + - Certified + - Certified + * - Odoo 14.0 + - Certified + - Certified + - Certified +``` + +:::{seealso} +{doc}`/administration/supported_versions` +::: + +A [certified POS system](https://www.systemedecaisseenregistreuse.be/systemes-certifies) must +adhere to rigorous government regulations, which means it operates differently from a non-certified +POS. + +- On a certified POS, you cannot: + + - Set up and use the **global discounts** feature (the `pos_discount` module is blacklisted and + cannot be activated). + - Set up and use the **loyalty programs** feature (the `pos_loyalty` module is blacklisted and + cannot be activated). + - Reprint receipts (the `pos_reprint` module is blacklisted and cannot be activated). + - Modify prices in order lines. + - Modify or delete order lines in POS orders. + - Sell products without a valid VAT number. + - Use a POS that is not connected to an IoT box. + +- The {doc}`cash rounding <../../sales/point_of_sale/pricing/cash_rounding>` feature must be + activated and set to a {guilabel}`Rounding Precision` of `0,05` and a {guilabel}`Rounding Method` + set as {guilabel}`Half-Up`. + +- Taxes must be set as included in the price. To set it up, go to {menuselection}`Point of Sale --> + Configuration --> Settings`, and from the {guilabel}`Accounting` section, open the + {guilabel}`Default Sales Tax` form by clicking the arrow next to the default sales tax field. + There, click {guilabel}`Advanced Options` and enable {guilabel}`Included in Price`. + +- At the start of a POS session, users must click {guilabel}`Work in` to clock in. Doing so allows + the registration of POS orders. If users are not clocked in, they cannot make POS orders. + Likewise, they must click {guilabel}`Work Out` to clock out at the end of the session. + +:::{warning} +If you configure a POS to work with a {abbr}`FDM (Fiscal Data Module)`, you cannot use it again +without it. +::: + +(belgium-fdm)= + +### Fiscal Data Module (FDM) + +An FDM, or **black box**, is a government-certified device that works together with the Point of +Sale application and saves your POS orders information. Concretely, a **hash** ({dfn}`unique code`) +is generated for each POS order and added to its receipt. This allows the government to verify that +all revenue is declared. + +:::{warning} +Only the FDM from **Boîtenoire.be** with the [FDM certificate number BMC04](https://www.systemedecaisseenregistreuse.be/fr/systemes-certifies#FDM%20certifiés) is +supported by Odoo. [Contact the manufacturer (GCV BMC)](https://www.boîtenoire.be/contact) to +order one. +::: + +#### Configuration + +Before setting up your database to work with an FDM, ensure you have the following hardware: + +- a **Boîtenoire.be** (certificate number BMC04) FDM; +- an RS-232 serial null modem cable per FDM; +- an RS-232 serial-to-USB adapter per FDM; +- an {ref}`IoT Box ` (one IoT box per FDM); and +- a receipt printer. + +(belgium-blackbox)= + +##### Black box module + +As a pre-requisite, {ref}`activate ` the `Belgian Registered Cash Register` module +(technical name: `pos_blackbox_be`). + +```{image} belgium/be-modules.png +:alt: black box modules for belgian fiscal certification +``` + +Once the module is activated, add your VAT number to your company information. To set it up, go to +{menuselection}`Settings --> Companies --> Update Info`, and fill in the {guilabel}`VAT` field. +Then, enter a national registration number for every staff member who operates the POS system. To do +so, go to the {guilabel}`Employees` app and open an employee form. There, go to {menuselection}`HR +settings tab --> Attendance/Point of Sale`, and fill in the {guilabel}`INSZ or BIS number` field. + +```{image} belgium/bis-number.png +:alt: ISNZ or BIS number field on employee form +``` + +:::{tip} +To input your information, click on your avatar, go to {menuselection}`My Profile --> Preference +tab`, and enter your INSZ or BIS number in the designated field. +::: + +:::{warning} +You must configure the {abbr}`FDM (Fiscal Data Module)` directly in the production database. +Utilizing it in a testing environment may result in incorrect data being stored within the FDM. +::: + +(belgium-iotbox)= + +##### IoT Box + +In order to use an {abbr}`FDM (Fiscal Data Module)`, you need a registered IoT Box. To register your +IoT box, you must contact us through our [support contact form](https://www.odoo.com/help) and +provide the following information: + +- your VAT number; +- your company's name, address, and legal structure; and +- the Mac address of your IoT Box. + +Once your IoT box is certified, {doc}`connect <../../general/iot/connect>` it to your database. To +verify that the IoT Box recognizes the FDM, go to the IoT homepage and scroll down the +{guilabel}`IOT Device` section, which should display the FDM. + +```{image} belgium/iot-devices.png +:alt: Hardware status page on a registered IoT Box +``` + +Then, add the IoT to your POS. To do so, go to {menuselection}`Point of Sale --> Configuration --> +Point of Sale`, select your POS, scroll down to the {guilabel}`Connected Device` section, and enable +{guilabel}`IoT Box`. Lastly, add the FMD in the {guilabel}`Fiscal Data Module` field. + +:::{note} +To be able to use an FDM, you must at least connect one {guilabel}`Receipt Printer`. +::: + +(belgium-vat)= + +### VAT signing card + +When you open a POS session and make your initial transaction, you are prompted to enter the PIN +provided with your {abbr}`VSC (VAT signing card)`. The card is delivered by the {abbr}`FPS (Service +Public Federal Finances)` upon [registration](https://www.systemedecaisseenregistreuse.be/fr/enregistrement). + diff --git a/content/applications/finance/fiscal_localizations/brazil.md b/content/applications/finance/fiscal_localizations/brazil.md new file mode 100644 index 000000000..a364fd64e --- /dev/null +++ b/content/applications/finance/fiscal_localizations/brazil.md @@ -0,0 +1,624 @@ +--- +substitutions: + API: '{abbr}`API (Application programming interface)`' + IAP: '{abbr}`IAP (In-app-purchase)`' + SO: '{abbr}`SO (Sales order)`' +--- + +# Brazil + +## Introduction + +With the Brazilian localization, sales taxes can be automatically computed and electronic invoices +for goods (NF-e) and services (NFS-e) can be sent using AvaTax (Avalara) through {{ API }} calls. +Moreover, taxes for services can be configured. + +For the goods and services tax computation and electronic invoicing process, you need to configure +the {ref}`contacts `, {ref}`company `, {ref}`products +`, and {ref}`create an account in AvaTax ` which needs to be +configured in the general settings. + +For the services taxes, you can create and configure them from Odoo directly without computing them +with AvaTax. + +The localization also includes taxes and a chart of accounts template that can be modified if +needed. + +:::{seealso} +Links to helpful resources for the Brazilian localization, including onboarding materials and +videos: + +- [Onboarding checklist for new users](https://docs.google.com/document/d/e/2PACX-1vSNYTYVnR_BzvQKL3kn5YdVzPjjHc-WHw_U3udk5tz_dJXo69woj9QrTMinH_siyOX2rLGjvspvc8AF/pub). +- [YouTube playlist - Brazil (Localization)](https://youtube.com/playlist?list=PL1-aSABtP6ADqexw4YNCbKPmpFggajxlX&si=RgmZR3Jco3223Np4). +- [YouTube playlist - Tutoriais Odoo em Português](https://youtube.com/playlist?list=PL1-aSABtP6ACGOW2UREePGjHQ2Bgdy-UZ&si=j6tiI36eB7BoKVQB). +- {doc}`Documentation on e-invoicing's legality and compliance in Brazil + <../accounting/customer_invoices/electronic_invoicing/brazil>` +::: + +## Configuration + +### Modules installation + +{ref}`Install ` the following modules to get all the features of the Brazilian +localization: + +```{eval-rst} +.. list-table:: + :header-rows: 1 + :widths: 25 25 50 + + * - Name + - Technical name + - Description + * - :guilabel:`Brazilian - Accounting` + - `l10n_br` + - Default :ref:`fiscal localization package `, which represents + having the Generic Brazilian chart of accounts and Taxes, together with document types and + identification types. + * - :guilabel:`Brazil - Accounting Reports` + - `l10n_br_reports` + - Accounting reports for Brazil. + * - :guilabel:`AvaTax Brazil` & :guilabel:`AvaTax Brazil for Services` + - `l10n_br_avatax` & `l10n_br_avatax_services` + - Goods and Services tax computation through Avalara. + * - :guilabel:`Brazilian Accounting EDI` & :guilabel:`Brazilian Accounting EDI for services` + - `l10n_br_edi` & `l10n_br_edi_services` + - Provides electronic invoicing for goods and services for Brazil through AvaTax. + * - :guilabel:`Brazil Pix QR codes` + - `l10n_br_pix` + - Implements Pix QR codes for Brazil. +``` + +(brazil-company)= + +### Configure your company + +To configure your company information, go to the {menuselection}`Contacts` app and search the name +given to your company. + +1. Select the {guilabel}`Company` option at the top of the page. Then, configure the following + fields: + + - {guilabel}`Name` + + - {guilabel}`Address`: add {guilabel}`City`, {guilabel}`State`, {guilabel}`Zip Code`, + {guilabel}`Country` + + - In the {guilabel}`Street` field, enter the street name, number, and any additional address + information. + - In the {guilabel}`Street 2` field, enter the neighborhood. + + - {guilabel}`Identification Number`: {guilabel}`CNPJ` or {guilabel}`CPF` + + - {guilabel}`Tax ID`: associated with the identification type + + - {guilabel}`IE`: State registration + + - {guilabel}`IM`: Municipal registration + + - {guilabel}`SUFRAMA code`: Superintendence of the Manaus Free Trade Zone - add if applicable + + - {guilabel}`Phone` + + - {guilabel}`Email` + + ```{image} brazil/contact-configuration.png + :alt: Company configuration. + ``` + +2. Configure the {guilabel}`Fiscal Information` within the {guilabel}`Sales and Purchase` tab: + + - Add the {guilabel}`Fiscal Position` for {ref}`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. + ``` + +3. Configure the following extra {guilabel}`Fiscal Information` if you are going to issue NFS-e: + + - Add the {guilabel}`Fiscal Position` for {ref}`AvaTax Brazil `. + - {guilabel}`COFINS Details`: {guilabel}`Taxable, Not Taxable, Taxable with rate 0%, Exempt, + Suspended` + - {guilabel}`PIS Details` {guilabel}`Taxable, Not Taxable, Taxable with rate 0%, Exempt, + Suspended` + - {guilabel}`CSLL Taxable` If the company is subject to CSLL or not + + ```{image} brazil/contact-fiscal-configuration-nfse.png + :alt: Company fiscal configuration for NFSe. + ``` + +4. Finally, upload a company logo and save the contact. + +:::{note} +If you are a simplified regime, you need to configure the ICMS rate under +{menuselection}`Accounting --> Configuration --> Settings --> Taxes --> AvaTax Brazil`. +::: + +(brazil-avatax-account)= + +### Configure AvaTax integration + +Avalara AvaTax is a tax calculation and electronic invoicing provider that can be integrated in Odoo +to automatically compute taxes by taking into account the company, contact (customer), product, and +transaction information to retrieve the correct tax to be used and process the e-invoice afterward +with the government. + +Using this integration requires {doc}`In-App-Purchases (IAPs) <../../essentials/in_app_purchase>` to +compute the taxes and to send the electronic invoices. Whenever you compute taxes, send an +electronic document (NF-e, NFS-e, etc), or perform any electronic flow (NF-e Cancellation, +Correction letter, Invalidate invoice number range), an API call is made using credits from your +[IAP credits balance](https://iap.odoo.com/iap/in-app-services/819). + +:::{note} +- Odoo is a certified partner of Avalara Brazil. +- You can [buy IAP credit on odoo.com](https://iap.odoo.com/iap/in-app-services/819). +- On creation, new databases receive 500 free credits. +::: + +#### Credential configuration + +To activate AvaTax in Odoo, you need to create an account. To do so, go to +{menuselection}`Accounting --> Configuration --> Settings --> Taxes`, and in the {guilabel}`AvaTax +Brazil` section, add the administration email address to be used for the AvaTax portal in the +{guilabel}`AvaTax Portal Email`, and then click on {guilabel}`Create account`. + +:::{warning} +When **testing** or **creating a production** {guilabel}`AvaTax Portal Email` integration in a +sandbox or production database, use a real email address, as it is needed to log in to the +Avalara Portal and set up the certificates, whether you want to test or use it on production. + +There are two different Avalara Portals, one for testing and one for production: + +- Sandbox: +- Production: + +When you create the account from Odoo, be sure to select the right environment. Moreover, the +email used to open the account cannot be used to open another account. Save your {guilabel}`API +ID` and {guilabel}`API Key` when you create the account from Odoo. + +```{image} brazil/transfer-api-credentials.png +:alt: Transfer API Credentials. +``` +::: + +After you create the account from Odoo, you need to go to the Avalara Portal to set up your +password: + +1. Access the [Avalara portal](https://portal.avalarabrasil.com.br/Login). +2. Click on {guilabel}`Meu primeiro acesso`. +3. Add the email address you used in Odoo to create the Avalara/AvaTax account, and then click + {guilabel}`Solicitar Senha`. +4. You will receive an email with a token and a link to create your password. Click on this link and + copy-paste the token to allocate your desired password. + +:::{tip} +You can start using AvaTax in Odoo for tax computation **only** without creating a password and +accessing the Avalara portal in the Odoo database. However, in order to use the electronic +invoice service, you **must** access the AvaTax portal and upload your certificate there. +::: + +```{image} brazil/avatax-account-configuration.png +:alt: AvaTax account configuration. +``` + +:::{note} +You can transfer {{ API }} credentials. Use this only when you have already created an account in +another Odoo instance and wish to reuse it. +::: + +#### A1 certificate upload + +In order to issue electronic invoices, a certificate needs to be uploaded to the [AvaTax portal](https://portal.avalarabrasil.com.br/Login). + +The certificate will be synchronized with Odoo, as long as the external identifier number in the +AvaTax portal matches - without special characters - with the CNPJ number, and the identification +number (CNPJ) in Odoo matches with the CNPJ in AvaTax. + +:::{important} +To issue NFS-e, some cities require that you link the certificate within the City Portal system +before issuing NFS-e from Odoo. + +If you receive an error message from the city that says {guilabel}`Your certificate is not linked +to the user`, that means this process needs to be done in the city portal. +::: + +### Configure master data + +#### Chart of accounts + +The {doc}`chart of accounts <../accounting/get_started/chart_of_accounts>` is installed by default +as part of the data set included in the localization module. The accounts are mapped automatically +in their corresponding taxes, and the default account payable and account receivable fields. + +:::{note} +The chart of accounts for Brazil is based on the SPED CoA, which gives a baseline of the accounts +needed in Brazil. + +You can add or delete accounts according to the company's needs. +::: + +#### Journals + +In Brazil, a *series* number is linked to a sequence number range for electronic invoices. The +series number can be configured in Odoo on a sales journal from the {guilabel}`Series` field. If +more than one series is needed, then a new sales journal will need to be created and a new series +number assigned to it for each series needed. + +The {guilabel}`Use Documents` field needs to be selected. When issuing electronic and non-electronic +invoices, the {guilabel}`Type` field selects the document type used when creating the invoice. The +{guilabel}`Type` field will only be displayed if the {guilabel}`Use Documents` field is selected on +the journal. + +```{image} brazil/journal-configuration.png +:alt: Journal configuration with the Use Documents? field checked. +``` + +:::{note} +When creating the journal, ensure the field {guilabel}`Dedicated Credit Note Sequence` is +unchecked, as in Brazil, sequences between invoices, credit notes, and debit notes are shared per +series number, which means per journal. +::: + +#### Taxes + +Taxes are automatically created when installing the Brazilian localization. Taxes are already +configured, and some of them are used by Avalara when computing taxes on the sales order or invoice. + +Taxes can be edited, or more taxes can be added. For example, some taxes used for services need to +be manually added and configured, as the rate may differ depending on the city where you are +offering the service. + +:::{important} +If you decide to do service taxes manually, you won't be able to issue an NFS-e. To +electronically send an NFS-e, you need to compute taxes using Avalara. +::: + +:::{warning} +Do not delete taxes, as they are used for the AvaTax tax computation. If deleted, Odoo creates +them again when used in an {{ SO }} or invoice and computing taxes with AvaTax, but the account used +to register the tax needs to be re-configured in the tax's {guilabel}`Definition` tab, under the +{guilabel}`Distribution for invoices` and {guilabel}`Distribution for refunds` sections. +::: + +:::{seealso} +{doc}`Taxes functional documentation <../accounting/taxes>` +::: + +(brazil-products)= + +#### Products + +To use the AvaTax integration on sale orders and invoices, first specify the following information +on the product depending on its intended use: + +##### 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`: Indicates the origin of the product, which can be foreign or + domestic, among other possible options depending on the specific use case +- {guilabel}`SPED Fiscal Product Type`: Fiscal product type according to SPED list table +- {guilabel}`Purpose of Use`: Specify the intended purpose of use for this product + +```{image} brazil/product-configuration.png +:alt: Product configuration. +``` + +:::{note} +Odoo automatically creates three products to be used for transportation costs associated with +sales. These are named `Freight`, `Insurance`, and `Other Costs`. They are already configured, if +more need to be created, duplicate and use the same configuration (configuration needed: +{guilabel}`Product Type` `Service`, {guilabel}`Transportation Cost Type` `Insurance`, `Freight`, +or `Other Costs`). +::: + +##### E-Invoice for services (NFS-e) + +- {guilabel}`Mercosul NCM Code`: Mercosur Common Nomenclature Product Code +- {guilabel}`Purpose of Use`: Specify the intended purpose of use for this product +- {guilabel}`Service Code Origin`: City Service Code where the provider is registered +- {guilabel}`Service Codes`: City Service Code where the service will be provided, if no + code is added, the Origin City Code will be used +- {guilabel}`Labor Assignment`: Defines if your services includes labor + +(brazil-contacts)= + +#### Contacts + +Before using the integration, specify the following information on the contact: + +1. General information about the contact: + + - Select the {guilabel}`Company` option for a contact with a tax ID (CNPJ), or check + {guilabel}`Individual` for a contact with a CPF. + + - {guilabel}`Name` + + - {guilabel}`Address`: add {guilabel}`City`, {guilabel}`State`, {guilabel}`Zip Code`, + {guilabel}`Country` + + - In the {guilabel}`Street` field, enter the street, number, and any extra address information. + - In the {guilabel}`Street 2` field, enter the neighborhood. + + - {guilabel}`Identification Number`: {guilabel}`CNPJ` or {guilabel}`CPF` + + - {guilabel}`Tax ID`: associated with the identification type + + - {guilabel}`IE`: state tax identification number + + - {guilabel}`IM`: municipal tax identification number + + - {guilabel}`SUFRAMA code`: SUFRAMA registration number + + - {guilabel}`Phone` + + - {guilabel}`Email` + + ```{image} brazil/contact-configuration.png + :alt: Contact configuration. + ``` + + :::{note} + The {guilabel}`CPF`, {guilabel}`IE`, {guilabel}`IM`, and {guilabel}`SUFRAMA code` fields are + are hidden until the {guilabel}`Country` is set to `Brazil`. + ::: + +2. Fiscal information about the contact under the {guilabel}`Sales \& Purchase` tab: + + - {guilabel}`Fiscal Position`: add the AvaTax fiscal position to automatically compute taxes on + sale orders and invoices automatically + - {guilabel}`Tax Regime`: federal tax regime + - {guilabel}`ICMS Taxpayer Type`: taxpayer type determines if the contact is within the + {guilabel}`ICMS regime`, {guilabel}`Exempt status`, or {guilabel}`Non-taxpayer` + - {guilabel}`Main Activity Sector`: list of main activity sectors of the contact + + ```{image} brazil/contact-fiscal-configuration.png + :alt: Contact fiscal configuration. + ``` + +3. Configure the following extra {guilabel}`Fiscal Information` if you are going to issue NFS-e: + + - Add the {guilabel}`Fiscal Position` for {ref}`AvaTax Brazil ` + - {guilabel}`COFINS Details`: {guilabel}`Taxable, Not Taxable, Taxable with rate 0%, Exempt, + Suspended` + - {guilabel}`PIS Details`: {guilabel}`Taxable, Not Taxable, Taxable with rate 0%, Exempt, + Suspended` + - {guilabel}`CSLL Taxable`: If the company is subject to CSLL or not + + ```{image} brazil/contact-fiscal-configuration-nfse.png + :alt: Contact fiscal configuration for NFSe. + ``` + +(brazil-fiscal-positions)= + +#### Fiscal positions + +To compute taxes and send electronic invoices on sale orders and invoices, both the +{guilabel}`Detect Automatically` and the {guilabel}`Use AvaTax API` options need to be enabled in +the {guilabel}`Fiscal Position`. + +The {guilabel}`Fiscal Position` can be configured on the {ref}`contact ` or +selected when creating a sales order or an invoice. + +```{image} brazil/fiscal-position-configuration.png +:alt: Fiscal position configuration +``` + +## Workflows + +This section provides an overview of the actions that trigger [API calls](https://en.wikipedia.org/wiki/API) for tax computation, along with instructions on how to send +electronic invoices for goods (NF-e) and services (NFS-e) for government validation. + +:::{warning} +Please note that each {{ API }} call incurs a cost. Be mindful of the actions that trigger these +calls to manage costs effectively. +::: + +### Tax computation + +#### Tax calculations on quotations and sales orders + +Trigger an {{ API }} call to calculate taxes on a quotation or sales order automatically with AvaTax in +any of the following ways: + +- **Quotation confirmation** + : Confirm a quotation into a sales order. +- **Manual trigger** + : Click on {guilabel}`Compute Taxes Using AvaTax`. +- **Preview** + : Click on the {guilabel}`Preview` button. +- **Email a quotation / sales order** + : Send a quotation or sales order to a customer via email. +- **Online quotation access** + : When a customer accesses the quotation online (via the portal view), the {{ API }} call is + triggered. + +#### Tax calculations on invoices + +Trigger an {{ API }} call to calculate taxes on a customer invoice automatically with AvaTax in any of +the following ways: + +- **Manual trigger** + : Click on {guilabel}`Compute Taxes Using AvaTax`. +- **Preview** + : Click on the {guilabel}`Preview` button. +- **Online invoice access** + : When a customer accesses the invoice online (via the portal view), the {{ API }} call is triggered. + +:::{note} +The {guilabel}`Fiscal Position` must be set to `Automatic Tax Mapping (Avalara Brazil)` for any +of these actions to compute taxes automatically. +::: + +:::{seealso} +{doc}`Fiscal positions (tax and account mapping) <../accounting/taxes/fiscal_positions>` +::: + +(brazil-electronic-documents)= + +### Electronic documents + +#### Customer invoices + +To process an electronic invoice for goods (NF-e) or services (NFS-e), the invoice needs to be +confirmed and taxes need to be computed by Avalara. Once that step is done, click on the +{guilabel}`Send & Print` button in the upper left corner. In the pop-up that appears, click on +{guilabel}`Process e-invoice` and any of the other options - {guilabel}`Download` or +{guilabel}`Email`. Finally, click on {guilabel}`Send & Print` to process the invoice with the +government. + +Before sending the electronic invoice for goods (NF-e) or services (NFS-e), some fields need to be +filled out on the invoice: + +- {guilabel}`Customer`, with all the customer information +- {guilabel}`Payment Method: Brazil`: how the invoice is planned to be paid +- {guilabel}`Fiscal Position` set as the {guilabel}`Automatic Tax Mapping (Avalara Brazil)` +- {guilabel}`Document Type` set as {guilabel}`(55) Electronic Invoice (NF-e)` or {guilabel}`(SE) + Electronic Service Invoice (NFS-e)` + +There are some other optional fields that depend on the nature of the transaction. These fields are +not required, so no errors will appear from the government if these optional fields are not +populated for most cases: + +- {guilabel}`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. +``` + +:::{note} +All of the fields available on the invoice used to issue an electronic invoice are also available +on the sales order, if needed. When creating the first invoice, the field {guilabel}`Document +Number` is displayed, allocated as the first number to be used sequentially for subsequent +invoices. +::: + +#### Credit notes + +If a sales return needs to be registered, then a credit note can be created in Odoo to be sent to +the government for validation. + +:::{note} +Credit notes are only available for electronic invoices for goods (NF-e). +::: + +:::{seealso} +{ref}`Issue a credit note ` +::: + +#### Debit Notes + +If additional information needs to be included, or values need to be corrected that were not +accurately provided in the original invoice, a debit note can be issued. + +:::{note} +Debit notes are only available for electronic invoices for goods (NF-e). + +Only the products included in the original invoice can be part of the debit note. While changes +can be made to the product's unit price or quantity, products **cannot** be added to the debit +note. The purpose of this document is only to declare the amount that you want to add to the +original invoice for the same or fewer products. +::: + +:::{seealso} +{ref}`Issue a debit note ` +::: + +#### Invoice cancellation + +It is possible to cancel an electronic invoice that was validated by the government. + +:::{note} +Check whether the electronic invoice is still within the cancellation deadline, which may vary +according to the legislation of each state. +::: + +##### E-invoices for goods (NF-e) + +Cancel an e-invoice for goods (NF-e) in Odoo by clicking {guilabel}`Request Cancel` and adding a +cancellation {guilabel}`Reason` on the pop-up that appears. If you want to send this cancellation +reason to the customer via email, activate the {guilabel}`E-mail` checkbox. + +```{image} brazil/invoice-cancellation.png +:alt: Invoice cancellation reason in Odoo. +``` + +:::{note} +This is an electronic cancellation, which means that Odoo will send a request to the government +to cancel the NF-e, and it will then consume one {{ IAP }} credit, as an {{ API }} call occurs. +::: + +##### E-invoices for services (NFS-e) + +Cancel an e-invoice for services (NFS-e) in Odoo by clicking {guilabel}`Request Cancel`. In this +case, there is no electronic cancellation process, as not every city has this service available. The +user needs to manually cancel this NFS-e on the city portal. Once that step is completed, they can +request the cancellation in Odoo, which will cancel the invoice. + +#### Correction letter + +A correction letter can be created and linked to an electronic invoice for goods (NF-e) that was +validated by the government. + +This can be done in Odoo by clicking {guilabel}`Correction Letter` and adding a correction +{guilabel}`Reason` on the pop-up that appears. To send this correction reason to a customer via +email, activate the {guilabel}`E-mail` checkbox. + +```{image} brazil/correction-letter.png +:alt: Correction letter reason in Odoo. +``` + +:::{note} +Correction letters are only available for electronic invoices for goods (NF-e). +::: + +#### Invalidate invoice number range + +A range of sequences that are assigned to sales journals can be invalidated with the government if +they are not currently used, **and** will not be used in the future. To do so, navigate to the +journal, and click the {menuselection}`⚙️ (gear) icon --> Invalidate Number Range (BR)`. On the +{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 log of the cancelled numbers along with the XML file are recorded in the chatter of the +journal. +::: + +### Vendor bills + +On the vendor bills side, when receiving an invoice from a supplier, you can encode the bill in Odoo +by adding all the commercial information together with the same Brazilian specific information that +is recorded on the {ref}`customer invoices `. + +These Brazilian specific fields are: + +- {guilabel}`Payment Method: Brazil`: how the invoice is planned to be paid +- {guilabel}`Document Type`: used by your vendor +- {guilabel}`Document Number`: the invoice number from your supplier +- {guilabel}`Freight Model`: **NF-e specific** how goods are planned to be transported - domestic +- {guilabel}`Transporter Brazil`: **NF-e specific** who is doing the transportation. + diff --git a/content/applications/finance/fiscal_localizations/canada.md b/content/applications/finance/fiscal_localizations/canada.md new file mode 100644 index 000000000..3f90b1b7c --- /dev/null +++ b/content/applications/finance/fiscal_localizations/canada.md @@ -0,0 +1,323 @@ +--- +substitutions: + AP: '{abbr}`AP (Accounts Payable)`' + AR: '{abbr}`AR (Accounts Receivable)`' + COA: '{abbr}`CoA (Chart of Accounts)`' +--- + +# Canada + +The Odoo Canada localization package provides tailored features and configurations for Canadian +businesses. + +A series of videos on the subject of Accounting are available through Odoo's eLearning platform. +These videos cover how to start from scratch, set up configurations, complete common workflows, and +provide in-depth looks at some specific use cases. + +:::{seealso} +- [Odoo Tutorials: Accounting & Invoicing](https://www.odoo.com/slides/accounting-and-invoicing-19) +- [Odoo SmartClass: Accounting](https://www.odoo.com/slides/smartclass-accounting-121) +::: + +## Configuration + +Below are the available modules in Odoo for accounting use in Canada. + +### Modules installation + +{ref}`Install ` the following modules to get all the features of the Canadian +localization: + +```{eval-rst} +.. list-table:: + :header-rows: 1 + :widths: 25 25 50 + + * - Name + - Technical name + - Description + * - :guilabel:`Canada - Accounting` + - `l10n_ca` + - Base accounting module for Canadian localization. + * - :guilabel:`Canada - Accounting Reports` + - `l10n_ca_reports` + - Adds Canadian accounting reports. + * - :guilabel:`Canadian Checks Layout` + - `l10n_ca_check_printing` + - Enables the printing of payments on pre-printed check paper. Supports the three most common + check formats and works natively with the linked checks from `checkdepot.net + `_. + + - `Check on top: Quicken / QuickBooks standard + `_ + - `Check on middle: Peachtree standard + `_ + - `Check on bottom: ADP standard + `_ +``` + +(l10n-ca-coa)= + +## Chart of accounts + +The {doc}`chart of accounts (COA) <../accounting/get_started/chart_of_accounts>` for the Canadian +localization, in Odoo, has accounts grouped into seven main categories, with corresponding numeric +values that prefix individual journal entries: + +- **Receivable**: the balance of money (or credit) due to the business for goods or services + delivered or used, but not yet paid for by customers. {{ AR }} is indicated by the journal code + labeled (or beginning) with {guilabel}`1`. +- **Payable**: the business's short-term obligations owed to its creditors or suppliers, which have + not yet been paid. {{ AP }} is indicated by the journal code labeled (or beginning) with + {guilabel}`2`. +- **Equity**: the amount of money that would be returned to a company's shareholders if all of the + assets were liquidated and all of the company's debt was paid off in the case of liquidation. + Equity is indicated by the journal code labeled (or beginning) with {guilabel}`3` or + {guilabel}`9`. +- **Assets**: items listed on the balance sheet that contains economic value or have the ability to + generate cash flows in the future, such as a piece of machinery, a financial security, or a + patent. Assets are indicated by the journal code labeled (or beginning) with {guilabel}`1`. +- **Liability**: refers to a company's financial debts or obligations that arise during the course + of business operations. Liabilities are indicated by the journal code labeled (or beginning) with + {guilabel}`2`. +- **Income**: synonymous with *net income*, this is the profit a company retains after paying off + all relevant expenses from sales revenue earned. Income is indicated by the journal code labeled + (or beginning) with {guilabel}`4` or {guilabel}`6`. +- **Expenses**: the cost of operations that a company incurs to generate revenue. Expenses are + indicated by the journal code labeled (or beginning) with a {guilabel}`6`. + +:::{tip} +Predefined accounts are included in Odoo, as part of the {{ COA }} that's installed with the Canadian +localization package. The accounts listed below are preconfigured to perform certain operations +within Odoo. It is recommended to **not** delete these accounts; however, if changes are needed, +rename the accounts instead. + +```{eval-rst} +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - :guilabel:`Type` + - :guilabel:`Account Name` + * - :guilabel:`Current Assets` + - | :guilabel:`Bank Suspense Account` + | :guilabel:`Outstanding Receipts` + | :guilabel:`Outstanding Payments` + | :guilabel:`Liquidity Transfer` + | :guilabel:`Stock Valuation` + | :guilabel:`Stock Interim (Received)` + | :guilabel:`Stock Interim (Delivered)` + | :guilabel:`Cost of Production` + * - :guilabel:`Income` + - | :guilabel:`Foreign Exchange Gain` + | :guilabel:`Cash Difference Gain` + | :guilabel:`Cash Discount Gain` + * - :guilabel:`Expenses` + - | :guilabel:`Cash Discount Loss` + | :guilabel:`Foreign Exchange Loss` + | :guilabel:`Cash Difference Loss` + * - :guilabel:`Current Year Earnings` + - :guilabel:`Undistributed Profits/Losses` + * - :guilabel:`Receivable` + - :guilabel:`Account Receivable` + * - :guilabel:`Payable` + - :guilabel:`Account Payable` +``` +::: + +:::{seealso} +- {doc}`../accounting/get_started/chart_of_accounts` +- {doc}`../accounting/get_started/cheat_sheet` +::: + +(l10n-ca-fiscal-positions)= + +## Fiscal positions + +Canadian tax rates and taxable items vary by province and territory. Default fiscal positions are +automatically created when the Odoo **Accounting** application is installed. To manage or configure +additional fiscal positions, navigate to {menuselection}`Accounting --> Configuration --> Fiscal +Positions`. + +The following fiscal positions are available by default: + +- {guilabel}`Alberta (AB)` +- {guilabel}`British Columbia (BC)` +- {guilabel}`Manitoba (MB)` +- {guilabel}`New Brunswick (NB)` +- {guilabel}`Newfoundland and Labrador (NL)` +- {guilabel}`Nova Scotia (NS)` +- {guilabel}`Northwest Territories (NT)` +- {guilabel}`Nunavut (NU)` +- {guilabel}`Ontario (ON)` +- {guilabel}`Prince Edward Islands (PE)` +- {guilabel}`Quebec (QC)` +- {guilabel}`Saskatchewan (SK)` +- {guilabel}`Yukon (YT)` +- {guilabel}`International (INTL)` + +```{image} canada/l10n-ca-fiscal-positions.png +:alt: The default fiscal positions for the Canada localization in Odoo Accounting. +``` + +:::{note} +When considering what taxes to be applied, it is the province where the delivery occurs that +matters. Therefore, delivery is the responsibility of the vendor and is accounted for at the +customer location. +::: + +```{eval-rst} +.. example:: + - A delivery is made to a customer from another province. + Set the fiscal position on the customer's record to the province of the customer. + - A customer from another province comes to pick up products. + No fiscal position should be set on the customer's record. + - An international vendor doesn't charge any tax, but taxes are charged by the customs broker. + Set the fiscal position on the vendor's record to *International*. + - An international vendor charges provincial tax. + Set the fiscal position on the vendor's record to your position. +``` + +:::{seealso} +{doc}`../accounting/taxes/fiscal_positions` +::: + +(l10n-ca-taxes)= + +## Taxes + +In Canada, tax rates and what is considered taxable vary by province and territory. Default *Sales* +and *Purchases* taxes are created automatically when the Odoo **Accounting** application is +installed. To manage existing or configure additional taxes, navigate to {menuselection}`Accounting +--> Configuration --> Taxes`. + +(l10n-ca-taxes-avatax)= + +### AvaTax + +**Avalara AvaTax** is a cloud-based tax calculation and compliance software that integrates with +Odoo for several localizations, including Canada. Integrating AvaTax with Odoo provides real-time +and region-specific 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 Canada and/or +the United States. Reference the {ref}`avatax/fiscal_country` documentation for more information. +::: + +:::{seealso} +Refer to the documentation articles below to integrate and configure an AvaTax account with an +Odoo database: + +- {doc}`AvaTax integration <../accounting/taxes/avatax>` +- {doc}`Avalara management portal <../accounting/taxes/avatax/avalara_portal>` +- {doc}`Calculate taxes with AvaTax <../accounting/taxes/avatax/avatax_use>` +- Avalara's support documents: [About AvaTax](https://community.avalara.com/support/s/document-item?language=en_US&bundleId=dqa1657870670369_dqa1657870670369&topicId=About_AvaTax.html&_LANG=enus) +::: + +(l10n-ca-reports)= + +## Reports + +A number of {doc}`report selections <../accounting/reporting>` are readily available for the +Canadian localization, under the {menuselection}`Accounting app --> Reporting` drop-down menu: + +- {ref}`Balance Sheet `: a "snapshot" of a company's financial + position at a specific point in time, which contains an overview of a company's assets, + liabilities, and equity. + + Be sure to select the {menuselection}`Balance sheet (CA)` option from the {icon}`fa-book` + {guilabel}`Report` filter. + + ```{image} canada/l10n-ca-balance-sheet.png + :alt: Balance sheet report selection for CA localization in Odoo. + ``` + +- {ref}`Profit & Loss `: otherwise known as a *P&L statement* or + *income statement*, provides a summary of a company's revenues, expenses, and profits/losses over + a given period of time. + + Be sure to select the {menuselection}`Profit and loss (CA)` option from the {icon}`fa-book` + {guilabel}`Report` filter. + + ```{image} canada/l10n-ca-profit-loss.png + :alt: Profit and loss report selection for CA localization in Odoo. + ``` + +- {guilabel}`Cash Flow Statement`: shows how much cash and cash equivalents a company has received + and spent in a given period. + +- {ref}`Executive Summary `: an overview report that covers + the key performance indicators of a company's financial position, such as revenue, profit, and + debt. + +- {ref}`Tax Report `: an official form filed for a tax authority + that reports income, expenses, and other pertinent tax information. Tax reports allow taxpayers to + calculate their tax liability, schedule tax payments, or request refunds for the overpayment of + taxes. In Odoo, the tax report can be made monthly, every two months, quarterly, every 4 months, + semi-annually, and annually. + +:::{seealso} +- {doc}`Accounting reporting <../accounting/reporting>` +- {doc}`../../essentials/search` +::: + +(l10n-ca-cash-discount)= + +## Cash discount + +Cash discounts can be configured from {menuselection}`Accounting app --> Payment Terms`. Each +payment term can be set up with a cash discount and reduced tax. + +:::{seealso} +{doc}`../accounting/customer_invoices/cash_discounts` +::: + +## Writing checks + +The Canadian localization allows users to print checks for vendor payments. Be sure the *Canadian +Checks Layout* (`l10n_ca_check_printing`) module for the CA localization is {ref}`installed +`. + +To enable check printing from Odoo, navigate to {menuselection}`Accounting --> Configuration --> +Settings` and find the {guilabel}`Vendor Payments` section. From here, tick the {guilabel}`Checks` +checkbox to reveal several fields for check configuration. + +Select a {guilabel}`Check Layout` from the drop-down menu: + +- {guilabel}`Print Check (Top) - CA` +- {guilabel}`Print Check (Middle) - CA` +- {guilabel}`Print Check (Bottom) - CA` + +Next, choose whether or not to enable the {guilabel}`Multi-Pages Check Stub` checkbox. + +Optionally set a {guilabel}`Check Top Margin`, {guilabel}`Check Left Margin`, or {guilabel}`Check +Right Margin` if required. + +Tick the {guilabel}`Print Date Label` checkbox if a date label is required. + +Once all check configurations are complete, {guilabel}`Save` the settings. + +:::{tip} +Some of the check formats may require pre-printed paper from a third party vendor. +[Pre-printed checks from checkdepot.net](https://checkdepot.net/collections/odoo-checks) are +recommended. +::: + +:::{seealso} +{doc}`../accounting/payments/pay_checks` +::: + +## Receive pre-authorized debits + +Pre-authorized debits are a method for receiving payments from customers, where the customer +authorizes the business to withdraw funds from their bank account on a recurring basis. This +functionality is commonly used for subscriptions, recurring invoices, and other regular payments. + +In the Odoo Canadian localization, pre-authorized debits are facilitated through an +{doc}`integration with Stripe <../payment_providers/stripe>`. + +:::{seealso} +- {doc}`Setting up payment providers <../payment_providers>` +- [Stripe's pre-authorized debit payments documentation](https://docs.stripe.com/payments/acss-debit) +::: + diff --git a/content/applications/finance/fiscal_localizations/chile.md b/content/applications/finance/fiscal_localizations/chile.md new file mode 100644 index 000000000..57f189cf6 --- /dev/null +++ b/content/applications/finance/fiscal_localizations/chile.md @@ -0,0 +1,1335 @@ +# Chile + +:::{tip} +Watch the two webinar recordings below for a general presentation of the localization, and search +the playlist for tutorials to discover practical workflows while using Odoo in Chile. + +- [Webinar: intro and demo](https://youtu.be/BHnByZiyYcM). +- [Webinar: delivery guide](https://youtu.be/X7i4PftnEdU). +- [Playlist of tutorials](https://youtube.com/playlist?list=PL1-aSABtP6AB6UY7VUFnVgeYOaz33fb4P). +::: + +:::{seealso} +- [Chilean localization app tour](https://www.youtube.com/watch?v=3qYkgbmBYHw) +- [Chilean localization smart tutorial](https://www.odoo.com/slides/smart-tutorial-localizacion-de-chile-131) +- {doc}`Documentation on e-invoicing's legality and compliance in Chile + <../accounting/customer_invoices/electronic_invoicing/chile>` +::: + +(chile-configuration)= + +## Modules + +{ref}`Install ` the following modules to utilize all the features of the Chilean +localization. + +```{eval-rst} +.. list-table:: + :header-rows: 1 + + * - Name + - Technical name + - Description + * - :guilabel:`Chile - Accounting` + - `l10n_cl` + - Adds the minimal accounting features required for a company to operate in Chile under the + :abbr:`SII (Servicio de Impuestos Internos)` regulations and guidelines. + * - :guilabel:`Chile - Accounting Reports` + - `l10n_cl_reports` + - Adds the *Propuesta F29* and *Balance Tributario (8 columnas)* reports. + * - :guilabel:`Chile - E-invoicing` + - `l10n_cl_edi` + - Includes all technical and functional requirements to receive and generate **electronic + receipts** and **invoices** online based on the :abbr:`SII (Servicio de Impuestos Internos)` + regulations. + * - :guilabel:`Electronic Exports of Goods for Chile` + - `l10n_cl_edi_exports` + - Includes technical and functional requirements to generate electronic invoices for exporting + goods based on the :abbr:`SII (Servicio de Impuestos Internos)` and customs regulations. + * - :guilabel:`Chile - E-Invoicing Delivery Guide` + - `l10n_cl_edi_stock` + - Includes all technical and functional requirements to generate delivery guides via web + service based on the :abbr:`SII (Servicio de Impuestos Internos)` regulations. +``` + +:::{note} +- Odoo automatically installs the appropriate package for the company according to the country + selected at the creation of the database. +- The *Chile - E-Invoicing Delivery Guide* module depends on the *Inventory* application. +::: + +:::{important} +All features are only available if the company already completed the [SII Sistema de Facturación +de Mercado](https://www.sii.cl/factura_electronica/factura_mercado/proceso_certificacion.htm) +certification process. +::: + +## Company information + +Navigate to {menuselection}`Settings --> Companies: Update Info` and ensure the following company +information is up-to-date and correctly filled in: + +- {guilabel}`Company Name` + +- {guilabel}`Address`: + + - {guilabel}`Street` + - {guilabel}`City` + - {guilabel}`State` + - {guilabel}`ZIP` + - {guilabel}`Country` + +- {guilabel}`Tax ID`: enter the identification number for the selected {ref}`Taxpayer Type + `. + +- {guilabel}`Activity Names`: select up to four activity codes. + +- {guilabel}`Company Activity Description`: enter a short description of the company's activity. + +## Accounting settings + +Next, navigate to {menuselection}`Accounting --> Configuration --> Settings --> Chilean +Localization` and follow the instructions to configure the: + +- {ref}`Fiscal information ` +- {ref}`Electronic invoice data ` +- {ref}`DTE incoming email server ` +- {ref}`Signature certificates ` + +(chile-fiscal-info)= + +### Fiscal information + +Configure the following {guilabel}`Tax payer information`: + +- {guilabel}`Taxpayer Type` by selecting the taxpayer type that applies: + + - {guilabel}`VAT Affected (1st Category)`: for invoices that charge taxes to customers + - {guilabel}`Fees Receipt Issuer (2nd Category)`: for suppliers who issue fees receipt (Boleta) + - {guilabel}`End consumer`: only issues receipts + - {guilabel}`Foreigner` + +- {guilabel}`SII Office`: select your company's {abbr}`SII (Servicio de Impuestos Internos)` + regional office + +(chile-electronic-invoice)= + +### Electronic invoice data + +Select your {guilabel}`SII Web Services` environment: + +- {guilabel}`SII - Test`: for test databases using test {abbr}`CAFs (Folio + Authorization Code)` obtained from the {abbr}`SII (Servicio de Impuestos Internos)`. In this mode, + the direct connection flows can be tested, with the files being sent to the {abbr}`SII (Servicio + de Impuestos Internos)`. +- {guilabel}`SII - Production`: for production databases. +- {guilabel}`SII - Demo Mode`: files are created and accepted automatically in demo mode but are + **not** sent to the {abbr}`SII (Servicio de Impuestos Internos)`. For this reason, rejection + errors or *Accepted with Objections* will not appear in this mode. Every internal validation can + be tested in demo mode. Avoid selecting this option in a production database. + +Then, enter the {guilabel}`Legal Electronic Invoicing Data`: + +- {guilabel}`SII Resolution N°` +- {guilabel}`SII Resolution Date` + +```{image} chile/electronic-invoice-data.png +:align: center +:alt: Required information for electronic invoice. +``` + +(chile-dte-email)= + +## DTE incoming email server + +The {abbr}`DTE (Documentos Tributarios Electrónicos)` {guilabel}`Email Box Electronic Invoicing` can +be defined to receive your customers' claim and acceptance emails. Enabling this option from +{menuselection}`Accounting --> Configuration --> Settings --> Chilean Localization` is necessary if +you want to use *Email Box Electronic Invoicing* as the {abbr}`DTE (Documentos Tributarios +Electrónicos)` incoming email server. + +:::{important} +In order to receive your SII documents, it's necessary to set up your own email server. More +information on how to do this can be found in this documentation: +{doc}`../../general/email_communication` +::: + +Begin by clicking {guilabel}`Configure DTE Incoming Email`, then click {guilabel}`New` to add a +server and fill in the following fields: + +- {guilabel}`Name`: give the server a name. + +- {guilabel}`Server Type`: select the server type used. + + - {guilabel}`IMAP Server` + - {guilabel}`POP Server` + - {guilabel}`Local Server`: uses a local script to fetch emails and create new records. The + script can be found in the {guilabel}`Configuration` section with this option selected. + - {guilabel}`Gmail OAuth Authentication`: requires your Gmail API credentials to be configured in + the general settings. A direct link to the configuration can be found in the {guilabel}`Login + Information` section. + +- {guilabel}`DTE Server`: enable this option. By checking this option, this email account will be + used to receive the electronic invoices from the suppliers, and communications from the {abbr}`SII + (Servicio de Impuestos Internos)` regarding the electronic invoices issued. In this case, this + email should match both emails declared on the {abbr}`SII (Servicio de Impuestos Internos)` site + in the section: *ACTUALIZACION DE DATOS DEL CONTRIBUYENTE*, *Mail Contacto SII* and *Mail Contacto + Empresas*. + +In the {guilabel}`Server & Login` tab (for IMAP and POP servers): + +- {guilabel}`Server Name`: enter the hostname or IP of the server. +- {guilabel}`Port`: enter the server port. +- {guilabel}`SSL/TLS`: enable this option if connections are encrypted using the SSL/TLS protocol. +- {guilabel}`Username`: enter the server login username. +- {guilabel}`Password`: enter the server login password. + +```{image} chile/dte-incoming-email.png +:align: center +:alt: Incoming email server configuration for Chilean DTE. +``` + +:::{tip} +Before going live, it is recommended to archive or remove all emails related to vendor bills that +are not required to be processed in Odoo from your inbox. +::: + +(chile-certificate)= + +### Certificate + +A digital certificate in `.pfx` format is required to generate the electronic invoice signature. To +add one, click {guilabel}`Configure Signature Certificates` under the {guilabel}`Signature +Certificates` section. Then, click {guilabel}`New` to configure the certificate: + +- {guilabel}`Certificate Key`: click {guilabel}`Upload your file` and select the `.pfx` file. +- {guilabel}`Certificate Passkey`: enter the file's passphrase. +- {guilabel}`Subject Serial Number`: depending on the certificate format, the field might not be + automatically populated. In that case, enter the certificate's legal representative {abbr}`RUT + (Rol Único Tributario)`. +- {guilabel}`Certificate Owner`: select one if you need to restrict the certificate for a specific + user. Leave the field empty to share it with all billing users. + +```{image} chile/new-certificate.png +:align: center +:alt: Digital certificate configuration. +``` + +## Multicurrency + +The official currency rate is provided by [Chilean mindicador.cl](https://mindicador.cl). Navigate +to {menuselection}`Accounting --> Configuration --> Settings --> Currencies: Automatic Currency +Rates` to set an {guilabel}`Interval` for when the rate is automatically updated, or to select +another {guilabel}`Service`. + +(chile-partner-information)= + +## Partner information + +Configuring partner contacts is also required to send {abbr}`SII (Servicio de Impuestos Internos)` +electronic invoices. Open the {menuselection}`Contacts` app to do so and fill in the following +fields on a new or existing contact form. + +- {guilabel}`Name` +- {guilabel}`Email` +- {guilabel}`Identification Number` +- {guilabel}`Taxpayer Type` +- {guilabel}`Activity Description` + +In the {guilabel}`Electronic Invoicing` tab: + +- {guilabel}`DTE Email`: enter the sender's email address for the partner. +- {guilabel}`Delivery Guide Price`: select which price the delivery guide displays, if any. + +:::{note} +The {guilabel}`DTE Email` is the email used for sending electronic documents and must be set in +the contact that will be part of an electronic document. +::: + +```{image} chile/dte-email-electronic-invoice.png +:align: center +:alt: Chilean electronic invoice data for partners. +``` + +## Document types + +Accounting documents are categorized by {abbr}`SII (Servicio de Impuestos Internos)`-defined +document types. + +Document types are created automatically upon installation of the localization module, and can be +managed by navigating to {menuselection}`Accounting --> Configuration --> Document Types`. + +```{image} chile/chilean-document-types.png +:align: center +:alt: Chilean fiscal document types list. +``` + +:::{note} +Several document types are inactive by default but can be activated by toggling the +{guilabel}`Active` option. +::: + +### Use on invoices + +The document type on each transaction is determined by: + +- The journal related to the invoice, identifying if the journal uses documents. +- The condition applied based on the type of issuer and recipient (e.g., the buyer or vendor's + fiscal regime). + +## Journals + +*Sales journals* in Odoo usually represent a business unit or location. + +```{eval-rst} +.. example:: + - Ventas Santiago. + - Ventas Valparaiso. +``` + +For retail stores it is common to have one journal per {abbr}`POS (Point of Sale)`. + +```{eval-rst} +.. example:: + - Cashier 1. + - Cashier 2. +``` + +The *purchase* transactions can be managed with a single journal, but sometimes companies use more +than one journal in order to handle some accounting transactions that are not related to vendor +bills. This configuration can easily be set by using the following model. + +```{eval-rst} +.. example:: + - Tax payments to the government. + - Employees payments. +``` + +### Create a sales journal + +To create a sales journal, navigate to {menuselection}`Accounting --> Configuration --> Journals`. +Then, click the {guilabel}`New` button, and fill in the following required information: + +- {guilabel}`Type`: select {guilabel}`Sale` from the drop-down menu for customer invoice journals. +- {guilabel}`Point of sale type`: if the sales journal will be used for electronic documents, the + option {guilabel}`Online` must be selected. Otherwise, if the journal is used for invoices + imported from a previous system or if you are using the {abbr}`SII (Servicio de Impuestos + Internos)` portal *Facturación MiPyme*, you can use the option {guilabel}`Manual`. +- {guilabel}`Use Documents`: check this field if the journal will use document types. This field is + only applicable to purchase and sales journals that can be related to the different sets of + document types available in Chile. By default, all the sales journals created will use documents. + +Next, from the {guilabel}`Jounal Entries` tab, define the {guilabel}`Default Income Account` and +{guilabel}`Dedicated Credit Note Squence` in the {guilabel}`Accounting Information` section. +Configuring these fields is required for one of the debit notes {ref}`use cases `. + +(chile-caf-documentation)= + +## CAF + +A *folio authorization code* (CAF) is required for each document type that will be issued +electronically. The {abbr}`CAF (Folio Authorization Code)` is a file the {abbr}`SII (Servicio de +Impuestos Internos)` provides to the issuer with the folios/sequences authorized for the electronic +invoice documents. + +Your company can request multiple folios and obtain several {abbr}`CAFs (Folio Authorization Codes)` +linked to different folio ranges. These {abbr}`CAFs (Folio Authorization Code)` are shared within +all journals, so you only need one active {abbr}`CAF (Folio Authorization Code)` per document type, +and it will be applied to all journals. + +Please refer to the [SII documentation](https://palena.sii.cl/dte/mn_timbraje.html) to check the +details on how to acquire the {abbr}`CAF (Folio Authorization Code)` files. + +:::{important} +The {abbr}`CAFs (Folio Authorization Code)` required by the {abbr}`SII (Servicio de Impuestos +Internos)` are different from production to test (certification mode). Make sure you have the +correct {abbr}`CAF (Folio Authorization Code)` set depending on your environment. +::: + +### Upload CAF files + +Once the {abbr}`CAF (Folio Authorization Code)` files have been acquired from the {abbr}`SII +(Servicio de Impuestos Internos)` portal, they need to be uploaded in the database by navigating to +{menuselection}`Accounting --> Configuration: Chilean SII --> CAFs`. Then, click the {guilabel}`New` +begin the configuration. On the {abbr}`CAF (Folio Authorization Code)` form, upload your {abbr}`CAF +(Folio Authorization Code)` file by clicking the {guilabel}`Upload your file` button and then click +{guilabel}`Save`. + +Once uploaded, the status changes to {guilabel}`In Use`. At this moment, when a transaction is used +for this document type, the invoice number takes the first folio in the sequence. + +:::{important} +The document types have to be active before uploading the {abbr}`CAF (Folio Authorization Code)` +files. In case some folios have been used in the previous system, the next valid folio has to be +set when the first transaction is created. +::: + +## Chart of accounts + +The chart of accounts is installed by default as part of the data set included in the localization +module. The accounts are mapped automatically in: + +- Taxes +- Default Account Payable +- Default Account Receivable +- Transfer Accounts +- Conversion Rate + +:::{seealso} +{doc}`../accounting/get_started/chart_of_accounts` +::: + +## Taxes + +As part of the localization module, taxes are created automatically with their related financial +account and configuration. These taxes can be managed from {menuselection}`Accounting --> +Configuration --> Taxes`. + +Chile has several tax types, the most common ones are: + +- **VAT**: the regular VAT can have several rates. +- **ILA**: the tax for alcoholic drinks. + +:::{seealso} +{doc}`../accounting/taxes` +::: + +## Usage and testing + +### Electronic invoice workflow + +In the Chilean localization, the electronic invoice workflow includes customer invoice issuance and +vendor bill reception. The following diagram explains how information is shared to the {abbr}`SII +(Servicio de Impuestos Internos)`, customers, and vendors. + +```{image} chile/electronic-invoice-workflow.png +:align: center +:alt: Diagram with Electronic invoice transactions. +``` + +### Customer invoice emission + +After the partners and journals are created and configured, the invoices are created in the standard +way. For Chile, one of the differences is the document type that is automatically selected based on +the taxpayer. The document type can be changed manually if needed on the invoice by navigating to +{menuselection}`Accounting --> Customers --> Invoices`. + +```{image} chile/customer-invoice-document-type.png +:align: center +:alt: Customer invoice document type selection. +``` + +:::{important} +{guilabel}`Documents type 33` electronic invoice must have at least one item with tax, otherwise +the {abbr}`SII (Servicio de Impuestos Internos)` rejects the document validation. +::: + +(chile-electronic-invoice-validation)= + +#### Validation and DTE status + +Once all invoice information is filled, either manually or automatically when generated from a sales +order, validate the invoice. After the invoice is posted: + +- The {abbr}`DTE (Documentos Tributarios Electrónicos)` file is created automatically and recorded + in the chatter. + +- The {abbr}`DTE (Documentos Tributarios Electrónicos)` {abbr}`SII (Servicio de Impuestos Internos)` + status is set as {guilabel}`Pending` to be sent. + + ```{image} chile/xml-creation.png + :align: center + :alt: DTE XML File displayed in chatter. + ``` + +The {abbr}`DTE (Documentos Tributarios Electrónicos)` status is updated automatically by Odoo with a +scheduled action that runs every day at night, if the response from the {abbr}`SII (Servicio de +Impuestos Internos)` is needed immediately, you can do it manually as well by following the +{abbr}`DTE (Documentos Tributarios Electrónicos)` status workflow: + +```{image} chile/dte-status-flow.png +:align: center +:alt: Transition of DTE status flow. +``` + +1. The first step is to send the {abbr}`DTE (Documentos Tributarios Electrónicos)` to the {abbr}`SII + (Servicio de Impuestos Internos)`. This can be sent manually by clicking the {guilabel}`Enviar + Ahora` button. This generates a {guilabel}`SII Tack number` for the invoice, which is used to + check the details sent by the {abbr}`SII (Servicio de Impuestos Internos)` via email. Then, the + {guilabel}`DTE status` is updated to {guilabel}`Ask for Status`. + +2. Once the {abbr}`SII (Servicio de Impuestos Internos)` response is received, Odoo updates the + {guilabel}`DTE status`. To do it manually, click on the button {guilabel}`Verify on SII`. The + result can either be {guilabel}`Accepted`, {guilabel}`Accepted With Objection` or + {guilabel}`Rejected`. + + ```{image} chile/dte-status-steps.png + :align: center + :alt: Identification transaction for invoice and Status update. + ``` + + :::{important} + There are intermediate statuses in the {abbr}`SII (Serviciqo de Impuestos Internos)` before + acceptance or rejection. It's recommended to **NOT** continuously click {guilabel}`Verify in + SII` for smooth processing. + + ```{image} chile/chatter-internal-statuses.png + :align: center + :alt: Electronic invoice data statuses. + ``` + ::: + +3. The final response from the {abbr}`SII (Servicio de Impuestos Internos)` can take on one of these + values: + + - {guilabel}`Accepted`: indicates the invoice information is correct, our document is now + fiscally valid and it's automatically sent to the customer. + + - {guilabel}`Accepted with objections`: indicates the invoice information is correct, but a minor + issue was identified, nevertheless the document is now fiscally valid and it's automatically + sent to the customer. + + - {guilabel}`Rejected`: indicates the invoice information is incorrect and must be corrected. + Details are sent to emails you registered in the {abbr}`SII (Servicio de Impuestos Internos)`. + If it is properly configured in Odoo, the details are also retrieved in the chatter once the + email server is processed. + + If the invoice is rejected please follow these steps: + + 1. Change the document to {guilabel}`Draft`. + 2. Make the required corrections based on the message received from the {abbr}`SII (Servicio + de Impuestos Internos)` in the chatter. + 3. Post the invoice again. + + ```{image} chile/rejected-invoice.png + :align: center + :alt: Message when an invoice is rejected. + ``` + +#### Crossed references + +When the invoice is created, as a result of another fiscal document, the information related to the +originator document must be registered in the {guilabel}`Cross-Reference` tab. This tab is commonly +used for credit or debit notes, however, in some cases it can be used for customer invoices, as +well. In the case of the credit and debit notes, they are set automatically by Odoo. + +```{image} chile/cross-reference-tab-registration.png +:align: center +:alt: Crossed referenced document(s). +``` + +(chile-electronic-invoice-pdf-report)= + +#### Invoice PDF report + +Once the invoice is accepted and validated by the {abbr}`SII (Servicio de Impuestos Internos)` and +the PDF is printed, it includes the fiscal elements that indicate that the document is fiscally +valid. + +```{image} chile/accepted-invoice-fiscal-information.png +:alt: Fiscal elements and barcode printed in accepted invoices. +``` + +:::{important} +If you are hosted in Odoo SH or On-Premise, you should manually install the [pdf417gen](https://pypi.org/project/pdf417gen/) library. Use the following command to install it: +{command}`pip install pdf417gen`. +::: + +#### Commercial validation + +Once the invoice has been sent to the customer: + +1. {guilabel}`DTE Partner Status` changes to {guilabel}`Sent`. +2. The customer must send a reception confirmation email. +3. Subsequently, if commercial terms and invoice data are correct, an acceptance confirmation is + sent; otherwise, a claim is sent. +4. The field {guilabel}`DTE Acceptance Status` is updated automatically. + +```{image} chile/partner-dte-status.png +:align: center +:alt: Message with the commercial acceptance from the customer. +``` + +#### Processed for claimed invoices + +Once the invoice has been accepted by the {abbr}`SII (Servicio de Impuestos Internos)`, **it can not +be cancelled in Odoo**. In case you get a claim for your customer, the correct way to proceed is +with a credit note to either cancel the invoice or correct it. Please refer to the +{ref}`chile/credit-notes` section for more details. + +```{image} chile/accepted-invoice.png +:align: center +:alt: Invoice Commercial status updated to claimed. +``` + +#### Common errors + +There are multiple reasons behind a rejection from the {abbr}`SII (Servicio de Impuestos Internos)`, +but these are some of the common errors you might have and how to solve them: + +- **Error:** + + `RECHAZO- DTE Sin Comuna Origen` + **Hint:** + make sure the company address is properly filled including the state and city. +- **Error:** + + `en Monto - IVA debe declararse` + **Hint:** + the invoice lines should include one VAT tax, make sure you add one on each invoice + line. +- **Error:** + + `Rut No Autorizado a Firmar` + **Hint:** + the + {abbr}`RUT (Rol Único Tributario)` + entered is not allowed to invoice + electronically, make sure the company + {abbr}`RUT (Rol Único Tributario)` + is correct and is valid + in the + {abbr}`SII (Servicio de Impuestos Internos)` + to invoice electronically. +- **Error:** + + `Fecha/Número Resolucion Invalido RECHAZO- CAF Vencido : (Firma_DTE[AAAA-MM-DD] - + CAF[AAAA-MM-DD]) > 6 meses` + **Hint:** + try to add a new CAF related to this document as the one you're using is expired. +- **Error:** + + `Element '{http://www.sii.cl/SiiDte%7DRutReceptor': This element is not expected. + Expected is ( {http://www.sii.cl/SiiDte%7DRutEnvia ).` + **Hint:** + Make sure the field + {guilabel}`Document Type` + and + {guilabel}`VAT` + are set in the + customer and in the main company. +- **Error:** + + `Usuario sin permiso de envio.` + **Hint:** + this error indicates that most likely, your company has not passed the + [Certification + process](https://www.sii.cl/factura_electronica/factura_mercado/proceso_certificacion.htm) + in + the + {abbr}`SII (Servicio de Impuestos Internos)` + - Sistema de Facturación de Mercado. If this is + the case, please contact your Account Manager or Customer Support as this certification is not + part of the Odoo services, but we can give you some alternatives. If you already passed the + certification process, this error appears when a user different from the owner of the + certificate is trying to send + {abbr}`DTE (Documentos Tributarios Electrónicos)` + files to the + + {abbr}`SII (Servicio de Impuestos Internos)` + . +- **Error:** + + `CARATULA` + **Hint:** + there are just five reasons why this error could show up and all of them are related + to the + *Caratula* + section of the XML: + > - The company's {abbr}`RUT (Rol Único Tributario)` number is incorrect or missing. + > - The certificate owner {abbr}`RUT (Rol Único Tributario)` number is incorrect or missing. + > - The {abbr}`SII's (Servicio de Impuestos Internos)` {abbr}`RUT (Rol Único Tributario)` number + > (this should be correct by default) is incorrect or missing. + > - The resolution date is incorrect or missing. + > - The resolution number is incorrect or missing. + +(chile-credit-notes)= + +### Credit notes + +When a cancellation or correction is needed over a validated invoice, a credit note must be +generated. It is important to consider that a {abbr}`CAF (Folio Authorization Code)` file is +required for the credit note, which is identified as {guilabel}`Document Type` {guilabel}`61` in the +{abbr}`SII (Servicio de Impuestos Internos)`. Please refer to the {ref}`CAF section +` for more information on the process to load the {abbr}`CAF (Folio +Authorization Code)` on each document type. + +```{image} chile/credit-note-document-type.png +:align: center +:alt: Creation of CAF for Credit notes. +``` + +#### Use cases + +##### Cancel referenced document + +In case you need to cancel or invalidate an invoice, navigate to {menuselection}`Accounting --> +Customers --> Invoices` and select the desired invoice. Then, use the button {guilabel}`Add Credit +Note` and select {guilabel}`Full Refund`, in this case the {abbr}`SII (Servicio de Impuestos +Internos)` reference code is automatically set to {guilabel}`Anula Documento de referencia`. + +```{image} chile/credit-note-cancel-ref-doc.png +:align: center +:alt: Credit note cancelling the referenced document. +``` + +##### Correct referenced document + +If a correction in the invoice information is required, for example the street name on the original +invoice is wrong, then use the button {guilabel}`Add Credit Note`, select {guilabel}`Partial Refund` +and select the option {guilabel}`Only Text Correction`. In this case the {guilabel}`SII Reference +Code` field is automatically set to {guilabel}`Corrects Referenced Document Text`. + +```{image} chile/credit-note-correct-text.png +:align: center +:alt: Credit note correcting referenced document text. +``` + +Odoo creates a credit note with the corrected text in an invoice and {guilabel}`Price` `0.00`. + +```{image} chile/text-correction-label.png +:align: center +:alt: Credit note with the corrected value on the invoice lines. +``` + +:::{important} +Make sure to define the {guilabel}`Default Credit Account` in the sales journal specifically for +this use case. +::: + +##### Corrects referenced document amount + +When a correction on the amounts is required, use the button {guilabel}`Add Credit note` and select +{guilabel}`Partial Refund`. In this case the {guilabel}`SII Reference Code` is automatically set to +{guilabel}`Corrige el monto del Documento de Referencia`. + +```{image} chile/credit-note-correct-amount.png +:align: center +:alt: Credit note for partial refund to correct amounts, using the SII reference code +: 3. +``` + +### Debit notes + +In Chilean localization, debit notes, in addition to credit notes, can be created using the +{guilabel}`Add Debit Note` button, with two main use cases. + +(chile-use-cases)= + +#### Use cases + +##### Add debt on invoices + +The primary use case for debit notes is to increase the value of an existing invoice. To do so, +select option {guilabel}`3. Corrige el monto del Documento de Referencia` for the +{guilabel}`Reference Code SII` field. + +```{image} chile/debit-note-correct-amount.png +:align: center +:alt: Debit note correcting referenced document amount. +``` + +In this case Odoo automatically includes the {guilabel}`Source Invoice` in the {guilabel}`Cross +Reference` tab. + +```{image} chile/auto-ref-debit-note.png +:align: center +:alt: Automatic reference to invoice in a debit note. +``` + +:::{tip} +You can only add debit notes to an invoice already accepted by the SII. +::: + +##### Cancel credit notes + +In Chile, debits notes are used to cancel a valid credit note. To do this, click the {guilabel}`Add +Debit Note` button and select the {guilabel}`1: Anula Documentos de referencia` option for the +{guilabel}`Reference Code SII` field. + +```{image} chile/debit-note-cancel-ref-doc.png +:align: center +:alt: Debit note to cancel the referenced document (credit note). +``` + +### Vendor bills + +As part of the Chilean localization, you can configure your incoming email server to match the one +you have registered in the {abbr}`SII (Servicio de Impuestos Internos)` in order to: + +- Automatically receive the vendor bills {abbr}`DTE (Documentos Tributarios Electrónicos)` and + create the vendor bill based on this information. +- Automatically send the reception acknowledgement to your vendor. +- Accept or claim the document and send this status to your vendor. + +#### Reception + +As soon as the vendor email with the attached {abbr}`DTE (Documentos Tributarios Electrónicos)` is +received: + +1. The vendor bill maps all the information included in the XML. +2. An email is sent to the vendor with the reception acknowledgement. +3. The {guilabel}`DTE Status` is set as {guilabel}`Acuse de Recibido Enviado`. + +#### Acceptation + +If all the commercial information is correct on your vendor bill, then you can accept the document +using the {guilabel}`Aceptar Documento` button. Once this is done, the {guilabel}`DTE Acceptation +Status` changes to {guilabel}`Accepted` and an email of acceptance is sent to the vendor. + +```{image} chile/accept-vendor-bill-btn.png +:align: center +:alt: Button for accepting vendor bills. +``` + +#### Claim + +In case there is a commercial issue or the information is not correct on your vendor bill, you can +claim the document before validating it, using the {guilabel}`Claim` button. Once this is done, the +{guilabel}`DTE Acceptation Status` changes to {guilabel}`Claim` and a rejection email is sent to the +vendor. + +```{image} chile/claim-vendor-bill-btn.png +:align: center +:alt: |- +: Claim button in vendor bills to inform the vendor all the document is commercially +: rejected. +``` + +If you claim a vendor bill, the status changes from {guilabel}`Draft` to {guilabel}`Cancel` +automatically. Considering this as best practice, all the claimed documents should be cancelled as +they won't be valid for your accounting records. + +### Electronic purchase invoice + +The *electronic purchase invoice* is a feature included in the `l10n_cl_edi` module. + +Once all configurations have been made for {ref}`electronic invoices ` +(e.g., uploading a valid company certificate, setting up master data, etc.), the electronic +purchase invoices need their own {abbr}`CAFs (Folio Authorization Code)`. Please refer to the +{ref}`CAF documentation ` to check the details on how to acquire the +{abbr}`CAFs (Folio Authorization Code)` for electronic purchase invoices. + +Electronic purchase invoices are useful when vendors are not obligated to expedite an electronic +vendor bill for your purchase. Still, your obligations require a document to be sent to the +{abbr}`SII (Servicio de Impuestos Internos)` as proof of purchase. + +#### Configuration + +To generate an electronic purchase invoice from a vendor bill, the bill must be created in a +purchase journal with the *Use Documents* feature enabled. It is possible to modify an existing +purchase journal or create a new one in the following process. + +To modify the existing purchase journal, or create a new purchase journal, navigate to +{menuselection}`Accounting --> Configuration --> Journals`. Then, click the {guilabel}`New` button, +and fill in the following required information: + +- {guilabel}`Type`: select {guilabel}`Purchase` from the drop-down menu for vendor bill journals. +- {guilabel}`Use Documents`: check this field so the journal can generate electronic documents (in + this case the electronic purchase invoice). + +#### Generate an electronic purchase invoice + +To generate this type of document, it is necessary to create a vendor bill in Odoo. To do so, +navigate to {menuselection}`Accounting --> Vendors --> Bills`, and click the {guilabel}`New` button. + +When all of the electronic purchase invoice information is filled, select the option {guilabel}`(46) +Electronic Purchase Invoice` in the {guilabel}`Document Type` field: + +After the vendor bill is posted: + +- The {abbr}`DTE (Documentos Tributarios Electrónicos)` file (Electronic Tax Document) is + automatically created and added to the chatter. +- The {guilabel}`DTE SII Status` is set as {guilabel}`Pending to be sent`. + +Odoo automatically updates the *DTE Status* every night using a scheduled action. To get a response +from the {abbr}`SII (Servicio de Impuestos Internos)` immediately, click the {guilabel}`Send now to +SII` button. + +### Delivery guide + +To install the {guilabel}`Delivery Guide` module, go to {menuselection}`Apps` and search for `Chile +(l10n_cl)`. Then click {guilabel}`Install` on the module {guilabel}`Chile - E-Invoicing Delivery +Guide`. + +:::{note} +{guilabel}`Chile - E-Invoicing Delivery Guide` has a dependency with {guilabel}`Chile - +Facturación Electrónica`. Odoo will install the dependency automatically when the +{guilabel}`Delivery Guide` module is installed. +::: + +The *Delivery Guide* module includes the ability to send the {abbr}`DTE (Documentos Tributarios +Electrónicos)` to {abbr}`SII (Servicio de Impuestos Internos)` and the stamp in PDF reports for +deliveries. + +Once all configurations have been made for {ref}`electronic invoices ` +(e.g., uploading a valid company certificate, setting up master data, etc.), delivery guides need +their own {abbr}`CAFs (Folio Authorization Code)`. Please refer to the {ref}`CAF documentation +` to check the details on how to acquire the {abbr}`CAF (Folio +Authorization Code)` for electronic Delivery Guides. + +Verify the following important information in the {guilabel}`Price for the Delivery Guide` +configuration: + +- {guilabel}`From Sales Order`: delivery guide takes the product price from the sales order and + shows it on the document. +- {guilabel}`From Product Template`: Odoo takes the price configured in the product template and + shows it on the document. +- {guilabel}`No show price`: no price is shown in the delivery guide. + +Electronic delivery guides are used to move stock from one place to another and they can represent +sales, sampling, consignment, internal transfers, and basically any product move. + +#### Delivery guide from a sales process + +:::{warning} +A delivery guide should **not** be longer than one page or contain more than 60 product lines. +::: + +When a sales order is created and confirmed, a delivery order is generated. After validating the +delivery order, the option to create a delivery guide is activated. + +```{image} chile/delivery-guide-creation-btn.png +:align: center +:alt: Create Delivery Guide button on a sales process. +``` + +:::{warning} +When clicking on {guilabel}`Create Delivery Guide` for the first time, a warning message pops up, +stating the following: + +`No se encontró una secuencia para la guía de despacho. Por favor, establezca el primer número +dentro del campo número para la guía de despacho` + +```{image} chile/delivery-guide-number-warning.png +:align: center +:alt: First Delivery Guide number warning message. +``` +::: + +This warning message means the user needs to indicate the next sequence number Odoo has to take to +generate the delivery guide (e.g. next available {abbr}`CAF (Folio Authorization Code)` number), and +only happens the first time a delivery guide is created in Odoo. After the first document has been +correctly generated, Odoo takes the next available number in the {abbr}`CAF (Folio Authorization +Code)` file to generate the following delivery guide. + +After the delivery guide is created: + +- The {abbr}`DTE (Documentos Tributarios Electrónicos)` file (Electronic Tax Document) is + automatically created and added to the {guilabel}`chatter`. +- The {guilabel}`DTE SII Status` is set as {guilabel}`Pending to be sent`. + +```{image} chile/chatter-delivery-guide.png +:align: center +:alt: Chatter notes of Delivery Guide creation. +``` + +The {guilabel}`DTE Status` is automatically updated by Odoo with a scheduled action that runs every +night. To get a response from the {abbr}`SII (Servicio de Impuestos Internos)` immediately, press +the {guilabel}`Send now to SII` button. + +Once the delivery guide is sent, it may then be printed by clicking on the {guilabel}`Print Delivery +Guide` button. + +```{image} chile/print-delivery-guide-btn.png +:align: center +:alt: Printing Delivery Guide PDF. +``` + +Delivery guide will have fiscal elements that indicate that the document is fiscally valid when +printed (if hosted in *Odoo SH* or on *On-premise* remember to manually add the +{guilabel}`pdf417gen` library mentioned in the {ref}`Invoice PDF report section +`). + +### Electronic receipt + +To install the {guilabel}`Electronic Receipt` module, go to {menuselection}`Apps` and search for +`Chile (l10n_cl)`. Then click {guilabel}`Install` on the module {guilabel}`Chile - Electronic +Receipt`. + +:::{note} +{guilabel}`Chile - Electronic Receipt` has a dependency with {guilabel}`Chile - Facturación +Electrónica`. Odoo will install the dependency automatically when the {guilabel}`E-invoicing +Delivery Guide` module is installed. +::: + +Once all configurations have been made for {ref}`electronic invoices ` +(e.g., uploading a valid company certificate, setting up master data, etc.), electronic receipts +need their own {abbr}`CAFs (Folio Authorization Code)`. Please refer to the {ref}`CAF documentation +` to check the details on how to acquire the {abbr}`CAFs (Folio +Authorization Code)` for electronic receipts. + +Electronic receipts are useful when clients do not need an electronic invoice. By default, there is +a partner in the database called {guilabel}`Anonymous Final Consumer` with a generic {abbr}`RUT (Rol +Único Tributario)` `66666666-6` and taxpayer type of {guilabel}`Final Consumer`. This partner can be +used for electronic receipts or a new record may be created for the same purpose. + +```{image} chile/electronic-receipt-customer.png +:align: center +:alt: Electronic Receipt module. +``` + +Although electronic receipts should be used for final consumers with a generic {abbr}`RUT (Rol Único +Tributario)`, it can also be used for specific partners. After the partners and journals are created +and configured, the electronic receipts are created in the standard way as electronic invoice, but +the type of document {guilabel}`(39) Electronic Receipt` should be selected in the invoice form: + +```{image} chile/document-type-39.png +:align: center +:alt: Document type 39 for Electronic Receipts. +``` + +#### Validation and DTE status + +When all of the electronic receipt information is filled, manually (or automatically) proceed to +validate the receipt from the sales order. By default, {guilabel}`Electronic Invoice` is selected as +the {guilabel}`Document Type`, however in order to validate the receipt correctly, make sure to edit +the {guilabel}`Document Type` and change to {guilabel}`Electronic Receipt`. + +After the receipt is posted: + +- The {abbr}`DTE (Documentos Tributarios Electrónicos)` file (Electronic Tax Document) is created + automatically and added to the {guilabel}`chatter`. +- The {guilabel}`DTE SII Status` is set as {guilabel}`Pending to be sent`. + +```{image} chile/electronic-receipt-ste-status.png +:align: center +:alt: Electronic Receipts STE creation status. +``` + +The {guilabel}`DTE Status` is automatically updated by Odoo with a scheduled action that runs every +day at night. To get a response from the {abbr}`SII (Servicio de Impuestos Internos)` immediately, +press the {guilabel}`Send now to SII` button. + +Please refer to the {ref}`DTE Workflow ` for electronic +invoices as the workflow for electronic receipt follows the same process. + +### Electronic export of goods + +To install the {guilabel}`Electronic Exports of Goods` module, go to {menuselection}`Apps` and +search for `Chile (l10n_cl)`. Then click {guilabel}`Install` on the module {guilabel}`Electronic +Exports of Goods for Chile`. + +:::{note} +{guilabel}`Chile - Electronic Exports of Goods for Chile` has a dependency with {guilabel}`Chile +\- Facturación Electrónica`. +::: + +Once all configurations have been made for {ref}`electronic invoices ` +(e.g., uploading a valid company certificate, setting up master data, etc.), electronic exports of +goods need their own {abbr}`CAFs (Folio Authorization Code)`. Please refer to the {ref}`CAF +documentation ` to check the details on how to acquire the {abbr}`CAFs +(Folio Authorization Code)` for electronic receipts. + +Electronic invoices for the export of goods are tax documents that are used not only for the +{abbr}`SII (Servicio de Impuestos Internos)` but are also used with customs and contain the +information required by it. + +#### Contact configurations + +```{image} chile/taxpayer-type-export-goods.png +:align: center +:alt: Taxpayer Type needed for the Electronic Exports of Goods module. +``` + +#### Chilean customs + +When creating an electronic exports of goods invoice, these new fields in the {guilabel}`Other Info` +tab are required to comply with Chilean regulations. + +```{image} chile/chilean-custom-fields.png +:align: center +:alt: Chilean customs fields. +``` + +#### PDF report + +Once the invoice is accepted and validated by the {abbr}`SII (Servicio de Impuestos Internos)` and +the PDF is printed, it includes the fiscal elements that indicate that the document is fiscally +valid and a new section needed for customs. + +```{image} chile/pdf-report-section.png +:align: center +:alt: PDF report section for the Electronic Exports of Goods PDF Report. +``` + +### eCommerce electronic invoicing + +To install the {guilabel}`Chilean eCommerce` module, go to {menuselection}`Apps, search for the +module by its technical name `l10n_cl_edi_website_sale`, and click the {guilabel}`Activate` button. + +```{image} chile/ecommerce-module-chile.png +:align: center +:alt: l10n_cl eCommerce module. +``` + +This module enables the features and configurations to: + +- Generate electronic documents from the *eCommerce* application +- Support for required fiscal fields in the *eCommerce* application +- Effectively let the final client decide the electronic document to be generated for their + purchase + +Once all of the configurations are made for the Chilean {ref}`electronic invoice +` flow, the following configurations are required for the eCommerce flow +to be integrated. + +To configure your website to generate electronic documents during the sale process, go to +{menuselection}`Website --> Configuration --> Settings --> Invoicing` and activate the +{guilabel}`Automatic Invoice` feature. Activating this feature allows electronic documents to be +automatically generated when an online payment is confirmed. + +```{image} chile/website-configurations-ecommerce-chile.png +:align: center +:alt: Invoice Policy and Automatic Invoice configurations. +``` + +Since an online payment needs to be confirmed for the *automatic invoice* feature to generate the +document, a payment provider must be configured for the related website. + +:::{note} +Review the {doc}`../payment_providers` documentation for information on which payment providers +are supported in Odoo, and how to configure them. +::: + +It is also recommended to configure your products so they are able to be invoiced when an online +payment is confirmed. To do so, go to {menuselection}`Website --> eCommerce --> Products` and select +the product template of the desired product. Then, set the {guilabel}`Invoicing Policy` to +{guilabel}`Ordered quantities`. + +```{image} chile/ordered-quantities-product.png +:align: center +:alt: Invoice Policy configuration in Products. +``` + +#### Invoicing flows + +Clients from Chile will be able to select if they need an **invoice** or a **ballot** for their +purchase with an extra step added during the checkout process. + +```{image} chile/select-edi-docs-ecommerce.png +:align: center +:alt: Option for EDI Documents for clients. +``` + +If the customer selects the {guilabel}`Electronic Invoice` option, fiscal fields are required to be +filled out, including the {guilabel}`Activity Description`, the {guilabel}`Identification Number` +and their {guilabel}`DTE Email`. + +```{image} chile/fiscal-fields-invoice-ecommerce.png +:align: center +:alt: Fiscal fields required for an Invoice to be requested. +``` + +If the client selects the {guilabel}`Electronic Receipts` option, they will be directed to the next +step, and the electronic document will be generated for the *Consumidor Final Anónimo* contact. + +Clients from countries other than Chile, will have their electronic receipts automatically generated +for them by Odoo. + +:::{note} +If a purchase through eCommerce requires an export, the customer will need to contact your +company to generate an electronic export invoice (*document type 110*), which can be done from +the *Accounting* app. +::: + +### Point of Sale electronic invoicing + +To install the {guilabel}`Chilean Module for Point of Sale`, go to the {menuselection}`Apps` +application on the main Odoo dashboard, search for the module by its technical name +`l10n_cl_edi_pos`, and click the {guilabel}`Activate` button. + +```{image} chile/pos-edi-module-chile.png +:align: center +:alt: l10n_cl POS EDI module. +``` + +This module enables the following features and configurations to: + +- Generate electronic documents from the *Point of Sale* application +- Support the required fiscal fields for contacts created in the *Point of Sale* application +- Effectively lets the final client decide the type of electronic document to be generated for their + purchase +- Print QR or 5-digit codes in tickets to access to electronic invoices + +To configure contacts with the required fiscal information, review the {ref}`partner information +` section, or directly modify a contact. Navigate to +{menuselection}`Point of Sale --> Session --> Customers --> Details`, and edit any of the following +fields: + +- {guilabel}`Name` +- {guilabel}`Email` +- {guilabel}`Identification Type` +- {guilabel}`Tax Payer Type` +- {guilabel}`Type Giro` +- {guilabel}`DTE Email` +- {guilabel}`RUT` + +```{image} chile/fiscal-required-pos-session.png +:align: center +:alt: Contact with fiscal information created from POS. +``` + +To configure the products, navigate to {menuselection}`Point of Sale --> Products --> Products` and +select a product record. In the {guilabel}`Sales` tab of the product form, it is necessary to mark +the product as {guilabel}`Available for POS`, this makes the product available for sale in the +*Point of Sale* app. + +```{image} chile/available-in-pos-product.png +:align: center +:alt: Product with fiscal information created from POS. +``` + +Optionally, the following features are available for configuration in the {menuselection}`Point of +Sale --> Configuration --> Settings --> Bills & Receipts section`: + +- {guilabel}`Use QR code on ticket`: this feature enables a QR code to be printed on the user's + receipt so they can easily request an invoice after their purchase +- {guilabel}`Generate a code on ticket`: this feature enables a 5-digit code to be generated on the + receipt, allowing the user to request an invoice through the customer portal + +```{image} chile/qr-code-ticket.png +:align: center +:alt: Configuration to generate QR or 5 digit codes on tickets. +``` + +#### Invoicing flows + +The following sections cover the invoicing flows for the *Point of Sale* application. + +##### Electronic receipts: anonymous end user + +When making a purchase as an anonymous user that does not request an electronic invoice, Odoo +automatically selects {guilabel}`Consumidor Final Anónimo` as the contact for the order and +generates the electronic receipt. + +```{image} chile/invoice-receipt-selection.png +:align: center +:alt: Automatic contact selection of an anonymous end consumer. +``` + +:::{note} +If the client requests a credit note due to a return of their purchase, the credit note should be +made using the *Accounting* app. See the {doc}`credit notes and refunds +<../accounting/customer_invoices/credit_notes>` documentation for detailed instructions. +::: + +##### Electronic receipts: specific customer + +When specific user makes a purchase that does not request an electronic invoice, Odoo automatically +selects the contact for the order as the {guilabel}`Consumidor Final Anónimo`, and allows you to +select or create the required customer contact with their fiscal information for the receipt. + +```{image} chile/contact-for-electronic-invoice.png +:align: center +:alt: Selection of contact for the receipt. +``` + +:::{note} +If the client requests a credit note because of a return of this type of purchase, the credit +note and return process can be managed directly from the {abbr}`POS (Point of Sale)` session. +::: + +##### Electronic invoices + +When clients request an electronic invoice, it is possible to select or create the required contact +with their fiscal information. When the payment is being made, select the option {guilabel}`Invoice` +to generate the document. + +```{image} chile/invoice-option-at-payment.png +:align: center +:alt: Selection of invoice option at payment. +``` + +:::{note} +For both the electronic receipts and invoices, if the product is not affected by taxes, Odoo +detects this and generates the correct type of document for tax-exempt sales. +::: + +##### Returns + +For electronic receipts (not generated for the *Consumidor Final Anónimo*) and electronic invoices, +it is possible to manage the process to return products sold in a {abbr}`POS (Point of Sale)` order +by selecting the {guilabel}`Refund` button. + +```{image} chile/refund-order.png +:align: center +:alt: Refund option in the POS application. +``` + +Orders can be searched by the order status or by contact, and be selected for the refund to be based +on the client's original order. + +```{image} chile/select-order-refund.png +:align: center +:alt: Selection of order for the refund process. +``` + +When the return payment is validated, Odoo generates the necessary credit note, referencing the +original receipt or invoice, partially or fully cancelling the document. + +:::{seealso} +[Smart tutorial - Electronic invoicing for point of sale](https://www.youtube.com/watch?v=B2XuWmtlmno&t=360s). +::: + +## Financial reports + +### Balance tributario de 8 columnas + +This report presents the accounts in detail (with their respective balances), classifying them +according to their origin and determining the level of profit or loss that the business had within +the evaluated period of time. + +You can find this report in {menuselection}`Accounting --> Reporting --> Balance Sheet` and +selecting in the {guilabel}`Report` field the option {guilabel}`Chilean Fiscal Balance (8 Columns) +(CL)`. + +```{image} chile/locate-fiscal-balance-report.png +:align: center +:alt: Location of the Reporte Balance Tributario de 8 Columnas. +``` + +```{image} chile/8-col-fiscal-balance-report.png +:align: center +:alt: Chilean Fiscal Balance (8 Columns). +``` + +### Propuesta F29 + +The form *F29* is a new system that the {abbr}`SII (Servicio de Impuestos Internos)` enabled to +taxpayers, and that replaces the *Purchase and Sales Books*. This report is integrated by Purchase +Register (CR) and the Sales Register (RV). Its purpose is to support the transactions related to +VAT, improving its control and declaration. + +:::{important} +The *Propuesta F29 (CL)* report in Odoo covers the basic legal requirements as a first proposal +for your final tax declaration. +::: + +This record is supplied by the electronic tax documents (DTE's) that have been received by the +{abbr}`SII (Servicio de Impuestos Internos)`. + +You can find this report in {menuselection}`Accounting --> Reporting --> Tax Reports` and selecting +the {guilabel}`Report` option {guilabel}`Propuesta F29 (CL)`. + +```{image} chile/locate-propuesta-f29-report.png +:align: center +:alt: Location of the Propuesta F29 (CL) Report. +``` + +It is possible to set the {abbr}`PPM (Provisional Monthly Payments rate)` and the +{guilabel}`Proportional Factor for the fiscal year` from the {menuselection}`Accounting --> +Configuration --> Settings`. + +```{image} chile/f29-report.png +:align: center +:alt: Default PPM and Proportional Factor for the Propuesta F29 Report. +``` + +Or manually in the reports by clicking on the {guilabel}`✏️ (pencil)` icon. + +```{image} chile/manual-ppm-f29-report.png +:align: center +:alt: Manual PPM for the Propuesta F29 Report. +``` + diff --git a/content/applications/finance/fiscal_localizations/colombia.md b/content/applications/finance/fiscal_localizations/colombia.md new file mode 100644 index 000000000..311e47423 --- /dev/null +++ b/content/applications/finance/fiscal_localizations/colombia.md @@ -0,0 +1,492 @@ +--- +substitutions: + DIAN: "{abbr}`DIAN (Direcci\xF3n de Impuestos y Aduanas Nacionales)`" + NIT: "{abbr}`NIT (El N\xFAmero de Identificaci\xF3n Tributaria)`" +--- + +# Colombia + +Odoo's Colombian localization package provides accounting, fiscal, and legal features for databases +in Colombia - such as chart of accounts, taxes, and electronic invoicing. The localization has the +following [prerequisites](https://micrositios.dian.gov.co/sistema-de-facturacion-electronica/que-requieres-para-factura-electronicamente/) +when using the [DIAN Own Software](https://micrositios.dian.gov.co/sistema-de-facturacion-electronica/como-puedes-facturar-electronicamente/) +solution with Odoo: + +- Be registered in the [RUT](https://www.dian.gov.co/tramitesservicios/tramites-y-servicios/tributarios/Paginas/RUT.aspx) + (Registro Único Tributario) with a valid {{ NIT }}. +- Have a valid digital signature certificate [approved by the ONAC](https://onac.org.co/directorio-de-acreditados/). +- [Register and get enabled](https://micrositios.dian.gov.co/sistema-de-facturacion-electronica/proceso-de-registro-y-habilitacion-como-facturador-electronico/) + by completing the certification process required by the {{ DIAN }}. + +:::{seealso} +- For more information on how to complete the certification process for the {{ DIAN }} module, review + the following [webinar](https://www.youtube.com/watch?v=l0G6iDc7NQA) +- [Smart Tutorial - Colombian Localization](https://www.odoo.com/slides/smart-tutorial-localizacion-de-colombia-132) +- {doc}`Documentation on e-invoicing's legality and compliance in Colombia + <../accounting/customer_invoices/electronic_invoicing/colombia>` +::: + +(localization-colombia-configuration)= + +## Configuration + +(localization-colombia-modules)= + +### Modules installation + +{ref}`Install ` the following modules to get all the features of the Colombian +localization: + +```{eval-rst} +.. list-table:: + :header-rows: 1 + :widths: 25 25 50 + + * - Name + - Technical name + - Description + * - :guilabel:`Colombia - Accounting` + - `l10n_co` + - Default :ref:`fiscal localization package `. This module adds + the base accounting features for the Colombian localization: chart of accounts, taxes, + withholdings, and identification document type. + * - :guilabel:`Electronic invoicing for Colombia with DIAN` + - `l10n_co_dian` + - This module includes the features required for integration with the |DIAN| as its own + software, and adds the ability to generate electronic invoices and support documents based on + |DIAN| regulations. + * - :guilabel:`Colombian - Accounting Reports` + - `l10n_co_reports` + - This module includes accounting reports for sending certifications to suppliers for + withholdings applied. + * - :guilabel:`Electronic invoicing for Colombia with Carvajal` + - `l10n_co_edi` + - This module includes the features required for integration with Carvajal. Adds the ability to + generate the electronic invoices and support documents, based on |DIAN| regulations. + * - :guilabel:`Colombian - Point of Sale` + - `l10n_co_pos` + - This module includes **Point of Sale** receipts for Colombian localization. +``` + +(localization-colombia-configuration-company)= + +### Company information + +To configure your company information: + +1. Access your company's contact form: + + - Go to the {guilabel}`Contacts` app and search for your company or; + - Go to the {guilabel}`Settings` app, activate the {ref}`developer mode `, and in + the {guilabel}`Companies` section, click {guilabel}`Update Info`. Then, in the + {guilabel}`Contact` field, click on the company name. + +2. Configure the following information: + + - {guilabel}`Company Name`. + - {guilabel}`Address`: Including {guilabel}`City`, {guilabel}`Department`, and {guilabel}`ZIP` + code. + - {guilabel}`Identification Number`: Select the {guilabel}`Identification Type` ({guilabel}`NIT`, + {guilabel}`Cédula de Ciudadanía`, {guilabel}`Registro Civil`, etc.). When the + {guilabel}`Identification Type` is {guilabel}`NIT`, the + {guilabel}`Identification Number` **must** have the *verification digit* at the end of the ID + prefixed by a hyphen (`-`). + +3. Go to the {guilabel}`Sales & Purchase` tab and configure the {guilabel}`Fiscal Information`: + + - {guilabel}`Obligaciones y Responsabilidades`: Select the fiscal responsibility for the company. + ({guilabel}`O-13` Gran Contribuyente, {guilabel}`O-15` Autorretenedor, + {guilabel}`O-23` Agente de retención IVA, {guilabel}`O-47` Regimen de tributación simple, + {guilabel}`R-99-PN` No Aplica). + - {guilabel}`Gran Contribuyente`: If the company is *Gran Contribuyente*, enable this option. + - {guilabel}`Fiscal Regimen`: Select the Tribute Name for the company ({guilabel}`IVA`, + {guilabel}`INC`, {guilabel}`IVA e INC`, or {guilabel}`No Aplica`) + - {guilabel}`Commercial Name`: If the company uses a specific commercial name and it needs to be + displayed in the invoice. + +:::{tip} +The data configured in the {guilabel}`Fiscal Information` section is printed in the valid fiscal +PDF reports. +::: + +(localization-colombia-einvoice-configuration)= + +### Electronic invoicing credentials and {{ DIAN }} environment + +To configure the user credentials to be used to connect with the {{ DIAN }}'s web service and the +{{ DIAN }} environment, navigate to {menuselection}`Accounting --> Configuration --> Settings` and +scroll to the {guilabel}`Colombian Electronic Invoicing` section. Then, follow these steps: + +1. Select {guilabel}`DIAN: Free Service` as the {guilabel}`Electronic Invoicing Provider`. + +2. Configure the {guilabel}`Operation Modes` for the respective types of documents + (*electronic invoices* or *support documents*) to be generated from Odoo. Click + {guilabel}`Add a line`, then fill in the fields: + + - {guilabel}`Software Mode`: the type of document to be generated with the operation mode. + - {guilabel}`Software ID`: the ID generated by {{ DIAN }} for the specific operation mode. + - {guilabel}`Software PIN`: the PIN selected in the operation mode configuration in the {{ DIAN }} + portal. + - {guilabel}`Testing ID`: the testing ID generated by {{ DIAN }} and obtained after testing the + operation mode. + +3. Configure the available {guilabel}`Certificates` to sign the electronic documents. Click + {guilabel}`Add a line`, then fill in the fields: + + - {guilabel}`Name`: the name of the certificate. + + - {guilabel}`Certificate`: upload the certificate file in PEM format. In the {guilabel}`Private + Key` field that appears on the screen, select an existing private key or create a new one. To + do so, enter a key name and select {guilabel}`Create and edit`. Then, in the {guilabel}`Create + Private Key` wizard, upload a valid {guilabel}`Key file` and click {guilabel}`Save & Close`. + + ```{image} colombia/dian-credentials-configuration.png + :alt: Colombian electronic invoicing credentials configured. + ``` + +4. Configure the {{ DIAN }} environment; the {{ DIAN }} electronic invoicing module offers three different + {{ DIAN }} environments to connect with: + + - **Certification environment**: This environment is useful to pass the {{ DIAN }} certification + process and obtain the *Enabled* status to invoice from Odoo. To activate it, enable both the + {guilabel}`Test environment` and the {guilabel}`Activate the certification process` checkboxes. + - **Testing environment**: This environment allows reproducing electronic invoicing flows + and validations in the {{ DIAN }} testing portal. To activate it, enable only the {guilabel}`Test + Environment` checkbox. + - **Production environment**: Activate production databases to generate valid electronic documents. + To activate it, disable both the {guilabel}`Test environment` and the {guilabel}`Activate the + certification process` checkboxes. + +:::{note} +In a multi-company database, each company can have its own certificate. +::: + +:::{seealso} +For electronic invoicing configurations using the Carvajal solution, review the following video: +[Configuración de Facturación Electrónica - Localización de Colombia](https://www.youtube.com/watch?v=bzweMwTEbfY&list=PL1-aSABtP6ABxZshems3snMjx7bj_7ZsZ&index=3). +::: + +(localization-colombia-master-data)= + +### Master data + +(localization-colombia-contacts)= + +#### Contacts + +Configure the following fields on the {doc}`contact form <../../essentials/contacts>`: + +- {guilabel}`Identification Number` (VAT): Select the identification number type and enter the + identification number. If the identification number type is {guilabel}`NIT`, the identification + number must include the verification digit at the end, prefixed by a hyphen (`-`). +- {ref}`Fiscal Information fields ` in the + {guilabel}`Sales & Purchase` tab. + +(localization-colombia-products)= + +#### Products + +Access the product's form via {menuselection}`Accounting --> Customers --> Products` and ensure +that either the {guilabel}`UNSPSC Category` field (found in the {guilabel}`Accounting tab`) or the +{guilabel}`Internal Reference` field (in the {guilabel}`General Information` tab) is configured. + +(localization-colombia-taxes)= + +#### Taxes + +To create or modify taxes, go to {menuselection}`Accounting --> Configuration --> Taxes`, and select +the related tax. + +If sales transactions include products with taxes, configure the {guilabel}`Value Type` field in the +{guilabel}`Advanced Options` tab. Retention tax types ({guilabel}`ICA`, {guilabel}`IVA`, +{guilabel}`Fuente`) are also included. This configuration is used to display taxes correctly on the +invoice. + +```{image} colombia/dian-taxes-configuration.png +:alt: Specific tax configurations per DIAN regulations. +``` + +(localization-colombia-co-journals)= + +#### Sales journals + +Once the {{ DIAN }} has assigned the official sequence and prefix for the electronic invoice resolution, +the sales journals related to the invoices **must** be updated in Odoo. To do so, navigate +to {menuselection}`Accounting --> Configuration --> Journals` and select an existing sales journal +or create a new one with the {guilabel}`Create` button. + +On the sales journal form, enter the {guilabel}`Journal Name` and {guilabel}`Type`, then set a +unique {guilabel}`Short Code` in the {guilabel}`Journals Entries` tab. Then, configure the following +data in the {guilabel}`Advanced Settings` tab: + +- {guilabel}`Electronic invoicing`: enable UBL 2.1 (Colombia). +- {guilabel}`Invoicing Resolution`: resolution number issued by {{ DIAN }} to the company via their test + set. +- {guilabel}`Resolution Date`: initial effective date of the resolution. +- {guilabel}`Resolution End Date`: end date of the resolution's validity. +- {guilabel}`Range of Numbering (minimum)`: first authorized invoice number. +- {guilabel}`Range of Numbering (maximum)`: last authorized invoice number. +- {guilabel}`Technical Key`: control key received from the {{ DIAN }} portal test set or from their web + service in case of the production environment. + +When the database is configured for the {ref}`production environment +`, instead of configuring these fields manually, +click the {guilabel}`Reload DIAN configuration` button to obtain the {{ DIAN }} resolution information +from the {{ DIAN }} web service. + +```{image} colombia/reload-dian-configuration-button.png +:alt: Reload DIAN configuration button in sale journals. +``` + +:::{important} +- The short code and resolution of the journal **must** match the ones received in the {{ DIAN }} + portal test set or from the MUISCA portal. +- The {ref}`invoice sequence and prefix ` **must** be + correctly configured when the first invoice is created. Odoo automatically assigns a prefix + and sequence to the following invoices. +::: + +(localization-colombia-purchase-journals)= + +#### Purchase journals + +Once the {{ DIAN }} has assigned the official sequence and prefix for the *support document* related to +vendor bills, the purchase journals related to their supporting documents need to be updated in +Odoo. The process is similar to the configuration of the {ref}`sales journals +`. + +:::{seealso} +For more information on support document journals using the Carvajal solution, review the +[Documento Soporte - Localización de Colombia video](https://www.youtube.com/watch?v=UmYsFcD7xzE&list=PL1-aSABtP6ABxZshems3snMjx7bj_7ZsZ&index=8). +::: + +(localization-colombia-chart-of-accounts)= + +#### Chart of accounts + +The {doc}`chart of accounts ` is +installed by default as part of the localization module. The accounts are mapped automatically in +taxes, default account payable, and default account receivable. The chart of accounts for Colombia +is based on the PUC (Plan Unico de Cuentas). + +(localization-colombia-workflows)= + +## Main workflows + +(localization-colombia-electronic-invoices)= + +### Electronic invoices + +The following is a breakdown of the main workflow for electronic invoices with the Colombian +localization: + +1. The user creates an invoice. +2. Odoo generates the legal XML file. +3. Odoo generates the CUFE (Invoice Electronic Code) with the electronic signature. +4. Odoo sends a notification to DIAN. +5. {{ DIAN }} validates the invoice. +6. {{ DIAN }} accepts or rejects the invoice. +7. Odoo generates the PDF invoice with a QR code. +8. Odoo compresses the attached document (containing the sent XML file and the DIAN validation + response) and the fiscal valid PDF into a {file}`.zip` file. +9. The user sends the invoice ({file}`.zip` file) via Odoo to the acquirer. + +(localization-colombia-invoice-creation)= + +#### Invoice creation + +:::{note} +The functional workflow taking place before an invoice validation does **not** alter the main +changes introduced with the electronic invoice. +::: + +Electronic invoices are generated and sent to both the {{ DIAN }} and the customer. These documents can +be created from the sales order or manually generated. To create a new invoice, go to +{menuselection}`Accounting --> Costumers --> Invoices`, and select {guilabel}`Create`. On the +invoice form, configure the following fields: + +- {guilabel}`Customer`: customer's information. +- {guilabel}`Journal`: journal used for electronic invoices. +- {guilabel}`Electronic Invoice Type`: Select the type of document. By default, {guilabel}`Factura + de Venta` is selected. +- {guilabel}`Invoice Lines`: Specify the products with the correct taxes. + +:::{important} +When creating the first invoice related to an electronic invoicing journal, it is required to +manually change the *sequence* of the invoice to the {{ DIAN }} format: `Prefix + Sequence`. + +For example, format the sequence from `SETP/2024/00001` to `SETP1`. +::: + +When done, click {guilabel}`Confirm`. + +(localization-colombia-send-electronic-invoice)= + +#### Electronic invoice sending + +After the {ref}`invoice confirmation `, click +{guilabel}`Print & Send`. In the wizard that appears, make sure to enable the {guilabel}`DIAN` and +{guilabel}`Email` checkboxes to send an XML to the {{ DIAN }} web service and the validated invoice to +the client fiscal email and click {guilabel}`Print & Send`. Then: + +- The XML document is created. +- The CUFE is generated. +- The XML is processed synchronously by the {{ DIAN }}. +- If accepted, the file is displayed in the chatter and the email to the client with the + corresponding {file}`.zip` file. + +```{image} colombia/zip-xml-chatter-colombia.png +:alt: EDI documents available in the chatter. +``` + +The {guilabel}`DIAN` tab then displays the following: + +- {guilabel}`Signed Date`: timestamp recorded of the XML creation. +- {guilabel}`Status`: Status result obtained in the {{ DIAN }} response. If the invoice was + rejected, the error messages can be seen here. +- {guilabel}`Testing Environment`: To know if the document sent was delivered to the {{ DIAN }} testing + environment. +- {guilabel}`Certification Process`: To know if the document was sent as part of the certification + process with the {{ DIAN }}. +- {guilabel}`Download`: To download the sent XML file, even if the {{ DIAN }} result was + rejected. +- {guilabel}`Fetch Attached Document`: To download the generated attached document file included in + the delivered {file}`.zip` file to the client. + +```{image} colombia/dian-tab-electronic-document.png +:alt: EDI document record available in DIAN tab. +``` + +(localization-colombia-credit-notes)= + +### Credit notes + +The process for credit notes is the same as for invoices. To create a credit note with reference to +an invoice, go to {menuselection}`Accounting --> Customers --> Invoices`. On the invoice, click +{guilabel}`Add Credit Note`, and complete the following information: + +- {guilabel}`Credit Method`: Select the type of credit method. + + - {guilabel}`Partial Refund`: Use this option when it is a partial amount. + - {guilabel}`Full Refund`: Use this option if the credit note is for the full amount. + - {guilabel}`Full refund and new draft invoice`: Use this option if the credit note is + auto-validated and reconciled with the invoice. The original invoice is duplicated as a new + draft. + +- {guilabel}`Reason`: Enter the reason for the credit note. + +- {guilabel}`Reversal Date`: Select if you want a specific date for the credit note or if it is the + journal entry date. + +- {guilabel}`Use Specific Journal`: Select the journal for your credit note or leave it empty if + you want to use the same journal as the original invoice. + +- {guilabel}`Refund Date`: If you chose a specific date, select the date for the refund. + +Once reviewed, click the {guilabel}`Reverse` button. + +(localization-colombia-debit-notes)= + +### Debit notes + +The process for debit notes is similar to credit notes. To create a debit note with reference to an +invoice, go to {menuselection}`Accounting --> Customers --> Invoices`. On the invoice, click the +{guilabel}`Add Debit Note` button, and enter the following information: + +- {guilabel}`Reason`: Type the reason for the debit note. +- {guilabel}`Debit note date`: Select the specific options. +- {guilabel}`Copy lines`: Select this option if you need to register a debit note with the same + lines of invoice. +- {guilabel}`Use Specific Journal`: Select the printer point for your debit note, or leave it empty + if you want to use the same journal as the original invoice. + +When done, click {guilabel}`Create Debit Note`. + +(localization-colombia-support-document)= + +### Support document for vendor bills + +With master data, credentials, and the purchase journal configured for support documents related to +vendor bills, you can start using *support documents*. + +Support documents for vendor bills can be created from your purchase order or manually. Go to +{menuselection}`Accounting --> Vendors --> Bills` and fill in the following data: + +- {guilabel}`Vendor`: Enter the vendor's information. +- {guilabel}`Bill Date`: Select the date of the bill. +- {guilabel}`Journal`: Select the journal for support documents related to the vendor bills. +- {guilabel}`Invoiced Lines`: Specify the products with the correct taxes. + +Once reviewed, click the {guilabel}`Confirm` button. Upon confirmation, an XML file is created and +automatically sent to Carvajal. + +(localization-colombia-common-errors)= + +### Common errors + +During the XML validation, the most common errors are related to missing {ref}`master data +`. In such cases, a validation error message is displayed and +sending is blocked. + +If the invoice was sent and set as *Rejected* by the {{ DIAN }}, the error messages are visible by +clicking the {icon}`fa-info-circle` {guilabel}`(info circle)` icon next to the {guilabel}`Status` +field in the {guilabel}`DIAN` tab. Using the reported error codes, it is possible to review +solutions to apply before re-sending. + +```{image} colombia/rejected-invoice-error-message.png +:alt: Example of error messages on rejected invoices. +``` + +After the master data or other issues are corrected, it is possible to reprocess the XML again. Do +so by following the {ref}`electronic invoice sending ` +flow. + +(localization-colombia-reports)= + +## Financial reports + +(localization-colombia-certificado-ica)= + +### Certificado de Retención en ICA + +This report is a certification to vendors for withholdings made for the Colombian Industry and +Commerce (ICA) tax. The report can be found under {menuselection}`Accounting --> Reporting --> +Colombian Statements --> Certificado de Retención en ICA`. + +Click the {icon}`fa-cog` {guilabel}`(gear)` icon to display options to {guilabel}`Download Excel` +and {guilabel}`Copy to Documents`. + +```{image} colombia/retencion-ica-dian.png +:alt: "Certificado de Retenci\xF3n en ICA report in Odoo Accounting." +``` + +(localization-colombia-certificado-iva)= + +### Certificado de Retención en IVA + +This report issues a certificate on the amount withheld from vendors for VAT withholding. The report +can be found under {menuselection}`Accounting --> Reporting --> Colombian Statements --> Certificado +de Retención en IVA`. + +Click the {icon}`fa-cog` {guilabel}`(gear)` icon to display options to {guilabel}`Download Excel` +and {guilabel}`Copy to Documents`. + +```{image} colombia/retencion-iva-dian.png +:alt: "Certificado de Retenci\xF3n en IVA report in Odoo Accounting." +``` + +(localization-colombia-certificado-fuente)= + +### Certificado de Retención en la Fuente + +This certificate is issued to partners for the withholding tax that they have made. The report can +be found under {menuselection}`Accounting --> Reporting --> Colombian Statements --> Certificado de +Retención en Fuente`. + +Click the {icon}`fa-cog` {guilabel}`(gear)` icon to display options to {guilabel}`Download Excel` +and {guilabel}`Copy to Documents`. + +```{image} colombia/retencion-fuente-dian.png +:alt: "Certificado de Retenci\xF3n en Fuente report in Odoo Accounting." +``` + diff --git a/content/applications/finance/fiscal_localizations/ecuador.md b/content/applications/finance/fiscal_localizations/ecuador.md new file mode 100644 index 000000000..9721f98d5 --- /dev/null +++ b/content/applications/finance/fiscal_localizations/ecuador.md @@ -0,0 +1,814 @@ +# Ecuador + +## Introduction + +With the Ecuadorian localization you can generate electronic documents with its XML, Fiscal folio, +with electronic signature and direct connection to tax authority SRI. + +The supported documents are Invoices, Credit Notes, Debit Notes, Purchase Liquidations and +Withholds. + +The localization also Includes automations to easily predict the withholding tax to be applied to +each purchase invoice. + +:::{seealso} +- [App Tour - Localización de Ecuador](https://www.youtube.com/watch?v=BQOXVSDeeK8) +- [Smart Tutorial - Localización de Ecuador](https://www.odoo.com/slides/smart-tutorial-localizacion-de-ecuador-170) +- {doc}`Documentation on e-invoicing's legality and compliance in Ecuador + <../accounting/customer_invoices/electronic_invoicing/ecuador>` +::: + +### Glossary + +Here are some terms that are essential on the Ecuadorian localization: + +- **SRI**: meaning *Servicio de Rentas Internas*, the government organization that enforces pay of + taxes in Ecuador. +- **EDI**: stands for *Electronic Data Interchange*, which refers to the sending of Electronics + Documents. +- **RIMPE**: stands for *Regimen Simplificado para Emprendedores y Negocios*, the type of taxpayer + qualified for SRI. + +## Configuration + +(l10n-ec-module-installation)= + +### Modules installation + +{ref}`Install ` the following modules to get all the features of the Ecuadorian +localization: + +```{eval-rst} +.. list-table:: + :header-rows: 1 + :widths: 25 25 50 + + * - Name + - Technical name + - Description + * - :guilabel:`Ecuadorian - Accounting` + - `l10n_ec` + - 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. + * - :guilabel:`Ecuadorian Accounting EDI` + - `l10n_ec_edi` + - Includes all the technical and functional requirements to generate and validate + :doc:`Electronics Documents + <../accounting/customer_invoices/electronic_invoicing>`, based on the Technical + documentation published by the SRI. The authorized documents are: Invoices, Credit Notes, + Debit Notes, Withholdings and Purchase liquidations. + * - :guilabel:`Ecuadorian Accounting Reports` + - `l10n_ec_reports` + - Includes all the technical and functional requirements to generate forms 103 and 104. + * - :guilabel:`Ecuador - ATS Report` + - `l10n_ec_reports_ats` + - Includes all the technical and functional requirements to generate the ATS report XML file + ready to be uploaded to the *DIMM Formularios*. + * - :guilabel:`Ecuadorian Website` + - `l10n_ec_website_sale` + - Includes all the technical and functional requirements to generate automatic electronic + invoices from a Website sale. + * - :guilabel:`Ecuadorian Point of Sale` + - `l10n_ec_edi_pos` + - Includes all the technical and functional requirements to generate automatic electronic + invoices from a POS sale. +``` + +:::{note} +When you install a database from scratch selecting `Ecuador` as the country, Odoo automatically +installs the base module {guilabel}`Ecuadorian - Accounting`. +::: + +(l10n-ec-configure-your-company)= + +### Configure your company + +To configure your company information, go to the {guilabel}`Contacts` app and search the name given +to your company or activate {ref}`developer mode ` and go to {menuselection}`Company +--> Contact` and then edit the contact to configure the following information: + +1. Check the {guilabel}`Company` option on top + + - {guilabel}`Name` + - {guilabel}`Address` + - {guilabel}`Identification Number` + - {guilabel}`Taxpayer Type` + - {guilabel}`Phone` + - {guilabel}`Email` + +2. Upload company logo and save + +```{image} ecuador/ecuador-company.png +:align: center +:alt: Populate company data for Ecuador in Odoo Contacts. +``` + +### Electronic documents + +To upload your information for electronic documents go to {menuselection}`Accounting --> +Configuration --> Settings` and search for {command}`Ecuadorian Localization`. + +Configure the next information: + +- {guilabel}`Company legal name` +- {guilabel}`Use production servers`: check the checkbox if your company is going to do electronic + documents in the production environment. If you want to use the testing environment for electronic + documents then keep the checkbox unchecked. +- {guilabel}`Regime`: select if your company is in General Regular or is qualified as RIMPE. +- {guilabel}`Forced to keep accounting books`: check the checkbox if your company has this + condition. +- {guilabel}`Default taxes for withholdings` +- {guilabel}`Issue withholds`: check the checkbox if your company is going to do electronic + withholds. +- {guilabel}`Withhold consumibles`: put the code of the withholding for when you buy goods. +- {guilabel}`Withhold services`: put the code of the withholding for when you buy services. +- {guilabel}`Withhold credit card`: put the code of the withholding for when you buy with credit + card +- {guilabel}`Withhold agent number`: put the company withholding agent resolution number, if + applicable for your company. +- {guilabel}`Electronic Certificate File`: upload electronic certificate and password, then save it. +- {guilabel}`Special tax contributor number`: if your company is qualified as a special taxpayer, + fill out this field with it's corresponding tax contributor number. + +```{image} ecuador/electronic-signature.png +:align: center +:alt: Electronic signature for Ecuador. +``` + +:::{note} +When configuring the withholdings in the configuration menu, these suggested withholdings are +only for domestic suppliers when no withholdings are setup on their *Taxpayer Type*. Moreover, +the Credit Card withholding set up is always used when a Credit or Debit Card SRI Payment Metho +is used. +::: + +### VAT withholding + +This configuration only applies if you are qualified as a *Withholding Agent* by the SRI, otherwise +skip this step. To configure your VAT withholding, go to {menuselection}`Accounting --> Accounting +--> Configuration --> Ecuadorian SRI: Taxpayer Type SRI`. + +You must configure the withholding percentage that applies for each type of taxpayer, specify the +{guilabel}`Goods VAT Withholding` and the {guilabel}`Services VAT Withholding`. + +```{image} ecuador/contributor-type.png +:align: center +:alt: Taxpayer Type configuration for Ecuador. +``` + +:::{tip} +In the case that the {guilabel}`Taxpayer Type` is `RIMPE`, also configure the {guilabel}`Profit +Withholding` percentage. +::: + +### Printer points + +To configure your printer points, go to {menuselection}`Accounting --> Configuration --> Accounting: +Journals`. + +Printer points need to be configured for each type of electronic document that you need. For +example: Customer Invoice, Credit Notes, and Debit Notes + +For each printer point, you need to configure the following information: + +- {guilabel}`Journal Name`: in this format `[Emission Entity]-[Emission Point] [Document Type]`, for + example: `001-001 Sales Documents`. +- {guilabel}`Type`: refers to the type of journal, select `Sales`. +- {guilabel}`Use Documents?`: this checkbox is automatically checked, leave it checked. +- {guilabel}`Emission Entity`: configure the establishment number. +- {guilabel}`Emission Point`: configure the printer point. +- {guilabel}`Emission address`: configure the address of the establishment. +- {guilabel}`Default income account`: configure the default income account. +- {guilabel}`Dedicated Credit Note Sequence`: check the checkbox if *Credit Notes* are to be + generated from this printer point - journal. +- {guilabel}`Short Code`: This is the unique code for the sequence of accounting entries, enter a + unique 5-digit code, for example: `VT001` + +Customer Invoice, Credit Notes and Debit Notes need to use the same journal as the +{guilabel}`Emission Point`, and the {guilabel}`Entity Point` should be unique per journal. + +```{image} ecuador/printer-point.png +:align: center +:alt: Configuring a printer point for Ecuador electronic document type of Customer +: Invoices. +``` + +:::{note} +In the {guilabel}`Advanced Settings` tab, check the {guilabel}`Electronic Invoicing` checkbox to +enable it for Ecuador. +::: + +:::{seealso} +{doc}`../accounting/customer_invoices/electronic_invoicing` +::: + +### Withholding + +A Withholding Journal must be defined, go to go to {menuselection}`Accounting --> Configuration --> +Accounting: Journals` where you need to configure the following information: + +- {guilabel}`Journal Name`: in this format `[Emission Entity]-[Emission Point] [Document Type]`, for + example: `001-001 Withholding`. +- {guilabel}`Type`: refers to the type of journal, select `Miscellaneous`. +- {guilabel}`Withhold Type`: Configure Purchase Withholding. +- {guilabel}`Use Documents?`: this checkbox is automatically checked, leave it checked. +- {guilabel}`Emission Entity`: configure the establishment number. +- {guilabel}`Emission Point`: configure the printer point. +- {guilabel}`Emission address`: configure the address of the establishment. +- {guilabel}`Default account`: configure the default income account. +- {guilabel}`Short Code`: This is the unique code for the sequence of accounting entries, enter a + unique 5-digit code, for example: `RT001` + +```{image} ecuador/withhold.png +:align: center +:alt: Configuring withholding for Ecuador electronic document type of Withholding. +``` + +:::{note} +In the {guilabel}`Advanced Settings` tab, check the {guilabel}`Electronic Invoicing` checkbox to +enable the sending of electronic invoicing for the withholding. +::: + +### Purchase Liquidations + +When using Purchase Liquidations, a specific journal must be created, go to +{menuselection}`Accounting --> Configuration --> Accounting: Journals` and configure the following +information: + +- {guilabel}`Journal Name`: in this format `[Emission Entity]-[Emission Point] [Document Type]`, for + example: `001-001 Withhold`. +- {guilabel}`Type`: refers to the type of journal, select `Miscellaneous`. +- {guilabel}`Purchase Liquidations`: check the checkbox to enable purchase liquidations. +- {guilabel}`Use Documents?`: this checkbox is automatically checked, leave it checked. +- {guilabel}`Emission Entity`: configure the establishment number. +- {guilabel}`Emission Point`: configure the printer point. +- {guilabel}`Emission address`: configure the address of the establishment. +- {guilabel}`Short Code`: This is the unique code for the sequence of accounting entries, enter a + unique 5-digit code, for example: `RT001` + +```{image} ecuador/purchase-liqudations.png +:align: center +:alt: Configuring purchase liquidations for Ecuador electronic document type of Withholding. +``` + +:::{note} +In the {guilabel}`Advanced Settings` tab, check the {guilabel}`Electronic Invoicing` checkbox to +enable the sending of electronic invoicing for the withholding. +::: + +### Configure 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 Account Payable, Default Account Receivable. + +The chart of accounts for Ecuador is based on the most updated version of Superintendency of +Companies, which is grouped in several categories and is compatible with NIIF accounting. + +You can add or delete accounts according to the company's needs. + +#### Products + +In addition to the basic information in your products, you must add the configuration of the +withholding code (tax) that applies. + +Go to {menuselection}`Accounting --> Vendors: Products` under the tab "Purchase" + +```{image} ecuador/products.png +:align: center +:alt: Product for Ecuador. +``` + +#### Contacts + +Configure the next information when you create a contact: + +- Check the {guilabel}`Company` option on top if it is a contact with RUC, or check + {guilabel}`Individual` if it is a contact with cedula or passport. +- {guilabel}`Name` +- {guilabel}`Address`: {guilabel}`Street` is a required field to confirm the Electronic Invoice. +- {guilabel}`Identification Number`: select an identification type `RUC`, `Cedula`, or `Passport`. +- {guilabel}`Taxpayer Type`: select the contact's SRI Taxpayer Type. +- {guilabel}`Phone` +- {guilabel}`Email` + +```{image} ecuador/contacts.png +:align: center +:alt: Contacts for Ecuador. +``` + +:::{note} +The {guilabel}`SRI Taxpayer Type` has inside the configuration of which VAT and Profit +withholding will apply when you use this contact on Vendor Bill, and then create a withholding +from there. +::: + +#### Review your taxes + +As part of the localization module, taxes are automatically created with its configuration and +related financial accounts. + +```{image} ecuador/taxes.png +:align: center +:alt: Taxes for Ecuador. +``` + +The following options have been automatically configured: + +- {guilabel}`Tax Support`: to be configured only in the IVA tax, this option is useful when you + register purchase withholdings. + +- {guilabel}`Code ATS`: to be configured only for income tax withholding codes, it is important when + you register the withholding. + +- {guilabel}`Tax Grids`: configure the codes of 104 form if it is a IVA tax and configure the codes + of 103 form if it is a income tax withholding code. + +- {guilabel}`Tax Name`: + + - For IVA tax, format the name as: `IVA [percent] (104, [form code] [tax support code] [tax + support short name])` + - For income tax withholding code, format the name as: `Code ATS [Percent of withhold] [withhold + name]` + +Once the Ecuador module is installed, the most common taxes are automatically configured. If you +need to create an additional one, you can do so, for which you must base yourself on the +configuration of the existing taxes. + +```{image} ecuador/taxes-with-tax-support.png +:align: center +:alt: Taxes with tax support for Ecuador. +``` + +#### Review your Document Types + +Some accounting transactions like *Customer Invoices* and *Vendor Bills* are classified by document +types. These are defined by the government fiscal authorities, in this case by the SRI. + +Each document type can have a unique sequence per journal where it is assigned. As part of the +localization, the document type includes the country on which the document is applicable; also the +data is created automatically when the localization module is installed. + +The information required for the document types is included by default so the user does not need to +fill anything there. + +```{image} ecuador/document-types.png +:align: center +:alt: Document types for Ecuador. +``` + +## Workflows + +Once you have configured your database, you can register your documents. + +### Sales documents + +#### Customer invoices + +{guilabel}`Customer invoices` are electronic documents that, when validated, are sent to SRI. These +documents can be created from your sales order or manually. They must contain the following data: + +- {guilabel}`Customer`: type the customer's information. +- {guilabel}`Journal`: select the option that matches the printer point for the customer invoice. +- {guilabel}`Document Type`: type document type in this format `(01) Invoice`. +- {guilabel}`Payment Method (SRI)`: select how the invoice is going to be paid. +- {guilabel}`Products`: specify the product with the correct taxes. + +```{image} ecuador/customer-invoice.png +:align: center +:alt: Customer invoice for Ecuador. +``` + +#### Customer credit note + +The {doc}`Customer credit note <../accounting/customer_invoices/credit_notes>` is an +electronic document that, when validated, is sent to SRI. It is necessary to have a validated +(posted) invoice in order to register a credit note. On the invoice there is a button named +{guilabel}`Credit note`, click on this button to be directed to the {guilabel}`Create credit note` +form, then complete the following information: + +- {guilabel}`Credit Method`: select the type of credit method. + + - {guilabel}`Partial Refund`: use this option when you need to type the first number of documents + and if it is a partial credit note. + - {guilabel}`Full Refund`: use this option if the credit note is for the total invoice and you + need the credit note to be auto-validated and reconciled with the invoice. + - {guilabel}`Full refund and new draft invoice`: use this option if the credit note is for the + total invoice and you need the credit note to be auto-validated and reconciled with the invoice, + and auto-create a new draft invoice. + +- {guilabel}`Reason`: type the reason for the credit note. + +- {guilabel}`Rollback Date`: select the {guilabel}`specific` options. + +- {guilabel}`Reversal Date`: type the date. + +- {guilabel}`Use Specific Journal`: select the printer point for your credit note, or leave it empty + if you want to use the same journal as the original invoice. + +Once reviewed, you can click on the {guilabel}`Reverse` button. + +```{image} ecuador/add-customer-credit-note.png +:align: center +:alt: Add Customer Credit Note for Ecuador. +``` + +When the {guilabel}`Partial Refund` option is used, you can change the amount of the credit note and +then validate it. Before validating the credit note, review the following information: + +- {guilabel}`Customer`: type the customer's information. +- {guilabel}`Journal`: select the printer point for the customer Credit Note. +- {guilabel}`Document Type`: this is the document type `(04) Credit Note`. +- {guilabel}`Products`: It must specify the product with the correct taxes. + +```{image} ecuador/customer-credit-note.png +:align: center +:alt: Customer Credit Note for Ecuador. +``` + +#### Customer debit note + +The {guilabel}`Customer debit note` is an electronic document that, when validated, is sent to SRI. +It is necessary to have a validated (posted) invoice in order to register a debit note. On the +invoice there is a button named {guilabel}`Debit Note`, click on this button to be directed to the +{guilabel}`Create debit note` form, then complete the following information: + +- {guilabel}`Reason`: type the reason for the debit note. +- {guilabel}`Debit note date`: select the {guilabel}`specific` options. +- {guilabel}`Copy lines`: select this option if you need to register a debit note with the same + lines of invoice. +- {guilabel}`Use Specific Journal`: select the printer point for your credit note, or leave it empty + if you want to use the same journal as the original invoice. + +Once reviewed you can click on the {guilabel}`Create Debit Note` button. + +```{image} ecuador/add-customer-debit-note.png +:align: center +:alt: Add Customer Debit Note for Ecuador. +``` + +You can change the debit note amount, and then validate it. Before validating the debit note, review +the following information: + +- {guilabel}`Customer`: type the customer's information. +- {guilabel}`Journal`: select the printer point for the customer Credit Note. +- {guilabel}`Document Type`: this is the document type `(05) Debit Note`. +- {guilabel}`Products`: It must specify the product with the correct taxes. + +```{image} ecuador/customer-debit-note.png +:align: center +:alt: Customer Debit Note for Ecuador. +``` + +#### Customer withholding + +The {guilabel}`Customer withholding` is a non-electronic document for your company, this document is +issued by the client in order to apply a withholding to the sale. + +It is necessary to have a validated (posted) invoice in order to register a customer withholding. On +the invoice there is a button named {guilabel}`Add Withhold`, click on this button to be directed +to the {guilabel}`Customer withholding` form, then complete the following information: + +- {guilabel}`Document Number`: type the withholding number. +- {guilabel}`Withhold Lines`: select the taxes that the customer is withholding. + +Before validating the withholding, review that the amounts for each tax are the same as the original +document. + +```{image} ecuador/customer-withhold.png +:align: center +:alt: Customer withhold for Ecuador. +``` + +### Purchase Documents + +#### Vendor bill + +The {guilabel}`Vendor bill` is a non-electronic document for your company, this document is issued +by your vendor when your company generates a purchase. + +The bills can be created from the purchase order or manually, it must contain the following +information: + +- {guilabel}`Vendor`: type the vendor's information. +- {guilabel}`Bill Date`: select the date of invoice. +- {guilabel}`Journal`: it is the journal for vendor bills. +- {guilabel}`Document Type`: this is the document type `(01) Invoice` +- {guilabel}`Document number`: type the document number. +- {guilabel}`Payment Method (SRI)`: select how the invoice is going to be paid. +- {guilabel}`Products`: specify the product with the correct taxes. + +```{image} ecuador/purchase-invoice.png +:align: center +:alt: Purchases for Ecuador. +``` + +:::{important} +When creating the purchase withholding, verify that the bases (base amounts) are correct. If you +need to edit the amount of the tax in the {guilabel}`Vendor bill`, click the {guilabel}`Edit` +button. Otherwise, from the {guilabel}`Journal Items` tab click the {guilabel}`Edit` button and +set the adjustment to go where you want. +::: + +#### Purchase liquidation + +The {guilabel}`Purchase liquidation` is an electronic document that, when validated, is sent to SRI. + +Companies issue this type of electronic document when they purchase, and the vendor does not issue +an invoice due to one or more of the following cases: + +- Services were provided by non-residents of Ecuador. +- Services provided by foreign companies without residency or establishment in Ecuador. +- Purchase of goods or services from natural persons not registered with a RUC, who due to their + cultural level or hardiness are not able to issue sales receipts or customer invoices. +- Reimbursement for the purchase of goods or services to employees in a dependency relationship + (full-time employee). +- Services provided by members of collegiate bodies for the exercise of their function. + +These types of electronic documents can be created from the {guilabel}`Purchase Order` or manually +from the {guilabel}`Vendor Bills` form view. It must contain the following data: + +- {guilabel}`Vendor`: type the vendor's information. +- {guilabel}`Journal`: select the journal for the {guilabel}`Purchase Liquidation` with the correct + printer point. +- {guilabel}`Document Type`: this is the document type `(03) Purchase Liquidation` +- {guilabel}`Document number`: type the document number (sequence), you will only have to do this + once, then the sequence will be automatically assigned for the next documents. +- {guilabel}`Payment Method (SRI)`: select how the invoice is going to be paid. +- {guilabel}`Products`: specify the product with the correct taxes. + +Once you review the information you can validate the {guilabel}`Purchase Liquidation`. + +```{image} ecuador/purchase-liquidation.png +:align: center +:alt: Purchase liquidation for Ecuador. +``` + +#### Purchase withholding + +The {guilabel}`Purchase withholding` is an electronic document that, when validated, is sent to SRI. + +It is necessary to have an invoice in a validated state in order to register a {guilabel}`Purchase +withholding`. On the invoice, there is a button named {guilabel}`Add Withhold`, click on this button +to be directed to the {guilabel}`Withholding` form, then complete the following information: + +- {guilabel}`Document number`: type the document number (sequence), you will only have to do this + once, then the sequence will be automatically assigned for the next documents. +- {guilabel}`Withhold lines`: The taxes appear automatically according to the configuration of + products and vendors, you should review if the taxes and tax support are correct, and, if it is + not correct, you can edit and select the correct taxes and tax support. + +Once you review the information you can validate the {guilabel}`Withholding`. + +```{image} ecuador/purchase-withhold.png +:align: center +:alt: Purchase withhold for Ecuador. +``` + +:::{note} +You can't change the tax support for one that was not included in the configuration of the taxes +used on the {guilabel}`Vendor Bill`. To do so, go to the tax applied on the {guilabel}`Vendor +Bill` and change the {guilabel}`Tax Support` there. +::: + +A withholding tax can be divided into two or more lines, this will depend on whether two or more +withholdings percentages apply. + +```{eval-rst} +.. example:: + The system suggests a VAT withholding of 30% with tax support 01, you can add your VAT + withholding of 70% in a new line with the same tax support, the system will allow you as long as + the total of the bases matches the total from the :guilabel:`Vendor Bill`. +``` + +### eCommerce + +The {ref}`ATS Report module ` enables the following: + +- Choose the SRI Payment Method in each payment method's configuration. +- Customers can manually input their identification type and identification number during the + eCommerce checkout process. +- Automatically generate a valid electronic invoice for Ecuador at the end of the checkout process. + +#### Configuration + +##### Website + +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. + +:::{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 +{guilabel}`Journal` menu. +::: + +##### Payment providers + +To activate the payment providers that should be used to capture eCommerce payments, navigate to +{menuselection}`Website --> Configuration --> Payment Providers` section and then click on the +{guilabel}`View other providers` button under the {guilabel}`Activate Payments` heading. From here, +each payment provider can be configured by selecting a provider record. Refer to the {doc}`payment +provider <../payment_providers>` documentation for more information. + +###### Payment methods + +To activate one or more payment methods for a payment provider, click {guilabel}`→ Enable Payment +Methods` within the {guilabel}`Configuration` tab of each provider. + +When configuring the payment method, it is **mandatory** to set the {guilabel}`SRI Payment Method` +for each method. This field appears after you create and save the payment method for the first +time. + +:::{note} +Adding the {guilabel}`SRI Payment Method` is necessary to generate correctly the electronic +invoice from an eCommerce sale. Select a **payment method** to access its configuration menu and +the field. +::: + +:::{seealso} +{doc}`Payment provider <../payment_providers>` +::: + +```{image} ecuador/l10n-ec-sri-payment-method.png +:align: center +:alt: l10n_ec SRI Payment Method. +``` + +#### 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. + +```{image} ecuador/website-checkout-form.png +:alt: Website checkout form. +``` + +:::{note} +Verification is done to ensure the {guilabel}`Identification Number` field is completed and has +the correct number of digits. For RUC identification, 13 digits are required. For Cédula, +9 digits are required. +::: + +After finishing the checkout process, a confirmed invoice is generated, ready to be sent manually or +asynchronously to the SRI. + +### Point of Sale electronic invoicing + +Make sure the *Ecuadorian module for Point of Sale* (`l10n_ec_edi_pos`) is {ref}`installed +` 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*. +- Automatically generate a valid electronic invoice for Ecuador at the end of the checkout process. + +#### 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. + +#### Invoicing flows + +##### Identification type and number + +The POS cashier can {ref}`create a new contact for a customer ` who requests an +invoice from an open POS session. + +The *Ecuadorian Module for Point of Sale* adds two new fields to the contact creation form: +{guilabel}`Identification Type` and {guilabel}`Tax ID`. + +:::{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 +ensure the length is correct, know that the {guilabel}`RUC` and {guilabel}`Citizenship` types +require 13 and 10 digits, respectively. +::: + +##### 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 +*Consumidor Final* and can be managed {ref}`directly from the POS session `. +::: + +##### 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. + +:::{note} +If the client requests a credit note due to a return of this type of purchase, the credit note +and return process can be managed {ref}`directly from the POS session `. +::: + +## Financial reports + +In Ecuador, there are fiscal reports that the company presents to SRI. Odoo supports two of the main +financial reports used by companies: **reports 103** and **104**. + +To get these reports, go to the **Accounting** app and select {menuselection}`Reporting --> +Statements Reports --> Tax Report` and then filter by `Tax Report 103` or `Tax Report 104`. + +### Report 103 + +This report contains information of income tax withholdings in a given period, this can be reported +monthly or semi-annually. + +You can see the information needed to report, which includes base and tax amounts, but also includes +the tax code within the parenthesis in order to report it to the SRI. + +```{image} ecuador/103-form.png +:align: center +:alt: Report 103 form for Ecuador. +``` + +### Report 104 + +This report contains information on VAT tax and VAT withholding for a given period, this can be +monthly or semi-annually. + +You can see the information needed to report, which includes base and tax amounts, but also includes +the tax code within the parenthesis to report it to the SRI. + +```{image} ecuador/104-form.png +:align: center +:alt: Report 104 form for Ecuador. +``` + +(ecuador-ats)= + +### ATS report + +{ref}`Install ` the *ATS Report* (`l10n_ec_reports_ats`) module to enable +downloading the ATS report in XML format. + +:::{note} +The Ecuadorian *ATS Report* module depends on the previous installation of the *Accounting* app +and the *Ecuadorian EDI module*. +::: + +#### Configuration + +To issue electronic documents, ensure your company is configured as explained in the +{ref}`electronic invoice ` section. + +In the {abbr}`ATS (Anexo Transaccional Simplificado)`, every document generated in Odoo (invoices, +vendor bills, sales and purchases withholdings, credit notes, and debit notes) will be included. + +##### Vendor bills + +When generating a vendor bill, it is necessary to register the authorization number from the +invoice that the vendor generated for the purchase. To do so, go to {menuselection}`Accounting +--> Vendors --> Bills` and select the bill. Then, enter the number from the vendor's invoice in the +{guilabel}`Authorization Number` field. + +##### Credit and debit notes + +When generating a credit note or debit note manually or through importation, it is necessary to link +this note to the sales invoice that is being modified by it. + +:::{note} +Remember to add all required information to the documents before downloading the {abbr}`ATS +(Anexo Transaccional Simplificado)` file. For example, add the *Authorization Number* and the +*SRI Payment Method* on documents, when needed. +::: + +#### XML generation + +To generate the {abbr}`ATS (Anexo Transaccional Simplificado)` report, go to +{menuselection}`Accounting --> Reports --> Tax Report` and choose a time period for the desired +{abbr}`ATS (Anexo Transaccional Simplificado)` report, then click {guilabel}`ATS`. + +The downloaded XML file is ready to be uploaded to *DIMM Formularios*. + +```{image} ecuador/ats-report.png +:align: center +:alt: ATS report download for Ecuador in Odoo Accounting. +``` + +:::{note} +When downloading the {abbr}`ATS (Anexo Transaccional Simplificado)` report, Odoo generates a +warning pop-up alerting the user if a document(s) has missing or incorrect data. Nevertheless, +the user can still download the XML file. +::: + diff --git a/content/applications/finance/fiscal_localizations/egypt.md b/content/applications/finance/fiscal_localizations/egypt.md new file mode 100644 index 000000000..b5a69d45c --- /dev/null +++ b/content/applications/finance/fiscal_localizations/egypt.md @@ -0,0 +1,253 @@ +# Egypt + +(egypt-installation)= + +## Installation + +{ref}`Install ` the following modules to get all the features of the Egyptian +localization: + +```{eval-rst} +.. list-table:: + :header-rows: 1 + + * - Name + - Technical name + - Description + * - :guilabel:`Egypt - Accounting` + - ``l10n_eg`` + - Default :ref:`fiscal localization package ` + * - :guilabel:`Egyptian E-invoice Integration` + - ``l10n_eg_edi_eta`` + - :ref:`Egyptian Tax Authority (ETA) e-invoicing integration ` +``` + +(egypt-e-invoicing)= + +## Egyptian e-invoicing + +Odoo is compliant with the **Egyptian Tax Authority (ETA) e-invoicing** requirements. + +:::{important} +Egyptian e-invoicing is available from Odoo 15.0. If needed, {doc}`upgrade +` your database. +::: + +:::{seealso} +- [Video: Egypt E-invoicing](https://www.youtube.com/watch?v=NXuBPLR4pVw) +- {doc}`/administration/upgrade` +::: + +(egypt-e-invoicing-eta-portal)= + +### Register Odoo on your ETA portal + +You must register your Odoo ERP system on your ETA portal to get your API credentials. You need +these codes to {ref}`configure your Odoo Accounting app `. + +Access your company profile on the ETA portal by clicking on {guilabel}`View Taxpayer Profile`. + +```{image} egypt/taxpayer-profile.png +:align: center +:alt: Clicking on "View Taxpayer Profile" on an ETA invoicing portal +``` + +Next, go to the {guilabel}`Representatives` section and then click on {guilabel}`Register ERP`. +Fill out the {guilabel}`ERP Name` (e.g., `Odoo`) and leave the other fields empty. + +```{image} egypt/add-erp-system.png +:align: center +:alt: Filling out of the form to register an ERP system on the ETA portal. +``` + +Once successfully registered, the website displays your API credentials: + +- Client ID +- Client Secret 1 +- Client Secret 2 + +:::{note} +- ETA should give you a username and a password to access their online portal. +- Ask ETA to provide you with preproduction portal access as well. +- These codes are confidential and should be stored safely. +::: + +(egypt-e-invoicing-configuration)= + +### Configuration on Odoo + +To connect your Odoo database to your ETA portal account, go to {menuselection}`Accounting --> +Configuration --> Settings --> ETA E-Invoicing Settings`, and set the {guilabel}`ETA Client ID` and +{guilabel}`ETA Secret` that you retrieved when you {ref}`registered Odoo on your ETA portal +`. Set an invoicing threshold if needed. + +```{image} egypt/eta-api-integration.png +:align: center +:alt: Configuration of the ETA E-Invoicing credentials in Odoo Accounting +``` + +:::{important} +- **Test on your preproduction portal** before starting to issue real invoices on the production + ETA portal. +- **Credentials** for preproduction and production environments are different. Make sure to + update them on Odoo when you move from one environment to another. +- If not done yet, fill out your company details with your company's full address, country, and + Tax ID. +::: + +(egypt-e-invoicing-eta-codes)= + +#### ETA codes + +E-invoicing works with a set of codes provided by the ETA. You can use the [ETA documentation](https://sdk.preprod.invoicing.eta.gov.eg/codes/) to code your business attributes. + +Most of these codes are handled automatically by Odoo, provided that your {ref}`branches +`, {ref}`customers `, and {ref}`products +` are correctly configured. + +- Company Information: + + - Company Tax ID + - Branch ID + If you have only one branch, use + `0` + as the branch code. + - Activity type Code + +- Other Information: + + - Product Codes + Your company's products should be coded and matched with their + **GS1** + or + **EGS** + codes. + - Tax Codes + Most of the taxes codes are already configured on Odoo in the + {guilabel}`ETA Code (Egypt)` + + field. We advise you to make sure these codes match your company's taxes. + +:::{seealso} +- [Egyptian eInvoicing & eReceipt SDK - Code Tables](https://sdk.preprod.invoicing.eta.gov.eg/codes/) +- {doc}`../accounting/taxes` +::: + +(egypt-e-invoicing-branches)= + +#### Branches + +Create a contact and a journal for each branch of your company and configure its ETA settings. + +To do so, go to {menuselection}`Accounting --> Configuration --> Journals`, then click on +{guilabel}`Create`. + +Name the journal according to your company's branch and set the {guilabel}`Type` as +{guilabel}`Sales`. Next, open the {menuselection}`Advanced Settings` tab and fill out the +{guilabel}`Egyptian ETA settings` section: + +- In the {guilabel}`Branch` field, select the branch's contact or create it. +- Set the {guilabel}`ETA Activity Code`. +- Set the {guilabel}`ETA Branch ID` (use `0` if you have one branch only). + +```{image} egypt/branch-journal.png +:align: center +:alt: Sales journal configuration of an Egyptian company's branch +``` + +:::{important} +The contact selected in the {guilabel}`Branch` field must be set as a {guilabel}`Company` +(**not** as an {guilabel}`Individual`), and the {guilabel}`Address` and {guilabel}`Tax ID` fields +must be filled out. +::: + +(egypt-e-invoicing-customers)= + +#### Customers + +Make sure your customers' contact forms are correctly filled out so your e-invoices are valid: + +- contact type: {guilabel}`Individual`: or {guilabel}`Company`: +- {guilabel}`Country`: +- {guilabel}`Tax ID`: Tax ID or Company registry for companies. National ID for individuals. + +:::{note} +You can edit your customers' contact forms by going to {menuselection}`Accounting --> Customers +--> Customers`. +::: + +(egypt-e-invoicing-products)= + +#### Products + +Make sure your products are correctly configured so your e-invoices are valid: + +- {guilabel}`Product Type`: storable products, consumables, or services. +- {guilabel}`Unit of Measure`: if you also use Odoo Inventory and have enabled {doc}`Units of + Measure <../../inventory_and_mrp/inventory/product_management/configure/uom>`. +- {guilabel}`Barcode`: **GS1** or **EGS** barcode +- {guilabel}`ETA Item code` (under the {menuselection}`Accounting` tab): if the barcode doesn't + match your ETA item code. + +:::{note} +You can edit your products by going to {menuselection}`Accounting --> Customers --> Products`. +::: + +(egypt-e-invoicing-usb-authentication)= + +### USB authentication + +Each person who needs to electronically sign invoices needs a specific USB key to authenticate and +send invoices to the ETA portal through an ERP. + +:::{note} +You can contact the {abbr}`ETA (Egyptian Tax Authority)` or [Egypt Trust](https://www.egypttrust.com/) to get these USB keys. +::: + +(egypt-e-invoicing-local-proxy)= + +#### Install Odoo as a local proxy on your computer + +An Odoo local server works as a bridge between your computer and your Odoo database hosted online. + +Download the Odoo Community installer from the page and start the +installation on your computer. + +Select {guilabel}`Odoo IoT` as the type of install. + +```{image} egypt/install-odoo-local-proxy.png +:align: center +:alt: Selection of "Odoo IoT" during the installation of Odoo Community. +``` + +:::{note} +This installation of Odoo only works as a server and does not install any Odoo apps on your +computer. +::: + +Once the installation is complete, the installer displays your **access token** for the Odoo Local +Proxy. Copy the token and save it in a safe place for later use. + +:::{seealso} +- [Odoo: Download Odoo](https://www.odoo.com/page/download) +- {doc}`../../../administration/on_premise` +::: + +(egypt-e-invoicing-usb-configuration)= + +#### Configure the USB key + +Once the local proxy server is installed on your computer, you can link it with your Odoo database. + +1. Go to {menuselection}`Accounting --> Configurations --> Thumb Drive` and click on + {guilabel}`Create`. +2. Input a {guilabel}`Company` name, the {guilabel}`ETA USB Pin` given to you by your USB key + provider, and the {guilabel}`Access Token` provided at the end of the {ref}`local proxy + installation `, then click on {guilabel}`Save`. +3. Click on {guilabel}`Get certificate`. + +```{image} egypt/thumb-drive.png +:align: center +:alt: Creating a new thumb drive for the e-invoicing of an egyptian company. +``` + diff --git a/content/applications/finance/fiscal_localizations/employment_hero.md b/content/applications/finance/fiscal_localizations/employment_hero.md new file mode 100644 index 000000000..7671779a1 --- /dev/null +++ b/content/applications/finance/fiscal_localizations/employment_hero.md @@ -0,0 +1,83 @@ +# Employment Hero Payroll + +The [Employment Hero](https://employmenthero.com/) 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 +Odoo. + +:::{important} +KeyPay was rebranded as **Employment Hero** in March 2023. +::: + +(employment-hero-configuration)= + +## Configuration + +1. {ref}`Activate ` the {guilabel}`Employment Hero Payroll` module + (`l10n_employment_hero`). + +2. Configure the **Employment Hero API** by going to {menuselection}`Accounting --> Configuration + --> Settings`. More fields become visible after clicking on {guilabel}`Enable Employment Hero + Integration`. + + ```{image} employment_hero/employment-hero-integration.png + :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. + + ```{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. + + :::{note} + Employment hero is available for {ref}`Australia `, + {ref}`Malaysia `, + {ref}`New Zealand `, + {ref}`Singapore `, + and the {ref}`United Kingdom `. + ::: + + - You can find the **Business ID** 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 + ``` + + - You can choose any Odoo journal to post the payslip entries. + +3. 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. + +## How does the API work? + +The API syncs the journal entries from Employment Hero to Odoo and leaves them in draft mode. The +reference includes the Employment Hero payslip entry ID in brackets for the user to easily retrieve +the same record in Employment Hero and Odoo. + +```{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 +to {menuselection}`Accounting --> Configuration --> Settings` and, in the {guilabel}`Enable +Employment Hero Integration` option, click on {guilabel}`Fetch Payruns Manually`. + +Employment Hero payslip entries also work based on double-entry bookkeeping. + +The accounts used by Employment Hero are defined in the section {guilabel}`Payroll settings`. + +```{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. + diff --git a/content/applications/finance/fiscal_localizations/france.md b/content/applications/finance/fiscal_localizations/france.md new file mode 100644 index 000000000..85f548612 --- /dev/null +++ b/content/applications/finance/fiscal_localizations/france.md @@ -0,0 +1,612 @@ +# France + +:::{seealso} +{doc}`Documentation on e-invoicing’s legality and compliance in France +<../accounting/customer_invoices/electronic_invoicing/france>` +::: + +(localization-france-fec)= + +## FEC - Fichier des Écritures Comptables + +An FEC {dfn}`Fichier des Écritures Comptables` audit file contains all the accounting data and entries +recorded in all the accounting journals for a financial year. The entries in the file must be +arranged in chronological order. + +Since January 1st, 2014, every French company is required to produce and transmit this file upon +request by the tax authorities for audit purposes. + +(localization-france-fec-import)= + +### FEC import + +To make the onboarding of new users easier, Odoo Enterprise's French {ref}`fiscal localization +package ` includes the **FEC Import** feature (module name: +`l10n_fr_fec_import`), which enables the import of existing FEC files from older software. + +To enable this feature, go to {menuselection}`Accounting --> Configuration --> Settings --> +Accounting Import`, enable **FEC Import**, and *Save*. + +Next, go to {menuselection}`Accounting --> Configuration --> FEC Import`, upload your FEC file, and +click on *Import*. + +:::{note} +Importing FEC files from different year takes no particular action or computation. + +Should multiple files contain any "Reports à Nouveaux" (RAN) with the starting balance of the +year, you might need to cancel those entries in the User Interface. Odoo makes those entries +(RAN) useless. +::: + +(localization-france-fec-file)= + +#### File formats + +FEC files can only be in CSV format, as the XML format is not supported. + +:::{note} +The FEC CSV file has a plain text format representing a data table, with the first line being a +header and defining the list of fields for each entry, and each following line representing one +accounting entry, in no predetermined order. +::: + +Our module expects the files to meet the following technical specifications: + +- **Encoding**: UTF-8, UTF-8-SIG and iso8859_15. +- **Separator**: any of these: `;` or `|` or `,` or `TAB`. +- **Line terminators**: both CR+LF (`\\r\\n`) and LF (`\\n`) character groups are supported. +- **Date format**: `%Y%m%d` + +(localization-france-fec-fields)= + +#### Fields description and use + +| # | Field name | Description | Use | Format | +| --- | ------------- | --------------------------------------------------------------- | ----------------------------------------------------------------- | --------------- | +| 01 | JournalCode | Journal Code | `journal.code` and `journal.name` if `JournalLib` is not provided | Alphanumeric | +| 02 | JournalLib | Journal Label | `journal.name` | Alphanumeric | +| 03 | EcritureNum | Numbering specific to each journal sequence number of the entry | `move.name` | Alphanumeric | +| 04 | EcritureDate | Accounting entry Date | `move.date` | Date (yyyyMMdd) | +| 05 | CompteNum | Account Number | `account.code` | Alphanumeric | +| 06 | CompteLib | Account Label | `account.name` | Alphanumeric | +| 07 | CompAuxNum | Secondary account Number (accepts null) | `partner.ref` | Alphanumeric | +| 08 | CompAuxLib | Secondary account Label (accepts null) | `partner.name` | Alphanumeric | +| 09 | PieceRef | Document Reference | `move.ref` and `move.name` if `EcritureNum` is not provided | Alphanumeric | +| 10 | PieceDate | Document Date | `move.date` | Date (yyyyMMdd) | +| 11 | EcritureLib | Account entry Label | `move_line.name` | Alphanumeric | +| 12 | Debit | Debit amount | `move_line.debit` | Float | +| 13 | Credit | Credit amount (Field name "Crédit" is not allowed) | `move_line.credit` | Float | +| 14 | EcritureLet | Accounting entry cross reference (accepts null) | `move_line.fec_matching_number` | Alphanumeric | +| 15 | DateLet | Accounting entry date (accepts null) | unused | Date (yyyyMMdd) | +| 16 | ValidDate | Accounting entry validation date | unused | Date (yyyyMMdd) | +| 17 | Montantdevise | Currency amount (accepts null) | `move_line.amount_currency` | Float | +| 18 | Idevise | Currency identifier (accepts null) | `currency.name` | Alphanumeric | + +These two fields can be found in place of the others in the sence above. + +```{eval-rst} ++----+---------------+--------------------------------------+-----------------------------------+-----------------+ +| 12 | Montant | Amount | `move_line.debit` | Float | +| | | | or `move_line.credit` | | ++----+---------------+--------------------------------------+-----------------------------------+-----------------+ +| 13 | Sens | Can be "C" for Credit | determines `move_line.debit` | Char | +| | | or "D" for Debit | or `move_line.credit` | | ++----+---------------+--------------------------------------+-----------------------------------+-----------------+ +``` + +(localization-france-fec-implementation)= + +#### Implementation details + +The following accounting entities are imported from the FEC files: **Accounts, Journals, Partners**, +and **Moves**. + +Our module determines the encoding, the line-terminator character, and the separator that are used +in the file. + +A check is then performed to see if every line has the correct number of fields corresponding to the +header. + +If the check passes, then the file is read in full, kept in memory, and scanned. Accounting entities +are imported one type at a time, in the following order. + +(localization-france-fec-accounts)= + +##### Accounts + +Every accounting entry is related to an account, which should be determined by the field +`CompteNum`. + +(localization-france-fec-code-matching)= + +##### Code matching + +Should a similar account code already be present in the system, the existing one is used instead of +creating a new one. + +Accounts in Odoo generally have a number of digits that are default for the fiscal localization. As +the FEC module is related to the French localization, the default number of relevant digits is 6. + +This means that the account codes the trailing zeroes are right-trimmed, and that the comparison +between the account codes in the FEC file and the ones already existing in Odoo is performed only on +the first six digits of the codes. + +```{eval-rst} +.. example:: + The account code `65800000` in the file is matched against an existing `658000` account in Odoo, + and that account is used instead of creating a new one. +``` + +(localization-france-fec-reconcilable-flag)= + +##### Reconcilable flag + +An account is technically flagged as *reconcilable* if the first line in which it appears has the +`EcritureLet` field filled out, as this flag means that the accounting entry is going to be +reconciled with another one. + +:::{note} +In case the line somehow has this field not filled out, but the entry still has to be reconciled +with a payment that hasn't yet been recorded, this isn't a problem anyway; the account is +flagged as reconcilable as soon as the import of the move lines requires it. +::: + +(localization-france-fec-account-type-template-matching)= + +##### Account type and templates matching + +As the **type** of the account is not specified in the FEC format, **new** accounts are created +with the default type *Current Assets* and then, at the end of the import process, they are +matched against the installed Chart of Account templates. Also, the *reconcile* flag is also +computed this way. + +The match is done with the left-most digits, starting by using all digits, then 3, then 2. + +```{eval-rst} +.. example:: + + +------------+------------+-----------------+---------------------+---------------------+ + | Name | Code | Full comparison | 3-digits comparison | 2-digits comparison | + +============+============+=================+=====================+=====================+ + | Template | `400000` | `400000` | `400` | `40` | + +------------+------------+-----------------+---------------------+---------------------+ + | CompteNum | `40100000` | `40100000` | `401` | `40` | + +------------+------------+-----------------+---------------------+---------------------+ + | **Result** | | | | Match **found** | + +------------+------------+-----------------+---------------------+---------------------+ +``` + +The type of the account is then flagged as *payable* and *reconcilable* as per the account template. + +(localization-france-fec-journals)= + +##### Journals + +Journals are also checked against those already existing in Odoo to avoid duplicates, also in the +case of multiple FEC files imports. + +Should a similar journal code already be present in the system, the existing one is used instead of +creating a new one. + +New journals have their name prefixed by the string `FEC-`. + +```{eval-rst} +.. example:: + `ACHATS` -> `FEC-ACHATS` +``` + +The journals are *not* archived, the user is entitled to handle them as he wishes. + +(localization-france-fec-journal-type)= + +##### Journal type determination + +The journal type is also not specified in the format (as per the accounts) and therefore it is +at first created with the default type `general`. + +At the end of the import process, the type is determined as per these rules regarding related +moves and accounts: + +- `bank` + : Moves in these journals always have a line (debit or credit) impacting a + liquidity account. + `cash` + / + `bank` + can be interchanged, so + `bank` + is set everywhere when this condition is met. +- `sale` + : Moves in these journals mostly have debit lines on receivable accounts and + credit lines on tax income accounts. + Sale refund journal items are debit/credit inverted. +- `purchase` + : Moves in these journals mostly have credit lines on payable accounts and + debit lines on expense accounts. + Purchase refund journal items are debit/credit inverted. +- `general` + : for everything else. + +:::{note} +- A minimum of three moves is necessary for journal type identification. +- A threshold of 70% of moves must correspond to a criteria for a journal type to be determined. +::: + +```{eval-rst} +.. example:: + Suppose we are analyzing the moves that share a certain `journal_id`. + + +------------------------------------------------------------+-------+------------+ + | Moves | Count | Percentage | + +============================================================+=======+============+ + | that have a sale account line and no purchase account line | 0 | 0 | + +------------------------------------------------------------+-------+------------+ + | that have a purchase account line and no sale account line | 1 | 25% | + +------------------------------------------------------------+-------+------------+ + | that have a liquidity account line | 3 | **75%** | + +------------------------------------------------------------+-------+------------+ + | **Total** | 4 | 100% | + +------------------------------------------------------------+-------+------------+ + + The journal `type` would be `bank`, because the bank moves percentage (75%) exceeds the threshold + (70%). +``` + +(localization-france-fec-partners)= + +##### Partners + +Each partner keeps its `Reference` from the field `CompAuxNum`. + +:::{note} +These fields are searchable, in line with former FEC imports on the accounting expert's side for +fiscal/audit purposes. +::: + +:::{tip} +Users can merge partners with the Data Cleaning App, where Vendors and Customers or similar +partner entries may be merged by the user, with assistance from the system that groups them by +similar entries. +::: + +(localization-france-fec-moves)= + +##### Moves + +Entries are immediately posted and reconciled after submission, using the `EcritureLet` field to +do the matching between the entries themselves. + +The `EcritureNum` field represents the name of the moves. We noticed that sometimes it may not be +filled out. In this case, the field `PieceRef` is used. + +(localization-france-fec-rounding)= + +##### Rounding issues + +There is a rounding tolerance with a currency-related precision on debit and credit (i.e., 0.01 for +EUR). Under this tolerance, a new line is added to the move, named *Import rounding difference*, +targeting the accounts: + +- `658000` Charges diverses de gestion courante, for added debits +- `758000` Produits divers de gestion courante, for added credits + +(localization-france-fec-missing-move-name)= + +##### Missing move name + +Should the `EcritureNum` not be filled out, it may also happen that the `PieceRef` field is also +not suited to determine the move name (it may be used as an accounting move line reference) leaving +no way to actually find which lines are to be grouped in a single move, and effectively impeding the +creation of balanced moves. + +One last attempt is made, grouping all lines from the same journal and date (`JournalLib`, +`EcritureDate`). Should this grouping generate balanced moves (sum(credit) - sum(debit) = 0), then +each different combination of journal and date creates a new move. + +```{eval-rst} +.. example:: + `ACH` + `2021/05/01` --> new move on journal `ACH` with name `20210501`. +``` + +Should this attempt fail, the user is prompted an error message with all the move lines that are +supposedly unbalanced. + +(localization-france-fec-partner-info)= + +##### Partner information + +If a line has the partner information specified, the information is copied to the accounting move +itself if the targeted Journal is of type *payable* or *receivable*. + +(localization-france-fec-partner-info-export)= + +### Export + +If you have installed the French {ref}`fiscal localization package `, +you should be able to download the FEC. To do so, go to {menuselection}`Accounting --> Reporting --> +France --> FEC`. + +:::{tip} +If you do not see the submenu **FEC**, go to {menuselection}`Apps`, remove the *Apps* filter, +then search for the module named **France-FEC** and make sure it is installed. +::: + +:::{seealso} +- [Official Technical Specification (fr)](https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000027804775) +- [Test-Compta-Demat (Official FEC Testing tool)](https://github.com/DGFiP/Test-Compta-Demat) +::: + +(localization-france-accounting-reports)= + +## French accounting reports + +If you have installed the French Accounting, you will have access to some accounting reports +specific to France: + +- Bilan comptable +- Compte de résultats +- Plan de Taxes France + +(localization-france-liasse-fiscale)= + +## Liasse fiscale + +The *liasse fiscale* (tax returns) is a collection of standardized financial documents that +businesses must submit annually to the tax authorities. It comprehensively summarizes the company’s +financial activities and determines corporate taxes. + +[Teledec](https://www.teledec.fr) is a platform used to prepare and submit tax returns using data +from accounting records. To synchronize your accounting data stored in Odoo with Teledec and +electronically send your company's *liasse fiscale* to the DGFiP (Direction Générale des Finances +Publiques), follow these steps: + +1. {ref}`localization/france/teledec-account` +2. {ref}`localization/france/teledec-registration` +3. {ref}`localization/france/teledec-synchronization` + +(localization-france-teledec-account)= + +### Teledec account creation + +To create a Teledec account, access the [Teledec account creation page](https://www.teledec.fr/s-enregistrer) +and fill in the {guilabel}`Adresse e-mail` field with an email address. Choose a secure password, +accept the general terms and conditions by checking the box, and click {guilabel}`S'enregistrer` to +save. Then, enter the {abbr}`SIREN (Système d'identification du répertoire des entreprises, +Business Directory Identification System)` number of the company. + +:::{note} +If the account has already been created, click {guilabel}`Déjà enregistré?` (Already registered). +::: + +(localization-france-teledec-registration)= + +### Company registration and fiscal year information + +To register the company on Teledec, go to {guilabel}`Vos entreprises` (Your companies) and click +{guilabel}`Enregistrer votre entreprise` (Register your company). Make sure to fill in the following +company information in the {guilabel}`Coordonnées de l'entreprise` (Company's details) and +{guilabel}`Représentant légal` (Legal representative) sections: + +- {guilabel}`Nom de l'entreprise`: Company's name. +- {guilabel}`Forme juridique`: Select the company's legal form. +- {guilabel}`Les comptes sont clôturés le`: Closing date. +- {guilabel}`Régime d'imposition, choix de la liasse`: Select the Tax scheme and tax return option. +- {guilabel}`Adresse du siège social`: Head office address. +- {guilabel}`Nom du représentant légal`: Legal representative's name. +- {guilabel}`Agissant en qualité de`: Legal representative's function. +- {guilabel}`Numéro de téléphone`: Phone number. + +Click {guilabel}`Sauvegarder` (Save) to display the next step +{guilabel}`Informations générales sur l'exercice déclaré` (General information about the declared +fiscal year). Then, fill in information on the financial year, such as the fiscal year start and end +dates or the closing date and duration of the previous fiscal period. After saving, the list of +documents included in the *liasse fiscale* is displayed, including both standard tax forms and +those customized for the company’s tax return. + +:::{tip} +- The {guilabel}`Etat` (Status) column shows the progress of the document filing. +- Click {guilabel}`Compléter` to fill out a document, then {guilabel}`Sauvegarder` to save. +- To print a blank version of the declaration, click {guilabel}`Imprimer la déclaration` and + select the {guilabel}`Imprimer la déclaration avec les notices` option. +::: + +(localization-france-teledec-synchronization)= + +### Odoo synchronization + +To enable Odoo to automatically fill in the data for the {guilabel}`Liasse fiscale`, click +{guilabel}`Autres actions` (Other actions) in the top-right corner and select +{guilabel}`Synchroniser avec un logiciel tiers` (Synchronize with third-party software), then +{guilabel}`Synchroniser cette liasse avec Odoo` (Synchronize this *liasse* with Odoo). + +In the {guilabel}`Synchroniser cette liasse avec Odoo` window, fill in the following +information to complete the synchronization: + +- {guilabel}`Nom / URL complète de la base de données ODOO`: Odoo database name or URL. To provide + the full URL of the database, enable {guilabel}`Je voudrais donner une url complète hors .odoo.com` + option. +- {guilabel}`Nom de l'utilisateur`: User name associated with the Odoo account. +- {guilabel}`Clé API`: {ref}`API key ` generated by the Odoo instance. + +Next, click {guilabel}`Importer` to synch data from Odoo. In the +{guilabel}`Confirmation de la synchronisation de liasse avec Odoo` window, review the amounts and +make any necessary changes. Then click {guilabel}`Importer la balance` to confirm the +synchronization of the *liasse fiscale* with Odoo and import the balance. + +:::{important} +Clicking {guilabel}`Importer la balance` may overwrite or alter any manual updates made +previously. +::: + +To make payment and send the declaration to the tax authorities, click {guilabel}`Paiement & envoi +de la déclaration`. + +(localization-france-anti-fraud)= + +## Get the VAT anti-fraud certification with Odoo + +As of January 1st 2018, a new anti-fraud legislation comes into effect +in France and DOM-TOM. This new legislation stipulates certain criteria +concerning the inalterability, security, storage and archiving of sales data. +These legal requirements are implemented in Odoo, version 9 onward, +through a module and a certificate of conformity to download. + +(localization-france-anti-fraud-software)= + +### Is my company required to use anti-fraud software? + +Your company is required to use an anti-fraud cash register software like +Odoo (CGI art. 286, I. 3° bis) if: + +- You are taxable (not VAT exempt) in France or any DOM-TOM, +- Some of your customers are private individuals (B2C). + +This rule applies to any company size. Auto-entrepreneurs are exempted from +VAT and therefore are not affected. + +(localization-france-anti-fraud-odoo-certification)= + +### Get certified with Odoo + +Getting compliant with Odoo is very easy. + +Your company is requested by the tax administration to deliver a certificate +of conformity testifying that your software complies with the anti-fraud +legislation. This certificate is granted by Odoo SA to Odoo Enterprise users +[here](https://www.odoo.com/my/contract/french-certification/). +If you use Odoo Community, you should {doc}`upgrade to Odoo Enterprise +` or contact your Odoo service provider. + +In case of non-conformity, your company risks a fine of €7,500. + +To get the certification, just follow the following steps: + +- If you use **Odoo Point of Sale**, {ref}`install ` the **France - VAT Anti-Fraud + Certification for Point of Sale (CGI 286 I-3 bis)** module by going to {menuselection}`Apps`, + removing the *Apps* filter, then searching for *l10n_fr_pos_cert*, and installing the module. +- Make sure a country is set on your company, otherwise your entries won’t be + encrypted for the inalterability check. To edit your company’s data, + go to {menuselection}`Settings --> Users & Companies --> Companies`. + Select a country from the list; Do not create a new country. +- Download the mandatory certificate of conformity delivered by Odoo SA [here](https://www.odoo.com/my/contract/french-certification/). + +:::{note} +- To install the module in any system created before + December 18th 2017, you should update the modules list. + To do so, activate the {ref}`developer mode `. + Then go to the *Apps* menu and press *Update Modules List* in the top-menu. +- In case you run Odoo on-premise, you need to update your installation + and restart your server beforehand. +- If you have installed the initial version of the anti-fraud module + (prior to December 18th 2017), you need to update it. + The module's name was *France - Accounting - Certified CGI 286 I-3 bis*. + After an update of the modules list, search for + the updated module in *Apps*, select it and click *Upgrade*. + Finally, make sure the following module *l10n_fr_sale_closing* + is installed. +::: + +(localization-france-anti-fraud-features)= + +### Anti-fraud features + +The anti-fraud module introduces the following features: + +- **Inalterability**: deactivation of all the ways to cancel or modify + key data of POS orders, invoices and journal entries; +- **Security**: chaining algorithm to verify the inalterability; +- **Storage**: automatic sales closings with computation of both period + and cumulative totals (daily, monthly, annually). + +(localization-france-anti-fraud-inalterability)= + +#### Inalterability + +All the possible ways to cancel and modify key data of paid POS orders, +confirmed invoices and journal entries are deactivated, +if the company is located in France or in any DOM-TOM. + +:::{note} +If you run a multi-companies environment, only the documents of such companies are impacted. +::: + +(localization-france-anti-fraud-security)= + +#### Security + +To ensure inalterability, every order or journal entry is encrypted +upon validation. +This number (or hash) is calculated from the key data of the document as +well as from the hash of the precedent documents. + +The module introduces an interface to test the data inalterability. +If any information is modified on a document after its validation, +the test will fail. The algorithm recomputes all the hashes and compares them +against the initial ones. In case of failure, the system points out the first +corrupted document recorded in the system. + +Users with *Manager* access rights can launch the inalterability check. +For POS orders, go to +{menuselection}`Point of Sales --> Reporting --> French Statements`. +For invoices or journal entries, +go to {menuselection}`Invoicing/Accounting --> Reporting --> French Statements`. + +(localization-france-anti-fraud-storage)= + +#### Storage + +The system also processes automatic sales closings on a daily, monthly +and annual basis. +Such closings distinctly compute the sales total of the period as well as +the cumulative grand totals from the very first sales entry recorded +in the system. + +Closings can be found in the *French Statements* menu of Point of Sale, +Invoicing and Accounting apps. + +:::{note} +- Closings compute the totals for journal entries of sales journals (Journal Type = Sales). +- For multi-companies environments, such closings are performed by company. +- POS orders are posted as journal entries at the closing of the POS session. + Closing a POS session can be done anytime. + To prompt users to do it on a daily basis, the module prevents from resuming + a session opened more than 24 hours ago. + Such a session must be closed before selling again. +- A period’s total is computed from all the journal entries posted after the + previous closing of the same type, regardless of their posting date. + If you record a new sales transaction for a period already closed, + it will be counted in the very next closing. +::: + +:::{tip} +- For test & audit purposes such closings can be manually generated in the + {ref}`developer mode `. +- Then go to {menuselection}`Settings --> Technical --> Automation --> Scheduled Actions`. +::: + +(localization-france-anti-fraud-responsibilities)= + +### Responsibilities + +Do not uninstall the module! If you do so, the hashes will be reset and none +of your past data will be longer guaranteed as being inalterable. + +Users remain responsible for their Odoo instance and must use it with +due diligence. It is not permitted to modify the source code which guarantees +the inalterability of data. + +Odoo absolves itself of all and any responsibility in case of changes +in the module’s functions caused by 3rd party applications not certified by Odoo. + +(localization-france-anti-fraud-more-info)= + +### More information + +You can find more information about this legislation in the following official documents. + +:::{seealso} +- [Frequently Asked Questions](https://www.economie.gouv.fr/files/files/directions_services/dgfip/controle_fiscal/actualites_reponses/logiciels_de_caisse.pdf) +- [Official Statement](http://bofip.impots.gouv.fr/bofip/10691-PGP.html?identifiant=BOI-TVA-DECLA-30-10-30-20160803) +- [Item 88 of Finance Law 2016](https://www.legifrance.gouv.fr/affichTexteArticle.do?idArticle=JORFARTI000031732968&categorieLien=id&cidTexte=JORFTEXT000031732865) +::: + diff --git a/content/applications/finance/fiscal_localizations/germany.md b/content/applications/finance/fiscal_localizations/germany.md new file mode 100644 index 000000000..30e1affc0 --- /dev/null +++ b/content/applications/finance/fiscal_localizations/germany.md @@ -0,0 +1,341 @@ +# Germany + +## Accounting + +:::{seealso} +{doc}`Documentation on e-invoicing's legality and compliance in Germany +<../accounting/customer_invoices/electronic_invoicing/germany>` +::: + +### Chart of accounts + +Both SKR03 and SKR04 charts of accounts are supported in Odoo. When you create a new Odoo Online +database, SKR03 is installed by default. + +Verify which is installed by going to {menuselection}`Accounting --> Configuration --> Settings` +and checking the {guilabel}`Package` field under the {guilabel}`Fiscal Localization` section. + +:::{warning} +Selecting another package is only possible if you have not created an accounting entry. If one +was posted, a new company or database must be set up to select another package. In +addition, all journal entries will need to be created again. +::: + +### Reports + +The following German-specific reports available on Odoo Enterprise: + +- Balance Sheet +- Profit & Loss +- Tax Report (Umsatzsteuervoranmeldung) +- EC Sales List +- Intrastat + +### Exporting entries from Odoo to DATEV + +Provided that one of the German {ref}`fiscal localization packages +` is installed, you can export your accounting entries from Odoo to +DATEV from the general ledger. + +Two types of exports are needed: first the DATEV ATCH export, then the DATEV DATA export. + +:::{note} +Both are needed at different stages to transfer the data correctly to DATEV, as DATEV works with +two interfaces, one for clients (DUO - DATEV Unternehmen Online) and one for tax advisors (DATEV +Rechnungswesen). +::: + +#### 1. DATEV ATCH + +Go to {menuselection}`Accounting --> Reporting --> General Ledger`, click the {icon}`fa-cog` +({guilabel}`Actions`) button, and select {guilabel}`Datev ATCH (zip)`. + +```{image} germany/datev-export.png +:alt: General ledger's actions menu with DATEV exports +``` + +Upload the downloaded ZIP file via the [DATEV Belegtransfer software](https://www.datev.de/web/de/service-und-support/software-bereitstellung/download-bereich/betriebliches-rechnungswesen/belegtransfer). + +If you do not have the DATEV Belegtransfer software installed on your computer, ask your tax advisor +to help you with this. + +:::{warning} +The DATEV ATCH ZIP file includes the files (reports) linked to an Odoo invoice or bill. For +customer invoices, the file must have been generated by using the {guilabel}`Print & Send` +button. For vendor bills, the file must have been received via an email alias or uploaded by +using the {guilabel}`Upload` button. +::: + +:::{admonition} DATEV ATCH ZIP file +The ZIP file contains two types of files: + +- the individual invoice/bill files (PDF, JPEG, etc.) for the selected period on the general + ledger, and +- a {file}`document.xml` file used to generate a unique ID (GUID) for each file. + +These unique IDs are essential as they allow DATEV to automatically link the files to the +individual journal items, which will be imported with the DATEV DATA file in the next step. +::: + +#### 2. DATEV DATA + +Go to {menuselection}`Accounting --> Reporting --> General Ledger`, click the {icon}`fa-cog` +({guilabel}`Actions`) button, and select {guilabel}`Datev DATA (zip)`. + +Transfer the downloaded ZIP file to your tax advisor. They should import the ZIP file into DATEV +Rechnungswesen. + +Check with your tax advisor how often they need these files. + +:::{admonition} DATEV ATCH ZIP file +The ZIP file contains three CSV files: + +- the {file}`EXTF_customer_accounts.csv` file containing all information related to your + customers, +- the {file}`EXTF_vendor_accounts.csv` file containing all information related to your vendors, + and +- the {file}`EXTF_accounting_entries.csv` containing all journal items for the period defined on + the general ledger, as well as the unique IDs (GUID) so that the journal items can be linked to + the files inside the DATEV ATCH ZIP file. +::: + +(germany-gobd)= + +### GoBD compliance + +**GoBD** stands for *Grundsätze zur ordnungsmäßigen Führung und Aufbewahrung von Büchern, +Aufzeichnungen und Unterlagen in elektronischer Form sowie zum Datenzugriff*. In short, it is a +guideline for the proper management and storage of books, records, and documents in electronic form, +as well as for data access, that is relevant for the German tax authority, tax declaration, and +balance sheet. + +These principles have been written and published by the Federal Ministry of Finance (BMF) in +November 2014. Since January 2015, **they have become the norm** and have replaced previously +accepted practices linked to computer-based accounting. Several changes have been made by the BMF in +2019 and January 2020 to specify some of the content due to the development of digital solutions +(cloud hosting, paperless companies, etc.). + +:::{important} +Odoo is certified **GoBD-compliant**. +::: + +#### Understanding GoBD in relation to accounting software + +The **GoBD is binding for companies that have to present accounts**, which includes SMEs, +freelancers, and entrepreneurs, to the financial authorities. As such, **the taxpayer himself is the +sole responsible** for the complete and exhaustive keeping of fiscal-relevant data (above-mentioned +financial and related data). + +Apart from software requirements, the user is required to ensure internal control systems (*in +accordance with sec. 146 of the Fiscal Code*): + +- access rights control; +- segregation of duties, functional separating; +- entry controls (error notifications, plausibility checks); +- reconciliation checks at data entry; +- processing controls; and +- measures to prevent intentional or unintentional manipulation of software, data, or documents. + +The user must distribute tasks within their organization to the relevant positions (*control*) and +verify that the tasks are properly and completely performed (*supervision*). The result of these +controls must be recorded (*documentation*), and should errors be found during these controls, +appropriate measures to correct the situation should be put into place (*prevention*). + +#### Data security + +The taxpayer must **secure the system against any data loss** due to deletion, removal, or theft of +any data. If the entries are not sufficiently secured, the bookkeeping will be regarded as not in +accordance with the GoBD guidelines. + +Once bookings have been finally posted, they can no longer be changed or deleted via the +application. + +- If Odoo is used in the cloud, regular backups are part of the Odoo Online service. In addition, + regular backups can be downloaded and backed up on external systems. + + :::{seealso} + [Odoo Cloud Hosting - Service Level Agreement](https://www.odooo.com/cloud-sla) + ::: + +- If the server is operated locally, the user is responsible for creating the necessary backup + infrastructure. + +:::{important} +In some cases, data has to be kept for ten years or more, so always have backups saved. It is +even more important if you decide to change software provider. +::: + +#### Responsibility of the software editor + +Considering GoBD applies only to the taxpayer, **the software editor can by no means be held +responsible for the accurate and compliant documentation of their users' financial transactional +data**. It can merely provide the necessary tools for the user to respect the software-related +guidelines described in the GoBD. + +#### Ensuring compliance through Odoo + +The keywords, when it comes to GoBD are: **traceable, verifiable, true, clear, and continuous**. +In short, you need to have audit-proof archiving in place, and Odoo provides you with the means to +achieve all of these objectives: + +1. **Traceability and verifiability** + Each record in Odoo is stamped with the creator of the document, the creation date, the + modification date, and who modified it. In addition, relevant fields are tracked. Thus, it can + be seen which value was changed by whom in the chatter of the relevant object. +2. **Completeness** + All financial data must be recorded in the system, and there can be no gaps. Odoo ensures that + there is no gap in the numbering of the financial transactions. It is the responsibility of the + user to encode all financial data in the system. As most financial data in Odoo is generated + automatically, it remains the responsibility of the user to encode all vendor bills and + miscellaneous operations completely. +3. **Accuracy** + Odoo ensures that, with the correct configuration, the correct accounts are used. In addition, + the control mechanisms between purchase orders and sales orders and their respective invoices + reflect the reality of the business. It is the responsibility of the user to scan and attach + the paper-based vendor bill to the respective record in Odoo. + *Odoo Documents helps you + automate this task* + . +4. **Timely booking and record-keeping** + As most financial data in Odoo is generated by the transactional objects (for example, the + invoice is booked at confirmation), Odoo ensures out-of-the-box timely record-keeping. It is + the responsibility of the user to encode all incoming vendor bills in a timely manner, as well + as the miscellaneous operations. +5. **Order** + Financial data stored in Odoo is, per definition, ordered and can be reordered according to + most fields present in the model. A specific ordering is not enforced by the GoBD, but the + system must ensure that a given financial transaction can be quickly found by a third-party + expert. Odoo ensures this out-of-the-box. +6. **Inalterability** + With the German Odoo localization, Odoo is in standard configured in such a way that the + inalterability clause can be adhered to without any further customization. + +#### GoBD export + +In the case of fiscal control, the fiscal authority can request three levels of access to the +accounting system (Z1, Z2, Z3). These levels vary from direct access to the interface to the +handover of the financial data on a storage device. + +In the case of a handover of financial data to a storage device, the GoBD does **not** enforce the +format. It can be, for example, in XLS, CSV, XML, Lotus 123, SAP-format, AS/400-format, or else. +Odoo supports the CSV and XLS export of financial data out of the box. The GoBD **recommends** the +export in a specific XML-based GoBD format (see "Ergänzende Informationen zur +Datenträgerüberlassung" §3), but it is not binding. + +#### Non-compliance + +In the event of an infringement, you can expect a fine and a court order demanding the +implementation of specific measures. + +(germany-pos)= + +## Point of Sale + +### Technical security system + +The **Kassensicherungsverordnung** (The Act on Protection against Manipulation of Digital Records) +requires that electronic record-keeping systems - including the {doc}`point of sale +` systems - must be equipped with a **technical security system** +(also called **TSS** or **TSE**). + +Odoo offers a service that is compliant with the help of [fiskaly](https://fiskaly.com), a +*cloud-based solution*. + +:::{important} +Since this solution is cloud-based, a working internet connection is required. +::: + +:::{note} +The only VAT rates allowed are given by fiskaly. You can check these rates by consulting +[fiskaly DSFinV-K API: VAT Definition](https://developer.fiskaly.com/api/dsfinvk/v0/#tag/VAT-Definition). +::: + +#### Configuration + +{ref}`Install ` the **Germany - Certification for Point of Sale** +(`l10n_de_pos_cert`) and **Germany - Certification for Point of Sale of type restaurant** +(`l10n_de_pos_res_cert`) modules. + +:::{tip} +If these modules are not listed, {ref}`update the app list `. +::: + +##### Company registration at the financial authority + +To register your company, open the {guilabel}`Settings` app, click {guilabel}`Update Info` under the +{guilabel}`Companies` section, and fill in the following fields: + +- {guilabel}`Company Name` +- {guilabel}`Address` +- {guilabel}`VAT` +- {guilabel}`St.-Nr.` (Steuernummer) this number is assigned by the tax office to every taxable + natural or legal person (e.g., `2893081508152`). +- {guilabel}`W-IdNr.` (Wirtschafts-Identifikationsnummer) this number is used as a permanent + identification number for economically active persons. + +You can then **register your company through fiskaly** by opening the {guilabel}`Fiskaly` tab and +clicking the {guilabel}`Fiskaly Registration` button. + +:::{tip} +If you do not see the {guilabel}`Fiskaly Registration` button, make sure that you *saved* your +company details and are not in *editing mode* anymore. +::: + +Once the registration has been finalized, new fields appear: + +- {guilabel}`Fiskaly Organization ID` refers to the ID of your company on fiskaly's side. +- {guilabel}`Fiskaly API Key` and {guilabel}`Fiskaly API Secret` are the credentials the system + uses to access the services offered by fiskaly. + +```{image} germany/fiskaly-registration.png +:alt: Fiskaly registration tab +``` + +:::{note} +It is possible to request new credentials if there is any issue with the current ones by clicking +the {guilabel}`New keys` button. +::: + +##### Create a technical security system and link it to a POS + +To use a point of sale in Germany, first create a {abbr}`TSS (Technical Security System)` by going +to {menuselection}`Point of Sale --> Configuration --> Point of Sale`, selecting the +{guilabel}`Point of Sale` to edit, then checking the {guilabel}`Create TSS` box under the +{guilabel}`Fiskaly API` section. + +Once the creation of the TSS is successful, you can find the: + +- {guilabel}`TSS ID`, which refers to the ID of your TSS on fiskaly's side, and +- {guilabel}`Fiskaly Client ID`, which refers to your POS on fiskaly's side. + +```{image} germany/fiskaly-tss.png +:alt: Fiskaly API section +``` + +#### DSFinV-K export + +Whenever you close a PoS session, the details of the orders are sent to the {abbr}`DSFinV-K +(Digitale Schnittstelle der Finanzverwaltung für Kassensysteme)` service of fiskaly. + +In case of an audit, you can export the data sent to DSFinV-K by going to {menuselection}`Point of +Sale --> Orders --> DSFinV-K Exports --> New`. + +```{image} germany/pos-orders-menu.png +:alt: Menu to export DSFinV-K +``` + +These fields are mandatory: + +- {guilabel}`Start Datetime`: export data with dates larger than or equal to the given start date +- {guilabel}`End Datetime`: export data with dates smaller than or equal to the given end date + +Leave the {guilabel}`Point of Sale` field blank to export the data of all your points of sale; +specify one if you want to export data for this specific POS only. + +```{image} germany/dsfinv-k-export.png +:alt: Exporting DSFinV-K +``` + +When an export is successfully triggered and is being processed, the {guilabel}`State` field should +mention {guilabel}`Pending`. Click {guilabel}`Refresh State` to check if it is ready. + diff --git a/content/applications/finance/fiscal_localizations/hong_kong.md b/content/applications/finance/fiscal_localizations/hong_kong.md new file mode 100644 index 000000000..5f39ae3bd --- /dev/null +++ b/content/applications/finance/fiscal_localizations/hong_kong.md @@ -0,0 +1,562 @@ +# Hong Kong + +## Configuration + +{ref}`Install ` the following modules to get the latest features of the Hong Kong +localization: + +```{eval-rst} +.. list-table:: + :header-rows: 1 + + * - Name + - Technical name + - Description + * - :guilabel:`Hong Kong - Accounting` + - `l10n_hk` + - The base module to manage chart of accounting and localization for Hong Kong. + * - :guilabel:`Hong Kong - Payroll` + - `l10n_hk_hr_payroll` + - Enables :ref:`payroll ` specific localization features for Odoo *Payroll* + app. This module also installs :guilabel:`Hong Kong - Payroll with Accounting` and + :guilabel:`Documents - Hong Kong Payroll`. + * - :guilabel:`Hong Kong - Payroll with Accounting` + - `l10n_hk_hr_payroll_account` + - Installs the link between Hong Kong payroll and accounting. + * - :guilabel:`Documents - Hong Kong Payroll` + - `documents_l10n_hk_hr_payroll` + - Integrates employee ir56 forms in the Odoo *Documents* app. +``` + +## FPS QR codes on invoices + +{abbr}`FPS (Faster Payment System)` is a payment service platform that allows customers to make +instant domestic payments to individuals and merchants in Hong Kong dollars or Renminbi via online +and mobile banking. + +### Activate QR codes + +Go to {menuselection}`Accounting app --> Configuration --> Settings`. Under the {guilabel}`Customer +Payments` section, tick the checkbox beside the {guilabel}`QR Codes` feature. Then, click +{guilabel}`Save`. + +### FPS bank account configuration + +Go to {menuselection}`Contacts app --> Configuration --> Bank Accounts section --> Bank Accounts`. +Then select the bank account for FPS activation. Proceed to set the {guilabel}`Proxy Type` and fill +in the {guilabel}`Proxy Value` field, depending on the type chosen. + +Remember to include the invoice number in the QR code, by ticking the {guilabel}`Include Reference` +checkbox. + +```{image} hong_kong/hk-fps-bank-setting.png +:align: center +:alt: FPS bank account configuration. +``` + +:::{important} +- The account holder's country must be set to `Hong Kong` on its contact form. +- The account holder's city is mandatory. +- You could also include the invoice number in the QR code by checking the {guilabel}`Include + Reference` checkbox. +::: + +:::{seealso} +{doc}`../accounting/bank` +::: + +### Bank journal configuration + +Go to {menuselection}`Accounting app --> Configuration --> Journals` and open the bank journal. +Then, fill out the {guilabel}`Account Number` and {guilabel}`Bank` fields, located in the +{guilabel}`Journal Entries` tab. + +```{image} hong_kong/hk-bank-account-journal-setting.png +:align: center +:alt: Bank Account's journal configuration. +``` + +### Issue invoices with FPS QR codes + +When creating a new invoice, open the {guilabel}`Other Info` tab and set the {guilabel}`Payment +QR-code` option to {guilabel}`EMV Merchant-Presented QR-code`. + +```{image} hong_kong/hk-qr-code-invoice-setting.png +:align: center +:alt: Select EMV Merchant-Presented QR-code option. +``` + +Ensure that the {guilabel}`Recipient Bank` is configured, as Odoo uses this field to generate the +FPS QR code. + +(hong-kong-payroll)= + +## Payroll + +:::{important} +Ensure the {guilabel}`Hong Kong - Payroll` (`l10n_hk_hr_payroll`) module is installed before +proceeding. +::: + +### Create employees + +Go to the {menuselection}`Employees` app and click {guilabel}`New`. Then, configure the following +fields: + +- Under the {guilabel}`Work Information` tab + + - {guilabel}`Working Hours`: {guilabel}`HK Standard 40 hours/week` option **must** be selected. + +- Under the {guilabel}`Private Information` tab + + - {guilabel}`Surname, Given Name, Name in Chinese`: name of the employee. + - {guilabel}`Private Address`: address of the employee. + - {guilabel}`Bank Account Number`: employee's bank account number. + - {guilabel}`Current Rental`: employee's rental records (if rental allowance is applicable). + - {guilabel}`Autopay Type`: {guilabel}`BBAN`, {guilabel}`SVID`, {guilabel}`EMAL`, etc. + - {guilabel}`Autopay Reference`: autopay reference number. + - {guilabel}`Identification No`: HKID of the employee. + - {guilabel}`Gender`: gender of the employee. + + :::{important} + For the {guilabel}`Bank Account Number`, this account should be set as {guilabel}`Trusted` + before further processing. + + To achieve this, click on the right-arrow button next to {guilabel}`Bank Account Number` field. + Set the {guilabel}`Send Money` to {guilabel}`Trusted` by clicking on the toggle. + ::: + + :::{note} + To populate the {guilabel}`Current Rental`, click on the {guilabel}`History` button. + Then, click on {guilabel}`New`. Fill in the relevant details and save the rental record. Upon + saving the record, the rental contract {guilabel}`state` will be visible (at the top-right + corner) and can be set to {guilabel}`Running`. + ::: + +- Under the {guilabel}`HR Settings` tab: + + - {guilabel}`Volunteer Contribution Option`: select either {guilabel}`Only Mandatory + Contribution`, {guilabel}`With Fixed %VC`, or {guilabel}`Cap 5% VC`. + - {guilabel}`MPF Manulife Account`: account number, if applicable. + +(hong-kong-manage-contracts)= + +### Manage contracts + +Once the new employee has been created, click the {guilabel}`Contracts` smart button on the +employee record, or navigate to {menuselection}`Employees app --> Employees --> Contracts`. + +:::{note} +Only **one** contract can be active simultaneously per employee, but an employee can be assigned +consecutive contracts during their employment. +::: + +The following are critical for setting up a contract: + +- {guilabel}`Salary Structure Type`: set as {guilabel}`CAP57: Hong Kong Employee`. + +- {guilabel}`Contract Start Date`: start date of employment. + +- {guilabel}`Working Schedule`: set as {guilabel}`HK Standard 40 hours/week` (from employee record). + +- {guilabel}`Work Entry Source`: select either {guilabel}`Working Schedule`, {guilabel}`Attendances` + or {guilabel}`Planning`. This field determines how the work entries are accounted for in the + payslip. + + - {guilabel}`Working Schedule`: the work entries are generated automatically based on the + employee's working schedule. + - {guilabel}`Attendances`: the work entries are generated based on the check-in/out period logged + in the *Attendances*. + - {guilabel}`Planning`: the work entries are generated from planning shifts only. + +- Under the {guilabel}`Salary Information` tab + + - {guilabel}`Wage Type`: select {guilabel}`Fixed Wage` for Full-time or Part-time employees, or + {guilabel}`Hourly Wage` for employees who are paid hourly. + - {guilabel}`Schedule Pay`: the frequency of payslip issuance. + - {guilabel}`Wage`: {guilabel}`Monthly` or {guilabel}`Hourly` depending on the {guilabel}`Wage + Type`. + - {guilabel}`Internet Subscription`: this is an **optional** field to provide additional internet + allowance on top of the current salary package. + +:::{important} +Timesheets do **not** impact work entries in Odoo. +::: + +Once all information has been setup, set the contract status to {guilabel}`Running` by clicking the +{guilabel}`Running` button in the top-right of the page. + +```{image} hong_kong/hk-contract.png +:align: center +:alt: Hong Kong employment contract. +``` + +(hong-kong-running-payslips)= + +### Generate payslips + +Once the employees, and their contracts, are configured, payslips can be generated in the *Payroll* +app. + +Odoo provides **four** different salary structures under CAP57 regulation: + +1. {guilabel}`CAP57: Employees Monthly Pay`: to process the monthly employee salary. +2. {guilabel}`CAP57: Payment in Lieu of Notice`: to process final payment upon contract termination + using {abbr}`ADW (Average Daily Wage)`. +3. {guilabel}`CAP57: Long Service Payment`: applicable to employees with more than five years of + service upon contract termination. +4. {guilabel}`CAP57: Severance Payment`: applicable to employees with more than two years of service + upon contract termination. + +Before running the payslips, the accounts used in the salary rule can be adjusted by navigating to +{menuselection}`Payroll app --> Configuration --> Rules`. + +```{image} hong_kong/hk-salary-rules.png +:align: center +:alt: Hong Kong Salary Rules. +``` + +Odoo can create pay runs in two ways: via {ref}`batch ` or +{ref}`individual ` payslips. + +(hong-kong-batch-payslips)= + +#### Batch payslips + +This method of payslip generation is used for recurring payments, since multiple employee payslips +can be managed at once. Go to {menuselection}`Payroll app --> Payslips --> Batches`. + +1. Click on {guilabel}`New`. +2. Enter a {guilabel}`Batch Name` (e.g. `2024 - Jan`) and {guilabel}`Period` (e.g. `01/01/2024` - + `01/31/2024`). +3. Click on {guilabel}`Generate Payslips`. +4. Choose which {guilabel}`Salary Structure` to use for this batch. The department filter allows the + batch to only apply to a specific group of employees. +5. Click on {guilabel}`Generate`. +6. A {guilabel}`Payslips` smart button is created automatically. + +Next, click {guilabel}`Create Draft Entry` to generate a draft journal entry found in the +{guilabel}`Other Info` tab of each payslip. A {guilabel}`Confirmation` pop-up window appears asking +{guilabel}`Are you sure you want to proceed?`. Click {guilabel}`Ok` to create the journal entries. + +(hong-kong-individual-payslips)= + +#### Individual payslips + +Go to {menuselection}`Payroll app --> Payslips --> All Payslips`. + +This method of payslip generation is commonly used to handle non-recurring payments (e.g. +{guilabel}`CAP57: Payment in Lieu of Notice`, {guilabel}`CAP57: Long Service Payment` or +{guilabel}`CAP57: Severance Payment`). + +1. Click on {guilabel}`New`. +2. Select an {guilabel}`Employee`. When selected, the {guilabel}`Contract` is filled out + automatically. +3. Add a pay {guilabel}`Period`. +4. Select a salary {guilabel}`Structure` (e.g. {guilabel}`CAP57: Employees Monthly Pay`). +5. The {guilabel}`Worked Days & Inputs` tab automatically compute the worked days/hours and time off + leaves that are applicable. +6. Additional payslip items can be added at this time (e.g. {guilabel}`Commissions`, + {guilabel}`Deductions`) under the {guilabel}`Other Inputs` section. +7. Click on {guilabel}`Compute Sheet` button to generate the payslip lines. This button updates + the {guilabel}`Salary Computation` tab. + +:::{note} +If the work entry for an employee was amended, click the {icon}`fa-cog` {guilabel}`(gear)` icon, +then click {guilabel}`Recompute Whole Sheet` to refresh the payslip's {guilabel}`Worked Days & +Inputs` tab. +::: + +The {guilabel}`Salary Computation` tab shows the detailed breakdown of the computation, based on +the salary rules configured for each structure type. + +1. {guilabel}`Rent Allowance`: amount derived from the employee's active rental record. +2. {guilabel}`Basic Salary`: amount of base salary provided (after rent allowance deduction). +3. {guilabel}`713 Gross`: net payable amount considering *Commission*, *Internet Allowance*, + *Reimbursements*, *Back-pay*, *Deduction*, etc. +4. {guilabel}`MPF Gross`: net payable amount from 713 gross after consideration of additional + allowances, deductions, and end-of-year payment. +5. {guilabel}`Employee Mandatory Contribution`: employee MPF Contribution. +6. {guilabel}`Employer Mandatory Contribution`: employer MPF Contribution. +7. {guilabel}`Gross`: net payable amount from MPF gross after consideration of MPF deductions. +8. {guilabel}`Net Salary`: final payable amount to be paid to the employee. + +:::{important} +There are no MPF contributions for the first month. Both employee and employer contribution +starts on second month. +::: + +```{image} hong_kong/hk-salary-computation.png +:align: center +:alt: Hong Kong Salary computation. +``` + +Under the {guilabel}`Other Inputs` section in {guilabel}`Worked Days & Inputs` tab, there are +additional manual input types: + +- {guilabel}`Back Pay`: additional salary payout can be included under this category. +- {guilabel}`Commission`: the commission earned during the period can be manually entered here. +- {guilabel}`Global Deduction`: a lump-sum deduction from the entire payslip. +- {guilabel}`Global Reimbursement`: a lump-sum reimbursement to the entire payslip. +- {guilabel}`Referral Fee`: the additional bonus offered for any form of business-related referral. +- {guilabel}`Moving Daily Wage`: to override the {abbr}`ADW (Average Daily Wage)` value used for + leaves computation. +- {guilabel}`Skip Rent Allowance`: if set, the rental allowance is excluded from the current + payslip. +- {guilabel}`Custom Average Monthly Salary`: to override the average monthly salary used for + end-of-year payment (rule is only applicable to payslips generated in December). +- {guilabel}`Lieu of Notice Period (Months)`: only applicable to {guilabel}`CAP57: Payment in Lieu + of Notice` salary structure. By default, the final payout is set as 1-month. Use the + {guilabel}`Count` field under the {guilabel}`Other Inputs` section to set a different notice + period duration. + +Once the payslips are ready, click on {guilabel}`Compute Sheet`, followed by {guilabel}`Create Draft +entry` to generate a draft journal entry found in the {guilabel}`Other Info` tab of the payslip. + +### Pay employees + +Once the draft journal entries have been posted, the company can now pay the employees. The user can +choose between **two** different *payment methods*: + +- From the employee's payslip ({menuselection}`Payroll app --> Payslips --> All Payslips`), once the + payslip's journal entry has been posted, click {guilabel}`Register Payment`. The process is the + same as {doc}`paying vendor bills <../accounting/payments>`. Select the desired bank journal and + payment method, then later reconcile the payment with the corresponding bank statement. +- For batch payments ({menuselection}`Payroll app --> Payslips --> Batches`), once all draft journal + entries from the batch are confirmed, click {guilabel}`Mark as Paid` to post the payment journal + entry. Then {doc}`create a payment <../accounting/payments>` in the *Accounting* app, and + reconcile accordingly. + +### Attendances and hourly wage + +To configure the contract for an employee paid hourly using the *Attendances* app for hours +tracking, navigate to {menuselection}`Payroll app --> Contracts --> Contracts`. +Create a new {ref}`contract `. It is important to remember to set the +{guilabel}`Work Entry Source` as {guilabel}`Attendances`, and {guilabel}`Wage Type` as +{guilabel}`Hourly Wage`. + +To record the hours logged by the employee using *Attendances* app: + +1. Go to {menuselection}`Attendances app`. +2. The employee can check-in/out, via the kiosk mode and the time will be logged automatically. +3. In the {menuselection}`Payroll app`, review the attendance work entries generated from + {menuselection}`Payroll app --> Work Entries --> Work Entries`. +4. Next, generate the {ref}`payslips ` and process the payment. + +```{image} hong_kong/hk-attendance-work-entry.png +:align: center +:alt: Hong Kong Attendance Work Entry. +``` + +```{image} hong_kong/hk-attendance-payslip.png +:align: center +:alt: Hong Kong Attendance Payslip. +``` + +### Time Off with Payroll + +The work entry types and time off types are fully integrated between the *Time Off* and +*Payroll* apps. There are several default time off types and work entry types specific to +Hong Kong which are installed automatically along with the *Hong Kong - Payroll* module. + +Go to {menuselection}`Payroll app --> Configuration --> Work Entry Types` and click {guilabel}`New`. + +There are two checkboxes to be considered when setting up the work entry type: + +- {guilabel}`Use 713`: Include this leave type as part of 713 computation. +- {guilabel}`Non-full pay`: 80% of the {abbr}`ADW (Average Daily Wage)`. + +```{image} hong_kong/hk-work-entry-type.png +:align: center +:alt: Hong Kong Work Entry Type. +``` + +:::{seealso} +{ref}`Creating and configuring work entry types ` +::: + +### Understanding 713 Ordinance + +The *Hong Kong - Payroll* module is compliant with 713 Ordinance which relates to the +{abbr}`ADW (Average Daily Wage)` computation to ensure fair compensation for employees. + +The ADW computation is as follows: + +:::{figure} hong_kong/hk-adw.png +:alt: Hong Kong ADW Formula. + +{abbr}`ADW (Average Daily Wage)` equals the total wage in a 12-month period, minus the wages of +non-full pay, divided by the total days in a 12-month period minus the days of non-full pay. +::: + +:::{note} +For 418 compliance, there is no automated allocation of the *Statutory Holiday* entitlement to +the employees. As soon as 418 requirements are met, manually allocate the leaves, via the *Time +Off* app. +::: + +:::{note} +Before generating payslips, ensure the statuses are {guilabel}`Done` to validate the outcome. +::: + +```{eval-rst} +.. list-table:: + :header-rows: 1 + + * - Period + - Days + - Wage + - Commission + - Total + - ADW + - Leave Value + * - Jan + - 31 + - $20200 + - $0 + - $20200 + - $651.61 ($20200/31) + - N/A + * - Feb + - 28 + - $20200 + - $5000 + - $25200 + - $769.49 ($45400/59) + - N/A + * - Mar (One Day Annual Leave) + - 31 + - $20324.33 + - $0 + - $20324.33 + - $730.27 ($65724.33/90) + - $769.49 + * - Apr (One Day 80% Sick Leave) + - 30 + - $20117.56 + - $0 + - + - + - $584.22 ($730.27*0.8) +``` + +```{eval-rst} +.. example:: + Here is an example demonstrating the 713 logic: + + - **Jan**: Generate a payslip with a monthly wage of $20200. The :abbr:`ADW (Average Daily Wage)` + is always computed on a cumulative basis of the trailing 12-months. + - **Feb**: Generate a similar payslip, but add an :guilabel:`Other Input Type` for the + :guilabel:`Commission`. + - **Mar**: Apply for **one** full-paid annual leave in March. The salary compensation for the + leave taken is based on :abbr:`ADW (Average Daily Wage)` thus far. + + .. image:: hong_kong/hk-march-713.png + :align: center + :alt: Hong Kong March 713. + + - **Apr**: Apply for a 1-day non-full pay leave in April. Since this is a non-full pay leave, the + :abbr:`ADW (Average Daily Wage)` is computed accordingly. + + .. image:: hong_kong/hk-apr-713.png + :align: center + :alt: Hong Kong April 713. +``` + +:::{note} +The value of {abbr}`ADW (Average Daily Wage)` is computed in the backend, and not be visible to +the user. +::: + +:::{seealso} +- [HK 713 Ordinance](https://www.labour.gov.hk/eng/public/wcp/ConciseGuide/Appendix1.pdf) +- [HK 418 Ordinance](https://www.workstem.com/hk/en/blog/418-regulations/) +::: + +### Generate reports + +Before generating the below reports, setup the following in {menuselection}`Settings app --> +Payroll`. + +Configure the following in the {guilabel}`Accounting` section: + +- Tick the {guilabel}`Payroll HSBC Autopay` checkbox. + + - {guilabel}`Autopay Type`: Set as {guilabel}`H2H Submission`. + - Select the {guilabel}`Bank Account` to use. + +Configure the following in the {guilabel}`HK Localization` section: + +- {guilabel}`Employer's Name shows on reports` +- {guilabel}`Employer's File Number` +- {guilabel}`Manulife MPF Scheme` + +```{image} hong_kong/hk-report-setup.png +:align: center +:alt: Hong Kong Payroll Settings. +``` + +#### IRD report + +There are a total of **four** IRD reports available: + +- {guilabel}`IR56B`: employer's Return of Remuneration and Pensions. +- {guilabel}`IR56E`: notification of Commencement of Employment. +- {guilabel}`IR56F`: notification of Ceasation of Employment (remaining in HK). +- {guilabel}`IR56G`: notification of Ceasation of Employment (departing from HK permanently). + +Go to {menuselection}`Payroll app --> Reporting`, and select one of the {guilabel}`IR56B/E/F/G +Sheet` options: + +1. Click on {guilabel}`New`. +2. Fill in the relevant information for the IRD report. +3. Click on {guilabel}`Populate`, and the {guilabel}`Eligible Employees` smart button appears. +4. The {guilabel}`Employee Declarations` status is {guilabel}`Draft` and changed to + {guilabel}`Generated PDF` status once the schedule runs. +5. Once the PDF is generated, the IRD form may be downloaded. + +```{image} hong_kong/hk-ir56b.png +:align: center +:alt: Hong Kong IR56B report. +``` + +:::{note} +The scheduled action called *Payroll: Generate pdfs* can be manually triggered. It is set by +default to run the PDF generation monthly. +::: + +#### Manulife MPF sheet + +Go to {menuselection}`Payroll app --> Reporting --> Manulife MPF Sheet`. + +1. Click on {guilabel}`New`. +2. Select the relevant {guilabel}`Year`, {guilabel}`Month`, and {guilabel}`Sequence No.`. +3. Click on {guilabel}`Create XLSX`. +4. The *Manulife MPF XLSX* file is then generated, and available for download. + +```{image} hong_kong/hk-manulife-sheet.png +:align: center +:alt: Hong Kong Manulife Sheet. +``` + +:::{note} +Odoo will not be developing further reports for other MPF trustee as there will soon be an +eMPF platform setup by the local government. +::: + +:::{seealso} +[eMPF](https://www.mpfa.org.hk/en/empf/overview) +::: + +#### HSBC autopay report + +If *HSBC Autopay* is selected as the batch payment method, click on {guilabel}`Create HSBC Autopay +Report`, and fill in the mandatory fields: + +```{image} hong_kong/hk-generate-autopay.png +:align: center +:alt: Hong Kong HSBC Autopay wizard. +``` + +This creates an {file}`.apc` file format which can be uploaded to the HSCB portal for processing. + diff --git a/content/applications/finance/fiscal_localizations/india.md b/content/applications/finance/fiscal_localizations/india.md new file mode 100644 index 000000000..970bb67f3 --- /dev/null +++ b/content/applications/finance/fiscal_localizations/india.md @@ -0,0 +1,713 @@ +# India + +(india-installation)= + +## Installation + +{ref}`Install ` the following modules to get all the features of the Indian +localization: + +```{eval-rst} +.. list-table:: + :header-rows: 1 + + * - Name + - Technical name + - Description + * - :guilabel:`Indian - Accounting` + - `l10n_in` + - Default :ref:`fiscal localization package ` + * - :guilabel:`Indian E-invoicing` + - `l10n_in_edi` + - :ref:`Indian e-invoicing integration ` + * - :guilabel:`Indian E-waybill` + - `l10n_in_edi_ewaybill` + - :ref:`Indian E-way bill integration ` + * - :guilabel:`Indian - Check GST Number Status` + - `l10n_in_gstin_status` + - :ref:`Indian Check GST Number Status ` + * - :guilabel:`Indian - GSTR India eFiling` + - `l10n_in_reports_gstr` + - :ref:`Indian GST Return filing ` + * - :guilabel:`Indian - Accounting Reports` + - `l10n_in_reports` + - :ref:`Indian tax reports ` + * - :guilabel:`Indian - Purchase Report(GST)` + - `l10n_in_purchase` + - Indian GST Purchase report + * - :guilabel:`Indian - Sale Report(GST)` + - `l10n_in_sale` + - Indian GST Sale report + * - :guilabel:`Indian - Stock Report(GST)` + - `l10n_in_stock` + - Indian GST Stock report +``` + +```{image} india/india-modules.png +:alt: Indian localization modules +``` + +(india-e-invoicing)= + +## Indian Configuration + +In {menuselection}`Settings --> Users & Companies --> Companies`, add your {guilabel}`PAN` and +{guilabel}`GSTIN`. The PAN is essential for determining the type of taxpayer, +while GSTIN is required for generating e-Invoices and E-waybills. + +## e-Invoice system + +Odoo is compliant with the **Indian Goods and Services Tax (GST) e-Invoice system** requirements. + +### Setup + +(india-e-invoicing-api)= + +#### NIC e-Invoice registration + +You must register on the {abbr}`NIC (National Informatics Centre)` e-Invoice portal to get your +**API credentials**. You need these credentials to {ref}`configure your Odoo Accounting app +`. + +1. Log in to the [NIC e-Invoice portal](https://einvoice1.gst.gov.in/) by clicking + {guilabel}`Login` and entering your {guilabel}`Username` and {guilabel}`Password`; + + :::{note} + If you are already registered on the NIC portal, you can use the same login credentials. + ::: + + ```{image} india/e-invoice-system-login.png + :alt: Register Odoo ERP system on e-invoice web portal + ``` + +2. From the dashboard, go to {menuselection}`API Registration --> User Credentials --> Create API + User`; + +3. After that, you should receive an {abbr}`OTP (one-time password)` code on your registered mobile + number. Enter the OTP code and click {guilabel}`Verify OTP`; + +4. Select {guilabel}`Through GSP` for the API interface, set {guilabel}`Tera Software Limited` as + GSP, and type in a {guilabel}`Username` and {guilabel}`Password` for your API. Once it is done, + click {guilabel}`Submit`. + + ```{image} india/submit-api-registration-details.png + :alt: Submit API specific Username and Password + ``` + +(india-e-invoicing-configuration)= + +#### Configuration in Odoo + +To enable the e-Invoice service in Odoo, go to {menuselection}`Accounting --> Configuration --> +Settings --> Indian Electronic Invoicing`, and enter the {guilabel}`Username` and +{guilabel}`Password` previously set for the API. + +```{image} india/e-invoice-setup.png +:alt: Setup e-invoice service +``` + +(india-e-invoicing-journals)= + +##### Journals + +To automatically send e-Invoices to the NIC e-Invoice portal, you must first configure your *sales* +journal by going to {menuselection}`Accounting --> Configuration --> Journals`, opening your *sales* +journal, and in the {guilabel}`Advanced Settings` tab, under {guilabel}`Electronic Data +Interchange`, enable {guilabel}`E-Invoice (IN)` and save. + +(india-e-invoicing-workflow)= + +### Workflow + +(india-invoice-validation)= + +#### Invoice validation + +Once an invoice is validated, a confirmation message is displayed at the top. Odoo automatically +uploads the JSON-signed file of validated invoices to the NIC e-Invoice portal after some time. If +you want to process the invoice immediately, click {guilabel}`Process now`. + +```{image} india/e-invoice-process.png +:alt: Indian e-invoicing confirmation message +``` + +:::{note} +- You can find the JSON-signed file in the attached files in the chatter. +- You can check the document's {abbr}`EDI (electronic data interchange)` status under the + {guilabel}`EDI Document` tab or the {guilabel}`Electronic invoicing` field of the invoice. +::: + +(india-invoice-pdf-report)= + +#### Invoice PDF report + +Once an invoice is validated and submitted, the invoice PDF report can be printed. The report +includes the {abbr}`IRN (Invoice Reference Number)`, {guilabel}`Ack. No` (acknowledgment number) and +{guilabel}`Ack. Date` (acknowledgment date), and QR code. These certify that the invoice is a valid +fiscal document. + +```{image} india/invoice-report.png +:alt: IRN and QR code +``` + +(india-edi-cancellation)= + +#### e-Invoice cancellation + +If you want to cancel an e-Invoice, go to the {guilabel}`Other info` tab of the invoice and fill out +the {guilabel}`Cancel reason` and {guilabel}`Cancel remarks` fields. Then, click {guilabel}`Request +EDI cancellation`. The status of the {guilabel}`Electronic invoicing` field changes to {guilabel}`To +Cancel`. + +:::{important} +Doing so cancels both the {ref}`e-Invoice ` and the {ref}`E-Way bill +`. +::: + +```{image} india/e-invoice-cancellation.png +:alt: cancel reason and remarks +``` + +:::{note} +- If you want to abort the cancellation before processing the invoice, then click {guilabel}`Call + Off EDI Cancellation`. +- Once you request to cancel the e-Invoice, Odoo automatically submits the JSON-signed file to + the NIC e-Invoice portal. You can click {guilabel}`Process now` if you want to process the + invoice immediately. +::: + +(india-e-invoice-negative-lines)= + +#### Management of negative lines in e-Invoices + +Negative lines are typically used to represent discounts or adjustments associated with specific +products or global discounts. The government portal prohibits the submission of data with negative +lines, which means they need to be converted based on the HSN code and GST rate. This is done +automatically by Odoo. + +```{eval-rst} +.. example:: + + Consider the following example: + + +---------------------------------------------------------------------------------------------------+ + | **Product Details** | + +=======================+==============+==================+==============+==============+===========+ + | **Product Name** | **HSN Code** | **Tax Excluded** | **Quantity** | **GST Rate** | **Total** | + +-----------------------+--------------+------------------+--------------+--------------+-----------+ + | Product A | 123456 | 1,000 | 1 | 18% | 1,180 | + +-----------------------+--------------+------------------+--------------+--------------+-----------+ + | Product B | 239345 | 1,500 | 2 | 5% | 3,150 | + +-----------------------+--------------+------------------+--------------+--------------+-----------+ + | Discount on Product A | 123456 | -100 | 1 | 18% | -118 | + +-----------------------+--------------+------------------+--------------+--------------+-----------+ + + Here's the transformed representation: + + +-------------------------------------------------------------------------------------------------------------+ + | **Product Details** | + +==================+==============+==================+==============+==============+==============+===========+ + | **Product Name** | **HSN Code** | **Tax Excluded** | **Quantity** | **Discount** | **GST Rate** | **Total** | + +------------------+--------------+------------------+--------------+--------------+--------------+-----------+ + | Product A | 123456 | 1,000 | 1 | 100 | 18% | 1,062 | + +------------------+--------------+------------------+--------------+--------------+--------------+-----------+ + | Product B | 239345 | 1,500 | 2 | 0 | 5% | 3,150 | + +------------------+--------------+------------------+--------------+--------------+--------------+-----------+ + + In this conversion, negative lines have been transformed into positive discounts, maintaining + accurate calculations based on the HSN Code and GST rate. This ensures a more straightforward and + standardized representation in the E-invoice records. +``` + +(india-verify-e-invoice)= + +#### GST e-Invoice verification + +After submitting an e-Invoice, you can verify if the invoice is signed from the GST e-Invoice system +website itself. + +1. Download the JSON file from the attached files. It can be found in the chatter of the related + invoice; + +2. Open the [NIC e-Invoice portal](https://einvoice1.gst.gov.in/) and go to + {menuselection}`Search --> Verify Signed Invoice`; + +3. Select the JSON file and submit it; + + ```{image} india/verify-invoice.png + :alt: select the JSON file for verify invoice + ``` + + If the file is signed, a confirmation message is displayed. + + ```{image} india/signed-invoice.png + :alt: verified e-invoice + ``` + +(india-e-waybill)= + +## E-Way bill + +### Setup + +Odoo is compliant with the **Indian Goods and Services Tax (GST) E-waybill system** requirements. + +(india-e-waybill-api)= + +#### API registration on NIC E-Way bill + +You must register on the {abbr}`NIC (National Informatics Centre)` E-Way bill portal to create your +**API credentials**. You need these credentials to {ref}`configure your Odoo Accounting app +`. + +1. Log in to the [NIC E-Way bill portal](https://ewaybillgst.gov.in/) by clicking + {guilabel}`Login` and entering your {guilabel}`Username` and {guilabel}`Password`; + +2. From your dashboard, go to {menuselection}`Registration --> For GSP`; + +3. Click {guilabel}`Send OTP`. Once you have received the code on your registered mobile number, + enter it and click {guilabel}`Verify OTP`; + +4. Check if {guilabel}`Tera Software Limited` is already on the registered GSP/ERP list. If so, use + the username and password used to log in to the NIC portal. Otherwise, follow the next steps; + + ```{image} india/e-waybill-gsp-list.png + :alt: E-Way bill list of registered GSP/ERP + ``` + +5. Select {guilabel}`Add/New`, select {guilabel}`Tera Software Limited` as your GSP Name, create a + {guilabel}`Username` and a {guilabel}`Password` for your API, and click {guilabel}`Add`. + + ```{image} india/e-waybill-registration-details.png + :alt: Submit GSP API registration details + ``` + +(india-e-waybill-configuration)= + +#### Configuration in Odoo + +To set up the E-Way bill service, go to {menuselection}`Accounting --> Configuration --> Settings +--> Indian Electronic WayBill --> Setup E-Way bill`, and enter your {guilabel}`Username` and +{guilabel}`Password`. + +```{image} india/e-waybill-configuration.png +:alt: E-way bill setup odoo +``` + +(india-e-waybill-workflow)= + +### Workflow + +(india-e-waybill-send)= + +#### Send an E-Way bill + +To send an E-Way bill, confirm the customer invoice/vendor bill and click {guilabel}`Send E-Way +bill`. + +```{image} india/e-waybill-send-button.png +:alt: Send E-waybill button on invoices +``` + +(india-invoice-validation-e-way)= + +#### Invoice validation + +Once an invoice/bill has been issued and sent via {guilabel}`Send E-Way bill`, a confirmation +message is displayed. + +```{image} india/e-waybill-process.png +:alt: Indian e-Way bill confirmation message +``` + +:::{note} +- You can find the JSON-signed file in the attached files in the chatter. +- Odoo automatically uploads the JSON-signed file to the government portal after some time. Click + {guilabel}`Process now` if you want to process the invoice/bill immediately. +::: + +#### Invoice PDF report + +You can print the invoice PDF report once you have submitted the E-Way bill. The report includes the +**E-Way bill number** and the **E-Way bill validity date**. + +```{image} india/e-waybill-invoice-report.png +:alt: E-way bill acknowledgment number and date +``` + +(india-e-waybill-cancellation)= + +#### E-Way bill cancellation + +If you want to cancel an E-Way bill, go to the {guilabel}`E-Way bill` tab of the related +invoice/bill and fill out the {guilabel}`Cancel reason` and {guilabel}`Cancel remarks` fields. Then, +click {guilabel}`Request EDI Cancellation`. + +:::{important} +Doing so cancels both the {ref}`e-Invoice ` (if applicable) and the +{ref}`E-Way bill `. +::: + +```{image} india/e-waybill-cancellation.png +:alt: Cancel reason and remarks +``` + +:::{note} +- If you want to abort the cancellation before processing the invoice, click {guilabel}`Call Off + EDI Cancellation`. +- Once you request to cancel the E-Way bill, Odoo automatically submits the JSON-signed file to + the government portal. You can click {guilabel}`Process Now` if you want to process the invoice + immediately. +::: + +(india-gstin-status)= + +## Indian Check GSTIN Status + +The {guilabel}`Indian - Check GST Number Status` module allows you to verify the status of a +{abbr}`GSTIN (Goods and Services Tax Identification Number)` directly from Odoo. + +To verify the status of a contact's GST number, access the customer's/vendor's form and click +{guilabel}`Check GSTIN Status` next to the {guilabel}`GSTIN` field. + +To verify the status of a GST number entered on an invoice/bill, access the invoice/bill and click +the {icon}`fa-refresh` ({guilabel}`refresh`) button next to the {guilabel}`GST Status` field. + +```{image} india/gstin-status-invoice.png +:alt: Check GSTIN status of an invoice +``` + +A notification is displayed to confirm the status update and the GSTIN status and verification date +are logged in the contact's chatter. + +(india-gstr)= + +## Indian GST Return filing + +(india-gstr-api)= + +### Enable API access + +To file GST Returns in Odoo, you must first enable API access on the GST portal. + +1. Log into the [GST portal](https://services.gst.gov.in/services/login) by entering your + {guilabel}`Username` and {guilabel}`Password`, and go to {guilabel}`My Profile` on your **profile + menu**; + + ```{image} india/gst-portal-my-profile.png + :alt: Click On the My Profile from profile + ``` + +2. Select {guilabel}`Manage API Access`, and click {guilabel}`Yes` to enable API access; + + ```{image} india/gst-portal-api-yes.png + :alt: Click Yes + ``` + +3. Doing so enables a {guilabel}`Duration` drop-down menu. Select the {guilabel}`Duration` of your + preference, and click {guilabel}`Confirm`. + +(india-gstr-configuration)= + +### Indian GST Service In Odoo + +Once you have enabled the {ref}`API access ` on the GST portal, you can set up the +{guilabel}`Indian GST Service` in Odoo. + +Go to {menuselection}`Accounting --> Configuration --> Settings --> Indian GST Service` and enter +the {guilabel}`GST Username`. Click {guilabel}`Send OTP`, enter the code, and finally, +{guilabel}`Validate`. + +> ```{image} india/gst-setup.png +> :alt: Please enter your GST portal Username as Username +> ``` + +(india-gstr-workflow)= + +### File-in GST Return + +When the {guilabel}`Indian GST Service` is configured, you can file your GST return. Go to +{menuselection}`Accounting --> Reporting --> India --> GST Return periods` and create a new **GST +Return Period** if it does not exist. GST Return file-in is done in **three steps** in Odoo: + +:::{note} +**Tax Return Periodicity** can be +{doc}`configured <../accounting/reporting/tax_returns>` according to the user's +needs. +::: + +(india-gstr-1)= + +#### Send GSTR-1 + +1. The user can verify the {ref}`GSTR-1 ` report before uploading it to the + **GST portal** by clicking {guilabel}`GSTR-1 Report`; + +2. The user can also get details to be submitted in **GSTR-1** in **Spreadsheet view** by clicking + on {guilabel}`Generate`; + + ```{image} india/gst-gstr-1-generate.png + :alt: GSTR-1 generate + ``` + + ```{image} india/gst-gstr-1-spreadsheet-view.png + :alt: GSTR-1 Spreadsheet View + ``` + +3. If the **GSTR-1** report is correct, then click {guilabel}`Push to GSTN` to send it to the **GST + portal**. The status of the {guilabel}`GSTR-1` report changes to {guilabel}`Sending`; + + ```{image} india/gst-gstr-1-sending.png + :alt: GSTR-1 in the Sending Status + ``` + +4. After a few seconds, the status of the **GSTR-1** report changes to {guilabel}`Waiting for + Status`. It means that the **GSTR-1** report has been sent to the {guilabel}`GST Portal` and is + being verified on the {guilabel}`GST Portal`; + + ```{image} india/gst-gstr-1-waiting.png + :alt: GSTR-1 in the Waiting for Status + ``` + +5. Once more, after a few seconds, the status either changes to {guilabel}`Sent` or {guilabel}`Error + in Invoice`. The status {guilabel}`Error in Invoice` indicates that some of the invoices are not + correctly filled out to be validated by the **GST portal**; + + - If the state of the **GSTR-1** is {guilabel}`Sent`, it means your **GSTR-1** report is ready to + be filed on the **GST portal**. + + ```{image} india/gst-gstr-1-sent.png + :alt: GSTR-1 Sent + ``` + + - If the state of the **GSTR-1** is {guilabel}`Error in Invoice`, invoices can be checked for + errors in the {guilabel}`Log Note`. Once issues have been resolved, the user can click + {guilabel}`Push to GSTN` to submit the file again on the **GST portal**. + + ```{image} india/gst-gstr-1-error.png + :alt: GSTR-1 Error in Invoice + ``` + + ```{image} india/gst-gstr-1-error-log.png + :alt: GSTR-1 Error in Invoice Log + ``` + +6. Click {guilabel}`Mark as Filed` after filing the **GSTR-1** report on the **GST portal**. The + status of the report changes to {guilabel}`Filed` in **Odoo**. + + ```{image} india/gst-gstr-1-filed.png + :alt: GSTR-1 in the Filed Status + ``` + +(india-gstr-2b)= + +#### Receive GSTR-2B + +Users can retrieve the **GSTR-2B Report** from the **GST portal**. This automatically reconciles +the **GSTR-2B** report with your Odoo bills; + +1. Click {guilabel}`Fetch GSTR-2B Summary` to retrieve the **GSTR-2B** summary. After a few seconds, + the status of the report changes to {guilabel}`Waiting for Reception`. This means Odoo is trying + to receive the **GSTR-2B** report from the **GST portal**; + + ```{image} india/gst-gstr-2b-waiting.png + :alt: GSTR-2B in Waiting for Reception + ``` + +2. Once more, after a few seconds, the status of the **GSTR-2B** changes to the {guilabel}`Being + Processed`. It means Odoo is reconciling the **GSTR-2B** report with your Odoo bills; + + ```{image} india/gst-gstr-2b-processed.png + :alt: GSTR-2B in Waiting for Reception + ``` + +3. Once it is done, the status of the **GSTR-2B** report changes to either {guilabel}`Matched` or + {guilabel}`Partially Matched`; + + - If the status is {guilabel}`Matched`: + + > ```{image} india/gst-gstr-2b-matched.png + > :alt: GSTR-2B Matched + > ``` + + - If the status is {guilabel}`Partially Matched`, you can make changes in bills by clicking + {guilabel}`View Reconciled Bills`. Once it is done, click {guilabel}`re-match`. + + > ```{image} india/gst-gstr-2b-partially.png + > :alt: GSTR-2B Partially Matched + > ``` + > + > ```{image} india/gst-gstr-2b-reconcile.png + > :alt: GSTR-2B Reconciled Bills + > ``` + +(india-gstr-3)= + +#### GSTR-3 report + +The {ref}`GSTR-3 ` report is a monthly summary of **sales** and **purchases**. +This return is auto-generated by extracting information from **GSTR-1** and **GSTR-2**. + +1. Users can compare the **GSTR-3** report with the **GSTR-3** report available on the + **GST portal** to verify if they match by clicking {guilabel}`GSTR-3 Report`; + +2. Once the **GSTR-3** report has been verified by the user and the tax amount on the **GST portal** + has been paid. Once paid, the report can be **closed** by clicking {guilabel}`Closing Entry`; + + ```{image} india/gst-gstr-3.png + :alt: GSTR-3 + ``` + +3. In {guilabel}`Closing Entry`, add the tax amount paid on the **GST portal** using challan, and + click {guilabel}`POST` to post the {guilabel}`Closing Entry`; + + ```{image} india/gst-gstr-3-post.png + :alt: GSTR-3 Post Entry + ``` + +4. Once posted, the **GSTR-3** report status changes to {guilabel}`Filed`. + + ```{image} india/gst-gstr-3-filed.png + :alt: GSTR-3 Filed + ``` + +(india-gstr-reports)= + +## Tax reports + +(india-gstr-1-report)= + +### GSTR-1 report + +The {guilabel}`GSTR-1` report is divided into sections. It displays the {guilabel}`Base` amount, +{abbr}`CGST (Central Goods and Services Tax)`, {abbr}`SGST (State Goods and Service Tax)`, +{abbr}`IGST (Integrated Goods and Services Tax)`, and {guilabel}`CESS` for each section. + +> ```{image} india/gst-gstr-1-sale-report.png +> :alt: GSTR-1 Report +> ``` + +(india-gstr-3-report)= + +### GSTR-3 report + +The {guilabel}`GSTR-3` report contains different sections: + +- Details of inward and outward supply subject to a **reverse charge**; + +- Eligible {abbr}`ITC (Income Tax Credit)`; + +- Values of **exempt**, **Nil-rated**, and **non-GST** inward supply; + +- Details of inter-state supplies made to **unregistered** persons. + + > ```{image} india/gst-gstr-3-report.png + > :alt: GSTR-3 Report + > ``` + +### Profit and Loss (IN) report + +This is a {guilabel}`Profit and Loss` report that displays the balances for **Opening Stock** and +**Closing Stock**. It helps users using Continental accounting to accurately determine the cost of +goods (i.e {guilabel}`Opening Stock` + purchases during the period - {guilabel}`Closing Stock`). + +> ```{image} india/profit-and-loss-report.png +> :alt: Profit and Loss report +> ``` + +(india-tds-tcs-threshold)= + +## TDS/TCS threshold alert + +{abbr}`TDS (tax deducted at source)` and {abbr}`TCS (tax collected at source)` are tax provisions +under Indian law, triggered when transaction amounts exceed specified thresholds. This alert +notifies users when the value of invoices or bills surpasses these limits, prompting the application +of the appropriate TDS/TCS. + +To configure Odoo to advise you on when to apply TDS/TCS, set the {guilabel}`TDS/TCS section` +field on the corresponding account in the chart of accounts. Odoo will display a banner suggesting +the TDS/TCS section under which tax might be applicable when recording an invoice or bill. + +### Configuration + +1. Navigate to {menuselection}`Accounting --> Configuration --> Settings`. +2. In the {guilabel}`Indian Integration` section, enable the {guilabel}`TDS and TCS` feature. +3. Navigate to {menuselection}`Accounting --> Configuration --> Chart of Accounts`. +4. Click {guilabel}`View` on the desired account, and set the {guilabel}`TDS/TCS Section` field. + +:::{note} +The TDS/TCS sections are pre-configured with threshold limits. If you need to modify these +limits, go to {menuselection}`Accounting --> Configuration --> Taxes`. In the {guilabel}`Advanced +Options` tab, click on the {icon}`fa-arrow-right` {guilabel}`(internal link)` icon of the +{guilabel}`Section` field. + +```{image} india/tds-tcs-section-modify.png +:alt: TDS/TCS section modify +``` +::: + +### Applying TCS/TDS on invoices and bills + +Based on the account used on the customer invoice or vendor bill, Odoo checks the TCS/TDS threshold +limit. If the limit specified in the {guilabel}`TCS/TDS Section` of the account is exceeded, Odoo +displays an alert that suggests applying the appropriate TCS/TDS. The alert will disappear once the +TCS/TDS is applied. + +```{image} india/tcs-warning.png +:alt: TCS advice +``` + +**TCS** is directly applicable in the tax on the invoice lines. To apply **TDS**, click the +{guilabel}`TDS Entry` smart button on the vendor bill/payment. The popup window allows specifying +the TDS details. Confirm the entry to apply the TDS. + +```{image} india/tds-apply.png +:alt: TDS application +``` + +In Odoo, the aggregate total is calculated for partners sharing the same PAN number, across all +company branches. + +```{eval-rst} +.. example:: + + .. list-table:: + :header-rows: 1 + :widths: 10 20 10 20 15 + + * - **Branch** + - **Customer** + - **Invoice** + - **Transaction Amount (₹)** + - **PAN Number** + * - IN - MH + - XYZ Enterprise - GJ + - Invoice 1 + - ₹50,000 + - ABCPX1234E + * - IN - MH + - XYZ Enterprise - GJ + - Invoice 2 + - ₹30,000 + - ABCPX1234E + * - IN - MH + - XYZ Enterprise - MH + - Invoice 3 + - ₹40,000 + - ABCPX1234E + * - IN - DL + - XYZ Enterprise - GJ + - Invoice 4 + - ₹20,000 + - ABCPX1234E + * - IN - GJ + - XYZ Enterprise - MH + - Invoice 5 + - ₹60,000 + - ABCPX1234E + + - **Aggregate total** = 50,000 + 30,000 + 40,000 + 20,000 + 60,000 = ₹200,000 + - The aggregate total for all customers (XYZ Enterprise - GJ, MH, DL) sharing the PAN number + ABCPX1234E across all branches is ₹200,000. +``` + diff --git a/content/applications/finance/fiscal_localizations/indonesia.md b/content/applications/finance/fiscal_localizations/indonesia.md new file mode 100644 index 000000000..2c3082403 --- /dev/null +++ b/content/applications/finance/fiscal_localizations/indonesia.md @@ -0,0 +1,186 @@ +# Indonesia + +(localization-indonesia-e-faktur)= + +## E-Faktur Module + +The **E-Faktur Module** is installed by default with the Indonesian localization module. It allows +one to generate a CSV file for one tax invoice or for a batch of tax invoices to upload to the +**Tax Office e-Faktur** application. + +(localization-indonesia-npwp-nik)= + +### NPWP/NIK settings + +- **Your Company** + This information is used in the FAPR line in the effect file format. You need to set a VAT + number on the related partner of your Odoo company. If you don't, it won't be possible to create + an e-Faktur from an invoice. +- **Your Clients** + You need to set the checkbox + *ID PKP* + to generate e-fakturs for a customer. You can use the VAT + field on the customer's contact to set the NPWP needed to generate the e-Faktur file. If your + customer does not have an NPWP, just enter the NIK in the same VAT field. + ```{image} indonesia/indonesia-partner-nik.png + :align: center + ``` + +(localization-indonesia-e-faktur-usage)= + +### Usage + +(localization-indonesia-tax-invoice-sn)= + +#### Generate Tax Invoice Serial Number + +1. Go to {menuselection}`Accounting --> Customers --> e-Faktur`. In order to be able to export + customer invoices as e-Faktur for the Indonesian government, you need to put here the ranges of + numbers you were assigned by the government. When you validate an invoice, a number will be + assigned based on these ranges. Afterwards, you can filter the invoices still to export in the + invoices list and click on *Action*, then on *Download e-Faktur*. + +2. After receiving new serial numbers from the Indonesian Revenue Department, you can create a set + of tax invoice serial numbers group through this list view. You only have to specify the Min and + Max of each serial numbers' group and Odoo will format the number automatically to a 13-digits + number, as requested by the Indonesia Tax Revenue Department. + +3. There is a counter to inform you how many unused numbers are left in that group. + + ```{image} indonesia/indonesia-sn-count.png + :align: center + ``` + +(localization-indonesia-csv)= + +#### Generate e-faktur csv for a single invoice or a batch invoices + +1. Create an invoice from {menuselection}`Accounting --> Customers --> Invoices`. If the invoice + customer's country is Indonesia and the customer is set as *ID PKP*, Odoo will allow you to + create an e-Faktur. + +2. Set a Kode Transaksi for the e-Faktur. There are constraints related to the Kode transaksi and + the type of VAT applied to invoice lines. + + ```{image} indonesia/indonesia-kode-transaksi.png + :align: center + ``` + +3. Odoo will automatically pick the next available serial number from the e-Faktur number table (see + the {ref}`section above `) and generate the e-faktur + number as a concatenation of Kode Transaksi and serial number. You can see this from the invoice + form view under the page *Extra Info* in the box *Electronic Tax*. + + ```{image} indonesia/indonesia-e-faktur-sn.png + :align: center + ``` + +4. Once the invoice is posted, you can generate and download the e-Faktur from the *Action* menu + item *Download e-faktur*. The checkbox *CSV created* will be set. + + ```{image} indonesia/indonesia-csv-created.png + :align: center + ``` + +5. You can select multiple invoices in list view and generate a batch e-Faktur .csv. + +(localization-indonesia-kode-transaksi-fp)= + +#### Kode Transaksi FP (Transaction Code) + +The following codes are available when generating an e-Faktur. +\- 01 Kepada Pihak yang Bukan Pemungut PPN (Customer Biasa) +\- 02 Kepada Pemungut Bendaharawan (Dinas Kepemerintahan) +\- 03 Kepada Pemungut Selain Bendaharawan (BUMN) +\- 04 DPP Nilai Lain (PPN 1%) +\- 06 Penyerahan Lainnya (Turis Asing) +\- 07 Penyerahan yang PPN-nya Tidak Dipungut (Kawasan Ekonomi Khusus/ Batam) +\- 08 Penyerahan yang PPN-nya Dibebaskan (Impor Barang Tertentu) +\- 09 Penyerahan Aktiva (Pasal 16D UU PPN) + +(localization-indonesia-replace-invoice)= + +#### Correct an invoice that has been posted and downloaded: Replace Invoice feature + +1. Cancel the original wrong invoice in Odoo. For instance, we will change the Kode Transakski from + 01 to 03 for the INV/2020/0001. +2. Create a new invoice and set the cancelled invoice in the *Replace Invoice* field. In this field, + we can only select invoices in *Cancel* state from the same customer. +3. As you validate, Odoo will automatically use the same e-Faktur serial number as the cancelled and + replaced invoice replacing the third digit of the original serial number with *1* (as requested + to upload a replacement invoice in the e-Faktur app). + +```{image} indonesia/indonesia-replace-invoice.png +:align: center +``` + +(localization-indonesia-reset-e-faktur)= + +#### Correct an invoice that has been posted but not downloaded yet: Reset e-Faktur + +1. Reset the invoice to draft and cancel it. +2. Click on the button *Reset e-Faktur* on the invoice form view. +3. The serial number will be unassigned, and we will be able to reset the invoice to draft, edit it + and re-assign a new serial number. + +```{image} indonesia/indonesia-e-faktur-reset.png +:align: center +``` + +(localization-indonesia-qris-qr)= + +## QRIS QR code on invoices + +[QRIS](https://qris.online/homepage/) is a digital payment system that allows customers to make +payments by scanning the QR code from their preferred e-wallet. + +:::{important} +According to the [QRIS API documentation](https://qris.online/api-doc/create-invoice.php), +QRIS expires after 30 minutes. Due to this restriction, the QR code is not included in reports +sent to customers and is only available on the customer portal. +::: + +### Activate QR codes + +Go to {menuselection}`Accounting --> Configuration --> Settings`. Under the {guilabel}`Customer +Payments` section, activate the {guilabel}`QR Codes` feature. + +### QRIS bank account configuration + +Go to {menuselection}`Contacts --> Configuration --> Bank Accounts` and select the bank account for +which you want to activate QRIS. Set the {guilabel}`QRIS API Key` and {guilabel}`QRIS Merchant ID` +based on the information provided by QRIS. + +:::{important} +The account holder's country must be set to `Indonesia` on its contact form. +::: + +```{image} indonesia/qris-setup.png +:alt: QRIS bank account configuration +``` + +:::{seealso} +{doc}`../accounting/bank` +::: + +### Bank journal configuration + +Go to {menuselection}`Accounting --> Configuration --> Journals`, open the bank journal, then fill +out the {guilabel}`Account Number` and {guilabel}`Bank` under the {guilabel}`Journal Entries` tab. + +```{image} indonesia/journal-bank-config.png +:alt: Bank journal configuration +``` + +### Issue invoices with QRIS QR codes + +When creating a new invoice, open the {guilabel}`Other Info` tab and set the {guilabel}`Payment +QR-code` option to `QRIS`. + +```{image} indonesia/invoice-qris.png +:alt: Select QRIS QR-code option +``` + +Ensure that the {guilabel}`Recipient Bank` is the one you configured, as Odoo uses this field to +generate the QRIS QR code. + diff --git a/content/applications/finance/fiscal_localizations/italy.md b/content/applications/finance/fiscal_localizations/italy.md new file mode 100644 index 000000000..6666eb5fb --- /dev/null +++ b/content/applications/finance/fiscal_localizations/italy.md @@ -0,0 +1,775 @@ +# Italy + +(italy-modules)= + +## Configuration + +{ref}`Install ` the following modules to get all the features of the Italian +localization: + +```{eval-rst} +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - Name + - Technical name + - Description + * - Italy - Accounting + - `l10n_it` + - Default :ref:`fiscal localization package ` + * - Italy - E-invoicing + - `l10n_it_edi` + - E-invoice implementation + * - Italy - E-invoicing (Withholding) + - `l10n_it_edi_withholding` + - E-invoice withholding + * - Italy - Accounting Reports + - `l10n_it_reports` + - Country-specific reports + * - Italy - Stock DDT + - `l10n_it_stock_ddt` + - Transport documents - Documento di Trasporto (DDT) +``` + +:::{seealso} +{doc}`Documentation on e-invoicing’s legality and compliance in Italy +<../accounting/customer_invoices/electronic_invoicing/italy>` +::: + +### Company information + +Configuring the company's information ensures your Accounting database is properly set up. To add +information, go to {menuselection}`Settings --> General Settings`, and in the {guilabel}`Companies` +section, click {guilabel}`Update info`. From here, fill out the fields: + +- {guilabel}`Address`: the address of the company; +- {guilabel}`VAT`: VAT of the company; +- {guilabel}`Codice Fiscale`: the fiscal code of the company; +- {guilabel}`Tax System`: the tax system under which the company falls; + +```{image} italy/company.png +:alt: Company information to be provided +``` + +### Taxes configuration + +Many of the e-invoicing features are implemented using Odoo's tax system. As such, taxes must be +properly configured to generate invoices correctly and handle other billing use cases. + +The **Italian** localization contains predefined **examples** of taxes for various purposes. + +(italy-tax-exemption)= + +#### Tax exemption + +The use of sale taxes that amount to **zero percent** (0%) is required by Italian authorities to +keep track of the exact {guilabel}`Tax Exemption Kind (Natura)` and {guilabel}`Law Reference` that +justify the exemption operated on an invoice line. + +```{eval-rst} +.. example:: + The export tax in the EU can be used as reference (`0% EU`, invoice label `00eu`). It can be + found under :menuselection:`Accounting --> Configuration --> Taxes`. Exports are exempt from VAT, + and therefore, they require :guilabel:`Exoneration` kind and :guilabel:`Law Reference` filled in. +``` + +```{image} italy/tax-exemption.png +:alt: Tax Exemption Settings +``` + +:::{seealso} +There are many {guilabel}`Tax Exemption Kind (Natura)` and {guilabel}`Law Reference` codes. Make +sure you check the latest version available to get the latest information on: + +- [Italian authorities documentation](https://www.agenziaentrate.gov.it/portale/web/guest/aree-tematiche/fatturazione-elettronica) +- [Official guide on Tax exemption](https://www.agenziaentrate.gov.it/portale/documents/20143/451259/Guida_compilazione-FE-Esterometro-V_1.9_2024-03-05.pdf/67fe4c2d-1174-e8de-f1ee-cea77b7f5203) +::: + +:::{note} +If you need to use a different kind of exoneration, go to {menuselection}`Accounting --> +Configuration --> Taxes`, select a similar tax, then click on the cog icon and select +{guilabel}`Duplicate`. In the {guilabel}`Advanced Options` tab, add the {guilabel}`Exoneration` +and {guilabel}`Law Reference`. To confirm click on {guilabel}`Save`. +::: + +:::{tip} +**Rename** your taxes in the {guilabel}`Name` field according to their {guilabel}`Exoneration` to +differentiate them easily. +::: + +(italy-reverse-charge)= + +## Reverse charge + +The **reverse charge** mechanism is a VAT rule that shifts the liability to pay VAT from the +supplier to the customer. The customers pay the VAT *themselves* to the {abbr}`AdE (Agenzia delle +Entrate)` instead. There are different types: + +- {guilabel}`Internal Reverse Charge` + (for domestic sales) + The VAT responsibility is shifted to the buyer for certain categories of products and services. +- {guilabel}`External Reverse Charge` + (for intra-EU sales) + VAT is due in the country of the delivery or in the country where the service is performed. When + the buyer is itself an Italian business, then the EU offers a mechanism that allows the seller + to transfer his responsibility to the buyer. + +### Invoices + +**Reverse-charged** customer invoices show no VAT amount, but the {abbr}`AdE (Agenzia delle +Entrate)` requires the seller to specify the {guilabel}`Tax Exemption` reason and the {guilabel}`Law +Reference` that enable the reverse-charge mechanism. Odoo provides a set of special 0% taxes that +can be assigned to each reverse-charged invoice lines, representing the most commonly used +configurations. + +### Vendor bills + +Italian companies subjected to Reverse Charge must send the information in the bill received to the +{abbr}`AdE (Agenzia delle Entrate)`. + +:::{note} +Self-reported VAT XML files must be issued and sent to the {abbr}`AdE (Agenzia Delle Entrate)` +for reverse charged bills. +::: + +When creating a vendor bill, **reverse charge** taxes are available to be added in the +{guilabel}`Taxes` field. You can check which taxes are available by going to +{menuselection}`Accounting --> Configuration --> Taxes`, you can see that the 10% Goods and 22% +Services taxes are activated, among others. Due to the automated configuration of the Italian fiscal +position, these are automatically activated in the tax list. + +(italy-grids)= + +### Tax grids + +The Italian localization has a specific {ref}`tax grid ` section for +**reverse charge** taxes. These tax grids are identifiable by the {ref}`VJ ` tag, and +can be found by going to {menuselection}`Accounting --> Reporting --> Audit Reports: Tax Report`. + +```{image} italy/grids.png +:alt: Reverse charge tax grid from the VJ section of the Tax Declaration +``` + +(italy-e-invoicing)= + +## E-invoicing + +The {abbr}`SdI (Sistema di Interscambio)` is the {doc}`electronic invoicing +<../accounting/customer_invoices/electronic_invoicing>` system used in Italy. It enables the sending +and receiving of electronic invoices to and from customers. The documents must be in an XML +{abbr}`EDI (Electronic Data Interchange)` format called **FatturaPA** and formally validated by the +system before being delivered. + +To be able to receive invoices and notifications, the {abbr}`SdI (Sistema di Interscambio)` service +must be notified that the user's files need to be sent to Odoo and processed on their behalf. To do +so, you must set up Odoo's {guilabel}`Destination Code` on the {abbr}`AdE (Agenzia Delle +Entrate)` portal. + +1. Go to [Italian authorities portal](https://ivaservizi.agenziaentrate.gov.it/portale) and + authenticate; +2. Go to section {menuselection}`Fatture e Corrispettivi`; +3. Set the user as Legal Party for the VAT number you wish to configure the electronic address; +4. In {menuselection}`Servizi Disponibili --> Fatturazione Elettronica --> Registrazione + dell’indirizzo telematico dove ricevere tutte le fatture elettroniche`, insert Odoo's + {guilabel}`Destination Code` `K95IV18`, and confirm. + +### EDI Mode and authorization + +Since the files are transmitted through Odoo's server before being sent to the {abbr}`SdI (Sistema +di Interscambio)` or received by your database, you need to authorize Odoo to process your files +from your database. To do so, go to {menuselection}`Accounting --> Configuration --> Settings --> +Electronic Document Invoicing`. + +There are three modes available: + +- {guilabel}`Demo` + This mode simulates an environment in which invoices are sent to the government. In this mode, + invoices need to be + *manually* + downloaded as XML files and uploaded to the + {abbr}`AdE + (Agenzia delle Entrate)` + 's website. +- {guilabel}`Test (experimental)` + This mode sends invoices to a non-production (i.e., test) service made available by the + + {abbr}`AdE (Agenzia delle Entrate)` + . Saving this change directs all companies on the database to + use this configuration. +- {guilabel}`Official` + This is a production mode that sends your invoices directly to the + {abbr}`AdE (Agenzia delle + Entrate)` + . + +Once a mode is selected, you need to accept the **terms and conditions** by ticking {guilabel}`Allow +Odoo to process invoices`, and then {guilabel}`Save`. You can now record your transactions in Odoo +Accounting. + +:::{warning} +Selecting either {guilabel}`Test (experimental)` or {guilabel}`Official` is **irreversible**. +For example, once in {guilabel}`Official` mode, it is not possible to select {guilabel}`Test +(experimental)` or {guilabel}`Demo`. We recommend creating a **separate database** for testing +purposes only. +::: + +:::{note} +When in {guilabel}`Test (Experimental)` mode, all invoices sent *must* have a partner using one +of the following fake {guilabel}`Destination Code` given by the {abbr}`AdE (Agenzia Delle +Entrate)`: `0803HR0` - `N8MIMM9` - `X9XX79Z`. Any real production {guilabel}`Codice Destinario` +of your customers will not be recognized as valid by the test service. +::: + +```{image} italy/edi.png +:alt: Electronic document invoicing settings +``` + +(italy-e-invoicing-process)= + +### Process + +The submission of invoices to the {abbr}`SdI (Sistema di Interscambio)` for Italy is an electronic +process used for the mandatory transmission of tax documents in XML format between companies and the +{abbr}`AdE (Agenzia delle Entrate)` to reduce errors and verify the correctness of operations. + +:::{note} +You can check the current status of an invoice by the {guilabel}`SdI State` field. The XML file +is attached to the invoice. +::: + +```{image} italy/edi-process.png +:alt: EDI system architecture +``` + +#### XML Documents creation + +Odoo generates the required XML files as attachments to invoices in the `FatturaPA` format required +by the {abbr}`AdE (Agenzia delle Entrate)`. Once the invoices needed are selected, go to +{guilabel}`Action` and click on {guilabel}`Send and Print`. + +```{image} italy/edi-menu.png +:alt: Send and Print menu +``` + +When the pop-up window opens there is a selection of actions that can be taken. {guilabel}`Generate +XML File` generates the attachments. + +```{image} italy/edi-send-and-print.png +:alt: Send and Print dialog +``` + +The XML file as well as the PDF once can be found attached to the invoice. + +```{image} italy/edi-attachments.png +:alt: EDI Attachments +``` + +#### Submission to SDI + +The {guilabel}`Send to Tax Agency` option in the {guilabel}`Send and Print` dialog sends the +attachment to the {guilabel}`Proxy Server`, which gathers all requests and then forwards them via a +WebServices channel to the {abbr}`SdI (Sistema di Interscambio)`. Check the sending status of the +invoice through the {guilabel}`Check Sending` button at the top of the invoice's view. + +#### Processing by SDI + +The {abbr}`SdI (Sistema di Interscambio)` receives the document and verifies for any errors. At this +stage, the invoice is in the {guilabel}`SdI Processing` state, as shown on the invoice. The invoice +also gets assigned a {guilabel}`FatturaPA Transaction` number that is shown in the +{guilabel}`Electronic Invoicing` tab. The checks may take variable time, ranging from a few seconds +up to a day, depending on the queue of invoices sent throughout Italy. + +```{image} italy/edi-processing.png +:alt: Check Sending button and Sdi Processing state +``` + +#### Acceptance + +If the document is valid, it is recorded and considered fiscally valid by the {abbr}`AdE (Agenzia +delle Entrate)`, which will proceed with archiving in {guilabel}`Substitute Storage (Conservazione +Sostitutiva)` if explicitly requested on the Agency's portal. + +:::{warning} +Odoo does not offer the [Conservazione Sostitutiva](https://www.agid.gov.it/index.php/it/piattaforme/conservazione) requirements. Other providers +and {abbr}`AdE (Agenzia delle Entrate)` supply free and certified storage to meet the +specifications requested by law. +::: + +The {abbr}`SdI (Sistema di Interscambio)` {guilabel}`Destination Code` attempts to forward the +invoice to the customer at the provided address, whether it is a `PEC` email address or a +{abbr}`SdI (Sistema di Interscambio)` {guilabel}`Destination Code` for their ERP's WebServices +channels. A maximum of 6 attempts are made every 12 hours, so even if unsuccessful, this process can +take up to three days. The invoice status is {guilabel}`Accepted by SDI, Forwarding to Partner`. + +#### Possible Rejection + +The {abbr}`SdI (Sistema di Interscambio)` may find inaccuracies in the compilation, possibly even +formal ones. In this case, the invoice is in the {guilabel}`SDI Rejected` state. The {abbr}`SdI +(Sistema di Interscambio)`'s observations are inserted at the top of the Invoice tab. To resolve the +issue, it is sufficient to delete the attachments of the invoice, return the invoice to +{guilabel}`Draft`, and fix the errors. Once the invoice is ready, it can be resent. + +:::{note} +To regenerate the XML, both the XML attachment and the PDF report must be deleted, so that they +are then regenerated together. This ensures that both always contain the same data. +::: + +```{image} italy/edi-rejected.png +:alt: EDI Rejected State +``` + +#### Forwarding Completed + +The invoice has been delivered to the customer; however, you can still send a copy to the customer +in PDF via email or post. Its status is {guilabel}`Accepted by SDI, Delivered to Partner`. + +If the {abbr}`SdI (Sistema di Interscambio)` cannot contact your customer, they may not be +registered on the {abbr}`AdE (Agenzia delle Entrate)` portal. In this case, just make sure to send +the invoice in PDF via email or by mail. The invoice is then in the {guilabel}`Accepted by SDI, +Partner Delivery Failed` state. + +### Tax Integration + +When you receive a vendor bill, either from {abbr}`SdI (Sistema di Interscambio)`, from paper or +from an imported XML file, the Tax Agency might request that you send some tax information +integration back to the {abbr}`SdI (Sistema di Interscambio)`. It happens when a transaction that +was tax exempt becomes taxable for any reason. + +```{eval-rst} +.. example:: + Here is a non-exhaustive list: + + - | :ref:`italy/reverse-charge` + | As a buyer, you have to pay taxes on what you buy and integrate tax information. + :guilabel:`Reverse Charge` taxes. + - | :ref:`italy/split-payment` + | As a :abbr:`PA (Public Administration)` business buyer, you have to pay taxes and integrate + tax information. Be sure that you replace the :guilabel:`0% Sale Taxes` on the vendor bill + you received with the correct :guilabel:`Split Payment` taxes. + - | :guilabel:`Self Consumption` + | When, as a business owner, you use an asset that you bought for business for personal reasons + instead, you have to pay those taxes you originally deducted as a business cost for it. +``` + +Odoo may detect that your vendor bill can be interpreted as a document of a type that needs tax +integration, as detailed in the {ref}`italy/document-types` section. + +:::{important} +Be sure that you replace the {guilabel}`0% Sale Taxes` on the vendor bill you received with the +ones you're supposed to pay to the {abbr}`AdE (Agenzia delle Entrate)`. A button then appears on +the top of the single vendor bill form to send them. + +When clicking on the {guilabel}`Send Tax Integration` button, an XML file of the appropriate +{guilabel}`Document Type` is generated, attached to the bill, and sent as for invoices. + +```{image} italy/edi-tax-integration-button.png +:alt: EDI Send Tax Integration button +``` +::: + +(italy-document-types)= + +### Document Types + +The {abbr}`SdI (Sistema di Interscambio)` requires businesses to send customer invoices and other +documents through the {abbr}`EDI (Electronic Data Interchange)`. + +The following {guilabel}`Document Type` codes all technically identify different business use cases. + +#### TD01 - Invoices + +This represents the standard **domestic** scenario for all invoices exchanged through the {abbr}`SdI +(Sistema di Interscambio)`. Any invoice that doesn't fall into one of the specific special cases +is categorized as a regular invoice, identified by the {guilabel}`Document Type` `TD01`. + +#### TD02 - Down payments + +**Down payment** invoices are imported/exported with a different {guilabel}`Document Type` code +`TDO2` than regular invoices. Upon import of the invoice, a regular vendor bill is created. + +Odoo exports transactions as `TD02` if the following conditions are met: + +1. It is an invoice; +2. All invoice lines are related to down payment sales order lines. + +#### TD04 - Credit notes + +It is the standard scenario for all **credit notes** issued to **domestic** clients, when we need to +formally acknowledge that the seller is reducing or cancelling a previously issued invoice, for +example, in case of overbilling, incorrect items, or overpayment. Just like invoices, they must be +sent to the {abbr}`SdI (Sistema di Interscambio)`, their {guilabel}`Document Type` `TD04` + +#### TD07, TD08, TD09 - Simplified Invoicing + +Simplified invoices (`TD07`), credit notes (`TD08`), and debit notes (`TD09`) can be used to certify +domestic transactions under 400 EUR (VAT included). Its status is the same as that of a regular +invoice, but with fewer information requirements. + +For a simplified invoice to be established, it must include: + +1. {guilabel}`Customer Invoice` reference: **unique** numbering sequence with **no gaps**; +2. {guilabel}`Invoice Date`: issue **date** of the invoice; +3. {guilabel}`Company Info`: the **seller**'s full credentials (VAT/TIN number, name, full address) + under {menuselection}`General Settings --> Companies (section)`; +4. {guilabel}`VAT`: the **buyer**'s VAT/TIN number (on the partner form); +5. {guilabel}`Total`: the total **amount** (VAT included) of the invoice. + +In the {abbr}`EDI (Electronic Data Interchange)`, Odoo exports invoices as simplified if: + +1. It is a domestic transaction (i.e., the partner is from Italy); +2. Your company's **required fields** ({guilabel}`VAT Number` or {guilabel}`Codice Fiscale`, + {guilabel}`Fiscal Regime`, and full **address**) are provided; +3. The partner's address is not fully specified (i.e., it misses the City or the ZipCode); +4. The total amount of VAT included is **less** than **400 EUR**. + +:::{note} +The 400 EUR threshold was defined in [the decree of the 10th of May 2019 in the Gazzetta +Ufficiale](https://www.gazzettaufficiale.it/eli/id/2019/05/24/19A03271/sg). We advise you to +check the current official value. +::: + +#### TD16 - Internal Reverse Charge + +Internal reverse charge transactions (see {ref}`italy/tax-exemption` and +{ref}`italy/reverse-charge`) are exported as `TD16` if the following conditions are met: + +- It is a vendor bill; +- It has at least **one tax** on the invoice lines that targets one of these {ref}`tax grids + `: `VJ6`, `VJ7`, `VJ8`, `VJ12`, `VJ13`, `VJ14`, `VJ15`, `VJ16`, `VJ17` + +#### TD17 - Buying services from abroad + +When buying **services** from **EU** and **non-EU** countries, the foreign *seller* invoices a +service with a **VAT-excluded** price, as it is not taxable in Italy. The VAT is paid by the *buyer* +in Italy. + +- Within the EU: the *buyer* integrates the invoice received with the **VAT information** due in + Italy (i.e., **vendor bill tax integration**); +- Non-EU: the *buyer* sends themselves an invoice (i.e., **self-billing**). + +Odoo exports a transaction as `TD17` if the following conditions are met: + +- It is a vendor bill; +- It has at least **one tax** on the invoice lines that targets the tax grid {ref}`VJ3 + `; +- All invoice lines either have {guilabel}`Services` as **products**, or a tax with the + {guilabel}`Services` as **tax scope**. + +#### TD18 - Buying goods from EU + +Invoices issued within the EU follow a **standard format**, therefore only an integration of the +existing invoice is required. + +Odoo exports a transaction as `TD18` if the following conditions are met: + +- It is a vendor bill; +- The **partner** is from an **EU** country; +- It has at least one tax on the invoice lines that targets the tax grid {ref}`VJ9 `; +- All invoice lines either have {guilabel}`Consumable` as **products**, or a tax with + {guilabel}`Goods` as **tax scope**. + +#### TD19 - Buying goods from VAT deposit + +Buying **goods** from a **foreign** vendor, but the **goods** are already in **Italy** in a **VAT +deposit**. + +- From the EU: the *buyer* integrates the invoice received with the **VAT information** due in + Italy (i.e., **vendor bill tax integration**); +- Non-EU: the *buyer* sends an invoice to *themselves* (i.e., **self-billing**). + +Odoo exports a transaction as a `TD19` if the following conditions are met: + +- It is a vendor bill; +- It has at least one tax on the invoice lines that targets the tax grid {ref}`VJ3 `; +- All invoice lines either have {guilabel}`Consumables` as products, or a tax with + {guilabel}`Goods` as **tax scope**. + +#### TD24 - Deferred invoices + +The **deferred invoice** is an invoice that is **issued at a later time** than the sale of goods or +the provision of services. A **deferred invoice** has to be issued at the latest within the **15th +day** of the month following the delivery covered by the document. + +It usually is a **summary invoice** containing a list of multiple sales of goods or services carried +out in the month. The business is allowed to **group** the sales into **one invoice**, generally +issued at the **end of the month** for accounting purposes. Deferred invoices are default for +**wholesalers** having recurrent clients. + +If the goods are transported by a **carrier**, every delivery has an associated **Documento di +Transporto (DDT)**, or **Transport Document**. The deferred invoice **must** indicate the details of +all the **DDTs** information for better tracing. + +:::{note} +E-invoicing of deferred invoices requires the `l10n_it_stock_ddt` {ref}`module `. +In this case, a dedicated {guilabel}`Document Type` `TD24` is used in the e-invoice. +::: + +Odoo exports transactions as `TD24` if the following conditions are met: + +1. It is an invoice; +2. It is associated with deliveries whose **DDTs** have a **different** date than the issue date of + the invoice. + +#### TD28 - San Marino + +##### Invoices + +San Marino and Italy have special agreements on e-invoicing operations. As such, **invoices** follow +the regular **reverse charge** rules. You can use the proper {guilabel}`Document Type` depending on +the invoice type: `TD01`, `TD04`, `TD05`, `TD24`, `TD25`. Additional requirements are not enforced +by Odoo. However, the user is requested by the **State** to: + +- Select a tax with the {guilabel}`Tax Exemption Kind` set to `N3.3`; +- Use the generic {abbr}`SdI (Sistema di Interscambio)` {guilabel}`Destination Code` `2R4GTO8`. + +The invoice is then routed by a dedicated office in San Marino to the correct business. + +##### Vendor Bills + +When a **paper bill** is received from San Marino, any Italian company **must** submit that invoice +to the {abbr}`AdE (Agenzia delle Entrate)` by indicating the e-invoice's {guilabel}`Document Type` +field with the special value `TD28`. + +Odoo exports a transaction as `TD28` if the following conditions are met: + +1. It is a vendor bill; +2. It has at least one tax on the invoice lines that targets the tax grids {ref}`VJ `; +3. The **country** of the partner is **San Marino**. + +## Public Administration Businesses (B2G) + +{abbr}`PA (Public Administration)` businesses are subjected to more control than private businesses +as they handle public money coming from taxpayers. The {abbr}`EDI (Electronic Data Interchange)` +process adds some steps to the {ref}`regular one `, as {abbr}`PA (Public +Administration)` businesses can **accept** or **refuse** invoices. + +:::{note} +{abbr}`PA (Public Administration)` businesses have a 6-digit long {guilabel}`Destination Code`, +also called {abbr}`CUU (Codice Univoco Ufficio)`, that is **mandatory**, **PEC** address cannot +be used in this case. +::: + +:::{seealso} +[Complete list of businesses that belong to the Public Administration along with their +Destination Code](https://www.agenziaentrate.gov.it/portale/web/guest/aree-tematiche/fatturazione-elettronica) +::: + +### CIG, CUP, DatiOrdineAcquisto + +To ensure the effective traceability of payments by public administrations, electronic invoices +issued to public administrations must contain: + +- The {abbr}`CIG (Codice Identificativo Gara)`, except in cases of exclusion from traceability + obligations provided by law n. 136 of August 13, 2010; +- The {abbr}`CUP (Codice Unico di Progetto)`, in case of invoices related to public works. + +If the XML file requires it, the {abbr}`AdE (Agenzia Delle Entrate)` can *only* proceed payments of +electronic invoices when the XML file contains a {abbr}`CIG (Codice Identificativo Gara)` and +{abbr}`CUP (Codice Unico di Progetto)`. + +:::{note} +The {abbr}`CUP (Codice Unico di Progetto)` and the {abbr}`CIG (Codice Identificativo Gara)` must +be included in one of the `DatiOrdineAcquisto`, `DatiContratto`, `DatiConvenzione`, +`DateRicezione`, or `DatiFattureCollegate` XML tags. + +These correspond to the elements named {guilabel}`CodiceCUP` and {guilabel}`CodiceCIG` of the +electronic invoice XML file, whose table can be found on the government [website](http://www.fatturapa.gov.it/). +::: + +(italy-split-payment)= + +### Split Payment + +The {guilabel}`Split Payment` mechanism behaves much like {ref}`italy/reverse-charge`. + +```{eval-rst} +.. example:: + When an Italian company bills a :abbr:`PA (Public Administration)` business - for example, + cleaning services for a public building - the :abbr:`PA (Public Administration)` business + self-reports the VAT to the Tax Agency themselves, and the vendor just has to select the + appropriate tax with the right :guilabel:`Tax Exemption` for their invoice lines. +``` + +The specific {guilabel}`Scissione dei Pagamenti` fiscal position is available to deal with partners +belonging to the {abbr}`PA (Public Administration)`. + +### 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: + +- a **smart card**; +- a **USB token**; +- an {abbr}`HSM (Hardware Security Module)`. + +:::{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. +::: + +#### 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 +once it is accepted by the {abbr}`SdI (Sistema di Interscambio)`. You then have to issue a credit +note to compensate and send it to the {abbr}`SdI (Sistema di Interscambio)`. + +#### Expired Terms + +If the {abbr}`PA (Public Administration)` business doesn't reply within 15 days, you need to contact +the {abbr}`PA (Public Administration)` business directly, sending them both the invoice and the +received deadline notification by email. You can make an arrangement with them and manually set the +correct {guilabel}`SdI State` on your invoice. + +## Point of Sale fiscal printers + +Fiscal regulations mandate using certified RT devices, such as RT printers or RT servers, to ensure +compliant sales receipts and secure communication with the Tax Authority. These devices +automatically transmit fiscal data daily. RT printers, designed for individual POS terminals, handle +transactions, print receipts, and report to the authorities, ensuring data integrity and compliance. + +### Simulation mode + +:::{warning} +Since the simulation mode sends data to the authorities, it should only be enabled at the very +start of the printer's configuration process. Once the printer is switched to the production +mode, it cannot be reverted to the simulation mode. +::: + +To test the fiscal printer setup with Odoo, configure the fiscal printer in the simulation mode +as follows: + +1. Make sure the fiscal printer is set to its default state: printer on, start-up cycle complete, + and no transaction in progress. +2. Type `3333`. +3. Press {guilabel}`Chiave`. The screen displays {guilabel}`Scelta Funzione`. +4. Type `14`. The screen displays {guilabel}`Apprendimento`. +5. Type `62`. The screen displays {guilabel}`Simulazione`. +6. To turn the {guilabel}`no` into a {guilabel}`si`, press {guilabel}`X`. +7. To confirm, press {guilabel}`Contante`. +8. Press {guilabel}`Chiave`. + +To configure the printer for production, repeat the steps above. + +:::{note} +To test the printer configuration, the physical device must first be obtained and registered with +the relevant authorities. +::: + +### Setting up the printer to work with Odoo + +Fiscal printers are meant to work only in the local network. This means the printer and the +device running {doc}`Odoo Point of Sale ` must be connected to +the same network. + +Fiscal printers are typically configured to use HTTP by default. To ensure compatibility with Odoo, +the settings must be updated to enable HTTPS support on the printer. This can be done using either +the EpsonFPWizard configuration software or the keyboard connected to the printer. + +To set up the fiscal printer using the keyboard, follow these steps: + +1. Make sure the fiscal printer is set to its default state: printer on, start-up cycle complete, + and no transaction in progress. +2. Type `3333`. +3. Press {guilabel}`Chiave`. The screen displays {guilabel}`Scleta Funzione`. +4. Type `34`. The screen displays {guilabel}`Web Server`. +5. Press {guilabel}`Contante` 3 times until the screen displays {guilabel}`Web Server: SSL`. +6. To turn the value `0` into a `1`, press {guilabel}`X`. +7. To confirm, press {guilabel}`Contante` 3 times. +8. Press {guilabel}`Chiave`. + +Then, log in to the printer with the device that runs {doc}`Odoo Point of Sale +` so it recognizes the printer's certificate. + +To approve and install the printer's certificate, follow these steps: + +1. Access the printer by opening a web browser and entering `https://` in the + address bar. A {guilabel}`Warning: Potential Security Risk Ahead` security message appears. +2. Click {guilabel}`Advanced` to show the certificate approval options. +3. Click {guilabel}`Proceed` to validate the certificate. + +Then, to ensure {doc}`Odoo Point of Sale ` is configured with the +fiscal printer, go to {menuselection}`Point of Sale --> Configuration --> Settings`. In the +{guilabel}`Connected Devices` section, add the IP address in the {guilabel}`Italian Fiscal Printer +IP address` and enable {guilabel}`Use HTTPS`. + +## Ri.Ba. (Ricevuta Bancaria) + +{abbr}`Ri.Ba. (Ricevuta Bancaria)` is a payment method widely used in Italy where vendors request +payments through their bank, which forwards the request to the customer's own bank and takes +responsibility for the collection. This enables payment automation and reduces risks for the vendor. + +The vendor generally uploads a fixed-format text file with the list of payments to the bank's web +portal. + +:::{note} +- Ri.Ba. are exclusively for **domestic payments** in Italy. For recurring international + payments, please use [SEPA Direct Debt (SDD)](../accounting/payments/batch_sdd) +::: + +### Configuration + +1. Check that the `l10n_it_riba` module is {ref}`installed `. + +2. Go to {menuselection}`Settings --> Users & Companies --> Companies` and select the company that + will use Ri.Ba. + +3. Fill out the required {guilabel}`SIA Code`. + + ```{image} italy/sia-code.png + :alt: The company's SIA code + ``` + + :::{note} + The {guilabel}`SIA Code` identifies businesses within the Italian banking network and is used + to receive money through specific payment methods. It consists of one letter and four digits + (e.g., T1234) and can usually be found on the bank's portal or obtained by contacting the bank. + ::: + +4. Ensure the Company's bank account has an Italian IBAN. + + :::{seealso} + How to configure {doc}`Bank Accounts <../accounting/bank>` + ::: + +### Accept Ri.Ba. for your invoices + +Payments of type {abbr}`Ri.Ba. (Ricevuta Bancaria)` can be registered from the {guilabel}`Invoices` +({menuselection}`Accounting --> Customers --> Invoices`). + +:::{important} +Make sure that your invoice involves a Partner that has a bank account with an Italian IBAN. +::: + +Then, all Payments must be grouped in a **Batch Payment**. + +:::{seealso} +- {doc}`Batch Payments <../accounting/payments>` +- {doc}`Create a Batch Payment <../accounting/payments/batch>` +::: + +Once you press the {guilabel}`Validate` button for the Batch Payment, the {abbr}`Ri.Ba. (Ricevuta +Bancaria)` file is generated and attached to the Batch Payment, so you can download it and upload it +through your bank's web portal. + +```{image} italy/riba-attachment.png +:alt: The Ri.Ba. file attached +``` + diff --git a/content/applications/finance/fiscal_localizations/kenya.md b/content/applications/finance/fiscal_localizations/kenya.md new file mode 100644 index 000000000..d4f0fb86b --- /dev/null +++ b/content/applications/finance/fiscal_localizations/kenya.md @@ -0,0 +1,378 @@ +# Kenya + +(localization-kenya-configuration)= + +## Configuration + +Install the 🇰🇪 **Kenyan** {ref}`fiscal localization package ` to get +all the features of the Kenyan localization. + +## eTIMS + +The [Kenya Revenue Authority (KRA)](https://www.kra.go.ke/) has implemented the +[electronic Tax Invoice Management System (eTIMS)](https://www.kra.go.ke/online-services/etims) +for tax collection. + +To submit documents through eTIMS, you must use an {abbr}`OSCU (Online Sales Control Unit)` that +integrates with the existing **Trader Invoicing System (TIS)**, such as the one provided by Odoo. +The OSCU is used to validate, encrypt, sign, transmit, and store tax invoices. + +:::{note} +Make sure to {ref}`install ` the **Kenya eTIMS EDI** modules to use the OSCU +device fully. +::: + +(kenya-initialization)= + +### OSCU device initialization + +The OSCU must be initialized before use. To do so, navigate to {menuselection}`Settings --> General +Settings`, click {guilabel}`Update Info` in the {guilabel}`Companies` section, and enter your +{guilabel}`Tax ID`. + +To initialize the OSCU: + +1. Go to {menuselection}`Settings --> General Settings` and scroll down to the {guilabel}`Kenya + eTIMS Integration` section. +2. Set the {guilabel}`eTIMS Server Mode` to {guilabel}`Test` for the initialization. +3. Enter the {guilabel}`Serial Number` of the device and tick the two check boxes. +4. Click {guilabel}`Initialize OSCU`. + +:::{note} +Three server modes are available: + +- {guilabel}`Demo`: Designed for demo purposes; it uses mock data and does not require an + initialized OSCU; +- {guilabel}`Test`: Used to test the connection to eTIMS; +- {guilabel}`Production`: Used for live databases that are ready to send data. +::: + +:::{Important} +If your device has **already been initialized** (through another ERP, for example), enable the +{doc}`../../general/developer_mode`. Then, in the {guilabel}`Kenya eTIMS Integration` section, +enter the ID of the unit in the {guilabel}`Unit ID` field and the key obtained through a previous +initialization in the {guilabel}`CMC Key` field. Click {guilabel}`Save` when done. +::: + +Once the **OSCU module** has been {ref}`initialized `, an OSCU serial number +is generated for each company on that database with its **country** set to {guilabel}`Kenya`. The +serial number is generated based on the VAT number of the company (regardless of its validity). It +is a unique and sequential serial number starting with the prefix `ODOO` followed by the company's +**VAT number** and a sequence of numbers. + +### Registering on eTIMS + +Taxpayers *must* sign up and create an account on the [KRA portal](https://etims.kra.go.ke/basic/login/indexLogin). +If you do not have an account yet: + +1. Sign up, enter your **PIN**, and verify that all information is correct, including your phone + number, email address, and postal address. Correct any errors on the [iTax page](https://itax.kra.go.ke/KRA-Portal/). +2. An {abbr}`OTP (One-time Password)` is sent to the phone number provided. Unblock promotional + messages if you do not receive it. +3. Upload the **business owner ID** *or* **director's ID** (as listed on iTax), along with the + filled-out and signed **commitment form** . +4. On the **eTIMS dashboard**, click {guilabel}`Service request` at the top of the page. Select + {guilabel}`OSCU` as the **eTIMS type**, enter `Odoo KE LTD` as the third-party integrator, and + enter your company's OSCU serial number retrieved earlier. + +:::{note} +Service request approvals are usually quick. If there's a delay, contact the eTIMS operation +or KRA office. +::: + +:::{admonition} Commitment form +- Part 1: Fill in the taxpayer's information. +- Part 2: Fill in the business owner's *or* director's information. +- Part 3: Fill in your unique serial number found in Odoo. +- Part 4: Tick **OSCU**, enter Odoo KE LTD PIN `PO52112956W`, and enter the Odoo version you're + using (17.0 or onwards). +- Part 5: Check the mandatory boxes, enter a date, and sign. +::: + +### eTIMS codes + +Common standard codes are **automatically** fetched from the KRA eTIMS API servers every two days. +To fetch them manually, proceed as follows: + +1. Enable the {doc}`../../general/developer_mode`. +2. Go to {menuselection}`Settings --> Technical --> Automation: Scheduled Actions` and search for + {guilabel}`KE eTIMS: Fetch KRA standard codes`. +3. Click the action in the list, then click {guilabel}`Run Manually` to fetch the codes. + +Go to {menuselection}`Accounting --> Configuration --> KE OSCU Codes` to view the complete list of +fetched OSCU codes. + +```{image} kenya/oscu-codes.png +:alt: List of fetched OSCU codes. +``` + +(etims-unspsc)= + +### UNSPSC codes + +The KRA needs UNSPSC codes for a product to be **registered**. UNSPSC codes are **automatically** +fetched from the KRA eTIMS API servers every day. To fetch them manually, proceed as follows: + +1. Enable the {doc}`../../general/developer_mode`. +2. Go to {menuselection}`Settings --> Technical --> Automation: Scheduled Actions` and search for + {guilabel}`KE eTIMS: Fetch UNSPSC codes from eTIMS`. +3. Click the action in the list, then click {guilabel}`Run Manually` to fetch the codes. + +Go to the **product form**, and in the {guilabel}`Accounting` tab, click the {guilabel}`UNSPSC +Category` field to view the complete list of fetched UNSPSC codes. + +### Notices + +Notices are **automatically** fetched from the KRA eTIMS API servers every day. To fetch them +**manually**, proceed as follows: + +1. Enable the {doc}`../../general/developer_mode`. +2. Go to {menuselection}`Settings --> Technical --> Automation: Scheduled Actions` and search for + {guilabel}`KE eTIMS: Fetch KRA notices from eTIMS`. +3. Click the action in the list, then click {guilabel}`Run Manually` to fetch the notices. + +Go to {menuselection}`Accounting --> Configuration --> KE OSCU Notices` to view the complete list of +fetched notices. + +### Multi-company + +(kenya-branch)= + +:::{seealso} +{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. + +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 +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. + +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 `. +Then, go to the {guilabel}`Branches` tab and click {guilabel}`Populate from KRA`. + +:::{note} +- The KRA considers each **place of supply** as a separate branch (ID). +- The **OSCU** device must be {ref}`initialized independently ` for each + branch. +::: + +### Contact branch ID + +To attribute a branch ID to a contact, access the contact form, go to the {guilabel}`Accounting` +tab, and enter the branch code in the {guilabel}`eTIMS Branch Code` field. + +:::{note} +By default, contacts' branch IDs are set to `OO`. +::: + +### 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. + +The KRA needs **independent** sequences per branch. Therefore, Odoo manages sequences individually +per branch. + +```{eval-rst} +.. example:: + If you have a main 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. + + 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. +``` + +## Insurance + +For **health service providers**, you can send insurance information about the main 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 +Details` when done. + +(kenya-product-registration)= + +## Product registration + +The KRA requires **products to be registered** first before conducting business operations (such as +stock movements, {abbr}`BOM (Bill of Materials)`, customer invoices, etc.). For a product to be +registered, the following fields must be defined on the product form: + +- In the {guilabel}`General Information` tab: {guilabel}`Cost`. + +- In the {guilabel}`Accounting` tab: + + - {guilabel}`Packaging Unit`; + - {guilabel}`Packaging Quantity`; + - {guilabel}`Origin Country`; + - {guilabel}`eTIMS Product Type`; + - {guilabel}`Insurance Applicable`; + - {ref}`UNSPSC Category `. + +If the elements above are defined, the product is automatically registered while sending the +operation to the KRA. If not, you will be alerted by a yellow banner at the top of the screen +inviting you to check the missing elements. + +```{image} kenya/product-registration.png +:alt: Product registration template. +``` + +## Stock movements + +All **stock movements** must be sent to the KRA. They do not require an invoice if they are +internal operations or stock adjustments; therefore, Odoo automatically sends them if at least one +of the following conditions are met: + +1. No contact is set for the move; +2. The contact is your main company or a branch of the main company. + +If the stock moves are **external operations** (e.g., to contacts that are not part of the main +company or its branches), the stock moves are automatically sent *after* the invoice is sent to +eTIMS. + +:::{note} +- The stock move must be confirmed before sending the invoice to eTIMS. +- The product(s) must be {ref}`registered ` for the stock move to be + sent to eTIMS. If the product has not been registered yet, a yellow banner will prompt the + products' registration. +::: + +## Purchases + +Odoo automatically fetches new vendor bills from eTIMS every day. You need to confirm the fetched +vendor bills and send the confirmation to the KRA. To confirm a vendor bill, it must be linked to +one or several confirmed purchase order line(s). + +(kenya-purchases)= + +In the case of purchases (not customs imports), the steps to link purchase order lines with bills +are the following: + +1. Go to {menuselection}`Accounting --> Vendors --> Bills`. + The vendor bill is fetched from the KRA servers. The JSON file is available in the chatter of the + vendor bill if needed. + +2. Odoo looks at the {guilabel}`Tax ID` (PIN) of the vendor (partner); + + - If it is unknown, a new contact (partner) is created. + - If it is known and the branch ID is the same, Odoo uses the known contact. + +3. In the fetched bill from the KRA, select the {guilabel}`Product`. Each vendor bill *must* contain + a product to be confirmed and sent to eTIMS later on. + +4. Odoo checks existing purchase order lines matching the product(s) entered at the previous step + and the partner (if any). Click the {guilabel}`Purchase Order Line` field, and select the correct + related purchase order line(s) matching the product(s). The quantities on the bill *must* be the + same as the received quantities indicated on the purchase order. + + If no existing purchase order line matches the lines of the fetched bill, click + {guilabel}`Create Purchase Order` and create a purchase order based on the unmatched line(s). + {guilabel}`Validate` the resulting stock move and {guilabel}`Confirm` the bill. + +5. Set a method in the {guilabel}`eTIMS Payment Method` field.. + +6. Once all steps are completed, click {guilabel}`Send to eTIMS` to send the vendor bill. When the + vendor bill has been confirmed on eTIMS, the **KRA invoice number** can be found in the + {guilabel}`eTIMS Details` tab. + +```{image} kenya/purchase-order-lines.png +:alt: Bill registration steps. +``` + +## Invoicing + +:::{note} +The KRA does *not* accept sales if the product is not in stock. +::: + +This is the **advised sales flow** in Odoo when selling: + +1. Create a **sales order**. +2. {guilabel}`Validate` the delivery. +3. {guilabel}`Confirm` the invoice. +4. Click {guilabel}`Send and print`, and then enable {guilabel}`Send to eTIMS`. +5. Click {guilabel}`Send & print` to send the invoice. + +Once the invoice has been sent and signed by the KRA, the following information can be found on +it: + +- **KRA invoice number**; +- Mandatory KRA invoice fields, such as **SCU information**, **date**, **SCU ID**, **receipt + number**, **item count**, **internal date**, and **receipt signature**; +- The **KRA tax table**; +- A unique **KRA QR code** for the signed invoice. + +## Imports + +Customs import codes are **automatically** fetched from the KRA eTIMS API servers every day. To +fetch them manually, proceed as follows: + +1. Enable the {doc}`../../general/developer_mode`. +2. Go to {menuselection}`Settings --> Technical --> Automation: Scheduled Actions` and search for + {guilabel}`KE eTIMS: Receive Customs Imports from the OSCU`. +3. Click the action in the list, then click {guilabel}`Run Manually` to fetch the codes. + +Go to {menuselection}`Accounting --> Vendors --> Customs Imports` to view the imported codes. + +The following steps are required to send and have **customs imports** signed by the KRA: + +1. Go to {menuselection}`Accounting --> Vendors --> Customs Imports`; The customs import is fetched + automatically from the KRA. + +2. Match the imported item with an existing registered product in the {guilabel}`Product` field (or + create a product if no related product exists). + +3. Set a vendor in the {guilabel}`Partner` field. + +4. Based on the partner, match the imported item with its related purchase order (see + {ref}`purchase steps `). The stock must be correctly adjusted when the customs + import is approved. + + If no related purchase order exists, create one and {guilabel}`Confirm` it. Then, confirm the + delivery by clicking {guilabel}`Receive Products`, then {guilabel}`Validate` on the purchase + order. + +5. Click {guilabel}`Match and Approve` or {guilabel}`Match and Reject`, depending on the + situation of the goods. + +:::{note} +The JSON file received from the KRA is attached to the chatter of the customs import. +::: + +## BOM + +The KRA requires all BOMs to be sent to them. To send BOMs to eTIMS, the product and its components +*must* be {ref}`registered `. To access a product's BOM, click on the +product and then click the {guilabel}`Bill of Materials` smart button. + +Make sure the {ref}`KRA's required fields ` are filled in the +{guilabel}`KRA eTIMS details` section of the {guilabel}`Accounting` tab in the product form, and +click {guilabel}`Send to eTIMS`. The successful sending of the BOM is confirmed in the chatter, +where you can also find the sent information in an attached JSON file. + +## Credit notes + +The KRA does not accept credit notes with quantities or prices higher than the initial invoice. When +creating a credit note, a KRA reason must be indicated: In the credit note form, go to the +{guilabel}`eTIMS Details` tab, select the {guilabel}`eTIMS Credit Note Reason`, and then select the +invoice number in the {guilabel}`Reversal of` field. + diff --git a/content/applications/finance/fiscal_localizations/luxembourg.md b/content/applications/finance/fiscal_localizations/luxembourg.md new file mode 100644 index 000000000..24812c678 --- /dev/null +++ b/content/applications/finance/fiscal_localizations/luxembourg.md @@ -0,0 +1,105 @@ +# Luxembourg + +## Configuration + +{ref}`Install ` the following modules to get all the features of the Luxembourgish +localization: + +```{eval-rst} +.. list-table:: + :header-rows: 1 + + * - Name + - Technical name + - Description + * - :guilabel:`Luxembourg - Accounting` + - `l10n_lu` + - Default :ref:`fiscal localization package ` + * - :guilabel:`Luxembourg - Accounting Reports` + - `l10n_lu_reports` + - Country-specific reports + * - :guilabel:`Luxembourg - Annual VAT Report` + - `l10n_lu_reports_annual_vat` + - Country-specific reports +``` + +```{image} luxembourg/modules.png +:align: center +:alt: The three modules for the Luxembourgish Fiscal Localization Package on Odoo +``` + +:::{tip} +Installing the module {guilabel}`Luxembourg - Accounting Reports` installs all three modules at +once. +::: + +:::{seealso} +{doc}`Documentation on e-invoicing’s legality and compliance in Luxembourg +<../accounting/customer_invoices/electronic_invoicing/luxembourg>` +::: + +## Standard Chart of Accounts - PCN 2020 + +Odoo's {ref}`fiscal localization package ` for Luxembourg includes +the current **Standard Chart of Accounts (PCN 2020)**, effective since January 2020. + +## eCDF tax return + +Tax returns in Luxembourg require a specific XML file to upload on the eCDF. + +To download it, go to {menuselection}`Accounting --> Report --> Audit Reports --> Tax Report`, and +click on {guilabel}`Export eCDF declaration`. + +:::{seealso} +- {doc}`../accounting/reporting/tax_returns` +- [Platform for electronic gathering of financial data (eCDF)](http://www.ecdf.lu) +::: + +## Annual tax report + +You can generate an XML file to electronically file your annual tax report with the tax office. + +To do so, go to {menuselection}`Accounting --> Report --> Luxembourg --> Annual Tax Report`, click +on {guilabel}`Create`, then define the annual period in the {guilabel}`Year` field. + +The **simplified annual declaration** is automatically generated. You can manually add values in all +the fields to get a **complete annual declaration**. + +```{image} luxembourg/annual-tax-report.png +:align: center +:alt: Odoo Accounting (Luxembourg localization) generates an annual tax declaration. +``` + +To help you complete it, you can use the information provided on the {guilabel}`Tax Report`. To do +so, go to {menuselection}`Accounting --> Report --> Audit Reports --> Tax Report`, then click on the +{guilabel}`Tax Report` dropdown menu and select the type of report you want to display. + +```{image} luxembourg/tax-report-types.png +:align: center +:alt: Dropdown menu to select the type of Tax Report +``` + +Finally, click on {guilabel}`Export XML` to download the XML file. + +:::{note} +This feature requires the module {guilabel}`Luxembourg - Annual VAT Report` to be installed. +::: + +## FAIA (SAF-T) + +**FAIA (Fichier d’Audit Informatisé AED)** is a standardized and structured file that facilitates +the exchange of information between the taxpayers' accounting system and the tax office. It is the +Luxembourgish version of the OECD-recommended SAF-T (Standard Audit File for Tax). + +Odoo can generate an XML file that contains all the content of an accounting period according to the +rules imposed by the Luxembourg tax authorities on digital audit files. + +:::{note} +This feature requires the module {guilabel}`Luxembourg - Accounting Reports` to be installed. +::: + +### Export FAIA file + +Go to {menuselection}`Accounting --> Reporting --> Audit Reports --> General Ledger`, then click on +{guilabel}`FAIA`. + diff --git a/content/applications/finance/fiscal_localizations/malaysia.md b/content/applications/finance/fiscal_localizations/malaysia.md new file mode 100644 index 000000000..8a7af2a88 --- /dev/null +++ b/content/applications/finance/fiscal_localizations/malaysia.md @@ -0,0 +1,233 @@ +# Malaysia + +(malaysia-configuration)= + +## Configuration + +(malaysia-configuration-modules)= + +### Modules installation + +{ref}`Install ` the following modules to get all the features of the Malaysian +localization: + +```{eval-rst} +.. list-table:: + :header-rows: 1 + + * - Name + - Technical name + - Description + * - :guilabel:`Malaysia - Accounting` + - `l10n_my` + - This module includes the default + :ref:`fiscal localization package `. + * - :guilabel:`Malaysia - Accounting Reports` + - `l10n_my_reports` + - This module includes the accounting reports for Malaysia. + * - :guilabel:`Malaysia - UBL PINT` + - `l10n_my_ubl_pint` + - This module includes the features required to export invoices in PINT format. + * - :guilabel:`Malaysia - E-invoicing` + - `l10n_my_edi` + - This module includes the features required for integration with MyInvois under IRBM. +``` + +(malaysia-configuration-company)= + +### Company information + +To configure your company information, go to the {guilabel}`Contacts` app, search for your company, +and select it. Then configure the following fields: + +- {guilabel}`Name` + +- {guilabel}`Address`, including the {guilabel}`City`, {guilabel}`State`, {guilabel}`Zip Code`, + and {guilabel}`Country`. + + > - In the {guilabel}`Street` field, enter the street name, number, and any additional address + > information. + > - In the {guilabel}`Street 2` field, enter the neighborhood. + +- {guilabel}`Tax ID`: Tax identification number + +- {guilabel}`SST`: Malaysian Sales and Service Tax Number, if applicable + +- {guilabel}`TTx`: Malaysian Tourism Tax Number, if applicable + +- {guilabel}`Phone` + +(malaysia-myinvois)= + +## E-invoicing integration with MyInvois + +The MyInvois Portal is a platform provided by the {abbr}`IRBM (Inland Revenue Board of Malaysia)` +that facilitates the implementation of e-invoices for Malaysian taxpayers. +Odoo supports integration with MyInvois to submit the invoices generated in Odoo. + +:::{note} +The {guilabel}`Malaysia - E-invoicing module` must be installed to submit invoices to MyInvois. +::: + +(malaysia-myinvois-setup)= + +### Set-up + +(malaysia-myinvois-setup-registration)= + +#### MyInvois registration + +To send electronic invoices to MyInvois, you first need to register and log in to the MyInvois +portal to grant Odoo the **right to invoice** as an intermediary for your company. + +:::{note} +If this is the first time you log into the MyInvois portal, click {guilabel}`User Manual` on +[MyTax] to learn more about the registration process. Both the **pre-production** ({dfn}`testing +environment to try the functions before using the actual (production) environment`) and +**production** ({dfn}`actual environment to submit e-invoices with accurate information`) +environments are supported. +::: + +1. Log into [MyTax]. Choose the {guilabel}`ID Type` and the corresponding + {guilabel}`identification number` used to register for the digital certificate. + +2. From the dashboard, click the {icon}`fa-angle-down` {guilabel}`(angle-down)` icon in the + top-right corner and select {guilabel}`View Taxpayer Profile`. + +3. In the {guilabel}`Representatives` section, click {guilabel}`Add Intermediary` in the top-right + corner. + + ```{image} malaysia/myinvois-add-intermediary.png + :alt: MyInvois add intermediary + ``` + +4. Add `ODOO S.A.` as an intermediary using the following information: + + - {guilabel}`TIN`: `C57800417080` + + - {guilabel}`BRN`: `BE0477472701` + + - {guilabel}`Name`: + + - {guilabel}`Production`: `ODOO S.A.` + - {guilabel}`Pre-production`: `OXXX_XXXXO S.A.` + +5. Grant the following permissions by clicking the {icon}`fa-toggle-on` {guilabel}`(toggle-on)` + icon: + + - {guilabel}`Representation From` + - {guilabel}`Document - Submit` + - {guilabel}`Document - Cancel` + - {guilabel}`Document - Request Rejection` + + :::{note} + - Access can be revoked in the future if needed. + - Odoo, as an intermediary, does not store invoices sent on behalf of the client on the proxy + server. + ::: + +6. Click {guilabel}`Save`. The status for `ODOO S.A.` is then {guilabel}`Active`. + + ```{image} malaysia/myinvois-intermediary-active.png + :alt: MyInvois status active + ``` + +(malaysia-myinvois-setup-odoo)= + +#### Configuration in Odoo + +(malaysia-myinvois-setup-odoo-einvoicing)= + +##### 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. + +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. +::: + +(malaysia-myinvois-setup-odoo-company)= + +##### Company + +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: + +> - {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. + +##### Contacts + +Access the contact's form and fill in the following fields: + +> - {guilabel}`Country` +> - {guilabel}`State` +> - {guilabel}`Phone` +> - {guilabel}`Tax ID` +> - {guilabel}`Identification`: the {guilabel}`ID Type` and the corresponding +> {guilabel}`Identification number` of the contact registered on MyTax. + +(malaysia-myinvois-setup-odoo-product)= + +##### Products + +All products to be included in e-invoices require a Malaysian classification code. To add it, +access the {guilabel}`Product` form and in the {guilabel}`General Information` tab, fill in the +{guilabel}`Malaysian classification code` field. + +(malaysia-myinvois-workflow)= + +### Workflow + +(malaysia-myinvois-workflow-sending)= + +#### 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`. + +(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. + +:::{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. +::: + +(malaysia-myinvois-workflow-cancellation)= + +#### 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 +{guilabel}`MyInvois State` is updated to {guilabel}`cancelled`. + +(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. + +:::{important} +To {ref}`configure the Employment Hero API ` for **Malaysia**, use +the following value as {guilabel}`Payroll URL`: `https://apimy.yourpayroll.io/`. +::: + +[mytax]: https://mytax.hasil.gov.my + diff --git a/content/applications/finance/fiscal_localizations/mexico.md b/content/applications/finance/fiscal_localizations/mexico.md new file mode 100644 index 000000000..392e3c8ff --- /dev/null +++ b/content/applications/finance/fiscal_localizations/mexico.md @@ -0,0 +1,1121 @@ +--- +substitutions: + DIOT: "{abbr}`DIOT (Declaraci\xF3n Informativa de Operaciones con Terceros)`" + PAC: "{abbr}`PAC (Proveedor Autorizado de Certificaci\xF3n / Authorized Certification\n\ + Provider)`" + PPD: |- + {abbr}`PPD (Pago en Parcialidades o Diferido/Payment in Installements or + Deferred)` + PUE: "{abbr}`PUE (Pago en una Sola Exhibici\xF3n/Payment in a Single Exhibition)`" + RFC: '{abbr}`RFC (Registro Federal de Contribuyentes)`' + SAT: "{abbr}`SAT (Servicio de Administraci\xF3n Tributaria)`" +--- + +# Mexico + +## 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](https://www.youtube.com/watch?v=5cdogjm0GCI). + +## 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](http://omawww.sat.gob.mx/tramitesyservicios/Paginas/documentos/Anexo_20_Guia_de_llenado_CFDI.pdf), 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)= + +1. Be registered in the {{ SAT }}, with a valid {{ RFC }}. +2. Have a [Certificate of Digital Seal](https://www.gob.mx/sat/acciones-y-programas/certificado-de-sello-digital) (CSD). +3. Choose a PAC (Proveedor Autorizado de Certificación / Authorized Certification Provider). + Currently, Odoo works with the following {{ PAC }}s: [Solución Factible](https://solucionfactible.com/), [Quadrum (formerly Finkok)](https://cfdiquadrum.com.mx/) and + [SW Sapien - Smarter Web](https://sw.com.mx/). +4. Have knowledge and experience with billing, sales, and accounting in Odoo. This documentation + **only** contains the necessary information needed to use Odoo. + +### Installing modules + +{ref}`Install ` the following modules to get all the features of the Mexican +localization. The {doc}`Accounting <../accounting>` and *Contacts* modules are required to be +installed for this configuration: + +```{eval-rst} +.. list-table:: + :header-rows: 1 + :widths: 25 25 50 + + * - Name + - Technical name + - Description + * - :guilabel:`Mexico - Accounting` + - `l10n_mx` + - The default :doc:`fiscal localization package <../fiscal_localizations>`, adds accounting + characteristics for the Mexican localization, such as: the most common taxes and the chart of + accounts – based on `the SAT account grouping code + `_. + * - :guilabel:`EDI for Mexico` + - `l10n_mx_edi` + - Includes all the technical and functional requirements to generate and validate + :doc:`Electronics Documents <../accounting/customer_invoices/electronic_invoicing>` — based + 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 + |DIOT|. + * - :guilabel:`Mexico - Localization Reports for Closing` + - `l10n_mx_reports_closing` + - Necessary to create the Closing Entry (Also known as the *month 13th 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`. +::: + +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. + +```{eval-rst} +.. list-table:: + :header-rows: 1 + :widths: 25 25 50 + + * - Name + - Technical name + - 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. + * - :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. +``` + +### Configure your company + +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. + +Enter the full {guilabel}`Address` in the resulting form, including: {guilabel}`ZIP` code, +{guilabel}`State`, {guilabel}`Country`, and {{ RFC }} ({guilabel}`VAT` number). + +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. + +```{image} mexico/mx-company-info.png +:alt: Main company contact requirements for a correct invoicing. +``` + +:::{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 +another currency, let MXN be the default currency and use a {doc}`pricelist +<../../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. +``` + +:::{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 +{guilabel}`General de Ley Personas Morales`. +::: + +### 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). + +:::{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. +::: + +### Taxes + +Some additional configurations for factor type and tax objects need to be added to the sales taxes +in order to properly sign invoices. + +#### 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`. + +```{image} mexico/mx-factor-type.png +:alt: Factor Type Sales tax type configuration. +``` + +:::{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` +::: + +#### 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: + +- `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. + +To use the `03` value, navigate to {menuselection}`Contacts --> your customer's invoice --> MX EDI +tab`, and activate the {guilabel}`No Tax Breakdown` checkbox. + +```{image} mexico/mx-tax-breakdown.png +:alt: No Tax Breakdown option on the MX EDI tab of the customer's invoice. +``` + +:::{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. +::: + +#### Other tax configurations + +When registering a payment, Odoo will carry out the movement of taxes from the *Cash Basis +Transition Account* to the account set in the {guilabel}`Definition` tab. For such movement, a tax +base account will be used: (`Base Imponible de Impuestos en Base a Flujo de Efectivo`) in the +journal entry when reclassifying taxes. **Do not delete this account**. + +If you create a new tax in {menuselection}`Accounting --> Configuration --> Taxes`, you need to add +the correct {guilabel}`Tax Grids` for it (`IVA`, `ISR` or `IEPS`). Odoo **only** supports these +three groups of taxes. + +```{image} mexico/mx-taxes-config.png +:alt: Tax accounts available for Odoo. +``` + +### 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>`. + +:::{note} +All products need to have an {{ SAT }} code associated with them in order to prevent validation +errors. +::: + +### Electronic invoicing + +#### PAC credentials + +After you have processed your [Private Key (CSD)](https://www.sat.gob.mx/aplicacion/16660/genera-y-descarga-tus-archivos-a-traves-de-la-aplicacion-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`). + +```{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. +::: + +#### .cer and .key certificates + +The [digital certificates of the company](https://www.gob.mx/tramites/ficha/certificado-de-sello-digital/SAT139) 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`. + +```{image} mexico/mx-certificates.png +:alt: Certificate and key upload inputs. +``` + +:::{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: + +- {download}`Certificate ` +- {download}`Certificate Key ` +- **Password**: `12345678a` +::: + +## Workflows + +### Electronic invoicing + +The invoicing process in Odoo is based on [Annex 20](http://omawww.sat.gob.mx/tramitesyservicios/Paginas/anexo_20.htm) version 4.0 of electronic +invoicing of the {{ SAT }}. + +#### 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.) + +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)`. + +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. + +:::{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 }}. + +If you are in a testing environment, you will always receive the message {guilabel}`Not Found`. +::: + +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. + +#### 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. + +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 + +##### Payment policy + +One addition of the Mexican localization is the {guilabel}`Payment Policy` field. According to +the SAT documentation, there are two types of payments: + +- `PUE` (Pago en una Sola Exhibición/Payment in a Single Exhibition) + +- `PPD` (Pago en Parcialidades o Diferido/Payment in Installements or Deferred) + + > :::{seealso} + > {doc}`../../inventory_and_mrp/inventory/product_management/inventory_valuation/landed_costs` + > ::: + +The difference lies in the *Due Date* or *Payment Terms* of the invoice. + +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). + +```{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. + +```{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). +::: + +##### 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). + +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. + +:::{seealso} +{doc}`../accounting/bank/reconciliation` +::: + +While this process is the same for PPD invoices, the addition of the 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. + +:::{note} +The exact configurations are in the [Anexo 20 of the SAT](http://omawww.sat.gob.mx/tramitesyservicios/Paginas/anexo_20.htm). Usually, the +{guilabel}`Bank Account` needs to be 10 or 18 digits for transfers, 16 for credit or debit cards. +::: + +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`. + +```{image} mexico/mx-signed-complement.png +:alt: CFDI (4.0) E-invoicing service process payment now message. +``` + +:::{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. +::: + +#### Invoice cancellations + +It is possible to cancel the EDI documents sent to the {{ SAT }}. According to the [Reforma Fiscal 2022](https://www.sat.gob.mx/consultas/91447/nuevo-esquema-de-cancelacion), since January 1st, 2022, +there are two requirements for this: + +- With all cancellation requests, you **must** specify a *cancellation reason*. +- After 24 hours have passed since the creation of the invoice, the client **must** be asked to + accept the cancellation. + +There are four different cancellation reasons. In Odoo, you can cancel invoices with the reasons *01 +Invoices sent with errors with a relation*, and *02 Invoices sent with errors without a relation*. + +The following sections break down the process of cancelling invoices for each cancellation reason in +Odoo. + +:::{important} +Odoo has certain limitations to cancelling invoices in the {{ SAT }}: The reasons 03 and 04 +(*Operation did not take place* and *Nominative transactions related to a global invoice*, +respectively) are not currently supported by Odoo. For this, you need to cancel the invoice +directly in the {{ SAT }}, and press {guilabel}`Retry` in the {guilabel}`SAT Status field`. +::: + +##### 01 - invoices sent with errors with a relation + +This cancellation reason must be used when a new invoice needs to substitute the original one, due +to an error in any field. + +Begin by navigating to {menuselection}`Accounting --> Customers --> Invoices`, and select the old +invoice. Copy the {guilabel}`Fiscal Folio` from the old invoice. Then, navigate to the new invoice, +and in the {guilabel}`CFDI Origin` field, add the value `04|` and paste the {guilabel}`Fiscal Folio` +of the old invoice after the value. Finally, sign the new document. + +Next, navigate back to the old invoice, and notice the {guilabel}`Substituted By` field is now +available. Click the {guilabel}`Request EDI Cancellation` button on the old invoice, and then click +{guilabel}`Process Now` in the blue section that appears. The invoice status changes to +{guilabel}`Cancelled`, and a confirmation is logged in the chatter. + +Now, the invoice should be cancelled in the {{ SAT }} as well. You can confirm this was done correctly, +by pressing {guilabel}`Retry` in the {{ SAT }} status field. + +If the document was cancelled more than 24 hours after its creation, you may need to ask the client +to accept the cancellation in their “Buzón Tributario” directly from the [SAT website](https://www.sat.gob.mx/home). + +:::{note} +The `04|` is only a code that helps Odoo to perform this process. It has no relation to the +method 04 reason for cancellation. +::: + +```{image} mexico/mx-01-invoice-cancellation-substitute.png +:alt: Old invoice with CFDI Origin. +``` + +```{image} mexico/mx-01-invoice-cancellation.png +:alt: Invoice with the Substituted By field referencing the CFDI Origin invoice. +``` + +##### 02 - invoices sent with errors without a relation + +This cancellation reason has to be used when an invoice was sent with an error in any field, and +does not need to be replaced by another one. + +For this case, navigate to {menuselection}`Accounting --> Customers --> Invoices`, and select the +old invoice. From here, the only requirement is to click the {guilabel}`Request EDI Cancellation` +button, and then click the {guilabel}`Process Now` button. + +Because the field {guilabel}`Substituted By` does not appear when using this cancellation reason, +the {{ SAT }} should automatically detect that the cancellation reason is 02. + +##### 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. + +Finally, the payment status is moved 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. +::: + +#### Invoicing special use cases + +##### CFDI to public + +If the customer you are selling goods or services to does not require an invoice, a *CFDI to Public* +has to be created. + +If you use the {guilabel}`Customer` name `PUBLICO EN GENERAL`, an error will be triggered. This is a +main change in the CFDI 4.0 that requires invoices with that specific name to need additional +fields, which Odoo does not currently support. So, for a *CFDI to Public* to be created, you need to +add any name to your customer that is **not** `PUBLICO EN GENERAL`. (For example: `CLIENTE FINAL`). + +In addition to this, it is required that the {guilabel}`ZIP` code of your company is added, the +generic {{ RFC }} is set as `XAXX010101000`, and the {guilabel}`Fiscal Regime` of your customer must be +set as: `Sin obligaciones fiscales`. + +```{image} mexico/mx-cfdi-to-public.png +:alt: CFDI to Public Customer field configuration. +``` + +##### 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. + +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 +<../accounting/bank/foreign_currency>`. + +:::{note} +The only currencies that automatically update their exchange rate daily are: USD, EUR, GBP, and +JPY. +::: + +```{image} mexico/mx-multicurrency-1.png +:alt: Multi-currency configuration in the Accounting settings. +``` + +##### 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. + +:::{seealso} +[The official documentation for registration of down payments in Mexico](http://omawww.sat.gob.mx/tramitesyservicios/Paginas/documentos/Caso_uso_Anticipo.pdf). +::: + +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`. + +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`. + +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`. + +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. + +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. + +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. + +### 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](http://omawww.sat.gob.mx/tramitesyservicios/Paginas/complemento_comercio_exterior.htm), 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 {guilabel}`Incoterm` (International Commercial Terms), among others (*certificate of + origin* and *special units of measure*). + +This allows the correct identification of exporters and importers, in addition to expanding the +description of the merchandise sold. + +Since January 1, 2018, external trade is a requirement for taxpayers, who carry export operations of +type A1. While the current CFDI is 4.0, the external trade is currently on version 1.1 + +In order to use this feature, the modules {guilabel}`l10n_mx_edi_extended` and +{guilabel}`l10n_mx_edi_extended_40` have to be installed. + +:::{important} +Before installing, make sure your business needs to use this feature. Consult your accountant +first, if needed, before installing any modules. +::: + +#### Configuration + +##### Contacts + +To configure your company contact for external trade, navigate to {menuselection}`Accounting --> +Customers --> Customers`, and select your {guilabel}`Company`. While the CFDI 4.0 requirements ask +you to add a valid {guilabel}`ZIP` code in your contact, the external trade complement adds the +requirement that your {guilabel}`City` and the {guilabel}`State` must also be valid. All three +fields must coincide with the [Official SAT Catalog][sat-catalog], or you will receive an error. + +:::{warning} +Add the {guilabel}`City` and {guilabel}`State` in the company's *contact*, not in the company +itself. You can find your company's contact in {menuselection}`Accounting --> Customers --> +Customers`. +::: + +The fields {guilabel}`Locality` and {guilabel}`Colony Code` are optional and can be added in the +company directly in {menuselection}`Settings --> General Settings --> Companies`. These two fields +have to coincide with the data in the {{ SAT }}. + +```{image} mexico/mx-external-trade-rescompany.png +:alt: Optional external trade company fields. +``` + +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: + +1. The entire company {guilabel}`Address`, including a valid {guilabel}`ZIP` code and the foreign + {guilabel}`Country`. +2. The format of the foreign {guilabel}`VAT` (tax identification number, for example: Colombia + `123456789-1`) +3. 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`). + +:::{important} +If the new contact was created by duplicating another existing contact from Mexico, make sure to +delete any carried over information from the {guilabel}`Fiscal Regime` field. In addition, do not +enable the {guilabel}`No Tax Breakdown` option. Selecting this option hides mandatory fields that +are required for external trade contact configuration. +::: + +```{image} mexico/mx-external-trade-customer-contact.png +:alt: Required external trade customer fields. +``` + +:::{note} +In the resulting XML and PDF files, the {guilabel}`VAT` is automatically replaced by the generic +VAT for abroad transactions: `XEXX010101000`. +::: + +##### Products + +All products involved with external trade have four fields that are required, two of them exclusive +to external trade. + +1. The {guilabel}`Internal Reference` of the product is in the {guilabel}`General Information` tab. +2. The {guilabel}`Weight` of the product must be more than `0`. +3. The [correct](https://www.ventanillaunica.gob.mx/vucem/Clasificador.html) {guilabel}`Tariff + Fraction` of the product in the {guilabel}`Accounting` tab. +4. The {guilabel}`UMT Aduana` corresponds to the {guilabel}`Tariff Fraction`. + +```{image} mexico/mx-external-trade-product.png +:alt: Required external trade product fields. +``` + +:::{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`. +::: + +#### Invoicing flow + +Before creating an invoice, it is important to take into account that external trade invoices +require to convert the amounts of your product into USD. Therefore, {doc}`multicurrency +<../accounting/get_started/multi_currency>` **must** be enabled and *USD* **must** be activated in +the {guilabel}`Currencies` section. The correct {guilabel}`Service` to run is {guilabel}`Mexican +Bank`. + +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. + +```{image} mexico/mx-external-trade-other-info.png +:alt: External trade Other Info tab of a product. +``` + +Finally, sign the invoice with the same process as a regular invoice, and click the +{guilabel}`Process Now` button. + +### Delivery guide + +A [Carta Porte](https://www.sat.gob.mx/consultas/68823/complemento-carta-porte-) is a bill of +lading: a document that states the type, quantity, and destination of goods being carried. + +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. + +Odoo can create XML and PDF files with (or without) ground transport, and can process materials that +are treated as *Dangerous Hazards*. + +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. + +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. + +:::{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. +::: + +#### Configuration + +Odoo manages two different types of CFDI: + +- **No Federal Highways**: Is used when the *Distance to Destination* is [less than 30 KM](http://omawww.sat.gob.mx/cartaporte/Paginas/documentos/PreguntasFrecuentes_Autotransporte.pdf). +- **Federal Transport**: Is used when the *Distance to Destination* exceeds 30 KM. + +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. + +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. + +##### Contacts and vehicles + +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 _`. + +:::{tip} +The field, {guilabel}`Locality`, is optional for both addresses. +::: + +```{image} mexico/mx-delivery-guide-contacts.png +:alt: Delivery guide contact configuration. +``` + +:::{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. +::: + +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. + +All fields are mandatory to create a correct delivery guide. + +:::{tip} +The fields, {guilabel}`Vehicle Plate Number` and {guilabel}`Number Plate`, must contain between +5 to 7 characters. +::: + +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`. + +```{image} mexico/mx-delivery-guide-vehicle.png +:alt: Delivery guide vehicle configuration. +``` + +##### 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: + +- 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`. + +:::{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-delivery-guide-products.png +:alt: Delivery guide product configuration. +``` + +#### Sales and inventory 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. + +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`). + +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. + +:::{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. +::: + +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. + +```{image} mexico/mx-delivery-guide-federal-transport.png +:alt: Delivery guide MX EDI tab configuration. +``` + +##### Dangerous hazards + +Certain values in the {guilabel}`UNSPSC Category` are considered in the [official SAT catalog](http://omawww.sat.gob.mx/tramitesyservicios/Paginas/complemento_carta_porte.htm) as *dangerous +hazards*. These categories need additional considerations when creating a delivery guide with +{guilabel}`Federal Transport`. + +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. + +```{image} mexico/mx-delivery-guide-hazards-designation.png +:alt: Delivery guide hazardous material product required fields. +``` + +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. + +```{image} mexico/mx-delivery-guide-hazards-environment.png +:alt: Delivery Guide environment insurer required fields. +``` + +### 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 +goods. + +According to the [Annex 20](http://omawww.sat.gob.mx/tramitesyservicios/Paginas/anexo_20.htm) 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. + +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. + +:::{important} +Do not confuse this feature with external trade. The customs numbers are directly related to +importing goods, while the external trade complement is related to exporting. Consult your +accountant first if this feature is needed before doing any modifications. +::: + +#### 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. + +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. + +- {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 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` + +```{image} mexico/mx-landing-configuration.png +:alt: Storable products general configuration. +``` + +```{image} mexico/mx-landing-configuration-category.png +:alt: Storable product category configuration. +``` + +#### Purchase and sales flow + +After you configure your 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. + +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`. + +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. + +:::{warning} +You can only add the *Pedimentos* number **once**, 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. + +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. + +```{image} mexico/mx-landing-invoice.png +:alt: Customs number on confirmed sales order product. +``` + +### Electronic accounting + +For Mexico, [Electronic Accounting](https://www.sat.gob.mx/aplicacion/42150/envia-tu-contabilidad-electronica) 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: + +1. The updated list of the chart of accounts that you are currently using. +2. A monthly trial balance, plus a closing entry report, also known as: *Trial Balance Month 13*. +3. Either optional, or for a compulsory audit, an export of the journal entries in your general + ledger. + +The resulting XML files follow the requirements of the [Anexo Técnico de Contabilidad Electrónica +1.3](https://www.gob.mx/cms/uploads/attachment/file/151135/Anexo24_05012015.pdf). + +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 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>`. + +:::{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 México follows a +specific pattern based on {{ SAT }}'s' [Código agrupador de cuentas](http://omawww.sat.gob.mx/fichas_tematicas/buzon_tributario/Documents/codigo_agrupador.pdf). + +You can create any account, as long as it respects {{ SAT }}'s encoding group: the pattern is +`NNN.YY.ZZ` or `NNN.YY.ZZZ`. + +```{eval-rst} +.. 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 your account appears in the *COA* report. + +Once you create all your accounts, make sure the correct {guilabel}`Tags` are added. + +:::{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. +::: + +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. + +#### 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 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)`. + +```{image} mexico/mx-reports-trial-balance.png +:alt: Trial balance report. +``` + +:::{note} +Odoo does not generate the *Balanza de Comprobación Complementaria*. +::: + +##### Month 13 trial balance + +The *Month 13* report is a closing balance sheet that shows any adjustments or movements made in the +accounting to close the year. + +To generate it, proceed as follows: + +1. 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. +2. In the {guilabel}`Other Info` tab, enable the {guilabel}`Month 13 Closing` option. +3. Go to {menuselection}`Accounting --> Reporting --> Trial Balance`, click the calendar, and select + {guilabel}`Month 13`. +4. Click the {icon}`fa-caret-down` ({guilabel}`down arrow`) next to the {guilabel}`PDF` button, and + select {guilabel}`SAT (XML)`. + +```{image} mexico/mx-reports-trial-balance-13-report.png +:alt: Trial Balance Month 13 report. +``` + +#### General ledger + +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. + +:::{tip} +You can filter by period, or by journal, according to your current needs. +::: + +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: + +- {guilabel}`Tax audit` +- {guilabel}`Audit certification` +- {guilabel}`Return of goods` +- {guilabel}`Compensation` + +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 }}. + +:::{note} +If you want to see this report without sending it, use `ABC6987654/99` for {guilabel}`Order +Number` and `AB123451234512` for {guilabel}`Process Number`. +::: + +#### 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, and refunds of VAT from your vendor bills, +are provided to the {{ SAT }}. + +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. + +The transactions file contains the total amount of your payments registered in vendor bills, broken +down into the corresponding types of IVA. The {guilabel}`VAT` and {guilabel}`Country` is mandatory +for all vendors. + +To 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. + +```{image} mexico/mx-reports-diot-example.png +:alt: A Vendor Bill that is In Payment. +``` + +:::{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. + +```{image} mexico/mx-reports-diot-contact.png +:alt: DIOT information on a vendor contact. +``` +::: + +[sat-catalog]: http://omawww.sat.gob.mx/tramitesyservicios/Paginas/catalogos_emision_cfdi_complemento_ce.htm + diff --git a/content/applications/finance/fiscal_localizations/netherlands.md b/content/applications/finance/fiscal_localizations/netherlands.md new file mode 100644 index 000000000..3c718d512 --- /dev/null +++ b/content/applications/finance/fiscal_localizations/netherlands.md @@ -0,0 +1,24 @@ +# Netherlands + +:::{seealso} +{doc}`Documentation on e-invoicing’s legality and compliance in the Netherlands +<../accounting/customer_invoices/electronic_invoicing/netherlands>` +::: + +## XAF Export + +With the Dutch accounting localization installed, you will be able to +export all your accounting entries in XAF format. For this, you have to +go in {menuselection}`Accounting --> Reporting --> General Ledger`, you +define the entries you want to export using the filters (period, journals, ...) +and then you click on the button **EXPORT (XAF)**. + +## Dutch Accounting Reports + +If you install the Dutch accounting localization, you will have access +to some reports that are specific to the Netherlands such as : + +- Profit & Loss +- Tax Report (Aangifte omzetbelasting) +- Intrastat Report (ICP) + diff --git a/content/applications/finance/fiscal_localizations/new_zealand.md b/content/applications/finance/fiscal_localizations/new_zealand.md new file mode 100644 index 000000000..70d8abf6b --- /dev/null +++ b/content/applications/finance/fiscal_localizations/new_zealand.md @@ -0,0 +1,14 @@ +# New Zealand + +(new-zealand-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. + +:::{important} +To {ref}`configure the Employment Hero API ` for **New Zealand**, +use the following value as {guilabel}`Payroll URL`: `https://api.nzpayroll.co.nz/`. +::: + diff --git a/content/applications/finance/fiscal_localizations/peru.md b/content/applications/finance/fiscal_localizations/peru.md new file mode 100644 index 000000000..fadf9f5ba --- /dev/null +++ b/content/applications/finance/fiscal_localizations/peru.md @@ -0,0 +1,1037 @@ +--- +substitutions: + EDI: '{abbr}`EDI (Electronic Data Interchange)`' + GRE: "{abbr}`GRE (Gu\xEDa de Remisi\xF3n Electr\xF3nica)`" + PLE: "{abbr}`PLE (Programa de Libros Electr\xF3nico)`" + RUS: "{abbr}`RUS (R\xE9gimen \xDAnico Simplificado)`" + SUNAT: "{abbr}`SUNAT (Superintendencia Nacional de Aduanas y de Administraci\xF3\ + n\nTributaria)`" +--- + +# Peru + +## Modules + +{ref}`Install ` the following modules to utilize all the current features of the +Peruvian localization. + +```{eval-rst} +.. list-table:: + :header-rows: 1 + + * - Name + - Technical name + - Description + * - :guilabel:`Peru - Accounting` + - `l10n_pe` + - Adds accounting features for the Peruvian localization, which represent the minimal + configuration required for a company to operate in Peru and under the SUNAT regulations and + guidelines. The main elements included in this module are the chart of accounts, taxes, + document types. + * - :guilabel:`Peru - E-invoicing` + - `l10n_pe_edi` + - Includes all technical and functional requirements to generate and receive electronic + invoices online based on the SUNAT regulations. + * - :guilabel:`Peru - Accounting Reports` + - `l10n_pe_reports` + - Includes the following financial reports: + + - 1st set of main financial reports: + + - Registro de Ventas e Ingresos (RVIE) - 14.4 + - Registro de Compras Electrónico (RCE) - 8.4 + - Registro de Compras Electrónico - Información de Operaciones con Sujetos no Domiciliados + (RCE) - 8.5 + + - 2nd set of financial reports: + + - PLE 5.1 General Journal + - PLE 5.3 Chart of Accounts + - PLE 6.1 General Ledger + + - 3rd set of financial reports: + + - PLE 1.1 Libro de Caja + - PLE 1.2 Libro de Bancos + + * - :guilabel:`Peruvian - Electronic Delivery Note` + - `l10n_pe_edi_stock` + - Adds the delivery guide (Guía de Remisión), which is needed as proof that you are sending + goods between A and B. It is only when a delivery order is validated that the delivery guide + can be created. + * - :guilabel:`Peru - Stock Reports` + - `l10n_pe_reports_stock` + - Enables the :ref:`PLE reports ` for permanent inventory record in physical + units and permanent valued inventory records. + * - :guilabel:`Peruvian eCommerce` + - `l10n_pe_website_sale` + - Enables the identification type in eCommerce checkout forms and the ability to generate + electronic invoices. + * - :guilabel:`Peruvian - Point of Sale with PE Doc` + - `l10n_pe_pos` + - Enables contact fiscal information to be editable from a PoS Session to generate electronic + invoices and refunds. +``` + +:::{note} +- Odoo automatically installs the appropriate package for the company according to the country + selected at the creation of the database. +- The *Peruvian - Electronic Delivery Guide* module depends on the *Inventory* application to be + installed. +::: + +:::{seealso} +- [App Tour - Localización de Peru](https://youtu.be/Ic3mGovkf8Y) +- [Smart Tutorial - Localización de Peru (videos for workflows and configurations)](https://www.odoo.com/slides/smart-tutorial-localizacion-de-peru-133) +- {doc}`Documentation on e-invoicing's legality and compliance in Peru + <../accounting/customer_invoices/electronic_invoicing/peru>` +::: + +## Configuration + +### Install the Peruvian localization modules + +Go to *Apps* and search for Peru, then click Install in the module Peru EDI. This module has a +dependency with *Peru - Accounting*. In case this last one is not installed, Odoo installs it +automatically within EDI. + +```{image} peru/peru-modules.png +:alt: The "Module" filter is set on "Peru" +``` + +:::{note} +When you install a database from scratch selecting Peru as country, Odoo automatically +installs the base module: Peru - Accounting. +::: + +#### Configure your company + +In addition to the basic information in the Company, we need to set Peru as the Country, this is +essential for the Electronic Invoice to work properly. The field **Address Type Code** represents +the establishment code assigned by the SUNAT when companies register their RUC (Unique Contributor +Registration): + +```{image} peru/peru-company.png +:alt: Company data for Peru including RUC and Address type code. +``` + +:::{tip} +In case the Address type code is unknown, you can set it as the default value: 0000. Be aware +that if an incorrect value is entered, the Electronic invoice validation might have errors. +::: + +:::{note} +The NIF should be set following the RUC format. +::: + +#### Chart of Account + +The 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 + +The chart of accounts for Peru is based on the most updated version of the {abbr}`PCGE (Plan +Contable General Empresarial)`, which is grouped in several categories and is compatible with NIIF +accounting. + +(peru-accounting-settings)= + +### Accounting Settings + +Once the modules are installed and the basic information of your company is set, you need to +configure the elements required for Electronic Invoice. For this, go to {menuselection}`Accounting +--> Settings --> Peruvian Localization`. + +#### Basic Concepts + +Here are some terms that are essential on the Peruvian localization: + +- **EDI**: Electronic Data Interchange, which in this refers to the Electronic Invoice. +- **SUNAT**: is the organization that enforces customs and taxation in Peru. +- **OSE**: Electronic Service Operator, [OSE SUNAT's definition](). +- **CDR**: Receipt certificate (Constancia de Recepción). +- **SOL Credentials**: Sunat Operaciones en Línea. User and password are provided by the SUNAT and + grant access to Online Operations systems. + +#### Signature Provider + +As part of the requirements for Electronic Invoice in Peru, your company needs to select a +Signature Provider that will take care of the document signing process and manage the SUNAT +validation response. Odoo offers three options: + +1. IAP (Odoo In-App Purchase) +2. Digiflow +3. SUNAT + +Please refer to the sections below to check the details and considerations for each option. + +##### IAP (Odoo In-App Purchase) + +This is the default and the suggested option, considering the digital ceritificate is included as +part of the service. + +```{image} peru/peru-IAP.png +:alt: IAP option as signature providers. +``` + +###### What is the IAP? + +This is a signature service offered directly by Odoo, the service takes care of the next process: + +1. Provides the Electronic invoice Certificate, so you do not need to acquire one by yourself. +2. Send the document to the OSE, in this case, Digiflow. +3. Receive the OSE validation and CDR. + +###### How does it work? + +The service requires Credits in order to process your electronic documents. Odoo provides 1000 +credits for free in new databases. After these credits are consumed, you need to buy a Credit +Package. + +| Credits | EUR | +| ------- | --- | +| 1000 | 22 | +| 5000 | 110 | +| 10,000 | 220 | +| 20,000 | 440 | + +The credits are consumed per each document that is sent to the OSE. + +:::{important} +If you have a validation error and the document needs to be sent one more time, one additional +credit will be charged. Therefore, it is paramount that you verify all information is correct +before sending your document to the OSE. +::: + +###### What do you need to do? + +- In Odoo, once your enterprise contract is activated and you start working in Production, you + need to buy credits once the first 1000 are consumed. +- As Digiflow is the OSE used in the IAP, you need to affiliate it as the official OSE for your + company on the SUNAT website. This is a simple process. For more information, please check + [OSE Affiliation guide](https://drive.google.com/file/d/1BkrMTZIiJyi5XI0lGMi3rbMzHddOL1pa/view?usp=sharing). +- Register Digiflow as the authorized PSE, please check + [PSE Affiliation guide](https://drive.google.com/file/d/1QZoqWvtQERpS0pqp6LcKmw7EBlm9EroU/view?usp=sharing). + +##### Digiflow + +This option can be used as an alternative, instead of using the IAP services you can send your +document validation directly to Digiflow. In this case you need to consider: + +- Buy your own digital Certificate: For more detail regarding the official vendor list, and the + process to acquire it, please refer to [SUNAT Digital Ceritifcates](https://cpe.sunat.gob.pe/informacion_general/certificados_digitales/). +- Sign a service agreement directly with [Digiflow](https://www.digiflow.pe/). +- Provide your SOL credentials. + +```{image} peru/peru-Digiflow.png +:alt: Digiflow. +``` + +##### SUNAT + +In case your company wants to sign directly with the SUNAT, it is possible to select this option +in your configuration. In this case you need to consider: +\- Get the SUNAT Certification process accepted. + +- Buy your own digital Certificate: For more detail regarding the official vendor list, and the + process to acquire it, please refer to [SUNAT Digital Ceritifcates](https://cpe.sunat.gob.pe/informacion_general/certificados_digitales/). +- Provide you SOL credentials. + +:::{important} +When using direct connection with the SUNAT, the SOL User must be set with the Company RUT + User +Id. Example: `20121888549JOHNSMITH` +::: + +#### Testing environment + +Odoo provides a testing environment that can be activated before your company goes into production. + +When using the testing environment and the IAP signature, you don’t need to buy testing credits +for your transactions as all of them are validated by default. + +:::{tip} +By default the databases are set to work on production, make sure to enable the testing mode +if needed. +::: + +#### Certificate + +In case you don’t use Odoo IAP, in order to generate the electronic invoice signature, a digital +certificate with the extension `.pfx` is required. Proceed to this section and load your file and +password. + +```{image} peru/peru-Certificate.png +:alt: EDI Certificate wizard. +``` + +#### Multicurrency + +The official currency exchange rate in Peru is provided by the SUNAT. Odoo can connect directly to +its services and get the currency rate either automatically or manually. + +```{image} peru/l10n-pe-banksync-sunat.png +:alt: SUNAT displayed in Multicurrency Service option. +``` + +Please refer to the next section in our documentation for more information about +{doc}`multicurrencies <../accounting/get_started/multi_currency>`. + +(peru-master-data)= + +### Configure Master data + +#### Taxes + +As part of the localization module the taxes are created automatically with their related +financial account and electronic invoice configuration. + +```{image} peru/peru-taxes.png +:alt: List of default taxes. +``` + +##### EDI Configuration + +As part of the taxes configuration, there are three new fields required for electronic invoice, +the taxes created by default have this data included, but in case you create new taxes make +sure you fill in the fields: + +```{image} peru/peru-taxes-edi.png +:alt: Taxes EDI data for Peru. +``` + +#### Fiscal Positions + +There are two main fiscal positions included by default when you install the Peruvian localization. + +**Extranjero - Exportación**: Set this fiscal position on customers for Exportation transactions. + +**Local Peru**: Set this fiscal position on local customers. + +#### Document Types + +In some Latin American countries, including Peru, some accounting transactions like invoices and +vendor bills are classified by document types, defined by the government fiscal authorities, in +this case by the SUNAT. + +Each document type can have a unique sequence per journal where it is assigned. As part of the +localization, the Document Type includes the country on which the document is applicable;the data +is created automatically when the localization module is installed. + +The information required for the document types is included by default so the user does not need +to fill anything on this view: + +```{image} peru/peru-document-type.png +:alt: Document Type list. +``` + +:::{warning} +Currently the documents supported on customer invoices are: Invoice, Boleta, Debit Note and +Credit Note. +::: + +#### Journals + +When creating Sales Journals, the following information must be filled, in addition to the standard +fields on the Journals: + +##### Use Documents + +This field is used to define if the journal uses Document Types. It is only applicable to +Purchase and Sales journals, which are the ones that can be related to the different set of +document types available in Peru. By default, all the sales journals created use documents. + +##### Electronic Data Interchange + +This section indicates which EDI workflow is used in the invoice, for Peru we must select +“Peru UBL 2.1”. + +```{image} peru/peru-journal-edi.png +:alt: Journal EDI field. +``` + +:::{warning} +By default, the value Factur-X (FR) is always displayed, make sure you can uncheck it manually. +::: + +#### Partner + +##### Identification Type and VAT + +As part of the Peruvian localization, the identification types defined by the SUNAT are now +available on the Partner form, this information is essential for most transactions either on +the sender company and in the customer, make sure you fill in this information in your records. + +```{image} peru/peru-id-type.png +:alt: Partner identification type. +``` + +#### Product + +Additional to the basic information in your products, for the Peruvian localization, the UNSPC +Code on the product is a required value to be configured. + +```{image} peru/peru-unspc-code.png +:alt: UNSPC Code on products. +``` + +## Usage and testing + +### Customer invoice + +#### EDI Elements + +Once you have configured your master data, the invoices can be created from your sales order or +manually. Additional to the basic invoice information described on {doc}`our page about the +invoicing process <../accounting/customer_invoices/overview>`, there are a couple of +fields required as part of the Peru EDI: + +- **Document type**: The default value is “Factura Electronica” but you can manually change the + document type if needed and select Boleta for example. + + ```{image} peru/peru-invoice-document-type.png + :alt: Invoice document type field on invoices. + ``` + +- **Operation type**: This value is required for Electronic Invoice and indicates the transaction + type, the default value is “Internal Sale” but another value can be selected manually when needed, + for example Export of Goods. + + ```{image} peru/peru-operation-type.png + :alt: Invoice operation type field on invoices. + ``` + +- **EDI Affectation Reason**: In the invoice lines, additional to the Tax there is a field “EDI + Affectation Reason” that determines the tax scope based on the SUNAT list that is displayed. + All the taxes loaded by default are associated with a default EDI affection reason, if needed + you can manually select another one when creating the invoice. + + ```{image} peru/peru-tax-affectation-reason.png + :alt: Tax affectation reason in invoice line. + ``` + +#### Invoice validation + +Once you check all the information in your invoice is correct, you can proceed to validate it. This +action registers the account move and triggers the Electronic invoice workflow to send it to the +OSE and the SUNAT. The following message is displayed at the top of the invoice: + +```{image} peru/peru-posted-invoice.png +:alt: Sending of EDI Invoice in blue. +``` + +Asynchronous means that the document is not sent automatically after the invoice has been posted. + +(peru-electronic-invoice-status)= + +##### Electronic Invoice Status + +**To be Sent**: Indicates the document is ready to be sent to the OSE, this can be +done either automatically by Odoo with a *cron* that runs every hour, or the user can send it +immediately by clicking on the button “Sent now”. + +```{image} peru/peru-sent-manual.png +:alt: Send EDI manually. +``` + +**Sent**: Indicates the document was sent to the OSE and was successfully validated. As part of +the validation a ZIP file is downloaded and a message is logged in the chatter indicating the +correct Government validation. + +```{image} peru/peru-invoice-sent.png +:alt: Message on chatter when the invoice is valid. +``` + +In case there is a validation error the Electronic Invoice status remains in “To be sent” so the +corrections can be made and the invoice can be sent again. + +:::{warning} +One credit is consumed each time that you send a document for validation, in this sense if an +error is detected on an invoice and you send it one more time, two credits are consumed in +total. +::: + +#### Common Errors + +There are multiple reasons behind a rejection from the OSE or the SUNAT, when this happens Odoo +sends a message at the top of the invoice indicating the error details and in the most common +cases a hint to fix the issue. + +If a validation error is received, you have two options: + +- In case the error is related to master data on the partner, customer or taxes, you can simply + apply the change on the record (example customer identification type) and once it is done click + on the Retry button. + +- If the error is related to some data recorded on the invoice directly (Operation type, missing + data on the invoice lines), the correct solution is to reset the invoice to Draft, apply the + changes, and then send the invoice again to the SUNAT for another validation. + + ```{image} peru/peru-errors.png + :alt: List of common errors on invoices. + ``` + +For more detail please refert to [Common errors in SUNAT](https://www.nubefact.com/codigos-error-sunat/). + +#### Invoice PDF Report + +After the invoice is accepted and validated by the SUNAT, the invoice PDF report can be printed. +The report includes a QR code, indicating the invoice is a valid fiscal document. + +```{image} peru/peru-PDF.png +:alt: Invoice PDF report. +``` + +#### IAP Credits + +Odoo’s Electronic IAP offers 1000 credits for free, after these credits are consumed in your +production database, your company must buy new credits in order to process your transactions. + +Once you run out of credits a red label is displayed at the top of the invoice indicating that +additional credits are required, you can easily buy them by accessing the link provided in +the message. + +```{image} peru/peru-credits-IAP.png +:alt: Buying credits in the IAP. +``` + +In the IAP service includes packages with different pricing based on the number of credits. +The price list in the IAP is always displayed in EUR. + +#### Special Use cases + +##### Cancellation process + +Some scenarios require an invoice cancellation, for example, when an invoice was created by mistake. +If the invoice was already sent and validated by the SUNAT, the correct way to proceed is by +clicking on the button Request Cancellation: + +```{image} peru/peru-cancellation.png +:alt: Request invoice cancellation button. +``` + +In order to cancel an invoice, please provide a cancellation Reason. + +###### Electronic Invoice Status + +**To Cancel**: Indicates the cancellation request is ready to be sent to the OSE, this can be done +either automatically by Odoo with a *cron* that runs every hour, or the user can send it +immediately by clicking on the button “Send now”. Once it is sent, a cancellation ticket is +created, as a result the next message and CDR File are logged in the chatter: + +```{image} peru/peru-cancellation-cdr.png +:alt: Cancellation CDR sent by the SUNAT. +``` + +**Cancelled**: Indicates the cancellation request was sent to the OSE and was successfully +validated. As part of the validation a ZIP file is downloaded and a message is logged in the +chatter indicating the correct Government validation. + +```{image} peru/peru-cancelled.png +:alt: Invoice after cancellation. +``` + +:::{warning} +One credit is consumed on each cancellation request. +::: + +##### Export invoices + +When creating exportation invoices, take into account the next considerations: + +- The Identification type on your customer must be Foreign ID. +- Operation type in your invoice must be an Exportation one. +- The taxes included in the invoice lines should be EXP taxes. + +```{image} peru/peru-exp-invoice.png +:alt: Exportation invoices main data. +``` + +##### Advance Payments + +1. Create the advance payment Invoice and apply its related payment. +2. Create the final invoice without considering the advance payment. +3. Create a credit note for the Final invoice with the advance payment amount. +4. Reconcile the Credit note with the final invoice. +5. The remaining balance on the final invoice should be paid with a regular payment transaction. + +##### Detraction Invoices + +When creating invoices that is subject to Detractions, take into account the next considerations: + +1. All the products included in the invoice must have these fields configured: + + ```{image} peru/peru-detraction.png + :alt: Detraction fields on products. + ``` + +2. Operation type in your invoice must be `1001` + + ```{image} peru/peru-detraction-invoice.png + :alt: Detraction code on invoices. + ``` + +### Credit Notes + +When a correction or refund is needed over a validated invoice, a credit note must be generated, +for this just click on the button “Add Credit Note”, a part of the Peruvian localization you need +to prove a Credit Reason selecting one of the options in the list. + +```{image} peru/peru-credit-note.png +:alt: Add Credit Note from invoice. +``` + +:::{tip} +When creating your first credit Note, select the Credit Method: Partial Refund, this allows you +to define the credit note sequence. +::: + +By default the Credit Note is set in the document type: + +```{image} peru/peru-credit-note-document.png +:alt: Credit Note document type. +``` + +To finish the workflow please follow the instructions on {doc}`our page about Credit Notes +<../accounting/customer_invoices/credit_notes>`. + +:::{note} +The EDI workflow for the Credit notes works in the same way as the invoices. +::: + +### Debit Notes + +As part of the Peruvian localization, besides creating credit notes from an existing document +you can also create debit Notes. For this just use the button “Add Debit Note”. + +By default the Debit Note is set in the document type. + +(peru-edg)= + +### Electronic delivery guide 2.0 + +The *Guía de Remisión Electrónica* (GRE) is an electronic document generated by the shipper to +support the transportation or transfer of goods from one place to another, such as a warehouse or +establishment. In Odoo, there are several configuration steps needed before you can successfully use +this feature. + +The use of the *guía de remisión electrónica* electronic document is mandatory and required by +{{ SUNAT }} for taxpayers who need to transfer their products, except those under the *Single Simplified +Regime* (régimen único simplificado or RUS). + +#### Delivery guide types + +##### Sender + +The *Sender* delivery guide type is issued when a sale is made, a service is rendered (including +processing), goods are assigned for use, or goods are transferred between premises of the same +company and others. + +This delivery guide is issued by the owner of the goods (i.e., the sender) at the beginning of the +shipment. The sender delivery guide is supported in Odoo. + +:::{seealso} +[SUNAT guía de remisión](https://www.gob.pe/7899-guia-de-remision) +::: + +##### Carrier + +The *Carrier* delivery guide type justifies the transportation service the driver (or carrier) +performs. + +This delivery guide is issued by the carrier and must be issued to each shipper when the shipment +goes through public transport. + +:::{important} +The carrier delivery guide is **not** supported in Odoo. +::: + +:::{seealso} +[SUNAT guía de remisión transportista](https://tefacturo.pe/blog/sunat/guia-de-remision-electronica/guia-de-remision-transportista/) +::: + +#### Transportation types + +##### Private + +The *Private* transportation type option is used when the owner transfers goods using their own +vehicles. In this case, a sender's delivery guide must be issued. + +##### Public + +The *Public* transportation type option is used when an external carrier moves the goods. In +this case, two delivery guides must be issued: the sender's delivery guide and the carrier's +delivery guide. + +#### Direct submission to SUNAT + +The creation of the {{ GRE }} delivery guide in Odoo **must** be sent directly to the {{ SUNAT }}, +regardless of the electronic document provider: IAP, Digiflow, or {{ SUNAT }}. + +#### Required information + +Version 2.0 of the electronic delivery guide requires additional information on the general +configuration, vehicles, contacts, and products. In the general configuration, it is necessary to +add new credentials that you can retrieve from the {{ SUNAT }} portal. + +#### Cancellations + +**Both** the sender and the carrier can cancel the electronic waybill as long as the following +conditions are met: + +- The shipment has not been initiated. +- If the shipment has been initiated, the receiver **must** be changed before reaching the final + destination. + +:::{important} +The {{ SUNAT }} no longer uses the term "Anula", but now uses the term "Dar de baja" for +cancellations. +::: + +#### Testing + +The {{ SUNAT }} does not support a test environment. This means that any delivery guides that were +generated by mistake **will** be sent to the {{ SUNAT }}. + +If, by mistake, the waybill was created in this environment, it is necessary to delete it from the +{{ SUNAT }} portal. + +#### Configuration + +:::{important} +- Electronic sender's {{ GRE }} is currently the only supported type of waybill in Odoo. +- The delivery guide is dependent on the Odoo *Inventory* app, the {guilabel}`l10n_pe_edi` and + {guilabel}`l10n_pe` modules. +- A second user **must** be added for the creation of electronic documents. +::: + +After following the steps to configure the {ref}`electronic invoicing ` +and the {ref}`master data `, {ref}`install ` the +{guilabel}`Peruvian - Electronic Delivery Note 2.0` module (`l10n_pe_edi_stock_20`). + +Next, you need to retrieve the *client ID* and *client secret* from {{ SUNAT }}. To do so, follow the +[manual de servicios web plataforma nueva GRE](https://cpe.sunat.gob.pe/sites/default/files/inline-files/Manual_Servicios_GRE%20%281%29.pdf). + +:::{note} +In the {{ SUNAT }} portal, it is important to have the correct access rights enabled, as they may +differ from the user set for electronic invoicing. +::: + +These credentials should be used to configure the delivery guide general settings from +{menuselection}`Inventory --> Configuration --> Settings`, and scroll down to the {guilabel}`Peru +Delivery Guide` section. + +Configure the following {guilabel}`Sunat Delivery Guide API` fields: + +- {guilabel}`Guide Client ID`: the unique API *client ID* generated in the {{ SUNAT }} portal +- {guilabel}`Guide Client Secret`: the unique API *client secret* generated in the {{ SUNAT }} portal +- {guilabel}`Guide SOL User`: the RUC Number + SOL username +- {guilabel}`Guide SOL Password`: the SOL user password + +```{image} peru/gre-fields-example.png +:alt: Example for the SUNAT Delivery Guide API section configuration. +``` + +:::{note} +It is required to follow the format `RUC + UsuarioSol` (e.g., `20557912879SOLUSER`) for the +{guilabel}`Guide SOL User` field, depending on the user selected when generating the {{ GRE }} API +credentials in the {{ SUNAT }} portal. +::: + +##### Operator + +The *operator* is the vehicle's driver in cases where the delivery guide is through *private* +transport. + +To create a new operator, navigate to {menuselection}`Contacts --> Create` and fill out the contact +information. + +First, select {guilabel}`Individual` as the {guilabel}`Company Type`. Then, add the +{guilabel}`Operator License` in the {guilabel}`Accounting` tab of the contact form. + +For the customer address, make sure the following fields are complete: + +- {guilabel}`District` +- {guilabel}`Tax ID` ({guilabel}`DNI`/{guilabel}`RUC`) +- {guilabel}`Tax ID Number` + +```{image} peru/operator-configuration.png +:alt: Individual type operator configurations in the Contact form. +``` + +##### Carrier + +The *carrier* is used when the delivery guide is through *public* transport. + +To create a new carrier, navigate to {menuselection}`Contacts --> Create` and fill out the contact +information. + +First, select {guilabel}`Company` as the {guilabel}`Company Type`. Then, add the {guilabel}`MTC +Registration Number`, {guilabel}`Authorization Issuing Entity`, and the {guilabel}`Authorization +Number`. + +For the company address, make sure the following fields are complete: + +- {guilabel}`District` +- {guilabel}`Tax ID` ({guilabel}`DNI`/{guilabel}`RUC`) +- {guilabel}`Tax ID Number` + +```{image} peru/company-operator-configuration.png +:alt: Company type operator configurations in the Contact form. +``` + +##### Vehicles + +To configure the available vehicles, navigate to {menuselection}`Inventory --> Configuration --> +Vehicles` and fill in the vehicle form with the information needed for the vehicle: + +- {guilabel}`Vehicle Name` +- {guilabel}`License Plate` +- {guilabel}`Is M1 or L?` +- {guilabel}`Special Authorization Issuing Entity` +- {guilabel}`Authorization Number` +- {guilabel}`Default Operator` +- {guilabel}`Company` + +:::{important} +It is important to check the {guilabel}`Is M1 or L?` checkbox if the vehicle has fewer than four +wheels or fewer than eight seats. +::: + +```{image} peru/vehicle-not-m1-or-l-pe.png +:alt: Vehicle not selected as an M1 or L type with extra fields shown. +``` + +##### Products + +To configure the available products, navigate to {menuselection}`Inventory --> Products` and open +the product to be configured. + +Make sure that the applicable information in the product form is fully configured. The +{guilabel}`Partida Arancelaria` (Tariff Item) field needs to be completed. + +#### Generating a GRE + +Once the delivery from inventory is created during the sales workflow, make sure you complete the +{{ GRE }} fields on the top-right section of the transfer form for the fields: + +- {guilabel}`Transport Type` +- {guilabel}`Reason for Transfer` +- {guilabel}`Departure start date` + +It is also required to complete the {guilabel}`Vehicle` and {guilabel}`Operator` fields under the +{guilabel}`Guia de Remision PE` tab. + +The delivery transfer has to be marked as *Done* for the {guilabel}`Generar Guia de Remision` button +to appear on the left menu of the transfer form. + +```{image} peru/generate-gre-transferview.png +:alt: Generar Guia de Remision button on a transfer form in the Done stage. +``` + +Once the transfer form is correctly validated by {{ SUNAT }}, the generated XML file becomes available +in the chatter. You can now print the delivery slip that shows the transfer details and the QR +code validated by {{ SUNAT }}. + +```{image} peru/gre-delivery-slip.png +:alt: Transfer details and QR code on generated delivery slip. +``` + +#### Common errors + +- `Diferente prefijo para productos (T001 en algunos, T002 en otros)` + + At the moment, Odoo does not support the automation of prefixes for products. This can be done + manually for each product output. This can also be done for non-storable products. However, keep + in mind that there will be no traceability. + +- `2325 - GrossWeightMeasure - El dato no cumple con el formato establecido "Hace falta el campo" + "Peso"" en el producto` + + This error occurs when the weight on the product is set as `0.00`. To fix this, you need to cancel + the waybill and recreate it. Make sure that you fix the weight on the product before creating the + new waybill, or it will result in the same error. + +- `JSONDecodeError: Expecting value: line 1 column 1 (char 0) when creating a Delivery Guide` + + This error is typically generated due to SOL user issues. Verify the user's connection with the + {{ SUNAT }}; the SOL user must be established with the company RUT + user ID. For example + `2012188549JOHNSMITH`. + +- `El número de documento relacionado al traslado de mercancía no cumple con el formato establecido: + error: documento relacionado` + + The *Related Document Type* and *Related Document Number* fields only apply to invoices and + receipts. + +- `400 Client error: Bad Request for URL` + + This error is not solvable from Odoo; it is advised you reach out to the {{ SUNAT }} and verify the + user. It may be necessary to create a new user. + +- `Invalid content was found starting with element 'cac:BuyerCustomerParty'` + + This error occurs when the transfer reason is set as *other*. Please select another option. + Following to the official documentation of the {{ SUNAT }}'s waybill guide, the transfer reasons *03 + (sale with shipment to third party)* or *12 (others)* does not work in Odoo, since you should not + have an empty or blank customer. + +- `Duda cliente: consumo de créditos IAP al usar GRE 2.0` + + For live clients using IAP, no credit is consumed (in theory) because it does not go through the + OSE, i.e., these documents are directly sent to the {{ SUNAT }}. + +- `Errores con formato credenciales GRE 2.0 (traceback error)` + + Odoo currently throws an error with a traceback instead of a message that the credentials are not + correctly configured in the database. If this occurs on your database, please verify your + credentials. + +### eCommerce electronic invoicing + +First, {ref}`install ` the **Peruvian eCommerce** (`l10n_pe_website_sale`) module. + +The **Peruvian eCommerce** module enables the features and configurations to: + +- allow clients to create online accounts for **eCommerce** purposes; +- support required fiscal fields in the **eCommerce** application; +- receive payments for sales orders online; +- generate electronic documents from the **eCommerce** application. + +:::{note} +The **Peruvian eCommerce** module is dependent on the previous installation of the +**Invoicing** or **Accounting** app, as well as the **Website** app. +::: + +(peru-ecommerce-configuration)= + +#### Configuration + +After configuring the Peruvian {ref}`electronic invoicing ` flow, complete +the following configurations for the **eCommerce** flow: + +- {ref}`Client account registration `; +- {ref}`Automatic invoice `; +- {doc}`../../websites/ecommerce/products`: Set the {guilabel}`Invoicing Policy` to + {guilabel}`Ordered quantities` and define the desired {guilabel}`Customer taxes`. +- {doc}`../payment_providers`; +- {doc}`../../websites/ecommerce/checkout_payment_shipping/shipping`: For each shipping method, set + the {guilabel}`Provider` field to {guilabel}`Fixed Price`. Then, set a {guilabel}`Fixed Price` + amount greater than `0.00` (not zero), as the shipping method price is added to the invoice line. + +:::{note} +- [Mercado Pago](https://www.mercadopago.com/) is an online payment provider supported in Odoo + that covers several countries, currencies, and payment methods in Latin America. +- Make sure to define a {guilabel}`Sales Price` on the {guilabel}`Delivery Product` of the + shipping method to prevent errors when validating the invoice with {{ SUNAT }}. +- To offer free delivery, manually remove the {guilabel}`Delivery Product`, or at least use + `$0.01` (one cent) for the invoice to be validated with SUNAT. +::: + +:::{seealso} +{doc}`Set up the Mercado Pago payment provider. <../payment_providers/mercado_pago>` +::: + +#### Invoicing flow for eCommerce + +Once the {ref}`configurations ` are all set, fiscal input fields will +be available during the checkout process for signed-in customers. + +When customers enter their fiscal data at checkout and complete a successful purchase, the invoice +is generated with the corresponding {{ EDI }} elements. The document type (Boleta/Factura) is selected +based on their tax ID (RUC/DNI). The invoice must then {ref}`be sent to the OSE and the SUNAT +`. By default, all published invoices are sent once a day through +a scheduled action, but you can also send each invoice manually if needed. + +Once the invoice is validated with {{ SUNAT }}, customers can download the .zip file with the CDR, XML, +and PDF files directly from the customer portal by clicking the {guilabel}`Download` button. + +## Reports + +(peru-reports-ple)= + +### Permanent inventory reports: {{ PLE }} 12.1 and {{ PLE }} 13.1 + +Odoo can produce two permanent inventory reports as `.txt` files for Peruvian accounting: {{ PLE }} 12.1 +and {{ PLE }} 13.1. All inventory transactions made need to be reported. + +- {{ PLE }} 12.1 **only tracks inventory in physical units**, focusing on the inflow and outflow of + goods for effective management and planning. +- {{ PLE }} 13.1 tracks **both physical quantities and monetary values of inventory**, providing a + comprehensive view for tax and management purposes. + +Both reports must be maintained semi-annually (January-June and July-December), with monthly +transaction details reported within these periods. The submission deadlines are October 1st for the +first semester and April 1st for the second semester, in accordance with the *Resolución de +Superintendencia N° 169-2015*. + +#### Configuration + +Before generating the {{ PLE }} 12.1 or {{ PLE }} 13.1 reports, make sure the {guilabel}`Peru - Stock +Reports` (`l10n_pe_reports_stock`) module is installed, then update the fields for: + +- {ref}`Products ` +- {ref}`Warehouses ` +- {ref}`Inventory transfers ` + +(peru-reports-ple-products)= + +##### Products + +Several configurations related to the product or product category are necessary for {{ PLE }} reporting: + +- **Type of existence**: For all products needing {{ PLE }} reporting, go to the product record's + {guilabel}`Accounting` tab and select the {guilabel}`Type of Existence` according to {{ SUNAT }}'s + table 5 for inventory reporting. +- **Automatic inventory valuation**: For storable goods ({dfn}`products with tracked inventory`), + use {doc}`automatic inventory valuation + <../../inventory_and_mrp/inventory/product_management/inventory_valuation/inventory_valuation_config>`. + Once automatic inventory valuation is enabled, this valuation method can be enabled for + a product's {ref}`product category `. +- **Costing method:** Storable goods must use a {doc}`costing method + <../../inventory_and_mrp/inventory/product_management/inventory_valuation/inventory_valuation_config>` + **other** than {guilabel}`Standard Price`, as the journal entries generated from stock moves are + used to populate the {{ PLE }} reports. + +(peru-reports-ple-warehouses)= + +##### Warehouses + +When {doc}`setting up a warehouse +<../../inventory_and_mrp/inventory/warehouses_storage/inventory_management/warehouses>`, the +{guilabel}`Annex Establishment Code` field must be filled. This code acts as a unique ID for each +warehouse and should only be a numeric combination, containing between 4 to 7 digits. + +(peru-reports-ple-transfers)= + +##### Inventory transfers + +Transferring inventory is a key process captured in the {{ PLE }} 12.1 and {{ PLE }} 13.1 reports. +{doc}`Inventory transfers <../../inventory_and_mrp/inventory/shipping_receiving/daily_operations>` +include both incoming and outgoing shipments. + +When validating an inventory transfer (either on a warehouse receipt or delivery order), select the +{guilabel}`Type of Operation (PE)` performed according to {{ SUNAT }}'s table 12 for permanent inventory +reporting. + +#### Generate a .txt file for permanent inventory Kardex reports + +{{ PLE }} 12.1 and 13.1 come as two separate books. The books need to be downloaded in `.txt` file +format from Odoo, and then they should be submitted to the {{ SUNAT }} {{ PLE }} software. + +On the {ref}`Inventory Valuation Report `, click +the {guilabel}`PLE Reports` button. Then, select the {guilabel}`Period` and choose a report to +export: either the {guilabel}`PLE 12.1` or {guilabel}`PLE 13.1`. Odoo generates a `.txt` file +for the chosen report. + +```{image} peru/l10n-ple-export-button.png +:alt: Export Buttons selection +``` + +:::{note} +Only a download of the report in `.txt` format is available. There is no preview or visualization +available within Odoo. +::: + diff --git a/content/applications/finance/fiscal_localizations/philippines.md b/content/applications/finance/fiscal_localizations/philippines.md new file mode 100644 index 000000000..f929c5716 --- /dev/null +++ b/content/applications/finance/fiscal_localizations/philippines.md @@ -0,0 +1,206 @@ +# Philippines + +## Configuration + +{ref}`Install ` the {guilabel}`🇵🇭 Philippines` {ref}`fiscal localization package +` to get all the default accounting features of the Philippine +localization, such as a chart of accounts, taxes, and reports. These provide a base template to get +started with using Philippine accounting. + +:::{note} +- When creating a new database and selecting the `Philippines` as a country, the fiscal + localization module **Philippines - Accounting** is automatically installed. +- If the module is installed in an existing company, the **chart of accounts** and **taxes** will + *not* be replaced if there are already posted journal entries. +::: + +### Chart of accounts and taxes + +A minimum configuration default chart of accounts is installed, and the following types of taxes are +installed and linked to the relevant account: + +- Sales and Purchase VAT 12% +- Sales and Purchase VAT Exempt +- Sales and Purchase VAT Zero-Rated +- Sales and Purchase Withholding + +For the withholding taxes ({menuselection}`Accounting --> Configuration --> Taxes`), there is an +additional {guilabel}`Philippines ATC` field under the {guilabel}`Philippines` tab. + +```{image} philippines/philippines-atc-code.png +:alt: Philippines ATC code field set on taxes. +``` + +:::{note} +Taxes' ATC codes are used for the {ref}`BIR 2307 `, +{ref}`SAWT and QAP reports `. If a tax is created +manually, its ATC code must be added. +::: + +### Contacts + +When a company or an individual (not belonging to a company) contact is located in the Philippines, +fill in the {guilabel}`Tax ID` field with their `Taxpayer Identification Number (TIN)`. + +For individuals not belonging to a company, identify them by using the following additional fields: + +- {guilabel}`First Name` +- {guilabel}`Middle Name` +- {guilabel}`Last Name` + +:::{note} +For both {guilabel}`Company` and {guilabel}`Individual`, the TIN should follow the +`NNN-NNN-NNN-NNNNN` format. The branch code should follow the last digits of the TIN, or else it +can be left as `00000`. +::: + +## Reports + +(localizations-philippines-report-bir1207)= + +### BIR 2307 report + +**BIR 2307** reports, also known as [Certificate of Creditable Tax Withheld at Source](https://www.bir.gov.ph/bir-forms?tab=Certificates&idTag=BIR2307&datasetCode=3381&label=2307&type=TAB%20LINK), +can be generated for purchase orders and vendor payments with the applicable withholding taxes. + +To generate a BIR 2307 report, select one or multiple vendor bills from the list view, and click +{menuselection}`Action --> Download BIR 2307 XLS`. + +```{image} philippines/philippines-multi-bill.png +:alt: Multiple vendor bills selected with action to "Download BIR 2307 XLS". +``` + +:::{tip} +The same action can be performed on a vendor bill from the form view. +::: + +In the pop-up that opens, review the selection and click {guilabel}`Generate`. + +```{image} philippines/philippines-generate.png +:alt: Pop up menu to generate BIR 2307 XLS file. +``` + +This generates the `Form_2307.xls` file that lists all the vendor bill lines with the applicable +withholding tax. + +The process above can also be used for a *single* vendor {doc}`payment <../accounting/payments>` if +it is linked to one or more {doc}`vendor bills <../accounting/payments>` with applied withholding +taxes. + +:::{note} +- If no withholding tax is applied, then the XLS file will not generate records for those vendor + bill lines. +- When grouping payments for multiple bills, Odoo splits the payments based on the contact. From + a payment, clicking {menuselection}`Action --> Download BIR 2307 XLS` generates a report that + only includes vendor bills related to that contact. +::: + +:::{important} +Odoo cannot generate the BIR 2307 PDF report or DAT files directly. The generated +{file}`Form_2307.xls` file can be exported to an *external* tool to convert it to BIR DAT or PDF +format. +::: + +### SLSP report + +To access the {abbr}`SLSP (Summary List of Sales and Purchases)` report, go to +{menuselection}`Accounting --> Reporting --> Summary List of Sales and Purchases`. + +Click the buttons at the top to display the desired report: + +- {guilabel}`Sales` + for the + {abbr}`SLS (Summary List of Sales)` + report. + All customer invoices with the associated sales taxes applied are shown in this report. +- {guilabel}`Purchases` + for the + {abbr}`SLP (Summary List of Purchases)` + report. + All vendor bills with the associated purchase taxes applied are shown in this report. + +```{image} philippines/slsp.png +:alt: SLSP Report +``` + +By default, both reports exclude journal entries containing partners without a TIN number set and +those with importation taxes set. To view or hide them, click {guilabel}`Options:` and select the +required filter: + +- {guilabel}`Including Partners Without TIN` +- {guilabel}`Including Importations` + +To export the {abbr}`SLSP (Summary List of Sales and Purchases)` report, click {guilabel}`Export +SLSP`. + +:::{important} +Odoo cannot generate the DAT files directly. The {guilabel}`Export SLSP` and {guilabel}`XLSX` +buttons are used to export an XLSX file, which can be processed using an *external* tool to +convert it to the DAT format. +::: + +### 2550Q tax report + +The tax report report is accessible by navigating to {menuselection}`Accounting --> Reporting --> +Statement Reports --> Tax Report --> 2550Q(PH)`. The form is based on the latest *2550Q +(Quarterly Value-Added Tax Return)* Jan. 2023 version. + +```{image} philippines/2550Q.png +:alt: 2550Q Tax Report +``` + +:::{tip} +Most lines in the tax report are automatically computed based on the taxes. For more accurate +reporting and filing of the tax report, manual journal entries can also be mapped to the tax +report through preconfigured **Tax Grids** for each tax report line. +::: + +:::{important} +Odoo cannot generate the 2550Q BIR formatted PDF report directly. It should be used as a +reference when externally filing the form manually or online. +::: + +(localizations-philippines-report-qap-sawt)= + +### QAP & SAWT reports + +To access the {abbr}`QAP (Quarterly Alphalist of Payees)` and {abbr}`SAWT (Summary Alphalist of +Withholding Tax)` reports, go to {menuselection}`Accounting --> Reporting --> Tax Return`, click +the {icon}`fa-book` {guilabel}`Report:` button, and select {guilabel}`SAWT & QAP (PH)`. + +Click the buttons at the top to display the desired report: + +- {guilabel}`SAWT` + for the + {abbr}`SAWT (Summary Alphalist of Withholding Tax)` + report. + All customer invoices with the associated sales witholding taxes applied are shown in this + report. +- {guilabel}`QAP` + for the + {abbr}`QAP (Quarterly Alphalist of Payees)` + report. + All vendor bills with the associated purchase witholding taxes applied are shown in this report. + +```{image} philippines/philippines-sawt.png +:alt: SAWT & QAP Report +``` + +To export the {abbr}`SAWT (Summary Alphalist of Withholding Tax)` and {abbr}`QAP (Quarterly +Alphalist of Payees)` reports in XLSX format, click {guilabel}`Export SAWT & QAP`. + +:::{important} +Odoo cannot generate the DAT files directly. The {guilabel}`Export SAWT & QAP` and +{guilabel}`XLSX` buttons are used to export an XLSX file, which can be processed using an +*external* tool to convert it to the DAT format. +::: + +## Check printing + +The Philippine check print layout follows the latest {abbr}`PCHC (Philippine Clearing House +Corporation)` standardized format. To enable check printing, go to {menuselection}`Accounting --> +Configuration --> Settings`, enable {guilabel}`Checks` and set the {guilabel}`Check Layout` to +`Print Check - PH`. + +Checks are printed using the {doc}`standard workflow <../accounting/payments/pay_checks>`. + diff --git a/content/applications/finance/fiscal_localizations/romania.md b/content/applications/finance/fiscal_localizations/romania.md new file mode 100644 index 000000000..a4c1bd8dc --- /dev/null +++ b/content/applications/finance/fiscal_localizations/romania.md @@ -0,0 +1,174 @@ +# Romania + +## Configuration + +{ref}`Install ` the following modules to get all the features of the Romanian +localization. + +```{eval-rst} +.. list-table:: + :header-rows: 1 + + * - Name + - Technical name + - Description + * - :guilabel:`Romania - Accounting` + - `l10n_ro` + - Default :ref:`fiscal localization package `. + * - :guilabel:`Romanian SAF-T Export` + - `l10n_ro_saft` + - Module to generate the **D.406 declaration** in the SAF-T format. +``` + +```{image} romania/romania-modules.png +:alt: Modules for the Romanian localization +``` + +:::{seealso} +{doc}`Documentation on e-invoicing’s legality and compliance in Romania +<../accounting/customer_invoices/electronic_invoicing/romania>` +::: + +## D.406 declaration + +Starting January 1, 2023, companies registered for tax purposes in Romania must report their +accounting data to the Romanian Tax Agency monthly or quarterly in the D.406 declaration. + +Odoo provides all you need to export the data of this declaration in the SAF-T XML format, which you +can validate and sign using the software provided by the Romanian Tax Agency. + +:::{note} +Currently, Odoo only supports the generation of the monthly/quarterly D.406 declaration +(containing journal entries, invoices, vendor bills, and payments). The yearly declaration +(including assets) and the on-demand declaration (including inventory) are not yet supported. +::: + +### Configuration + +#### Company + +- Under {guilabel}`Settings --> General Settings`, in the **Companies** section, click + {guilabel}`Update Info` and fill in the company's {guilabel}`Country`, {guilabel}`City`, and + {guilabel}`Telephone Number`. + +- Provide your company's {abbr}`CUI (Codul Unic de Inregistrare)` number or {abbr}`CIF (*Codul de + identificare fiscală*)` number (for foreign companies) in the {guilabel}`Company ID` field, + without the `RO` prefix (e.g., `18547290`). + +- If your company is **registered** for VAT in Romania, fill in the {guilabel}`Tax ID` field number, + including the `RO` prefix (e.g., `RO18547290`). If the company is **not** registered for + VAT in Romania, you **must not** fill in the {guilabel}`Tax ID` field. + +- Open the **Contacts** app and search for your company. Open your company's profile, and in the + {guilabel}`Accounting` tab, click {guilabel}`Add a line` and add your **bank account number** if + not informed already. Make sure the profile is set as {guilabel}`Company` above the **name**. + + - You must have at least one **contact person** linked to your company in the **Contacts** app. + If no **contact person** is linked, create a new one by clicking {guilabel}`New`, set it + as {guilabel}`Individual`, and select your company in the {guilabel}`Company name` field. + +#### Chart of accounts + +To generate a file receivable by the Romanian Tax Agency, the chart of accounts must not deviate +from an official chart of accounts, such as: + +- the chart of accounts for commercial companies (*PlanConturiBalSocCom*), which is installed + by default when creating a company with the Romanian localization or; +- the chart of accounts for companies following [IFRS](https://www.ifrs.org/) (*PlanConturiIFRS*). + +Under {guilabel}`Settings --> Accounting`, in the **Romanian localization** section, set the +{guilabel}`Tax Accounting Basis` to reflect the accounting regulations and Chart of Accounts used +by the company. + +:::{seealso} +{doc}`../accounting/get_started/chart_of_accounts` +::: + +#### Customer and supplier + +Fill in the {guilabel}`Country`, {guilabel}`City`, and {guilabel}`Zip Code` of each partner that +appears in your invoices, vendor bills, or payments through the **Contacts** app. + +For partners that are companies, you must fill in the VAT number (including the country prefix) in +the {guilabel}`Tax ID` field. If the partner is a company based in Romania, you may instead fill in +the CUI number (without the 'RO' prefix) in the {guilabel}`Company ID` field. + +#### Tax + +You must indicate the {guilabel}`Romanian SAF-T Tax Type` (3-digit number) and {guilabel}`Romanian +SAF-T Tax Code` (6-digit number) on each of the taxes you use. This is already done for the taxes +that exist by default in Odoo. To do so, go to {menuselection}`Accounting --> Configuration --> +Taxes`, select the tax you wish to modify, click the {guilabel}`Advanced Options` tab, and fill in +the **tax type** and **tax code** fields. + +:::{note} +The **tax type** and **tax code** are codes defined by the Romanian Tax Agency for the **D.406 +declaration**. These can be found in the Excel spreadsheet published as guidance for completing +the declaration, which you can find on the [website of the Romanian Tax Agency](https://www.anaf.ro/anaf/internet/ANAF/despre_anaf/strategii_anaf/proiecte_digitalizare/saf_t/). +::: + +:::{seealso} +{doc}`../accounting/taxes` +::: + +#### Product + +For some types of goods transactions, the {guilabel}`Intrastat Code` (Cod NC) must be configured +on the product, as it is required by Romanian law: + +- import / export transactions; +- acquisitions / supplies of food products subjected to reduced VAT rate; +- intra-community movements subjected to intrastat reporting; +- acquisitions / supplies subjected to local reversed VAT charge (depending on Cod NC); and +- transactions with excisable products for which excise duties are determined based on the Cod NC. + +If the Intrastat Code is not specified on a non-service product, the default code '0' will be used. + +To configure the {guilabel}`Intrastat Codes`, go to +{menuselection}`Accounting --> Customers --> Products`, select a product, and in the +{guilabel}`Accounting` tab, set a {guilabel}`Commodity Code`. + +:::{seealso} +{doc}`../accounting/reporting/intrastat` +::: + +#### Vendor bill + +You must check the {guilabel}`Is self-invoice (RO)?` checkbox in the {guilabel}`Other Info` tab for +any vendor bill that is a self-invoice (i.e. a vendor bill that you issued yourself in the absence +of an invoice document received from a supplier). + +### Generating the declaration + +#### Exporting your data + +To export the XML for the D.406 declaration, go to {menuselection}`Accounting --> Reports --> +General Ledger` and click on {guilabel}`SAF-T`. + +```{image} romania/romania-saft-button.png +:align: center +:alt: Click on the 'SAF-T' button to export the D.406 XML declaration. +``` + +You can then validate and sign the XML file using the Romanian Tax Agency's validation software, +*DUKIntegrator*. + +#### Signing the report + +Download and install the *DUKIntegrator* validation software found on the [website of the Romanian +Tax Agency](https://www.anaf.ro/anaf/internet/ANAF/despre_anaf/strategii_anaf/proiecte_digitalizare/saf_t/). + +Once you have generated the XML, open 'DUKIntegrator' and select the file you have just generated. + +Click on {guilabel}`Validare + creare PDF` to create an **unsigned** PDF containing your report, or +{guilabel}`Validare + creare PDF semnat` to create a **signed** PDF containing your report. + +```{image} romania/romania-dukintegrator.png +:align: center +:alt: The DUKIntegrator validation software. +``` + +If the *DUKIntegrator* validator detects errors or inconsistencies in your data, it generates a file +that explains the errors. In this case, you need to correct those inconsistencies in your data +before you can submit the report to the Romanian Tax Agency. + diff --git a/content/applications/finance/fiscal_localizations/saudi_arabia.md b/content/applications/finance/fiscal_localizations/saudi_arabia.md new file mode 100644 index 000000000..8757d2258 --- /dev/null +++ b/content/applications/finance/fiscal_localizations/saudi_arabia.md @@ -0,0 +1,141 @@ +# Saudi Arabia + +## Configuration + +{ref}`Install ` the following modules to get all the features of the Saudi Arabian +localization: + +```{eval-rst} +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - Name + - Technical name + - Description + * - Saudi Arabia - Accounting + - `l10n_sa` + - Default :ref:`fiscal localization package ` + * - Saudi Arabia - E-invoicing + - `l10n_sa_edi` + - ZATCA e-invoices implementation + * - Saudi Arabia - Point of Sale + - `l10n_sa_pos` + - Point of Sale compliance +``` + +## ZATCA e-invoices + +The ZATCA e-invoicing system is designed to streamline and digitize the invoicing process for +businesses operating in Saudi Arabia. + +:::{seealso} +[ZATCA e-invoicing page](https://zatca.gov.sa/en/E-Invoicing/Pages/default.aspx) +::: + +### Company information + +Go to {menuselection}`Settings --> General Settings --> Companies`, click {guilabel}`Update info`, +and ensure the following company information is complete and up-to-date. + +- The full {guilabel}`Company Name`. +- All relevant {guilabel}`Address` fields, including the {guilabel}`Building Number` and + {guilabel}`Plot Identification` (four digits each). +- Select an enterprise {guilabel}`Identification Scheme`. It is recommended to use the + {guilabel}`Commercial Registration Number`. +- Enter the {guilabel}`Identification Number` for the selected {guilabel}`Identification Scheme`. +- The {guilabel}`VAT` number. +- Ensure the {guilabel}`Currency` is set to {guilabel}`SAR`. + +:::{note} +It is also necessary to fill out similar information for partner companies. +::: + +### Simulation mode + +:::{important} +It is strongly recommended to thoroughly test all invoicing workflows using the Fatoora +**simulation** portal first, as **any** invoice submitted to the regular Fatoora portal will be +accounted for, which could lead to fines and penalties. +::: + +#### Fatoora simulation portal + +Log in on the [Fatoora portal](https://fatoora.zatca.gov.sa/) using the company's ZATCA +credentials. Then, click the {guilabel}`Fatoora Simulation Portal` button to switch to the +simulation portal. + +:::{seealso} +[ZACTA Fatoora portal user manual version 3 (May 2023)](https://zatca.gov.sa/en/E-Invoicing/Introduction/Guidelines/Documents/Fatoora_Portal_User_Manual_English.pdf) +::: + +(saudi-arabia-api-mode)= + +#### ZATCA API integration + +On Odoo, go to {menuselection}`Accounting --> Configuration --> Settings`. Under {guilabel}`ZATCA +API Integration`, select the {guilabel}`Simulation (Pre-Production)` {guilabel}`API mode` and click +{guilabel}`Save`. + +(saudi-arabia-journals)= + +#### Sales journals + +Each sales journal on Odoo needs to be configured. To do so, go to {menuselection}`Accounting --> +Configuration --> Journals`, open any sales journal (e.g., Customer Invoices), and go to the +{guilabel}`ZATCA` tab. Once there, enter any {guilabel}`Serial Number` to identify the journal. + +:::{note} +The same serial number can be used for all of the company's sales journals. +::: + +Next, click {guilabel}`Onboard Journal`. In the dialog box, providing an {abbr}`OTP (one-time +password)` code is required. To retrieve it, open the [Fatoora simulation portal](https://fatoora.zatca.gov.sa/), click {guilabel}`Onboard New Solution Unit/Device`, choose the +number of OTP codes to generate (one per journal to configure), and click {guilabel}`Generate OTP +Code`. Copy an OTP code, it into the dialog box on Odoo, and click {guilabel}`Request`. + +:::{note} +OTP codes expire after one hour. +::: + +:::{tip} +If any issue occurs during onboarding, click {guilabel}`Regenerate CSR` to start again. +::: + +#### Testing + +When confirming an invoice, there is now an option to process the invoice, sending it directly the +Fatoora simulation portal. Odoo displays the portal's response after each submission. Only rejected +invoices can be reset to draft and edited on Odoo. Furthermore, at the end of each day, Odoo sends +all unprocessed invoices to the portal. + +:::{tip} +- Testing all invoicing workflows, preferably with real invoices and for a reasonable amount of + time, is recommended. +- Compare the invoices received statistics page on the Fatoora simulation portal with the list of + invoices on Odoo to ensure both align. +::: + +#### Taxes + +When using a **0% tax** in a customer invoice, it is necessary to specify the reason behind such a +rate. To configure taxes, go to {menuselection}`Accounting --> Configuration --> Settings --> +Taxes`, and open the tax to edit. Under the {guilabel}`Advanced Options`, select an +{guilabel}`Exemption Reason Code` and click {guilabel}`Save`. + +When using **retention** or **withholding an amount** in a customer invoice, the tax used to retain +the amount needs to be specified. + +### Production mode + +When ready for production, change the {ref}`API mode ` to +{guilabel}`Production` and click {guilabel}`Save`. + +:::{warning} +Setting the {guilabel}`API mode` to {guilabel}`Production` is **irreversible**. +::: + +The sales journals initially linked to the simulation portal now needs to be linked to the regular +portal. To do so, {ref}`onboard the journals ` again, ensuring to use the +regular [Fatoora portal](https://fatoora.zatca.gov.sa/) this time. + diff --git a/content/applications/finance/fiscal_localizations/singapore.md b/content/applications/finance/fiscal_localizations/singapore.md new file mode 100644 index 000000000..24527b568 --- /dev/null +++ b/content/applications/finance/fiscal_localizations/singapore.md @@ -0,0 +1,66 @@ +# Singapore + +## Add PayNow QR codes to invoices + +PayNow is a payment service platform that allows customers to make instant domestic payments to +individuals and merchants in Singapore dollars via online and mobile banking. + +### Activate QR codes + +Go to {menuselection}`Accounting --> Configuration --> Settings`. Under the {guilabel}`Customer +Payments` section, activate the {guilabel}`QR Codes` feature. + +### PayNow bank account configuration + +Go to {menuselection}`Contacts --> Configuration --> Bank Accounts` and select the bank account for +which you want to activate PayNow. Set the {guilabel}`Proxy Type` and fill in the {guilabel}`Proxy +Value` field depending on the type you chose. + +:::{important} +- The account holder's country must be set to `Singapore` on its contact form. +- The account holder's city is mandatory. +- You could also include the invoice number in the QR code by checking the {guilabel}`Include + Reference` checkbox. +::: + +```{image} singapore/sg-paynow-bank-setting.png +:alt: PayNow bank account configuration +``` + +:::{seealso} +{doc}`../accounting/bank` +::: + +### Bank journal configuration + +Go to {menuselection}`Accounting --> Configuration --> Journals`, open the bank journal, then fill +out the {guilabel}`Account Number` and {guilabel}`Bank` under the {guilabel}`Journal Entries` tab. + +```{image} singapore/sg-bank-account-journal-setting.png +:alt: Bank Account's journal configuration +``` + +### Issue invoices with PayNow QR codes + +When creating a new invoice, open the {guilabel}`Other Info` tab and set the {guilabel}`Payment +QR-code` option to *EMV Merchant-Presented QR-code*. + +```{image} singapore/sg-qr-code-invoice-setting.png +:alt: Select EMV Merchant-Presented QR-code option +``` + +Ensure that the {guilabel}`Recipient Bank` is the one you configured, as Odoo uses this field to +generate the PayNow QR code. + +(singapore-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. + +:::{important} +To {ref}`configure the Employment Hero API ` for **Singapore**, +use the following value as {guilabel}`Payroll URL`: `https://apisg.yourpayroll.io/`. +::: + diff --git a/content/applications/finance/fiscal_localizations/spain.md b/content/applications/finance/fiscal_localizations/spain.md new file mode 100644 index 000000000..2ad1fd53a --- /dev/null +++ b/content/applications/finance/fiscal_localizations/spain.md @@ -0,0 +1,210 @@ +# Spain + +## Configuration + +Install the 🇪🇸 **Spanish** {doc}`fiscal localization package <../fiscal_localizations>` to get all +the default accounting features of the Spanish localization. + +Three **Spanish** localizations exist, each with its own pre-configured **PGCE** charts of accounts: + +- Spain - SMEs (2008); +- Spain - Complete (2008); +- Spain - Non-profit entities (2008). + +To select the one to use, go to {menuselection}`Accounting --> Configuration --> Settings` and +select a package in the {guilabel}`Fiscal Localization` section. + +:::{warning} +You can only change the accounting package as long as you have not created any accounting entry. +::: + +:::{seealso} +- {doc}`Documentation on e-invoicing’s legality and compliance in Spain + <../accounting/customer_invoices/electronic_invoicing/spain>` +- {doc}`Documentation on e-invoicing’s legality and compliance in the Basque Country + <../accounting/customer_invoices/electronic_invoicing/basque_country>` +::: + +## Chart of accounts + +You can reach the **Chart of Accounts** by going to {menuselection}`Accounting --> Configuration --> +Accounting: Chart of Accounts`. + +:::{tip} +When you create a new Odoo Online database, **Spain - SMEs (2008)** is installed by default. +::: + +## Taxes + +Default Spain-specific taxes are created automatically when the +{guilabel}`Spanish - Accounting (PGCE 2008) (l10n_es)` module is installed, and tax reports are +available when installing the module {guilabel}`Spain - Accounting (PGCE 2008) (l10n_es_reports)`. +Each tax impacts the Spain-specific **tax reports (Modelo)**, available by going to +{menuselection}`Accounting --> Reporting --> Statements Reports: Tax Report`. + +## Reports + +Here is the list of Spanish-specific statement reports available: + +- Balance Sheet; +- Profit & Loss; +- EC Sales List; +- Tax Report (Modelo 111); +- Tax Report (Modelo 115); +- Tax Report (Modelo 130); +- Tax Report (Modelo 303); +- Tax Report (Modelo 347); +- Tax Report (Modelo 349); +- Tax Report (Modelo 390). + +You can access Spain-specific tax reports by clicking on the **book** icon when on a report and +selecting its Spain-specific version: {guilabel}`(ES)`. + +```{image} spain/modelo-reports.png +:alt: Spain-specific tax reports. +``` + +### Modelo 130 + +#### Change the percentage + +If you wish to change the percentage computation of the box {guilabel}`[04]` under the {guilabel}`I` +section and/or of the box {guilabel}`[09]` under the {guilabel}`II` section: + +1. Activate the {ref}`developer mode `, go to {menuselection}`Accounting --> + Reporting --> Tax Report`, and select the report {guilabel}`Tax report (Modelo 130)`. +2. Click the {icon}`fa-cogs` ({guilabel}`cogs`) icon to the right of {guilabel}`Report: Tax Report + (Mod 130) (ES)`. +3. Click the box you wish to change, and in the pop-up window, click on the {guilabel}`percentage` + line. In the new pop-up window, change the value in the {guilabel}`Formula` field to the + percentage you wish to apply. + Repeat this action if you wish to modify the other box as well. + +#### Report agriculture activity + +If you wish to have any amount input in the {guilabel}`II` section (from boxes {guilabel}`[08]` to +{guilabel}`[11]`), you must change the **industry** of the corresponding contact to +{guilabel}`Agriculture`: + +1. Go to the contact form ({menuselection}`Accounting --> Customers --> Customers` + or {menuselection}`Accounting --> Vendors --> Vendors`, for example), and select a contact. +2. In the {guilabel}`Sales & Purchase` tab, set the {guilabel}`Industry` field to + {guilabel}`Agriculture`. + +Repeat this operation for all contacts related to the **agriculture** industry. + +## TicketBAI + +[Ticket BAI](https://www.gipuzkoa.eus/es/web/ogasuna/ticketbai) or **TBAI** is an e-Invoicing +system used by the Basque government and its three provincial councils (Álava, Biscay, and +Gipuzkoa). + +Odoo supports the **TicketBAI (TBAI)** electronic invoicing format for all three regions of the +**Basque Country**. To enable **TicketBAI**, set your company's {guilabel}`Country` and +{guilabel}`Tax ID` under {menuselection}`Settings --> General Settings` in the {guilabel}`Companies` +section. + +Then, {ref}`install ` the module {guilabel}`Spain -TicketBAI (l10n_es_edi_TBAI)`, +go to {menuselection}`Accounting --> Configuration --> Settings`, and select a **region** in the +{guilabel}`Spain Localization` section's {guilabel}`Tax Agency for TBAI` field. + +Once a region is selected, click {guilabel}`Manage certificates (SII/TicketBAI)`, then click +{guilabel}`New`, upload the certificate, and enter the password provided by the tax agency. + +:::{warning} +If you are testing certificates, enable {guilabel}`Test Mode` in the +{guilabel}`Spain Localization` section, which can be found under {guilabel}`Accounting` in +the **Settings** app. +::: + +### Use case + +Once an invoice has been {doc}`created <../../finance/accounting/customer_invoices>` and confirmed, +a TicketBAI **banner** appears at the top. + +```{image} spain/ticketbai-invoice.png +:alt: TicketBAI banner at the top of the invoice once sent. +``` + +Odoo sends invoices through TicketBAI automatically every **24 hours**. However, you can click +{guilabel}`Process now` to send the invoice immediately. + +When the invoice is **sent**, the status of the field {guilabel}`Electronic Invoice` changes to +{guilabel}`Sent`, and the XML file can be found in the **chatter**. Under the +{guilabel}`EDI Documents` tab, you can see the traceability of other generated documents related to +the invoice (e.g., if the invoice should also be sent through the **SII**, it will appear here). + +:::{note} +The TBAI **QR code** is displayed on the invoice PDF. + +```{image} spain/qr-code.png +:alt: QR code of the TicketBAI on the invoice. +``` +::: + +## FACe + +[FACe](https://face.gob.es/en) is the e-Invoicing platform used by the public administrations in +Spain to send electronic invoices. + +Before configuring the {abbr}`FACe (General Entrance for Electronic Invoices)` system, +{ref}`install ` the {guilabel}`Spain - Facturae EDI (l10n_es_edi_facturae)` module +and other **Facturae EDI**-related modules. + +To configure FACe, follow these steps: + +1. Go to {menuselection}`Accounting --> Configuration --> Certificates`. +2. Click {guilabel}`New` to create a new certificate. +3. Complete the fields, including uploading the file of the {guilabel}`Certificate` provided by the + tax agency and the provided {guilabel}`Certificate Password`. + +:::{note} +If using the Invoicing app instead of Accounting, go to {menuselection}`Invoicing --> +Configuration --> Certificates`. +::: + +### Use case + +Once you have {doc}`created <../../finance/accounting/customer_invoices>` an invoice and confirmed +it, click {guilabel}`Send & Print`. Make sure {guilabel}`Generate Facturae edi file` is enabled, and +click {guilabel}`Send & Print` again. Once the invoice is sent, the generated XML file is available +in the **chatter**. + +:::{warning} +The file is **NOT** automatically sent. You have to send it yourself manually. +::: + +:::{tip} +You can send **FACe** XML files in batch through [the governmental portal](https://www.facturae.gob.es/formato/Paginas/descarga-aplicacion-escritorio.aspx). +::: + +### Administrative centers + +In order for **FACe** to work with **administrative centers**, the invoice *must* include specific +data about the centers. + +:::{note} +Make sure to have the {guilabel}`Spain - Facturae EDI - Administrative Centers Patch +(l10n_es_edi_facturae_adm_centers)` module {ref}`installed `. +::: + +To add **administrative centers**, create a new **contact** to add to the **partner** company. +Select {guilabel}`FACe Center` as the **type**, assign one or more **role(s)** to that contact, and +{guilabel}`Save`. The **three** roles usually required are: + +- Órgano gestor: {guilabel}`Receptor` (Receiver); +- Unidad tramitadora: {guilabel}`Pagador` (Payer); +- Oficina contable: {guilabel}`Fiscal` (Fiscal). + +```{image} spain/administrative-center.png +:alt: Administrative center contact form for public entities. +``` + +:::{tip} +- If administrative centers need different {guilabel}`Codes` per role, you *must* create + different centers for each role. +- When an electronic invoice is created using a partner with **administrative centers**, *all* + administrative centers are included in the invoice. +- You can add one contact with multiple roles or multiple contacts with a different role each. +::: + diff --git a/content/applications/finance/fiscal_localizations/switzerland.md b/content/applications/finance/fiscal_localizations/switzerland.md new file mode 100644 index 000000000..82b9c5f6e --- /dev/null +++ b/content/applications/finance/fiscal_localizations/switzerland.md @@ -0,0 +1,136 @@ +# Switzerland + +## ISR (In-payment Slip with Reference number) + +The ISRs are payment slips used in Switzerland. You can print them +directly from Odoo. On the customer invoices, there is a new button +called *Print ISR*. + +```{image} switzerland/switzerland00.png +:align: center +``` + +:::{tip} +The button *Print ISR* only appears there is well a bank account +defined on the invoice. You can use CH6309000000250097798 as bank +account number and 010391391 as CHF ISR reference. +::: + +```{image} switzerland/switzerland01.png +:align: center +``` + +Then you open a pdf with the ISR. + +```{image} switzerland/switzerland02.png +:align: center +``` + +There exists two layouts for ISR: one with, and one without the bank +coordinates. To choose which one to use, there is an option to print the +bank information on the ISR. To activate it, go in +{menuselection}`Accounting --> Configuration --> Settings --> Customer Invoices` +and enable **Print bank on ISR**: + +```{image} switzerland/switzerland03.png +:align: center +``` + +### ISR reference on invoices + +To ease the reconciliation process, you can add your ISR reference as **Payment Reference** on your +invoices. + +To do so, you need to configure the Journal you usually use to issue invoices. Go to +{menuselection}`Accounting --> Configuration --> Journals`, open the Journal you want to modify (By +default, the Journal is named *Customer Invoices*), click en *Edit*, and open the *Advanced +Settings* tab. In the **Communication Standard** field, select *Switzerland*, and click on *Save*. + +```{image} switzerland/switzerland-isr-reference.png +:align: center +:alt: Configure your Journal to display your ISR as payment reference on your invoices +: in Odoo +``` + +## Currency Rate Live Update + +You can update automatically your currencies rates based on the Federal +Tax Administration from Switzerland. For this, go in +{menuselection}`Accounting --> Settings`, activate the multi-currencies setting and choose the service +you want. + +```{image} switzerland/switzerland04.png +:align: center +``` + +## Updated VAT for January 2018 + +Starting from the 1st January 2018, new reduced VAT rates will be +applied in Switzerland. The normal 8.0% rate will switch to 7.7% and the +specific rate for the hotel sector will switch from 3.8% to 3.7%. + +### How to update your taxes in Odoo Enterprise (Odoo Online or On-premise)? + +If you have the V11.1 version, all the work is already been done, you +don't have to do anything. + +If you have started on an earlier version, you first have to update the +module "Switzerland - Accounting Reports". For this, you go in +{menuselection}`Apps --> remove the filter "Apps" --> search for "Switzerland - Accounting Reports" --> open the module --> click on "upgrade"`. + +```{image} switzerland/switzerland05.png +:align: center +``` + +Once it has been done, you can work on creating new taxes for the +updated rates. + +:::{tip} +**Do not suppress or modify the existing taxes** (8.0% and 3.8%). +You want to keep them since you may have to use both rates for a short +period of time. Instead, remember to archive them once you have encoded +all your 2017 transactions. +::: + +The creation of such taxes should be done in the following manner: + +- **Purchase taxes**: copy the origin tax, change its name, label on + invoice, rate and tax group (effective from v10 only) + +- **Sale taxes**: copy the origin tax, change its name, label on + invoice, rate and tax group (effective from v10 only). Since the + vat report now shows the details for old and new rates, you + should also set the tags accordingly to + + - For 7.7% taxes: Switzerland VAT Form: grid 302 base, Switzerland + VAT Form: grid 302 tax + - For 3.7% taxes: Switzerland VAT Form: grid 342 base, Switzerland + VAT Form: grid 342 tax + +You'll find below, as examples, the correct configuration for all taxes +included in Odoo by default + +| **Tax Name** | **Rate** | **Label on Invoice** | **Tax Group (effective from V10)** | **Tax Scope** | **Tag** | +| --------------------------------------------- | -------- | -------------------- | ---------------------------------- | ------------- | ----------------------------------------------------------------------- | +| TVA 7.7% sur achat B&S (TN) | 7.7% | 7.7% achat | TVA 7.7% | Purchases | Switzerland VAT Form: grid 400 | +| TVA 7.7% sur achat B&S (Incl. TN) | 7.7% | 7.7% achat Incl. | TVA 7.7% | Purchases | Switzerland VAT Form: grid 400 | +| TVA 7.7% sur invest. et autres ch. (TN) | 7.7% | 7.7% invest. | TVA 7.7% | Purchases | Switzerland VAT Form: grid 405 | +| TVA 7.7% sur invest. et autres ch. (Incl. TN) | 7.7% | 7.7% invest. Incl. | TVA 7.7% | Purchases | Switzerland VAT Form: grid 405 | +| TVA 3.7% sur achat B&S (TS) | 3.7% | 3.7% achat | TVA 3.7% | Purchases | Switzerland VAT Form: grid 400 | +| TVA 3.7% sur achat B&S (Incl. TS) | 3.7% | 3.7% achat Incl. | TVA 3.7% | Purchases | Switzerland VAT Form: grid 400 | +| TVA 3.7% sur invest. et autres ch. (TS) | 3.7% | 3.7% invest | TVA 3.7% | Purchases | Switzerland VAT Form: grid 405 | +| TVA 3.7% sur invest. et autres ch. (Incl. TS) | 3.7% | 3.7% invest Incl. | TVA 3.7% | Purchases | Switzerland VAT Form: grid 405 | +| TVA due a 7.7% (TN) | 7.7% | 7.7% | TVA 7.7% | Sales | Switzerland VAT Form: grid 302 base, Switzerland VAT Form: grid 302 tax | +| TVA due à 7.7% (Incl. TN) | 7.7% | 7.7% Incl. | TVA 7.7% | Sales | Switzerland VAT Form: grid 302 base, Switzerland VAT Form: grid 302 tax | +| TVA due à 3.7% (TS) | 3.7% | 3.7% | TVA 3.7% | Sales | Switzerland VAT Form: grid 342 base, Switzerland VAT Form: grid 342 tax | +| TVA due a 3.7% (Incl. TS) | 3.7% | 3.7% Incl. | TVA 3.7% | Sales | Switzerland VAT Form: grid 342 base, Switzerland VAT Form: grid 342 tax | + +If you have questions or remarks, please contact our support using +odoo.com/help. + +:::{tip} +Don't forget to update your fiscal positions. If you have a version +11.1 (or higher), there is nothing to do. Otherwise, you will also +have to update your fiscal positions accordingly. +::: + diff --git a/content/applications/finance/fiscal_localizations/thailand.md b/content/applications/finance/fiscal_localizations/thailand.md new file mode 100644 index 000000000..971768062 --- /dev/null +++ b/content/applications/finance/fiscal_localizations/thailand.md @@ -0,0 +1,169 @@ +# Thailand + +## Configuration + +{ref}`Install ` the {guilabel}`🇹🇭 Thailand` localization package to get all the +features of the Thai localization: + +```{eval-rst} +.. list-table:: + :header-rows: 1 + + * - Name + - Technical name + - Description + * - :guilabel:`Thailand - Accounting` + - `l10n_th` + - Default :ref:`fiscal localization package ` + * - :guilabel:`Thailand - Accounting Reports` + - `l10n_th_reports` + - Country-specific accounting reports +``` + +```{image} thailand/modules.png +:alt: Thailand localization modules +``` + +## Chart of accounts and taxes + +Odoo's fiscal localization package for Thailand includes the following taxes: + +- VAT 7% +- VAT-exempted +- Withholding tax +- Withholding income tax + +## Tax report + +Odoo allows users to generate Excel files to submit their VAT to the **Revenue Department** of +Thailand. + +### Sales and purchase tax report + +To generate a sales and purchase tax report, go to {menuselection}`Accounting --> Reporting --> Tax +Report`. Select a specific time or time range on the tax report, and click +{guilabel}`VAT-202-01 (xlsx)` for purchase tax and {guilabel}`VAT-202-02 (xlsx)` for sales tax. + +```{image} thailand/tax-report.png +:alt: Thai purchase and sales taxes reports +``` + +### Withholding PND tax report + +PND report data displays the summarized amounts of the applicable **withholding corporate income +tax returns (domestic)** from vendor bills under the {guilabel}`PND53 (TH)` and +{guilabel}`PND3 (TH)` tax reports. It is installed by default with the Thai localization. + +```{image} thailand/pnd-report.png +:alt: PND tax reports +``` + +:::{note} +Withholding corporate income tax returns (domestic) is the tax used in case the company has +withheld the tax from “**Personal (PND3)**” or “**Corporate (PND53)**” services provided such as +rental, hiring, transportation, insurance, management fee, consulting, etc. +::: + +The PND tax report allows users to generate a CSV file for bills to upload on the +[RDprep for Thailand e-Filling application](https://efiling.rd.go.th/rd-cms/). + +To generate a PND CSV file, go to {menuselection}`Accounting --> Reporting --> Tax Report`, select a +specific time or time range on the tax report, and click {guilabel}`PND3` or {guilabel}`PND53`. + +This generates the {file}`Tax Report PND3.csv` and {file}`Tax Report PND53.csv` files that lists all +the vendor bill lines with the applicable withholding tax. + +```{image} thailand/pnd3-pnd53.png +:alt: PND3 and PND53 CSV files +``` + +:::{warning} +Odoo cannot generate the PND or PDF report or **withholding tax certificate** directly. The +generated {file}`Tax Report PND3.csv` and {file}`Tax Report PND53.csv` files must be exported +to an external tool to convert them into a **withholding PND** report or a **PDF** file. +::: + +## Tax invoice + +The **tax invoice PDF** report can be generated from Odoo through the **Invoicing** module. Users +have the option to print PDF reports for normal invoices and tax invoices. To print out +**tax invoices**, users can click on {guilabel}`Print Invoices` in Odoo. Regular invoices can be +printed as **commercial invoices** by clicking on {menuselection}`Cog button (⚙️) --> Print --> +Commercial Invoice`. + +```{image} thailand/tax-invoice.png +:alt: Commercial invoice printing +``` + +### Headquarter/Branch number settings + +You can inform a company's **Headquarters** and **Branch number** in the **Contacts** app. Once +in the app, open the **contact form** of the company and under the {guilabel}`Sales & Purchase` tab: + +- If the contact is identified as a branch, input the **Branch number** in the + {guilabel}`Company ID` field. +- If the contact is a **Headquarters**, leave the {guilabel}`Company ID` field **blank**. + +```{image} thailand/contact.png +:alt: Company Headquarter/Branch number +``` + +:::{tip} +This information is used in the **tax invoice** PDF report and PND **tax report** export. +::: + +## PromptPay QR code on invoices + +The **PromptPay QR code** is a QR code that can be added to invoices to allow customers to pay their +bills using the PromptPay-supported bank mobile application. The QR code is generated based on the +**invoice amount** and one of the following **merchant information**: + +- Ewallet ID +- Merchant Tax ID +- Mobile Number + +### Activate QR codes + +Go to {menuselection}`Accounting --> Configuration --> Settings`. Under the {guilabel}`Customer +Payments` section, activate the {guilabel}`QR Codes` feature. + +### PromptPay QR bank account configuration + +Go to {menuselection}`Contacts --> Configuration --> Bank Accounts` and select the bank account for +which you want to activate PromptPay QR. Set the {guilabel}`Proxy Type` and fill in the +{guilabel}`Proxy Value` field depending on the chosen type. + +:::{important} +- The account holder's city is mandatory. +- The {guilabel}`Include Reference` checkbox doesn't work for PromptPay QR codes. +::: + +```{image} thailand/qr-promptpay-bank.png +:alt: PromptPay bank account configuration +``` + +:::{seealso} +{doc}`../accounting/bank` +::: + +### Bank journal configuration + +Go to {menuselection}`Accounting --> Configuration --> Journals`, open the bank journal, then fill +in the {guilabel}`Account Number` and {guilabel}`Bank` under the {guilabel}`Journal Entries` tab. + +```{image} thailand/qr-bank-journal.png +:alt: Bank Account's journal configuration +``` + +### Issue invoices with PromptPay QR code + +When creating a new invoice, open the {guilabel}`Other Info` tab and set the {guilabel}`Payment +QR-code` option to {guilabel}`EMV Merchant-Presented QR-code`. + +```{image} thailand/qr-code-invoice-emv.png +:alt: Select EMV Merchant-Presented QR-code option +``` + +Ensure that the {guilabel}`Recipient Bank` is the one you configured, as Odoo uses this field to +generate the PromptPay QR code. + diff --git a/content/applications/finance/fiscal_localizations/united_arab_emirates.md b/content/applications/finance/fiscal_localizations/united_arab_emirates.md new file mode 100644 index 000000000..98b480d0a --- /dev/null +++ b/content/applications/finance/fiscal_localizations/united_arab_emirates.md @@ -0,0 +1,221 @@ +# United Arab Emirates + +(uae-installation)= + +## Installation + +{ref}`Install ` the following modules to get all the features of the **United Arab +Emirates** localization: + +```{eval-rst} +.. list-table:: + :header-rows: 1 + + * - Name + - Technical name + - Description + * - :guilabel:`United Arab Emirates - Accounting` + - ``l10n_ae`` + - Default :doc:`fiscal localization package `. + Includes all accounts, taxes, and reports. + * - :guilabel:`U.A.E. - Payroll` + - ``l10n_ae_hr_payroll`` + - Includes all rules, calculations, and salary structures. + * - :guilabel:`U.A.E. - Payroll with Accounting` + - ``l10n_ae_hr_payroll_account`` + - Includes all accounts related to the payroll module. + * - :guilabel:`United Arab Emirates - Point of Sale` + - ``l10n_ae_pos`` + - Includes the UAE-compliant POS receipt. +``` + +```{image} united_arab_emirates/l10n-ae-modules.png +:align: center +:alt: Select the modules to install. +``` + +## Chart of accounts + +Go to {menuselection}`Accounting --> Configuration --> Chart of Accounts` to view all default +accounts available for the UAE localization package. You can filter by {guilabel}`Code` using the +numbers on the far left or by clicking on {menuselection}`Group By --> Account Type`. You can +{guilabel}`Enable`/{guilabel}`Disable` reconciliation or **configure** specific accounts according +to your needs. + +:::{important} +- Always keep at least one **receivable account** and one **payable account** active. + +- It is also advised to **keep the accounts below active**, as they are used either as transitory + accounts by Odoo or are specific to the **UAE localization package**. + + ```{eval-rst} + .. list-table:: + :header-rows: 1 + + * - Code + - Account Name + - Type + * - 102011 + - Accounts Receivable + - Receivable + * - 102012 + - Accounts Receivable (POS) + - Receivable + * - 201002 + - Payables + - Payable + * - 101004 + - Bank + - Bank and Cash + * - 105001 + - Cash + - Bank and Cash + * - 100001 + - Liquidity Transfer + - Current Assets + * - 101002 + - Outstanding Receipts + - Current Assets + * - 101003 + - Outstanding Payments + - Current Assets + * - 104041 + - VAT Input + - Current Assets + * - 100103 + - VAT Receivable + - Non-current Assets + * - 101001 + - Bank Suspense Account + - Current Liabilities + * - 201017 + - VAT Output + - Current Liabilities + * - 202001 + - End of Service Provision + - Current Liabilities + * - 202003 + - VAT Payable + - Non-current Liabilities + * - 999999 + - Undistributed Profits/Losses + - Current Year Earnings + * - 400003 + - Basic Salary + - Expenses + * - 400004 + - Housing Allowance + - Expenses + * - 400005 + - Transportation Allowance + - Expenses + * - 400008 + - End of Service Indemnity + - Expenses + ``` +::: + +## Taxes + +To access your taxes, go to {menuselection}`Accounting --> Configuration --> Taxes`. +Activate/deactivate, or {doc}`configure ` the +taxes relevant to your business by clicking on them. Remember to only set tax accounts on the **5%** +tax group, as other groups do not need closing. To do so, enable the {doc}`developer mode +<../../general/developer_mode>` and go to {menuselection}`Configuration --> Tax Groups`. Then, set a +{guilabel}`Tax current account (payable)`, {guilabel}`Tax current account (receivable)`, and an +{guilabel}`Advance Tax payment account` for the **5%** group. + +:::{note} +The {abbr}`RCM (Reverse Charge Mechanism)` is supported by Odoo. +::: + +```{image} united_arab_emirates/uae-localization-taxes.png +:align: center +:alt: Preview of the UAE localization package's taxes. +``` + +## Currency exchange rates + +To update the currency exchange rates, go to {menuselection}`Accounting --> Configuration --> +Settings --> Currencies`. Click on the update button ({guilabel}`🗘`) found next to the +{guilabel}`Next Run` field. + +To launch the update automatically at set intervals, change the {guilabel}`Interval` from +{guilabel}`Manually` to the desired frequency. + +:::{note} +By default, the UAE Central Bank exchange rates web service is used. Several other providers are +available under the {guilabel}`Service` field. +::: + +(uae-payroll)= + +## Payroll + +The {guilabel}`UAE - Payroll` module creates the necessary **salary rules** in the Payroll app in +compliance with the UAE rules and regulations. The salary rules are linked to the corresponding +accounts in the **chart of accounts**. + +```{image} united_arab_emirates/uae-localization-salary-rules.png +:align: center +:alt: The UAE Employee Payroll Structure. +``` + +### Salary rules + +To apply these rules to an employee's contract, go to {menuselection}`Payroll --> Contracts --> +Contracts` and select the employee's contract. In the {guilabel}`Salary Structure Type` field, +select {guilabel}`UAE Employee`. + +```{image} united_arab_emirates/uae-localization-salary-structure.png +:align: center +:alt: Select the Salary Structure Type to apply to the contract. +``` + +Under the {guilabel}`Salary Information` tab, you can find details such as the: + +- {guilabel}`Wage`; +- {guilabel}`Housing Allowance`; +- {guilabel}`Transportation Allowance`; +- {guilabel}`Other Allowances`; +- {guilabel}`Number of Days`: used to calculate the {ref}`end of service provision + `. + +:::{note} +- **Leave deductions** are calculated using a salary rule linked to the **unpaid leave** time-off + type; +- Any other deductions or reimbursements are made *manually* using other inputs; +- **Overtimes** are added *manually* by going to {menuselection}`Work Entries --> Work Entries`; +- **Salary attachments** are generated by going to {menuselection}`Contracts --> + Salary Attachments`. Then, {guilabel}`Create` an attachment and select the {guilabel}`Employee` + and the {guilabel}`Type (Attachment of Salary, Assignment of Salary, Child Support)`. +::: + +:::{tip} +To prevent a rule from appearing on a paycheck, go to {menuselection}`Payroll --> Configuration +--> Rules`. Click on {guilabel}`UAE Employee Payroll Structure`, select the rule to hide, and +uncheck {guilabel}`Appears on Payslip`. +::: + +(uae-end-of-service-provision)= + +### End of service provision + +The provision is defined as the total monthly allowance *divided* by 30 and then *multiplied* by the +number of days set in the field {guilabel}`Number of days` at the bottom of a contract's form. + +The provision is then calculated via a salary rule associated with two accounts: the **End Of +Service Indemnity (Expense account)** and the **End of Service Provision (Non-current Liabilities +account)**. The latter is used to pay off the **end of service amount** by settling it with the +**payables account**. + +:::{note} +The end of service amount is calculated based on the gross salary and the start and end dates of +the employee’s contract. +::: + +### Invoices + +The UAE localization package allows the generation of invoices in English, Arabic, or both. The +localization also includes a line to display the **VAT amount** per line. + diff --git a/content/applications/finance/fiscal_localizations/united_kingdom.md b/content/applications/finance/fiscal_localizations/united_kingdom.md new file mode 100644 index 000000000..a4c8b8385 --- /dev/null +++ b/content/applications/finance/fiscal_localizations/united_kingdom.md @@ -0,0 +1,405 @@ +--- +substitutions: + CIS: '{abbr}`CIS (Construction Industry Scheme)`' + HMRC: '{abbr}`HMRC (HM Revenue and Customs)`' +--- + +# United Kingdom + +(localization-united-kingdom-modules)= + +## Configuration + +{ref}`Install ` the {guilabel}`UK - Accounting` and the {guilabel}`UK - Accounting +Reports` modules to get all the features of the UK localization. + +```{eval-rst} +.. list-table:: + :header-rows: 1 + + * - Name + - Technical name + - Description + * - :guilabel:`UK - Accounting` + - `l10n_uk` + - - CT600-ready chart of accounts + - VAT100-ready tax structure + - Infologic UK counties listing + * - :guilabel:`UK - Accounting Reports` + - `l10n_uk_reports` + - - Accounting reports for the UK + - Allows sending the tax report via the MTD-VAT API to HMRC. + * - :guilabel:`UK BACS Payment Files` + - `l10n_uk_bacs` + - Allows generating :ref:`localization/united-kingdom/BACS-files` for bill and invoice payments + * - :guilabel:`UK - Construction Industry Scheme` + - `l10n_uk_reports_cis` + - - Allows sending the Monthly return to |HMRC| + - CIS Deduction (GB) report for UK construction industry + * - :guilabel:`UK - HMRC API` + - `l10n_uk_hmrc` + - Includes the |HMRC| basics. +``` + +:::{note} +- Only UK-based companies can submit reports to HMRC. +- Installing the module {guilabel}`UK - Accounting Reports` installs all two modules at once. +- The {guilabel}`UK - Construction Industry Scheme` module automatically includes the + {guilabel}`UK - HMRC API` module during installation. +::: + +:::{seealso} +- [HM Revenue & Customs](https://www.gov.uk/government/organisations/hm-revenue-customs/) +- [Overview of Making Tax Digital](https://www.gov.uk/government/publications/making-tax-digital/overview-of-making-tax-digital/) +::: + +(localization-united-kingdom-chart-of-account)= + +## Chart of accounts + +The UK chart of accounts is included in the {guilabel}`UK - Accounting` module. Go to +{menuselection}`Accounting --> Configuration --> Accounting: Chart of Accounts` to access it. + +Setup your {abbr}`CoA (chart of accounts)` by going to {menuselection}`Accounting --> Configuration +--> Settings --> Accounting Import section` and choose to {guilabel}`Review Manually` or +{guilabel}`Import (recommended)` your initial balances. + +(localization-united-kingdom-taxes)= + +## Taxes + +As part of the localization module, UK taxes are created automatically with their related financial +accounts and configuration. + +Go to {menuselection}`Accounting --> Configuration --> Settings --> Taxes` to update the +{guilabel}`Default Taxes`, the {guilabel}`Tax Return Periodicity` or to {guilabel}`Configure your +tax accounts`. + +To edit existing taxes or to {guilabel}`Create` a new tax, go to {menuselection}`Accounting --> +Configuration --> Accounting: Taxes`. + +:::{seealso} +- {doc}`taxes <../accounting/taxes>` +- Tutorial: [Tax report and return](https://www.odoo.com/slides/slide/tax-report-and-return-1719?fullscreen=1). +::: + +(localization-united-kingdom-digital-tax)= + +### Making Tax Digital (MTD) + +In the UK, all VAT-registered businesses have to follow the MTD rules by using software to submit +their VAT returns. + +The **UK - Accounting Reports** module enables you to comply with the [HM Revenue & Customs](https://www.gov.uk/government/organisations/hm-revenue-customs/) requirements regarding +[Making Tax Digital](https://www.gov.uk/government/publications/making-tax-digital/overview-of-making-tax-digital/). + +:::{important} +If your periodic submission is more than three months late, it is no longer possible to submit +it through Odoo, as Odoo only retrieves open bonds from the last three months. Your submission +has to be done manually by contacting HMRC. +::: + +(localization-united-kingdom-hmrc-registration)= + +#### Register your company to HMRC before the first submission + +Go to {menuselection}`Accounting --> Reporting --> Tax report` and click on +{guilabel}`Connect to HMRC`. Enter your company information on the HMRC platform. You only need to +do it once. + +(localization-united-kingdom-periodic-hmrc-submission)= + +#### Periodic submission to HMRC + +Import your obligations HMRC, filter on the period you want to submit, and send your tax report by +clicking {guilabel}`Send to HMRC`. + +:::{tip} +You can use dummy credentials to demo the HMRC flow. To do so, activate the +{ref}`developer mode ` and go to {menuselection}`General Settings --> +Technical --> System Parameters`. From here, search for `l10n_uk_reports.hmrc_mode` and change +the value line to `demo`. You can get such credentials from the [HMRC Developer Hub](https://developer.service.hmrc.gov.uk/api-test-user). +::: + +(localization-united-kingdom-periodic-hmrc-submission-multi)= + +#### Periodic submission to HMRC for multi-company + +Only one company and one user can connect to HMRC simultaneously. If several UK-based companies are +on the same database, the user who submits the HMRC report must follow these instructions before +each submission: + +1. Log into the company for which the submission has to be done. +2. Go to {guilabel}`General Settings`, and in the {guilabel}`Users` section, click + {guilabel}`Manage Users`. Select the user who is connected to HMRC. +3. Go to the {guilabel}`UK HMRC Integration` tab and click {guilabel}`Reset Authentication + Credentials` or {guilabel}`Remove Authentication Credentials` button. +4. {ref}`Register your company to HMRC ` and submit + the company's tax report. +5. Repeat the steps for other companies' HMRC submissions. + +:::{note} +During this process, the {guilabel}`Connect to HMRC` button no longer appears for other UK-based +companies. +::: + +(localization-united-kingdom-bacs-files)= + +## Bacs files + +{abbr}`Bacs (Bankers' Automated Clearing Services)` files are electronic files used in the UK to +process payments and transfers between bank accounts. + +To enable the use of Bacs files, make sure the +{ref}`UK BACS Payment Files ` module is installed, then: + +1. Configure your Bacs Service User Number: + + 1. Go to {menuselection}`Accounting --> Configuration --> Settings` and scroll down to the + {guilabel}`Customer Payments` section. + 2. Enter your {guilabel}`Service User Number` under {guilabel}`BACS` and manually save. + +2. Configure your **bank** journal: + + 1. Go to {menuselection}`Accounting --> Configuration --> Journals` and select your **bank** + journal. + 2. In the {guilabel}`Journal Entries` tab, configure the {guilabel}`Account Number` and + {guilabel}`Bank` fields. + 3. In the {guilabel}`Incoming Payments` and {guilabel}`Outgoing Payments` tabs, make sure the + {guilabel}`BACS Direct Debit` payment method is enabled. + +3. Configure the contacts for whom you wish to use Bacs files: Access the contact form and, in + the {guilabel}`Accounting` tab, click {guilabel}`Add a line` and fill in the + {guilabel}`Account Number` and {guilabel}`Bank` fields. + +(localization-united-kingdom-bill-payments)= + +### Bill payments + +To generate Bacs files for bill payments, set the {guilabel}`Payment Method` to +{guilabel}`BACS Direct Debit` when {ref}`registering vendor payments `. + +Then, create a vendor batch payment: + +1. Go to {menuselection}`Accounting --> Vendors --> Batch Payments`, and click {guilabel}`New`. + +2. Select the bank journal in the {guilabel}`Bank` field, set the {guilabel}`Payment Method` to + {guilabel}`BACS Direct Credit`, and select a {guilabel}`BACS Processing Date`. + +3. Optionally, you can also: + + - select a {guilabel}`BACS Expiry Date`; + - enable {guilabel}`BACS Multi Mode` to process the payments on their individual date. + +4. Click {guilabel}`Add a line`, select the payments you want to include, click {guilabel}`Select`, + then {guilabel}`Validate`. + +Once validated, the Bacs file is available in the chatter. You can also {guilabel}`Re-generate +Export File` if you need a new Bacs file for that batch payment. + +```{image} united_kingdom/bacs-files.png +:alt: Vendor Batch Payment view with generated BACS file. +``` + +(localization-united-kingdom-invoice-payments)= + +### Invoice payments + +Before generating Bacs files for invoice payments, you must first create a **BACS Direct Debit +Instruction**: Go to {menuselection}`Accounting --> Customers --> BACS Direct Debit Instructions` +and click {guilabel}`New`. Select a {guilabel}`Customer`, their {guilabel}`IBAN`, and the +{guilabel}`Journal` you wish to use. + +To generate Bacs files for invoice payments, set the {guilabel}`Payment Method` to +{guilabel}`BACS Direct Debit` when {ref}`registering invoice payments `. + +:::{tip} +If you register the payment for an invoice linked to a subscription or via +{menuselection}`Accounting --> Customers --> Payments`, you can select the {guilabel}`BACS +Payment Type`: + +- {guilabel}`Direct debit-first collection of a series`; +- {guilabel}`Direct debit single collection`; +- {guilabel}`Direct debit repeating collection in a series`; +- {guilabel}`Direct debit-final collection of a series`. +::: + +Then, create a customer batch payment: + +1. Go to {menuselection}`Accounting --> Customers --> Batch Payments`, and click {guilabel}`New`. + +2. Select the bank journal in the {guilabel}`Bank` field, set the {guilabel}`Payment Method` to + {guilabel}`BACS Direct Credit`, and select a {guilabel}`BACS Processing Date`. + +3. Optionally, you can also: + + - select a {guilabel}`BACS Expiry Date`; + - enable {guilabel}`BACS Multi Mode` to process the payments on their individual date. + +4. Click {guilabel}`Add a line`, select the payments you want to include, click {guilabel}`Select`, + then {guilabel}`Validate`. + +Once validated, the Bacs file is available in the chatter. You can also {guilabel}`Re-generate +Export File` if you need a new Bacs file for that batch payment. + +(localization-united-kingdom-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. + +:::{important} +To {ref}`configure the Employment Hero API ` for **United +Kingdom**, use the following value as {guilabel}`Payroll URL`: `https://api.yourpayroll.co.uk/`. +::: + +(localization/united-kingdom/cis-deduction)= + +## CIS deduction + +The Construction Industry Scheme deduction (CIS deduction) is a tax deduction system used in the UK +designed specifically for the construction industry. It requires contractors to deduct a percentage +of payments made to subcontractors and forward these deductions to HM Revenue and Customs (HMRC). +These deductions apply only to the labor portion of the payments and serve as advance payments +towards the subcontractor's tax and National Insurance contributions. Contractors are required to +register for the scheme, but subcontractors are not. However, subcontractors who are not registered +face higher payment deductions. Under the {{ CIS }}, contractors must deduct 20% from payments to +registered subcontractors, while the deduction increases to 30% for unregistered ones. + +:::{seealso} +- [Construction Industry Scheme (CIS)](https://www.gov.uk/what-is-the-construction-industry-scheme) +- [Guidelines for CIS contractors](https://www.gov.uk/what-you-must-do-as-a-cis-contractor) +- [Guidelines for CIS subcontractors](https://www.gov.uk/what-you-must-do-as-a-cis-subcontractor) +::: + +As a contractor, you are required to register with the {{ CIS }} before hiring subcontractors and to +check whether each subcontractor is registered with the {{ CIS }}. You must also maintain records of all +payments and deductions and submit monthly returns to HMRC, including the following details: + +- information about the subcontractors +- records of payments made and any deductions applied +- a declaration confirming that the employment status of all subcontractors has been reviewed +- a declaration confirming that all subcontractors requiring verification have been verified + +:::{note} +If no payments were made to subcontractors in the previous tax month, contractors must notify +{{ HMRC }} by the 19th of the month to avoid a penalty. +::: + +To submit Monthly Returns to {{ HMRC }}, {ref}`install ` the +{ref}`UK - Construction Industry Scheme ` module. + +:::{tip} +To enable the {guilabel}`Test` mode and use test credentials, open the Settings app, activate the +{ref}`developer mode ` and go to {menuselection}`Settings --> Technical --> +System Parameters`. Search for `l10n_uk_hmrc.api_mode`, select it, and change the +{guilabel}`Value` from `production` to `test`. +::: + +(localization-united-kingdom-cis-monthly-returns)= + +### Monthly returns + +Monthly returns only work for vendor bills and vendor refunds. To submit a complete return to +{{ HMRC }}, several steps must be followed to report all payments made to subcontractors under the +scheme during the previous tax month: + +- {ref}`localization/united-kingdom/cis-contractor-setup` +- {ref}`localization/united-kingdom/cis-subcontractor-setup` +- {ref}`localization/united-kingdom/cis-vendorbills` +- {ref}`localization/united-kingdom/cis-monthly-return-sending` + +(localization-united-kingdom-cis-contractor-setup)= + +#### Contractor (company) setup + +To configure your company's {{ HMRC }} information, go to the Settings app and, in the +{guilabel}`Companies` section, click {guilabel}`Update Info`. Open the {guilabel}`HMRC` tab and +configure the information in the {guilabel}`HMRC Credentials` and the {guilabel}`Contractor details` +sections. All fields are mandatory. + +(localization-united-kingdom-cis-subcontractor-setup)= + +#### Subcontractor setup + +Access the subcontractor's contact form and select the {guilabel}`Accounting` tab. In the +{guilabel}`HMRC Details` section, enable the {guilabel}`Construction Industry Scheme` option; the +{{ CIS }}-related fields are displayed. + +By default, the {guilabel}`Deduction rate` is set to 30%. To modify it, first enter the +{guilabel}`Verification Number` provided by {{ HMRC }} when verifying the subcontractor's status, then +update the {guilabel}`Deduction Rate` accordingly. + +:::{note} +The {guilabel}`Forename` and {guilabel}`Surname` fields are mandatory if the contact type is set +to {guilabel}`Individual`. +::: + +(localization-united-kingdom-cis-vendorbills)= + +#### Vendor bills + +The appropriate {{ CIS }} tax must be applied to **labor items** on vendor bills based on the +subcontractor's {guilabel}`Deduction Rate`: {guilabel}`0% CIS`, {guilabel}`20% CIS` or +{guilabel}`30% CIS`. To apply the rate, go to the {guilabel}`Invoice Lines` section of the vendor +bill and select the appropriate {{ CIS }} tax rate in the {guilabel}`Taxes` column of the **labor** +items. + +:::{note} +- The {{ CIS }} tax rate is not necessary for material items on vendor bills. + +- A yellow banner appears at the top of the page if: + + - The {guilabel}`Construction Industry Scheme` option hasn't been enabled in the + {ref}`subcontractor `'s + {guilabel}`Contact` form when creating a vendor bill. + - The {{ CIS }} tax used in the vendor bill does not match the expected {{ CIS }} deduction rate for a + {ref}`subcontractor `. +::: + +(localization-united-kingdom-cis-monthly-return-sending)= + +#### Monthly returns sending + +On the 6th of each month, Odoo sends a reminder email to submit a monthly return to {{ HMRC }}. The +recipient email address is the one entered in the company {guilabel}`Email` field. To send monthly +returns to {{ HMRC }}, go to {menuselection}`Accounting --> Reporting --> Tax Return` and follow these +steps: + +1. Click {icon}`fa-book` {guilabel}`Report:` and select {guilabel}`CIS Deduction (GB)`. + +2. In the {icon}`fa-calendar` {guilabel}`(calendar)` date selector, the {guilabel}`Tax Period` is + automatically adjusted to match the {{ CIS }} deduction period. + +3. Click on {guilabel}`Send to HMRC` in the top-left corner. + +4. In the {guilabel}`CIS monthly return` window, select the required options in the + {guilabel}`Declaration` section: + + - {guilabel}`Employment Status`: To declare that the employment status of all subcontractors has + been reviewed. + - {guilabel}`Subcontractor Verification`: To declare that all submitted subcontractors requiring + verification have been verified. + - {guilabel}`Inactivity Indicator`: To declare temporary inactivity. + +5. In the {guilabel}`Information correct declaration` section, confirm the information is true and + complete by checking the box. Then, enter the {guilabel}`Password` used in the + {guilabel}`HMRC Credentials` section during + {ref}`contractor setup `. + +6. Click {guilabel}`Send` to prompt Odoo to request {{ HMRC }} to initiate the transaction. + +When {{ HMRC }} replies to a transaction, Odoo automatically notifies the user who submitted it by +email. The email informs them that the response is available in the company's chatter with an +attached XML document for download. Both the electronic and paper versions of the {{ HMRC }} receipt +should be retained. If an error is detected, a new submission is required to comply with {{ HMRC }} +requirements. + +:::{note} +- Transactions are updated daily. To manually update the {{ HMRC }} request, click the {icon}`fa-cog` + {guilabel}`(gear)` icon and select {guilabel}`Refresh HMRC request`. +- {{ CIS }} invoices are included in the {guilabel}`CIS Deduction (GB)` report but are not sent to + {{ HMRC }}. +::: + diff --git a/content/applications/finance/fiscal_localizations/united_states.md b/content/applications/finance/fiscal_localizations/united_states.md new file mode 100644 index 000000000..4bf6c8117 --- /dev/null +++ b/content/applications/finance/fiscal_localizations/united_states.md @@ -0,0 +1,774 @@ +--- +substitutions: + ACH: '{abbr}`ACH (Automated Clearing House)`' + AP: '{abbr}`AP (Accounts Payable)`' + AR: '{abbr}`AR (Accounts Receivable)`' + CFS: '{abbr}`CFS (Cash Flow Statement)`' + COA: '{abbr}`CoA (Chart of Accounts)`' + FASB: '{abbr}`FASB (Financial Accounting Standards Board)`' + GAAP: '{abbr}`GAAP (Generally Acceptable Accounting Practices)`' + NACHA: '{abbr}`NACHA (National Automated Clearing House Association)`' + SEC: '{abbr}`SEC (Securities and Exchange Commission)`' +--- + +# United States + +The Odoo fiscal localization package for the United States follows the Generally Acceptable +Accounting Principles (GAAP) accounting standards and rules used to prepare financial statements, +as outlined by the Financial Accounting Standards Board (FASB) and adopted by the Securities and +Exchange Commission (SEC). + +:::{seealso} +- [Financial Accounting Standards Board (FASB)](https://asc.fasb.org/Home) +- [Securities and Exchange Commission (SEC)](https://www.sec.gov/) +::: + +In addition, a series of videos on the subject of Accounting are available through Odoo's eLearning +platform. These videos cover how to start from scratch, set up configurations, complete common +workflows, and provide in-depth looks at some specific use cases, as well. + +:::{seealso} +- [Odoo Tutorials: Accounting & Invoicing](https://www.odoo.com/slides/accounting-and-invoicing-19) +- [Odoo SmartClass: Accounting](https://www.odoo.com/slides/smartclass-accounting-121) +::: + +## Configuration + +Below are the available modules in Odoo for accounting use in the United States. + +:::{note} +The modules listed below are either for reference only or are optional, as the core requirements +to operate under the US fiscal localization in Odoo are already included under the default +package that came installed during database initialization. + +Verify the default package is in use by navigating to {menuselection}`Accounting App --> +Settings` and under the {guilabel}`Fiscal Localization` section at the top, look for the `Generic +Chart Template` selection to be listed next to the {guilabel}`Package` field label. This chart +template includes the necessary settings for the US localization for the Odoo *Accounting* app. + +```{image} united_states/us-l10n-generic-chart-template.png +:align: center +:alt: The Generic Chart Template comes pre-configured for the US localization. +``` +::: + +### Modules installation + +{ref}`Install ` the following modules to get all the features of the United States +localization: + +```{eval-rst} +.. list-table:: + :header-rows: 1 + :widths: 25 25 50 + + * - Name + - Technical name + - Description + * - :guilabel:`United States - Accounting` + - `l10n_us` + - Base accounting module for United States localization. + * - :ref:`US - Accounting Reports ` + - `l10n_us_reports` + - Adds United States accounting reports. + * - :guilabel:`US Checks Layout` + - `l10n_us_check_printing` + - Enables the printing of payments on pre-printed check paper. Supports the three most common + check formats and will work out of the box with the linked checks from `checkdepot.net + `_. + + - `Check on top: Quicken / QuickBooks standard + `_ + - `Check on middle: Peachtree standard + `_ + - `Check on bottom: ADP standard + `_ + + * - :ref:`NACHA Payments ` + - `l10n_us_payment_nacha` + - Export payments as NACHA files for use in the United States. + * - :ref:`1099 Reporting ` + - `l10n_us_1099` + - Export 1099 data for e-filing with a 3rd party. + * - :ref:`Avatax ` + - `account_avatax` + - Module for the :doc:`AvaTax integration <../accounting/taxes/avatax>` with Odoo. + * - :ref:`United States - Payroll ` + - `l10n_us_hr_payroll` + - Includes the necessary rules for United States payroll, including: + + - Employee Details + - Employee Contracts + - Passport-based Contracts + - Allowances/Deductions + - Allow Configurations for Basic/Gross/Net Salary + - Employee Payslip + - Integration with Leaves Management + + * - :ref:`United States - Payroll with Accounting ` + - `l10n_us_hr_payroll_account` + - Contains the necessary accounting data for the United States payroll rules. + * - :ref:`United States - Payroll - Export to ADP ` + - `l10n_us_hr_payroll_adp` + - Export Work Entries to the ADP payroll software. +``` + +(l10n-us-coa)= + +## Chart of accounts + +The {doc}`chart of accounts (COA) <../accounting/get_started/chart_of_accounts>` for the United +States localization, in Odoo, follows the standard {{ GAAP }} structure, with accounts grouped into +seven main categories, with corresponding numeric values that prefix individual journal entries: + +- **Receivable**: the balance of money (or credit) due to the business for goods or services + delivered or used, but not yet paid for by customers. {{ AR }} is indicated by the journal code + labeled (or beginning) with {guilabel}`1`. +- **Payable**: the business's short-term obligations owed to its creditors or suppliers, which have + not yet been paid. {{ AP }} is indicated by the journal code labeled (or beginning) with + {guilabel}`2`. +- **Equity**: the amount of money that would be returned to a company's shareholders if all of the + assets were liquidated and all of the company's debt was paid off in the case of liquidation. + Equity is indicated by the journal code labeled (or beginning) with {guilabel}`3` or + {guilabel}`9`. +- **Assets**: items listed on the balance sheet that contains economic value or have the ability to + generate cash flows in the future, such as a piece of machinery, a financial security, or a + patent. Assets are indicated by the journal code labeled (or beginning) with {guilabel}`1`. +- **Liability**: refers to a company's financial debts or obligations that arise during the course + of business operations. Liabilities are indicated by the journal code labeled (or beginning) with + {guilabel}`2`. +- **Income**: synonymous with *net income*, this is the profit a company retains after paying off + all relevant expenses from sales revenue earned. Income is indicated by the journal code labeled + (or beginning) with {guilabel}`4` or {guilabel}`6`. +- **Expenses**: the cost of operations that a company incurs to generate revenue. Expenses are + indicated by the journal code labeled (or beginning) with a {guilabel}`6`. + +:::{tip} +Predefined accounts are included in Odoo, as part of the {{ CoA }} that's installed with the US +localization package. The accounts listed below are preconfigured to perform certain operations +within Odoo. It is recommended to **not** delete these accounts; however, if changes are needed, +rename the accounts instead. + +```{eval-rst} +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - :guilabel:`Type` + - :guilabel:`Account Name` + * - :guilabel:`Current Assets` + - | :guilabel:`Bank Suspense Account` + | :guilabel:`Outstanding Receipts` + | :guilabel:`Outstanding Payments` + | :guilabel:`Liquidity Transfer` + | :guilabel:`Stock Valuation` + | :guilabel:`Stock Interim (Received)` + | :guilabel:`Stock Interim (Delivered)` + | :guilabel:`Cost of Production` + * - :guilabel:`Income` + - | :guilabel:`Foreign Exchange Gain` + | :guilabel:`Cash Difference Gain` + | :guilabel:`Cash Discount Gain` + * - :guilabel:`Expenses` + - | :guilabel:`Cash Discount Loss` + | :guilabel:`Foreign Exchange Loss` + | :guilabel:`Cash Difference Loss` + * - :guilabel:`Current Year Earnings` + - :guilabel:`Undistributed Profits/Losses` + * - :guilabel:`Receivable` + - :guilabel:`Account Receivable` + * - :guilabel:`Payable` + - :guilabel:`Account Payable` +``` +::: + +:::{seealso} +- {doc}`../accounting/get_started/chart_of_accounts` +- {doc}`../accounting/get_started/cheat_sheet` +::: + +### View, edit, and sort accounts + +Access the *Chart of Accounts* dashboard in Odoo by navigating to {menuselection}`Accounting app +--> Configuration --> Accounting: Chart of Accounts`. + +From the {guilabel}`Chart of Accounts` dashboard, create new accounts by clicking the +{guilabel}`New` button in the top-left corner of the dashboard and {ref}`filling in the +corresponding form `. Search and sort through existing accounts by using +specific {guilabel}`Filters` and {guilabel}`Group By` criteria, which are available in the search +drop-down menu. + +To filter accounts by category, click the {icon}`fa-caret-down` {guilabel}`(caret down)` icon to +access the drop-down menu and look under the {guilabel}`Filters` column for individual selections. +Clicking on a specific category will only show accounts that match that particular filter. + +To view all the available account types, remove all of the filters in the search bar, and then click +the {icon}`fa-caret-down` {guilabel}`(caret down)` icon to access the drop-down menu. From there, +select {guilabel}`Account Type` under the {guilabel}`Group By` column heading to list all of the +account types in the table. + +```{image} united_states/us-l10n-coa-account-types.png +:align: center +:alt: Chart of Accounts grouped by Account Type. +``` + +Besides structure, there are other key differences in the chart of accounts in the United States, +compared to other countries: + +- **Specificity**: US {{ GAAP }} often requires more detailed accounts compared to some other countries. + This can include separate accounts for various types of revenue, expenses, and assets, providing + more granular information in financial reports. +- **Regulatory Requirements**: In the United States, there are specific regulatory requirements set + by bodies such as the {{ SEC }} for publicly traded companies. These requirements may influence the + structure and content of the {{ COA }} to ensure compliance with reporting standards. +- **Industry Practices**: Certain industries in the United States may have unique accounting + requirements or specialized {{ COA }} structures. For example, financial institutions often have + specific accounts related to loans, investments, and interest income. +- **Tax Considerations**: The {{ COA }} may also reflect tax considerations, such as accounts for + deductible expenses, deferred tax assets, and liabilities, to ensure compliance with tax laws and + facilitate tax reporting. + +These differences, ultimately, should be reflected in the {{ COA }} structure itself, with the addition +of new accounts, as needed, in order to meet the demands of US accounting reporting requirements. + +:::{seealso} +- {ref}`Create a new account ` +- {doc}`../../essentials/search` +::: + +(l10n-us-taxes)= + +## Taxes + +In the United States, tax rates and what is considered taxable vary by jurisdiction. Default *Sales* +and *Purchase* taxes are created automatically when the Odoo *Accounting* application is installed. +To manage existing or configure additional taxes, navigate to {menuselection}`Accounting --> +Configuration --> Taxes`. + +(l10n-us-taxes-avatax)= + +### AvaTax + +**Avalara AvaTax** is a cloud-based tax calculation and compliance software that integrates with +Odoo for several localizations. Integrating AvaTax with Odoo provides real-time and region-specific +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. +::: + +:::{seealso} +Refer to the documentation articles below to integrate and configure an AvaTax account with an +Odoo database: + +- {doc}`AvaTax integration <../accounting/taxes/avatax>` +- {doc}`Avalara management portal <../accounting/taxes/avatax/avalara_portal>` +- {doc}`Calculate taxes with AvaTax <../accounting/taxes/avatax/avatax_use>` +- [US Tax Compliance: AvaTax elearning video](https://www.odoo.com/slides/slide/us-tax-compliance-avatax-2858?fullscreen=1) +- Avalara's support documents: [About AvaTax](https://community.avalara.com/support/s/document-item?language=en_US&bundleId=dqa1657870670369_dqa1657870670369&topicId=About_AvaTax.html&_LANG=enus) +::: + +(l10n-us-reports)= + +## Reports + +A number of {doc}`report selections <../accounting/reporting>` are readily available for the US +localization, under the {menuselection}`Accounting app --> Reporting` drop-down menu: + +- {ref}`Balance Sheet `: a "snapshot" of a company's financial + position at a specific point in time, which contains an overview of a company's assets, + liabilities, and equity. +- {ref}`Profit & Loss `: otherwise known as a *P&L statement* or + *income statement*, provides a summary of a company's revenues, expenses, and profits/losses over + a given period of time. +- {ref}`Cash Flow Statement `: shows how much cash and cash equivalents + a company has received and spent in a given period. +- {ref}`Executive Summary `: an overview report that covers + the key performance indicators of a company's financial position, such as revenue, profit, and + debt. +- {ref}`Tax Report `: an official form filed for a tax authority + that reports income, expenses, and other pertinent tax information. Tax reports allow taxpayers to + calculate their tax liability, schedule tax payments, or request refunds for the overpayment of + taxes. In Odoo, the tax report can be made monthly, every two months, quarterly, every 4 months, + semi-annually, and annually. +- {guilabel}`Check Register`: a report that displays cash transactions (regardless of the journal) + with their running balance after the transaction. Only visible with the *US - Accounting Reports* + (`l10n_us_reports`) module installed. +- {ref}`1099 Report `: a CSV download of payments made to non-employees in a + period to file electronically in a third-party service. Only visible with the *1099 Reporting* + (`l10n_us_1099`) module installed. + +(l10n-us-report-filters)= + +Depending on the type of report, certain filters are available at the top of the dashboard: + +- a *date* filter, indicated by a {icon}`fa-calendar` {guilabel}`(calendar)` icon that precedes a + date in *MM/DD/YYYY* format. Use this to select a specific date or date range for the report. + +- a {icon}`fa-bar-chart` {guilabel}`Comparison` filter, to compare reporting periods against each + other + +- a *journal* filter, as indicated by a {icon}`fa-book` {guilabel}`(book)` icon and the default + setting of {guilabel}`All Journals`. Use this filter to specify which journals should be included + in the report. + +- an *entries type* filter, as indicated by a {icon}`fa-filter` {guilabel}`(filter)` icon, with the + default setting of {guilabel}`Posted Entries Only, Accrual Basis`. Use this filter to determine + which type of journal entries should be included in the report (e.g. posted or draft), along with + the type of accounting method (e.g. accrual or cash basis). + + - There are view options in this filter, as well, one that will {guilabel}`Hide lines at 0` for + more relevant viewing, along with a {guilabel}`Split Horizontally` option to keep the report + above the screen's fold, removing the need to scroll. + + ```{image} united_states/us-l1on-accounting-method-reporting-menu.png + :align: center + :alt: Accounting method filter menu for reports, covering accrual vs. cash basis methods. + ``` + +- a *decimal* filter, that by default, includes figures with cents, as indicated by the + {guilabel}`In .$` setting. Use the other options in the drop-down menu to change figures in the + report to whole numbers ({guilabel}`In $`), thousands ({guilabel}`In K$`), or millions + ({guilabel}`In M$`) formats. + +- a report *customization* filter, indicated by the {icon}`fa-cogs` {guilabel}`(gears)` icon. Use + this filter to customize the current report's sections and line items, or build new reports, as + desired. + +:::{seealso} +- {doc}`Accounting reporting <../accounting/reporting>` +- {doc}`../../essentials/search` +::: + +(l10n-us-1099-report)= + +### 1099 report + +The 1099 report, available by {ref}`installing ` the *1099 Reporting* +(`l10n_us_1099`) module, includes payments that are made to non-employees across a given reporting +period. Use the available CSV download from the report in Odoo to file 1099 payments electronically +via a third-party service. + +To generate a 1099 report, navigate to {menuselection}`Accounting app --> Reporting --> Management: +1099 Report` to open a {guilabel}`1099 Report` wizard. + +First, enter the date range of the transactions to report in the {guilabel}`Start Date` and +{guilabel}`End Date` fields. + +Then, edit the journal items that appear on the wizard. Click {guilabel}`Add a line` to add any +items that are missing. Be sure to remove any items that should not be included in the report by +clicking {icon}`fa-times` {guilabel}`(delete)` on the row. + +Finally, once all necessary items are included in the 1099 report, click on the {guilabel}`Generate` +button. Doing so downloads a CSV file that groups transactions by the partner that received the +payments. + +(l10n-us-cash-flow-statement)= + +### Cash flow statement + +Navigate to the *Cash Flow Statement* (CFS) dashboard by going to {menuselection}`Accounting app --> +Reporting --> Statement Reports: Cash Flow Statement`. From here, {{ CFS }} reports can be generated +using the various {ref}`filters ` that are available at the top of the +dashboard. + +Odoo uses the *direct* cash flow method to compile cash flow statements, which measures actual cash +inflows and outflows from the company's operations, such as when cash is received from customers or +when cash payments are made to suppliers. + +By default, an account labeled with any of the three default {guilabel}`Tags` on the +{guilabel}`Chart of Accounts` dashboard will be included in the report, which includes: +{guilabel}`Operating Activities`, {guilabel}`Financing Activities`, and {guilabel}`Investing & +Extraordinary Activities`. + +```{image} united_states/us-l10n-cash-flow-statement-tags.png +:align: center +:alt: Examples of tagged accounts that are included in the Cash Flow Statement in Odoo. +``` + +Additionally, the cash flow statement in Odoo: + +- is limited to the *Bank* and *Cash* journals to reflect money coming in or out; and +- also contains *Expenses* accounts, to show the counterpart transactions versus *Bank* or *Cash* + journal entries, while excluding {{ AR }} and {{ AP }} activity. + +```{eval-rst} +.. example:: + Create a vendor bill for $100, as an operating expense (not |AP|). Doing so will **not** reflect + a transaction on the cash flow statement. However, register a corresponding payment for $100, + and the transaction **will** reflect on the cash flow statement as :guilabel:`Cash paid for + operating activities`. + + .. image:: united_states/us-l10n-operating-expenses-example.png + :align: center + :alt: Example of a bill registered as an operating expense as part of a cash flow statement. +``` + +(l10n-us-cash-discount)= + +## Cash discount + +Cash discounts can be configured from {menuselection}`Accounting app --> Payment Terms`. Each +payment term can be set up with a cash discount and reduced tax. + +:::{seealso} +{doc}`../accounting/customer_invoices/cash_discounts` +::: + +(l10n-us-writing-checks)= + +## Writing checks + +Using checks is still a common payment practice in the US. Be sure the *US Checks Layout* +(`l10n_us_check_printing`) module for the US localization is {ref}`installed `. + +To enable check printing from Odoo, navigate to {menuselection}`Accounting --> Configuration --> +Settings` and find the {guilabel}`Vendor Payments` section. From here, tick the {guilabel}`Checks` +checkbox to reveal several fields for check configuration. + +Select a pre-printed or blank {guilabel}`Check Layout` from the drop-down menu: + +- {guilabel}`Print Check (Top) - US` +- {guilabel}`Print Check (Middle) - US` +- {guilabel}`Print Check (Bottom) - US` +- {guilabel}`Print Blank Check (Top) - US` +- {guilabel}`Print Blank Check (Middle) - US` +- {guilabel}`Print Blank Check (Bottom) - US` + +Next, choose whether or not to enable the {guilabel}`Multi-Pages Check Stub` checkbox. + +Optionally set a {guilabel}`Check Top Margin` and {guilabel}`Check Left Margin`, if required. + +Once all check configurations are complete, {guilabel}`Save` the settings. + +:::{tip} +Pre-printed check formats (non-blank checks) require pre-printed paper from a third-party vendor. +[Pre-printed checks from checkdepot.net](https://checkdepot.net/collections/odoo-checks) are +recommended. +::: + +:::{important} +Use one of the blank check formats to print the information of the check ad-hoc when needed. This +requires the use of both {abbr}`MICR (Magnetic Ink Character Recognition)` ink or toner complying +with the standards for check printing, as well as [check quality paper](https://checkdepot.net/collections/blank-check-paper/products/top-format-blank-check-paper-cdt164). +Other information, such as the company name, bank account, and check number, is printed when +creating the blank check. +::: + +:::{seealso} +{doc}`../accounting/payments/pay_checks` +::: + +(l10n-us-payroll)= + +## Payroll + +The *Payroll* application is responsible for calculating an employee's pay, taking into account all +work, vacation, and sick time, benefits, and deductions. The *Payroll* app pulls information from +the *Attendances*, *Timesheets*, *Time Off*, *Employees* and *Expenses* applications, to calculate +the worked hours and compensation for each employee. + +When using an external payroll provider, such as *ADP*, it is necessary to export the various +payroll-related data, such as work entries, repayment of expenses, taxes, commissions, and any other +relevant data, so the data can be uploaded into the payroll provider, who then issues the actual +paychecks or directly deposits the funds into an employee's bank account. + +In order to export the payroll data, the work entries must first be validated and correct. Refer to +the {doc}`work entries <../../hr/payroll/work_entries>` documentation for more information +regarding validating work entries. + +Once work entries are validated, the information can be {ref}`exported to ADP `. + +After payments have been issued to employees, payslips can be processed into batches, validated, and +posted to the corresponding accounting journals to keep all financial records in Odoo current. + +### Required information + +It is important to have the *Employees* application installed, and all employee information +populated. Several fields in both the {ref}`employee records `, as +well as in an {ref}`employee contracts `, are necessary to +properly process the employee's pay. Ensure the following fields are filled out in their respective +places. + +(l10n-us-payroll-employee-records)= + +#### Employee records + +In each employee record, there is various information the *Payroll* application requires to properly +process payslips, including various banking, tax, and work information. + +Navigate to the {menuselection}`Employees app` and select an employee record to view the sections of +the employee form that directly affect *Payroll*: + +- {guilabel}`Work Information` tab: + + - {guilabel}`Work Address`: indicates where the employee is located, including the state, which + affects the tax calculations. + - {guilabel}`Working Hours`: determines how pay is calculated, and determines if an employee earns + overtime. + +- {guilabel}`Private Information` tab: + + - {guilabel}`SSN No`: the last four digits of the employee's Social Security Number (SSN) appears + on payslips. + - {guilabel}`Bank Account Number`: the bank account associated with the NACHA payment file. + +- {guilabel}`HR Settings` tab: + + - {guilabel}`Federal Tax Filing Status`: the tax status an employee uses for Payroll tax + calculations, which can be different from their state status. + - {guilabel}`State Tax Filing Status`: the tax status an employee uses for their state portion of + the Payroll tax calculation. + - {guilabel}`W-2 Form`: a US tax form indicating the summary of wages, taxes, and benefits paid to + an employee during a tax period (typically one year). + - {guilabel}`W-4 Form`: an IRS form that helps outline the amount of federal taxes to withhold for + an employee, which is paid to the IRS by the company. + +(l10n-us-payroll-employee-contracts)= + +#### Employee contracts + +Additionally, there is information that is found in an employee contract that also affects the +*Payroll* application. + +Navigate to the {menuselection}`Employees app --> Employees --> Contracts` and select a contract +record to view the sections of a contract that directly affect *Payroll*: + +- {guilabel}`General Information`: + + - {guilabel}`Salary Structure Type: United States: Employee`: defines when the employee is paid, + their working schedule, and the work entry type. + - {guilabel}`Work Entry source`: determines how work entries are calculated. + +- {guilabel}`Salary Information` tab: + + - {guilabel}`SSN No`: the last four digits of the employee's Social Security Number (SSN) appears + on payslips. + - {guilabel}`Wage type`: determines how the employee is paid, wether a Fixed wage (salary) or + Hourly wage. + - {guilabel}`Schedule Pay`: defines how often the employee is paid, either {guilabel}`Annually`, + {guilabel}`Semi-annually`, {guilabel}`Quarterly`, {guilabel}`Bi-monthly`, {guilabel}`Monthly`, + {guilabel}`Semi-monthly`, {guilabel}`Bi-weekly`, {guilabel}`Weekly`, or {guilabel}`Daily`. In + the US, Semi-monthly (24 payments a year) or bi-weekly (26 payments a year) are the most common. + - {guilabel}`Wage, Yearly, and Monthly cost`: used to show the total cost of an employee. It is + recommended to populate the {guilabel}`Yearly` wage first, as it auto-populates the other + fields. + - {guilabel}`Pre-tax benefits`: populate this section according to the employee's selections. + Pre-tax benefits decrease the gross wage, which lowers the base amount that is taxed. These are + displayed at the beginning of the payslip. + - {guilabel}`Post-tax benefits`: these benefits are deductions made *after* taxes are calculated. + These appear towards the end of the payslip before the net amount is displayed. + +:::{seealso} +{doc}`Employees documentation <../../hr/employees/new_employee>` +::: + +(l10n-us-adp)= + +### Export work entries to ADP + +#### Requirements + +In order to create a report that can be uploaded to ADP, there are some initial configuration steps +that must be completed first. + +First, ensure the *United States - Payroll - Export to ADP* (`l10n_us_hr_payroll_adp`) module is +{ref}`installed `. + +Then, the company **must** have an *ADP Code* entered in the company settings. To do so, navigate +to {menuselection}`Payroll app --> Configuration --> Settings`. Enter the {guilabel}`ADP Code` in +the {guilabel}`US Localization` section. + +Next, work entry types **must** have the correct ADP code listed in the *External Code* field for +each work entry type that is being referenced. + +Lastly, every employee **must** have an *ADP Code* entered on their employee form. To do so, +navigate to {menuselection}`Employees app`, select an employee record, and open the {guilabel}`HR +Settings` tab. Enter the {guilabel}`ADP Code` in the {guilabel}`ADP Information` section. + +The {guilabel}`ADP Code` code is how ADP identifies that particular employee, and is typically a +six-digit number. + +:::{seealso} +- {ref}`payroll/new-work-entry` +- {doc}`../../hr/employees/new_employee` +::: + +#### Export data + +Once {doc}`work entries <../../hr/payroll/work_entries>` have been verified, the information can be +exported to a CSV file, which can then be uploaded into ADP. + +To export the data, navigate to {menuselection}`Payroll app --> Reporting --> United States: ADP +Export`, then click {guilabel}`New`. Next, enter the {guilabel}`Start Date` and {guilabel}`End Date` +for the work entries using the calendar pop-over. + +Then, enter a {guilabel}`Batch ID` in the corresponding field. The recommendation for this field is +to enter the date in a `YY-MM-DD` format, followed by any other characters to distinguish that +specific batch, such as a department name, or any other defining characteristics for the batch. + +Enter a {guilabel}`Batch Description` in the corresponding field. This should be short and +descriptive, but distinct from the {guilabel}`Batch Name`. + +Ensure the correct company populates the {guilabel}`Company` field. Change the selected company with +the drop-down menu, if needed. + +Lastly, add the employee's work entry information to the list. Click {guilabel}`Add a line` and an +{guilabel}`Add: Employee` pop-up window loads. The list can be {doc}`filtered +<../../essentials/search>` to more easily find the employees to add to the list. + +:::{tip} +Process the data export in multiple groups instead of in one large group that contains all +employees. This helps to meaningfully differentiate the batches and makes processing more +tenable, overall. The most common ways to group employees is by department, or by wage type +(hourly or salaried). +::: + +Select the employees to add to the list by ticking the box to the left of their name. Once all +desired employees have been selected, click the {guilabel}`Select` button in the lower-left corner, +and the employees appear in the list. + +To create the CSV file, click the {guilabel}`Generate` button in the top-left corner. + +(l10n-us-ach-electronic-transfers)= + +## ACH - electronic transfers + +Automated Clearing House (ACH) payments are a modern way to transfer funds electronically between +bank accounts, replacing traditional paper-based methods. {{ ACH }} payments are commonly used for +direct deposits, bill payments, and business transactions. + +### Receive ACH payments: payment provider integration + +{{ ACH }} payments are supported by *Authorize.net* and *Stripe* payment integrations in Odoo. + +:::{seealso} +- {ref}`Setting up Authorize.net for ACH payments (Odoo) ` +- [Authorize.net's ACH payment processing for small businesses documentation](https://www.authorize.net/resources/blog/2021/ach-payments-for-small-businesses.html) +- {doc}`Setting up Stripe for ACH payments (Odoo) <../payment_providers/stripe>` +- [Stripe's ACH Direct Debit documentation](https://docs.stripe.com/payments/ach-debit) +::: + +(l10n-us-nacha)= + +### Send payments: NACHA files + +Odoo can generate a National Automated Clearing House Association (NACHA) compatible {{ ACH }} file to +send to a company's bank. For each individual *Bank* journal that the company wishes to pay vendors +with, a {{ NACHA }} configuration section needs to be filled out on the Odoo database. + +#### Configuration + +First, navigate to the {menuselection}`Accounting app --> Configuration --> Journals`. Open the +bank journal and click into the {guilabel}`Outgoing Payments` tab. + +```{image} united_states/us-l10n-nacha-settings.png +:align: center +:alt: NACHA (National Automated Clearing House Association) configuration settings +: on Odoo. +``` + +:::{note} +The following {{ NACHA }} configuration information is normally provided by the company's financial +institution once they have been approved to send payments via their account. +::: + +Under the section labeled, {guilabel}`NACHA configuration` are the fields required to generate a +{{ NACHA }} compatible {{ ACH }} file to send to a company's bank. First, enter the routing number of the +financial institution in the field labeled, {guilabel}`Immediate Destination`. This information is +widely available on the Internet and generally varies by bank location. This number is usually +provided during the initial account setup. + +Next, enter the registered name of the financial institution in the field called, +{guilabel}`Destination`. This information will be provided by the bank or credit union. + +Following the {guilabel}`Destination` field is the {guilabel}`Immediate Origin` field. Enter the +9-digit company ID or Employer Identification Number (EIN) into this field. This information is +provided by the financial institution. + +Next, enter the {guilabel}`Company Identification` number, which is a 10-digit number made from +combining the 9-digit company ID or Employer Identification Number (EIN), along with an additional +number at the start of the sequence. This number is often a `1`. Check with the financial +institution should this first number differ to verify that it is correct, as this number is provided +for {{ ACH }} approved accounts. + +Enter the {guilabel}`Originating DFI Identification` number next, which should contain an assigned +8-digit number from the financial institution. + +:::{important} +Enter the numerical values in this section *exactly* as the company's financial institution +(e.g. bank or credit union) has provided them, otherwise risk failing a successful {{ NACHA }} +configuration in Odoo. +::: + +```{image} united_states/us-l10n-nacha-dropdown.png +:align: center +:alt: NACHA settings with the standard entry class code drop-down menu highlighted. +``` + +There are two options for the next field: {guilabel}`Standard Entry Class Code`. Select the +drop-down menu to the right of the field and pick either {guilabel}`Corporate Credit or Debit (CCD)` +or {guilabel}`Prearranged Payment and Deposit (PPD)`. Again, this information will be provided by +the financial institution. By default {guilabel}`Corporate Credit or Debit (CCD)` is selected. + +Finally, the last option is for {guilabel}`Generated Balanced Files`. Tick the checkbox to the right +of the field to enable {guilabel}`Generated Balanced Files`. Consult the company's accountant or +financial advisor to make an informed decision for this field. + +Manually save the configuration by clicking the {icon}`fa-cloud-upload` {guilabel}`(cloud upload)` +icon, or navigate away from this screen to auto-save. The configuration is now complete. + +(l10n-us-batch-payment)= + +#### Create batch payment + +Now, record each payment in Odoo using the {{ NACHA }} payment method. + +:::{seealso} +{ref}`Register Payments in Odoo ` +::: + +:::{important} +Be aware of the cut-off time for same-day payments. Either the file needs to have a future date +associated with each payment or the file needs to be sent prior to the cut-off, if the dates +included in it match today's date. Consult the financial institution for the exact cut-off time +for their processing of same-day payments. +::: + +Once all the payments to be included in the {{ NACHA }} {{ ACH }} file have been made, a batch payment needs +to be made from the {icon}`fa-cog` {guilabel}`Action` menu. + +To create the batch payments, access the payments page, by navigating to {menuselection}`Accounting +--> Vendors --> Payments`. Select all the payments that should be included in the {{ NACHA }} {{ ACH }} +file, by ticking the checkboxes to the far-left of the rows. + +```{image} united_states/us-l10n-create-batch-payments.png +:align: center +:alt: |- +: On the payments screen, the action menu is highlighted with create a batch payment +: selected. +``` + +:::{important} +All payments in the batch **must** share the same {{ NACHA }} payment method. +::: + +Next, navigate to the batched payment ({menuselection}`Accounting --> Vendors --> Batch Payments`). +Click into the payment just created and then click into the {guilabel}`Exported File` tab. The +generated file is listed with the {guilabel}`Generation Date`. Click the {icon}`fa-download` +{guilabel}`(download)` button to download the file. + +```{image} united_states/us-l10n-batch-file.png +:align: center +:alt: The exported file tab highlighted in the batch payment with the download circled. +``` + +If any adjustments need to be made, click the {guilabel}`Re-generate Export File` button to recreate +a new {{ NACHA }} {{ ACH }} file. + +:::{seealso} +- {doc}`../accounting/payments/batch` +- {doc}`Europe's direct debiting <../accounting/payments/batch_sdd>` +::: + diff --git a/content/applications/finance/fiscal_localizations/uruguay.md b/content/applications/finance/fiscal_localizations/uruguay.md new file mode 100644 index 000000000..7115a90ea --- /dev/null +++ b/content/applications/finance/fiscal_localizations/uruguay.md @@ -0,0 +1,393 @@ +--- +substitutions: + CAEs: "{abbr}`CAEs (Constancia de Autorizaci\xF3n de Emisi\xF3n)`" + DGI: "{abbr}`DGI (Direcci\xF3n General Impositiva)`" + EDI: '{abbr}`EDI (Electronic Data Interchange)`' +--- + +# Uruguay + +(uruguay-intro)= + +## Introduction + +With the Uruguayan localization, you can generate electronic documents with its XML, fiscal folio, +electronic signature and connection to tax authority Dirección General Impositiva (DGI) through +Uruware. + +The supported documents are: + +- {guilabel}`e-Invoice`, {guilabel}`e-Invoice Credit Note`, {guilabel}`e-Invoice Debit Note`; +- {guilabel}`e-Ticket`, {guilabel}`e-Ticket Credit Note`, {guilabel}`e-Ticket Debit Note`; +- {guilabel}`Export e-Invoice`, {guilabel}`Export e-Invoice Credit Note`, {guilabel}`Export + e-Invoice Debit Note`. + +The localization requires an Uruware account, which enables users to generate electronic documents +within Odoo. + +:::{seealso} +{doc}`Documentation on e-invoicing's legality and compliance in Uruguay +<../accounting/customer_invoices/electronic_invoicing/uruguay>` +::: + +### Glossary + +The following terms are used throughout the Uruguayan localization: + +- **DGI**: *Dirección General Impositiva* is the government entity responsible for enforcing tax + payments in Uruguay. +- **EDI**: *Electronic Data Interchange* refers to the sending of electronic documents. +- **Uruware**: is the third-party organization that facilitates the interchange of electronic + documents between companies and the Uruguayan government. +- **CAE**: *Constancia de Autorización de Emisión* is a document requested from the tax authority's + website to enable electronic invoice issuance. + +## Configuration + +### Modules installation + +{ref}`Install ` the following modules to get all the features of the Uruguayan +localization: + +```{eval-rst} +.. list-table:: + :header-rows: 1 + :widths: 25 25 50 + + * - Name + - Technical name + - Description + * - :guilabel:`Uruguay - Accounting` + - `l10n_uy` + - The default :doc:`fiscal localization package <../fiscal_localizations>`. It adds accounting + characteristics for the Uruguayan localization, which represent the minimum configuration + required for a company to operate in Uruguay according to the guidelines set by the |DGI|. + The module's installation automatically loads: chart of accounts, taxes, documents types, and + tax supported types. + * - :guilabel:`Uruguay Accounting EDI` + - `l10n_uy_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 |DGI|. The authorized documents are :ref:`listed + above `. +``` + +:::{note} +Odoo automatically installs the base module **Uruguay - Accounting** when a database is installed +with `Uruguay` selected as the country. However, to enable electronic invoicing, the **Uruguay +Accounting EDI** (`l10n_uy_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}`DGI Main Branch Code`: this is part of the XML when creating an electronic document. If + this field is not set, all electronic documents will be rejected. + + To find the {guilabel}`DGI Main Branch Code`, follow these steps: + + 1. From your [DGI account](https://servicios.dgi.gub.uy/serviciosenlinea), go to + {menuselection}`Servicios en línea DGI --> Registro único tributario --> Consulta de datos`. + 2. Select {menuselection}`Consulta de Datos Registrales --> Consulta de Datos de Entidades`. + 3. Open the generated PDF to get the *DGI Main Branch Code* from the {guilabel}`Domicilio Fiscal + Número de Local` section. + +After configuring the company in the database settings, navigate to {menuselection}`Contacts` and +search for your company to verify the following: + +- the company type is set to {guilabel}`Company`. +- the {guilabel}`Identification Number` {guilabel}`Type` is {guilabel}`RUT / RUC`. + +(l10n-uy-uruware-account)= + +### Set up a Uruware account + +To set up a Uruware account, follow these steps: + +1. Verify that you have a valid Odoo subscription. +2. Locate the Uruware credentials settings by navigating to the {menuselection}`Accounting --> + Configuration --> Settings`. +3. Scroll down to the {guilabel}`Uruguayan Localization` section and select the environment + ({guilabel}`Production` or {guilabel}`Testing`). +4. Click on {guilabel}`Create Uruware Account`. + +Upon doing so, an email is sent to the address associated with your Odoo subscription with the +password to enter Uruware's portal and set up your account. + +:::{tip} +- The email with the credentials is not immediate; it might take up to 48 hours for the account to + be created. +- The company's {guilabel}`Tax ID` needs to be set up to be able to create an Uruware account. +- The password sent expires after 24 hours. In this case, reset it by using the *Forgot Password* + link in Uruware's portal. +::: + +:::{note} +This action will create an account with Uruware with the following information: + +- Legal name (razón social) +- RUT from the company +- Username (the Odoo subscription email or `RUT`.odoo. For example: `213344556677.odoo`) +- Odoo database link + +To ensure your account is created correctly, please add any missing information from above. +::: + +Once the account is created and you have received the email containing the credentials, configure +your accounts directly in the Uruware [testing portal](https://odootest.ucfe.com.uy/Gestion/) or +[production portal](https://prod6109.ucfe.com.uy/Gestion/): + +Use the account credentials in the email to log in to the to the corresponding ([test](https://odootest.ucfe.com.uy/Gestion/) or [production](https://prod6109.ucfe.com.uy/Gestion/)) +portal. + +In Uruware's portal, the following steps are needed to be able to issue invoices from Odoo: + +1. Complete and correct the company's information. +2. Add your digital certificate. +3. Add your {abbr}`CAEs (Constancia de Autorización para Emisión)` for each document-type you plan + to issue. +4. Configure the format of the PDF to be printed and sent to your customers. + +:::{important} +Be sure to configure two accounts, one for testing and one for production. The certificate is +needed in both environments, but {abbr}`CAEs (Constancia de Autorización para Emisión)` are only +needed in production. +::: + +:::{seealso} +- [Odoo Tutorials: Uruguay Localization](https://www.odoo.com/slides/smart-tutorial-localizacion-de-uruguay-432) +- [Odoo Help Forum: Uruguay](https://www.odoo.com/forum/help-1?search=l10n_uy) +::: + +### Electronic invoice data + +To configure the electronic invoice data, an environment and credentials need to be configured. To +do so, navigate to {menuselection}`Accounting --> Configuration --> Settings` and scroll down to the +{guilabel}`Uruguayan Localization` section. + +First, select the {guilabel}`UCFE Web Services` environment: + +- {guilabel}`Production`: for production databases. In this mode, electronic documents are sent to + {{ DGI }} through Uruware for their validation. +- {guilabel}`Testing`: for test databases. In this mode, the direct connection flows can be tested, + with the files sent to the {{ DGI }} testing environment through Uruware. +- {guilabel}`Demo`: files are created and accepted automatically in demo mode but are **not** sent + to the {{ DGI }}. For this reason, rejection errors will not appear in this mode. Every internal + validation can be tested in demo mode. Avoid selecting this option in a production database. + +:::{note} +Using {guilabel}`Demo` mode does not require a Uruware account. +::: + +Then, enter the {guilabel}`Uruware Data`: + +- {guilabel}`Uruware WS Password` +- {guilabel}`Commerce Code` +- {guilabel}`Terminal Code` + +```{image} uruguay/electronic-invoice-data.png +:alt: Required information for electronic invoice. +``` + +:::{note} +This data can be obtained from the Uruware portal after configuring the {ref}`Uruware account +`. + +To get the {guilabel}`Uruware WS Password`, go to {menuselection}`Configuration --> Company --> +Edit` and look for the {guilabel}`Validators and Additional Information` tab to find +{guilabel}`WS Password`. + +To get the {guilabel}`Commerce Code`, go to {menuselection}`Configuration --> Branches`. + +To get the {guilabel}`Terminal Code`, go to {menuselection}`Configuration --> Issuing Points`. +::: + +### 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. + +:::{seealso} +{doc}`../accounting/get_started/chart_of_accounts` +::: + +#### Contacts + +To create a contact, navigate to {menuselection}`Contacts app` and select {guilabel}`New`. Then +enter the following information: + +- {guilabel}`Company Name` + +- {guilabel}`Address`: + + - {guilabel}`Street`: required to confirm an electronic invoice. + - {guilabel}`City` + - {guilabel}`State` + - {guilabel}`ZIP` + - {guilabel}`Country`: required to confirm an electronic invoice. + +- {guilabel}`Identification Number`: + + - {guilabel}`Type`: select a identification type. + - {guilabel}`Number`: required to confirm an electronic invoice. + +#### Taxes + +As part of the Uruguay localization module, taxes are automatically created with its configuration +and related financial accounts. + +```{image} uruguay/taxes.png +:alt: Taxes for Uruguay. +``` + +#### Document types + +Some accounting transactions, like *customer invoices* and *vendor bills* are classified by document +types. These are defined by the government fiscal authorities, in this case by the {{ DGI }}. + +Each document type can have a unique sequence per journal where it is assigned. The data is created +automatically when the localization module is installed, and the information required for the +document types is included by default. + +To review the document types included in the localization, navigate to {menuselection}`Accounting +--> Configuration --> Document Types`. + +:::{note} +In Uruguay, {{ CAEs }} **must** be uploaded in Uruware. Sequences (and PDFs) are received in Odoo +from Uruware, based on their {{ CAEs }}. {{ CAEs }} are **only** used in production. When testing, only a +range of sequences used in Uruware need to be set. +::: + +```{image} uruguay/document-types.png +:alt: Document types for Uruguay. +``` + +#### Sales journals + +To generate and confirm an electronic document that will be validated by {{ DGI }}, the sales journal +needs to be configured with the following: + +- {guilabel}`Invoicing Type`: by default {guilabel}`Electronic` option is set. This is necessary to + send electronic documents via web service to the Uruguayan government through Uruware. The other + option, {guilabel}`Manual`, is for open invoices previously stamped in another system, for + example, in the {{ DGI }}. +- {guilabel}`Use Documents?`: Activate this option if this journal will use documents from the list + of document types in Odoo. + +## Workflows + +Once you have configured your database, you can create your documents. + +### Sales documents + +#### Customer invoices + +{doc}`Customer invoices <../accounting/customer_invoices>` are electronic documents that, when +validated, are sent to {{ DGI }} via Uruware. These documents can be created from your sales order or +manually. They must contain the following data: + +- {guilabel}`Customer`: type the customer's information. +- {guilabel}`Due date`: to compute if the invoice is due now or later (*contado* or *crédito*, + respectively). +- {guilabel}`Journal`: select the electronic sales journal. +- {guilabel}`Document Type`: document type in this format, for example, `(111) e-Invoice`. +- {guilabel}`Products`: specify the product(s) with the correct taxes. + +:::{note} +Every document type has a specific credit note and debit note (e.g., the document type +{guilabel}`(111) e-Invoice` has an {guilabel}`(112) e-Invoice Credit Note`). +::: + +#### Customer credit note + +The {doc}`Customer credit note <../accounting/customer_invoices/credit_notes>` is an electronic +document that, when validated, is sent to {{ DGI }} via Uruware. It is necessary to have a validated +(posted) invoice to register a credit note. On the invoice, click the {guilabel}`Credit note` button +to access the {guilabel}`Create credit note` form, then complete the following information: + +- {guilabel}`Reason`: type the reason for the credit note. +- {guilabel}`Journal`: select the journal that has to be electronic and has the {guilabel}`Use + Documents?` option active. +- {guilabel}`Document Type`: select the credit note document type. +- {guilabel}`Reversal Date`: type the date. + +#### Customer debit note + +The {doc}`Customer debit note <../accounting/customer_invoices/credit_notes>` is an electronic +document that, when validated, is sent to {{ DGI }} via Uruware. It is necessary to have a validated +(posted) invoice to register a debit note. On the invoice, click the {icon}`fa-cog` +({guilabel}`action menu`) icon, select the {guilabel}`Debit note` option to access the +{guilabel}`Create credit note` form, then complete the following information: + +- {guilabel}`Reason`: Type the reason for the debit note. +- {guilabel}`Journal`: Select the journal that has to be electronic and has the {guilabel}`Use + Documents?` option active. +- {guilabel}`Copy lines`: Tick the checkbox to copy the invoice lines to the debit note. +- {guilabel}`Debit note date`: Type the date. + +:::{note} +Confirm the invoice to create it with an internal reference. To send the document to {{ DGI }} via +Uruware, click on {guilabel}`Send and Print` and select the checkbox {guilabel}`Create CFE`. The +legal document sequence (number) is brought from Uruware once the document has been processed. +Make sure you have {{ CAEs }} available in Uruware. +::: + +:::{note} +The PDF of the validated document is pulled from Uruware following the specification by the +Uruguayan government (DGI). +::: + +## Addendas and disclosures + +*Addendas* and *disclosures* are additional notes and comments added to an electronic document that +can be mandatory or optional. To create a new addenda, go to {menuselection}`Accounting --> +Configuration --> Addendas and disclosures` and click {guilabel}`New`. + +Enter the following information: + +- {guilabel}`Name`: name of the addenda or mandatory disclosure. +- {guilabel}`Type`: Select the type of remark, this will add it to the specific section in the XML. +- {guilabel}`Is legend`: Select this box if the text is a mandatory disclosure, leave it blank if it + is additional information. +- {guilabel}`Content`: Add the complete text of the addenda or disclosure. + +### Leyenda and additional information in product + +To add a *leyenda* or additional information to the product and XML, it is necessary to add the +preconfigured addenda and disclosure to the product in the invoice line. Add the *leyenda* in the +{guilabel}`Disclosure` field of the product specified in the line. + +### Leyenda and additional information + +To add a *leyenda* or additional information to the electronic invoice and XML, access the invoice, +go to the {guilabel}`Other Info` tab, and select the desired addenda in the {guilabel}`Addenda and +Disclosure` field. The addenda and disclosures added here will appear in the XML and visibly in the +PDF document. + +This applies to the following types of *addendas*: + +- Document +- Issuer +- Receiver +- Addendas + +:::{note} +To add a temporary note to the electronic document, use the {guilabel}`Terms and Conditions` +field. This information will be sent in the addenda of the invoice, but it won't be saved for +future documents. +::: + diff --git a/content/applications/finance/fiscal_localizations/vietnam.md b/content/applications/finance/fiscal_localizations/vietnam.md new file mode 100644 index 000000000..dc2b19bd3 --- /dev/null +++ b/content/applications/finance/fiscal_localizations/vietnam.md @@ -0,0 +1,269 @@ +# Vietnam + +(localizations-vietnam-modules)= + +## Modules + +The following modules are installed automatically with the Vietnamese localization: + +```{eval-rst} +.. list-table:: + :header-rows: 1 + + * - Name + - Technical name + - Description + * - :guilabel:`Vietnam - Accounting` + - `l10n_vn` + - This module includes the default + :ref:`fiscal localization package `. + * - :guilabel:`Vietnam - E-invoicing` + - `l10n_vn_edi_viettel` + - This module includes the features required for integration with :ref:`SInvoice + `. +``` + +:::{note} +In some cases, such as when upgrading to a version with additional modules, it is possible that +modules may not be installed automatically. Any missing modules can be manually {ref}`installed +`. +::: + +(localizations-vietnam-company)= + +## Company + +To use all the features of this fiscal localization, the following fields are required on the +{doc}`company record `: + +- {guilabel}`Name` + +- {guilabel}`Address`, including the {guilabel}`City`, {guilabel}`State`, {guilabel}`Zip Code`, + and {guilabel}`Country`. + + > - In the {guilabel}`Street` field, enter the street name, number, and any additional address + > information. + > - In the {guilabel}`Street 2` field, enter the neighborhood. + +- {guilabel}`Tax ID`: tax identification number. + +(localizations-vietnam-sinvoice)= + +## E-invoicing with SInvoice + +[SInvoice] is an e-invoice service platform provided by Viettel, one of the biggest e-invoice service +providers in Vietnam. Odoo supports integration with SInvoice to submit invoices generated in Odoo. + +### Configuration + +#### SInvoice platform + +To send electronic invoices to SInvoice, the following must be created on [SInvoice]: + +- {ref}`SInvoice account ` +- {ref}`Invoice template ` +- {ref}`Invoice symbol ` +- {ref}`Invoice issuance notice ` + +(localizations-vietname-sinvoice-registration)= + +##### SInvoice registration + +To create an account, go to [SInvoice] and register for the desired plan. Fill in the form that +opens to be contacted by [SInvoice] to create an account. + +Once you have an account, log into [SInvoice] using your {guilabel}`Username` and +{guilabel}`Password`. + +(localizations-vietname-sinvoice-template)= + +##### Invoice template creation + +1. On the left side of the overview page, in the {guilabel}`Release management` menu, click + {guilabel}`Create business information`. + +2. In the {guilabel}`Update key information` step, fill in the following fields and other optional + information if needed: {guilabel}`Unit name`, {guilabel}`Address`, {guilabel}`Contact person`, + {guilabel}`Type of representative documents`. + +3. Click {guilabel}`Update`. + +4. In the {guilabel}`Look up digital certificate` step, click {guilabel}`Add new` to add a digital + certificate. + +5. Select the {guilabel}`Branch/Enterprise` and the {guilabel}`Type of digital certificate`, then + fill in the required fields for each type: + + > - {guilabel}`Supplier`: CloudCA + > - {guilabel}`Signer ID`: CloudCA + > - {guilabel}`Digital Certificate`: CloudCA + > - {guilabel}`How to download file`: HSM + > - {guilabel}`File Upload`: HSM, USB-TOKEN + +6. Click {guilabel}`Generate key pair` to generate encryption keys for authentication, and + {guilabel}`Save`. + +7. In the {guilabel}`Manage invoice templates` step, add a new {guilabel}`Invoice template`. + +8. Select the {guilabel}`Invoice type` and fill in the {guilabel}`Invoice template code`, + {guilabel}`Invoice template name`, and other optional information if needed. + +9. Click {guilabel}`Update`. + +:::{seealso} +[SInvoice documentation on electronic invoice template creation](https://www.sinvoice.vn/2021/02/hdsd-tai-lieu-nghiep-vu-tao-mau-hoa-don-dien-tu.html?debug=1) +::: + +(localizations-vietname-sinvoice-symbol)= + +##### Invoice symbol creation + +On the left side of the main screen, in the {guilabel}`Release management` menu, click +{guilabel}`Invoice symbol` and follow these steps: + +1. Click {guilabel}`Add new` and select the {guilabel}`Invoice template`. +2. Set the {guilabel}`Status` to {guilabel}`Active` to activate the symbol and fill in the + {guilabel}`Invoice symbol`. +3. Enable {guilabel}`Stop automatic sending to tax authorities` and {guilabel}`Default for built-in + API` based on preference. +4. Click {guilabel}`Save`. + +(localizations-vietname-sinvoice-notice)= + +##### Invoice issuance notice + +On the left side of the main screen, in the {guilabel}`Release management` menu, click +{guilabel}`Create issuance notice` and follow these steps: + +1. Click {guilabel}`Add new`, select the {guilabel}`Name of the business unit to issue an e-invoice` + and the {guilabel}`Tax agency name`. Based on the business unit and tax agency selected, the + {guilabel}`Tax code`, {guilabel}`Address`, {guilabel}`Phone number`, and {guilabel}`Separator + used` are automatically filled and uneditable. + +2. Click {guilabel}`Select the invoice type for issuance`, and then select and fill in the + following information : + + - {guilabel}`Invoice type`: The invoice type on which to declare an issuance notice. + - {guilabel}`Invoice template`: Select from the list of templates available based on the invoice + type. + - {guilabel}`Symbol`: Select from the list of symbols available based on the invoice type. + - {guilabel}`Quantity`: Total number of invoices to issue for the selected type. Based on the + type and template selected, this field is filled in automatically. It can be changed if needed. + - {guilabel}`Start date of use`: The date from which the invoice template, range, and quantity + are used for the issuance notice. + +3. Click {guilabel}`Save` and select more invoice types if necessary by repeating the steps above. + Click {guilabel}`Save` to finish drafting the notice. + +4. Click {guilabel}`Send to tax authorities` for approval. Once approved, the notice's + {guilabel}`Status` is changed to {guilabel}`Active`. + +(localizations-vietnam-sinvoice-odoo)= + +#### Odoo database + +##### Link Odoo to SInvoice + +To connect Odoo with SInvoice, go to {menuselection}`Accounting --> Configuration --> Settings`. +In the {guilabel}`Vietnamese Integration` section, fill in your SInvoice {guilabel}`Username` and +{guilabel}`Password`. Add a {guilabel}`Default symbol` to generate a prefix for the invoice number +managed in SInvoice if needed. + +##### Invoice template + +To create SInvoice templates, go to {menuselection}`Accounting --> Configuration --> Templates`. +Click {guilabel}`New` and add a {guilabel}`Template code` and a {guilabel}`Template Invoice Type`. +The {guilabel}`Template code` is the initial sequence of digits in the name assigned by SInvoice. +For example, if the invoice template is `1/001 - Hóa đơn GTGT - ND123`, the {guilabel}`Template +code` is `1/001`. The SInvoice templates in Odoo must match the ones in SInvoice. + +To add {guilabel}`Invoice Symbols`, click {guilabel}`Add a new line`. + +### Sending invoices to SInvoice + +Invoices can be sent to SInvoice once they have been confirmed. To do so, follow the +{ref}`invoice sending ` steps. In the {guilabel}`Send` popup, enable +{guilabel}`Send to SInvoice` and click {guilabel}`Send & Print`. + +Once the invoice has been successfully submitted to SInvoice, the {guilabel}`SInvoice Status` field +in the {guilabel}`SInvoice` tab of the invoice is updated to {guilabel}`Sent`. The +{guilabel}`SInvoice Number`, {guilabel}`Issue Date`, {guilabel}`Secret Code` and {guilabel}`eInvoice +Number` fields are also updated. The same information is available on SInvoice. + +#### Replacement or adjustment invoices + +A replacement invoice is issued to correct an invoice that has **yet to be tax declared**, whereas +an adjustment invoice is issued to correct one that has **already been tax declared**. Follow these +steps to issue a replacement or adjustment invoice: + +1. Open the invoice and click {guilabel}`Credit Note`. + +2. In the {guilabel}`Credit Note` popup, fill in the following fields: + + - {guilabel}`Reason displayed on Credit Note` + - {guilabel}`Adjustment type` + - {guilabel}`Agreement Name` + - {guilabel}`Agreement Date` + - {guilabel}`Journal` + - {guilabel}`Reversal date` + +3. Click {guilabel}`Reverse and Create Invoice` to issue a replacement invoice, or + {guilabel}`Reverse` to issue an adjustment invoice. + +The {guilabel}`SInvoice Status` in the {guilabel}`SInvoice` invoice tab is updated to +{guilabel}`Replaced` for a replacement invoice or {guilabel}`Adjusted` for an adjustment invoice. + +#### Invoice cancellation + +If an invoice needs to be canceled, open the invoice and click {guilabel}`Request Cancel`. In the +{guilabel}`Invoice Cancellation` popup, enter the cancellation {guilabel}`Reason`, +{guilabel}`Agreement Name`, and {guilabel}`Agreement Date`, and click {guilabel}`Request +Cancellation`. + +The {guilabel}`SInvoice Status` in the {guilabel}`SInvoice` invoice tab is updated to +{guilabel}`Canceled`. + +(localizations-vietnam-qrcode)= + +## QR banking codes + +Vietnamese QR banking is a payment service platform that allows customers to make instant domestic +payments to individuals and merchants in Vietnamese dong via online and mobile banking. + +### Configuration + +To activate QR banking codes, go to {menuselection}`Accounting --> Configuration --> Settings` and +enable {guilabel}`QR Codes` in the {guilabel}`Customer Payments` section. + +#### Bank account + +To activate QR banking for a bank account, go to {menuselection}`Contacts --> Configuration --> +Bank Accounts` and select the bank account. Fill in the {guilabel}`Bank Identifier Code`, +{guilabel}`Proxy Type` (based on the information used to identify the {guilabel}`Merchant Account`, +such as the card number and bank account numbers), and {guilabel}`Proxy Value` fields. + +Enable {guilabel}`Include Reference` to include the invoice number in the QR code. + +:::{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 + {guilabel}`Bank` journal. +::: + +:::{seealso} +{doc}`../accounting/bank` +::: + +### Generating QR codes on invoices + +When creating a new invoice, open the {guilabel}`Other Info` tab and select {guilabel}`EMV +Merchant-Presented QR-code` in the {guilabel}`Payment QR-code` field. + +:::{note} +Ensure the {guilabel}`Recipient Bank` is configured, as Odoo uses this field to generate QR +codes. +::: + +[sinvoice]: https://www.sinvoice.vn/ + diff --git a/content/applications/finance/payment_providers.md b/content/applications/finance/payment_providers.md new file mode 100644 index 000000000..1078d8fae --- /dev/null +++ b/content/applications/finance/payment_providers.md @@ -0,0 +1,472 @@ +--- +show-content: true +substitutions: + V: "\u2714" +--- + +# Online payments + +```{toctree} +:titlesonly: true + +payment_providers/wire_transfer +payment_providers/adyen +payment_providers/amazon_payment_services +payment_providers/asiapay +payment_providers/authorize +payment_providers/buckaroo +payment_providers/demo +payment_providers/flutterwave +payment_providers/mercado_pago +payment_providers/mollie +payment_providers/paypal +payment_providers/razorpay +payment_providers/stripe +payment_providers/worldline +payment_providers/xendit +``` + +Odoo embeds several **payment providers** that allow your customers to pay online, on their +*customer portals*, or on your *eCommerce website*. They can pay sales orders, invoices, or +subscriptions with recurring payments using their favorite payment methods, such as +**credit cards**. + +Each payment provider is linked to a list of supported {ref}`payment methods +` that can be (de)activated based on your needs. + +```{image} payment_providers/online-payment.png +:alt: Online payment form +``` + +:::{note} +Odoo apps delegate the handling of sensitive information to the certified payment provider so +that you don't ever have to worry about PCI compliance. No sensitive information (such as credit +card numbers) is stored on Odoo servers or Odoo databases hosted elsewhere. Instead, Odoo apps +use a unique reference number for the data stored safely in the payment providers' systems. +::: + +(payment-providers-supported-providers)= + +## Supported payment providers + +To access the supported payment providers, go to {menuselection}`Accounting --> Configuration --> +Payment Providers`, {menuselection}`Website --> Configuration --> Payment Providers`, or +{menuselection}`Sales --> Configuration --> Payment Providers`. + +(payment-providers-online-providers)= + +### Online payment providers + +```{eval-rst} +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + :widths: auto + + * - + - Payment flow from + - :ref:`Tokenization ` + - :ref:`Manual capture ` + - :ref:`Refunds ` + - :ref:`Express checkout ` + * - :doc:`Adyen ` + - Odoo + - |V| + - Full and partial + - Full and partial + - + * - :doc:`Amazon Payment Services ` + - The provider's website + - + - + - + - + * - :doc:`AsiaPay ` + - The provider's website + - + - + - + - + * - :doc:`Authorize.Net ` + - Odoo + - |V| + - Full only + - Full only + - + * - :doc:`Buckaroo ` + - The provider's website + - + - + - + - + * - :doc:`Flutterwave ` + - The provider's website + - |V| + - + - + - + * - :doc:`Mercado Pago ` + - The provider's website + - + - + - + - + * - :doc:`Mollie ` + - The provider's website + - + - + - + - + * - :doc:`PayPal ` + - The provider's website + - + - + - + - + * - :doc:`Razorpay ` + - Odoo + - |V| + - Full only + - Full and partial + - + * - :doc:`Stripe ` + - Odoo + - |V| + - Full only + - Full and partial + - |V| + * - :doc:`Worldline ` + - The provider's website + - |V| + - + - + - + * - :doc:`Xendit ` + - The provider's website + - + - + - + - +``` + +:::{note} +- Each provider has its own specific configuration flow, depending on which feature is + available. +- Some of these online payment providers can also be added as {doc}`bank accounts + <../finance/accounting/bank>`, but this is **not** the same process as adding them as payment + providers. Payment providers allow customers to pay online, and bank accounts are added and + configured in the Accounting app to do a {doc}`bank reconciliation + `. +::: + +:::{tip} +In addition to the regular payment providers that integrate with an API, such as Stripe, PayPal, +or Adyen, Odoo bundles the {doc}`Demo payment provider `. This payment +provider allows you to test business flows involving online payments. No credentials are required +as the demo payments are dummy payments. +::: + +(payment-providers-bank-payments)= + +### Bank payments + +- {doc}`Wire Transfer ` + When selected, Odoo displays your payment information with a payment reference. You have to + approve the payment manually once you have received it in your bank account. +- {doc}`SEPA Direct Debit <../finance/accounting/payments/batch_sdd>` + Your customers can make a bank transfer to register a SEPA Direct Debit mandate and get their + bank account charged directly. + +(payment-providers-add-new)= + +## Enabling a payment provider + +To add a new payment provider and make its related payment methods available to your customers, +proceed as follows: + +1. Go to the payment provider's website, create an account, and make sure you have the API + credentials requested for third-party use. These are necessary for Odoo to communicate with the + payment provider. +2. In Odoo, navigate to the {guilabel}`Payment providers` by going to {menuselection}`Accounting --> + Configuration --> Payment Providers`, {menuselection}`Website --> Configuration --> Payment + Providers`, or {menuselection}`Sales --> Configuration --> Payment Providers`. +3. Select the provider and configure the {guilabel}`Credentials` tab. +4. Set the {guilabel}`State` field to {guilabel}`Enabled`. + +:::{note} +- The fields available in the {guilabel}`Credentials` tab depend on the payment provider. Refer + to the {ref}`related documentation ` for more + information. +- Once you have enabled the payment provider, it is automatically published on your website. + If you wish to unpublish it, click the {guilabel}`Published` button. Customers cannot make + payments through an unpublished provider, but they can still manage + {dfn}`(delete and assign to a subscription)` their existing tokens linked to such a provider. +::: + +(payment-providers-test-mode)= + +### Test mode + +If you wish to try the payment provider as a test, set the {guilabel}`State` field in the payment +provider form to {guilabel}`Test mode`, then enter your provider's test/sandbox credentials in the +{guilabel}`Credentials` tab. + +:::{note} +By default, the payment provider remains **unpublished** in test mode so that it's not visible to +visitors. +::: + +:::{warning} +We recommend using the test mode on a duplicate or a test database to avoid potential issues +with your invoice numbering. +::: + +(payment-providers-payment-methods)= + +## Payment methods + +Each payment provider is related to a list of supported payment methods; the methods listed in the +{guilabel}`Payment methods` field in the {guilabel}`Configuration` tab of the payment provider form +are the ones that have been activated. To activate or deactivate a payment method for a provider, +click {guilabel}`Enable Payment Methods`, then click the toggle button of the related method. + +:::{tip} +Payment methods are displayed on your website based on their sequence order. To reorder them, +click {guilabel}`Enable Payment Methods` in the payment provider form, then, in the +{guilabel}`Payment Methods` list, drag and drop the payment methods in the desired order. +::: + +### Icons and brands + +The icons displayed next to the payment method on your website are either the icons of the brands +activated for the payment method or, if there aren't any, the icons of the payment methods +themselves. To modify them, go to {menuselection}`Accounting --> Configuration --> Payment Methods`, +{menuselection}`Website --> Configuration --> Payment Methods` or {menuselection}`Sales --> +Configuration --> Payment Methods`, then click on the payment method. + +To modify a payment method's icon, hover your mouse over the image in the upper-right corner of the +payment method's form and click the {icon}`fa-pencil` ({guilabel}`pencil`) icon. + +Select the {guilabel}`Brands` tab to view the brands that have been activated for the payment +method. The brands and their related icons are displayed based on their sequence order; to reorder +them, drag and drop them in the desired order. To modify a brand's icon, select the brand, then, +in the popup window that opens, hover the mouse over the image in the upper-right corner and click +the {icon}`fa-pencil` ({guilabel}`pencil`) icon. + +### Advanced configuration + +To configure payment methods further, go to {menuselection}`Accounting --> Configuration --> Payment +Methods`, {menuselection}`Website --> Configuration --> Payment Methods` or {menuselection}`Sales +--> Configuration --> Payment Methods`. Click on the payment method, then activate the +{ref}`developer mode `. Click the {guilabel}`Configuration` tab to adapt the +features. + +:::{danger} +- Each payment method is preconfigured in a way that aligns with the payment providers' + behavior and their integration with Odoo. Any change to this configuration may result in errors + and should be tested on a duplicate or test database first. +- Modifications to the payment method's configuration only work to the extent of the method's + and provider's capabilities. For example, adding {ref}`countries + ` for a payment method only supported in one country or + enabling {ref}`tokenization ` for a method linked to a provider + that does not support it will not produce the intended results. +::: + +(payment-providers-tokenization)= + +## Tokenization + +{ref}`If the payment provider supports this feature `, customers +can save their payment method details for later. To enable this feature, go to the +{guilabel}`Configuration` tab of the selected payment provider and enable {guilabel}`Allow Saving +Payment Methods`. + +In this case, a **payment token** is created in Odoo to be used as a payment method for subsequent +payments without the customer having to enter their payment method details again. This is +particularly useful for the eCommerce conversion rate and subscriptions that use recurring payments. + +:::{tip} +To add or delete their saved payment method details, customers can click {guilabel}`Manage +payment methods` in the {ref}`customer portal `. +::: + +:::{admonition} PCI DSS and Attestation of Compliance +Odoo is not [PCI](https://www.pcisecuritystandards.org) DSS-certified because it does not +store cardholder data or process payments. Instead, it outsources tokenization and payment to +{ref}`external payment providers `, which means that as an +Odoo customer, you only need to complete the minimal Self-Assessment Questionnaire (SAQ) with +the provider to obtain the Attestation of Compliance (AoC) and achieve PCI compliance. Odoo +should not be mentioned as a payment processor or a third-party service provider in the +{abbr}`SAQ (Self-Assessment Questionnaire)`. +::: + +(payment-providers-manual-capture)= + +## Manual capture + +{ref}`If the payment provider supports this feature `, you can +authorize and capture payments in two steps instead of one. To enable this feature, go to the +{guilabel}`Configuration` tab of the selected payment provider and enable {guilabel}`Capture Amount +Manually`. + +When you authorize a payment, the funds are reserved on the customer's payment method but not +immediately charged. They are charged when you manually capture the payment later on. You can also +void the authorization to cancel it and release the reserved funds. Capturing payments manually is +helpful in many situations: + +- Receive the payment confirmation and wait until the order is shipped to capture the payment. +- Review and verify that orders are legitimate before the payment is completed and the fulfillment + process starts. +- Avoid potentially high refund fees for refunded payments: payment providers will not charge you + for voiding an authorization. +- Hold a security deposit to return later, minus any deductions (e.g., in case of damages). + +To capture the payment after it was authorized, go to the related sales order or invoice and click +the {guilabel}`Capture Transaction` button. To release the funds, click the {guilabel}`Void +Transaction` button. + +:::{note} +- Some payment providers support capturing only part of the authorized amount. The remaining + amount can then be either captured or voided. These providers have the value **Full and + partial** in the {ref}`table above `. The providers that + only support capturing or voiding the total amount have the value **Full only**. +- The funds are likely not reserved forever. After a certain time, they may be automatically + released back to the customer's payment method. Refer to your payment provider's documentation + for the exact reservation duration. +- Odoo does not support this feature for all payment providers, but some allow the manual capture + from their website interface. +::: + +(payment-providers-refunds)= + +## Refunds + +If your payment provider supports this feature, you can refund payments directly from Odoo. It does +not need to be enabled first. To refund a customer payment, navigate to it and click the +{guilabel}`Refund` button. + +:::{note} +- Some payment providers support refunding only part of the amount. The remaining amount can then + optionally be refunded, too. These providers have the value **Full and partial** in the + {ref}`table above `. The providers that only support + refunding the total amount have the value **Full only**. +- Odoo does not support this feature for all payment providers, but some allow to refund payments + from their website interface. +::: + +(payment-providers-express-checkout)= + +## Express checkout + +{ref}`If the payment provider supports this feature `, you can +allow customers to use the {guilabel}`Google Pay` and {guilabel}`Apple Pay` buttons and pay their +eCommerce orders in one click. When they use one of these buttons, customers go straight from the +cart to the confirmation page without filling out the contact form. They just have to validate the +payment on Google's or Apple's payment form. + +To enable this feature, go to the {guilabel}`Configuration` tab of the selected payment provider and +enable {guilabel}`Allow Express Checkout`. + +:::{note} +All prices shown on the express checkout payment form always include taxes. +::: + +(payment-providers-availability)= + +## Availability + +You can adapt the payment provider's availability by specifying the {guilabel}`Maximum amount` +allowed and modifying the {guilabel}`Currencies` and {guilabel}`Countries` in the +{guilabel}`Configuration` tab. + +:::{tip} +To display an availability report for payment providers and payment methods, and to help diagnose +potential availability issues on the payment form, enable the {ref}`developer-mode`, then click +the {icon}`fa-bug` ({guilabel}`bug`) icon next to the {guilabel}`Choose a payment method` +heading on the payment form. The report includes a list of enabled payment providers and payment +methods, reasons for any payment providers or methods not being available, if applicable, and a +list of supported providers for each payment method. +::: + +(payment-providers-currencies-countries)= + +### Currencies and countries + +All payment providers have a different list of available currencies and countries. They serve as a +first filter during payment operations, i.e., the payment methods linked to the payment provider are +not available for selection if the customer's currency or country is not in the supported list. As +there might be errors, updates, and unknowns in the lists of available currencies and countries, +adding or removing a payment provider's supported currencies or countries is possible. + +:::{note} +- {ref}`Payment methods ` also have their own list of + available currencies and countries that serves as another filter during payment operations. +- If the list of supported currencies or countries is empty, it means the list is too long to be + displayed, or Odoo does not have information on that payment provider. The payment provider + remains available, even though it is possible the payment will be refused at a later stage + should the country or currency not be supported. +::: + +### Maximum amount + +You can restrict the {guilabel}`Maximum Amount` that can be paid with the selected provider. Leave +the field to `0.00` to make the payment provider available regardless of the payment amount. + +:::{important} +This feature is not intended to work on pages that allow the customer to update the payment +amount, e.g., the **Donation** snippet and the **Checkout** page when paid {doc}`shipping methods +<../websites/ecommerce/checkout_payment_shipping/shipping>` are enabled. +::: + +(payment-providers-journal)= + +## Payment journal + +A {doc}`payment journal ` must be defined for the payment provider to record the +payments on an **outstanding account**. By default, the {guilabel}`Bank` journal is added as the +payment journal for all payment providers. To modify it, go to the {guilabel}`Configuration` tab of +the selected payment provider and select another {guilabel}`Payment journal`. + +:::{note} +- The payment journal must be a {guilabel}`Bank` journal. +- The same journal can be used for several payment providers. +- Payment journals must only be configured if the {doc}`Invoicing or Accounting app ` + is installed. +::: + +### Accounting perspective + +From an accounting perspective, there are two types of online payment workflows: the payments that +are directly deposited into your bank account and follow the usual {doc}`reconciliation +` workflow, and those coming from third-party {ref}`online payment +providers ` and require you to follow another accounting +workflow. For these payments, you need to consider how you want to record your payments' journal +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 +payments from other payments. + +```{image} payment_providers/bank_journal.png +:alt: Define an outstanding account for a payment provider. +``` + +:::{seealso} +- {doc}`payment_providers/wire_transfer` +- {doc}`payment_providers/adyen` +- {doc}`payment_providers/authorize` +- {doc}`payment_providers/asiapay` +- {doc}`payment_providers/buckaroo` +- {doc}`payment_providers/demo` +- {doc}`payment_providers/mercado_pago` +- {doc}`payment_providers/mollie` +- {doc}`payment_providers/paypal` +- {doc}`payment_providers/razorpay` +- {doc}`payment_providers/stripe` +- {doc}`payment_providers/worldline` +- {doc}`payment_providers/xendit` +- {doc}`../websites/ecommerce/checkout_payment_shipping/payments` +- {doc}`accounting/bank` +::: + diff --git a/content/applications/finance/payment_providers/adyen.md b/content/applications/finance/payment_providers/adyen.md new file mode 100644 index 000000000..48fc3ff46 --- /dev/null +++ b/content/applications/finance/payment_providers/adyen.md @@ -0,0 +1,171 @@ +# Adyen + +[Adyen](https://www.adyen.com/) is a Dutch company that offers several online payment +possibilities. + +:::{seealso} +- {ref}`payment_providers/add_new` +- {doc}`../payment_providers` +::: + +:::{note} +Adyen works only with customers processing **more** than **10 million annually** or invoicing a +**minimum** of **1.000** transactions **per month**. +::: + +## Configuration + +:::{seealso} +{ref}`payment_providers/add_new` +::: + +First, reach Adyen support to enable {guilabel}`multiple partial capture` for you. + +### Credentials tab + +Odoo needs your **API Credentials** to connect with your Adyen account, which comprise: + +- **Merchant Account**: The code of the merchant account to use with Adyen. +- {ref}`API Key `: The API key of the webservice user. +- {ref}`Client Key `: The client key of the webservice user. +- {ref}`HMAC Key `: The HMAC key of the webhook. +- {ref}`Checkout API URL `: The base URL for the Checkout API endpoints. +- {ref}`Recurring API URL `: The base URL for the Recurring API endpoints. + +You can copy your credentials from your Adyen account, and paste them in the related fields under +the **Credentials** tab. + +:::{important} +If you are trying Adyen as a test, with an Adyen *test account*, head to +{menuselection}`Accounting --> Configuration --> Payment Providers`. There, click on +{guilabel}`Adyen`, enable {guilabel}`Test Mode` and enter your credentials in the +{guilabel}`Credentials` tab. +::: + +(adyen-api-and-client-keys)= + +#### API Key and Client Key + +In order to retrieve the API Key and the Client Key, log into your Adyen account, go to +{menuselection}`Developers --> API Credentials`. + +- If you already have an API user, open it. +- If you don't have an API user yet, click on **Create new credential**. + +Go to {menuselection}`Server settings --> Authentification` and copy or generate your **API Key**. +Be careful to copy your API key as you'll not be allowed to get it later without generating a new +one. + +Now, head to {menuselection}`Client settings --> Authentification` and cody or generate your +**Client Key**. This is also the place where you can {ref}`allow payments to be made from your +website `. + +(adyen-hmac-key)= + +#### HMAC key + +In order to retrieve the HMAC Key, you'll need to configure a `Standard Notification` webhook. For +this, log into your Adyen account then go to {menuselection}`Developers --> Webhooks --> Add webhook +--> Add Standard notification`. + +```{image} adyen/adyen-add-webhook.png +:align: center +:alt: Configure a webhook. +``` + +There, in {menuselection}`General --> Server configuration --> URL`, enter your server address +followed by `/payment/adyen/notification`. + +```{image} adyen/adyen-webhook-url.png +:align: center +:alt: Enter the notification URL. +``` + +Then enter {menuselection}`Security --> HMAC Key --> Generate`. Be careful to copy the key as you +will not be allowed to do it later without generating a new one. + +```{image} adyen/adyen-hmac-key.png +:align: center +:alt: Generate a HMAC key and save it. +``` + +You have to save the webhook to finalize its creation. + +(adyen-urls)= + +#### API URLs + +All Adyen API URLs include a customer area-specific prefix generated by Adyen. To configure the +URLs, proceed as follows: + +1. Log into your Adyen account, then go to {menuselection}`Developers --> API URLs`. + +2. Copy the {guilabel}`Prefix` for your live Customer area (i.e., **data center**) and save it for + later. + + ```{image} adyen/adyen-api-urls.png + :alt: Copy the prefix for the Adyen APIs + ``` + +3. In Odoo, {ref}`navigate to the payment provider Adyen `. + +4. In the {guilabel}`Checkout API URL` field, enter the following URL and replace `yourprefix` with + the prefix you previously saved: + `https://yourprefix-checkout-live.adyenpayments.com/checkout` + +5. In the {guilabel}`Recurring API URL` field, enter the following URL and replace `yourprefix` with + the prefix you previously saved: + `https://yourprefix-pal-live.adyenpayments.com/pal/servlet/Recurring`. + +:::{note} +If you are trying Adyen as a test, you can use the following URLs instead: + +- {guilabel}`Checkout API URL`: `https://checkout-test.adyen.com` +- {guilabel}`Recurring API URL`: `https://pal-test.adyen.com/pal/servlet/Recurring` +::: + +### Adyen Account + +(adyen-allowed-origins)= + +#### Allow payments from a specific origin + +To allow payment originated from your website, follow the steps in {ref}`adyen/api_and_client_keys` +to navigate to your API user and go to {menuselection}`Add allowed origins`, then add the URLs from +where payments will be made (the URLs of the servers hosting your Odoo instances). + +```{image} adyen/adyen-allowed-origins.png +:align: center +:alt: Allows payments originated from a specific domain. +``` + +### Place a hold on a card + +Adyen allows you to capture an amount manually instead of having an immediate capture. + +To set it up, enable the **Capture Amount Manually** option on Odoo, as explained in the +{ref}`payment providers documentation `. + +Then, open your Adyen Merchant Account, go to {menuselection}`Account --> Settings`, and set the +**Capture Delay** to **manual**. + +```{image} adyen/adyen_capture_delay.png +:align: center +:alt: Capture Delay settings in Adyen +``` + +:::{caution} +- If you configure Odoo to capture amounts manually, make sure to set the **Capture Delay** to + **manual** on Adyen. Otherwise, the transaction will be blocked in the authorized state in + Odoo. +::: + +:::{note} +- After **7 days**, if the transaction has not been captured yet, the customer has the right to + **revoke** it. +::: + +:::{seealso} +{doc}`../payment_providers` +::: + diff --git a/content/applications/finance/payment_providers/amazon_payment_services.md b/content/applications/finance/payment_providers/amazon_payment_services.md new file mode 100644 index 000000000..df4f4fe6c --- /dev/null +++ b/content/applications/finance/payment_providers/amazon_payment_services.md @@ -0,0 +1,61 @@ +# Amazon Payment Services + +[Amazon Payment Services](https://paymentservices.amazon.com/) or APS is an online payment provider +established in Dubai offering several online payment options. + +(payment-providers-aps-configure-dashboard)= + +## Configuration on APS Dashboard + +1. Log into your [Amazon Payment Services Dashboard](https://fort.payfort.com/) and go to + {menuselection}`Integration Settings --> Security Settings`. Generate the + {guilabel}`Access Code` if none has been generated yet. Copy the values of the + {guilabel}`Merchant Identifier`, {guilabel}`Access Code`, {guilabel}`SHA Request Phrase` and + {guilabel}`SHA Response Phrase` fields, and save them for later. +2. Enter your Odoo database URL in the {guilabel}`Origin URL`, for example: + `https://yourcompany.odoo.com/`. Then, click on {guilabel}`Save Changes`. +3. Navigate to {menuselection}`Integration Settings --> Technical Settings` and click on + {guilabel}`Redirection`. Make sure {guilabel}`Status` is set to `Active` and select your + preferred payment methods underneath in {guilabel}`Payment Options`. +4. Set + {guilabel}`Send Response Parameters` + to + {guilabel}`Yes` + and enter your database URL + followed by + `/payment/aps/return` + in the + {guilabel}`Redirection URL` + . + For example + `https://yourcompany.odoo.com/payment/aps/return` + . + Enter your database URL followed by + `/payment/aps/webhook` + in the + + {guilabel}`Direct Transaction Feedback` + and + {guilabel}`Notification URL` + fields. + For example + `https://yourcompany.odoo.com/payment/aps/webhook` + . + Click on + {guilabel}`Save Changes` + . +5. Under {menuselection}`Integration Settings --> Payment Page Template` you can customize the + look and feel of the Amazon Payment Services payment page (where customers fill out their + credit card details during payment). + +(payment-providers-aps-configure-odoo)= + +## Configuration on Odoo + +1. {ref}`Navigate to the payment provider Amazon Payment Services `, + change its state to {guilabel}`Enabled`, and make sure it is {guilabel}`Published`. +2. In the {guilabel}`Credentials` tab, fill the {guilabel}`Merchant Identifier`, + {guilabel}`Access Code`, {guilabel}`SHA Request Phrase` and {guilabel}`SHA Response Phrase` with + the values you saved at the step {ref}`payment_providers/aps/configure-dashboard`. +3. Configure the rest of the options to your liking. + diff --git a/content/applications/finance/payment_providers/asiapay.md b/content/applications/finance/payment_providers/asiapay.md new file mode 100644 index 000000000..080a7e030 --- /dev/null +++ b/content/applications/finance/payment_providers/asiapay.md @@ -0,0 +1,100 @@ +# AsiaPay + +[AsiaPay](https://www.asiapay.com/) is an online payments provider established in Hong Kong and +covering several Asian countries and payment methods. + +(payment-providers-asiapay-configure-dashboard)= + +## Configuration on AsiaPay Dashboard + +1. Log into AsiaPay Dashboard according to the account provided by AsiaPay. + + - [PayDollar](https://www.paydollar.com/b2c2/eng/merchant/index.jsp): For markets in HK, + CN, MO, TW, SG, MY, IN, VN, NZ and AU + - [PesoPay](https://www.pesopay.com/b2c2/eng/merchant/index.jsp): For market in PH + - [SiamPay](https://www.siampay.com/b2c2/eng/merchant/index.jsp): For market in TH + - [BimoPay](https://www.bimopay.com/b2c2/eng/merchant/index.jsp): For market in ID + +2. Go to {menuselection}`Profile --> Account Information`. Copy the values of the + {guilabel}`Currency` and {guilabel}`Secure Hash` fields and save them for later. + +3. Go to + + {menuselection}`Profile --> Payment Account Settings` + + and enable the option + + + {guilabel}`Return Value Link (Datefeed)` + + ; + + Enter your Odoo database URL followed by + + `/payment/asiapay/webhook` + + in the + + + {guilabel}`Return Value Link (Datefeed)` + + text field. For example: + + + `https://yourcompany.odoo.com/payment/asiapay/webhook` + + ; + + Click on + + {guilabel}`Test` + + to check if the webhook is working correctly. + +4. Click on {guilabel}`Update` to finalize the configuration. + +(payment-providers-asiapay-configure-odoo)= + +## Configuration on Odoo + +1. {ref}`Navigate to the payment provider AsiaPay ` and change its state + to {guilabel}`Enabled`. +2. In the + {guilabel}`Credentials` + tab, choose the + {guilabel}`Brand` + of your Asiapay account. Then + fill in the + {guilabel}`Merchant ID` + and + {guilabel}`Secure Hash Secret` + , and the + + {guilabel}`Currency` + in the + {guilabel}`Configuration` + tab with the values you saved at the + step + {ref}`payment_providers/asiapay/configure_dashboard` + ; + By default, the payment provider AsiaPay is configured to verify the secret hash with the hash + function + `SHA1` + . If a different function is + {ref}`set on your account + ` + , activate the + {ref}`developer mode + ` + and set the same value to the field + {guilabel}`Secure Hash Function` + in the + + {guilabel}`Credentials` + tab. +3. Configure the rest of the options to your liking. + +:::{seealso} +- {doc}`../payment_providers` +::: + diff --git a/content/applications/finance/payment_providers/authorize.md b/content/applications/finance/payment_providers/authorize.md new file mode 100644 index 000000000..bafd93c3c --- /dev/null +++ b/content/applications/finance/payment_providers/authorize.md @@ -0,0 +1,168 @@ +# Authorize.Net + +[Authorize.Net](https://www.authorize.net) is a United States-based online payment solution +provider, allowing businesses to accept **credit cards**. + +## Configuration + +:::{seealso} +- {ref}`payment_providers/add_new` +::: + +### Credentials tab + +Odoo needs your **API Credentials & Keys** to connect with your Authorize.Net account, which +comprise: + +- **API Login ID**: The ID solely used to identify the account with Authorize.Net. +- **API Transaction Key** +- **API Signature Key** +- **API Client Key** + +To retrieve them, log into your Authorize.Net account, go to {menuselection}`Account --> Settings +--> Security Settings --> API Credentials & Keys`, generate your **Transaction Key** and +**Signature Key**, and paste them on the related fields in Odoo. Then, click on **Generate Client +Key**. + +:::{important} +To test Authorize.Net with a *sandbox* account, change the {guilabel}`State` to {guilabel}`Test +Mode`. We recommend doing this on a test Odoo database, rather than on your main database. + +If you use the {guilabel}`Test Mode` with a regular account, it results in the following error: +*The merchant login ID or password is invalid or the account is inactive*. +::: + +### Configuration tab + +#### Place a hold on a card + +With Authorize.Net, you can enable the {ref}`manual capture +`. If enabled, the funds are reserved for 30 days on the +customer's card, but not charged yet. + +:::{warning} +After **30 days**, the transaction is **voided automatically** by Authorize.Net. +::: + +:::{seealso} +- {doc}`../payment_providers` +::: + +(authorize-ach-payments)= + +## ACH payments (USA only) + +{abbr}`ACH (automated clearing house)` is an electronic funds transfer system used between bank +accounts in the United States. + +### Configuration + +To give customers the possibility to pay using ACH, [sign up for Authorize.Net eCheck's service](https://www.authorize.net/payments/echeck.html). Once eCheck is activated, duplicate the +previously configured Authorize.Net payment provider on Odoo by going to {menuselection}`Accounting +--> Configuration --> Payment Providers --> Authorize.net`. Then, click the cog icon +({guilabel}`⛭`) and select {guilabel}`Duplicate`. Change the provider's name to differentiate both +versions (e.g., `Authorize.net - Banks`). + +When ready, change the provider's {guilabel}`State` to {guilabel}`Enabled` for a regular account or +{guilabel}`Test Mode` for a sandbox account. + +## Import an Authorize.Net statement + +(authorize-import-template)= + +### Export from Authorize.Net + +:::{admonition} Template +{download}`Download the Excel import template. ` +::: + +- Log in to Authorize.Net. +- Go to {menuselection}`Account --> Statements --> eCheck.Net Settlement Statement`. +- Define an export range using an *opening* and *closing* batch settlement. All transactions within + the two batch settlements will be exported to Odoo. +- Select all transactions within the desired range, copy them, and paste them into the + {guilabel}`Report 1 Download` sheet of the {ref}`Excel import template + `. + +```{image} authorize/authorize-report1.png +:alt: Selecting Authorize.Net transactions to import +``` + +```{eval-rst} +.. example:: + + .. image:: authorize/authorize-settlement-batch.png + :align: center + :alt: Settlement batch of an Authorize.Net statement + + In this case, the first batch (01/01/2021) of the year belongs to the settlement of 12/31/2020, + so the **opening** settlement is from 12/31/2020. +``` + +Once the data is in the {guilabel}`Report 1 Download` sheet: + +- Go to the {guilabel}`Transaction Search` tab on Authorize.Net. +- Under the {guilabel}`Settlement Date` section, select the previously used range of batch + settlement dates in the {guilabel}`From:` and {guilabel}`To:` fields and click {guilabel}`Search`. +- When the list has been generated, click {guilabel}`Download to File`. +- In the pop-up window, select {guilabel}`Expanded Fields with CAVV Response/Comma Separated`, + enable {guilabel}`Include Column Headings`, and click {guilabel}`Submit`. +- Open the text file, select {guilabel}`All`, copy the data, and paste it into the {guilabel}`Report + 2 Download` sheet of the {ref}`Excel import template `. +- Transit lines are automatically filled in and updated in the {guilabel}`transit for report 1` and + {guilabel}`transit for report 2` sheets of the {ref}`Excel import template + `. Make sure all entries are present, and **if not**, copy the formula + from previously filled-in lines of the {guilabel}`transit for report 1` or {guilabel}`2` sheets + and paste it into the empty lines. + +:::{important} +To get the correct closing balance, **do not remove** any line from the Excel sheets. +::: + +### Import into Odoo + +To import the data into Odoo: + +- Open the {ref}`Excel import template `. +- Copy the data from the {guilabel}`transit for report 2` sheet and use *paste special* to only + paste the values in the {guilabel}`Odoo Import to CSV` sheet. +- Look for *blue* cells in the {guilabel}`Odoo Import to CSV` sheet. These are chargeback entries + without any reference number. As they cannot be imported as such, go to + {menuselection}`Authorize.Net --> Account --> Statements --> eCheck.Net Settlement Statement`. +- Look for {guilabel}`Charge Transaction/Chargeback`, and click it. +- Copy the invoice description, paste it into the {guilabel}`Label` cell of the {guilabel}`Odoo + Import to CSV` sheet, and add `Chargeback /` before the description. +- If there are multiple invoices, add a line into the {ref}`Excel import template + ` for each invoice and copy/paste the description into each respective + {guilabel}`Label` line. + +:::{note} +For **combined chargeback/returns** in the payouts, create a new line in the {ref}`Excel import +template ` for each invoice. +::: + +```{eval-rst} +.. example:: + + .. image:: authorize/authorize-chargeback-desc.png + :alt: Chargeback description +``` + +- Next, delete *zero transaction* and *void transaction* line items, and change the format + of the {guilabel}`Amount` column in the {guilabel}`Odoo Import to CSV` sheet to *Number*. +- Go back to {menuselection}`eCheck.Net Settlement Statement --> Search for a Transaction` and + search again for the previously used batch settlements dates. +- Verify that the batch settlement dates on eCheck.Net match the related payments' dates found in + the {guilabel}`Date` column of the {guilabel}`Odoo Import to CSV`. +- If it does not match, replace the date with the one from eCheck.Net. Sort the column by *date*, + and make sure the format is `MM/DD/YYYY`. +- Copy the data - column headings included - from the {guilabel}`Odoo Import to CSV` sheet, paste + it into a new Excel file, and save it using the CSV format. +- Open the Accounting app, go to {menuselection}`Configuration --> Journals`, tick the + {guilabel}`Authorize.Net` box, and click {menuselection}`Favorites --> Import records --> Load + file`. Select the CSV file and upload it into Odoo. + +:::{tip} +List of [eCheck.Net return codes](https://support.authorize.net/knowledgebase/Knowledgearticle/?code=000001293) +::: + diff --git a/content/applications/finance/payment_providers/buckaroo.md b/content/applications/finance/payment_providers/buckaroo.md new file mode 100644 index 000000000..1b321f141 --- /dev/null +++ b/content/applications/finance/payment_providers/buckaroo.md @@ -0,0 +1,35 @@ +# Buckaroo + +[Buckaroo](https://www.buckaroo.eu/) is a Dutch-based company that offers several online payment +possibilities. + +(payment-providers-buckaroo-configure-dashboard)= + +## Configuration on Buckaroo Plaza + +1. Log into [Buckaroo Plaza](https://plaza.buckaroo.nl), go to {menuselection}`My Buckaroo --> + Websites` and select the {guilabel}`Push settings` tab. +2. Tick the {guilabel}`Enable Push Response` check box in the {guilabel}`Delayed and Push responses` + section. +3. Enter the URL of your Odoo database, followed by `/payment/buckaroo/webhook` in both the + {guilabel}`Push URI Success/Pending` and {guilabel}`Push URI Failure` text fields. For example: + `https://yourcompany.odoo.com/payment/buckaroo/webhook`. +4. Leave the other fields as they are and click {guilabel}`Save`. +5. In the {guilabel}`General` tab, copy the website {guilabel}`Key` (i.e., the key used to uniquely + identify your website with Buckaroo) and save it for later. +6. Go to {menuselection}`Configuration --> Security --> Secret key`, enter or {guilabel}`Generate` a + {guilabel}`Secret key` and click {guilabel}`Save`. Save the key for later. + +## Configuration on Odoo + +1. {ref}`Navigate to the payment provider Buckaroo ` and change its state + to {guilabel}`Enabled`. +2. In the {guilabel}`Credentials` tab, fill the {guilabel}`Website Key` and {guilabel}`Secret Key` + fields with the values you saved at the step + {ref}`payment_providers/buckaroo/configure_dashboard`. +3. Configure the options in the other tabs to your liking. + +:::{seealso} +{doc}`../payment_providers` +::: + diff --git a/content/applications/finance/payment_providers/demo.md b/content/applications/finance/payment_providers/demo.md new file mode 100644 index 000000000..f18694b04 --- /dev/null +++ b/content/applications/finance/payment_providers/demo.md @@ -0,0 +1,39 @@ +# Demo + +Odoo's **Demo Payment Provider** allows you to test business flows involving online transactions +without requiring real banking credentials. + +## Configuration + +:::{seealso} +{ref}`payment_providers/add_new` +::: + +:::{important} +Switch the state to {guilabel}`Test Mode`. +::: + +## Payment outcome + +Upon checkout or when paying a bill online, you can choose the payment outcome when using the demo +payment provider. To do so, click on the {guilabel}`Payment Status` drop-down menu and select the +desired outcome. + +```{image} demo/demo-payment-outcome.png +:align: center +:alt: Payment status outcomes. +``` + +## Transaction state + +If you selected {guilabel}`Pending` as **payment outcome**, you can change the state of the +transaction straight from its form view. To access a transaction's form view, activate the +{ref}`developer mode `, and go to {menuselection}`Accounting / Website --> +Configuration --> Payment Transactions`. Then, change the status of a transaction by clicking on the +state bar ({guilabel}`Draft, Pending, Authorized, Confirmed, Cancelled, Error`). + +```{image} demo/demo-view-form.png +:align: center +:alt: Transaction's status bar. +``` + diff --git a/content/applications/finance/payment_providers/flutterwave.md b/content/applications/finance/payment_providers/flutterwave.md new file mode 100644 index 000000000..ac45d1305 --- /dev/null +++ b/content/applications/finance/payment_providers/flutterwave.md @@ -0,0 +1,54 @@ +# Flutterwave + +[Flutterwave](https://flutterwave.com/) is an online payments provider established in Nigeria and +covering several African countries and payment methods. + +(payment-providers-flutterwave-configure-dashboard)= + +## Configuration on Flutterwave Dashboard + +1. Log into [Flutterwave Dashboard](https://dashboard.flutterwave.com/) and go to + {menuselection}`Settings --> API`. Copy the values of the {guilabel}`Public Key` and + {guilabel}`Secret Key` fields and save them for later. +2. Go to + {menuselection}`Settings --> Webhooks` + and enter your Odoo database URL followed by + + `/payment/flutterwave/webhook` + in the + {guilabel}`URL` + text field. + For example: + `https://yourcompany.odoo.com/payment/flutterwave/webhook` + . +3. Fill the {guilabel}`Secret hash` with a password that you generate and save its value for later. +4. Make sure *all* the remaining checkboxes are ticked. +5. Click on **Save** to finalize the configuration. + +```{image} flutterwave/flutterwave-settings.png +:alt: Flutterwave settings +``` + +(payment-providers-flutterwave-configure-odoo)= + +## Configuration on Odoo + +1. {ref}`Navigate to the payment provider Flutterwave ` and change its + state to {guilabel}`Enabled`. + +2. In the {guilabel}`Credentials` tab, fill the {guilabel}`Public Key`, {guilabel}`Secret Key`, and + {guilabel}`Webhook Secret` with the values you saved at the step + {ref}`payment_providers/flutterwave/configure_dashboard`. + +3. Configure the rest of the options to your liking. + + :::{important} + If you choose to allow saving payment methods, it is recommended to only enable card payments + from Flutterwave dashboard, as only cards can be saved as payment tokens. To do so, go to your + Flutterwave Dashboard and then to {menuselection}`Settings --> Account Settings`. + ::: + +:::{seealso} +- {doc}`../payment_providers` +::: + diff --git a/content/applications/finance/payment_providers/mercado_pago.md b/content/applications/finance/payment_providers/mercado_pago.md new file mode 100644 index 000000000..339518400 --- /dev/null +++ b/content/applications/finance/payment_providers/mercado_pago.md @@ -0,0 +1,40 @@ +# Mercado Pago + +[Mercado Pago](https://www.mercadopago.com/) is an online payment provider covering several +countries, currencies and payment methods in Latin America. + +(payment-providers-mercado-pago-configure-dashboard)= + +## Configuration on Mercado Pago Dashboard + +1. Log into the [Mercado Pago Dashboard](https://www.mercadopago.com.mx/developers/panel) + and select your application or create a new one. +2. Select {guilabel}`Credenciales de producción` in the left part of the application page, then + select the industry, optionally enter your domain, and click {guilabel}`Activar credenciales + de producción`. +3. Copy the {guilabel}`Access token` and save it for later. + +:::{tip} +If you are trying Mercado Pago as a test, select {guilabel}`Credienciales de prueba` in the left +part of the application page, then copy the test {guilabel}`Access token`. +::: + +```{image} mercado_pago/mp-credentials.png +:alt: Production and testing credentials in Mercado Pago. +``` + +(payment-providers-mercado-pago-configure-odoo)= + +## Configuration on Odoo + +1. {ref}`Navigate to the payment provider Mercado Pago ` and change its + state to {guilabel}`Enabled`. +2. In the {guilabel}`Credentials` tab, fill in the {guilabel}`Access Token` with the value you saved + at the {ref}`payment_providers/mercado_pago/configure_dashboard` step. +3. Configure the rest of the options to your liking. + +:::{seealso} +- {doc}`../payment_providers` +- [Mercado Pago Odoo webinar](https://www.youtube.com/watch?v=CX8vPHMb1ic) +::: + diff --git a/content/applications/finance/payment_providers/mollie.md b/content/applications/finance/payment_providers/mollie.md new file mode 100644 index 000000000..332cd2d52 --- /dev/null +++ b/content/applications/finance/payment_providers/mollie.md @@ -0,0 +1,31 @@ +# Mollie + +[Mollie](https://www.mollie.com/) is an online payments platform established in the Netherlands. + +## Configuration + +:::{seealso} +- {ref}`payment_providers/add_new` +::: + +### Credentials tab + +Odoo needs your **API Credentials** to connect with your Mollie account, which comprise: + +- **API Key**: The test or live API Key depending on the configuration of the provider. + +You can copy your credentials from your Mollie account, and paste them in the related fields under +the **Credentials** tab. + +To retrieve your API key, log into your Mollie account, go to +{menuselection}`Developers --> API keys`, and copy your Test or Live **API Key**. + +:::{important} +If you are trying Mollie as a test, with the Test API key, change the **State** to *Test Mode*. +We recommend doing this on a test Odoo database, rather than on your main database. +::: + +:::{seealso} +- {doc}`../payment_providers` +::: + diff --git a/content/applications/finance/payment_providers/paypal.md b/content/applications/finance/payment_providers/paypal.md new file mode 100644 index 000000000..03541cd72 --- /dev/null +++ b/content/applications/finance/payment_providers/paypal.md @@ -0,0 +1,77 @@ +# PayPal + +[Paypal](https://www.paypal.com/) is an American online payment provider available worldwide and +one of the few that does not charge a subscription fee. + +:::{note} +While PayPal is available in [over 200 countries/regions](https://www.paypal.com/webapps/mpp/country-worldwide), only [a selection of currencies are +supported](https://developer.paypal.com/docs/reports/reference/paypal-supported-currencies). +::: + +(payment-providers-paypal-configuration-paypal)= + +## Configuration in PayPal + +1. [Log into your PayPal Developer Dashboard](https://developer.paypal.com/dashboard/). +2. Click {guilabel}`Apps & Credentials` and click {guilabel}`Create App`. +3. Enter an {guilabel}`App Name` and click {guilabel}`Create App`. +4. Copy the {guilabel}`Client ID` and {guilabel}`Secret` and save them for + {ref}`later `. + +:::{important} +If you use customer names or addresses that include accented or non-Latin characters, you +**must** configure the encoding format of the payment request sent by Odoo to PayPal to avoid +transaction failures without notice. To do so, access the [PayPal button language encoding +setting](https://www.paypal.com/cgi-bin/websrc?cmd=_profile-language-encoding), click +{guilabel}`More Options`, and set the {guilabel}`Encoding` field to {guilabel}`UTF-8`. + +If you are trying PayPal as a test, access your {ref}`PayPal Sandbox account +` and [configure the encoding format for your sandbox account](https://sandbox.paypal.com/cgi-bin/customerprofileweb?cmd=_profile-language-encoding). +::: + +:::{tip} +For encrypted website payments & EWP_SETTINGS errors, please check the [PayPal documentation](https://developer.paypal.com/docs/online/). +::: + +(payment-providers-paypal-configuration-odoo)= + +## Configuration in Odoo + +1. {ref}`Navigate to the payment provider PayPal `. +2. In the {guilabel}`Credentials` tab, enter the {guilabel}`Email` linked to your PayPal account, + then fill in the {guilabel}`Client ID` and {guilabel}`Client Secret` fields with the values you + saved at the step {ref}`payment_providers/paypal/configuration-paypal`. +3. Click {guilabel}`Generate your webhook` to create the {guilabel}`Webhook ID`. +4. Set the {guilabel}`State` field to {guilabel}`Enabled`, and make sure the PayPal payment provider + is {guilabel}`Published`. +5. Configure the remaining options as desired. + +(payment-providers-paypal-testing)= + +## Testing + +PayPal provides two sandbox accounts that you can use to simulate live transactions: + +- A business account (to use as the merchant account, e.g., `ab-1abc12345678@business.example.com`); +- A default personal account (to use as the shopper account, e.g., + `ba-9cba87654321@personal.example.com`). + +To test the PayPal payment workflow in Odoo: + +1. Log into the [Paypal Developer Site](https://developer.paypal.com/) using your PayPal + credentials and go to {menuselection}`Testing Tools --> Sandbox Accounts`. +2. Click the {icon}`fa-ellipsis-v` ({guilabel}`ellipsis`) icon next to the sandbox business account + and select {guilabel}`View/Edit account`. +3. Copy the {guilabel}`Email`, {guilabel}`Client ID`, and {guilabel}`Secret` and save them for the + next step. +4. In Odoo, {ref}`configure the PayPal payment provider ` + with the values saved at the previous step and set the {guilabel}`State` field to + {guilabel}`Test Mode`. + +You can then run a test transaction from Odoo using the sandbox personal account. + +:::{seealso} +- {ref}`payment_providers/test-mode` +- {doc}`../payment_providers` +::: + diff --git a/content/applications/finance/payment_providers/razorpay.md b/content/applications/finance/payment_providers/razorpay.md new file mode 100644 index 000000000..bba5dea5a --- /dev/null +++ b/content/applications/finance/payment_providers/razorpay.md @@ -0,0 +1,64 @@ +# Razorpay + +[Razorpay](https://razorpay.com/) is an online payments provider established in India and +covering more than 100 payment methods. + +(payment-providers-razorpay-configure-dashboard)= + +## Configuration on Razorpay Dashboard + +1. Log into [Razorpay Dashboard](https://dashboard.razorpay.com/) and go to + {menuselection}`Settings --> API Keys`. Generate the new keys and copy the values of the + {guilabel}`Key Id` and {guilabel}`Secret Key` fields and save them for later. +2. Go to + {menuselection}`Settings --> Webhooks` + , click on + {guilabel}`Create New Webhook` + , + and enter your Odoo database URL followed by + `/payment/razorpay/webhook` + in + the + {guilabel}`Webhook URL` + text field. + For example: + `https://example.odoo.com/payment/razorpay/webhook` + . +3. Fill the {guilabel}`Secret` field with a password of your choice and save it for later. +4. Make sure the {guilabel}`payment.authorized`, {guilabel}`payment.captured`, + {guilabel}`payment.failed`, {guilabel}`refund.failed` and {guilabel}`refund.processed` + checkboxes are ticked. +5. Click on {guilabel}`Create Webhook` to finalize the configuration. + +(payment-providers-razorpay-recurring-payments)= + +:::{important} +The {guilabel}`Recurring payments` feature must +be activated if you want to make recurring payments. +Send a request to the [Razorpay Support team](https://razorpay.com/support/#request) to +enable recurring payments. +::: + +(payment-providers-razorpay-configure-odoo)= + +## Configuration on Odoo + +1. {ref}`Navigate to the payment provider Razorpay ` and change its + state to {guilabel}`Enabled`. +2. In the {guilabel}`Credentials` tab, fill the {guilabel}`Key Id`, {guilabel}`Key Secret`, and + {guilabel}`Webhook Secret` with the values you saved at the step + {ref}`payment_providers/razorpay/configure_dashboard`. +3. Configure the rest of the options to your liking. + +:::{important} +If you configure Odoo to capture amounts manually: + +- Be aware that the **manual voiding** of a transaction is not supported by Razorpay. +- After **five days**, if the transaction hasn't been captured yet, it'll automatically be + **voided**. +::: + +:::{seealso} +- {doc}`../payment_providers` +::: + diff --git a/content/applications/finance/payment_providers/stripe.md b/content/applications/finance/payment_providers/stripe.md new file mode 100644 index 000000000..7f9e48c91 --- /dev/null +++ b/content/applications/finance/payment_providers/stripe.md @@ -0,0 +1,121 @@ +# Stripe + +[Stripe](https://stripe.com/) is a United States-based online payment solution provider allowing +businesses to accept **credit cards** and other payment methods. + +:::{seealso} +- [List of countries supported by Stripe](https://stripe.com/global) +- [List of payment methods supported by Stripe](https://stripe.com/payments/payment-methods) +::: + +## Create your Stripe account with Odoo + +The method to acquire your credentials depends on your hosting type: + +```{eval-rst} +.. tabs:: + .. group-tab:: Odoo Online + + #. :ref:`Navigate to the payment provider Stripe ` and + click :guilabel:`Connect Stripe`. + #. Go through the setup process and confirm your email address when Stripe sends you a + confirmation email. + #. At the end of the process, click :guilabel:`Agree and submit`. If all requested information + has been submitted, you are then redirected to Odoo, and your payment provider is enabled. + + .. group-tab:: Odoo.sh or On-premise + + #. :ref:`Navigate to the payment provider Stripe ` and + click :guilabel:`Connect Stripe`. + #. Go through the setup process and confirm your email address when Stripe sends you a + confirmation email. + #. At the end of the process, click :guilabel:`Agree and submit`; you are then redirected to + the payment provider **Stripe** in Odoo. + #. :ref:`Fill in your credentials `. + #. :ref:`Generate a webhook `. + #. Set the :guilabel:`State` field to :guilabel:`Enabled`. +``` + +:::{tip} +- To use an existing Stripe account, {ref}`activate the Developer mode ` and + {ref}`enable Stripe manually `. You can then {ref}`Fill in your + credentials `, {ref}`generate a webhook `, and enable the + payment provider. +- You can also test Stripe using the {ref}`payment_providers/test-mode`. To do so, first, + [log into your Stripe dashboard](https://dashboard.stripe.com/dashboard) and switch to the + **Test mode**. Then, in Odoo, {ref}`activate the Developer mode `, + {ref}`navigate to the payment provider Stripe `, + {ref}`fill in your API credentials ` with the test keys, and set the + {guilabel}`State` field to {guilabel}`Test Mode`. +::: + +(stripe-api-keys)= + +### Fill in your credentials + +If your **API credentials** are required to connect with your Stripe account, proceed as follows: + +1. Go to [the API keys page on Stripe](https://dashboard.stripe.com/account/apikeys), or log into + your Stripe dashboard and go to {menuselection}`Developers --> API Keys`. +2. In the {guilabel}`Standard keys` section, copy the {guilabel}`Publishable key` and the + {guilabel}`Secret key` and save them for later. +3. In Odoo, {ref}`navigate to the payment provider Stripe `. +4. In the {guilabel}`Credentials` tab, fill in the {guilabel}`Publishable Key` and + {guilabel}`Secret Key` fields with the values you previously saved. + +(stripe-webhook)= + +### Generate a webhook + +If your **Webhook Signing Secret** is required to connect with your Stripe account, you can create a +webhook automatically or manually. + +```{eval-rst} +.. tabs:: + .. tab:: Create the webhook automatically + + Make sure your :ref:`Publishable and Secret keys ` are filled in, then click + :guilabel:`Generate your webhook`. + + .. tab:: Create the webhook manually + + #. Go to the `Webhooks page on Stripe `_, or log into + your Stripe dashboard and go to :menuselection:`Developers --> Webhooks`. + #. In the :guilabel:`Hosted endpoints` section, click :guilabel:`Add endpoint`. Then, in the + :guilabel:`Endpoint URL` field, enter your Odoo database's URL, followed by + `/payment/stripe/webhook`, e.g., `https://yourcompany.odoo.com/payment/stripe/webhook`. + #. Click :guilabel:`Select events` at the bottom of the form, then select the following + events: + + - in the :guilabel:`Charge` section: :guilabel:`charge.refunded` and + :guilabel:`charge.refund.updated`; + - in the :guilabel:`Payment intent` section: + :guilabel:`payment_intent.amount_capturable_updated`, + :guilabel:`payment_intent.payment_failed`, :guilabel:`payment_intent.processing`, and + :guilabel:`payment_intent.succeeded`; + - in the :guilabel:`Setup intent` section: :guilabel:`setup_intent.succeeded`. + + #. Click :guilabel:`Add events`. + #. Click :guilabel:`Add endpoint`, then click :guilabel:`Reveal` and save your + :guilabel:`Signing secret` for later. + #. In Odoo, :ref:`navigate to the payment provider Stripe + `. + #. In the :guilabel:`Credentials` tab, fill the :guilabel:`Webhook Signing Secret` field with + the value you previously saved. + + .. note:: + You can select other events, but they are currently not processed by Odoo. +``` + +## Enable Apple Pay + +To allow customers to use the Apple Pay button to pay their eCommerce orders, go to the +{guilabel}`Configuration` tab, enable {guilabel}`Allow Express Checkout`, and click +{guilabel}`Enable Apple Pay`. + +:::{seealso} +- {ref}`Express checkout and Google Pay ` +- {doc}`../payment_providers` +- {doc}`Use Stripe as a payment terminal in Point of Sale <../../sales/point_of_sale/payment_methods/terminals/stripe>` +::: + diff --git a/content/applications/finance/payment_providers/wire_transfer.md b/content/applications/finance/payment_providers/wire_transfer.md new file mode 100644 index 000000000..36f0d7dd1 --- /dev/null +++ b/content/applications/finance/payment_providers/wire_transfer.md @@ -0,0 +1,58 @@ +# Wire transfers + +The **Wire transfer** payment method allows you to provide payment instructions to your customers, +such as the bank details and communication. They are displayed: + +- at the end of the checkout process, once the customer has selected {guilabel}`Wire transfer` as a + payment method and clicked the {guilabel}`Pay now` button: + + ```{image} wire_transfer/payment_instructions_checkout.png + :alt: Payment instructions at checkout + ``` + +- on the customer portal: + + ```{image} wire_transfer/payment_instructions_portal.png + :alt: Payment instructions on the customer portal + ``` + +:::{note} +- While this method is very accessible and requires minimal setup, it is very inefficient + process-wise. We recommend setting up a {doc}`payment provider <../payment_providers>` instead. +- Online orders remain in the {guilabel}`Quotation sent` (i.e., unpaid order) stage until you + receive the payment and {guilabel}`Confirm` the order. +::: + +:::{tip} +**Wire transfer** can be used as a template for other payment methods that are processed +manually, such as checks, by renaming or duplicating it. +::: + +## Configuration + +To configure **Wire Transfer**, go to {menuselection}`Accounting / Website --> Configuration --> +Payment Providers`, and open the {guilabel}`Wire Transfer` card. Then, in the +{guilabel}`Configuration` tab: + +- Select the {guilabel}`Communication` to be used; + + - {guilabel}`Based on Document Reference`: sales order or invoice number + - {guilabel}`Based on Customer ID`: customer identifier + +- Tick the {guilabel}`Enable QR codes` check box to activate {doc}`QR code payments + <../accounting/customer_invoices/epc_qr_code>`. + +Define the payment instructions in the {guilabel}`Messages` tab: + +```{image} wire_transfer/payment_instructions.png +:alt: Define payment instructions +``` + +If you have already defined {doc}`a bank account <../accounting/bank>`, the account number will be +automatically added to the default message generated by Odoo. You can also add it afterwards and +update the message by clicking {guilabel}`Reload pending message`. + +:::{seealso} +{ref}`payment_providers/journal` +::: + diff --git a/content/applications/finance/payment_providers/worldline.md b/content/applications/finance/payment_providers/worldline.md new file mode 100644 index 000000000..81c1f8dfc --- /dev/null +++ b/content/applications/finance/payment_providers/worldline.md @@ -0,0 +1,77 @@ +# Worldline + +[Worldline](https://worldline.com/) is a France-based company and the world's fourth largest +payment provider. + +## Settings in Worldline + +(worldline-api-user)= + +### Create an API user + +It is recommended to set up an **API user** to create transactions from Odoo to ensure that your +Worldline configuration remains safe even if credentials are compromised. Additionally, API users do +not require frequent password updates like regular accounts. + +To create an **API user**, proceed as follows: + +1. Log into your [Worldline Merchant Portal](https://merchant-portal.preprod.worldline-solutions.com/dashboard), + click the {icon}`fa-th` ({guilabel}`menu`) icon, and select {guilabel}`Back Office`. + +2. Go to {menuselection}`Configuration --> Users` and click on {guilabel}`New User`. + +3. Configure the following fields: + + 1. Specify a {guilabel}`UserID`, {guilabel}`User's name`, {guilabel}`E-mail address`, and + {guilabel}`Timezone` of your choice. + 2. Set the {guilabel}`Profile` field to {guilabel}`Admin`. + 3. Enable {guilabel}`Special user for API`. + +:::{tip} +If you have already set up a user, make sure it is activated without any error. +::: + +(worldline-set-up)= + +### Set up Worldline for Odoo + +Worldline must now be configured to accept payments from Odoo. + +1. From your merchant portal, go to {menuselection}`Developer --> Payment API` and click on + {guilabel}`Generate API key`. Copy the {guilabel}`API key ID` and the {guilabel}`Secret API key` + and save them for {ref}`later `. +2. Go to {menuselection}`Developer --> Webhooks` and click on {guilabel}`Generate webhook keys`. + Copy the {guilabel}`Webhook ID` and the associated {guilabel}`Secret webhook key` and + save them for {ref}`later `. +3. Click + {guilabel}`Add webhook endpoint` + , enter your Odoo database's URL followed by + + `/payment/worldline/webhook` + in the + {guilabel}`Endpoint url` + field, and + {guilabel}`Confirm` + . + For example: + `https://example.odoo.com/payment/worldline/webhook` + . + +(wordline-odoo-configuration)= + +## Settings in Odoo + +To set up Worldline in Odoo: + +1. {ref}`Navigate to the payment provider Worldline ` and change its + state to {guilabel}`Enabled`. +2. In the {guilabel}`Credentials` tab, enter the {guilabel}`PSPID` of your Worldline account and + fill in the {guilabel}`API Key`, {guilabel}`API Secret`, {guilabel}`Webhook Key`, and + {guilabel}`Webhook Secret` with the values you saved at the step {ref}`Set up Worldline for + Odoo `. +3. Configure the rest of the options to your liking. + +:::{seealso} +{doc}`../payment_providers` +::: + diff --git a/content/applications/finance/payment_providers/xendit.md b/content/applications/finance/payment_providers/xendit.md new file mode 100644 index 000000000..d72c071d3 --- /dev/null +++ b/content/applications/finance/payment_providers/xendit.md @@ -0,0 +1,44 @@ +# Xendit + +[Xendit](https://www.xendit.co) is an Indonesian-based payment solution provider that covers +several Southeast Asian countries. It allows businesses to accept credit cards as well as several +local payment methods. + +(payment-providers-xendit-configure-dashboard)= + +## Configuration on the Xendit Dashboard + +1. Create a Xendit account if necessary and log in to the [Xendit Dashboard](https://dashboard.xendit.co). +2. Check your account mode in the top left corner of the page. Use the {guilabel}`Test Mode` to try + the integration without charging your customers. Switch to {guilabel}`Live Mode` once you are + ready to accept payments. +3. Navigate to {menuselection}`Configuration: Settings` in the left part of the application page. + In the {guilabel}`Developers` section, click + [API Keys](https://dashboard.xendit.co/settings/developers#api-keys). +4. Click {guilabel}`Generate Secret Key`. In the popup box, enter any {guilabel}`API key name`, + select {guilabel}`Write` for the {guilabel}`Money-in Products` permission and {guilabel}`None` + for all other permissions then click {guilabel}`Generate key`. +5. Confirm your password to display your API key. Copy or download the key and **save + this information securely for later**. This is the only time the API key can be viewed or + downloaded. +6. Once completed, scroll down the page to the + [Webhooks](https://dashboard.xendit.co/settings/developers#webhooks) section to generate + the webhook token. +7. Under {guilabel}`Webhook verification token`, click {guilabel}`View Webhook Verification Token`, + then confirm your password to display the token. Save it for later. +8. In the {guilabel}`Webhook URL` section, enter your Odoo database's URL, followed by + `/payment/xendit/webhook` (e.g., `https://example.odoo.com/payment/xendit/webhook`) in the field + {guilabel}`Invoices paid` and click the {guilabel}`Test and save` button next to it. + +## Configuration on Odoo + +1. {ref}`Navigate to the payment provider Xendit ` and change its state + to {guilabel}`Enabled`. +2. Fill in the {guilabel}`Secret Key` and {guilabel}`Webhook Token` fields with the + information saved at the step {ref}`payment_providers/xendit/configure_dashboard`. +3. Configure the rest of the options to your liking. + +:::{seealso} +{doc}`../payment_providers` +::: + diff --git a/content/applications/general.md b/content/applications/general.md new file mode 100644 index 000000000..695fed3e0 --- /dev/null +++ b/content/applications/general.md @@ -0,0 +1,13 @@ +# General settings + +```{toctree} +general/apps_modules +general/users +general/companies +general/multi_company +general/iot +general/email_communication +general/integrations +general/developer_mode +``` + diff --git a/content/applications/general/apps_modules.md b/content/applications/general/apps_modules.md new file mode 100644 index 000000000..5601d8484 --- /dev/null +++ b/content/applications/general/apps_modules.md @@ -0,0 +1,76 @@ +# Apps and modules + +You can {ref}`install `, {ref}`upgrade ` and {ref}`uninstall +` all apps and modules from the {menuselection}`Apps` dashboard. + +By default, an *Apps* filter is applied. If you want to search for modules, click on +*Filters* and select *Extra*. + +```{image} apps_modules/apps-search-filter.png +:align: center +:alt: Add "Extra" filter in Odoo Apps +``` + +:::{warning} +Odoo is *not a smartphone*, and its apps shouldn't be installed or uninstalled carelessly. Apply +caution when adding or removing apps and modules on your database since this may impact your +subscription costs. + +- **Installing or uninstalling apps and managing users is up to you.** + As the administrator of your database, you are responsible for its usage, as you know best + how your organization works. +- **Odoo apps have dependencies.** + Installing some apps and features with dependencies may also install additional apps and + modules that are technically required, even if you won't actively use them. +- **Test app installation/removal on a duplicate of your database.** + This way, you can know what app dependencies may be required or what data may be erased. +::: + +(general-install)= + +## Install apps and modules + +Go to {menuselection}`Apps`, and click on the *Install* button of the app you want to install. + +:::{note} +If the module you are looking for is not listed, you can **update the app list**. + +To do so, activate the {ref}`developer mode `, then go to {menuselection}`Apps +--> Update Apps List` and click on *Update*. +::: + +(general-upgrade)= + +## Upgrade apps and modules + +On some occasions, new improvements or app features are added to {doc}`supported versions of Odoo +`. To be able to use them, you must **upgrade** your app. + +Go to {menuselection}`Apps`, click on the *dropdown menu* of the app you want to upgrade, then on +*Upgrade*. + +(general-uninstall)= + +## Uninstall apps and modules + +Go to {menuselection}`Apps`, click on the *dropdown menu* of the app you want to uninstall, then on +*Uninstall*. + +```{image} apps_modules/uninstall.png +:align: center +``` + +Some apps have dependencies, meaning that one app requires another. Therefore, uninstalling one app +may uninstall multiple apps and modules. Odoo warns you which dependent apps and modules are +affected by it. + +```{image} apps_modules/uninstall_deps.png +:align: center +``` + +To complete the uninstallation, click on *Confirm*. + +:::{danger} +Uninstalling an app also uninstalls all its dependencies and permanently erases their data. +::: + diff --git a/content/applications/general/companies.md b/content/applications/general/companies.md new file mode 100644 index 000000000..fcdb03d17 --- /dev/null +++ b/content/applications/general/companies.md @@ -0,0 +1,283 @@ +--- +show-content: true +--- + +# 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. + +:::{danger} +Utilizing a multi-company environment in an Odoo database warrants a subscription change from +*Standard* (or *One App Free*) to a *Custom* plan. Should the administrator not migrate the +subscription to a *Custom* plan after adding another company, the database risks being +deactivated. For more information, consult the [Odoo Pricing page](https://www.odoo.com/pricing-plan). + +If the customer is on the *Standard* plan, and adds multi-company functionality to the database, +it triggers an upsell for the *Custom* plan. + +If they are on a *Yearly* or *Multi-year* contract, this creates an upsell order, with a 30-day +limit (risking deactivation). If multi-company functionality is fully removed within that time +period, the next time the database pings, the upsell order and limit are removed automatically. + +If the customer is on a *Monthly* contract, once the next bill is created, and multi-company +functionality is still detected while they are on a *Standard* plan, they are automatically +switched, and billed on the *Custom* plan. + +Should the customer want to go back to *Standard*, the Customer Success Team **must** be +contacted. +::: + +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. + +:::{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. + +After selecting the appropriate company, click the {guilabel}`⚙️ Actions` icon, and select +{guilabel}`Archive` from the resulting drop-down menu. + +To ensure all records related to the archived company are archived, contact Odoo's [Support Team](https://www.odoo.com/help). + +Should a record not be archived, there is a risk of reactivating the archived company, and +creating the upsell again. +::: + +(companies-manage)= + +## Manage companies and records + +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. + +```{image} companies/company-info.png +:align: center +:alt: Overview of a new company's form in Odoo. +``` + +:::{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`. + +Companies also have a {guilabel}`Parent Company` set on the company form in {ref}`developer mode +`. +::: + +### Switch between companies + +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. + +```{eval-rst} +.. 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)*. + + .. image:: companies/multi-companies-menu-dashboard.png + :align: center + :alt: View of the companies menu through the main dashboard in Odoo. +``` + +### Share records + +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: + +- *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. + +```{image} companies/product-form-company.png +:align: center +:alt: View of a product's form emphasizing the company field in Odoo Sales. +``` + +When an environment is selected from the top menu, along with an additional company, records are +shared between the two companies. + +## 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](https://www.odoo.com/pricing-plan) page. +::: + +(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. +``` + +If an administrator has multiple companies activated on the database, and is editing a record, the +editing occurs on the record's related company. + +```{eval-rst} +.. 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). +``` + +When creating a record, the company taken into account is: + +- The current company selected in the company selector, in the upper-right hand of the screen (the + one that is highlighted/active) + +**OR** + +- No company is set (because none is set on the product and contact forms, for example) + +**OR** + +- The company set is the company linked to the document (the same as if a record is being edited) + +## Document format + +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. + +```{image} companies/document-layout.png +:align: center +:alt: View of the settings page emphasizing the document layout field in Odoo. +``` + +{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. + +(general-inter-company)= + +## Inter-company transactions + +First, activate the {ref}`developer mode `. Then, make sure each one of the +companies is properly set in relation to: + +- {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>` + +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. + +With the respective company activated and selected, choose one of the following {guilabel}`Rule` +options: + +- {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`.\* + + \* The given option needs to be selected, so {guilabel}`Automatic Validation` appears in the + configuration. + +```{image} companies/inter-company-transactions.png +:align: center +:alt: View of the settings page emphasizing the inter company transaction field in +: Odoo. +``` + +:::{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`. +::: + +```{eval-rst} +.. 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`. + + :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). +``` + +:::{tip} +Remember to test all workflows as a user *other* than the administrator. +::: + +:::{seealso} +- {doc}`Multi-company Guidelines <../../developer/howtos/company>` +- {doc}`../finance/accounting/get_started/multi_currency` +::: + +```{toctree} +:titlesonly: true + +companies/digest_emails +companies/email_template +``` + diff --git a/content/applications/general/companies/digest_emails.md b/content/applications/general/companies/digest_emails.md new file mode 100644 index 000000000..5f2cc3b5a --- /dev/null +++ b/content/applications/general/companies/digest_emails.md @@ -0,0 +1,246 @@ +# Digest emails + +*Digest Emails* are periodic snapshots sent via email to users in an organization that include +high-level information about how the business is performing. + +To start sending digest emails, begin by navigating to {menuselection}`Settings app --> Statistics +section`, activate the {guilabel}`Digest Emails` feature, and click {guilabel}`Save`. + +```{image} digest_emails/digest-email-settings.png +:align: center +:alt: Digest Emails section inside General Settings. +``` + +A variety of settings can be configured for digest emails, such as: + +- Deciding which {abbr}`KPIs (key performance indicators)` are shared in the digest emails +- Determining how often digest emails are sent +- Choosing who in the organization receives digest emails +- Creating custom digest email templates +- Adding additional {abbr}`KPIs (key performance indicators)` (*Studio* app required) + +:::{note} +By default, the {guilabel}`Digest Email` feature is enabled. {guilabel}`Your Odoo Periodic +Digest` serves as the primary template, which includes all {abbr}`KPI (key performance +indicator)` measurements across the Odoo database, and is sent daily to administrators. +::: + +:::{warning} +When creating duplicates of databases that have sending capabilities (not testing-mode), the +digest emails continue to send from the duplicate database, unless deactivated. + +To deactivate the digest email, navigate to {menuselection}`Settings --> Statistics section`. +Then, deactivate the {guilabel}`Digest Emails` feature, by un-ticking the checkbox, and clicking +{guilabel}`Save`. See the section on {ref}`digest-emails/deactivate`. +::: + +(digest-emails-customize-digest)= + +## Customize default digest email + +To customize the default digest email (*Your Odoo Periodic Digest*), go to {menuselection}`Settings +app --> Statistics section --> Digest Email field`. Then, select {guilabel}`Your Odoo Periodic +Digest`, and click on the {guilabel}`↗️ (External link)` icon, next to the drop-down menu selection. + +A pop-up window appears, and presents a variety of editable settings, which include: + +- {guilabel}`Digest Name`: the name of the digest email. +- {guilabel}`Periodicity`: control how often digest emails are sent ({guilabel}`Daily`, + {guilabel}`Weekly`, {guilabel}`Monthly`, or {guilabel}`Quarterly`). +- {guilabel}`Next Send Date`: the date on which the digest email will be sent again. +- {guilabel}`KPIs` tab: check/uncheck each calculated {abbr}`KPI (key performance indicator)` that + appears in digest emails. A ticked box indicates an active {abbr}`KPI (key performance indicator)` + in the digest email. See the section on {ref}`digest-emails/kpis`. +- {guilabel}`Recipients` tab: add/remove users who receive the digest emails. See the section on + {ref}`digest-emails/recipients`. + +:::{note} +The {abbr}`KPIs (key performance indicators)` can be customized using Odoo *Studio*. Additional +costs to the database subscription are incurred should *Studio* need to be installed. See this +section on {ref}`digest-emails/custom-kpi`. +::: + +```{image} digest_emails/periodic-digest.png +:align: center +:alt: Customize default Digest Email settings and custom KPIs. +``` + +(digest-emails-deactivate)= + +## Deactivate digest email + +To manually deactivate an individual digest email, first navigate to {menuselection}`Settings app +--> Statistics section`, and click {guilabel}`Configure Digest Emails`. Then, select the desired +digest email from the list that should be deactivated. + +Next, click {guilabel}`DEACTIVATE FOR EVERYONE` to deactivate the digest email for everyone, or +{guilabel}`UNSUBSCRIBE ME` to remove the logged in user from the mailing list. These buttons are +located in the top menu, just above the {guilabel}`Digest Name`. + +## Manually send digest email + +To manually send a digest email, first navigate to {menuselection}`Settings app --> Statistics +section`, and click {guilabel}`Configure Digest Emails`. Then, select the desired digest email, and +click {guilabel}`SEND NOW`. This button is located in the top menu, just above the {guilabel}`Digest +Name`. + +(digest-emails-kpis)= + +## KPIs + +Pre-configured {abbr}`KPIs (key performance indicators)` can be added to the digest email from the +{guilabel}`KPIs` tab of the digest email template form. + +First, navigate to {menuselection}`Settings app --> Statistics section`, and click +{guilabel}`Configure Digest Emails`. + +Then, select the desired digest email, and open the {guilabel}`KPIs` tab. + +To add a {abbr}`KPI (key performance indicator)` to the digest email, tick the checkbox next to the +desired {abbr}`KPI (key performance indicator)`. After all {abbr}`KPIs (key performance indicators)` +are added (or deselected), click {guilabel}`Save`. + +The following {abbr}`KPIs (key performance indicators)` are available in the {guilabel}`KPIs` tab on +a digest email template form out-of-box in Odoo: + +```{image} digest_emails/oob-kpis.png +:align: right +:alt: KPIs listed in the out-of-box digest email. +``` + +{guilabel}`General` +: - {guilabel}`Connected Users` + - {guilabel}`Messages` + +{guilabel}`Project` +: - {guilabel}`Open Tasks` + +{guilabel}`Recruitment` +: - {guilabel}`Employees` + +{guilabel}`CRM` +: - {guilabel}`New Leads/Opportunities` + - {guilabel}`Opportunities Won` + +{guilabel}`Sales` +: - {guilabel}`All Sales` + - {guilabel}`eCommerce Sales` + +{guilabel}`Point of Sale` +: - {guilabel}`POS Sales` + +{guilabel}`Live Chat` +: - {guilabel}`% of Happiness` + - {guilabel}`Conversations handled` + - {guilabel}`Time to answer (sec)` + +{guilabel}`Helpdesk` +: - {guilabel}`Tickets Closed` + +{guilabel}`Invoicing` +: - {guilabel}`Revenue` + - {guilabel}`Banks and Cash Moves` + +(digest-emails-recipients)= + +## Recipients + +Digest email recipients are added from the {guilabel}`Recipients` tab of the digest email template +form. + +To add a recipient, navigate to {menuselection}`Settings app --> Statistics section`, and click +{guilabel}`Configure Digest Emails`. Then, select the desired digest email, and open the +{guilabel}`Recipients` tab. + +To add a recipient, click {guilabel}`Add a line`, and an {guilabel}`Add Recipients` pop-up window +appears, with all available users to add as recipients. + +From the pop-up window, tick the checkbox next to the {guilabel}`Name` of the user(s), and click the +{guilabel}`Select` button. + +To remove a user as a recipient, click the {guilabel}`❌ (remove)` icon to the far-right of the user +listed in the {guilabel}`Recipients` tab. + +Click {guilabel}`Save` to implement the changes. + +(digest-emails-custom-emails)= + +## Create digest emails + +To create a new digest email, navigate to {menuselection}`Settings app --> Statistics section`, and +click {guilabel}`Configure Digest Emails`. Then, click {guilabel}`Create` to create a new digest +email. + +A separate page, with a blank digest email template appears, and presents a variety of editable +settings, including: + +- {guilabel}`Digest Name`: the name of the digest email. +- {guilabel}`Periodicity`: control how often digest emails are sent ({guilabel}`Daily`, + {guilabel}`Weekly`, {guilabel}`Monthly`, or {guilabel}`Quarterly`). +- {guilabel}`Next Send Date`: the date on which the digest email will be sent again. +- {guilabel}`KPIs` tab: check/uncheck each calculated {abbr}`KPI (key performance indicator)` that + appears in digest emails. A ticked box indicates an active {abbr}`KPI (key performance indicator)` + in the digest email. See the section on {ref}`digest-emails/kpis`. +- {guilabel}`Recipients` tab: add/remove users who receive the digest emails. See the section on + {ref}`digest-emails/recipients`. + +From there, give the digest email a {guilabel}`Digest Name`, specify {guilabel}`Periodicity`, +choose the desired {abbr}`KPIs (key performance indicators)`, and add {guilabel}`Recipients`, as +needed. + +After clicking {guilabel}`Save`, the new custom digest email is available as a selection in the +{guilabel}`Digest Email` field, located in the {menuselection}`Settings app --> Statistics section`. + +(digest-emails-custom-kpi)= + +## Custom KPIs with Odoo Studio + +The {abbr}`KPIs (key performance indicators)` on a digest email template form, in the +{guilabel}`KPIs` tab, can be customized using Odoo *Studio*. + +:::{warning} +Additional costs to the database subscription are incurred, should Odoo *Studio* need to be +installed. +::: + +To begin, click the {guilabel}`🛠️ (tools)` icon in the top-right of the screen. This is the link to +the Odoo *Studio* application. + +In order to create additional fields, create two fields on the digest object: + +1. Create a boolean field called `kpi_myfield`, and display it in the {guilabel}`KPIs` tab. +2. Create a computed field called `kpi_myfield_value` that computes the customized {abbr}`KPI (key + performance indicator)`. +3. Select the {abbr}`KPIs (key performance indicators)` in the {guilabel}`KPIs` tab. + +:::{tip} +Here is the [source code](https://github.com/odoo/odoo/blob/15.0/addons/digest/models/digest.py) for the `digest.py` +file, which guides the programmer in the coding of the computed field. +::: + +:::{seealso} +Users can also click the {guilabel}`Recipients` tab, and then the vertical three-dot +{guilabel}`(kebab)` menu to edit this view. Either click {guilabel}`EDIT LIST VIEW` or +{guilabel}`EDIT FORM VIEW` to modify this tab. +::: + +### Computed values reference table + +| LABEL | VALUE | +| --------------------- | ----------------------------------------- | +| Connected Users | `kpi_res_users_connected_value` | +| Messages Sent | `kpi_mail_message_total_value` | +| New Leads | `kpi_crm_lead_created_value` | +| Opportunities Won | `kpi_crm_opportunities_won_value` | +| Open Tasks | `kpi_project_task_opened_value` | +| Tickets Closed | `kpi_helpdesk_tickets_closed_value` | +| % of Happiness | `kpi_livechat_rating_value` | +| Conversations handled | `kpi_livechat_conversations_value` | +| Time to answer (sec) | `kpi_livechat_response_value` | +| All Sales | `kpi_all_sale_total_value` | +| eCommerce Sales | `kpi_website_sale_total_value` | +| Revenue | `kpi_account_total_revenue_value` | +| Bank & Cash Moves | `kpi_account_bank_cash_value` | +| POS Sales | `kpi_pos_total_value` | +| New Employees | `kpi_hr_recruitment_new_colleagues_value` | + diff --git a/content/applications/general/companies/email_template.md b/content/applications/general/companies/email_template.md new file mode 100644 index 000000000..ac1d51e65 --- /dev/null +++ b/content/applications/general/companies/email_template.md @@ -0,0 +1,310 @@ +# Email templates + +Email templates are saved emails that are used repeatedly to send emails from the database. They +allow users to send quality communications, without having to compose the same text repeatedly. + +Creating different templates that are tailored to specific situations lets users choose the right +message for the right audience. This increases the quality of the message and the overall +engagement rate with the customer. + +:::{note} +Email templates in Odoo use QWeb or XML, which allows for editing emails in their final +rendering, making customizations more robust, without having to edit any code whatsoever. This +means that Odoo can use a Graphical User Interface (GUI) to edit emails, which edits the backend +code. When the received email is read by the end user's program, different formatting and +graphics will appear in the final form of it. +::: + +Access email templates in {ref}`developer mode ` by navigating to +{menuselection}`Settings app --> Technical menu --> Email --> Email Templates`. + +## Editing email templates + +The *powerbox* feature can be used when working with email templates. This feature provides the +ability to directly edit the formatting and text in an email template, as well as the ability to add +links, buttons, appointment options, or images. + +Additionally, the XML/HTML code of the email template can be edited directly, via the +{guilabel}`` icon. Dynamic placeholders (referencing fields within Odoo) are also available for +use in the email template. + +### Powerbox + +The *powerbox* feature is an enriched text editor with various formatting, layout, and text options. +It can also be used to add XML/HTML features in an email template. The powerbox feature is activated +by typing a forward slash `/` in the body of the email template. + +When a forward slash `/` is typed in the body of an email template, a drop-down menu appears with +the following options: + +{guilabel}`Structure` + +- {guilabel}`Bulleted list`: Create a simple bulleted list. +- {guilabel}`Numbered list`: Create a list with numbering. +- {guilabel}`Checklist`: Track tasks with a checklist. +- {guilabel}`Table`: Insert a table. +- {guilabel}`Separator`: Insert a horizontal rule separator. +- {guilabel}`Quote`: Add a blockquote section. +- {guilabel}`Code`: Add a code section. +- {guilabel}`2 columns`: Convert into two columns. +- {guilabel}`3 columns`: Convert into three columns. +- {guilabel}`4 columns`: Convert into four columns. + +{guilabel}`Format` + +- {guilabel}`Heading 1`: Big section heading. +- {guilabel}`Heading 2`: Medium section heading. +- {guilabel}`Heading 3`: Small section heading. +- {guilabel}`Switch direction`: Switch the text's direction. +- {guilabel}`Text`: Paragraph block. + +{guilabel}`Media` + +- {guilabel}`Image`: Insert an image. +- {guilabel}`Article`: Link an article. + +{guilabel}`Navigation` + +- {guilabel}`Link`: Add a link. +- {guilabel}`Button`: Add a button. +- {guilabel}`Appointment`: Add a specific appointment. +- {guilabel}`Calendar`: Schedule an appointment. + +{guilabel}`Widgets` + +- {guilabel}`3 Stars`: Insert a rating over three stars. +- {guilabel}`5 Stars`: Insert a rating over five stars. + +{guilabel}`Basic Blocks` + +- {guilabel}`Signature`: Insert your signature. + +{guilabel}`Marketing Tools` + +- {guilabel}`Dynamic Placeholders`: Insert personalized content. + +:::{tip} +To use any of these options, click on the desired feature from the powerbox drop-down menu. To +format existing text with a text-related option (e.g. {guilabel}`Heading 1`, {guilabel}`Switch +direction`, etc.), highlight the text, then type in the activator key (forward slash) `/`, and +select the desired option from the drop-down menu. + +```{image} email_template/powerbox-feature.png +:align: center +:alt: Powerbox feature in the email template. +``` +::: + +:::{seealso} +{ref}`Using dynamic placeholders ` +::: + +### XML/HTML code editor + +To access the XML/HTML editor for an email template, first enter {ref}`developer mode +`. Then, click the {guilabel}`` icon in the upper-right corner of the template, +and proceed to edit the XML/HTML. To return to the standard text editor, click the {guilabel}`` +icon again. + +```{image} email_template/html-code-editor.png +:align: center +:alt: HTML editor in the email template. +``` + +:::{warning} +The XML/HTML editor should be accessed with caution as this is the backend code of the template. +Editing the code can cause the email template to break immediately or when upgrading the +database. +::: + +(email-template-dynamic-placeholders)= + +### Dynamic placeholders + +*Dynamic placeholders* reference certain fields within the Odoo database to produce unique data in +the email template. + +```{eval-rst} +.. example:: + Many companies like to customize their emails with a personalized piece of customer information + to grab attention. This can be accomplished in Odoo by referencing a field within a model by + inserting a dynamic placeholder. For example, a customer's name can be referenced in the email + from the :guilabel:`Customer` field on the :guilabel:`Sales Order` model. The dynamic placeholder + for this field is: `{{ object.partner_id }}`. +``` + +Dynamic placeholders are encoded to display fields from within the database. Dynamic placeholders +can be used in the {guilabel}`Body` ({guilabel}`Content` Tab) of the email template. They can also +be used in the fields present in the {guilabel}`Email Configuration` tab, the {guilabel}`Subject` of +the email, and the {guilabel}`Language`. + +To use the dynamic placeholders in the {guilabel}`Body` of an email open the **powerbox** feature by +typing in `/` into the body of the email template under the {guilabel}`Content` tab. Scroll to the +bottom of the options list, to {guilabel}`Marketing Tools`. Next, select {guilabel}`Dynamic +Placeholder`. Then select the dynamic placeholder from a list of available options and follow the +prompts to configure it with the desired corresponding Odoo field. Each dynamic placeholder will +vary in configuration. + +```{image} email_template/dynamic-placeholders.png +:align: center +:alt: Using dynamic placeholders in an email template. +``` + +:::{note} +Each unique combination of {guilabel}`Fields`, {guilabel}`Sub-models` and {guilabel}`Sub-fields` +creates a different dynamic placeholder. Imagine it as a combination to the field that is being +created. + +To search the available fields, simply type in the front-end name (on user-interface) of the +field in the search. This will find a result from all of the available fields for the model that +the email template is created for. +::: + +:::{warning} +Customizing email templates are out of the scope of Odoo Support. +::: + +### Rich text editor + +A rich text editor toolbar can be accessed by highlighting text in the email template. This can be +used to change the heading, font size/style, color, add a list type, or a link. + +```{image} email_template/rich-text-editor.png +:align: center +:alt: Rich text editor in the email template. +``` + +### Resetting email templates + +Should the email template not work because the code has been altered it can be reset to restore it +back to the out-of-box default template. Simply click on the {guilabel}`Reset Template` button in +the upper left-hand of the screen and the template will be reset. + +```{image} email_template/reset.png +:align: center +:alt: Resetting the email template. +``` + +### Default reply on email templates + +Under the {guilabel}`Email Configuration` tab on an email template, there is a {guilabel}`Reply To` +field. In this field, add email addresses to which replies are redirected when sending emails en +masse using this template. + +:::{tip} +Add multiple email addresses by adding a comma `,` between the addresses or dynamic +placeholders. +::: + +```{image} email_template/reply-to-template-sales.png +:align: center +:alt: Reply-to field on template. +``` + +The {guilabel}`Reply To` field is **only** used for mass mailing (sending emails in bulk). Bulk +emails can be sent in almost every Odoo application that has a list view option. + +To send mass mails, while in {guilabel}`list` view, check the boxes next to the desired records +where the emails are to be sent, click the {guilabel}`Action` button (represented by a {guilabel}`⚙️ +(gear)` icon), and select the desired email option from the {guilabel}`Action` drop-down menu. Email +options can vary by the particular list view and application. + +If it is possible to send an email, a mail composer pop-up window appears, with values that can be +defined and customized. This option will be available on the {guilabel}`Action` button on pages +where emails can be sent in bulk---for example, on the {guilabel}`Customers` page of the CRM app. +This action occurs throughout the Odoo database. + +```{image} email_template/composer-mass-mailing.png +:align: center +:alt: Email composer in mass mailing mode with reply-to highlighted. +``` + +## Transactional emails and corresponding URLs + +In Odoo, multiple events can trigger the sending of automated emails. These emails are known as +*transactional emails*, and sometimes contain links redirecting to the Odoo database. + +By default, links generated by the database use the dynamic `web.base.url` key defined in the system +parameters. For more information about this, see {ref}`system parameters +`. + +If the *Website* application is not installed, the `web.base.url` key will always be the default +parameter used to generate all the links. + +:::{important} +The `web.base.url` key can only have a single value, meaning that, in a multi-website or +multi-company database environment, even if there is a specific domain name for each website, the +links generated to share a document (or the links within a transactional email) may remain the +same, regardless of which website/company is related to the sending of the email/document. + +```{eval-rst} +.. example:: + If the :guilabel:`Value` of the :guilabel:`web.base.url` system parameter is equal to + `https://www.mycompany.com` and there are two separate companies in Odoo with different + website URLs: `https://www.mycompany2.com` and `https://www.mycompany1.com`, the links created + by Odoo to share a document, or send a transactional email, come from the domain: + `https://www.mycompany.com`, regardless of which company sends the document or email. +``` + +This is not always the case, as some Odoo applications (*eCommerce*, for example) have a link +established in the database with the *Website* application. In that case, if a specific domain is +defined for the website, the URL generated in the email template uses the domain defined on the +corresponding website of the company. + +```{eval-rst} +.. example:: + When a customer makes a purchase on an Odoo *eCommerce* website, the order has an established + link with that website. As a result, the links in the confirmation email sent to the customer + use the domain name for that specific website. +``` +::: + +:::{note} +A document shared using the *Documents* application will **always** use the `web.base.url` key, +as the document shared is not associated with any particular website. This means that the URL +will always be the same (the `web.base.url` key value), no matter what company it's shared from. +This is a known limitation. +::: + +For more information about how to configure domains, check out the {doc}`domain name documentation +`. + +### Updating translations within email templates + +In Odoo, email templates are automatically translated for all users in the database for all of the +languages installed. Changing the translations shouldn't be necessary. However, if for a specific +reason, some of the translations need to be changed, it can be done. + +:::{warning} +Like any modification in the code, if translation changes are not done correctly (for example, +modifications leading to bad syntax), it can break the template, and as a result, the template +will appear blank. +::: + +In order to edit translations, first enter {ref}`developer mode `. Then, on the +email template, click on the {guilabel}`Edit` button, and then click on the language button, +represented by the initials of the language currently being used (e.g. {guilabel}`EN` for English). + +```{image} email_template/edit-language-template.png +:align: center +:alt: Edit the language of a template. +``` + +:::{note} +If there aren't multiple languages installed and activated in the database, or if the user does +not have administration access rights, the language button will not appear. +::: + +A pop-up window with the different languages installed on the database appears. From this pop-up, +editing of translations is possible. When the desired changes have been made, click the +{guilabel}`Save` button to save the changes. + +```{image} email_template/translation-body.png +:align: center +:alt: Translation of the body of the Appointment Booked template. +``` + +:::{note} +When editing the translations, the default language set in the database appears in **bold**. +::: + diff --git a/content/applications/general/developer_mode.md b/content/applications/general/developer_mode.md new file mode 100644 index 000000000..9d38731ee --- /dev/null +++ b/content/applications/general/developer_mode.md @@ -0,0 +1,69 @@ +(developer-mode)= + +# Developer mode (debug mode) + +The developer mode, also known as debug mode, unlocks access to advanced {ref}`tools and settings +` in Odoo. + +:::{warning} +Proceed with caution, as some developer tools and technical settings are considered advanced and +may have associated risks. Only use them if you understand the implications and are confident in +your actions. +::: + +:::{note} +The developer mode is also available with {ref}`assets `, +which are used to debug JavaScript code, and with {ref}`tests assets +`, which are used to run test tours. +::: + +(developer-mode-activation)= + +## Activation + +To activate it, open the {guilabel}`Settings` app, scroll down to the {guilabel}`Developer Tools` +section, and click {guilabel}`Activate the developer mode`. + +Once activated, the {guilabel}`Deactivate the developer mode` option becomes available. + +```{image} developer_mode/settings.png +:alt: Activating the developer mode in the Settings app +``` + +To activate the developer mode **from anywhere in the database**, add `?debug=1` at the end of the +URL (e.g., `https://example.odoo.com/odoo?debug=1`). To deactivate it, use `?debug=0` instead. + +Use `?debug=assets` to activate the developer mode with assets and `?debug=tests` to activate it +with tests assets. + +:::{tip} +Open the **command palette** by pressing `Ctrl + K` or `Cmd ⌘ + K`, then type `debug` to +activate the developer mode with assets or deactivate it. +::: + +:::{admonition} Browser extension +The [Odoo Debug](https://github.com/Droggol/OdooDebug) browser extension adds an icon to toggle +developer mode on or off from the browser's toolbar. It is available on the [Chrome Web Store](https://chromewebstore.google.com/detail/odoo-debug/hmdmhilocobgohohpdpolmibjklfgkbi) and +[Firefox Add-ons](https://addons.mozilla.org/firefox/addon/odoo-debug/). +::: + +(developer-mode-tools)= + +## Developer tools and technical menu + +Once the developer mode is activated, the developer tools can be accessed by clicking the +{icon}`fa-bug` {guilabel}`(bug)` icon. The menu contains tools useful for understanding or editing +technical data, such as a view's field, filters, or actions. The options available depend on where +the menu is accessed from. + +```{image} developer_mode/tools.png +:alt: Accessing the developer tools +``` + +Database administrators can access the technical menu from the {guilabel}`Settings` app. It contains +advanced database settings, such as ones related to the database structure, security, actions, etc. + +```{image} developer_mode/technical.png +:alt: Accessing the technical menu +``` + diff --git a/content/applications/general/email_communication.md b/content/applications/general/email_communication.md new file mode 100644 index 000000000..cc9f3f2fe --- /dev/null +++ b/content/applications/general/email_communication.md @@ -0,0 +1,112 @@ +--- +show-content: true +--- + +# Communication in Odoo by email + +Communication in Odoo related to records such as CRM opportunities, sales orders, invoices, ... +have a discussion thread called **chatter**, often displayed on the right side of the record. + +On the chatter, you can send direct emails or Odoo notifications to the followers of a document +(depending on their notification preferences), log internal notes, send WhatsApp messages or SMSes, +and schedule activities. + +If a follower replies to a message, the reply updates the chatter, and Odoo relays it to the +followers as a notification. All emails - outgoing and incoming - appear in the same chatter. + +(email-online-sh)= + +## Odoo Online and Odoo.sh users + +On Odoo Online and Odoo.sh, outgoing and incoming emails work out of the box, **nothing needs to be +done**. Everything is already configured on your subdomain. + +By default, outgoing emails use the following {ref}`notification email address +` `notifications@company-name.odoo.com`. + +(email-online-sh-domain)= + +### Using another domain + +If you prefer not to have outgoing emails sent from Odoo's subdomain `@company-name.odoo.com` but +instead {ref}`from your own domain `, **additional configuration will +be necessary** on the domain and within Odoo. This introduces an extra layer of complexity and +necessitates technical knowledge (mainly regarding DNS and mail protocols). + +By adding a domain and configuring the administration access rights, you can also access the +{ref}`new domain alias ` page to configure the alias of your companies. +If only one domain is configured, this domain will be shared by all companies on the database. + +If you want to keep using Odoo's mail server, you will have to {ref}`configure the SPF and DKIM +`. + +If {ref}`you want to use your own mail server `, you will +have to follow the mail server provider's specific documentation. + +For incoming emails, after adding your own domain, {ref}`replies from customers will come back to +your domain `, and you will need to use one of the three possible ways +to get the emails back into Odoo (using either {ref}`incoming mail server +`, {ref}`redirection/forwarding +` or {ref}`DNS MX record +`). Everything is covered in the {doc}`Manage inbound messages +documentation `. + +(email-on-premise)= + +## On-premise users + +If you are on-premise, you will have to completely configure your outgoing and incoming emails: + +- For outgoing emails, you will need {ref}`to use an SMTP server and a custom domain + `. +- For incoming emails, set the frequency at which you fetch new emails low enough for responsiveness + but high enough in order not to stress your system or provider. Due to this reason and the + simplicity of this configuration, we usually advise on using incoming mail servers. To use an SMTP + server, check out the {ref}`"Use a custom domain for inbound messages" documentation + `. + +(email-third-party-server)= + +## Using a third-party provider's mail server + +Odoo's documentation also covers several popular mail servers. As they require specific +authorizations and configuration, they add a layer of complexity. For this reason, using Odoo's +outgoing mail server is recommended. + +- {doc}`Outlook documentation ` +- {doc}`Gmail documentation ` +- {doc}`Mailjet documentation ` + +:::{note} +Every provider has its own limitations. Research the desired provider *before* configuring it. +For example, Outlook and Gmail might not be suitable for large marketing campaigns. +::: + +:::{seealso} +- {doc}`Activities <../essentials/activities>` +- {doc}`Discuss app <../productivity/discuss>` +- {doc}`Digest emails ` +- {doc}`Email Marketing app <../marketing/email_marketing>` +- {doc}`Email templates ` +- {ref}`Expense creation using an email alias ` +- {ref}`Helpdesk ticket creation using an email alias ` +- {ref}`Lead creation using an email alias ` +- {ref}`Project task creation using an email alias ` +- {doc}`Technical mail getaway for on-premise users + <../../administration/on_premise/email_gateway>` +- {ref}`Technical start of Odoo database with an outgoing mail server configured from the + command-line interface ` +::: + +```{toctree} +:titlesonly: true + +email_communication/email_servers_inbound +email_communication/email_servers_outbound +email_communication/email_domain +email_communication/azure_oauth +email_communication/google_oauth +email_communication/mailjet_api +email_communication/faq +``` + diff --git a/content/applications/general/email_communication/azure_oauth.md b/content/applications/general/email_communication/azure_oauth.md new file mode 100644 index 000000000..b7456ce8b --- /dev/null +++ b/content/applications/general/email_communication/azure_oauth.md @@ -0,0 +1,302 @@ +# Connect Microsoft Outlook 365 to Odoo using Azure OAuth + +Odoo is compatible with Microsoft's Azure OAuth for Microsoft 365. In order to send and receive +secure emails from a custom domain, all that is required is to configure a few settings on the +Azure platform and on the back end of the Odoo database. This configuration works with either a +personal email address or an address created by a custom domain. + +:::{seealso} +[Microsoft Learn: Register an application with the Microsoft identity platform](https://learn.microsoft.com/azure/active-directory/develop/quickstart-register-app) +::: + +:::{seealso} +- {doc}`/applications/general/users/azure` +- {doc}`/applications/productivity/calendar/outlook` +::: + +## Setup in Microsoft Azure Portal + +### Create a new application + +To get started, go to [Microsoft's Azure Portal](https://portal.azure.com/). Log in with the +{guilabel}`Microsoft Outlook Office 365` account if there is one, otherwise log in with the +personal {guilabel}`Microsoft account`. A user with administrative access to the Azure Settings +will need to connect and perform the following configuration. Next, navigate to the section +labeled {guilabel}`Manage Microsoft Entra ID` (formally *Azure Active Directory*). + +Now, click on {guilabel}`Add (+)`, located in the top menu, and then select {guilabel}`App +registration`. On the {guilabel}`Register an application` screen, rename the {guilabel}`Name` to +`Odoo` or something recognizable. Under the {guilabel}`Supported account types` section select +{guilabel}`Accounts in any organizational directory (Any Microsoft Entra ID directory - Multitenant) +and personal Microsoft accounts (e.g. Skype, Xbox)`. + +Under the {guilabel}`Redirect URL` section, select {guilabel}`Web` as the platform, and then input +`https:///microsoft_outlook/confirm` in the {guilabel}`URL` field. The `web.base.url` +is subject to change depending on the URL used to log in to the database. + +:::{note} +The documentation about the {ref}`web.base.url ` explains how to freeze +a unique URL. It is also possible to add different redirect URLs on the Microsoft app. +::: + +After the URL has been added to the field, {guilabel}`Register` the application, so it is created. + +### API permissions + +The {guilabel}`API permissions` should be set next. Odoo will need specific API permissions to be +able to read (IMAP) and send (SMTP) emails in the Microsoft 365 setup. First, click the +{guilabel}`API permissions` link, located in the left menu bar. Next, click on the {guilabel}`(+) +Add a Permission` button and select {guilabel}`Microsoft Graph` under {guilabel}`Commonly Used +Microsoft APIs`. After, select the {guilabel}`Delegated Permissions` option. + +In the search bar, search for the following {guilabel}`Delegated permissions` and click +{guilabel}`Add permissions` for each one: + +- {guilabel}`SMTP.Send` +- {guilabel}`IMAP.AccessAsUser.All` + +:::{note} +The {guilabel}`User.Read` permission will be added by default. +::: + +```{image} azure_oauth/permissions.png +:align: center +:alt: API permissions needed for Odoo integration are listed under the Microsoft Graph. +``` + +## Assign users and groups + +After adding the API permissions, navigate back to the {guilabel}`Overview` of the +{guilabel}`Application` in the top of the left sidebar menu. + +Now, add users to this application. Under the {guilabel}`Essentials` overview table, click on the +link labeled {guilabel}`Managed Application in Local Directory`, or the last option on the bottom +right-hand side of the table. + +```{image} azure_oauth/managed-application.png +:align: center +:alt: |- +: Add users/groups by clicking the Managed application in local directory link for the +: created application. +``` + +In the left sidebar menu, select {guilabel}`Users and Groups`. Next, click on {guilabel}`(+) Add +User/Group`. Depending on the account, either a {guilabel}`Group` and a {guilabel}`User` can be +added, or only {guilabel}`Users`. Personal accounts will only allow for {guilabel}`Users` to be +added. + +Under {guilabel}`Users` or {guilabel}`Groups`, click on {guilabel}`None Selected` and add the users +or group of users that will be sending emails from the {guilabel}`Microsoft account` in Odoo. +{guilabel}`Add` the users/groups, click {guilabel}`Select`, and then {guilabel}`Assign` them to the +application. + +### Create credentials + +Now that the Microsoft Azure app is set up, credentials need to be created for the Odoo setup. +These include the {guilabel}`Client ID` and {guilabel}`Client Secret`. To start, the +{guilabel}`Client ID` can be copied from the {guilabel}`Overview` page of the app. The +{guilabel}`Client ID` or {guilabel}`Application ID` is located under the {guilabel}`Display Name` +in the {guilabel}`Essentials` overview of the app. + +```{image} azure_oauth/application-id.png +:align: center +:alt: Application/Client ID located in the Overview of the app. +``` + +Next, the {guilabel}`Client Secret Value` needs to be retrieved. To get this value, click on +{guilabel}`Certificates & Secrets` in the left sidebar menu. Then, a {guilabel}`Client Secret` +needs to be produced. In order to do this, click on the {guilabel}`(+) New Client Secret` button. + +A window on the right will populate with a button labeled {guilabel}`Add a client secret`. Under +{guilabel}`Description`, type in `Odoo Fetchmail` or something recognizable, and then set the +{guilabel}`expiration date`. + +:::{important} +A new {guilabel}`Client Secret` will need to be produced and configured if the first one +expires. In this event, there could be an interruption of service, so the expiration date should +be noted and set to the furthest possible date. +::: + +Next, click on {guilabel}`Add` when these two values are entered. A {guilabel}`Client Secret Value` +and {guilabel}`Secret ID` will be created. It is important to copy the {guilabel}`Value` or +{guilabel}`Client Secret Value` into a notepad as it will become encrypted after leaving this page. +The {guilabel}`Secret ID` is not needed. + +```{image} azure_oauth/secretvalue.png +:align: center +:alt: Client Secret Value or Value in the app's credentials. +``` + +After these steps, the following items should be ready to be set up in Odoo: + +- A client ID ({guilabel}`Client ID` or {guilabel}`Application ID`) +- A client secret ({guilabel}`Value` or {guilabel}`Client Secret Value`) + +This completes the setup on the {guilabel}`Microsoft Azure Portal` side. + +## Setup in Odoo + +### Enter Microsoft Outlook credentials + +First, open the Odoo database and navigate to the {guilabel}`Apps` module. Then, remove the +{guilabel}`Apps` filter from the search bar and type in `Outlook`. After that, install the module +called {guilabel}`Microsoft Outlook`. + +Next, navigate to {menuselection}`Settings --> General Settings`, and under the {guilabel}`Discuss` +section, ensure that the checkbox for {guilabel}`Custom Email Servers` is checked. This populates +a new option for {guilabel}`Outlook Credentials`. + +{guilabel}`Save` the progress. + +Then, copy and paste the {guilabel}`Client ID` (Application ID) and {guilabel}`Client Secret +(Client Secret Value)` into the respective fields and {guilabel}`Save` the settings. + +```{image} azure_oauth/outlookcreds.png +:align: center +:alt: Outlook Credentials in Odoo General Settings. +``` + +### Configure outgoing email server + +On the {guilabel}`General Settings` page, under the {guilabel}`Custom Email Servers` setting, +click the {guilabel}`Outgoing Email Servers` link to configure the Microsoft account. + +Then, create a new email server and check the box for {guilabel}`Outlook`. Next, fill in the +{guilabel}`Name` (it can be anything) and the Microsoft Outlook email {guilabel}`Username`. + +If the {guilabel}`From Filter` field is empty, enter either a {ref}`domain or email address +`. + +Then, click on {guilabel}`Connect your Outlook account`. + +A new window from Microsoft opens to complete the {guilabel}`authorization process`. Select the +appropriate email address that is being configured in Odoo. + +```{image} azure_oauth/verify-outlook.png +:align: center +:alt: Permission page to grant access between newly created app and Odoo. +``` + +Then, allow Odoo to access the Microsoft account by clicking on {guilabel}`Yes`. After this, the +page will navigate back to the newly configured {guilabel}`Outgoing Mail Server` in Odoo. The +configuration automatically loads the {guilabel}`token` in Odoo, and a tag stating +{guilabel}`Outlook Token Valid` appears in green. + +```{image} azure_oauth/outlook-token.png +:align: center +:alt: Valid Outlook Token indicator. +``` + +Finally, click {guilabel}`Test Connection`. A confirmation message should appear. The Odoo database +can now send safe, secure emails through Microsoft Outlook using OAuth authentication. + +(azure-oauth-notifications)= + +#### Configuration with a single outgoing mail server + +Configuring a single outgoing server is the simplest configuration available for Microsoft Azure +and it doesn't require extensive access rights for the users in the database. + +A generic email address would be used to send emails for all users within the database. For example +it could be structured with a `notifications` alias (`notifications@example.com`) or `contact` alias +(`contact@example.com`). This address must be set as the {guilabel}`FROM Filtering` on the server. +This address must also match the `{mail.default.from}@{mail.catchall.domain}` key combination in the +system parameters. + +:::{seealso} +Visit the {ref}`From Filtering documentation ` for more +information. +::: + +:::{note} +The {guilabel}`System Parameters` can be accessed by activating {ref}`developer-mode` in the +{menuselection}`Settings --> Technical --> Parameters --> System Parameters` menu. +::: + +When using this configuration, every email that is sent from the database will use the address of +the configured `notification` mailbox. However it should be noted that the name of the sender will +appear but their email address will change: + +```{image} azure_oauth/from-name-remain.png +:align: center +:alt: Name from real sender with static email. +``` + +```{eval-rst} +.. example:: + Single outgoing mail server configuration: + + - Outgoing mail server **username** (login) = `notifications@example.com` + - Outgoing mail server :guilabel:`FROM Filtering` = `notifications@example.com` + - `mail.catchall.domain` in system parameters = `example.com` + - `mail.default.from` in system parameters = `notifications` +``` + +#### User-specific (multiple user) configuration + +In addition to a generic email server, individual email servers can be set up for users in a +database. These email addresses must be set as the {guilabel}`FROM Filtering` on each individual +server for this configuration to work. + +This configuration is the more difficult of the two Microsoft Azure configurations, in that it +requires all users configured with email servers to have access rights to settings in order to +establish a connection to the email server. + +##### Setup + +Each user should have a separate email server set up. The {guilabel}`FROM Filtering` should be set +so that only the user's email is sent from that server. In other words, only a user with an email +address that matches the set {guilabel}`FROM Filtering` is able to use this server. + +:::{seealso} +Visit the {ref}`From Filtering documentation ` for more +information. +::: + +A {ref}`fallback server ` must be setup to allow for the sending of +{guilabel}`notifications`. The {guilabel}`FROM Filtering` for this server should have the value of +the `{mail.default.from}@{mail.catchall.domain}`. + +:::{note} +The {guilabel}`System Parameters` can be accessed by activating {ref}`developer-mode` in the +{menuselection}`Settings --> Technical --> Parameters --> System Parameters` menu. +::: + +::::{important} +The configuration for this transactional email server can work alongside an outgoing mass-mailing +email server. The {guilabel}`FROM Filtering` for the mass-mailing email server can remain empty, +but it's require to be added in the settings of the *Email Marketing* application. + +:::{seealso} +For more information on setting the mass-mailing email server visit +{ref}`email-outbound-custom-domain-smtp-server`. +::: +:::: + +```{eval-rst} +.. example:: + Multiple user outgoing mail server configuration: + + - User #1 mailbox + - Outgoing mail server #1 **username** (login) = `john@example.com` + - Outgoing mail server #1 :guilabel:`FROM Filtering` = `john@example.com` + - User #2 mailbox + - Outgoing mail server #2 **username** (login) = `jane@example.com` + - Outgoing mail server #2 :guilabel:`FROM Filtering` = `jane@example.com` + - Notifications mailbox + - Outgoing mail server #3 **username** (login) = `notifications@example.com` + - Outgoing mail server #3 :guilabel:`FROM Filtering` = `notifications@example.com` + - System Parameters + - `mail.catchall.domain` in system parameters = `example.com` + - `mail.default.from` in system parameters = `notifications` +``` + +### Configure incoming email server + +The incoming account should be configured in a similar way to the outgoing email account. Navigate +to the {guilabel}`Incoming Mail Servers` in the {guilabel}`Technical Menu` and {guilabel}`Create` a +new configuration. Check or Select the button next to {guilabel}`Outlook Oauth Authentication` and +enter the {guilabel}`Microsoft Outlook username`. Click on {guilabel}`Connect your Outlook +account`. Odoo will state: {guilabel}`Outlook Token Valid` Now {guilabel}`Test and Confirm` the +account. The account should be ready to receive email to the Odoo database. + diff --git a/content/applications/general/email_communication/email_domain.md b/content/applications/general/email_communication/email_domain.md new file mode 100644 index 000000000..01bfde8cf --- /dev/null +++ b/content/applications/general/email_communication/email_domain.md @@ -0,0 +1,155 @@ +# Configure DNS records to send emails in Odoo + +This documentation presents three complementary authentication protocols (SPF, DKIM, and DMARC) used +to prove the legitimacy of an email sender. Not complying with these protocols will greatly reduce +chances of your emails to reach their destination. + +**Odoo Online** and **Odoo.sh** databases using the **default Odoo subdomain address** (e.g., +`\@company-name.odoo.com`) are pre-configured to **send authenticated emails** compliant with the +SPF, DKIM, and DMARC protocols. + +If choosing to use a **custom domain** instead, **configuring SPF and DKIM records correctly is +essential** to prevent emails from being quarantined as spam or not being delivered to recipients. + +If using {ref}`the default Odoo email server to send emails from a custom domain +`, the SPF and DKIM records must be configured as +presented below. If using an outgoing email server, it is required to use the SPF and DKIM records +specific to that email service and a custom domain. + +:::{note} +Email service providers apply different rules to incoming emails. An email may be classified as +spam even if it passes the SPF and DKIM checks. +::: + +(email-domain-spf)= + +## SPF (Sender Policy Framework) + +The Sender Policy Framework (SPF) protocol allows the owner of a domain name to specify which +servers are allowed to send emails from that domain. When a server receives an incoming email, it +checks whether the IP address of the sending server is on the list of allowed IPs according to the +sender's {abbr}`SPF (Sender Policy Framework)` record. + +In Odoo, the **SPF test is performed on the bounce address** defined under the {guilabel}`Alias +Domain` field found under the database's {guilabel}`General Settings`. If using a custom domain as +{guilabel}`Alias Domain`, it is necessary to configure it to be SPF-compliant. + +The SPF policy of a domain is set using a TXT record. The way to create or modify this record +depends on the provider hosting the {abbr}`DNS (Domain Name System)` zone of the domain name. + +If the domain name does not yet have an SPF record, create one using the following input: + +```bash +v=spf1 include:_spf.odoo.com ~all +``` + +If the domain name **already has an SPF record, the record must be updated**. Do not create a new +one, as a domain must have only one SPF record. + +```{eval-rst} +.. example:: + If the TXT record is `v=spf1 include:_spf.google.com ~all`, edit it to add + `include:_spf.odoo.com`: `v=spf1 include:_spf.odoo.com include:_spf.google.com ~all` +``` + +Check the SPF record using a tool like [MXToolbox SPF Record Check](https://mxtoolbox.com/spf.aspx). The process to create or modify an SPF record depends on the +provider hosting the DNS zone of the domain name. The {ref}`most common providers +` and their documentation are listed below. + +(email-domain-dkim)= + +## DKIM (DomainKeys Identified Mail) + +The DomainKeys Identified Mail (DKIM) allows a user to authenticate emails with a digital signature. + +When sending an email, the Odoo email server includes a unique {abbr}`DKIM (DomainKeys Identified +Mail)` signature in the headers. The recipient's server decrypts this signature using the DKIM +record in the database's domain name. If the signature and the key contained in the record match, it +proves the message is authentic and has not been altered during transport. + +Enabling DKIM is **required** when sending emails **from a custom domain** using the Odoo email +server. + +To enable DKIM, add a {abbr}`CNAME (Canonical Name)` record to the {abbr}`DNS (Domain Name System)` +zone of the domain name: + +```bash +odoo._domainkey IN CNAME odoo._domainkey.odoo.com. +``` + +:::{tip} +If the domain name is `company-name.com`, make sure to create a subdomain +`odoo._domainkey.company-name.com` whose canonical name is `odoo._domainkey.odoo.com.`. +::: + +The way to create or modify a CNAME record depends on the provider hosting the DNS zone of the +domain name. The {ref}`most common providers ` and their +documentation are listed below. + +Check if the DKIM record is valid using a tool like [MXToolbox DKIM Record Lookup](https://mxtoolbox.com/dkim.aspx). Enter `example.com:odoo` in the DKIM lookup tool, specifying +that the selector being tested is `odoo` for the custom domain `example.com`. + +(email-domain-dmarc)= + +## DMARC (Domain-based Message Authentication, Reporting and Conformance) + +The {abbr}`DMARC (Domain-based Message Authentication, Reporting, & Conformance)` record is a +protocol that unifies {abbr}`SPF (Sender Policy Framework)` and {abbr}`DKIM (DomainKeys Identified +Mail)`. The instructions contained in the DMARC record of a domain name tell the destination server +what to do with an incoming email that fails the SPF and/or DKIM check. + +:::{note} +The aim of this documentation is to help **understand the impact DMARC has on the deliverability +of emails**, rather than give precise instructions for creating a DMARC record. Refer to a +resource like [DMARC.org](https://dmarc.org/) to set the DMARC record. +::: + +There are three DMARC policies: + +- `p=none` +- `p=quarantine` +- `p=reject` + +`p=quarantine` and `p=reject` instruct the server that receives an email to quarantine that email or +ignore it if the SPF or DKIM check fails. + +:::{note} +**For the DMARC to pass, the DKIM or SPF check needs to pass** and the domains must be in +alignment. If the hosting type is Odoo Online, DKIM configuration on the sending domain is +required to pass the DMARC. +::: + +Passing DMARC generally means that the email will be successfully delivered. However, it's important +to note that **other factors like spam filters can still reject or quarantine a message**. + +`p=none` is used for the domain owner to receive reports about entities using their domain. It +should not impact the deliverability. + +```{eval-rst} +.. example:: + :literal:`_dmarc IN TXT “v=DMARC1; p=none; rua=mailto:postmaster@example.com”` means that + aggregate DMARC reports will be sent to `postmaster\@example.com`. +``` + +(email-domain-mail-config-common-providers)= + +(email-domain-providers-documentation)= + +## SPF, DKIM and DMARC documentation of common providers + +- [OVH DNS](https://docs.ovh.com/us/en/domains/web_hosting_how_to_edit_my_dns_zone/) +- [GoDaddy TXT record](https://www.godaddy.com/help/add-a-txt-record-19232) +- [GoDaddy CNAME record](https://www.godaddy.com/help/add-a-cname-record-19236) +- [NameCheap](https://www.namecheap.com/support/knowledgebase/article.aspx/317/2237/how-do-i-add-txtspfdkimdmarc-records-for-my-domain/) +- [CloudFlare DNS](https://support.cloudflare.com/hc/en-us/articles/360019093151) +- [Squarespace DNS records](https://support.squarespace.com/hc/en-us/articles/360002101888-Adding-custom-DNS-records-to-your-Squarespace-managed-domain) +- [Azure DNS](https://docs.microsoft.com/en-us/azure/dns/dns-getstarted-portal) + +To fully test the configuration, use the [Mail-Tester](https://www.mail-tester.com/) tool, which +gives a full overview of the content and configuration in one sent email. Mail-Tester can also be +used to configure records for other, lesser-known providers. + +:::{seealso} +[Using Mail-Tester to set SPF Records for specific carriers](https://www.mail-tester.com/spf/) +::: + diff --git a/content/applications/general/email_communication/email_servers_inbound.md b/content/applications/general/email_communication/email_servers_inbound.md new file mode 100644 index 000000000..f7236ce25 --- /dev/null +++ b/content/applications/general/email_communication/email_servers_inbound.md @@ -0,0 +1,382 @@ +# Manage inbound messages + +An inbound message is an email delivered to an Odoo database. Anyone can send an email to an email +alias created in the database or reply to an email that was previously sent from the database based +on the *reply-to* header. + +(email-inbound-aliases)= + +## Email aliases + +(email-inbound-aliases-model)= + +### Model specific aliases + +Some applications have their specific aliases (sales teams, helpdesk teams, projects, etc.). These +aliases are used to: + +- Create a record when an email is sent directly to the alias, +- Receive replies to an email initially sent from a record. + +```{eval-rst} +.. example:: + + .. image:: email_servers_inbound/sales-team-alias-config.png + :alt: The local-part "info" is used for the alias of the sales team. + + In the example displayed above, sending an email to `info@company-name.odoo.com` will create a + new opportunity or a new lead automatically assigned to the corresponding sales team. If an email + is sent from the chatter of an existing opportunity, the *reply-to* will be + `info@company-name.odoo.com`. The reply will be posted in the right chatter, according to the + *message-id* header. +``` + +(email-inbound-aliases-catchall)= + +### Catchall + +If an application does not have an alias, a generic fallback alias is used: the catchall. An email +sent from a chatter has a reply address set to this catchall alias. A reply sent to the catchall is +posted to the right chatter thanks to the *message-id* header. + +By default, the local-part *catchall* will be used. Enable {ref}`developer-mode` and go to +{menuselection}`Settings --> Technical --> Emails: Alias Domains` to access the configuration. + +An email to the catchall always needs to be a reply to a previous email sent from the database. If +an email is sent directly to the catchall, the sender will receive the following message: + +```{image} email_servers_inbound/direct-mail-to-catchall.png +:alt: Bounce email from "MAILER-DEAMON" explaining how to contact the database. +``` + +:::{note} +The email address `info@company-name.com` displayed in the screenshot above is the email address +set on the company. Upon entering the developer mode on a company profile, additional +configuration options (such as catchall and bounce) become readable. It can be modified by +clicking on the internal link of the Email Domain. It is generally not recommended to modify +these options unless specific needs dictate, as it will affect all replies to previously sent +emails. +::: + +```{eval-rst} +.. example:: + An alias can be configured on a sales team in the CRM app. When a customer replies to an email + coming from the CRM app, the *reply-to* is `info@company-name.odoo.com`. + + When an email is sent from the Contact app, the reply address is `catchall@company-name.odoo.com` + because there is no alias on the contact model. +``` + +:::{note} +It is advised to keep the local-part of the catchall and the bounce unchanged. If this value is +modified, previous emails sent from the database will still have the previous local-part values. +This could lead to replies not being correctly received in the database. +::: + +(email-inbound-aliases-bounce)= + +### Bounce + +In the same way the catchall alias is used to build the reply address, the bounce alias is used to +build the *return-path* of the email. The *return-path* is used when emails cannot be delivered to +the recipient and an error is returned to the sender. + +By default the name *bounce* will be used. Enable {ref}`developer-mode` and go to +{menuselection}`Settings --> Technical --> Emails: Alias Domains` to access the configuration. + +:::{note} +On Odoo Online, when using the default outgoing email server, the return-path address is forced +to the value `bounce@company-name.odoo.com` independently of the value set as bounce alias. +::: + +When an error occurs, a notification is received and displayed in a red envelope in the chatter. In +some cases, the red envelope can just contain a `no error` message, meaning there is an error that +could not be handled by Odoo. + +A notification will also be displayed in the Discuss icon on the navigation bar. + +```{image} email_servers_inbound/mail-error-notif-navbar.png +:alt: An email sent to a contact had an issue and the error is reported on the navbar. +``` + +```{eval-rst} +.. example:: + If the email address of the recipient is incorrect, by clicking on the red envelope in the + chatter an error message containing the reason for the failure will be given. + + .. image:: email_servers_inbound/red-envelope-info.png + :alt: An email sent to a wrong domain generates a bounce displayed as a red envelope. +``` + +(email-inbound-default)= + +## Receive emails with Odoo's default configuration + +On **Odoo Online** and **Odoo.sh**, the email alias, reply, and bounce addresses are pre-configured. +These addresses use the alias domain automatically added to a standard database. + +```{eval-rst} +.. example:: + Assuming the database URL is `https://mydatabase.odoo.com`, the alias domain + `mydatabase.odoo.com` is automatically created. Catchall and bounce can be used and their address + is respectively `catchall@mydatabase.odoo.com`, and `bounce@mydatabase.odoo.com`. + + If the CRM app is installed, and a sales team with the alias `info` is created, the + `info@mydatabase.odoo.com` address can be used immediately. The same goes for any other alias + created in other applications. +``` + +The database domain is ready to be used to receive emails without any additional configuration. + +(email-inbound-multiple-subdomains)= + +## Use multiple Odoo subdomains + +On **Odoo Online**, the only Odoo subdomain is the one defined at the database creation. + +On **Odoo.sh**, it is possible to use several Odoo subdomains. In the settings of the branch, +additional Odoo subdomains can be added as long as they are not used yet in another branch. These +domains must then be added to the alias domains to be used by a company. + +```{image} email_servers_inbound/custom-subdomain-sh.png +:alt: Setting up an Odoo subdomain on a branch. +``` + +(email-inbound-custom-domain)= + +## Use a custom domain for inbound messages + +The {ref}`alias domain ` must be selected in the general +settings. If you have multiple companies, each one must be configured. + +```{image} email_servers_inbound/alias-domain-settings.png +:alt: The alias domain in the general settings. +``` + +All the aliases will use this custom domain. Replies on models for which an alias is configured +are done to `[alias]@my-custom-domain.com`. Replies to other models are sent to the catchall through +`catchall@my-custom-domain.com`. + +```{image} email_servers_inbound/diagram-mail-custom-domain.png +:alt: Technical schema of mailing route when using a custom domain in Odoo. +``` + +:::{important} +If emails are sent using Odoo's email servers while using a custom domain, follow the +{ref}`"Using a custom domain with Odoo’s email server" instructions +`. +::: + +Since this custom domain is used, all emails using an alias (replies, bounces and direct +sends) are sent to an address of the domain. They are thus delivered to the email server linked to the domain (MX record). To +display them in the chatter or to create new records, it is necessary to retrieve these incoming +emails in the Odoo database. + +```{eval-rst} +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - Method + - Benefits + - Drawbacks + * - :ref:`Redirections ` + - Easy to set up, emails are directly sent to the database. + - Each alias of a database needs to be configured. + * - :ref:`Incoming mail servers ` + - Allows to keep a copy of the email in your mailbox (with IMAP). + Allows to create records in the chosen model. + - Depends on a CRON, meaning emails are not retrieved immediately in the database. + Each alias of a database needs to be configured. + * - :ref:`MX record ` + - Only one record needs to be created to make all aliases work properly. + - Using a subdomain is required. + Requires advanced technical knowledge. +``` + +:::{important} +For **on-premise databases**, the redirection and the MX record methods also require configuring +the {doc}`mail gateway script <../../../../administration/on_premise/email_gateway>`. Going +through this script requires **advanced technical and infrastructure knowledge**. +::: + +:::{important} +Refer to your provider’s documentation for more detailed information on how to handle the methods +detailed below. +::: + +(email-inbound-custom-domain-redirections)= + +### Redirections + +If the database is hosted on **Odoo Online** or **Odoo.sh**, using redirections is recommended. They +allow messages to be received without delay in the database. + +It is mandatory to redirect the catchall and bounce address to the Odoo subdomain of the database. +Every other alias used must be redirected as well. + +```{eval-rst} +.. example:: + With one sales team, the following redirections are required: + + - `catchall@company-name.com` → `catchall@company-name.odoo.com` + - `bounce@company-name.com` → `bounce@company-name.odoo.com` + - `info@company-name.com` → `info@company-name.odoo.com` +``` + +:::{important} +Some providers ask to validate the redirection by sending a link to the target email address. +This procedure is an issue for catchall and bounce since they are not used to create records. + +1. Modify the catchall value on the mail alias domain. {ref}`developer-mode` must be enabled to + access this menu. For example, it can be changed from `catchall` to `temp-catchall`. This will + allow to use `catchall` as the local-part of another alias. +2. Open an app that uses an alias. For example, CRM contains aliases for each sales team. Set + `catchall` as the local-part of the alias of a sales team. +3. The validation email will create a record in the CRM app. The email sent will be visible in + the chatter, allowing you to validate the redirection. +4. Do not forget to change back the alias of the sales team and the catchall value on the mail + alias domain, just as they were before this procedure. +::: + +:::{note} +An alternative to redirections is **forwarding**. With forwarding, **the address forwarding the +email will be identified as the sender**, while with redirections, the original sender will +always remain. +::: + +(email-inbound-custom-domain-incoming-server)= + +### 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`. + +:::{important} +We recommend using the IMAP protocol over the POP protocol, as IMAP fetches all unread emails, +while POP fetches all the emails' history and then tags them as deleted in your mailbox. +::: + +:::{tip} +It is also possible to connect a mailbox through {doc}`Gmail with Google OAuth ` or +{doc}`Outlook with Microsoft Azure OAuth `. +::: + +Regardless of the protocol chosen, emails are fetched using the *Mail: Fetchmail Service* scheduled +action. + +Additionally, using an incoming mail server in Odoo gives the opportunity to create new records in a +specified model. Each incoming mail server can create records in a different model. + +```{eval-rst} +.. example:: + Emails received on `task@company-name.com` are fetched by the Odoo database. All fetched emails will + create a new project task in the database. + + .. image:: email_servers_inbound/incoming-mail-server.png + :alt: Technical schema of mailing route when using a custom domain in Odoo. +``` + +(email-inbound-custom-domain-mx)= + +### MX record + +A third option is to create a MX record in your DNS zone which specifies the mail server managing +emails sent to your domain. **Advanced technical knowledge is required.** + +:::{important} +This configuration only works with a subdomain on the Odoo Online or Odoo.sh infrastructure +(e.g., `@mail.mydomain.com`) +::: + +Below are presented some specifications depending on the hosting type: + +```{eval-rst} +.. tabs:: + + .. group-tab:: Odoo Online + + The custom subdomain must be added to your :doc:`Odoo Portal + <../../websites/website/configuration/domain_names>`. + + .. group-tab:: Odoo.sh + + The custom subdomain must be added to the :doc:`settings of the project + <../../../administration/odoo_sh/getting_started/settings>`: + + .. image:: email_servers_inbound/custom-subdomain-sh.png + :alt: Adding a custom subdomain for mail to Odoo.sh project settings. +``` + +(email-inbound-loops)= + +## 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. + +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: + +```{image} email_servers_inbound/bounce-mail-loop.png +:alt: Bounce email received after attempting contact too many times an alias. +``` + +To change the default behavior, enable {ref}`developer-mode`, then go to {menuselection}`Settings +--> Technical --> Parameters: System Parameters` to add two parameters. + +- For the first parameter, enter `mail.gateway.loop.minutes` as the {guilabel}`Key` and choose a + number of minutes as the {guilabel}`Value` (`120` is the default behavior). +- 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 + +Incoming aliases are set in the Odoo database to create records by receiving incoming emails. To +view aliases set in the Odoo database, first activate the {ref}`developer mode `. +Then, go to {menuselection}`Settings app --> Technical --> Aliases`. + +The following system parameter, `mail.catchall.domain.allowed`, set with allowed alias domain +values, separated by commas, filters out correctly addressed emails to aliases. Setting the domains +for which the alias can create a ticket, lead, opportunity, etc., eliminates false positives where +email addresses with only the prefix alias, not the domain, are present. + +In some instances, matches have been made in the Odoo database when an email is received with the +same alias prefix and a different domain on the incoming email address. This is true in the sender, +recipient, and {abbr}`CC (Carbon Copy)` email addresses of an incoming email. + +```{eval-rst} +.. example:: + When Odoo receives emails with the `commercial` prefix alias in the sender, recipient, or + :abbr:`CC (Carbon Copy)` email addresses (e.g. commercial\@example.com), the database falsely + treats the email as the full `commercial` alias, with a different domain, and therefore, creates + a ticket/lead/opportunity/etc. +``` + +To add the `mail.catchall.domain.allowed` system parameter, first, activate the {ref}`developer mode +`. Then, go to {menuselection}`Settings app --> Technical --> System Parameters`. +Click {guilabel}`New`. Then, type in `mail.catchall.domain.allowed` for the {guilabel}`Key` field. + +Next, for the {guilabel}`Value` field, add the domains separated by commas. Manually +{icon}`fa-cloud-upload` {guilabel}`(Save)`, and the system parameter takes immediate effect. + +```{image} email_servers_inbound/allowed-domain.png +:alt: mail.catchall.domain.allowed system parameter set. +``` + +## Local-part based incoming detection + +When creating a new alias, there is an option to enable {guilabel}`Local-part based incoming +detection`. If enabled, Odoo only requires the local-part to match for routing an incoming email. If +this feature is turned off, Odoo requires the whole email address to match for routing an incoming +email. + diff --git a/content/applications/general/email_communication/email_servers_outbound.md b/content/applications/general/email_communication/email_servers_outbound.md new file mode 100644 index 000000000..ee3818e50 --- /dev/null +++ b/content/applications/general/email_communication/email_servers_outbound.md @@ -0,0 +1,353 @@ +# Manage outbound messages + +(email-outbound-default)= + +## Sending emails with Odoo's default configuration + +On **Odoo Online** and **Odoo.sh**, sending and receiving emails works out of the box. No +configuration is required. + +When a database is created, the subdomain `company-name.odoo.com` is used to send and receive +emails. The deliverability is optimized for this subdomain as it uses Odoo’s DNS configuration. + +```{eval-rst} +.. example:: + If the database subdomain is `company-name.odoo.com` and all mailing configurations are the + default ones, all emails will be sent from `notifications@company-name.odoo.com`. +``` + +:::{important} +Only **one** subdomain can be used as a mailing server in Odoo. Subdomains for additional +companies require an external email server with a custom domain. +::: + +```{image} email_servers_outbound/diagram-inbound-mailing-method.png +:alt: "Odoo\u2019s default outbound messages configuration." +``` + +Emails are sent with `catchall@company-name.odoo.com` as the *reply-to* address. In addition, +delivery errors are sent to `bounce@company-name.odoo.com`. + +:::{note} +The catchall, bounce, and notification addresses do not work like other aliases. They do not have +the vocation to create records in a database. Emails sent to an alias are automatically routed +and will reply to an existing and linked record or will create a new one in the database. +::: + +(email-outbound-custom-domain)= + +## Using a custom domain to send emails + +The database can be configured to use a custom domain, in which case all default email addresses are +built using the custom domain. If the custom domain is `company-name.com`, the sender address will +be `notifications@company-name.com`, the *reply-to* address `catchall@company-name.com`, and the +*bounce* address `bounce@company-name.com`. The custom domain can be utilized when sending emails +either with Odoo’s email servers or an external one. + +This section assumes ownership of a custom domain. If not, a custom domain must be purchased from a +domain registrar such as GoDaddy, Namecheap, or any alternative provider. + +(email-outbound-custom-domain-odoo-server)= + +### Using a custom domain with Odoo’s email server + +On **Odoo Online** or **Odoo.sh**, some configurations are mandatory in the custom domain's DNS to +ensure good deliverability. + +:::{warning} +Most of the configuration will be done on the domain provider’s side, and it might require some +configuration on the mail server itself. **Some technical knowledge is required.** +::: + +The first step is to configure the {ref}`SPF ` and {ref}`DKIM ` +to be compliant with Odoo’s mail server. + +Next, the custom domain must be set as the alias domain of a company. Select the company, open the +{guilabel}`Settings`, and add the custom domain under the {guilabel}`Alias Domain` field. + +After adding the alias domain, click the {icon}`oi-arrow-right` ({guilabel}`internal link`) icon to +assign more companies to the custom domain if needed. Enable the {ref}`developer-mode` mode to +modify the default aliases if desired: + +- {guilabel}`Bounce Alias`: the mailbox used to catch delivery errors and populate the {ref}`red + envelope ` on the corresponding message. +- {guilabel}`Catchall Alias`: the default mailbox used to centralize all replies. +- {guilabel}`Default From Alias`: the default sender address. + +:::{note} +At the creation of the first alias domain, all companies will use it. If you create a new +company, the alias domain automatically set is the one with the lowest priority (ad displayed on +the alias domain list in {ref}`developer-mode`). +::: + +All email aliases (e.g., related to CRM or Helpdesk teams) must have their corresponding mailbox in +the custom domain mail server. + +```{image} email_servers_outbound/diagram-owned-domain-odoo-server.png +:alt: Technical schema of external mail server configuration with Odoo. +``` + +To receive emails in the Odoo database within the corresponding chatter (CRM, invoices, sales +orders, etc.), one of these three methods must be used: + +- {ref}`Redirections/forwarding `, +- {ref}`Incoming mail servers `, +- {ref}`MX record ` (requires advanced technical knowledge) + +Using a custom domain implies that specific {ref}`local-parts +` might be used by Odoo to send emails. + +(email-outbound-custom-domain-smtp-server)= + +### Sending emails with an external SMTP server + +:::{note} +If utilizing your own outgoing mail server, it must be paired with your own domain, as updating +the DNS of an Odoo subdomain is not feasible. +::: + +To add an external SMTP server in Odoo, open {guilabel}`Settings`, and enable the {guilabel}`Use +Custom Email Servers` option found under the {guilabel}`Emails` section. Then, click +{guilabel}`Save` at the top of the page to save the changes. + +Returning to the {guilabel}`Emails` section, click {guilabel}`Outgoing Email Servers`, then `New` to +create an outgoing mail server record. Most fields are the common parameters used to set up a +connection to an SMTP server; use the values provided by your email provider. + +Once completed, click {guilabel}`Test Connection`. Note that a successful test connection does not +confirm that the email will go out as some restriction might remain on the provider side, thus, it +is recommended to consult your provider’s documentation. + +(email-outbound-custom-domain-smtp-server-local-part)= + +#### Local-part values + +Below are presented the different local-part values that can be used by Odoo to send emails. It +might be required to whitelist them in your mail server: + +- The Alias Domain Bounce Alias (default value = `bounce`), +- The Alias Domain Default From (default value = `notifications`), +- The default admin address `admin@company-name.odoo.com` or, if changed, the new value), +- The default Odoobot address `odoobot@company-name.odoo.com` or, if changed, the new value), +- The specific FROM defined on an email marketing campaign, +- The specific FROM that can be defined in an email template. + +:::{seealso} +- {doc}`google_oauth` +- {doc}`azure_oauth` +::: + +(email-outbound-different-servers)= + +## Setting up different servers for transactional and mass emails + +(email-outbound-different-servers-personalized)= + +### Personalized mail servers + +Transactional emails and mass mailings can be sent using separate email servers in Odoo. Doing so +means day-to-day emails, quotations, or invoices sent to clients will be handled as *transactional +emails*. *Mass mailing emails*, including the sending of batches of invoices or quotations, will be +managed by the Marketing Automation or Email Marketing application. + +```{eval-rst} +.. example:: + You can use services like Gmail, Amazon SES, or Brevo for transactional emails, and services like + Mailgun, Sendgrid, or Mailjet for mass mailings. +``` + +First, activate the {ref}`developer-mode` and go to {menuselection}`Settings --> Technical --> +Email: Outgoing Mail Servers`. There, add two outgoing email server records, one for the +transactional emails server and one for the mass mailings server. Enter a lower {guilabel}`Priority` +value for the transactional server (e.g., `1`) over the mass mailings server (e.g., `2`) so +transactional emails are given priority. + +```{image} email_servers_outbound/split-transaction-massmail-mail-servers.png +:alt: Example of split between transaction and mass mailing mail servers. +``` + +Now, go to {menuselection}`Email Marketing --> Configuration --> Settings`, enable +{guilabel}`Dedicated Server`, and select the appropriate email server. Odoo uses the server with the +lowest priority value for transactional emails, and the server selected here for mass mailings. + +```{image} email_servers_outbound/dedicated-mass-mail-server.png +:alt: Dedicated mail server on Email Marketing app settings. +``` + +(email-outbound-different-servers-personalized-from-filtering)= + +#### FROM filtering + +:::{important} +It’s **highly recommended** to configure the FROM Filtering on the outgoing mail servers as per +the instructions of your provider. +::: + +The {guilabel}`FROM Filtering` field allows for the use of a specific outgoing email server +depending on the *From* email address or domain that Odoo is sending on behalf of. The **value must +be a domain or a complete address** that matches the sender’s email address and is trusted on the +outgoing mail server provider's side. + +If FROM filtering is not used, emails will go out using the notification address. + +:::{warning} +Some outgoing mail servers require a specific configuration of the FROM filter. +::: + +When an email is sent from Odoo, the following sequence is used to choose the outgoing email server: + +- First, Odoo searches for a server that has the same FROM filtering value as the From value (i.e., + email address) defined in the outgoing email. This configuration is ideal if all users of a + company share the same domain but have different local-parts. + +```{eval-rst} +.. example:: + If the sender's email address is `test@example.com`, only an email server having a FROM filtering + value equal to `test@example.com` or `example.com` can be used. +``` + +- If no server is found based on the first criteria, Odoo looks for the first server without a FROM + filtering value set. The email will be overridden with the notification address. +- If no server is found based on the second criteria, Odoo uses the first server, and the email will + be overridden with the notification address. + +:::{note} +To determine which server is first, Odoo uses the priority value (the lower the value is, the +higher the priority is). Failing to do so, the first server is determined by the servers' names, +using alphabetical order. +::: + +It is also possible to use Odoo's mail server for transactional emails in addition to mass mailings. + +(email-outbound-different-servers-external-odoo)= + +### Using an external email server and Odoo’s default server + +On Odoo Online and Odoo.sh, databases are started with Odoo's SMTP server. If no outgoing mail +server is set, the default Odoo's SMTP server will be used. + +```{image} email_servers_outbound/command-line-interface-option-mail-server.png +:alt: Adding a mail server using the Odoo's mail server with the CLI authentication. +``` + +```{eval-rst} +.. example:: + If an outgoing mail server is used simultaneously with Odoo’s default server (CLI), the FROM + filter of the outgoing mail server must contain a custom domain, and the FROM filter of the CLI + must contain Odoo’s subdomain. If there is no FROM filtering, the email will go out using the + notification address. +``` + +```{image} email_servers_outbound/split-mail-servers.png +:alt: Splitting of Odoo mail server for transactional emails and Mail server for Mass +: mailing. +``` + +:::{note} +On Odoo Online, the command line interface is equivalent to the default Odoo mail server, using +the same limit as if there was no outgoing mail server in place. +::: + +:::{tip} +On Odoo Online, the page also shows your daily email usage and your daily limit. On Odoo.sh, you +need to check on the monitor page the number of outgoing emails that were sent. +::: + +:::{note} +On Odoo.sh, to use the command-line interface, an outgoing mail server can be configured on the +configuration file. +::: + +:::{warning} +Odoo’s mail server is meant for transactional emails and small-scale marketing campaigns. The +{ref}`daily limit ` depends on the +database type and the applications used. +::: + +(email-outbound-custom-domain-external-server)= + +## Using a custom domain with an external email server + +Similar to the {ref}`previous chapter `, proper +configuration might be needed to ensure that the external email server is allowed to send emails +using your custom domain. Refer to your provider’s documentation to properly set up the relevant +records (SPF, DKIM, and DMARC). A list of the {ref}`most common providers is available +`. + +:::{note} +DNS configuration is required when you use your own domain. If an external outgoing mail server +is used, configuring the records as described in the {doc}`Odoo DNS configuration for our mail +servers documentation ` **will not have the desired effect**, as it is independent +of Odoo when using a custom email server. Odoo does not allow the configuration of Odoo's +subdomain. +::: + +(email-outbound-port-restriction)= + +## Port restriction + +Port 25 is blocked for security reasons on Odoo Online and Odoo.sh. Try using port 465, 587, or 2525 +instead. + +(email-outbound-alias-domain)= + +## Alias domain + +The catchall domain is company-specific. By default, all companies share Odoo’s subdomain (e.g., +`company-name.odoo.com`), but each company may have its own custom email domain. + +When the {ref}`developer-mode` is activated, the alias domain options are available by going to +{menuselection}`Settings --> Technical --> Email: Alias Domains`. + +:::{warning} +Any modification of the alias domain must be done very carefully. If one of the aliases (bounce, +catchall, default from) is changed, all previous emails that are not properly redirected to the +new aliases will be lost. +::: + +The {guilabel}`Default From Alias` field can be filled with a local-part of the email address (by +default `notifications`) or a full email address. Configure it to determine the `FROM` header of +your emails. If a full email address is used, all outgoing emails will be overwritten with this +address. + +(email-outbound-notifications)= + +## Notification system + +When an email is sent from the chatter, customers can reply directly to it. If a customer replies +directly to an email, the answer is logged in the same chatter, thus functioning as a message thread +related to the record. + +Upon receiving the reply, Odoo then uses the subscribed followers (based on the subscribed subtypes) +to send them a notification by email, or in the Odoo inbox, depending on the user’s preferences. + +```{eval-rst} +.. example:: + If a customer with the email address `“Mary” ` makes a direct reply to + an email coming from the Odoo database, Odoo's default behavior is to redistribute the email's + content to all other followers within the thread. + + As Mary’s domain does not belong to the alias domain, Odoo overrides the email address and uses + the notification email address to notify the followers. This override depends on the + configuration done in the database. By default, on Odoo Online and Odoo.sh, the email `FROM` + address will be overridden with the value `notifications@company-name.odoo.com` instead of + `mary@customer.example.com`. + + The address is constructed using the name of the sender and + `{alias domain, default from alias}`@`{alias domain, domain name}`, by default, + `notifications@company-name.odoo.com`. +``` + +(email-outbound-unique-address)= + +## Using a unique email address for all outgoing emails + +To force the email address from which emails are sent, activate the {ref}`developer-mode`, and go to +{menuselection}`Settings --> Technical --> Email: Alias Domains`. On the {guilabel}`Default From +Alias`, use the the local-part or a complete email address as the value. + +:::{warning} +If a **complete address** is used as the {guilabel}`Default From Alias` value, **all** outgoing +emails will be overwritten by this address. +::: + diff --git a/content/applications/general/email_communication/faq.md b/content/applications/general/email_communication/faq.md new file mode 100644 index 000000000..cc0b9f52f --- /dev/null +++ b/content/applications/general/email_communication/faq.md @@ -0,0 +1,382 @@ +# Common emailing issues and solutions + +This page lists the most common emailing issues and their solutions. + +(email-issues-provider)= + +## Odoo is not an email provider + +Odoo does not function like a classic email inbox, such as Gmail, Outlook, Yahoo, etc. + +While Odoo uses emails as a way to notify and communicate with users/customers, it is, by design, +not a replacement for a dedicated email server. Therefore, it might not behave in the expected way +when compared to a traditional email inbox. + +The main differences are the following: + +- By default, once a notification or transactional email (quote, invoice, direct message to a + contact) is sent out successfully, the email object is deleted. The email message's content lives + in the chatter of the related record. It prevents cluttering the database with multiple copies of + the content of the same email (when sent to multiple recipients) if the content is already present + in the chatter. +- There is no concept of (blind) carbon copy ([B]CC). Odoo uses the concept of *followers* added to + a chatter to automatically decide when and how {ref}`a contact is notified + ` or receives a copy of an email. +- Incoming emails are handled by checking if the *TO* email address is a valid email address in the + Odoo database or, in case of a reply email, if there is a reference in the email header that + matches a message sent from the Odoo database. All other emails will be bounced and **not** + temporarily parked in a spam or quarantine folder. In other words, any email unrelated to an Odoo + database is lost. + +(email-issues-outgoing)= + +## Outgoing emails + +(email-issues-outgoing-admin-address)= + +### Changing the email address of the admin user account + +When an Odoo database is created, the main admin account is assigned a placeholder email address. It +is recommended to **replace the admin email address** with a valid email address to prevent outgoing +email issues. + +To do so, on the admin account, click the user icon, click {guilabel}`My Profile` (or +{guilabel}`Preferences`), and update the {guilabel}`Email` field found under the +{guilabel}`Preferences` tab. Either use any other email address or use your Odoo subdomain (e.g., +`company-name.odoo.com`) and `admin` for the local-part (e.g., `admin@company-name.odoo.com`). + +(email-issues-outgoing-delivery-failure)= + +### Delivery failure + +When a message is sent, an {icon}`fa-envelope-o` {guilabel}`(envelope)` icon is displayed in the +chatter. The icon turns red when delivery has failed for at least one recipient. + +```{image} faq/red-envelope.png +:alt: Red envelope icon displayed in the chatter. +``` + +Left-click the envelope to display information about the delivery, and, if possible, the relevant +{ref}`error messages `. + +```{image} faq/sending-failures.png +:alt: Example of a sending failure. +``` + +Click {guilabel}`See Error Details` to get extra information for the fail reason, **if** Odoo was +able to process the original error or bounce email. + +Click {guilabel}`Send & close` to retry sending the email to all **toggled-on** +({icon}`fa-toggle-on`) recipients under the {guilabel}`Try Again` column. All **toggled-off** +({icon}`fa-toggle-off`) recipients will be ignored. + +Click {guilabel}`Ignore all` to ignore all currently failing emails and turn the envelope icon from +red to white. + +Unsent emails also appear in the Odoo email queue. To access it, activate the {ref}`developer mode +` and go to {menuselection}`Settings --> Technical --> Email: Emails`. + +```{image} faq/technical-menu-email-delivery-failed.png +:alt: Example of the technical email queue view. +``` + +Failed emails display the {guilabel}`Delivery Failed` status. Click {guilabel}`Retry` to put a +failed email in the email queue again. It will then appear with the {guilabel}`Outgoing` status. The +email will be sent again the next time the scheduled action for the email queue runs. + +Optionally, queued emails can be sent immediately by clicking {guilabel}`Send Now`. Click +{guilabel}`Cancel Email` to remove it from the email queue. + +:::{note} +Sent emails are periodically cleaned from the queue. This is controlled by the *Auto-Vacuum* +scheduled action that cleans redundant data on your Odoo database. +::: + +(email-issues-outgoing-delivery-failure-messages)= + +#### Common error messages + +(email-issues-outgoing-delivery-failure-messages-limit)= + +##### Daily limit reached + +```{image} faq/email-limit.png +:alt: Email limit reached warning. +``` + +Odoo limits the number of emails that can be sent from an Odoo Online database. Most email service +providers (e.g., Google, Yahoo, etc.) will blacklist Odoo's server IP if Odoo's email server is +sending too many emails to addresses that do not exist or are no longer valid. It also applies to +unsolicited spam emails sent through an Odoo database. + +The default daily email limit varies between **5 and 200 emails**. The exact limit is depends on +several factors (subject to change): + +- Type of database subscription (one app free, trial, paying subscription) +- Apps installed (i.e., Email Marketing, Marketing Automation) +- If a database migration is ongoing + +If the daily limit is reached, you can: + +- Contact {ref}`Odoo Support ` to increase your email quota. The following factors + will be taken into account: + + 1. Numbers of users on the database + + 2. Apps installed + + 3. Bounce rate (the percentage of email addresses that did not receive emails because they were + returned by an email server on their way to the final recipient). + + 4. Whether your {ref}`email aliases are correctly set up and use the appropriate custom domains + `. + + :::{tip} + When using a custom domain, verify that {ref}`SPF `, {ref}`DKIM + `, and {ref}`DMARC ` are correctly configured so that + {ref}`Odoo's email servers are allowed to send emails on your custom domain's behalf + `. + ::: + +- {doc}`Use an external outgoing email server <../email_communication>` to be independent of Odoo's + email limit. + +- Wait until the next day, and retry sending the email. To do so, activate the {ref}`developer mode + `, go to {menuselection}`Settings --> Technical --> Email: Emails`, and click + {guilabel}`Retry` next to the unsent email. + +:::{important} +The daily email limit counts every email leaving your Odoo database, triggered either manually +or automatically. By default, any internal message, notification, logged note, etc., counts as an +email if it notifies someone via email. This can be mitigated by receiving {ref}`notifications in +Odoo ` instead of by email. +::: + +(email-issues-outgoing-delivery-failure-messages-smtp)= + +##### SMTP error + +[Simple Mail Transport Protocol (SMTP)](https://en.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol) is a standard used to transmit +emails between email servers and/or email clients. + +If you use {ref}`an external STMP server to send emails `, +a standard set of [SMTP error codes exists](https://en.wikipedia.org/wiki/List_of_SMTP_server_return_codes#Common_status_codes). While the +code numbers are not specific to Odoo, the exact content of the error message might vary from email +server to email server. + +```{eval-rst} +.. example:: + A 550 SMTP permanent delivery error from sendgrid.com: + + .. code-block:: text + + Mail Delivery Failed + Mail delivery failed via SMTP server 'None'. + SMTPDataError: 550 + The from address does not match a verified Sender Identity. Mail cannot be sent until this + error is resolved. Visit https://sendgrid.com/docs/for-developers/sending-email/sender-identity/ + to see the Sender Identity requirements + + The error message indicates that you tried sending an email from an unverified email address. + Investigating the outgoing email server configuration or the default *FROM* address of your + database is a good starting point to troubleshoot the issue, and verify that you whitelisted the + email address on the side of sendgrid.com. +``` + +Usually, inputting the error message content in a Google search can yield information on what the +root cause might be and how to correct the issue. + +If the issue cannot be resolved and keeps occurring, contact {ref}`Odoo Support +`. + +(email-issues-outgoing-delivery-failure-messages-no-error)= + +##### No error populated + +Odoo is not always capable of providing information on the reason a delivery failed. The different +email providers implement their own policy on bounced emails, and it is not always possible for Odoo +to interpret it correctly. + +If there is a recurring problem with the same customer or the same domain, contact {ref}`Odoo +Support `. + +:::{note} +One of the most common reasons for an email failing to be sent with no error message is related +to the {ref}`SPF ` or {ref}`DKIM ` configuration. Also, +verify that the implemented email notification setup is adapted to your business needs. See the +{doc}`Communication in Odoo by email documentation <../email_communication>` for more +information. +::: + +(email-issues-outgoing-execution-time)= + +### Execution time + +The exact time of an email is sent is handled by a system utility *cron* (scheduled action) that can +be used to schedule tasks to run automatically at predetermined intervals. Odoo uses this approach +to send emails that are considered "not urgent" (i.e., newsletters formats such as mass mailing, +marketing automation, and events). This avoids cluttering the mail servers and, instead, prioritizes +individual communication. + +```{eval-rst} +.. spoiler:: What is a cron? + + A cron is an action that Odoo runs in the background to execute particular code to complete a + task. Odoo also creates cron triggers in certain workflows that can trigger a scheduled action + earlier than its scheduled date. Running a scheduled action manually or changing its frequency + is generally not recommended, as it might create errors or break specific workflows. +``` + +By default, for the normal email queue, the {guilabel}`Mail: Email Queue Manager` cron runs every 60 +minutes. The lowest running interval for a cron is 5 minutes. Odoo recommends an interval of 15 +minutes to ensure proper operation. If the interval is too short, not all emails may be processed, +which may cause the cron to timeout. + +Emails that are considered urgent (from one person to another, such as sales orders, invoices, +purchase orders, etc.) are sent immediately. They do not show up under {menuselection}`Settings --> +Technical --> Email: Emails`, unless their delivery fails. + +```{image} faq/email-marketing-asap-notice.png +:alt: Example of sending information header when a mailing campaign is queued. +``` + +Email campaigns are sent as soon as possible (after clicking the {guilabel}`Send` button) or at a +scheduled time (after clicking the {guilabel}`Schedule` button). + +For the email marketing queue, the {guilabel}`Mail Marketing: Process queue` cron runs once a day, +but will be **automatically triggered early** if a campaign is scheduled outside of this default +frequency. If a mailing list contains a large number of recipients, triggering the cron manually +multiple times is **not recommended**, as it will not accelerate the processing time and might +create errors. + +:::{tip} +To edit crons, enable the {ref}`developer mode ` and go to +{menuselection}`Settings --> Technical --> Automation: Scheduled Actions`. +::: + +:::{seealso} +For more information about crons when using Odoo.sh, check out {doc}`Odoo.sh frequent technical +questions <../../../administration/odoo_sh/advanced/frequent_technical_questions>`. +::: + +(email-issues-outgoing-execution-time-campaigns)= + +#### Email Marketing campaigns stuck in the queue + +If multiple Email Marketing campaigns are put in the queue, they are processed in chronological +order based on their creation date. + +```{eval-rst} +.. example:: + If there are three campaigns: Campaign_1 (created 1st of January), Campaign_2 (created 2nd of + January), and Campaign_3 (created 3rd of January), they are put in the queue by clicking + :guilabel:`Send` on all three of them. + + .. image:: faq/email-marketing-order-queue-example.png + :alt: Example of three email marketing campaigns. + + The cron will try to process Campaign_1, then Campaign_2, and finally Campaign_3. It will not + start processing Campaign_2 until it finishes processing Campaign_1. + + If an email campaign never leaves the queue, there might be an issue with the campaign at the top + of the queue. To troubleshoot, we could remove Campaign_1 from the queue by clicking the + :guilabel:`Cancel` button, and see if the two other campaigns are sent. Then we could try to fix + Campaign_1 or contact :ref:`Odoo Support `. +``` + +(email-issues-incoming)= + +## Incoming emails + +When there is an issue with incoming emails, there might not be an indication, per se, in Odoo. It +is the sending email client, who tries to contact a database, that will get a bounce message (most +of the time a {guilabel}`550: mailbox unavailable` error message). + +(email-issues-incoming-not-received)= + +### Email is not received + +```{eval-rst} +.. tabs:: + + .. tab:: Odoo Online + + Contact :ref:`Odoo Support ` if there is a recurring issue with the same + client or domain. + + .. tab:: Odoo.sh + + You can use database logs to understand and fix issues. Logs are a stored collection of all + the tasks completed in a database. They are a text-only representation, complete with + timestamps of every action taken on the Odoo database. This can be helpful to track emails + leaving the database. Sending failures can also be seen by logs when they indicate that the + message tried to send repeatedly. Logs show every action to the email servers from the + database. + + Live logs are located in the :file:`~/logs/` folder (accessed by the command line or on the + Odoo.sh dashboard). Log files are created everyday at 5:00 AM (UTC). + + .. tip:: + The two most recent files, for the current day and the previous one, are named + :file:`odoo.log` and :file:`odoo.log.1`. + + Log files for older dates are named using their dates and are compressed. Use the commands + :command:`grep` and :command:`zgrep` (for the compressed ones) to search through the files. + + .. seealso:: + For more information on logs and how to access them via the Odoo.sh dashboard, refer to the + :ref:`Odoo.sh logs documentation `. + + For more information on accessing logs via the command line, refer to the :ref:`developer + logging documentation `. +``` + +(email-issues-support)= + +## Information for Odoo Support + +Here is a list of helpful information to include when reaching out to [Odoo Support](https://www.odoo.com/help): + +1. An export of the full email from the inbox. These are usually in `.eml` or `.msg` file formats + containing technical information required for an investigation. The exact process to download the + file depends on your third-party email provider. + + :::{seealso} + - [Gmail Help Center: Trace an email with its full header](https://support.google.com/mail/answer/29436) + - [Microsoft Support: View internet message headers in Outlook](https://support.microsoft.com/en-us/office/view-internet-message-headers-in-outlook-cd039382-dc6e-4264-ac74-c048563d212c#tab=Web) + ::: + + When using a local email software (e.g., Thunderbird, Apple Mail, Outlook, etc.) to synchronize + emails, it is usually possible to export the local copies of emails as EML/MSG files. Refer to + the documentation of the software used for more information. + + :::{tip} + If possible, the EML/MSG file should be based on the original email that was sent and is + failing or is causing issues. + + For **incoming emails**: if possible contact the original email sender and request an EML/MSG + copy of the original email. Sending a copy of the original email (forwarded) only contains + partial information related to the troubleshooting. + + For **outgoing emails**: either provide the EML/MSG of the email or specify what record in the + database is affected (e.g., sales order number, contact name, invoice number) and the + date/time when the email was sent (e.g., email sent on the 10th January 2024 11:45 AM Central + European Time). + ::: + +2. An explanation of the exact flow that is being followed to normally receive those emails in Odoo. + Try to answer the following questions: + + - Is this a notification message from a reply being received in Odoo? + - Is this a message being sent from the Odoo database? + - Is there an incoming email server being used, or is the email being redirected/forwarded + through a custom email server or provider? + - Is there an example of an email that has been correctly forwarded? + - Have you changed any email-related settings recently? Did it stop working after those changes? + +3. An answer to the following questions: + + - Is it a generic issue or is it specific to a use case? If specific to a use case, which one? + - Is it working as expected? In case the email is sent using Odoo, the bounce email should reach + the Odoo database and display the {ref}`red envelope `. + diff --git a/content/applications/general/email_communication/google_oauth.md b/content/applications/general/email_communication/google_oauth.md new file mode 100644 index 000000000..b33cd5898 --- /dev/null +++ b/content/applications/general/email_communication/google_oauth.md @@ -0,0 +1,214 @@ +# Connect Gmail to Odoo using Google OAuth + +Odoo is compatible with Google's OAuth for Gmail. In order to send secure emails from a custom +domain, all that is required is to configure a few settings on Google's *Workspace* platform, as +well as on the back end of the Odoo database. This configuration works by using either a personal +email address or an address created by a custom domain. + +:::{tip} +For more information, visit [Google's documentation](https://support.google.com/cloud/answer/6158849) on setting up OAuth. +::: + +:::{seealso} +- {doc}`/applications/general/users/google` +- {doc}`/applications/productivity/calendar/google` +::: + +## Setup in Google + +### Create a new project + +To get started, go to the [Google API Console](https://console.developers.google.com). Log in +with your *Google Workspace* account if you have one, otherwise log in with your personal Gmail +account (this should match the email address you want to configure in Odoo). + +After that, click on {guilabel}`Create Project`, located on the far right of the {guilabel}`OAuth +consent screen`. If a project has already been created in this account, then the {guilabel}`New +Project` option will be located on the top right under the {guilabel}`Select a project` drop-down +menu. + +On the {menuselection}`New Project` screen, rename the {guilabel}`Project name` to `Odoo` and +browse for the {guilabel}`Location`. Set the {guilabel}`Location` as the *Google Workspace +organization*. If you are using a personal Gmail account, then leave the {guilabel}`Location` as +{guilabel}`No Organization`. + +```{image} google_oauth/new-project.png +:align: center +:alt: Project Name and Location for Google OAuth. +``` + +Click on {guilabel}`Create` to finish this step. + +### OAuth consent screen + +If the page doesn't redirect to the {menuselection}`User Type` options, click on {guilabel}`OAuth +consent screen` in the left menu. + +Under {guilabel}`User Type` options, select the appropriate {guilabel}`User Type`, and then click on +{guilabel}`Create` again, which will finally navigate to the {menuselection}`Edit app registration` +page. + +:::{warning} +*Personal* Gmail Accounts are only allowed to be **External** User Type, which means Google may +require an approval, or for *Scopes* to be added on. However, using a *Google WorkSpace* account +allows for **Internal** User Type to be used. + +Note, as well, that while the API connection is in the *External* testing mode, then no approval is +necessary from Google. User limits in this testing mode is set to 100 users. +::: + +### Edit app registration + +Next we will configure the app registration of the project. + +On the {guilabel}`OAuth consent screen` step, under the {guilabel}`App information` section, enter +`Odoo` in the {guilabel}`App name` field. Select the organization's email address under the +{guilabel}`User support` email field. + +Next, under {menuselection}`App Domain --> Authorized domains`, click on {guilabel}`Add Domain` and +enter `odoo.com`. + +After that, under the {guilabel}`Developer contact information` section, enter the organization's +email address. Google uses this email address to notify the organization about any changes to your +project. + +Next, click on the {guilabel}`Save and Continue` button. Then, skip the {menuselection}`Scopes` page +by scrolling to the bottom and clicking on {guilabel}`Save and Continue`. + +If continuing in testing mode (External), add the email addresses being configured under the +{guilabel}`Test users` step, by clicking on {guilabel}`Add Users`, and then the {guilabel}`Save and +Continue` button. A summary of the app registration appears. + +Finally, scroll to the bottom and click on {guilabel}`Back to Dashboard` to finish setting up the +project. + +### Create Credentials + +Now that the project is set up, credentials should be created, which includes the *Client ID* and +*Client Secret*. First, click on {guilabel}`Credentials` in the left sidebar menu. + +Then, click on {guilabel}`Create Credentials` in the top menu and select {guilabel}`OAuth client ID` +from the dropdown menu. + +- Under {guilabel}`Application Type`, select {guilabel}`Web Application` from the dropdown menu. +- In the {guilabel}`Name` field, enter `Odoo`. +- Under the {guilabel}`Authorized redirect URIs` label, click the button {guilabel}`ADD URI`, and + then input `https://yourdbname.odoo.com/google_gmail/confirm` in the {guilabel}`URIs 1` field. + Be sure to replace the *yourdbname* part of the URL with the actual Odoo database name. +- Next, click on {guilabel}`Create` to generate an OAuth {guilabel}`Client ID` and {guilabel}`Client + Secret`. Finally, copy each generated value for later use when configuring in Odoo, and then + navigate to the Odoo database. + +```{image} google_oauth/client-credentials.png +:align: center +:alt: Client ID and Client Secret for Google OAuth. +``` + +## Setup in Odoo + +### Enter Google Credentials + +First, open Odoo and navigate to the {guilabel}`Apps` module. Then, remove the {guilabel}`Apps` +filter from the search bar and type in `Google`. Install the module called {guilabel}`Google +Gmail`. + +Next, navigate to {menuselection}`Settings --> General Settings`, and under the {guilabel}`Discuss` +section, ensure that the checkbox for {guilabel}`Custom Email Servers` or {guilabel}`External Email +Servers` is checked. This populates a new option for {guilabel}`Gmail Credentials` or {guilabel}`Use +a Gmail Sever`. Then, copy and paste the respective values into the {guilabel}`Client ID` and +{guilabel}`Client Secret` fields and {guilabel}`Save` the settings. + +### Configure outgoing email server + +To configure the external Gmail account, return to the top of the {guilabel}`Custom Email Servers` +setting and then click the {guilabel}`Outgoing Email Servers` link. + +```{image} google_oauth/outgoing-servers.png +:align: center +:alt: Configure Outgoing Email Servers in Odoo. +``` + +Then, click on {guilabel}`New` or {guilabel}`Create` to create a new email server, and fill in the +{guilabel}`Name`, {guilabel}`Description`, and the email {guilabel}`Username` (if required). + +Next, click on {guilabel}`Gmail OAuth Authentication` or {guilabel}`Gmail` (under the +{guilabel}`Authenticate with` or {guilabel}`Connection` section). Finally, click on +{guilabel}`Connect your Gmail Account`. + +A new window labeled {guilabel}`Google` opens to complete the authorization process. Select the +appropriate email address that is being configured in Odoo. + +If the email address is a personal account, then an extra step pops up, so click +{guilabel}`Continue` to allow the verification and connect the Gmail account to Odoo. + +Then, allow Odoo to access the Google account by clicking on {guilabel}`Continue` or +{guilabel}`Allow`. After that, the page navigates back to the newly configured outgoing email +server in Odoo. The configuration automatically loads the token in Odoo, and a tag stating +{guilabel}`Gmail Token Valid` appears in green. + +```{image} google_oauth/green-token.png +:align: center +:alt: Configure Outgoing Email Servers in Odoo. +``` + +Finally, {guilabel}`Test the Connection`. A confirmation message should appear. The Odoo database +can now send safe, secure emails through Google using OAuth authentication. + +## Google OAuth FAQ + +### Production VS Testing Publishing Status + +Choosing {guilabel}`Production` as the {guilabel}`Publishing Status` (instead of +{guilabel}`Testing`) will display the following warning message: + +```{image} google_oauth/published-status.png +:align: center +:alt: OAuth is Limited to 100 Sensitive Scope Logins. +``` + +To correct this warning, navigate to the [Google API Platform](https://console.cloud.google.com/apis/credentials/consent). If the {guilabel}`Publishing status` +is {guilabel}`In Production`, click {guilabel}`Back to Testing` to correct the issue. + +### No Test Users Added + +If no test users are added to the OAuth consent screen, then a 403 access denied error will +populate. + +```{image} google_oauth/403-error.png +:align: center +:alt: 403 Access Denied Error. +``` + +To correct this error, return to the {guilabel}`OAuth consent screen` under {guilabel}`APIs & +Services` and add test user(s) to the app. Add the email that you are configuring in Odoo. + +### Gmail Module not updated + +If the *Google Gmail* module in Odoo has not been updated to the latest version, then a +{guilabel}`Forbidden` error message populates. + +```{image} google_oauth/forbidden-error.png +:align: center +:alt: Forbidden you don't have the permission to access the requested resource. +``` + +To correct this error, go to the {menuselection}`Apps` module and clear out the search terms. Then, +search for `Gmail` or `Google` and upgrade the {guilabel}`Google Gmail` module. Finally, click +on the three dots on the upper right of the module and select {guilabel}`Upgrade`. + +### Application Type + +When creating the credentials (OAuth *Client ID* and *Client Secret*), if {guilabel}`Desktop App` is +selected for the {guilabel}`Application Type`, an {guilabel}`Authorization Error` appears. + +```{image} google_oauth/error-400.png +:align: center +:alt: Error 400 Redirect URI Mismatch. +``` + +To correct this error, delete the credentials already created and create new credentials, selecting +{guilabel}`Web Application` for the {guilabel}`Application Type`. Then, under {guilabel}`Authorized +redirect URIs`, click {guilabel}`ADD URI` and type: +`https://yourdbname.odoo.com/google_gmail/confirm` in the field, being sure to replace *yourdbname* +in the URL with the Odoo database name. + diff --git a/content/applications/general/email_communication/mailjet_api.md b/content/applications/general/email_communication/mailjet_api.md new file mode 100644 index 000000000..e625a6367 --- /dev/null +++ b/content/applications/general/email_communication/mailjet_api.md @@ -0,0 +1,190 @@ +# Mailjet API + +Odoo is compatible with Mailjet's {abbr}`API (Application Programming Interface)` for mass mailing. +Set up a dedicated mass mailing server through Mailjet by configuring settings in the Mailjet +account and the Odoo database. In some circumstances, settings need to be configured on the custom +domain's {abbr}`DNS (Domain Name System)` settings as well. + +## Set up in Mailjet + +### Create API credentials + +To get started, sign in to the [Mailjet Account Information](https://app.mailjet.com/account) +page. Next, navigate to the {guilabel}`Senders & Domains` section and click on {guilabel}`SMTP and +SEND API Settings`. + +```{image} mailjet_api/api-settings.png +:alt: SMTP and Send API Settings link in the Senders & Domains section of Mailjet. +``` + +Then, copy the {abbr}`SMTP (Simple Mail Transfer Protocol)` configuration settings onto a notepad. +They can be found under the {guilabel}`Configuration (SMTP only)` section. The {abbr}`SMTP (Simple +Mail Transfer Protocol)` configuration settings include the server address, the security option +needed (Use {abbr}`SSL (Secure Sockets Layer)`/{abbr}`TLS (Transport Layer Security)`), and the +port number. The settings are needed to configure Mailjet in Odoo, which is covered in the +{ref}`last section `. + +:::{seealso} +[Mailjet: How can I configure my SMTP parameters?](https://documentation.mailjet.com/hc/articles/360043229473) +::: + +:::{important} +Odoo {ref}`blocks port 25 ` on Odoo Online and Odoo.sh +databases. +::: + +```{image} mailjet_api/smtp-config.png +:alt: SMTP configuration from Mailjet. +``` + +Next, click on the button labeled {guilabel}`Retrieve your API credentials` to retrieve the Mailjet +API credentials. + +Then, click on the eye icon to reveal the {guilabel}`API key`. Copy this key to a notepad, as this +serves as the {guilabel}`Username` in the Odoo configuration. Next, click on the +{guilabel}`Generate Secret Key` button to generate the {guilabel}`Secret Key`. Copy this key to a +notepad, as this serves as the {guilabel}`Password` in the Odoo configuration. + +### Add verified sender address(es) + +The next step is to add a sender address or a domain to the Mailjet account settings so that the +email address or domain is approved to send emails using Mailjet's servers. First, navigate to the +[Mailjet Account Information](https://app.mailjet.com/account) page. Next, click on the +{guilabel}`Add a Sender Domain or Address` link under the {guilabel}`Senders & Domains` section. + +```{image} mailjet_api/add-domain-email.png +:alt: Add a sender domain or address in the Mailjet interface. +``` + +Determine if a sender's email address or the entire domain needs to be added to the Mailjet +settings. It may be easier to configure the domain as a whole if {abbr}`DNS (Domain Name System)` +access is available. Jump to the {ref}`Add a domain ` section for +steps on adding the domain. + +:::{note} +Either all email addresses of the Odoo database users who are sending emails using Mailjet's +servers need to be configured or the domain(s) of the users' email addresses can be configured. +::: + +By default, the email address originally set up in the Mailjet account is added as a trusted +sender. To add another email address, click on the button labeled {guilabel}`Add a sender address`. +Then, add the email address that is configured to send from the custom domain. + +At minimum the following email addresses should be set up in the provider and verified in Mailjet: + +- notifications@yourdomain.com +- bounce@yourdomain.com +- catchall@yourdomain.com + +:::{note} +Replace `yourdomain` with the custom domain for the Odoo database. If there isn't one, then use +the {guilabel}`mail.catchall.domain` system parameter. +::: + +After that, fill out the {guilabel}`Email Information` form, making sure to select the appropriate +email type: transactional email or mass emails. After completing the form, an activation email is +sent to the email address and the trusted sender can be activated. + +It is recommended to set up the {abbr}`SPF (Sender Policy Framework)`/{abbr}`DKIM (DomainKeys +Identified Mail)`/{abbr}`DMARC (Domain-based Message Authentication, Reporting, and +Conformance)` settings on the domain of the sender. + +:::{seealso} +[Mailjet's SPF/DKIM/DMARC documentation](https://documentation.mailjet.com/hc/articles/360042412734-Authenticating-Domains-with-SPF-DKIM) +::: + +:::{important} +If the database is not using a custom domain, then in order to verify the sender's address, a +temporary alias (of the three email addresses mentioned above) should be set up in Odoo CRM to +create a lead. Then, the database is able to receive the verification email and verify the +accounts. +::: + +(maintain-mailjet-api-add-domain)= + +### Add a domain + +By adding an entire domain to the Mailjet account, all the sender addresses related to that domain +are automatically validated for sending emails using Mailjet servers. First, navigate to the +[Mailjet Account Information](https://app.mailjet.com/account) page. Next, click on +{guilabel}`Add a Sender Domain or Address` link under the {guilabel}`Senders & Domains` section. +Then, click on {guilabel}`Add domain` to add the custom domain. + +:::{note} +The domain needs to be added to the Mailjet account and then validated through the {abbr}`DNS +(Domain Name System)`. +::: + +After that, fill out the {guilabel}`Add a new Domain` page on Mailjet and click +{guilabel}`Continue`. + +After adding the domain, a validation page will populate. Unless the Odoo database is on-premise +(in which case, choose {guilabel}`Option 1`), choose {guilabel}`Option 2: Create a DNS Record`. +Copy the TXT record information to a notepad and then navigate to the domain's {abbr}`DNS (Domain +Name System)` provider to complete validation. + +```{image} mailjet_api/host-value-dns.png +:alt: The TXT record information to input on the domain's DNS. +``` + +#### Setup in the domain's DNS + +After getting the TXT record information from the Mailjet account, add a TXT record to the domain's +{abbr}`DNS (Domain Name System)`. This process varies depending on the {abbr}`DNS (Domain Name +System)` provider. Consult the provider for specific configuration processes. The TXT record +information consists of the {guilabel}`Host` and {guilabel}`Value`. Paste these into +the corresponding fields in the TXT record. + +#### Return to Mailjet account information + +After adding the TXT record to the domain's {abbr}`DNS (Domain Name System)`, navigate back to the +Mailjet account. Then, navigate to {menuselection}`Account Information --> Add a Sender Domain or +Address`, click the gear icon next to {guilabel}`Domain`, and select {guilabel}`Validate`. + +This action can also be done by going to the [Sender domains & addresses](https://app.mailjet.com/account/sender) page on the Mailjet account information and clicking on {guilabel}`Manage`. + +Next, click {guilabel}`Check Now` to validate the TXT record that was added on the domain. A +success screen will appear if the domain is configured correctly. + +```{image} mailjet_api/check-dns.png +:alt: Check DNS record in Mailjet. +``` + +After successfully setting up the domain, there is an option to {guilabel}`Authenticate this domain +(SPF/DKIM)`. This button populates {abbr}`SPF (Sender Policy Framework)` & {abbr}`DKIM (DomainKeys +Identified Mail) records to input into the :abbr:`DNS (Domain Name System)` provider. + +:::{seealso} +[Mailjet's SPF/DKIM/DMARC documentation](https://documentation.mailjet.com/hc/articles/360042412734-Authenticating-Domains-with-SPF-DKIM) +::: + +```{image} mailjet_api/authenticate.png +:alt: Authenticate the domain with SPF/DKIM records in Mailjet. +``` + +(maintain-mailjet-api-odoo-setup)= + +## Set up in Odoo + +To complete the setup, navigate to the Odoo database and go to the {guilabel}`Settings`. With +{ref}`developer-mode` turned on, go to the {menuselection}`Technical Menu --> Email --> Outgoing +Mail Servers`. Then, create a new outgoing server configuration by clicking on the +{guilabel}`Create` button. + +Next, input the `SMTP server` (in-v3.mailjet.com), `port number` (587 or 465), and `Security +(SSL/TLS)` that was copied earlier from the Mailjet account. They can also be found [here](https://app.mailjet.com/account/setup). It is recommended to use {abbr}`SSL (Secure Sockets +Layer)`/{abbr}`TLS (Transport Layer Security)` even though Mailjet may not require it. + +For the {guilabel}`Username`, input the {guilabel}`API KEY`. For the {guilabel}`Password`, input +the {guilabel}`SECRET KEY` that was copied from the Mailjet account to the notepad earlier. These +settings can be found on {menuselection}`Mailjet --> Account Settings --> SMTP and SEND API +Settings`. + +Then, if the Mailjet server is used for mass emailing, set the {guilabel}`Priority` value higher +than that of any transactional email server(s). Finally, save the settings and {guilabel}`Test the +Connection`. + +```{image} mailjet_api/server-settings.png +:alt: Odoo outgoing email server settings. +``` + diff --git a/content/applications/general/integrations.md b/content/applications/general/integrations.md new file mode 100644 index 000000000..e277a8e9a --- /dev/null +++ b/content/applications/general/integrations.md @@ -0,0 +1,10 @@ +# Integrations + +```{toctree} +integrations/mail_plugins +integrations/unsplash +integrations/geolocation +integrations/google_translate +integrations/barcodelookup +``` + diff --git a/content/applications/general/integrations/barcodelookup.md b/content/applications/general/integrations/barcodelookup.md new file mode 100644 index 000000000..a6044e24d --- /dev/null +++ b/content/applications/general/integrations/barcodelookup.md @@ -0,0 +1,40 @@ +--- +show-content: true +--- + +# Barcode Lookup + +[Barcode Lookup](https://www.barcodelookup.com/) allows you to scan (or enter) products' barcodes +({abbr}`UPC (Universal Product Code)`, {abbr}`EAN (European Article Number)`, or {abbr}`ISBN +(International Standard Book Number)`) to automatically create them in your Odoo database, complete +with product names, descriptions, images, categories, etc. + +(barcodelookup-configuration)= + +## Configuration + +If your database is hosted on **Odoo Online**, you can use Barcode Lookup without configuration. + +If your database is hosted on **Odoo.sh** or **on-premise**, proceed as follows: + +1. Visit the [Barcode Lookup website](https://www.barcodelookup.com/api) and click + {guilabel}`Sign Up for the API`. +2. Choose the appropriate plan based on the number of barcodes you need to scan. +3. Fill in the required details and complete the registration process. +4. Copy the API key. +5. In Odoo, open the Settings app, scroll down to the {guilabel}`Integrations` section, and, under + {guilabel}`Barcode Database`, paste the Barcode Lookup {guilabel}`API Key`. + +## Use + +To fill in product information using Barcode Lookup, create a new product and fill in the +{guilabel}`Barcode` field. The product's details are then automatically imported from Barcode +Lookup, updating the following fields: {guilabel}`Name`, {guilabel}`Price`, {guilabel}`Description`, +{guilabel}`Tax`, {guilabel}`Image`, {guilabel}`Weight`, {guilabel}`Attributes`, {guilabel}`Product +category`, and {guilabel}`Volume`. You can then modify any field(s) as needed. + +:::{seealso} +{ref}`Create new products during internal transfers using the Barcode Lookup database +`. +::: + diff --git a/content/applications/general/integrations/geolocation.md b/content/applications/general/integrations/geolocation.md new file mode 100644 index 000000000..dd2210101 --- /dev/null +++ b/content/applications/general/integrations/geolocation.md @@ -0,0 +1,41 @@ +# Geolocation + +You can locate contacts or places and generate routes on a map in Odoo. + +```{image} geolocation/contacts.png +:alt: Map displaying a contact's location. +``` + +To use the feature, open the {guilabel}`Settings` app, and, under the {guilabel}`Integrations`, +section, activate {guilabel}`Geo Localization`. Then, choose between using the OpenStreetMap or +Google Places API. + +**OpenStreetMap** + +OpenStreetMap is a free, open geographic database updated and maintained by volunteers. To use it, +select {guilabel}`Open Street Map`. + +> :::{important} +> OpenStreetMap might not always be accurate. You can [join the OpenStreetMap community](https://www.openstreetmap.org/fixthemap) to fix any issues encountered. +> ::: + +**Google Places API map** + +The Google Places API map provides detailed info on places, businesses, and points of interest. It +supports location-based features like search, navigation, and recommendations. + +:::{important} +Using the Google Places API could require [payment to Google](https://mapsplatform.google.com/pricing/). +::: + +To use it, select {guilabel}`Google Place Map` and enter your {ref}`API Key +`. + +```{image} geolocation/google-places-api-key.png +:alt: Google Places API key +``` + +:::{seealso} +{doc}`/applications/websites/website/configuration/address_autocomplete` +::: + diff --git a/content/applications/general/integrations/google_translate.md b/content/applications/general/integrations/google_translate.md new file mode 100644 index 000000000..15f4e25e7 --- /dev/null +++ b/content/applications/general/integrations/google_translate.md @@ -0,0 +1,125 @@ +# Google Translate + +*Google Translate* can be used to translate user generated text in the Odoo chatter. + +## Google API console + +A majority of the setup for integrating *Google Translate* into Odoo is done with the *Google API +console*. Once the following processes are complete, an *API key* is created to input in Odoo. + +:::{seealso} +[Google Translate setup on Google](https://cloud.google.com/translate/docs/setup) +::: + +### Create a new project + +To get started, go to the [Google API Console](https://console.developers.google.com). Then, log +in with a *Google Workspace* account, if there is one. If not, log in with a personal Gmail account +(this should match the email address that has billing attached to it). + +Next, click {guilabel}`Create Project` on the far-right of the {guilabel}`OAuth consent screen`. + +:::{tip} +If the *Google API Console* has existing projects, click the drop-down menu next to the +{guilabel}`Google Cloud` icon, and a pop-over window appears. Next, click {guilabel}`New Project` +top-right of the pop-over window. +::: + +On the {guilabel}`New Project` screen, rename the {guilabel}`Project name` to `Odoo Translate`, and +browse for the {guilabel}`Location`. Set the {guilabel}`Location` as the *Google Workspace +organization*. If a personal Gmail account is being used, leave the {guilabel}`Location` as +{guilabel}`No Organization`. + +```{image} google_translate/new-project.png +:align: center +:alt: Project Name and Location for Google OAuth. +``` + +Click on {guilabel}`Create` to finish this step. + +### API library + +Next, the *Cloud Translation API* needs to be installed on this newly-created project. To do that, +click {menuselection}`Library` in the left menu. Then, search the term `Cloud Translation API`, and +click into the result. This should be a *Google Enterprise API* labeled {guilabel}`Cloud Translation +API`. + +Click {guilabel}`Enable` to install the library on this project. + +:::{important} +Using the *Google Translate* API **requires** a current billing account with [Google](https://myaccount.google.com/). +::: + +Once a billing account is setup with *Google* and the library is enabled, click {guilabel}`Manage` +to finish configuration on the API. + +### Create credentials + +Now that the project is set up, and the *Cloud Translation API* is enabled, credentials **must** be +created. This includes the *API key*. + +To begin this process, click {menuselection}`Credentials` in the left sidebar menu. + +Then, click {guilabel}`Create Credentials` in the top menu, and select {guilabel}`API key` from the +drop-down menu. + +```{image} google_translate/api-key.png +:align: center +:alt: Create an API key in the Google API console. +``` + +Copy the {guilabel}`API key` for use in the next section. + +:::{important} +For security purposes, the usage of the *API key* can be restricted. + +To do that, go to the *API restrictions* by clicking on {guilabel}`Edit API key` in the pop-over +window, or by clicking on the listed API key on the {guilabel}`Credentials` page. From here, key +restrictions can be set. This includes setting an application to restrict the use of the API key, +and whether this API key can call any API. + +It is recommended that the Odoo *Translate API* be restricted to **only** allow requests from the +configured Odoo database and to the *Cloud Translation API*. + +To add the website restriction, click {guilabel}`Websites`, under the {guilabel}`Set an +application restriction`. Then, enter the address of the database *Google Translate* is being +used in, by clicking on {guilabel}`Add`. Lastly, add the {abbr}`URL (Uniform Resource Locator)`, +and click {guilabel}`Done`. + +To restrict use of the key to a selected API, first, select {guilabel}`Restrict key`, under the +{guilabel}`API restrictions` section. Then use the drop-down menu to choose the API being +configured (*Cloud Translation API*). +::: + +:::{tip} +- Save the API key: copy the API key and store it somewhere secure. +- Do **not** share the API key publicly or expose it in client-side code. +::: + +## Odoo configuration + +To access the integration in Odoo, navigate to the {menuselection}`Settings app --> Discuss +section`. Enter the API key into the field labeled {guilabel}`Message Translation`. Then, +{guilabel}`Save` the settings, and *Google Translate* can be used in any chatter throughout the +database. + +```{image} google_translate/odoo-config.png +:align: center +:alt: Odoo configuration of the API key from the *Google API Console*. +``` + +## Translate chatter + +To translate a user's text from another language, click the {guilabel}`... (three dot)` icon menu to +the right of the chatter. Then, select {guilabel}`Translate`. The content translates to the +*language* set on the user's preferences. + +```{image} google_translate/google-translate.png +:align: center +:alt: Google Translate present in an Odoo database's chatter. +``` + +:::{seealso} +{ref}`language/install` +::: + diff --git a/content/applications/general/integrations/mail_plugins.md b/content/applications/general/integrations/mail_plugins.md new file mode 100644 index 000000000..45c3422d5 --- /dev/null +++ b/content/applications/general/integrations/mail_plugins.md @@ -0,0 +1,58 @@ +--- +show-content: true +--- + +# Mail Plugins + +```{toctree} +:titlesonly: true + +mail_plugins/outlook +mail_plugins/gmail +``` + +Mail Plugins are connectors that bridge your mailbox with your Odoo database. With them, you can +interact with your Odoo database directly from your mailbox by: + +- Creating leads and centralizing prospects' emails into the CRM app. +- Generating tasks in any Odoo project. +- Creating tickets in the Helpdesk app. +- Searching and storing insights on your contacts. + +Mail Plugins are available for {doc}`Outlook ` and {doc}`Gmail +`. + +(mail-plugins-pricing)= + +## Pricing + +Mail Plugins are **free** to install and use. + +However, they can provide **Lead Enrichment**, which is part of a paid service known as **Lead +Generation**. + +Mail plugins allow you to test Lead Enrichment for free, whether you connect the plugins to a +database or not. After a while, the plugins ask you to buy {doc}`../../essentials/in_app_purchase` +credits if you would like to keep using this service. + +(mail-plugins-lead-generation)= + +### Lead Generation IAP service + +Lead Enrichment uses the *Lead Generation IAP service*. Each request consumes one *Lead Generation +credit*. + +To buy credits, go to {menuselection}`Settings --> CRM --> Lead Enrichment --> Buy credits` and +select a package. + +:::{note} +- If you are out of credits, the only information populated when clicking on the suggested + company is its website link and logo. +- Check out the [Lead Generation IAP service Privacy Policy](https://iap.odoo.com/privacy#header_3). +::: + +:::{seealso} +- {doc}`../../essentials/in_app_purchase` +- [Odoo Tutorials: Lead Enrichment](https://www.odoo.com/r/p73) +::: + diff --git a/content/applications/general/integrations/mail_plugins/gmail.md b/content/applications/general/integrations/mail_plugins/gmail.md new file mode 100644 index 000000000..6080e7451 --- /dev/null +++ b/content/applications/general/integrations/mail_plugins/gmail.md @@ -0,0 +1,166 @@ +# Gmail Plugin + +The *Gmail Plugin* integrates an Odoo database with a Gmail inbox, so users can keep track of all +their work between Gmail and Odoo, without losing any information. + +## Odoo Online users + +For databases hosted on Odoo Online (or Odoo.sh), follow the steps below to configure the Gmail +Plugin. + +### Install the Gmail Plugin + +First, log in to the Gmail account that the user wishes to connect to Odoo. + +From the Gmail inbox, click the plus sign icon on the right side panel to get add-ons. If the side +panel is not visible, click on the arrow icon at the bottom right corner of the inbox to reveal it. + +```{image} gmail/gmail-side-panel.png +:align: center +:alt: Plus sign icon on the Gmail inbox side panel. +``` + +Then, use the search bar to search for `Odoo` and locate the {guilabel}`Odoo Inbox Addin`. + +```{image} gmail/google-workspace-marketplace.png +:align: center +:alt: Odoo Inbox Addin on Google Workspace Marketplace. +``` + +Or, go directly to the {guilabel}`Odoo Inbox Addin` page on the [Google Workspace Marketplace](https://workspace.google.com/marketplace/app/odoo_inbox_addin/873497133275). + +Once the plugin is located, click {guilabel}`Install`. Then, click {guilabel}`Continue` to start +the installation. + +Next, select which Gmail account the user wishes to connect to Odoo. Then click {guilabel}`Allow` +to let Odoo access the Google account. Google will then show a pop-up window confirming that the +installation was successful. + +### Configure the Odoo database + +The {guilabel}`Mail Plugin` feature must be enabled in the Odoo database in order to use the Gmail +Plugin. To enable the feature, go to {menuselection}`Settings --> General Settings`. Under the +{guilabel}`Integrations` section, activate {guilabel}`Mail Plugin`, and then click +{guilabel}`Save`. + +```{image} gmail/mail-plugin-setting.png +:align: center +:alt: The Mail Plugin feature in the Settings. +``` + +### Configure the Gmail inbox + +In the Gmail inbox, a purple Odoo icon is now visible on the right side panel. Click on the Odoo +icon to open up the Odoo plugin window. Then, click on any email in the inbox. Click +{guilabel}`Authorize Access` in the plugin window to grant Odoo access to the Gmail inbox. + +```{image} gmail/authorize-access.png +:align: center +:alt: The Authorize Access button in the right sidebar of the Odoo plugin panel. +``` + +Next, click {guilabel}`Login`. Then, enter the URL of the Odoo database that the user wishes to +connect to the Gmail inbox, and log in to the database. + +:::{note} +Use the general URL for the database, not the URL of a specific page in the database. For +example, use `https://mycompany.odoo.com`, not +`https://mycompany.odoo.com/web#cids=1&action=menu`. +::: + +Finally, click {guilabel}`Allow` to let Gmail access the Odoo database. The browser will then show +a {guilabel}`Success!` message. After that, close the window. The Gmail inbox and Odoo database are +now connected. + +## Odoo On-Premise users + +For databases hosted on servers other than Odoo Online (or Odoo.sh), follow the steps below to +configure the Gmail Plugin. + +:::{note} +As part of their security guidelines, Google requires add-on creators to provide a list of URLs +that can be used in actions and redirections launched by the add-on. This protects users by +ensuring, for example, that no add-on redirects users toward a malicious website. (Read more on +[Google Apps Script](https://developers.google.com/apps-script/manifest/allowlist-url).) + +Since Odoo can only list the `odoo.com` domain and not every on-premise customer's unique server +domain, on-premise customers cannot install the Gmail Plugin from the Google Workspace +Marketplace. +::: + +### Install the Gmail Plugin + +First, access the [GitHub repository](https://github.com/odoo/mail-client-extensions) for the +Odoo Mail Plugins. Next, click on the green {guilabel}`Code` button. Then, click +{guilabel}`Download ZIP` to download the Mail Plugin files onto the user's computer. + +```{image} gmail/gh-download-zip.png +:align: center +:alt: Download the ZIP file from the Odoo GitHub repository for Mail Plugins. +``` + +Open the ZIP file on the computer. Then, go to {menuselection}`mail-client-extensions-master --> +gmail --> src --> views`, and open the {file}`login.ts` file using any text editor software, +such as Notepad (Windows), TextEdit (Mac), or Visual Studio Code. + +Delete the following three lines of text from the {file}`login.ts` file: + +``` +if (!/^https:\/\/([^\/?]*\.)?odoo\.com(\/|$)/.test(validatedUrl)) { + return notify("The URL must be a subdomain of odoo.com"); +} +``` + +This removes the `odoo.com` domain constraint from the Gmail Plugin program. + +Next, in the ZIP file, go to {menuselection}`mail-client-extensions-master --> gmail`, and open the +file called {guilabel}`appsscript.json`. In the {guilabel}`urlFetchWhitelist` section, replace all +the references to `odoo.com` with the Odoo customer's unique server domain. + +Then, in the same {guilabel}`gmail` folder, open the file called {guilabel}`README.md`. Follow the +instructions in the {guilabel}`README.md` file to push the Gmail Plugin files as a Google Project. + +:::{note} +The computer must be able to run Linux commands in order to follow the instructions on the +{guilabel}`README.md` file. +::: + +After that, share the Google Project with the Gmail account that the user wishes to connect to Odoo. +Then, click {guilabel}`Publish` and {guilabel}`Deploy from manifest`. Lastly, click +{guilabel}`Install the add-on` to install the Gmail Plugin. + +### Configure the Odoo database + +The {guilabel}`Mail Plugin` feature must be enabled in the Odoo database in order to use the Gmail +Plugin. To enable the feature, go to {menuselection}`Settings --> General Settings`. Under the +{guilabel}`Integrations` section, activate {guilabel}`Mail Plugin`, and then click {guilabel}`Save`. + +```{image} gmail/mail-plugin-setting.png +:align: center +:alt: The Mail Plugin feature in the Settings. +``` + +### Configure the Gmail inbox + +In the Gmail inbox, a purple Odoo icon is now visible on the right side panel. Click on the Odoo +icon to open up the Odoo plugin window. Then, click on any email in the inbox. Click +{guilabel}`Authorize Access` in the plugin window to grant Odoo access to the Gmail inbox. + +```{image} gmail/authorize-access.png +:align: center +:alt: The Authorize Access button in the right sidebar of the Odoo plugin panel. +``` + +Next, click {guilabel}`Login`. Then, enter the URL of the Odoo database that the user wishes to +connect to the Gmail inbox, and log in to the database. + +:::{note} +Use the general URL for the database, not the URL of a specific page in the database. For +example, use `https://mycompany.odoo.com`, not +`https://mycompany.odoo.com/web#cids=1&action=menu`. +::: + +Finally, click {guilabel}`Allow` to let Gmail access the Odoo database. The browser will then show +a {guilabel}`Success!` message. After that, close the window. The Gmail inbox and Odoo database are +now connected. + diff --git a/content/applications/general/integrations/mail_plugins/outlook.md b/content/applications/general/integrations/mail_plugins/outlook.md new file mode 100644 index 000000000..b74797b5d --- /dev/null +++ b/content/applications/general/integrations/mail_plugins/outlook.md @@ -0,0 +1,162 @@ +# Outlook Plugin + +Outlook allows for third-party applications to connect in order to execute database actions from +emails. Odoo has a plugin for Outlook that allows for the creation of an opportunity from the email +panel. + +## Configuration + +The Outlook {doc}`Mail Plugin <../mail_plugins>` needs to be configured both on Odoo and Outlook. + +(mail-plugin-outlook-enable-mail-plugin)= + +### Enable Mail Plugin + +First, enable the *Mail Plugin* feature in the database. Go to {menuselection}`Settings --> General +Settings --> Integrations`, enable {guilabel}`Mail Plugin`, and {guilabel}`Save` the configuration. + +(mail-plugin-outlook-install-plugin)= + +### Install the Outlook Plugin + +Download ({menuselection}`Save Page As --> Web Page XML only`) the following XML file to upload +later: [https://download.odoocdn.com/plugins/outlook/manifest.xml](https://download.odoocdn.com/plugins/outlook/manifest.xml). + +Next, open the Outlook mailbox, and select any email. After completing this, click on the +{guilabel}`More actions` button in the upper right-side and select {guilabel}`Get Add-ins`. + +```{image} outlook/more-actions.png +:align: center +:alt: More actions button in Outlook +``` + +:::{tip} +For locally installed versions of Microsoft Outlook, access the {guilabel}`Get Add-ins` menu item +while in preview mode (**not** with a message open). First, click on the {guilabel}`... +(ellipsis)` icon in the upper right of the previewed message, then scroll down, and click on +{guilabel}`Get Add-ins`. +::: + +Following this step, select the {guilabel}`My add-ins` tab on the left-side. + +```{image} outlook/my-add-ins.png +:align: center +:alt: My add-ins in Outlook +``` + +Under {guilabel}`Custom add-ins` towards the bottom, click on {guilabel}`+ Add a custom add-in`, and +then on {guilabel}`Add from file...` + +```{image} outlook/custom-add-ins.png +:align: center +:alt: Custom add-ins in Outlook +``` + +For the next step, attach the `manifest.xml` file downloaded above, and press {guilabel}`OK`. Next, +read the warning and click on {guilabel}`Install`. + +```{image} outlook/add-in-warning.png +:align: center +:alt: Custom add-in installation warning in Outlook +``` + +(mail-plugin-outlook-connect-database)= + +### Connect the database + +Now, Outlook will be connected to the Odoo database. First, open any email in the Outlook mailbox, +click on the {guilabel}`More actions` button in the upper right-side, and select {guilabel}`Odoo for +Outlook`. + +```{image} outlook/odoo-for-outlook.png +:align: center +:alt: Odoo for Outlook add-in button +``` + +The right-side panel can now display **Company Insights**. At the bottom, click on +{guilabel}`Login`. + +```{image} outlook/panel-login.png +:align: center +:alt: Logging in the Odoo database +``` + +:::{note} +Only a limited amount of **Company Insights** (*Lead Enrichment*) requests are available as a +trial database. This feature requires {ref}`prepaid credits `. +::: + +:::{tip} +If, after a short while, the panel is still empty, it is possible that the browser cookie +settings prevented it from loading. Note that these settings also change if the browser is in +"Incognito" mode. + +To fix this issue, configure the browser to always allow cookies on Odoo's plugin page. + +For Google Chrome, change the browser cookie settings by following the guide at: +[https://support.google.com/chrome/answer/95647](https://support.google.com/chrome/answer/95647) +and adding `download.odoo.com` to the list of {guilabel}`Sites that can always use cookies`. + +Once this is complete, the Outlook panel needs to be opened again. +::: + +Now, enter the Odoo database URL and click on {guilabel}`Login`. + +```{image} outlook/enter-database-url.png +:align: center +:alt: Entering the Odoo database URL +``` + +Next, click on {guilabel}`Allow` to open the pop-up window. + +```{image} outlook/new-window-warning.png +:align: center +:alt: New window pop-up warning +``` + +If the user isn't logged into the database, enter the credentials. Click on {guilabel}`Allow` to let +the Outlook Plugin connect to the database. + +```{image} outlook/odoo-permission.png +:align: center +:alt: Allowing the Outlook Plugin to connect to a database +``` + +(mail-plugin-outlook-add-shortcut)= + +### Add a shortcut to the plugin + +By default, the Outlook Plugin can be opened from the *More actions* menu. However, to save time, +it's possible to add it next to the other default actions. + +In the Outlook mailbox, click on {guilabel}`Settings`, then on {guilabel}`View all Outlook +settings`. + +```{image} outlook/all-outlook-settings.png +:align: center +:alt: Viewing all Outlook settings +``` + +Now, select {guilabel}`Customize actions` under {guilabel}`Mail`, click on {guilabel}`Odoo for +Outlook`, and then {guilabel}`Save`. + +```{image} outlook/customize-actions.png +:align: center +:alt: Odoo for Outlook customized action +``` + +Following this step, open any email; the shortcut should be displayed. + +```{image} outlook/odoo-outlook-shortcut.png +:align: center +:alt: Odoo for Outlook customized action +``` + +### Using the plugin + +Now that the plug-in is installed and operational, all that needs to be done to create a lead is to +click on the `O` [Odoo icon] or navigate to {guilabel}`More actions` and click on {guilabel}`Odoo +for Outlook`. The side panel will appear on the right-side, and under {guilabel}`Opportunities` +click on {guilabel}`New`. A new window with the created opportunity in the Odoo database will +populate. + diff --git a/content/applications/general/integrations/unsplash.md b/content/applications/general/integrations/unsplash.md new file mode 100644 index 000000000..6f5465d25 --- /dev/null +++ b/content/applications/general/integrations/unsplash.md @@ -0,0 +1,25 @@ +# Unsplash + +**Unsplash** is a recognized stock photography library integrated with Odoo. + +If your database is hosted on **Odoo Online**, you can access Unsplash pictures without +configuration. + +If your database is hosted on **Odoo.sh or on-premise**, proceed as follows: + +1. To **generate an Unsplash access key**, create or sign in to an [Unsplash account](https://unsplash.com). +2. Access your [applications dashboard](https://unsplash.com/oauth/applications), click + {guilabel}`New Application`, select all checkboxes, and click {guilabel}`Accept terms`. +3. In the pop-up window, enter your {guilabel}`Application Name`, starting with the + prefix `Odoo:` (e.g., `Odoo: connection`), so Unsplash recognizes it as an Odoo instance. Then, + add a {guilabel}`Description` and click {guilabel}`Create application`. +4. On the application details page, scroll down to the {guilabel}`Keys` section and copy the + {guilabel}`Access Key` and {guilabel}`Application ID`. +5. In Odoo, go to {menuselection}`General Settings` and enable the {guilabel}`Unsplash Image + Library` feature. Then, enter the Unsplash {guilabel}`Access Key` and {guilabel}`Application ID`. + +:::{warning} +As a non-Odoo Online user, you are limited to a test key with a maximum of 50 Unsplash requests +per hour. +::: + diff --git a/content/applications/general/iot.md b/content/applications/general/iot.md new file mode 100644 index 000000000..403a890db --- /dev/null +++ b/content/applications/general/iot.md @@ -0,0 +1,92 @@ +--- +hide-page-toc: true +nosearch: true +show-content: true +--- + +# Internet of Things (IoT) + +Odoo Internet of Things (IoT) allows to connect physical devices such as barcode scanners, receipt +printers, payment terminals, measurement tools, etc. to an Odoo database using an IoT system. + +The following IoT systems are supported: + +- {doc}`IoT box `: micro-computer, plug-and-play device (i.e., the Odoo IoT program is + pre-installed); +- {doc}`Windows virtual IoT `: Odoo IoT program for Windows that can be installed + on a Windows computer. + +:::{note} +- {abbr}`MRP (Material Requirement Planning)` devices, including cameras and measurement tools, + are not compatible with Windows virtual IoT. +- Multiple IoT systems can be used at the same time. +- It is also possible to create a Windows Virtual Machine on a MacOS/Linux computer. However, + this option is not supported by Odoo, and no troubleshooting assistance will be provided. +::: + +(iot-iot-iot-subscription)= + +## IoT box subscription + +An IoT box subscription is required for production use of IoT systems. If you have issues related +to your subscription, contact the database's account manager or Odoo partner for assistance. + +:::{tip} +If the subscription is linked to an [Odoo.com](https://www.odoo.com) portal user, check the +information on the portal's subscription page. +::: + +:::{seealso} +- [Odoo's compatible IoT devices](https://www.odoo.com/app/iot-hardware) +- [Odoo Tutorials: Internet of Things (IoT) Tutorials](https://www.odoo.com/slides/internet-of-things-iot-175) +- [IoT system FAQ](https://www.odoo.com/app/iot-faq) +::: + +```{eval-rst} +.. cards:: + + .. card:: IoT box + :target: iot/iot_box + :large: + + Set up an IoT box. + + .. card:: Windows virtual IoT + :target: iot/windows_iot + :large: + + Set up Windows virtual IoT. + + .. card:: IoT system connection to Odoo + :target: iot/connect + + Connect the IoT system to your Odoo database and troubleshoot potential connection issues. + + .. card:: Devices + :target: iot/devices + + Connect devices such as printers, screens, measurement tools, etc., to the IoT system. + + .. card:: HTTPS certificate + :target: iot/iot_advanced/https_certificate_iot + + Verify your IoT system and database meet the eligibility requirements for HTTPS certificate + generation and address any related issues. + + .. card:: IoT system updates + :target: iot/iot_advanced/updating_iot + + Update your IoT system's image, core code, and handlers to benefit from the latest IoT fixes + and features or reset the IoT system if needed. +``` + +```{toctree} +:titlesonly: true + +iot/iot_box +iot/windows_iot +iot/connect +iot/iot_advanced +iot/devices +``` + diff --git a/content/applications/general/iot/connect.md b/content/applications/general/iot/connect.md new file mode 100644 index 000000000..bfedb0875 --- /dev/null +++ b/content/applications/general/iot/connect.md @@ -0,0 +1,145 @@ +# IoT system connection to Odoo + +## Prerequisites + +To connect the IoT system to an Odoo database, the following prerequisites must be met: + +- The Internet of Things (IoT) app must be {ref}`installed `. +- The IoT system must be connected to the network. +- The computer connecting to Odoo must be on the same network as the IoT system. + +:::{note} +It is recommended to connect the IoT system to a **production** instance, as other types of +environments may cause issues (e.g., with {ref}`HTTPS certificate generation +`). +::: + +:::{seealso} +- {doc}`iot_box` +- {doc}`windows_iot` +::: + +## Connection + +The IoT system can be connected to the Odoo database using a {ref}`pairing code +` or a {ref}`connection token `. + +(iot-connect-pairing-code)= + +### Connection using a pairing code + +:::{note} +- The pairing code is displayed for up to 5 minutes after the IoT system starts. If the code is + no longer visible, reboot the IoT box or {ref}`restart the Windows virtual IoT service + ` to display the pairing code again. Alternatively, connect the IoT + system to the database using a {ref}`connection token `. +- The pairing code is not displayed if the IoT system is already connected to a database (e.g., + a test database). +::: + +1. Retrieve the IoT's system pairing code: + + ```{eval-rst} + .. tabs:: + + .. group-tab:: IoT box + + Connect the IoT box to an external monitor or printer. If the IoT box was already plugged + prior to this, reboot it by unplugging it for a few seconds and replugging it. + + - External monitor: The pairing code should be displayed on the screen a few minutes after + rebooting the IoT box. + - Printer: The pairing code should be printed automatically. + + .. tip:: + If no external monitor or printer is connected to the IoT box, access the :ref:`IoT + box's homepage `; the code is displayed in the :guilabel:`Pairing + Code` section. + + .. group-tab:: Windows virtual IoT + + On the computer with the Windows virtual IoT installed, open the IoT system's homepage + in a web browser by navigating to the URL `http://localhost:8069`. Then, scroll to the + :guilabel:`Pairing Code` section. + ``` + +2. In Odoo, open the IoT app and click {guilabel}`Connect`. + +3. In the {guilabel}`Connect an IoT Box` popup that opens, enter the {guilabel}`Pairing code`. + +4. Click {guilabel}`Pair`. + +(iot-connect-token)= + +### Connection using a connection token + +1. In Odoo, open the IoT app and click {guilabel}`Connect`. +2. In the {guilabel}`Connect an IoT Box` popup that opens, copy the {guilabel}`Token`. +3. Access the {ref}`IoT box's ` or {ref}`Windows virtual IoT's + ` homepage. +4. In the {guilabel}`Odoo database connected` section, click {guilabel}`Configure`. +5. Paste the token into the {guilabel}`Server Token` field and click {guilabel}`Connect`. + +(iot-connect-iot-form)= + +## IoT system form + +Once the IoT system is connected to the Odoo database, it is displayed as a card in the IoT app. +Click the IP address on the card to access the {ref}`IoT box's ` or +{ref}`Windows virtual IoT's ` homepage. Click the card to access the +list of {doc}`devices ` connected to the IoT system. + +:::{tip} +{ref}`Enable the developer mode ` to access the IoT system's +{guilabel}`Technical Information`, such as its {guilabel}`Identifier`, {guilabel}`Domain +address`, and {guilabel}`Image version`. +::: + +:::{note} +By default, drivers are automatically {ref}`udpated ` every time the +IoT system is restarted. To disable automatic updates, uncheck the {guilabel}`Automatic drivers +update` option. +::: + +(iot-connect-troubleshooting)= + +## Troubleshooting + +### The pairing code does not appear or does not work + +The {ref}`pairing code ` might not be displayed or printed under the +following circumstances: + +- The IoT system is not connected to the Internet. +- The IoT system is already connected to an Odoo database. +- The {ref}`pairing code ` display time has expired. Reboot the IoT box + or {ref}`restart the Windows virtual IoT service ` to display the pairing + code again. +- The IoT system's image version is too old and needs to be {ref}`updated + `. + +### The IoT system is connected but does not appear in the database + +The IoT system might take a few minutes to restart when it connects to a database. If it still does +not appear after a few minutes: + +- Verify that the IoT system can reach the database and the server does not use a multi-database + environment. +- Reboot the IoT box or {ref}`restart the Windows virtual IoT service `. + +### The IoT box is connected to the Odoo database but cannot be reached + +Verify that the IoT system and the computer running the Odoo database are connected to the same +network. + +### The Windows virtual IoT's homepage cannot be accessed from another device + +Check the {ref}`iot/windows-iot/firewall`. + +### The IoT system is disconnected from the database after an Odoo upgrade + +{ref}`Update the IoT system's image ` by flashing the IoT box's card or +{ref}`uninstalling the Windows virtual IoT program ` and +{ref}`reinstalling ` the latest package for Windows **matching your +database's version**. + diff --git a/content/applications/general/iot/devices.md b/content/applications/general/iot/devices.md new file mode 100644 index 000000000..0f82c8170 --- /dev/null +++ b/content/applications/general/iot/devices.md @@ -0,0 +1,27 @@ +--- +nosearch: true +show-content: true +show-toc: true +--- + +# Devices + +:::{seealso} +- {doc}`Connect a Worldline payment terminal + <../../sales/point_of_sale/payment_methods/terminals/worldline>` +- {doc}`Connect an Ingenico payment terminal + <../../sales/point_of_sale/payment_methods/terminals/ingenico>` +::: + +```{toctree} +:glob: true +:titlesonly: true + +devices/screen +devices/measurement_tool +devices/camera +devices/footswitch +devices/printer +devices/scale +``` + diff --git a/content/applications/general/iot/devices/camera.md b/content/applications/general/iot/devices/camera.md new file mode 100644 index 000000000..3b5708891 --- /dev/null +++ b/content/applications/general/iot/devices/camera.md @@ -0,0 +1,87 @@ +# Connect a camera + +A camera can be connected to an {abbr}`IoT (Internet of Things)` box with an Odoo database in just a +few steps. Once a camera is connected to an {abbr}`IoT (Internet of Things)` box, it can be used in +a manufacturing process, or it can be linked to a quality control point/quality check. Doing so +allows for the taking of pictures when a chosen quality control point/check has been reached, or +when a specific key is pressed during manufacturing. + +## Connection + +To connect a camera to an {abbr}`IoT (Internet of Things)` box, simply connect the two via cable. +This is usually done with a {abbr}`USB (Universal Serial Bus)` cable of some sort. + +If the camera is [supported](https://www.odoo.com/page/iot-hardware), there is no need to set up +anything, as it'll be detected as soon as it's connected. + +```{image} camera/camera-dropdown.png +:align: center +:alt: Camera recognized on the IoT box. +``` + +## Link camera to quality control point in manufacturing process + +In the {menuselection}`Quality app`, a device can be set up on a {guilabel}`Quality Control Point`. +To do that, navigate to the {menuselection}`Quality app --> Quality Control --> Control Points` and +open the desired {guilabel}`Control Point` that'll be linked to the camera. + +On the control point form, edit the control point by selecting the {guilabel}`Type` field, and +clicking on {guilabel}`Take a Picture` from the drop-down menu. Doing so reveals a field called +{guilabel}`Device`, wherein the attached *device* can be selected. {guilabel}`Save` the changes, if +required. + +```{image} camera/control-point-device.png +:align: center +:alt: Setting up the device on the quality control point. +``` + +The camera is now useable with the selected quality control point. When the quality control point +is reached during the manufacturing process, the database prompts the operator to take a picture. + +```{image} camera/serial-number-picture.png +:align: center +:alt: Graphic user interface of the device on the quality control point. +``` + +:::{note} +Quality control points can also be accessed by navigating to {menuselection}`IoT App --> +Devices`. From here, select the device. There is a {guilabel}`Quality Control Points` tab, where +they can be added with the device. +::: + +:::{tip} +On a quality check form, the {guilabel}`Type` of check can also be specified to {guilabel}`Take a +Picture`. Navigate to {menuselection}`Quality app --> Quality Control --> Quality Checks --> New` +to create a new quality check from the {guilabel}`Quality Checks` page. +::: + +:::{seealso} +- {doc}`/applications/inventory_and_mrp/quality/quality_management/quality_control_points` +- {doc}`/applications/inventory_and_mrp/quality/quality_management/quality_alerts` +::: + +## Link camera to a work center in the Manufacturing app + +To link a camera to an action, it first needs to be configured on a work center. Navigate to +{menuselection}`Manufacturing app --> Configuration --> Work Centers`. Next, go to the desired +{guilabel}`Work Center` in which a camera will be used to reveal that specific work center's detail +form. From here, add the device in the {guilabel}`IoT Triggers` tab, in the {guilabel}`Device` +column, by clicking {guilabel}`Add a Line`. + +Now, the camera device can be linked to the {guilabel}`Action` column drop-down option labeled +{guilabel}`Take a Picture`. A key can also be added to trigger the action. + +:::{important} +The first trigger listed is chosen first. The order of triggers matters, and they can be dragged +into any desired order. +::: + +:::{note} +On the {guilabel}`Work Order` screen, a status graphic indicates whether the database is +correctly connected to the camera. +::: + +:::{seealso} +{ref}`workcenter_iot` +::: + diff --git a/content/applications/general/iot/devices/footswitch.md b/content/applications/general/iot/devices/footswitch.md new file mode 100644 index 000000000..fe769977d --- /dev/null +++ b/content/applications/general/iot/devices/footswitch.md @@ -0,0 +1,54 @@ +# Connect a footswitch + +When working in a manufacturing environment, it's always better for an operator to have both hands +available at all times. Odoo's {abbr}`IoT (Internet of Things)` box makes this possible when using a +footswitch. + +In fact, with a footswitch, the operator is able to go from one screen to another, and perform +actions using their foot. This can be configured in just a few steps on the work center in the +*Manufacturing* app. + +## Connection + +To connect a footswitch to the {abbr}`IoT (Internet of Things)` box, connect the two devices via +cable. More often than not, this is done with a {abbr}`USB (Universal Serial Bus)` cable. + +If the footswitch is a [supported device](https://www.odoo.com/page/iot-hardware), there is no +need to take further action, since it'll be automatically detected when connected. + +```{image} footswitch/footswitch-dropdown.png +:align: center +:alt: Footswitch recognized on the IoT box. +``` + +## Link a footswitch to a work center in the Odoo Manufacturing app + +To link a footswitch to an action, it first needs to be configured on a work center. Navigate to +{menuselection}`Manufacturing app --> Configuration --> Work Centers`. From here, go to the desired +{guilabel}`Work Center` in which the footswitch will be used, and add the device in the +{guilabel}`IoT Triggers` tab, under the {guilabel}`Device` column, by selecting {guilabel}`Add a +Line`. Doing so means the footswitch can be linked to an option in the {guilabel}`Action` column +drop-down, and optionally, a key can be added to trigger it. An example of an {guilabel}`Action` in +the *Manufacturing app* could be the {guilabel}`Validate` or {guilabel}`Mark as Done` buttons on a +manufacturing work order. + +```{image} footswitch/footswitch-example.png +:align: center +:alt: Footswitch trigger setup on the Odoo database. +``` + +:::{important} +It should be noted that the first listed trigger is chosen first. So, the order matters, and +these triggers can be dragged into any order. In the picture above, using the footswitch +automatically skips the part of the process that's currently being worked on. +::: + +:::{note} +On the {guilabel}`Work Order` screen, a status graphic indicates whether the database is +correctly connected to the footswitch. +::: + +:::{seealso} +{ref}`workcenter_iot` +::: + diff --git a/content/applications/general/iot/devices/measurement_tool.md b/content/applications/general/iot/devices/measurement_tool.md new file mode 100644 index 000000000..b2d648ffd --- /dev/null +++ b/content/applications/general/iot/devices/measurement_tool.md @@ -0,0 +1,94 @@ +# Connect a measurement tool + +(iot-devices-measurement-tool)= + +With Odoo's {abbr}`IoT (Internet of Things)` box, it is possible to connect measurement tools to the +Odoo database for use in the *Quality app* on a quality control point/quality check, or for use in a +work center during the manufacturing process. + +Find the list of supported devices here: [Supported devices](https://www.odoo.com/page/iot-hardware). + +## Connect with universal serial bus (USB) + +To add a device connected by {abbr}`USB (Universal Serial Bus)`, plug the {abbr}`USB (Universal +Serial Bus)` cable into the {abbr}`IoT (Internet of Things)` box, and the device appears in the Odoo +database. + +```{image} measurement_tool/device-dropdown.png +:align: center +:alt: Measurement tool recognized on the IoT box. +``` + +## Connect with bluetooth + +Activate the Bluetooth functionality on the device (see the device manual for further explanation), +and the {abbr}`IoT (Internet of Things)` box automatically connects to the device. + +```{image} measurement_tool/measurement-tool.png +:align: center +:alt: Bluetooth indicator on measurement tool. +``` + +## Link a measurement tool to a quality control point in the manufacturing process + +In the *Quality app*, a device can be set up on a quality control point. To do that, navigate to +{menuselection}`Quality app --> Quality Control --> Control Points`, and open the desired control +point to which the measurement tool should be linked. + +From here, edit the control point, by selecting the {guilabel}`Type` field, and clicking +{guilabel}`Measure` from the drop-down menu. Doing so reveals a field called {guilabel}`Device`, +where the attached device can be selected. + +Additionally, {guilabel}`Norm` and {guilabel}`Tolerance` can be configured. {guilabel}`Save` the +changes, if required. + +At this point, the measurement tool is linked to the chosen quality control point. The value, which +usually needs to be changed manually, is automatically updated while the tool is being used. + +```{image} measurement_tool/measurement-control-point.png +:align: center +:alt: Measurement tool input in the Odoo database. +``` + +:::{tip} +Quality control points can also be accessed by navigating to {menuselection}`IoT App --> +Devices`, then select the device. There is a {guilabel}`Quality Control Points` tab, where they +can be added with the device. +::: + +:::{note} +On a quality check detail form, the {guilabel}`Type` of check can also be specified to +{guilabel}`Measure`. Access a new quality check detail page, by navigating to +{menuselection}`Quality app --> Quality Control --> Quality Checks --> New`. +::: + +:::{seealso} +- {doc}`../../../inventory_and_mrp/quality/quality_management/quality_control_points` +- {doc}`../../../inventory_and_mrp/quality/quality_management/quality_alerts` +::: + +## Link a measurement tool to a work center in the Manufacturing app + +To link a measurement tool to an action, it first needs to be configured on a work center. To do +that, navigate to {menuselection}`Manufacturing app --> Configuration --> Work Centers`. Then, +select the desired work center in which the measurement tool will be used. + +On the work center page, add the device in the {guilabel}`IoT Triggers` tab, under the +{guilabel}`Device` column, by selecting {guilabel}`Add a Line`. Then, the measurement tool can be +linked to the {guilabel}`Action` drop-down menu option labeled {guilabel}`Take Measure`. A key can +be added to trigger the action. + +:::{important} +It should be noted that the first listed trigger is chosen first. The order matters, and these +triggers can be dragged into any order. +::: + +:::{note} +On the {guilabel}`Work Order` screen, a status graphic indicates whether the database is +correctly connected to the measurement tool. +::: + +:::{seealso} +{ref}`workcenter_iot` +::: + diff --git a/content/applications/general/iot/devices/printer.md b/content/applications/general/iot/devices/printer.md new file mode 100644 index 000000000..2fd09700f --- /dev/null +++ b/content/applications/general/iot/devices/printer.md @@ -0,0 +1,526 @@ +# Connect a printer + +Printer installation can be done in a few easy steps. The printer can be used to print receipts, +labels, orders, or even reports from the different Odoo apps. In addition, printer actions can be +assigned as an *action on a trigger* during the manufacturing process, or added onto a quality +control point or a quality check. + +:::{warning} +The **only** way to connect a printer directly to an Odoo database is through the use of an IoT +system. Without an IoT system, printing can still occur, but it is managed through the printer +itself, which is not the recommended process. +::: + +## Connection + +IoT systems support printers connected through USB, network connection, or Bluetooth. +[Supported printers](https://www.odoo.com/page/iot-hardware) are detected automatically, and +appear in the {guilabel}`Devices` list of the IoT app. + +```{image} printer/printer-detected.png +:alt: The printer as it would appear in the IoT app devices list. +``` + +:::{note} +Printers can take up to two minutes to appear in the IoT app {guilabel}`Devices` list. +::: + +## Link a printer + +### Link work orders to a printer + +Work orders can be linked to printers, via a quality control point, to print labels for +manufactured products. + +In the {doc}`Quality app `, a device can be set up on a +quality control point. To do so, go to the {menuselection}`Quality --> Quality Control --> Control +Points`, and open the desired control point. + +:::{important} +A manufacturing operation and work order operation need to be attached to a quality control +point before the {guilabel}`Type` field allows for the {guilabel}`Print Label` option to be +selected. +::: + +From here, edit the control point by selecting the {guilabel}`Type` field, and selecting +{guilabel}`Print Label` from the dropdown menu of options. Doing so reveals the {guilabel}`Device` +field, where the attached device can be selected. + +The printer can now be used with the selected quality control point. When the quality control point +is reached during the manufacturing process, the database presents the option to print labels for a +specific product. + +:::{tip} +Quality control points can also be accessed by navigating to {menuselection}`IoT --> +Devices`, then selecting the device. Go to the {guilabel}`Quality Control Points` tab to add them +to the device. +::: + +:::{note} +On a {doc}`quality check form +`, the +{guilabel}`Type` of check can also be set to {guilabel}`Print Label`. +::: + +:::{seealso} +- {doc}`/applications/inventory_and_mrp/quality/quality_management/quality_control_points` +- {doc}`/applications/inventory_and_mrp/quality/quality_management/quality_alerts` +::: + +(iot-link-printer)= + +### Link reports to a printer + +It is possible to link report types to a specific printer. To do so: + +1. Go to {menuselection}`IoT --> Devices` and select the desired printer. +2. Go to the {guilabel}`Printer Reports` tab and click {guilabel}`Add a line`. +3. In the pop-up that opens, select the types of reports to be linked to the printer and click + {guilabel}`Select`. + +```{image} printer/printer-reports.png +:alt: The list of reports assigned to a printer in the IoT app. +``` + +:::{tip} +Reports can also be configured by {ref}`enabling the developer mode ` and going +to {menuselection}`Settings --> Technical --> Reports`. Select the desired report from the list +and set an {guilabel}`IoT Device`. +::: + +The first time a linked report is selected to print, a {guilabel}`Select Printers` pop-up window +appears. Tick the checkbox next to the correct printer for the report, and click {guilabel}`Print`. +At that point, the report is linked to the printer. + +#### Clear device printer cache + +After a printer is linked to print a report, the setting is saved in a browser's cache. This means +a user can have different devices saved in their cache for different reports, based on the device +they use to access Odoo. It also means different users can have a report automatically printed from +different printers, based on their preferences. + +To unlink a report from a printer, navigate to {menuselection}`IoT --> Configuration --> Reset +Linked Printers`. This generates a list of reports that are linked to a printer on the current +device. Click the {guilabel}`Unlink` button next to each report to remove the link. + +:::{important} +This step **only** prevents the report from automatically printing to the listed printer from +the current browser. The report is still {ref}`linked ` on the device, under +the {guilabel}`Printer Reports` tab. +::: + +```{image} printer/clear-reports.png +: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>` +::: + +## Potential issues + +### The printer is not detected + +If a printer does not appear in the devices list, go to the {ref}`IoT box's ` +or {ref}`Windows virtual IoT's ` homepage, click {guilabel}`Show` in +the {guilabel}`Devices` section, and make sure the printer is listed. + +If the printer does not appear on the IoT system's homepage, click {guilabel}`Printer Server`, then +{guilabel}`Administration`, and {guilabel}`Add Printer`. If the printer is not in the list, it is +likely not connected properly. + +### The printer outputs random text + +For most printers, the correct driver should be automatically detected and selected. However, in +some cases, the automatic detection mechanism might not be enough, and if no driver is found, the +printer might print random characters. + +The solution is to manually select the corresponding driver. On the IoT system's homepage, click +{guilabel}`Printer Server`, then {guilabel}`Printers`, and select the printer in the list. +In the {guilabel}`Administration` dropdown menu, click {guilabel}`Modify Printer`. Follow the steps +and select the printer's *make* and *model*. + +```{image} printer/modify-printer.png +:alt: Edit the printer connected to the IoT system. +:scale: 75% +``` + +:::{note} +Epson receipt printers and Zebra label printers do not need a driver to work. Make sure that no +driver is selected for those printers. +::: + +### The printer is detected but is not recognized correctly + +If Odoo and the IoT system do not recognize the printer correctly, go to {menuselection}`IoT +--> Devices`, click the device's card to access its form, and set the {guilabel}`Subtype` field to +the appropriate option: {guilabel}`Receipt Printer`, {guilabel}`Label Printer`, or {guilabel}`Office +Printer`. + +#### Epson configuration special case + +Most Epson printers support printing receipts in Odoo Point of Sale using the `GS v 0` command. +However, the following Epson printer models do not support this command: + +- TM-U220 +- TM-U230 +- TM-P60 +- TMP-P60II + +To bypass this issue, you can configure the printer to use the `ESC *` command. + +First, review Epson's website for compatibility for both the [GS v 0](https://download4.epson.biz/sec_pubs/pos/reference_en/escpos/gs_lv_0.html) and [ESC \*](https://download4.epson.biz/sec_pubs/pos/reference_en/escpos/esc_asterisk.html) commands. + +If the printer is incompatible with `GS v 0` but supports `ESC *`, configure the IoT system to use +the `ESC *` command as follows: + +1. Access the {ref}`IoT box's ` or {ref}`Windows virtual IoT's + ` homepage. + +2. Click the {guilabel}`Printer server` button, then click {guilabel}`Administration` on the CUPS + page. + +3. Click {guilabel}`Add Printer` in the {guilabel}`Printers` section, select the printer, and click + {guilabel}`Continue`. + + :::{tip} + If the printer's name is still uncertain, take the following steps: + + 1. Take note of the listed printers on the CUPS page. + 2. Turn the printer off and refresh the page. + 3. Compare the difference with the first list to see which printer disappeared. + 4. Turn the printer back on and refresh the page again. + 5. Double-check the list again to see if the printer re-appears. + 6. The printer that disappeared and reappears again on the listed printers is the name of the + printer in question. It can be {guilabel}`Unknown` under {guilabel}`Local printers`. + ::: + +4. On the {guilabel}`Add Printer` page, specify the printer's {guilabel}`Name` using the following + convention: `__IMC___...___`, where: + + - `printer_name` is the printer's name. It can contain any character except `_`, `/`, `#`, or \` \` + (space character). + + - `IMC`: This stands for *Image Mode Column* (the simplified name for `ESC *`). + + - `param_1`: This stands for the specific parameter: + + - `SCALE`: Scale of the picture (with the same aspect ratio). `X` should be an integer + describing the scale percentage that should be used. For example, `100` is the original size, + `50` is half the size, and `200` is twice the size. + - `LDV`: *Low Density Vertical* (will be set to *High Density Vertical* if not specified). + - `LDH`: *Low Density Horizontal* (will be set to *High Density Horizontal* if not specified). + + :::{note} + - *Density* parameters might need to be configured in a particular way, depending on the + printer model. + - Refer to [Epson's ESC * documentation](https://download4.epson.biz/sec_pubs/pos/reference_en/escpos/esc_asterisk.html) + to determine if the printer requires these parameters to be set. + ::: + + > ```{eval-rst} + > .. example:: + > The following are examples of proper and improper name formatting: + > + > Proper name formatting: + > + > - `EPSONTMm30II__IMC__` + > - `EPSON_TM_U220__IMC_LDV_LDH_SCALE80__` + > + > Improper name formatting (this will not prevent printing, but the result might not have the + > expected printed output): + > + > - `EPSON TMm 30II`: The name cannot contain spaces. + > - `EPSONTMm30II`: The name itself is correct, but it will not use `ESC *`. + > - `EPSONTMm30II__IMC`: This name is missing the end `__`. + > - `EPSONTMm30II__IMC_XDV__`: The parameter `XDV` does not match any existing parameters. + > - `EPSONTMm30II__IMC_SCALE__`: The parameter `SCALE` is missing the scale value. + > ``` + +5. Once the printer's name has been defined using the appropriate naming convention, click + {guilabel}`Continue`. + +6. Set the {guilabel}`Make` value to {guilabel}`Raw` and the {guilabel}`Model` value to + {guilabel}`Raw Queue (en)`. + +7. Click {guilabel}`Add Printer`. If everything was done correctly, the page should redirect to the + {guilabel}`Banners` page. + +8. Wait a few minutes for the IoT system to detect the printer and sync to Odoo's server. + +9. {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, enable {guilabel}`IoT Box`, and select the printer + in the {guilabel}`Receipt Printer` field. Click {guilabel}`Save`. + +:::{note} +If the printer was set up incorrectly (e.g., it continues to print random text, or the printed +receipt is too large or too small), it cannot be modified via the printer's name in CUPS. +Instead, configure a new printer from scratch with modified parameters, following the steps +above. +::: + +```{eval-rst} +.. spoiler:: + Example + + The following is an example of the troubleshooting process for a TM-U220B printer model using the + `ESC *` command. The receipt pictured below is an example of a receipt that is printing correctly + due to proper formatting (in theory): + + .. image:: printer/receipt-example.png + :scale: 60% + :alt: Properly formatted receipt picture from a demo database. + + Printing this receipt immediately without proper formatting will not work, as the TM-U220B + printer model does not support the `GS v 0` command. Instead, random characters will be printed: + + .. image:: printer/receipt-print-random-letters.png + :scale: 60% + :alt: Printer paper with seemingly random characters. + + To properly configure formatting for the Epson TM-U220B printer model, follow these steps: + + #. After checking Epson's website for compatibility with both the `GS v 0 + `_ and `ESC * + `_ commands, + the TM-U220B printer is indeed incompatible with `GS v 0` but supports `ESC *`. + + .. image:: printer/epson-compatibility-compare.png + :alt: Epson compatibility evaluation from Epson website. + + #. When adding the printer, CUPS displays the list of available printers: + + .. image:: printer/add-printer.png + :scale: 75% + :alt: Administration menu, add printer selection. + + In this case, the printer is connected via USB, so it is not part of the + :guilabel:`Discovered Network Printers`. Instead, it is likely part of the :guilabel:`Unknown` + selection under :guilabel:`Local Printers`. By unplugging the printer's USB cable from the IoT + system and refreshing the page, the :guilabel:`Unknown` printer disappears. By plugging it + back in, the printer reappears. + + #. For the naming convention, since the printer must print using the `ESC *` command, it is + imperative to add `__IMC`. + + .. image:: printer/epson-tm-u220-specification.png + :alt: Epson TM-U220 specifications on manufacturer's website. + + For this particular model (TM-U220) `m` should be equal to 0 or 1. While referencing the + :guilabel:`Description` table on `Epson's ESC * website + `_, the `m` + values could be 0, 1, 32, or 33. So, in this case, the `m` value **cannot** be 32 or 33 + (otherwise, random characters will be printed). + + The table includes the numeric values 32 and 33; they both occur if the :guilabel:`Number of + bits for vertical data` is set to 24, i.e. it has a *High Vertical Density*. In the case of + configuring the Epson TM-U220, the *Low Vertical Density* will need to be forced, as + this printer model does not support *High Vertical Density* for this command `ESC *`. + + To add a *Low Vertical Density*, add the `LDV` parameter to the naming convention. + + .. image:: printer/add-printer-filled.png + :alt: Add a *Low Vertical Density* (the `LDV` parameter) to the naming convention. + + #. Click :guilabel:`Continue` to proceed. Next, set the :guilabel:`Make` value to :guilabel:`Raw` + and the :guilabel:`Model` value to :guilabel:`Raw Queue (en)`. + + .. image:: printer/add-printer-add.png + :alt: Epson TM-U220 specifications on manufacturers website. + + However, when trying to print with the naming convention `EpsonTMU220B__IMC_LDV__`, the + receipt is printed, but it is too large and outside the margin. To resolve this, add a new + printer (and naming convention) with the `SCALE` parameter to adapt to the receipt's size. + + Here are some examples: + + .. list-table:: + :header-rows: 1 + + * - Printer Naming Convention + - `EpsonTMU220B__IMC_LDV__` + - `EpsonTMU220B__IMC_LDV_SCALE75__` + - `EpsonTMU220B__IMC_LDV_LDH__` + - `EpsonTMU220B__IMC_LDV_LDH_SCALE35__` + * - .. image:: printer/receipt-example.png + :alt: Receipt example format. + - .. image:: printer/tm-u220-ldv.png + :alt: Receipt format using naming convention: EpsonTMU220B__IMC_LDV__. + - .. image:: printer/tm-u220-ldv-scale75.png + :alt: Receipt format using naming convention: EpsonTMU220B__IMC_LDV_SCALE75__. + - .. image:: printer/tm-u220-ldv-hdv.png + :alt: Receipt format using naming convention: EpsonTMU220B__IMC_LDV_LDH__. + - .. image:: printer/tm-u220-ldv-hdv-scale35.png + :alt: Receipt format using naming convention: EpsonTMU220B__IMC_LDV_LDH_SCALE35__. +``` + +### DYMO LabelWriter print issue + +The DYMO LabelWriter has a known issue in printing with IoT systems. The OpenPrinting CUPS server +installs the printer using {guilabel}`Local RAW Printer` drivers. In order to print anything, the +correct {guilabel}`Make and Model` needs to be set to reference the correct driver when using the +device. + +Additionally, a new printer needs to be added to reduce the print delay that occurs after updating +the driver. + +:::{important} +The DYMO LabelWriter 450 DUO printer is the recommended DYMO printer for use with Odoo and IoT +systems. This device combines two printers: a label printer and a tape printer. When configuring +the following processes, it is essential to select the correct model (either DYMO LabelWriter 450 +DUO Label (en) or DYMO LabelWriter 450 DUO Tape (en)). For consistency, the following processes +outline configuration steps for the DYMO LabelWriter 450 DUO Label (en) model. Adjust the model +selections as needed. +::: + +(printer-dymo-update-drivers)= + +#### DYMO LabelWriter not printing + +If the DYMO LabelWriter fails to print, install a new driver: + +01. Access the IoT system's homepage and click {menuselection}`Printer server` to open the + OpenPrinting CUPS console. + +02. Click {menuselection}`Printers` in the top menu, then click the printer in the list. + +03. Select {guilabel}`Maintenance` in the first dropdown menu. + +04. Select {guilabel}`Modify Printer` in the second dropdown menu. + + ```{image} printer/main-modify.png + :alt: |- + : Modify the make and model of the DYMO LabelWriter. Maintenance and Modify dropdown + : menus highlighted. + ``` + +05. Select the specific network connection/printer on which the modification should be made and + click {guilabel}`Continue`. + +06. On the next page, click {guilabel}`Continue`, then select {guilabel}`DYMO` from the + {guilabel}`Make` dropdown list. + +07. Click on {guilabel}`Continue` and set the {guilabel}`Model` to {guilabel}`DYMO LabelWriter 450 + DUO Label (en)` (or whichever DYMO printer model is being used). + +08. Click {guilabel}`Modify Printer` to set the new driver; a confirmation page appears. + +09. Click {menuselection}`Printers` in the top menu; all printers installed on the OpenPrinting CUPS + server appear, including the newly updated {guilabel}`DYMO LabelWriter 450 DUO Label` (or + whichever DYMO printer model is being used). + +10. Click the newly updated printer, then click the {guilabel}`Maintenance` dropdown menu and + select {guilabel}`Print Test Page` to print a test label. The test label is printed after a few + seconds if the driver update was successful. + +To reduce this delay, add a new printer using the steps below. + +#### DYMO LabelWriter print delay + +:::{tip} +If the DYMO LabelWriter 450 DUO printer is not printing at all, or is not recognized (i.e., it +has a {guilabel}`RAW` driver type), then {ref}`update the drivers on the device +`. +::: + +To resolve the delay issue after modifying the driver, reinstall the printer: + +1. Access the IoT system's homepage and click {menuselection}`Printer server` to open the + OpenPrinting CUPS console. + +2. Click {menuselection}`Administration` in the top menu, then click {guilabel}`Add a Printer`. + +3. On the next page, in the {guilabel}`Local Printers` section, select {guilabel}`DYMO + LabelWriter 450 DUO Label (DYMO LabelWriter 450 DUO Label)` (or whichever DYMO printer model is + being used) pre-installed printer. Click {guilabel}`Continue`. + + ```{image} printer/local-printer.png + :alt: |- + : Add a printer screen on OpenPrinting CUPS with DYMO LabelWriter 450 DUO Label + : highlighted. + ``` + +4. On the following screen, update the {guilabel}`Name` to something easily identifiable, as the + original printer will remain in the list. Then, click {guilabel}`Continue`. + + ```{image} printer/rename-printer.png + :alt: Rename printer page in the 'Add a Printer' flow, with the name field highlighted. + ``` + +5. Set the {guilabel}`Model` field to {guilabel}`DYMO LabelWriter 450 DUO Label (en)` (or + whichever DYMO printer model is being used), then click {guilabel}`Add Printer` to complete + the installation. + + ```{image} printer/choose-printer.png + :alt: |- + : Choose model screen on the OpenPrinting CUPS console with model and add a printer + : highlighted. + ``` + +6. Click {menuselection}`Printers` in the top menu and click the newly installed printer + {guilabel}`DYMO LabelWriter 450 DUO Label` (or whichever DYMO printer model is being used) from + in the list. + + ```{image} printer/printer-page.png + :alt: Printer page with newly installed printer highlighted. + ``` + +7. Click the {guilabel}`Maintenance` dropdown list and select {guilabel}`Print Test Page` to print + a test label. The test label should print out immediately, or after one or two seconds. + +### The Zebra printer does not print anything + +Zebra printers are quite sensitive to the format of the printed Zebra Programming Language (ZPL) +code. If nothing comes out of the printer or blank labels are printed, try changing the format +of the report sent to the printer. To do so, activate the {ref}`developer mode `, go +to {menuselection}`Settings --> Technical --> User Interface --> Views`, and search for the +corresponding template. + +:::{seealso} +[Zebra's instructions on printing ZPL files](https://supportcommunity.zebra.com/s/article/Print-a-zpl-file-using-the-Generic-Text-Printer) +::: + +## Barcode scanner issues + +### The characters read by the barcode scanner do not match the barcode + +By default, most barcode scanners are configured in the US QWERTY format. If the barcode scanner +uses a different layout, go to {menuselection}`IoT --> Devices` and click the barcode device's card. +Then, select the correct language in the {guilabel}`Keyboard Layout` field. + +:::{note} +The {guilabel}`Keyboard Layout` is language-specific, with available options varying based on +the device and the language of the database (e.g., {guilabel}`English (UK)`, {guilabel}`English +(US)`, etc.). +::: + +### Nothing happens when a barcode is scanned + +Make sure the correct device is selected in the {doc}`Point of Sale settings +` (when applicable) and the barcode is +configured to send an `ENTER` character (keycode 28) at the end of every barcode. + +### The barcode scanner is detected as a keyboard + +:::{important} +Some barcode scanners are identified as USB keyboards rather than barcode scanners and are not +recognized by IoT systems. +::: + +To change the device type manually, go to {menuselection}`IoT --> Devices` and click the barcode +device's card. Then, enable {guilabel}`Is scanner`. + +### The barcode scanner processes barcode characters individually + +When accessing the mobile version of Odoo from a mobile device or tablet paired with a barcode +scanner via the IoT system, the scanner might interpret each character in a barcode as a separate +scan. To resolve this, go to {menuselection}`IoT --> Devices` and click the barcode device's +card. Then, select the correct language in the {guilabel}`Keyboard Layout` field. + +:::{note} +The {guilabel}`Keyboard Layout` is language-specific, with available options varying based on +the device and the language of the database (e.g., {guilabel}`English (UK)`, {guilabel}`English +(US)`, etc.). +::: + diff --git a/content/applications/general/iot/devices/scale.md b/content/applications/general/iot/devices/scale.md new file mode 100644 index 000000000..2a577d463 --- /dev/null +++ b/content/applications/general/iot/devices/scale.md @@ -0,0 +1,85 @@ +# Connect a scale + +:::{important} +- In EU member states, [certification is legally required](https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=uriserv%3AOJ.L_.2014.096.01.0107.01.ENG) + 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. +::: + +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](https://www.odoo.com/page/iot-hardware), no additional setup is required; the scale is +automatically detected as soon as it is connected. If the scale is not detected, reboot the IoT box +or {ref}`restart the Windows virtual IoT service ` and {ref}`update the +scale's drivers `. + +:::{note} +If the scale still does not function after updating the drivers, it might not be [compatible with +the Odoo IoT system](https://www.odoo.com/page/iot-hardware). 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: + +1. {ref}`Access the POS settings ` and select your POS, or click the + vertical ellipsis button ({guilabel}`⋮`) on a POS card and click {guilabel}`Edit`. +2. Scroll down to the {guilabel}`Connected Devices` section and enable {guilabel}`IoT Box`. +3. Select the scale in the {guilabel}`Electronic Scale` field. +4. Click {guilabel}`Save`. + +:::{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 +:alt: Electronic Scale dashboard view when no items are being weighed. +:scale: 80% +``` + +## Ariva S scales + +For Ariva S series scales (manufactured by Mettler-Toledo, LLC.) to function with IoT systems, a +specific setting must be modified, and a dedicated Mettler USB-to-proprietary RJ45 cable is required. + +:::{important} +The official Mettler USB-to-RJ45 cable (Mettler part number 72256236) must be used. Contact +Mettler or a partner to purchase an authentic cable. **No other** cable works for this +configuration. +::: + +To configure the Ariva S scale for IoT system recognition, refer to page 17 of [Mettler's Setup +Guide for Ariva S series scales](https://www.mt.com/dam/RET_DOCS/Ariv.pdf) and follow these steps: + +1. Hold the **>T\<** button for eight seconds, or until {guilabel}`CONF` appears. + +2. Press **>T\<** until {guilabel}`GRP 3` appears, then press **>0\<** to confirm. + +3. Under {guilabel}`3.1`, ensure the setting is set to {guilabel}`1` (USB Virtual COM ports) and + press **>T\<** to cycle through the options under group 3.1. + +4. Once {guilabel}`3.1` is set to {guilabel}`1`, press **>0\<** to confirm the selection. + +5. Continue to press **>0\<** until {guilabel}`GRP 4` appears. + +6. Press **>T\<** until {guilabel}`EXIT` appears. + + :::{important} + Do **not** make any other changes unless otherwise needed. + ::: + +7. Press **>0\<**. + +8. Press **>0\<** again to {guilabel}`SAVE`; the scale restarts. + +9. Reboot the IoT box or {ref}`restart the Windows virtual IoT service `. + The scale should then appear as `Toledo 8217`, as opposed to the previous display, where it + appeared as `Adam Equipment Serial`. + diff --git a/content/applications/general/iot/devices/screen.md b/content/applications/general/iot/devices/screen.md new file mode 100644 index 000000000..536645367 --- /dev/null +++ b/content/applications/general/iot/devices/screen.md @@ -0,0 +1,119 @@ +# Connect a screen + +In Odoo, an {abbr}`IoT (Internet of Things)` box can be connected to a screen display. After being +configured, the screen can be used to display a Point of Sale (PoS) order to a client. + +:::{figure} screen/screen-pos-client-display.png +An example of a PoS (point of sale) order on a screen display. +::: + +Access the customer display by going to the {abbr}`IoT (Internet of Things)` box homepage and +clicking on the {guilabel}`PoS Display` button. To get to the {abbr}`IoT (Internet of Things)` box +homepage, navigate to {menuselection}`IoT app --> IoT Boxes` and click on the {abbr}`IoT (Internet +of Things)` box homepage link. + +## Connection + +The way to connect the screen display to the {abbr}`IoT (Internet of Things)` box differs depending +on the model. + +```{eval-rst} +.. tabs:: + + .. tab:: IoT Box model 4 + + Connect up to two screens with micro-HDMI cables on the side of the :abbr:`IoT (Internet of + Things)` box. If two screens are connected, they can display distinct content (see + :ref:`Screen Usage `). + + .. tab:: IoT Box model 3 + + Connect the screen with an HDMI cable on the side of the :abbr:`IoT (Internet of Things)` box. +``` + +:::{seealso} +{ref}`See the Raspberry Pi Schema `. +::: + +:::{important} +Screen(s) should be connected before the {abbr}`IoT (Internet of Things)` box is switched on. If +it is already on, connect the screen(s), and then restart the {abbr}`IoT (Internet of Things)` +box by unplugging it for ten seconds and plugging it back into its power source. +::: + +:::{warning} +The usage of HDMI/micro-HDMI adapters may cause issues which will result in a blank, black screen +on the screen display. Using the specific cable for the display connection is recommended. +::: + +If the connection was successful, the screen should display the {guilabel}`POS Client display` +screen. + +```{image} screen/screen-pos-client-display-no-order.png +:align: center +:alt: |- +: The default "POS Client Display" screen that appears when a screen display is successfully +: connected to an IoT box. +``` + +The screen should also appear in the list of {guilabel}`Displays` on the {abbr}`IoT (Internet of +Things)` box homepage. Alternatively, the display can be seen by accessing {menuselection}`IoT app +--> Devices`. + +```{image} screen/screen-screen-name-example.png +:align: center +:alt: An example of a screen display name shown on the IoT Box Home Page. +``` + +:::{note} +If no screen is detected, a default display named {guilabel}`Distant Display` will be displayed +instead. This indicates that there is no hardware screen connected. + +> ```{image} screen/screen-no-screen.png +> :align: center +> :alt: The "Distant Display" screen name will be used if no screen is detected. +> ``` +::: + +(iot-usage-screen)= + +## Usage + +### Show Point of Sale orders to customers + +To use the screen in the *Point of Sale app*, go to {menuselection}`Point of Sale --> +Configuration --> Point of Sale`, select a {abbr}`PoS (Point of Sale)`, click {guilabel}`Edit` if +necessary, and enable the {guilabel}`IoT Box` feature. + +Next, select the screen from the {guilabel}`Customer Display` drop-down menu. Then click +{guilabel}`Save`, if required. + +```{image} screen/screen-pos-screen-config.png +:align: center +:alt: Connect the screen display to the Point of Sale app. +``` + +The screen is now available for {abbr}`PoS (Point of Sale)` sessions. A screen icon will appear in +the menu at the top of the screen to indicate the screen's connection status. + +```{image} screen/screen-pos-icon.png +:align: center +:alt: |- +: The "screen" icon on the Point of Sale display shows the connection status with the +: screen. +``` + +The screen will automatically show the {abbr}`PoS (Point of Sale)` orders and update when changes +are made to the order. + +```{image} screen/screen-pos-client-display.png +:align: center +:alt: An example of a PoS order on a screen display. +``` + +### Display a website on the screen + +Open the screen form view by accessing {menuselection}`IoT app --> Devices --> Customer Display`. +This allows the user to choose a particular website URL to display on the screen using the +{guilabel}`Display URL` field. + diff --git a/content/applications/general/iot/iot_advanced.md b/content/applications/general/iot/iot_advanced.md new file mode 100644 index 000000000..01b768e02 --- /dev/null +++ b/content/applications/general/iot/iot_advanced.md @@ -0,0 +1,12 @@ +--- +nosearch: true +--- + +# Advanced + +```{toctree} +iot_advanced/https_certificate_iot +iot_advanced/updating_iot +iot_advanced/ssh_connect +``` + diff --git a/content/applications/general/iot/iot_advanced/https_certificate_iot.md b/content/applications/general/iot/iot_advanced/https_certificate_iot.md new file mode 100644 index 000000000..8b3948610 --- /dev/null +++ b/content/applications/general/iot/iot_advanced/https_certificate_iot.md @@ -0,0 +1,168 @@ +(iot-https-certificate-iot)= + +# HTTPS certificate (IoT) + +*Hypertext Transfer Protocol Secure* (HTTPS) is the secure and encrypted version of *Hypertext +Transfer Protocol* (HTTP), which is the primary protocol used for data communication between a web +browser and a website. It secures communications by using an encryption protocol known as *Transport +Layer Security* (TLS), previously called *Secure Sockets Layer* (SSL). The security of +{abbr}`HTTPS (Hypertext Transfer Protocol Secure)` relies on {abbr}`TLS (Transport Layer Security)` +/{abbr}`SSL (Secure Sockets Layer)` certificates, which authenticate the provider and verify their +identity. + +The use of HTTPS is required to communicate with certain network devices, particularly payment +terminals. If the HTTPS certificate is not valid, some devices cannot interact with the IoT +system. + +:::{note} +In this documentation and throughout Odoo, the term *HTTPS certificate* refers to a valid +SSL certificate that allows an HTTPS connection. +::: + +(iot-https-certificate-iot-generation)= + +## HTTPS certificate generation + +The HTTPS certificate is generated automatically. When the IoT system is (re-)started (e.g., after +it is connected to the Odoo database), a request is sent to [https://www.odoo.com](https://www.odoo.com), which returns +the HTTPS certificate if the IoT system and database meet the eligibility criteria: + +(iot-https-certificate-iot-iot-eligibility)= + +- The database must be a **production** instance. The database instance should not be a copy, a + duplicate, a staging, or a development environment. +- The Odoo subscription must be ongoing ({guilabel}`In Progress` status) and have an {ref}`IoT + box subscription ` line. + +When the certificate has been received: + +- The IoT system's homepage address is updated to a new HTTPS URL ending with `.odoo-iot.com`. Click + the URL to establish a secure HTTPS connection. + + ```{image} https_certificate_iot/iot-new-domain.png + :alt: Odoo IoT app IoT box with .odoo-iot.com domain. + ``` + +- The {guilabel}`HTTPS certificate` banner displays the certificate's validity period. To view this + information, click the {icon}`fa-cogs` ({guilabel}`cogs`) button on the IoT system's homepage. + + ```{image} https_certificate_iot/https-valid.png + :alt: IoT box homepage with HTTPS certificate validity date. + ``` + +## HTTPS certificate generation issues and errors + +### The HTTPS certificate does not generate + +Potential causes include the following: + +- No {ref}`IoT box subscription ` is linked to your account. + +- The {ref}`IoT box subscription ` was added *after* connecting the IoT + system to the database. In this case, refresh the IoT system's homepage or reboot/{ref}`restart + ` the IoT system to regenerate the HTTPS certificate. + +- The firewall is preventing the HTTPS certificate from generating correctly. In this case, + deactivate the firewall until the certificate is successfully generated. + + :::{note} + Some devices, such as routers with a built-in firewall, can prevent the HTTPS certificate from + generating. + ::: + +### The IoT system's homepage can be accessed using its IP address but not the `xxx.odoo-iot.com` URL + +Contact your system or network administrator to address the issue. Network-related problems are +beyond the scope of Odoo support services. + +- If the router allows manual {abbr}`DNS (Domain Name System)` configuration, update the settings to + use [Google DNS](https://developers.google.com/speed/public-dns). +- If the router does not support this, you need to update the DNS settings directly on each device + that interacts with the IoT system to use [Google DNS](https://developers.google.com/speed/public-dns). Instructions for configuring DNS on individual + devices can be found on the respective manufacturer's website. + +:::{note} +- Some IoT devices, such as payment terminals, likely do not require DNS changes, as they are + typically pre-configured with custom DNS settings. +- On some browsers, an error code mentioning the DNS (such as `DNS_PROBE_FINISHED_NXDOMAIN`) is + displayed. +::: + +### Errors + +A specific error code is displayed on the IoT system's homepage if any issues occur during the +generation or reception of the HTTPS certificate. + +:::{tip} +When you access the IoT system's homepage, it automatically checks for an HTTPS certificate and +attempts to generate one if it is missing. If an error appears, refresh the page to see if the +issue is resolved. +::: + +#### `ERR_IOT_HTTPS_CHECK_NO_SERVER` + +The server configuration is missing, i.e., the Odoo instance is not {doc}`connected <../connect>` to +the IoT system. + +#### `ERR_IOT_HTTPS_CHECK_CERT_READ_EXCEPTION` + +An error occurred while attempting to read the existing HTTPS certificate. +Verify that the HTTPS certificate file is readable. + +#### `ERR_IOT_HTTPS_LOAD_NO_CREDENTIAL` + +The contract and/or database {abbr}`UUID (Universal Unique Identifier)` is missing form the IoT. + +Verify that both values are correctly configured. To update them, {ref}`access the IoT box's +` or {ref}`Windows virtual IoT's homepage `, +click the {icon}`fa-cogs` ({guilabel}`cogs`) button, then click {guilabel}`Credential`. + +#### `ERR_IOT_HTTPS_LOAD_REQUEST_EXCEPTION` + +An unexpected error occurred while the IoT system tried to reach [https://www.odoo.com](https://www.odoo.com). This is +likely due to network-related issues, such as: + +- The IoT system does not have Internet access. +- Network restrictions (e.g., firewalls or VPNs) are preventing communication with + . + +:::{note} +- To access the full request exception details with information regarding the error, {ref}`enable + the developer mode `, click the IoT system's card in the IoT app, and click + {guilabel}`Download logs` on the {ref}`IoT system's form `. + To define the log levels recorded in the IoT system's log file, {ref}`access the IoT box's + ` or {ref}`Windows virtual IoT's ` homepage, + click the {icon}`fa-cogs` ({guilabel}`cogs`) button, then {guilabel}`Log level` at the + bottom of the page. +- To address network-related issues, contact your system or network administrator; these issues + are beyond the scope of Odoo support services. +::: + +#### `ERR_IOT_HTTPS_LOAD_REQUEST_STATUS` + +The IoT system successfully reached [https://www.odoo.com](https://www.odoo.com) but received an unexpected +[HTTP response (status codes)](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status). + +This error code includes the HTTP status. For example, `ERR_IOT_HTTPS_LOAD_REQUEST_STATUS 404` means +the server returned a "Page Not Found" response. + +To solve this issue: + +1. Open [https://www.odoo.com](https://www.odoo.com) in a web browser to check if the website is temporarily down for + maintenance. +2. If + [https://www.odoo.com](https://www.odoo.com) + is down for maintenance, wait for it to resume. + If the website is operational, open a + [support ticket](https://www.odoo.com/help) + and make + sure to include the 3-digit HTTPS status code in the ticket. + +#### `ERR_IOT_HTTPS_LOAD_REQUEST_NO_RESULT` + +The IoT system successfully connected to [https://www.odoo.com](https://www.odoo.com), but the server refused to +provide the HTTPS certificate. + +Check that the IoT system and database meet the {ref}`eligibility requirements +` for an HTTPS certificate. + diff --git a/content/applications/general/iot/iot_advanced/ssh_connect.md b/content/applications/general/iot/iot_advanced/ssh_connect.md new file mode 100644 index 000000000..48ea35c47 --- /dev/null +++ b/content/applications/general/iot/iot_advanced/ssh_connect.md @@ -0,0 +1,41 @@ +# IoT box SSH connection + +:::{note} +SSH connections are only available for {doc}`IoT boxes <../iot_box>`, not the {doc}`Windows +virtual IoT <../windows_iot>`. +::: + +:::{warning} +- This feature should **only** be used with trusted parties, as it provides administrative + access to the IoT box, which can create security issues. +- Managing an SSH connection is **not** covered under the standard Odoo support scope. Visit + the [Odoo Support](https://www.odoo.com/help) page for additional information about what is + covered. +::: + +To provide an {abbr}`SSH (secure shell protocol)` connection to an IoT box, you must generate a +password: + +1. Access the IoT box's homepage by opening the IoT app and clicking the IP address displayed + on the IoT box's card. + +2. Click the {icon}`fa-cogs` ({guilabel}`cogs`) button at the top-right, then {guilabel}`Remote + Debug`. + +3. In the {guilabel}`Remote Debugging` popup that opens, click {guilabel}`Generate` and save the + password securely. Once you close the popup, the password will no longer be available. + + ```{image} ssh_connect/ssh-generate-password.png + :alt: The Remote Debugging password generation window. + ``` + +4. Enter the {guilabel}`Authentication Token` provided by the user attempting to connect to the IoT + box. + +5. Click {guilabel}`Enable Remote Debugging`. + +:::{seealso} +- {doc}`../iot_box` +- {doc}`../connect` +::: + diff --git a/content/applications/general/iot/iot_advanced/updating_iot.md b/content/applications/general/iot/iot_advanced/updating_iot.md new file mode 100644 index 000000000..0ab0165eb --- /dev/null +++ b/content/applications/general/iot/iot_advanced/updating_iot.md @@ -0,0 +1,90 @@ +# IoT system updates + +Due to the complexity of IoT systems, the term *updating* can refer to several processes, including: + +- {ref}`Updating the IoT system's image and/or core code `; +- {ref}`Updating the handlers `, which include the interfaces and drivers. + +(iot-updating-iot-image-code)= + +## Image and core code update + +```{eval-rst} +.. tabs:: + + .. group-tab:: IoT box + + To check if the IoT box is up-to-date (and update it if needed), :ref:`access the IoT box's + homepage `, click the :icon:`fa-cogs` (:guilabel:`cogs`) button at the + top-right, then :guilabel:`Update` in the :guilabel:`Version` section. + + .. tip:: + :ref:`Enable the developer mode ` to view the current versions of the IoT + box's image and core code. + + **Image update** + + To update the IoT box's image, flash its SD card. Flashing can be performed using + `balenaEtcher `_, a free and open-source tool for writing disk + images to SD cards. + + .. note:: + - Updating the IoT system's image is often required after upgrading the Odoo database to a + newer version. + - A computer with a micro SD card reader/adapter is required to flash the micro SD card. + - An alternative software for flashing the micro SD card is `Raspberry Pi Imager + `_. + + #. `Download balenaEtcher. `_ + #. Insert the IoT box's micro SD card into the computer or adapter. + #. Open balenaEtcher, click :guilabel:`Flash from URL`, and enter the following URL: + `http://nightly.odoo.com/master/iotbox/iotbox-latest.zip`. + #. Click :guilabel:`Select target` and select the SD card. + #. Click :guilabel:`Flash` and wait for the process to finish. + + .. image:: updating_iot/etcher-flash.png + :alt: Flashing the SD card with balenaEtcher + + **Core code update** + + To update the IoT box's core code, click :guilabel:`Update` under :guilabel:`IoT Box Update` + in the :guilabel:`Update` popup. + + .. danger:: + This process may take over 30 minutes. **Do not turn off or unplug the IoT box** during + this time, as doing so could leave the device in an inconsistent state, requiring the IoT + box to be reflashed with a new image. + + .. group-tab:: Windows virtual IoT + + To update the Windows virtual IoT's image and code, :ref:`uninstall the program + ` and :ref:`reinstall ` the latest + package. +``` + +(iot-updating-iot-handlers)= + +## Handler (driver) update + +To update the IoT system's handlers (i.e., drivers and interfaces) and synchronize them with the +configured server handler's code, for example, to resolve issues where {doc}`devices <../devices>` +are not functioning properly with the IoT system, proceed as follows: + +1. Access the {ref}`IoT box's ` or {ref}`Windows virtual IoT's + ` homepage and click the {icon}`fa-cogs` ({guilabel}`cogs`) button at + the top-right. +2. Click {guilabel}`Update` in the {guilabel}`Version` section. +3. In the {guilabel}`Update` popup that opens, click {guilabel}`Force Drivers Update`. + +:::{important} +If you have an {doc}`on-premise ` or {doc}`Odoo.sh +` database, the configured server must be +up-to-date to ensure the handlers' code includes the latest fixes and patches. +::: + +:::{note} +A handler update is also performed automatically every time the IoT system is restarted unless +the {guilabel}`Automatic drivers update` option is disabled in the {guilabel}`Technical +information` tab in the {ref}`IoT system's form ` in Odoo. +::: + diff --git a/content/applications/general/iot/iot_box.md b/content/applications/general/iot/iot_box.md new file mode 100644 index 000000000..bd155425a --- /dev/null +++ b/content/applications/general/iot/iot_box.md @@ -0,0 +1,94 @@ +# IoT box + +To start using an IoT box: + +1. Make sure you have a {ref}`valid IoT box subscription ` in addition to + your Odoo subscription. +2. Connect your {doc}`devices ` to the IoT box. +3. {ref}`Connect the IoT box to the network `. +4. {doc}`Connect the IoT box to your Odoo database `. + +:::{note} +Devices can also be connected after the IoT box is added to the network and/or connected to the +database; however, a reboot of the IoT box might be required. +::: + +(iot-iot-box-network)= + +## Network connection + +The IoT box can be connected to the network via {ref}`Ethernet ` or +{ref}`Wi-Fi `. + +:::{important} +**All** devices must be connected to the **same network**: the IoT box, the device(s) connected +to the IoT box, and the computer connected to Odoo. +::: + +(iot-iot-box-network-ethernet)= + +### Ethernet + +Plug the Ethernet cable into the IoT box's Ethernet port and an available port on your router, then +connect the IoT box to a power source. + +(iot-iot-box-network-wifi)= + +### Wi-Fi + +Make sure no Ethernet cable is connected to the IoT box and follow these steps: + +> 1. Connect the IoT box to a power source and wait a few minutes for it to power on. +> +> 2. Access your computer's Wi-Fi settings and select the IoT box's network. The network name is in +> the format `IoTBox-xxxxxxxxxxxx` (where `xxxxxxxxxxxx` is a unique identifier). +> +> 3. Connect to the IoT box's Wi-Fi network and sign into it; your browser should automatically +> open and redirect to the {ref}`IoT box's homepage `. +> +> :::{note} +> Depending on your operating system, the browser might not open and redirect to the IoT box's +> homepage. In this case, open your browser manually and navigate to `http://10.11.12.1`. +> ::: +> +> 4. On the IoT box's homepage, click {guilabel}`Configure` next to the {guilabel}`Internet Status` +> section. +> +> 5. Wait a few minutes for the available networks to be scanned, select the network, enter the +> Wi-Fi's password, and click {guilabel}`Connect`. + +:::{note} +Once connected to the Wi-Fi network, the IoT box stops emitting its Wi-Fi signal, and the +computer should automatically reconnect to its original network. If it does not, reconnect to it +manually. +::: + +(iot-iot-box-homepage)= + +## IoT box homepage + +To access the IoT box's homepage, open a web browser **on the same network as the IoT box** and +navigate to the IoT box's IP address. + +```{image} iot_box/iot-homepage.png +:alt: IoT box's homepage +:scale: 75% +``` + +The IoT box's IP address can be retrieved by: + +- connecting the IoT box to an external monitor: the IP address is displayed on the screen. + + ```{image} iot_box/iot-pos-display.png + :alt: POS display with IoT box's IP address + :scale: 75% + ``` + +- connecting the IoT box to a printer: the IP address is automatically printed. + +- accessing the administrator interface of the router to which the IoT box is connected or using + third-party software to scan the network. + +Once the IoT box is {doc}`connected to the Odoo database `, its homepage can be accessed +from Odoo by opening the IoT app and clicking the URL displayed on the IoT box's card. + diff --git a/content/applications/general/iot/windows_iot.md b/content/applications/general/iot/windows_iot.md new file mode 100644 index 000000000..00082fc33 --- /dev/null +++ b/content/applications/general/iot/windows_iot.md @@ -0,0 +1,188 @@ +# Windows virtual IoT + +To start using the Windows virtual IoT: + +1. Make sure all {ref}`prerequisites ` are met. +2. {ref}`Install the Windows virtual IoT ` on a Windows computer. +3. {ref}`Configure the Windows Firewall `. +4. Connect your {doc}`devices ` to the Windows virtual IoT. +5. {doc}`Connect the Windows virtual IoT to your Odoo database `. + +(iot-windows-iot-prerequisites)= + +## Prerequisites + +The following prerequisites must be met before setting up and using the Windows virtual IoT: + +- A valid {ref}`IoT box subscription `. +- An updated and recent version of Windows (i.e., Windows 10 or Windows 11) installed on a Windows + computer (laptop, desktop, or server). + +:::{note} +- {abbr}`MRP (Material Requirement Planning)` devices, including cameras and measurement tools, + are not compatible with Windows virtual IoT. +- It is also possible to create a Windows Virtual Machine on a MacOS/Linux computer. However, + this option is not supported by Odoo, and no troubleshooting assistance will be provided. +::: + +(iot-windows-iot-installation)= + +## Installation + +To install the Windows virtual IoT on a Windows computer: + +01. Access [Odoo's download page](https://odoo.com/download) and download the Odoo installation + package for Windows **matching your database's version**. + +02. Open the downloaded {file}`.exe` file, allow the app to make changes to your device, select + a language, and click {guilabel}`OK`. + +03. Click {guilabel}`Next`, then {guilabel}`I Agree` to accept the terms and conditions and continue. + +04. 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. + +05. Verify you have the required space on your computer and click {guilabel}`Next`. + +06. In the {guilabel}`Destination folder`, enter C:\\odoo and click {guilabel}`Install`. + + :::{warning} + 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`. + ::: + +07. Once the installation is complete, click {guilabel}`Next`. + +08. Set up GPL Ghostscript: Click {guilabel}`Next`, agree to the terms and conditions, click + {guilabel}`Install`, then {guilabel}`Finish`. + +09. Click {guilabel}`Next`, {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. + ::: + +10. Check that you can access the {ref}`IoT system's homepage ` in a web + browser: + + - on the Windows virtual IoT computer, and + + - on another device **on the same network as the IoT system** by navigating to the URL + `http://xxx:8069` (where `xxx` is the IoT system's IP address). + + - on another device **on the same network as the IoT system** by navigating to the URL + `https://xxx` (where `xxx` is the IoT system's IP address) to test for {doc}`HTTPS + ` connection. + + :::{tip} + If you cannot access the {ref}`IoT system's homepage ` from + another device, create a {ref}`Windows Firewall ` rule to allow + communication through port `8069`. + ::: + +(iot-windows-iot-firewall)= + +## Windows Firewall configuration + +Firewalls help keep devices secure but can sometimes block legitimate connections. If the Windows +virtual IoT isn't accessible on the {abbr}`LAN (Local Area Network)`, for example from another +device, it could be due to a firewall blocking the connection. To prevent this issue, configure +exceptions for network discovery in the {abbr}`OS (Operating System)` or firewall settings. + +:::{note} +If third-party firewall software is installed on the Windows computer, refer to the software's +documentation to configure firewall exceptions. +::: + +To create a rule on Windows Defender and allow communication through port `8069`, follow these +steps: + +1. Search the Windows start menu for `firewall` and select the {guilabel}`Windows Defender Firewall + with Advanced Security` app. + +2. In the left part of the window, select {guilabel}`Inbound Rules`. + +3. In the right part of the window, under {guilabel}`Actions`, click {guilabel}`New Rule`. + +4. In the {guilabel}`New Inbound Rule Wizard` that opens, select the {guilabel}`Port` type of rule + and click {guilabel}`Next`. + +5. On the {guilabel}`Protocols and Ports` page, make sure {guilabel}`TCP` and {guilabel}`Specified + local ports` are selected, enter the following in the field: `8069, 80, 443`, and click + {guilabel}`Next`. + + :::{note} + Other ports may be necessary depending on your IoT devices. For example, for the + {doc}`/applications/sales/point_of_sale/payment_methods/terminals/worldline` payment terminal, + add the `9050` port. + ::: + +6. On the {guilabel}`Action` page, select {guilabel}`Allow the connection` and click + {guilabel}`Next`. + +7. On the {guilabel}`Profile` page, disable any connection type(s) that don't apply to your + Windows computer and click {guilabel}`Next`. + +8. On the {guilabel}`Name` page, provide a {guilabel}`Name` (e.g., `Odoo`) and, optionally, a brief + {guilabel}`Description`, then click {guilabel}`Finish`. + +:::{seealso} +[Windows Firewall rules documentation](https://learn.microsoft.com/en-us/windows/security/operating-system-security/network-security/windows-firewall/rules) +::: + +(iot-windows-iot-homepage)= + +## Windows virtual IoT homepage + +To access the Windows virtual IoT's homepage, navigate to the URL `http://localhost:8069` on the +Windows virtual IoT computer or open a web browser from another computer **on the same network as +the IoT system** and navigate to the URL `http://xxx:8069` (where `xxx` is the IoT system's IP +address). + +Once the Windows virtual IoT is {doc}`connected to the Odoo database `, its homepage can +be accessed from Odoo by opening the IoT app and clicking the URL displayed on the IoT system's +card. + +```{image} windows_iot/iot-windows-homepage.png +:alt: Windows virtual IoT's homepage +:scale: 75% +``` + +:::{note} +Make sure the {ref}`Windows Firewall is configured ` to allow access. +::: + +## Device connection + +Most {doc}`devices ` automatically connect to the Windows computer used for the Windows +Virtual IoT through [Windows Plug and Play (PnP)](https://learn.microsoft.com/en-us/windows-hardware/drivers/kernel/introduction-to-plug-and-play). +However, if Windows does not recognize the device automatically upon connection, the administrator +may need to manually install the appropriate drivers. + +:::{tip} +After connecting the devices to the computer, refresh the {ref}`IoT system's homepage +` to verify that the device is listed. If the device does not appear, +{ref}`reload the handlers ` from the {ref}`IoT system's homepage +`. +::: + +(iot-windows-iot-restart)= + +## Windows virtual IoT restart + +To manually restart the Windows IoT server, search the Windows start menu for `services` and +select the {guilabel}`Services` app. Scroll down to the {guilabel}`odoo-server-xxx` service (where +`xxx` is the odoo version), right-click it, and select {guilabel}`Start` or {guilabel}`Restart`. + +(iot-windows-iot-uninstall)= + +## Windows virtual IoT uninstall + +To uninstall the Windows virtual IoT, [uninstall](https://support.microsoft.com/en-us/windows/uninstall-or-remove-apps-and-programs-in-windows-4b55f974-2cc6-2d2b-d092-5905080eaf98#ID0EBD=Windows_11) +the Odoo program on your Windows computer. Confirm the uninstallation and complete the steps in the +{guilabel}`Odoo Uninstall` dialog. + diff --git a/content/applications/general/multi_company.md b/content/applications/general/multi_company.md new file mode 100644 index 000000000..ef111fef8 --- /dev/null +++ b/content/applications/general/multi_company.md @@ -0,0 +1,134 @@ +--- +substitutions: + mcd: multi-company database +--- + +# Multi-company + +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](https://www.odoo.com/pricing-plan) 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. + +```{eval-rst} +.. 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/users.md b/content/applications/general/users.md new file mode 100644 index 000000000..d887a090c --- /dev/null +++ b/content/applications/general/users.md @@ -0,0 +1,274 @@ +--- +show-content: true +--- + +# Users + +Odoo defines a *user* as someone who has access to a database. An administrator can add as many +users as the company needs and, in order to restrict the type of information each user can access, +rules can be applied to each user. Users and access rights can be added and changed at any point. + +:::{seealso} +- {doc}`users/language` +- {doc}`users/access_rights` +- {ref}`access-rights/superuser` +- {ref}`access-rights/groups` +::: + +(users-add-individual)= + +## Add individual users + +To add new users, navigate to {menuselection}`Settings app --> Users section --> Manage Users`, and +click on {guilabel}`New`. + +```{image} users/manage-users.png +:align: center +:alt: View of the settings page emphasizing the manage users field in Odoo. +``` + +Fill in the form with all the required information. Under the {doc}`Access Rights +` tab, choose the group within each application the user can have access to. + +The list of applications shown is based on the applications installed on the database. + +```{image} users/new-user.png +:align: center +:alt: View of a user's form emphasizing the access rights tab in Odoo. +``` + +After filling out all the necessary fields on the page, manually {guilabel}`Save`. An invitation +email is automatically sent to the user, using the email in the {guilabel}`Email Address` field. The +user must click on the link included in the email to accept the invitation, and to create a database +login. + +```{image} users/invitation-email.png +:align: center +:alt: View of a user's form with a notification that the invitation email has been +: sent in Odoo. +``` + +:::{warning} +If the company is on a monthly subscription plan, the database automatically updates to reflect +the added users. If the company is on a yearly or multi-year plan, an expiration banner appears +in the database. An upsell quotation can be created by clicking the banner to update the +subscription. Alternatively, [send a support ticket](https://www.odoo.com/help) to resolve the +issue. +::: + +### User type + +{guilabel}`User Type` can be selected from the {guilabel}`Access Rights` tab of the user form, +accessible via {menuselection}`Settings app --> Users section --> Manage Users`. + +There are three types of users: {guilabel}`Internal User`, {guilabel}`Portal`, and +{guilabel}`Public`. + +```{image} users/user-type.png +:align: center +:alt: View of a user's form in developer mode emphasizing the user type field in Odoo. +``` + +:::{tip} +Users are considered internal database users. Portal users are external users, who only have +access to the database portal to view records. See the documentation on {doc}`users/portal`. + +Public users are those visiting websites, via the website's frontend. +::: + +The {guilabel}`Portal` and {guilabel}`Public` user options do **not** allow the administrator to +choose access rights. These users have specific access rights pre-set (such as, record rules and +restricted menus), and usually do not belong to the usual Odoo groups. + +(users-deactivate)= + +## Deactivate users + +To deactivate (i.e. archive) a user, navigate to {menuselection}`Settings app --> Users section --> +Manage Users`. Then, tick the checkbox to the left of the user(s) to be deactivated. + +After selecting the appropriate user to be archived, click the {guilabel}`⚙️ Actions` icon, and +select {guilabel}`Archive` from the resulting drop-down menu. Then, click {guilabel}`OK` from the +{guilabel}`Confirmation` pop-up window that appears. + +:::{danger} +**Never** deactivate the main/administrator user (admin). Making changes to admin users can have +a detrimental impact on the database. This includes *impotent admin*, which means that no user in +the database can make changes to the access rights. For this reason, Odoo recommends contacting +an Odoo Business Analyst, or our Support Team, before making changes. +::: + +### Error: too many users + +If there are more users in an Odoo database than provisioned in the Odoo Enterprise subscription, +the following message is displayed. + +```{image} users/add-more-users.png +:align: center +:alt: Too many users on a database error message. +``` + +When the message appears, the database administrator has 30 days to act before the database expires. +The countdown is updated every day. + +To resolve the issue, either: + +- Add more users to the subscription by clicking the {guilabel}`Upgrade your subscription` link + displayed in the message to validate the upsell quotation, and pay for the extra users. +- {ref}`Deactivate users `, and reject the upsell quotation. + +:::{warning} +If the company is on a monthly subscription plan, the database automatically updates to reflect +the added users. If the company is on a yearly or multi-year plan, an expiration banner appears +in the database. An upsell quotation can be created by clicking the banner to update the +subscription. Alternatively, users can [send a support ticket](https://www.odoo.com/help) to +resolve the issue. +::: + +Once the database has the correct number of users, the expiration message disappears automatically +after a few days, when the next verification occurs. + +(users-passwords-management)= + +## Password management + +Password management is an important part of granting users autonomous access to the database at all +times. Odoo offers a few different methods to reset a user's password. + +:::{tip} +Odoo has a setting to specify the length needed for a password. This setting can be accessed by +navigating to {menuselection}`Settings app --> Permissions` section, and entering the desired +password length in the {guilabel}`Minimum Password Length` field. By default the value is `8`. +::: + +```{image} users/minimum-password-length.png +:align: center +:alt: Minimum Password Length highlighted in the Permissions section of General Settings. +``` + +(users-reset-password)= + +### Reset password + +Sometimes, users might wish to reset their personal password for added security, so they are the +only ones with access to the password. Odoo offers two different reset options: one initiated by the +user to reset the password, and another where the administrator triggers a reset. + +(users-reset-password-login)= + +#### Enable password reset from login page + +It is possible to enable/disable password resets directly from the login page. This action is +completed by the individual user, and this setting is enabled by default. + +To change this setting, go to {menuselection}`Settings app --> Permissions` section, activate +{guilabel}`Password Reset`, and then click {guilabel}`Save`. + +```{image} users/password-reset-login.png +:align: center +:alt: Enabling Password Reset in Odoo Settings +``` + +On the login page, click {guilabel}`Reset Password` to initiate the password reset process, and have +a reset-token sent to the email on file. + +```{image} users/password-reset.png +:align: center +:alt: Login screen on Odoo.com with the password reset option highlighted. +``` + +(users-reset-password-email)= + +#### Send reset instructions + +Go to {menuselection}`Settings app --> Users & Companies --> Users`, select the user from the list, +and click on {guilabel}`Send Password Reset Instructions` on the user form. An email is +automatically sent to them with password reset instructions. + +:::{note} +The {guilabel}`Send Password Reset Instructions` button **only** appears if the Odoo invitation +email has already been confirmed by the user. Otherwise, a {guilabel}`Re-send Invitation Email` +button appears. +::: + +This email contains all the instructions needed to reset the password, along with a link redirecting +the user to an Odoo login page. + +```{image} users/password-reset-email.png +:align: center +:alt: Example of an email with a password reset link for an Odoo account. +``` + +(users-change-password)= + +### Change user password + +Go to {menuselection}`Settings app --> Users & Companies --> Users`, and select a user to access its +form. Click on the {guilabel}`⚙️ Actions` icon, and select {guilabel}`Change Password` from, the +resulting drop-down menu. Enter a new password in the {guilabel}`New Password` column of the +{guilabel}`Change Password` pop-up window that appears, and confirm the change by clicking +{guilabel}`Change Password`. + +```{image} users/change-password.png +:align: center +:alt: Change a user's password on Odoo. +``` + +:::{note} +This operation only modifies the password of the users locally, and does **not** affect their +odoo.com account. + +If the odoo.com password needs to be changed, use the {ref}`send the password reset instructions +`. Odoo.com passwords grant access to the *My Databases* page, and +other portal features. +::: + +After clicking {guilabel}`Change Password`, the page is redirected to an Odoo login page where the +database can be re-accessed using the new password. + +(users-multi-companies)= + +## Multi Companies + +The {guilabel}`Multi Companies` field on a user form allows an administrator to provide access to +multiple companies for users. To configure a multi-company environment for a user, navigate to the +desired user by going to: {menuselection}`Settings app --> Users section --> Manage users`. Then, +select the user to open their user form, and configure with multi-company access. + +Under {guilabel}`Multi Companies` in the {guilabel}`Access Rights` tab, set the fields labeled +{guilabel}`Allowed Companies` and {guilabel}`Default Company`. + +The {guilabel}`Allowed Companies` field can contain multiple companies. These are the companies the +user can access and edit, according to the set access rights. The {guilabel}`Default Company` is the +company the user defaults to, upon logging in each time. This field can contain only **one** +company. + +:::{warning} +If multi-company access is not configured correctly, it could lead to inconsistent multi-company +behaviors. Because of this, only experienced Odoo users should make access rights changes to +users for databases with a multi-company configuration. For technical explanations, refer to the +developer documentation on {doc}`../../../developer/howtos/company`. +::: + +```{image} users/multi-companies.png +:align: center +:alt: View of a user's form emphasizing the multi companies field in Odoo. +``` + +:::{seealso} +{doc}`companies` +::: + +```{toctree} +:titlesonly: true + +users/language +users/2fa +users/access_rights +users/portal +users/facebook +users/google +users/azure +users/ldap +``` + diff --git a/content/applications/general/users/2fa.md b/content/applications/general/users/2fa.md new file mode 100644 index 000000000..6023e83fe --- /dev/null +++ b/content/applications/general/users/2fa.md @@ -0,0 +1,135 @@ +--- +substitutions: + 2fa: '{abbr}`2FA (two-factor authentication)`' + QR: '{abbr}`QR (Quick Response)` code' +--- + +# Two-factor authentication + +*Two-factor authentication (2FA)* is a way to improve security, and prevent unauthorized persons +from accessing user accounts. + +Practically, {{ 2fa }} means storing a secret inside an *authenticator*, usually on a mobile phone, and +exchanging a code from the authenticator when trying to log in. + +This means an unauthorized user would need to guess the account password *and* have access to the +authenticator, which is a more difficult proposition. + +## Requirements + +:::{important} +These lists are just examples. They are **not** endorsements of any specific software. +::: + +Phone-based authenticators are the easiest and most commonly used. Examples include: + +- [Authy](https://authy.com/) +- [FreeOTP](https://freeotp.github.io/) +- [Google Authenticator](https://support.google.com/accounts/answer/1066447?hl=en) +- [LastPass Authenticator](https://lastpass.com/auth/) +- [Microsoft Authenticator](https://www.microsoft.com/en-gb/account/authenticator?cmp=h66ftb_42hbak) + +Password managers are another option. Common examples include: + +- [1Password](https://support.1password.com/one-time-passwords/) +- [Bitwarden](https://bitwarden.com/help/article/authenticator-keys/), + +:::{note} +The remainder of this document uses Google Authenticator as an example, as it is one of the most +commonly used. This is **not** an endorsement of the product. +::: + +## Two-factor authentication setup + +After selecting an authenticator, log in to Odoo, then click the profile avatar in the upper-right +corner, and select {guilabel}`My Profile` from the resulting drop-down menu. + +Click the {guilabel}`Account Security` tab, then slide the {guilabel}`Two-Factor Authentication` +toggle to *active*. + +:::{figure} 2fa/account-security.png +:align: center +::: + +This generates a {guilabel}`Security Control` pop-up window that requires password confirmation to +continue. Enter the appropriate password, then click {guilabel}`Confirm Password`. Next, a +{guilabel}`Two-Factor Authentication Activation` pop-up window appears, with a {{ QR }}. + +:::{figure} 2fa/qr-code.png +:align: center +::: + +Using the desired authenticator application, scan the {{ QR }} when prompted. + +::::{tip} +If scanning the screen is not possible (e.g. the setup is being completed on the *same* device as +the authenticator application), clicking the provided {guilabel}`Cannot scan it?` link, or +copying the secret to manually set up the authenticator, is an alternative. + +:::{figure} 2fa/secret-visible.png +:align: center +::: + +:::{figure} 2fa/input-secret.png +:align: center +::: +:::: + +Afterwards, the authenticator should display a *verification code*. + +:::{figure} 2fa/authenticator.png +:align: center +::: + +Enter the code into the {guilabel}`Verification Code` field, then click {guilabel}`Activate`. + +:::{figure} 2fa/2fa-enabled.png +:align: center +::: + +## Logging in + +To confirm {{ 2fa }} setup is complete, log out of Odoo. + +On the login page, input the username and password, then click {guilabel}`Log in`. On the +{guilabel}`Two-factor Authentication` page, input the code provided by the chosen authenticator in +the {guilabel}`Authentication Code` field, then click {guilabel}`Log in`. + +```{image} 2fa/2fa-login.png +:align: center +:alt: The login page with 2fa enabled. +``` + +:::{danger} +If a user loses access to their authenticator, an administrator **must** deactivate {{ 2fa }} on the +account before the user can log in. +::: + +## Enforce two-factor authentication + +To enforce the use of {{ 2fa }} for all users, first navigate to {menuselection}`Main Odoo Dashboard --> +Apps`. Remove the {guilabel}`Apps` filter from the {guilabel}`Search...` bar, then search for `2FA +by mail`. + +Click {guilabel}`Install` on the Kanban card for the {guilabel}`2FA by mail` module. + +```{image} 2fa/2FA-by-mail.png +:align: center +:alt: The 2FA by mail module in the Apps directory. +``` + +After installation is complete, go to {guilabel}`Settings app: Permissions`. Tick the checkbox +labeled, {guilabel}`Enforce two-factor authentication`. Then, use the radio buttons to choose +whether to apply this setting to {guilabel}`Employees only`, or {guilabel}`All users`. + +:::{note} +Selecting {guilabel}`All users` applies the setting to portal users, in addition to employees. +::: + +```{image} 2fa/enforce-settings.png +:align: center +:alt: The enforce two factor setting in the Settings application. +``` + +Click {guilabel}`Save` to commit any unsaved changes. + diff --git a/content/applications/general/users/access_rights.md b/content/applications/general/users/access_rights.md new file mode 100644 index 000000000..2553c9c56 --- /dev/null +++ b/content/applications/general/users/access_rights.md @@ -0,0 +1,202 @@ +# Access rights + +*Access rights* are permissions that determine the content and applications users can access and +edit. In Odoo, these permissions can be set for individual users or for groups of users. Limiting +permissions to only those who need them ensures that users do not modify or delete anything they +should not have access to. + +**Only** an *administrator* can change access rights. + +:::{danger} +Making changes to access rights can have a detrimental impact on the database. This includes +*impotent admin*, which means that no user in the database can make changes to the access rights. +For this reason, Odoo recommends contacting an Odoo Business Analyst, or our Support Team, before +making changes. +::: + +:::{tip} +A user **must** have the specific *Administration* access rights set on their user profile, in +order to make changes on another user's settings for access rights. + +To access this setting, navigate to {menuselection}`Settings app --> Manage users --> select a +user --> Access Rights tab --> Administration section --> Administration field`. + +Once at the setting, an already existing administrator **must** change the setting in the +{guilabel}`Administration` field to {guilabel}`Access Rights`. + +Once complete, click {guilabel}`Save` to save the changes, and implement the user as an +administrator. +::: + +## Users + +The access rights for {ref}`individual users ` are set when the user is added +to the database, but they can be adjusted at any point in the user's profile. + +To make changes to a user's rights, click on the desired user to edit their profile. + +```{image} access_rights/navigate-to-users-menu.png +:align: center +:alt: Users menu in the Users & Companies section of the Settings app of Odoo. +``` + +On the user's profile page, in the {guilabel}`Access Rights` tab, scroll down to view the current +permissions. + +For each app, use the drop-down menu to select what level of permission this user should have. The +options vary for each section, yet the most common are: {guilabel}`Blank/None`, {guilabel}`User: Own +Documents`, {guilabel}`User: All Documents`, or {guilabel}`Administrator`. + +The {guilabel}`Administration` field in the {guilabel}`Access Rights` tab has the following options: +{guilabel}`Settings` or {guilabel}`Access Rights`. + +```{image} access_rights/user-permissions-dropdown-menu.png +:align: center +:alt: The Sales apps drop-down menu to set the user's level of permissions. +``` + +(access-rights-groups)= + +## Create and modify groups + +*Groups* are app-specific sets of permissions that are used to manage common access rights for a +large amount of users. Administrators can modify the existing groups in Odoo, or create new ones to +define rules for models within an application. + +To access groups, first activate Odoo's {ref}`developer mode `, then go to +{menuselection}`Settings app --> Users & Companies --> Groups`. + +```{image} access_rights/click-users-and-companies.png +:align: center +:alt: Groups menu in the Users & Companies section of the Settings app of Odoo. +``` + +To create a new group from the {guilabel}`Groups` page, click {guilabel}`Create`. Then, from the +blank group form, select an {guilabel}`Application`, and complete the group form (detailed below). + +To modify existing groups, click on an existing group from the list displayed on the +{guilabel}`Groups` page, and edit the contents of the form. + +Enter a {guilabel}`Name` for the group and tick the checkbox next to {guilabel}`Share Group`, if +this group was created to set access rights for sharing data with some users. + +:::{important} +Always test the settings being changed to ensure they are being applied to the correct users. +::: + +The group form contains multiple tabs for managing all elements of the group. In each tab, click +{guilabel}`Add a line` to add a new row for users or rules, and click the {guilabel}`❌ (remove)` +icon to remove a row. + +```{image} access_rights/groups-form.png +:align: center +:alt: Tabs in the Groups form to modify the settings of the group. +``` + +- {guilabel}`Users` tab: lists the current users in the group. Users listed in black have + administrative rights. Users without administrative access appear in blue. Click {guilabel}`Add a + line` to add users to this group. + +- {guilabel}`Inherited` tab: inherited means that users added to this group are automatically added + to the groups listed on this tab. Click {guilabel}`Add a line` to add inherited groups. + + ```{eval-rst} + .. example:: + For example, if the group *Sales/Administrator* lists the group *Website/Restricted Editor* in + its :guilabel:`Inherited` tab, then any users added to the *Sales/Administrator* group + automatically receive access to the *Website/Restricted Editor* group, as well. + ``` + +- {guilabel}`Menus` tab: defines which menus/models the group can have access to. Click + {guilabel}`Add a line` to add a specific menu. + +- {guilabel}`Views` tab: lists which views in Odoo the group has access to. Click {guilabel}`Add a + line` to add a view to the group. + +- {guilabel}`Access Rights` tab: lists the first level of rights (models) that this group has access + rights to. Click {guilabel}`Add a line` to link access rights to this group. In this tab, the + {guilabel}`Model` column represents the common name of the menu/model, and the {guilabel}`Name` + column represents the technical name given to the model. For each model, enable the following + options as appropriate: + + - {guilabel}`Read`: users can see the object's existing values. + - {guilabel}`Write`: users can edit the object's existing values. + - {guilabel}`Create`: users can create new values for the object. + - {guilabel}`Delete`: users can delete values for the object. + + :::{tip} + First try searching for the common name of the model in the drop-down menu of the + {guilabel}`Model` column. The {guilabel}`Model` technical name can be found by expanding the + model common name, which can be done by clicking the {guilabel}`(external link)` icon. + + The model technical name can also be accessed in {ref}`developer mode `. + + On a form, navigate to any field, and hover over the field name. A box of backend information + reveals itself with the specific Odoo {guilabel}`Model` name in the backend. This is the + technical name of the model that should be added. + + ```{image} access_rights/technical-info.png + :align: center + :alt: Technical information shown on a field of a model, with object highlighted. + ``` + ::: + +- {guilabel}`Record Rules`: lists the second layer of editing and visibility rights. + {guilabel}`Record Rules` overwrite, or refine, the group's access rights. Click {guilabel}`Add a + line` to add a record rule to this group. For each rule, choose values for the following options: + + - {guilabel}`Apply for Read`. + - {guilabel}`Apply for Write`. + - {guilabel}`Apply for Create`. + - {guilabel}`Apply for Delete`. + + :::{important} + Record rules are written using a *domain*, or conditions that filter data. A domain expression + is a list of such conditions. For example: + + `[('mrp_production_ids', 'in', user.partner_id.commercial_partner_id.production_ids.ids)]` + + This record rule is to enable MRP consumption warnings for subcontractors. + + Odoo has a library of preconfigured record rules for ease of use. Users without knowledge of + domains (and domain expressions) should consult an Odoo Business Analyst, or the Odoo Support + Team, before making changes. + ::: + +(access-rights-superuser)= + +## Superuser mode + +*Superuser mode* allows the user to bypass record rules and access rights. To activate *Superuser +mode*, first, activate {ref}`developer mode `. Then, navigate to the *debug* menu, +represented by a {guilabel}`🪲 (bug)` icon, located in the top banner. + +Finally, towards the bottom of the menu, click {guilabel}`Become Superuser`. + +:::{important} +Only users with *Settings* access for the *Administration* section of the *Access Rights* (in +their user profile) are allowed to log in to *Superuser mode*. +::: + +:::{danger} +*Superuser mode* allows for circumvention of record rules and access rights, and therefore, +should be exercised with extreme caution. + +Upon exiting *Superuser mode*, users may be locked out of the database, due to changes that were +made. This can cause *impotent admin*, or an administrator without the ability to change access +rights/settings. + +In this case contact Odoo Support here: [new help ticket](https://www.odoo.com/help). The +support team is able to restore access using a support login. +::: + +To leave *Superuser mode*, log out of the account, by navigating to the upper-right corner, and +clicking on the {guilabel}`OdooBot` username. Then, select the {guilabel}`Log out` option. + +:::{tip} +An alternative way to activate *Superuser mode* is to login as a superuser. To do that, navigate +to the login screen, and enter the appropriate {guilabel}`Email` and {guilabel}`Password`. + +Instead of clicking {guilabel}`Login`, click {guilabel}`Log in as superuser`. +::: + diff --git a/content/applications/general/users/azure.md b/content/applications/general/users/azure.md new file mode 100644 index 000000000..9d7dec8f4 --- /dev/null +++ b/content/applications/general/users/azure.md @@ -0,0 +1,184 @@ +# Microsoft Azure sign-in authentication + +The Microsoft Azure OAuth sign-in authentication is a useful function that allows Odoo users to sign +in to their database with their Microsoft Azure account. + +This is particularly helpful if the organization uses Azure Workspace, and wants employees within +the organization to connect to Odoo using their Microsoft Accounts. + +:::{warning} +Databases hosted on Odoo.com should not use OAuth login for the owner or administrator of the +database as it would unlink the database from their Odoo.com account. If OAuth is set up for that +user, the database will no longer be able to be duplicated, renamed, or otherwise managed from +the Odoo.com portal. +::: + +:::{seealso} +- {doc}`../../productivity/calendar/outlook` +- {doc}`../email_communication/azure_oauth` +::: + +## Configuration + +Integrating the Microsoft sign-in function requires configuration on Microsoft and Odoo. + +### Odoo System Parameter + +First activate the {ref}`developer mode `, and then go to {menuselection}`Settings +--> Technical --> System Parameters`. + +Click {guilabel}`Create` and on the new/blank form that appears, add the following system parameter +`auth_oauth.authorization_header` to the {guilabel}`Key` field, and set the {guilabel}`Value` to +`1`. Then click {guilabel}`Save` to finish. + +### Microsoft Azure dashboard + +#### Create a new application + +Now that the system parameters in Odoo have been set up, it's time to create a corresponding +application inside of Microsoft Azure. To get started creating the new application, go to +[Microsoft's Azure Portal](https://portal.azure.com/). Log in with the {guilabel}`Microsoft +Outlook Office 365` account if there is one, otherwise, log in with a personal {guilabel}`Microsoft +account`. + +:::{important} +A user with administrative access to the *Azure Settings* must connect and perform the following +configuration steps below. +::: + +Next, navigate to the section labeled {guilabel}`Manage Microsoft Entra ID` (formally *Azure Active +Directory*). The location of this link is usually in the center of the page. + +Now, click on the {guilabel}`Add (+)` icon, located in the top menu, and then select {guilabel}`App +registration` from the drop-down menu. On the {guilabel}`Register an application` screen, rename the +{guilabel}`Name` field to `Odoo Login OAuth` or a similarly recognizable title. Under the +{guilabel}`Supported account types` section select the option for {guilabel}`Accounts in this +organizational directory only (Default Directory only - Single tenant)`. + +:::{warning} +The {guilabel}`Supported account types` can vary by Microsoft account type and end use of the +OAuth. For example: Is the login meant for internal users within one organization or is it meant +for customer portal access? The above configuration is used for internal users in an +organization. + +Choose {guilabel}`Personal Microsoft accounts only` if the target audience is meant for portal +users. Choose {guilabel}`Accounts in this organizational directory only (Default Directory only - +Single tenant)` if the target audience is company users. +::: + +Under the {guilabel}`Redirect URL` section, select {guilabel}`Web` as the platform, and then input +`https:///auth_oauth/signin` in the {guilabel}`URL` field. The Odoo base {abbr}`URL +(Uniform Resource Locator)` is the canonical domain at which your Odoo instance can be reached (e.g. +*mydatabase.odoo.com* if you are hosted on Odoo.com) in the {guilabel}`URL` field. Then, click +{guilabel}`Register`, and the application is created. + +#### Authentication + +Edit the new app's authentication by clicking on the {guilabel}`Authentication` menu item in the +left menu after being redirected to the application's settings from the previous step. + +Next, the type of *tokens* needed for the OAuth authentication will be chosen. These are not +currency tokens but rather authentication tokens that are passed between Microsoft and Odoo. +Therefore, there is no cost for these tokens; they are used merely for authentication purposes +between two {abbr}`APIs (application programming interfaces)`. Select the tokens that should be +issued by the authorization endpoint by scrolling down the screen and check the boxes labeled: +{guilabel}`Access tokens (used for implicit flows)` and {guilabel}`ID tokens (used for implicit and +hybrid flows)`. + +```{image} azure/authentication-tokens.png +:align: center +:alt: Authentication settings and endpoint tokens. +``` + +Click {guilabel}`Save` to ensure these settings are saved. + +#### Gather credentials + +With the application created and authenticated in the Microsoft Azure console, credentials will be +gathered next. To do so, click on the {guilabel}`Overview` menu item in the left-hand column. Select +and copy the {guilabel}`Application (client) ID` in the window that appears. Paste this credential +to a clipboard / notepad, as this credential will be used in the Odoo configuration later. + +After finishing this step, click on {guilabel}`Endpoints` on the top menu and click the *copy icon* +next to {guilabel}`OAuth 2.0 authorization endpoint (v2)` field. Paste this value in the clipboard / +notepad. + +```{image} azure/overview-azure-app.png +:align: center +:alt: Application ID and OAuth 2.0 authorization endpoint (v2) credentials. +``` + +### Odoo setup + +Finally, the last step in the Microsoft Azure OAuth configuration is to configure some settings in +Odoo. Navigate to {menuselection}`Settings --> Integrations --> OAuth Authentication` and check the +box to activate the OAuth login feature. Click {guilabel}`Save` to ensure the progress is saved. +Then, sign in to the database once the login screen loads. + +Once again, navigate to {menuselection}`Settings --> Integrations --> OAuth Authentication` and +click on {guilabel}`OAuth Providers`. Now, select {guilabel}`New` in the upper-left corner and name +the provider `Azure`. + +Paste the {guilabel}`Application (client) ID` from the previous section into the {guilabel}`Client +ID` field. After completing this, paste the new {guilabel}`OAuth 2.0 authorization endpoint (v2)` +value into the {guilabel}`Authorization URL` field. + +For the {guilabel}`UserInfo URL` field, paste the following {abbr}`URL (Uniform Resource Locator)`: +`https://graph.microsoft.com/oidc/userinfo` + +In the {guilabel}`Scope` field, paste the following value: `openid profile email`. Next, the Windows +logo can be used as the CSS class on the login screen by entering the following value: `fa fa-fw +fa-windows`, in the {guilabel}`CSS class` field. + +Check the box next to the {guilabel}`Allowed` field to enable the OAuth provider. Finally, add +`Microsoft Azure` to the {guilabel}`Login button label` field. This text will appear next to the +Windows logo on the login page. + +```{image} azure/odoo-provider-settings.png +:align: center +:alt: Odoo provider setup in the Settings application. +``` + +{guilabel}`Save` the changes to complete the OAuth authentication setup in Odoo. + +### User experience flows + +For a user to log in to Odoo using Microsoft Azure, the user must be on the {menuselection}`Odoo +password reset page`. This is the only way that Odoo is able to link the Microsoft Azure account and +allow the user to log in. + +:::{note} +Existing users must {ref}`reset their password ` to access the +{menuselection}`Odoo password reset page`. New Odoo users must click the new user invitation link +that was sent via email, then click on {guilabel}`Microsoft Azure`. Users should not set a new +password. +::: + +To sign in to Odoo for the first time using the Microsoft Azure OAuth provider, navigate to the +{menuselection}`Odoo password reset page` (using the new user invitation link). A password reset +page should appear. Then, click on the option labeled {guilabel}`Microsoft Azure`. The page will +redirect to the Microsoft login page. + +```{image} azure/odoo-login.png +:align: center +:alt: Microsoft Outlook login page. +``` + +Enter the {guilabel}`Microsoft Email Address` and click {guilabel}`Next`. Follow the process to sign +in to the account. Should {abbr}`2FA (Two Factor Authentication)` be turned on, then an extra step +may be required. + +```{image} azure/login-next.png +:align: center +:alt: Enter Microsoft login credentials. +``` + +Finally, after logging in to the account, the page will redirect to a permissions page where the +user will be prompted to {guilabel}`Accept` the conditions that the Odoo application will access +their Microsoft information. + +```{image} azure/accept-access.png +:align: center +:alt: Accept Microsoft conditions for permission access to your account information. +``` + diff --git a/content/applications/general/users/facebook.md b/content/applications/general/users/facebook.md new file mode 100644 index 000000000..17d5c11e9 --- /dev/null +++ b/content/applications/general/users/facebook.md @@ -0,0 +1,136 @@ +# Facebook sign-in authentication + +The *Facebook* OAuth sign-in function allows Odoo users to sign in to their database with their +Facebook account. + +:::{danger} +Databases housed on Odoo.com should **not** use OAuth login for the owner or administrator of the +database, as it would unlink the database from their Odoo.com account. If OAuth is setup for +that user, the database can no longer be duplicated, renamed, or otherwise managed from the +Odoo.com portal. +::: + +## Meta for Developers setup + +Go to [Meta for Developers](https://developers.facebook.com/) and log in. Click {guilabel}`My +Apps`. On the {guilabel}`Apps` page, click {guilabel}`Create App`. + +On the {guilabel}`Use cases` page, select {guilabel}`Authenticate and request data from users with +Facebook Login`, then click {guilabel}`Next`. + +In the {guilabel}`Add an app name` field, enter `Odoo Login OAuth`, or a similar title. + +:::{note} +The {guilabel}`App contact email` automatically defaults to the email address associated with the +Meta account. If this email address is not regularly monitored, it may be wise to use another +email address. +::: + +Click {guilabel}`Next`. Review the {guilabel}`Publishing requirements`, the {guilabel}`Meta +Platform Terms`, and {guilabel}`Developer Policies`. Then, click {guilabel}`Create app`. + +:::{important} +Clicking {guilabel}`Create app` may require password re-entry. +::: + +### Customize app + +After the new app is created, the {guilabel}`Dashboard` page appears, with a list of steps to be +completed before the app can be published. From here, click {guilabel}`Customize adding a Facebook +Login button`. + +```{image} facebook/app-requirements.png +:align: center +:alt: The App Dashboard in the Meta for developers platform. +``` + +On the {guilabel}`Customize` page, click {guilabel}`Settings`. + +In the {guilabel}`Valid OAuth Redirect URIs` field, enter `https:///auth_oauth/signin`, replacing `` with the URL of the applicable database. + +```{eval-rst} +.. example:: + If a database has the URL `https://example.odoo.com`, the URL + `https://example.odoo.com/auth_oauth/signin` would be entered in the :guilabel:`Valid OAuth + Redirect URIs` field. +``` + +Click {guilabel}`Save changes` when finished. + +### Configure settings + +At the far left of the page, click {menuselection}`App settings --> Basic`. This page contains +additional settings that are required before the app can be submitted for approval. + +In the {guilabel}`Privacy Policy URL` field, enter `https://www.odoo.com/privacy`. + +:::{note} +[https://www.odoo.com/privacy](https://www.odoo.com/privacy) is the default privacy policy for databases hosted on Odoo.com. +::: + +Click the {guilabel}`App Icon` field to open a file upload window. From here, select and upload an +app icon. + +In the {guilabel}`User data deletion` field, enter +`https://www.odoo.com/documentation/17.0/administration/odoo_accounts.html`. + +:::{note} +This document provides instructions on how a user can delete their Odoo account. +::: + +Lastly, click the {guilabel}`Category` field, and select {guilabel}`Business and pages` from the +drop-down menu. + +Click {guilabel}`Save changes`. + +```{image} facebook/app-id.png +:align: center +:alt: An exampled of the Basic Settings page in the Meta for developers platform. +``` + +(users-app-id)= + +### Capture app ID + +After the app is created, and approved, select and copy the {guilabel}`App ID`. Paste this +information on a clipboard or notepad file, as it is needed in a later step to complete the setup. + +### Publish + +On the left side of the page, click {guilabel}`Publish`. Depending on the status of the connected +Facebook account, additional verification and testing steps may be required, and are listed on this +page. + +After reviewing the information, click {guilabel}`Publish`. + +:::{seealso} +Additional information regarding Meta App Development, including further details on building, +testing, and use cases, can be found in the [Meta for developers documentation](https://developers.facebook.com/docs/development). +::: + +## Odoo setup + +First, activate {ref}`Developer mode `. + +Navigate to the {menuselection}`Settings app`, and scroll down to the {guilabel}`Integrations` +section. There, tick the checkbox labeled, {guilabel}`OAuth Authentication`. Click {guilabel}`Save`. + +```{image} facebook/enable-oauth.png +:align: center +:alt: The enable OAuth setting in the Settings app. +``` + +Then, sign in to the database once the login screen loads. + +After successfully logging in, navigate to {menuselection}`Settings app --> Users & Companies --> +OAuth Providers`. Click {guilabel}`Facebook Graph`. + +In the {guilabel}`Client ID` field, enter the {ref}`App ID ` from the previous +section, then tick the {guilabel}`Allowed` checkbox. + +```{image} facebook/facebook-graph.png +:align: center +:alt: The Facebook Graph record in Odoo. +``` + diff --git a/content/applications/general/users/google.md b/content/applications/general/users/google.md new file mode 100644 index 000000000..08b7e0637 --- /dev/null +++ b/content/applications/general/users/google.md @@ -0,0 +1,175 @@ +# Google Sign-In Authentication + +The *Google Sign-In Authentication* is a useful function that allows Odoo users to sign in to their +database with their Google account. + +This is particularly helpful if the organization uses Google Workspace, and wants employees within +the organization to connect to Odoo using their Google Accounts. + +:::{warning} +Databases hosted on Odoo.com should not use Oauth login for the owner or administrator of the +database as it would unlink the database from their Odoo.com account. If Oauth is set up for that +user, the database will no longer be able to be duplicated, renamed or otherwise managed from +the Odoo.com portal. +::: + +:::{seealso} +- {doc}`/applications/productivity/calendar/google` +- {doc}`../email_communication/google_oauth` +::: + +(google-sign-in-configuration)= + +## Configuration + +The integration of the Google sign-in function requires configuration both on Google *and* Odoo. + +(google-sign-in-api)= + +### Google API Dashboard + +1. Go to the [Google API Dashboard](https://console.developers.google.com/). + +2. Make sure the right project is opened. If there isn't a project yet, click on {guilabel}`Create + Project`, fill out the project name and other details of the company, and click on + {guilabel}`Create`. + + ```{image} google/new-project-details.png + :align: center + :alt: Filling out the details of a new project. + ``` + + :::{tip} + Choose the name of the company from the drop-down menu. + ::: + +(google-sign-in-oauth)= + +#### OAuth consent screen + +1. On the left side menu, click on {menuselection}`OAuth consent screen`. + + ```{image} google/consent-selection.png + :align: center + :alt: Google OAuth consent selection menu. + ``` + +2. Choose one of the options ({guilabel}`Internal` / {guilabel}`External`), and click on + {guilabel}`Create`. + + ```{image} google/consent.png + :align: center + :alt: Choice of a user type in OAuth consent. + ``` + + :::{warning} + *Personal* Gmail Accounts are only allowed to be **External** User Type, which means Google + may require an approval, or for *Scopes* to be added on. However, using a *Google WorkSpace* + account allows for **Internal** User Type to be used. + + Note, as well, that while the API connection is in the *External* testing mode, then no + approval is necessary from Google. User limits in this testing mode is set to 100 users. + ::: + +3. Fill out the required details and domain info, then click on {guilabel}`Save and Continue`. + +4. On the {menuselection}`Scopes` page, leave all fields as is, and click on {guilabel}`Save and + Continue`. + +5. Next, if continuing in testing mode (*External*), add the email addresses being configured under + the {guilabel}`Test users` step by clicking on {guilabel}`Add Users`, and then the + {guilabel}`Save and Continue` button. A summary of the app registration appears. + +6. Finally, scroll to the bottom, and click on {guilabel}`Back to Dashboard`. + +(google-sign-in-credentials)= + +#### Credentials + +1. On the left side menu, click on {menuselection}`Credentials`. + + ```{image} google/credentials-button.png + :align: center + :alt: Credentials button menu. + ``` + +2. Click on {guilabel}`Create Credentials`, and select {guilabel}`OAuth client ID`. + + ```{image} google/client-id.png + :align: center + :alt: OAuth client id selection. + ``` + +3. Select {guilabel}`Web Application` as the {guilabel}`Application Type`. Now, configure the + allowed pages on which Odoo will be redirected. + + In order to achieve this, in the {guilabel}`Authorized redirect URIs` field, enter the database's + domain immediately followed by `/auth_oauth/signin`. For example: + `https://mydomain.odoo.com/auth_oauth/signin`, then click on {guilabel}`Create`. + +4. Now that the *OAuth client* has been created, a screen will appear with the {guilabel}`Client ID` + and {guilabel}`Client Secret`. Copy the {guilabel}`Client ID` for later, as it will be necessary + for the configuration in Odoo, which will be covered in the following steps. + +(google-sign-in-auth-odoo)= + +### Google Authentication on Odoo + +(google-sign-in-client-id)= + +#### Retrieve the Client ID + +Once the previous steps are complete, two keys are generated on the Google API Dashboard: +{guilabel}`Client ID` and {guilabel}`Client Secret`. Copy the {guilabel}`Client ID`. + +```{image} google/secret-ids.png +:align: center +:alt: Google OAuth Client ID generated. +``` + +(google-sign-in-odoo-activation)= + +#### Odoo activation + +1. Go to {menuselection}`Odoo General Settings --> Integrations` and activate {guilabel}`OAuth + Authentication`. + + :::{note} + Odoo may prompt the user to log-in again after this step. + ::: + +2. Go back to {menuselection}`General Settings --> Integrations --> OAuth Authentication`, activate + the selection and {guilabel}`Save`. Next, return to {menuselection}`General Settings --> + Integrations --> Google Authentication` and activate the selection. Then fill out the + {guilabel}`Client ID` with the key from the Google API Dashboard, and {guilabel}`Save`. + + ```{image} google/odoo-client-id.png + :align: center + :alt: Filling out the client id in Odoo settings. + ``` + + :::{note} + Google OAuth2 configuration can also be accessed by clicking on {guilabel}`OAuth Providers` + under the {guilabel}`OAuth Authentication` heading in {menuselection}`Integrations`. + ::: + +(google-sign-in-log-in)= + +## Log in to Odoo with Google + +To link the Google account to the Odoo profile, click on {guilabel}`Log in with Google` when first +logging into Odoo. + +> ```{image} google/first-login.png +> :align: center +> :alt: Reset password screen with "Log in with Google" button. +> ``` + +Existing users must {ref}`reset their password ` to access the +{menuselection}`Reset Password` page, while new users can directly click on {guilabel}`Log in with +Google`, instead of choosing a new password. + +:::{seealso} +- [Google Cloud Platform Console Help - Setting up OAuth 2.0](https://support.google.com/cloud/answer/6158849) +::: + diff --git a/content/applications/general/users/language.md b/content/applications/general/users/language.md new file mode 100644 index 000000000..cedef88c2 --- /dev/null +++ b/content/applications/general/users/language.md @@ -0,0 +1,45 @@ +# Change languages + +You select the language of your database upon its creation. However, you can +{ref}`add ` and {ref}`install ` additional languages to allow users +to manage the database in another language or to +{doc}`translate <../../websites/website/configuration/translate>` your website. + +(language-add)= + +## Add languages + +To download additional languages: + +- either click the profile icon in the upper-right corner, select {menuselection}`My profile`, and + click the {icon}`fa-globe` ({guilabel}`globe`) icon next to the {guilabel}`Language` field; +- or go to the **Settings** app, and click {guilabel}`Add Languages` in the {guilabel}`Languages` + section. + +You can then select the languages you want from the dropdown menu and click {guilabel}`Add`. + +:::{seealso} +{doc}`Translations <../../websites/website/configuration/translate>` +::: + +(language-install)= + +## Change languages + +To select their preferred language, users can click the profile icon in the upper-right corner, go +to {menuselection}`My profile`, and select a {guilabel}`Language` in the dropdown list. + +### Change another user's language + +To change the database language for a user: + +1. Go to the {guilabel}`Settings` app and click {guilabel}`Manage Users` in the {guilabel}`Users` + section. +2. Click on the user whose language you want to change. +3. Go to the {guilabel}`Preferences` tab and select a previously + {ref}`installed language ` from the {guilabel}`Language` dropdown menu. + +:::{note} +Emails and documents will be sent to the user in the selected language. +::: + diff --git a/content/applications/general/users/ldap.md b/content/applications/general/users/ldap.md new file mode 100644 index 000000000..a563afdd0 --- /dev/null +++ b/content/applications/general/users/ldap.md @@ -0,0 +1,52 @@ +# LDAP authentication + +To configure {abbr}`LDAP (Lightweight Directory Access Protocol)` authentication in Odoo: + +1. Open the Settings app, scroll down to the {guilabel}`Integrations` section, and enable + {guilabel}`LDAP Authentication`. + +2. Click {guilabel}`Save`, then go back to the {guilabel}`Integrations` section and click + {guilabel}`LDAP Server`. + +3. In the {guilabel}`Set up your LDAP Server` list, click {guilabel}`New`, then select the required + company in the dropdown list. + +4. In the {guilabel}`Server information` section, enter the server's IP address and port in the + {guilabel}`LDAP server address` and {guilabel}`LDAP Server port` fields, respectively. + +5. Enable {guilabel}`Use TLS` to request secure TLS/SSL encryption when connecting to the LDAP + server, providing the server has StartTLS enabled. + +6. In the {guilabel}`Login information` section, enter the ID and password of the account used to + query the server in the {guilabel}`LDAP binddn` and {guilabel}`LDAP password` fields, + respectively. If the fields are left empty, the server will perform the query anonymously. + +7. In the {guilabel}`Process parameter` section, enter: + + - the LDAP server's name in the {guilabel}`LDAP base` field using LDAP format + (e.g., `dc=example,dc=com`); + - `uid=%s` in the {guilabel}`LDAP filter` field. + +8. In the {guilabel}`User information` section: + + - Enable {guilabel}`Create user` to create a user profile in Odoo the first time someone logs in + using LDAP; + - Select the {guilabel}`User template` to be used to create the new user profiles. If no template + is selected, the administrator's profile is used. + +:::{note} +When using Microsoft Active Directory (AD) for LDAP authentication, if users experience login +issues despite using valid credentials, create a new system parameter to disable referral chasing +in the LDAP client: + +> 1. {ref}`Activate the developer mode. ` +> +> 2. Go to {menuselection}`Settings --> Technical --> System Parameters` and click +> {guilabel}`New`. +> +> 3. Fill in the fields: +> +> - {guilabel}`Key`: `auth_ldap.disable_chase_ref` +> - {guilabel}`Value`: `True` +::: + diff --git a/content/applications/general/users/portal.md b/content/applications/general/users/portal.md new file mode 100644 index 000000000..9a83a5127 --- /dev/null +++ b/content/applications/general/users/portal.md @@ -0,0 +1,174 @@ +# Portal access + +(portal-main)= + +Portal access is given to users who need the ability to view certain documents or information within +an Odoo database. + +Some common use cases for providing portal access include allowing customers to read/view any or all +of the following in Odoo: + +- leads/opportunities +- quotations/sales orders +- purchase orders +- invoices & bills +- projects +- tasks +- timesheets +- tickets +- signatures +- subscriptions + +:::{note} +Portal users only have read/view access, and will not be able to edit any documents in the +database. +::: + +(id1)= + +## Provide portal access to customers + +From the main Odoo dashboard, select the {guilabel}`Contacts` application. If the contact is not yet +created in the database, click on the {guilabel}`Create` button, enter the details of the contact, +and then click {guilabel}`Save`. Otherwise, choose an existing contact, and then click on the +{guilabel}`Action` drop-down menu located at the top-center of the interface. + +```{image} portal/grant-portal-access.png +:align: center +:alt: Use the Contacts application to give portal access to users. +``` + +Then select {guilabel}`Grant portal access`. A pop-up window appears, listing three fields: + +- {guilabel}`Contact`: the recorded name of the contact in the Odoo database +- {guilabel}`Email`: the contact's email address that they will use to log into the portal +- {guilabel}`In Portal`: whether or not the user has portal access + +To grant portal access, first enter the contact's {guilabel}`Email` they will use to log into the +portal. Then, check the box under the {guilabel}`In Portal` column. Optionally, add text to the +invitation message the contact will receive. Then click {guilabel}`Apply` to finish. + +```{image} portal/add-contact-to-portal.png +:align: center +:alt: |- +: An email address and corresponding checkbox for the contact need to be filled in before +: sending a portal invitation. +``` + +An email will be sent to the specified email address, indicating that the contact is now a portal +user for that Odoo database. + +:::{tip} +To grant portal access to multiple users at once, navigate to a company contact, then click +{menuselection}`Action --> Grant portal access` to view a list of all of the company's related +contacts. Check the box under the {guilabel}`In Portal` column for all the contacts that need +portal access, then click {guilabel}`Apply`. +::: + +:::{note} +At any time, portal access can be revoked by navigating to the contact, clicking +{menuselection}`Action --> Grant portal access`, and then unselecting the checkbox under the +{guilabel}`In Portal` column and clicking {guilabel}`Apply`. +::: + +(portal-login)= + +## Change portal username + +There may be times when a portal user wants to change their user login. This can be done by any user +in the database with administrator access rights. The following process outlines the necessary steps +to change the portal user login. + +:::{seealso} +{doc}`See the documentation on setting access rights +`. +::: + +First, navigate to {menuselection}`Settings app --> Users`. Then, under {guilabel}`Filters`, select +{guilabel}`Portal Users`, or select {guilabel}`Add Custom Filter` and set the following +configuration {guilabel}`Groups` > {guilabel}`contains` > `portal`. After making this selection, +search for (and open) the portal user that needs to be edited. + +Next, click {guilabel}`Edit` (if necessary), click into the {guilabel}`Email Address` field, and +proceed to make any necessary changes to this field. The {guilabel}`Email Address` field is used to +log into the Odoo portal. + +:::{note} +Changing the {guilabel}`Email Address` (or login) only changes the *username* on the customer's +portal login. + +In order to change the contact email, this change needs to take place on the contact template in +the *Contacts* app. Alternatively, the customer can change their email directly from the portal, +but the login **cannot** be changed. {ref}`See change customer info `. +::: + +## Customer portal changes + +There may be times when the customer would like to make changes to their contact information, +password/security, or payment information attached to the portal account. This can be performed by +the customer from their portal. The following process is how a customer can change their contact +information. + +(portal-custinfo)= + +### Change customer info + +First enter the username and password (login) into the database login page to access the portal user +account. A portal dashboard will appear upon successfully logging in. Portal documents from the +various installed Odoo applications will appear with the number count of each. + +:::{seealso} +{ref}`Portal access documentation `. +::: + +Next, navigate to the upper-right corner of the portal, and click the {guilabel}`Edit` button, next +to the {guilabel}`Details` section. Then, change the pertinent information, and click +{guilabel}`Confirm`. + +### Change password + +First enter the username and password (login) into the database login page to access the portal user +account. A portal dashboard will appear upon successfully logging in. + +If the customer would like to change their password for portal access, click on the {guilabel}`Edit +Security Settings` link, below the {guilabel}`Account Security` section. Then, make the necessary +changes, by typing in the current {guilabel}`Password`, {guilabel}`New Password`, and verify the new +password. Lastly, click on {guilabel}`Change Password` to complete the password change. + +:::{note} +If a customer would like to change the login, as documented above, contact the Odoo database +point-of-contact. {ref}`See above documentation on changing the portal username `. +::: + +:::{note} +Passwords for portal users and Odoo.com users remain separate, even if the same email address is +used. +::: + +### Add two-factor authentication + +First enter the username and password (login) into the database login page to access the portal user +account. A portal dashboard will appear upon successfully logging in. + +If the customer would like to turn on two-factor authentication (2FA) for portal access, click on +the {guilabel}`Edit Security Settings` link, below the {guilabel}`Account Security` section. + +Click on {guilabel}`Enable two-factor authentication` to turn on {abbr}`2FA (two-factor +authentication)`. Confirm the current portal password in the {guilabel}`Password` field. Then, click +on {guilabel}`Confirm Password`. Next, activate {abbr}`2FA (two-factor authentication)` in a +{abbr}`2FA (two-factor authentication)` app (Google Authenticator, Authy, etc.), by scanning the +{guilabel}`QR code` or entering a {guilabel}`Verification Code`. + +Finally, click {guilabel}`Enable two-factor authentication` to complete the setup. + +(users-portal-payment-methods)= + +### Change payment info + +First enter the username and password (login) into the database login page to access the portal user +account. A portal dashboard will appear upon successfully logging in. + +If the customer would like to manage payment options, navigate to the {guilabel}`Manage payment +methods` in the menu on the right. Then, add the new payment information, and select {guilabel}`Add +new card`. + diff --git a/content/applications/hr.md b/content/applications/hr.md new file mode 100644 index 000000000..04bf22c99 --- /dev/null +++ b/content/applications/hr.md @@ -0,0 +1,19 @@ +--- +nosearch: true +--- + +# Human resources + +```{toctree} +hr/attendances +hr/employees +hr/appraisals +hr/frontdesk +hr/fleet +hr/payroll +hr/time_off +hr/recruitment +hr/referrals +hr/lunch +``` + diff --git a/content/applications/hr/appraisals.md b/content/applications/hr/appraisals.md new file mode 100644 index 000000000..221eaa75a --- /dev/null +++ b/content/applications/hr/appraisals.md @@ -0,0 +1,186 @@ +--- +show-content: true +--- + +# Appraisals + +In Odoo, the *Appraisals* application can be used to evaluate employee performance on a recurring +basis. Managers can evaluate the performance of their employees, and also allow employees to do a +self-assessment of their own. Appraisals are customizable, and can be set for any kind of schedule +desired. + +Appraisals give employees valuable feedback, including actionable goals to work toward, and +measurable skills to improve upon. Additionally, appraisals may form the basis for raises, +promotions, and other benefits. + +Regular appraisals are good for both the employees and the company, since they can accurately +measure performance based on company goals, and show employees where they need to improve. + +## Configuration + +The {guilabel}`Configuration` menu in the *Appraisals* application is where the settings can be +configured, feedback templates can be edited, frequencies can be set, evaluation scales can be +managed, data for 360 feedback can be stored, and goal tags can be viewed/created. + +### Settings + +To access the *Settings* menu, navigate to {menuselection}`Appraisals application --> Configuration +--> Settings`. + +#### Feedback templates + +Feedback templates are form outlines used during an employee appraisal. Any edits made to a template +are, ultimately, reflected in the appraisals sent to employees. + +There are two default templates pre-configured in Odoo *Appraisals*: one for employee feedback, and +one for manager feedback. Each contains several sections, along with questions, and brief +explanations for how to respond to the questions. + +The {guilabel}`Employee Feedback Template` has the following sections: {guilabel}`My work`, +{guilabel}`My future`, and {guilabel}`My feelings`. + +The {guilabel}`Manager Feedback Template` has the following sections: {guilabel}`Feedback`, +{guilabel}`Evaluation`, and {guilabel}`Improvements`. + +Any desired changes to the default feedback templates can be made by making changes directly in each +template. + +#### Appraisals + +The {guilabel}`Appraisals` section of the settings menu determines the frequency that appraisals are +performed, and if it is possible to request additional feedback. + +```{image} appraisals/appraisals-setting.png +:align: center +:alt: The appraisals sections with the timeline filled in and 360 feedback enabled. +``` + +(appraisals-appraisal-plan)= + +##### Appraisals plans + +By default, appraisals are pre-configured to be automatically created six months after an employee +is hired, with a second appraisal exactly six months after that. + +Once those two initial appraisals have been completed in the employee's first year, following +appraisals are only created once a year (every twelve months). + +To modify this schedule, change the number of months in the blank fields under the +{guilabel}`Appraisals Plans` section. + +:::{important} +If the {guilabel}`Appraisals Plans` section is modified, **all** empty {guilabel}`Next Appraisal +Dates` are modified for **all** employees. +::: + +##### 360 feedback + +The {guilabel}`360 Feedback` option can be enabled to allow managers to request feedback from other +employees using a different survey form, at any time, independent of the appraisal schedule. + +Typically, managers ask for feedback from other people who work with an employee they manage. This +includes the employee's various managers, peers, and direct reports. + +To view the {guilabel}`360 Feedback` survey, click the {guilabel}`→ Internal link` icon at the end +of the {guilabel}`Default Template` field. The {guilabel}`360 Feedback` survey loads, and any +desired changes to the survey can be made. + +For more information on how to edit a survey, refer to the {doc}`../marketing/surveys/create` +document. + +:::{important} +The {guilabel}`360 Feedback` form is a pre-configured survey within the *Surveys* application. In +order to use the {guilabel}`360 Feedback` option, including the ability to edit the survey, the +*Surveys* application **must** be installed. +::: + +### Evaluation scale + +On each employee appraisal form, final rating options appear by default. To view and edit these +options, navigate to {menuselection}`Appraisals application --> Configuration --> Evaluation Scale`. +This presents the ratings in a list view. + +The pre-configured ratings are {guilabel}`Needs Improvement`, {guilabel}`Meets Expectations`, +{guilabel}`Exceeds Expectations`, and {guilabel}`Strongly Exceeds Expectations`. To add another +rating, click the {guilabel}`New` button. + +When the {guilabel}`New` button is clicked on the {guilabel}`Evaluation Scale` page, a blank line +appears at the bottom of the list. Enter the name of the rating in the field. + +To rearrange the order of the ratings, click the {guilabel}`(six small gray boxes)` icon to the left +of a rating, and drag the rating to the desired position on the list. + +```{image} appraisals/evaluation-scale.png +:align: center +:alt: The evaluation scale, with the new button and click and drag icons highlighted. +``` + +### 360 feedback + +The {guilabel}`360 Feedback` section displays information for all the surveys currently configured +in the *Appraisals* application. To view the surveys, and their statistics, navigate to +{menuselection}`Appraisals application --> Configuration --> 360 Feedback`. + +```{image} appraisals/survey-list.png +:align: center +:alt: A list view of all available surveys in the Appraisals application. +``` + +Each appraisal (or survey) is presented in its own line on the {guilabel}`360 Feedback` page, along +with various information related to that particular appraisal. + +Each appraisal includes the following information: + +- {guilabel}`Survey Name`: the name of the specific survey. +- {guilabel}`Responsible`: the employee responsible for the survey, including the month and year + they were given that designation. +- {guilabel}`Questions`: the number of questions in that particular survey. +- {guilabel}`Average Duration`: the average time a user spends completing the survey. +- {guilabel}`Registered`: the number of people who have been sent the survey. +- {guilabel}`Completed`: the number of people who have completed the survey. + +Each appraisal also has two buttons at the end of each line: a {guilabel}`Test` button and a +{guilabel}`See Results` button. + +To see what an appraisal looks like for the end user (i.e. an employee), click the {guilabel}`Test` +button, and the appraisal loads in a new browser tab. The entire appraisal loads, and can be clicked +through without having to enter any answers. + +To exit, close the tab. Or, click {guilabel}`This is a Test Survey. → Edit Survey` at the top of the +page to be taken to the detail form for that particular survey. + +To view the results from everyone who completed an appraisal, click the {guilabel}`See Results` +button. This presents all the answers for the survey in a new tab. Each question provides +information on how many people responded to a question, and how many people skipped it. All answers +for each question are visible. + +To exit, close the tab. Or, click {guilabel}`→ Edit Survey` at the top of the page to be taken to +the detail form for that particular survey. + +In addition to viewing the responses from past appraisals and surveys, new surveys can also be +created from the {guilabel}`360 Feedback` page. Simply click the {guilabel}`New` button in the +top-left of the page to create a new survey. + +For more information on how to create a survey, refer to the {doc}`../marketing/surveys/create` +document. + +:::{note} +In previous versions of Odoo, this section was referred to as {guilabel}`Surveys`. +::: + +:::{seealso} +- {doc}`appraisals/new_appraisals` +- {doc}`appraisals/goals` +- {doc}`appraisals/appraisal_analysis` +- {doc}`appraisals/skills_evolution` +::: + +```{toctree} +:titlesonly: true + +appraisals/new_appraisals +appraisals/goals +appraisals/appraisal_analysis +appraisals/skills_evolution +``` + diff --git a/content/applications/hr/appraisals/appraisal_analysis.md b/content/applications/hr/appraisals/appraisal_analysis.md new file mode 100644 index 000000000..cd2d3cfb9 --- /dev/null +++ b/content/applications/hr/appraisals/appraisal_analysis.md @@ -0,0 +1,114 @@ +# Appraisal analysis + +The **Appraisals** app has the ability to report on all the appraisals in the system, including +past, present, and future appraisals, and their respective statuses. This report helps managers +track scheduled appraisals, and identify any overdue or unconfirmed ones. + +To access the *Appraisal Analysis* report, navigate to {menuselection}`Appraisals app --> Reporting +--> Appraisal Analysis`. + +On the {guilabel}`Appraisal Analysis` page, a report loads, displaying all the appraisals in the +database. Each entry is highlighted in a different color to represent their status: + +| Color | Status | Meaning | +| ------ | -------------------------- | ----------------------------------------------- | +| Yellow | {guilabel}`Done` | The appraisal was completed. | +| Orange | {guilabel}`Appraisal Sent` | The appraisal was confirmed, but not completed. | +| Red | {guilabel}`Cancelled` | The appraisal was cancelled. | +| Gray | {guilabel}`To Start` | The appraisal was scheduled, but not confirmed. | + +:::{note} +Appraisals are scheduled automatically (appear in gray), according to their respective +{ref}`appraisals/appraisal-plan`. +::: + +The report displays the current year, in a default Gantt view, grouped by department, with the +current month highlighted. + +To change the period of time that is presented, adjust the date settings in the top-left corner of +the report by clicking the default {guilabel}`Year` to reveal a drop-down menu of options. The +options to display are {guilabel}`Day`, {guilabel}`Week`, {guilabel}`Month`, and {guilabel}`Year`. +Use the adjacent arrows to move forward or backward in time. + +At any point, click the {guilabel}`Today` button to have the Gantt view include today's date in the +view. + +To view the details of any appraisal, click on any appraisal. A pop-over window appears, displaying +the due date for the appraisal. To view more details, click the {guilabel}`View` button, and further +details appear in a pop-up window. + +The report can have other {ref}`filters ` and {ref}`groupings ` set in +the search bar at the top. + +```{image} appraisal_analysis/analysis.png +:align: center +:alt: A report showing all the appraisals for the Appraisal Analysis report. +``` + +(appraisals-group-status)= + +## Group by status + +When a company has a large number of employees, the default {guilabel}`Appraisal Analysis` report +may display too much information to view easily. In this scenario, viewing the data by status can be +beneficial. + +First, remove the default {icon}`oi-group` {guilabel}`Department` grouping from the search bar. +Next, click the {icon}`fa-caret-down` {guilabel}`(down arrow)` icon in the far-right of the search +bar. Click {guilabel}`Status` in the {icon}`oi-group` {guilabel}`Group By` column. Click away from +the drop-down menu to close it. + +All the appraisals are now organized by status, in the following order: {guilabel}`Cancelled`, +{guilabel}`Done`, {guilabel}`To Start`, and {guilabel}`Appraisal Sent`. + +This view makes it easy to see which appraisals need to be completed, and when, as well as which +appraisals still need to be confirmed. + +```{image} appraisal_analysis/by-status.png +:align: center +:alt: A report showing all the appraisals, grouped by status. +``` + +## Use case: view only the user's appraisals + +When viewing the {guilabel}`Appraisal Analysis` report, it can save time to only view the appraisals +the signed-in user is responsible for, and hide the rest. + +To only view this data, click the {icon}`fa-caret-down` {guilabel}`(down arrow)` icon in the +far-right of the search bar, revealing a drop-down menu. + +:::{note} +It is not necessary to remove the default {icon}`oi-group` {guilabel}`Department` grouping. If it +remains active, the results are grouped by department. If it is removed, the results appear in a +list, alphabetically. +::: + +Click {guilabel}`Add Custom Filter` at the bottom of the {icon}`fa-filter` {guilabel}`Filters` +column, and a {guilabel}`Add Custom Filter` pop-up window appears. + +Click into the first field, and a pop-over appears with a variety of options. Click the +{icon}`fa-chevron-right` {guilabel}`(right arrow)` icon after the word {guilabel}`Employee`, then +scroll down and click on {guilabel}`Manager`. Next, set the middle field to {guilabel}`=` +{guilabel}`(equal)`. Last, click the third field and select the desired user from the list. When all +the fields are set, click {guilabel}`Add`. + +```{image} appraisal_analysis/custom.png +:align: center +:alt: A customized filter to show only the user's employees. +``` + +Now, the only appraisals that appear are the appraisals that the selected user is responsible for, +instead of viewing *all* the appraisals. + +This report can also be {ref}`grouped by status `. + +```{image} appraisal_analysis/users-appraisals.png +:align: center +:alt: A report showing only the appraisals the user is responsible for, by status. +``` + +:::{seealso} +- {doc}`Odoo essentials reporting <../../essentials/reporting>` +- {doc}`../../essentials/search` +::: + diff --git a/content/applications/hr/appraisals/goals.md b/content/applications/hr/appraisals/goals.md new file mode 100644 index 000000000..fcc9e723d --- /dev/null +++ b/content/applications/hr/appraisals/goals.md @@ -0,0 +1,87 @@ +# Goals + +The Odoo *Appraisals* application allows managers to set goals for their employees. That way, +employees know what to work toward before their next review. + +To view all goals, navigate to {menuselection}`Appraisals app --> Goals`. This presents all the +goals for every employee, in a default Kanban view. + +(appraisals-goal-card)= + +Each goal card contains the following information: + +- {guilabel}`Goal`: the name of the goal. +- {guilabel}`Employee`: the employee the goal is assigned to. +- {icon}`fa-clock-o` {guilabel}`(clock)` icon: displays the corresponding {doc}`activity icon + <../../essentials/activities>` for the record. If no activities are scheduled, the default icon is + the {icon}`fa-clock-o` {guilabel}`(clock)`. If any activities have been scheduled, the icon + represents the activity scheduled soonest. +- {guilabel}`Deadline`: the due date for the goal. +- {guilabel}`Progress`: the percentage of competency set for the goal. The options are + {guilabel}`0%`, {guilabel}`25%`, {guilabel}`50%`, {guilabel}`75%`, or {guilabel}`100%`. +- {guilabel}`Employee Icon`: the profile icon of the employee the goal is assigned to. + +If a goal is completed, a {guilabel}`Done` banner appears in the top-right corner of the goal card. + +```{image} goals/goals.png +:align: center +:alt: The goals Kanban view, with nine goal cards. +``` + +:::{note} +Every individual goal requires its own record for each employee. If multiple employees have the +same goal, a goal card for each employee appears on the list. + +For example, if Bob and Sara have the same goal of `Typing`, two cards appear in the Kanban view: +one `Typing` goal for Bob, and another `Typing` goal for Sara. +::: + +## New goal + +To create a new goal, navigate to {menuselection}`Appraisals app --> Goals`, and click +{guilabel}`New` top-left corner to open a blank goal form. + +Input the {guilabel}`Goal`, {guilabel}`Employee`, {guilabel}`Progress`, and {guilabel}`Deadline`, +information on the goal card, as discussed in the {ref}`goal card ` section of +this document. + +The information requested is all the same information that appears on the goal card in the Kanban +view, with the addition of a {guilabel}`Tags` field and a {guilabel}`Description` tab. + +:::{tip} +The *Appraisals* application does **not** have any pre-configured tags, so all tags need to be +added. To add a tag, enter the name of the tag on the line, then click {guilabel}`Create +"(tag)"`. Repeat this for all tags that need to be added. +::: + +The current user populates the {guilabel}`Employee` field, by default, and the {guilabel}`Manager` +field populates with the manager set on the employee profile. + +Make any necessary changes to the form, and add any notes that might be useful to clarify the goal +in the {guilabel}`Description` tab. + +```{image} goals/new-goal.png +:align: center +:alt: A goal form filled out for a Python skill, set to 50% proficiency. +``` + +## Completed goals + +When a goal has been met, it is important to update the record. A goal can be marked as `Done` in +one of two ways: from the main {guilabel}`Goals` dashboard, or from the individual goal card. + +To mark a goal as `Done` from the main {guilabel}`Goals` dashboard, click on the +{icon}`fa-ellipsis-v` {guilabel}`(vertical ellipsis)` icon in the top-right of a goal card. + +:::{note} +The {icon}`fa-ellipsis-v` {guilabel}`(vertical ellipsis)` icon **only** appears when the mouse +hovers over the top-right corner of a goal card. +::: + +Then, click {guilabel}`Mark as Done` from the resulting drop-down menu. A green {guilabel}`Done` +banner appears in the top-right corner of the goal card. + +To mark a goal as `Done` from the goal card itself, click on a goal card to open that goal's form. +Then, click the {guilabel}`Mark as Done` button in the top-left of the form. When clicked, a green +{guilabel}`Done` banner appears in the top-right corner of the goal form. + diff --git a/content/applications/hr/appraisals/new_appraisals.md b/content/applications/hr/appraisals/new_appraisals.md new file mode 100644 index 000000000..c94be5e41 --- /dev/null +++ b/content/applications/hr/appraisals/new_appraisals.md @@ -0,0 +1,284 @@ +# New appraisals + +To create a new appraisal for an employee, first navigate to the main *Appraisals* dashboard by +opening the {menuselection}`Appraisals` app. The {guilabel}`Appraisals` dashboard is the default +view. + +## Appraisals dashboard + +All appraisals are displayed on the dashboard in a default Kanban view, with a list of groupings on +the left side of the dashboard, including {guilabel}`COMPANY`, {guilabel}`DEPARTMENT`, and +{guilabel}`STATUS`. + +Click any grouping option to view appraisals for **only** the chosen selection. + +:::{note} +Only groupings with multiple selections appear in the list. For example, if a database only has +one company, the {guilabel}`COMPANY` grouping does **not** appear, since there is no other +company to select. +::: + +Each appraisal card displays the following information: + +- **Name**: the employee's name. +- **Department**: the department the employee is associated with. +- **Company**: the company the employee works for. This only appears in a multi-company database. +- **Date**: the date the appraisal was requested, or is scheduled for in the future. +- **Activities**: any {doc}`activities <../../essentials/activities>` that are scheduled for the + appraisal, such as *Meetings* or *Phone Calls*. +- **Manager**: the employee's manager, indicated by the profile icon in the bottom-right corner of + an appraisal card. +- **Status banner**: the status of the appraisal. A banner appears if an appraisal is marked as + either *Canceled* or *Done*. If no banner is present, that means the appraisal has not happened, + or has not been scheduled yet. + +To view the details of any appraisal, click on the card to open the appraisal form. + +```{image} new_appraisals/dashboard.png +:align: center +:alt: The Appraisals dashboard with each appraisal in its own box. +``` + +## Create an appraisal + +To create a new appraisal, click the {guilabel}`New` button in the upper-left corner of the +{guilabel}`Appraisals` dashboard. Doing so reveals a blank appraisal form. After entering a name in +the first blank field, proceed to enter the following information on the form: + +- {guilabel}`Manager`: select the employee's manager from the drop-down menu. The manager is + responsible for completing the *Manager's Feedback* section of the appraisal. This field + auto-populates after the employee is selected, if they have a manager set on their employee + profile. +- {guilabel}`Appraisal Date`: the current date is automatically entered in this field. This field is + automatically updated once the appraisal is completed or cancelled, with the corresponding date of + completion or cancellation. +- {guilabel}`Department`: select the employee's department from the drop-down menu. This field + auto-populates after the employee is selected, if they have a department set on their employee + profile. +- {guilabel}`Company`: select the employee's company from the drop-down menu. This field + auto-populates after the employee is selected, if they have a company set on their employee + profile. + +:::{note} +The only required fields for the appraisal form are the employee's name, the {guilabel}`Manager`, +and the {guilabel}`Company`. +::: + +Once the form is complete, click the {guilabel}`Confirm` button to confirm the appraisal request. + +Once confirmed, the employee receives an email stating that an appraisal was requested, and is then +prompted to schedule an appraisal date. + +The status changes to {guilabel}`Confirmed`, and the {guilabel}`Employee's Feedback` section of the +{guilabel}`Appraisal` tab is grayed out. The information in that section only appears after the +self-assessment is published by the employee. The {guilabel}`Final Rating` field also appears once +the appraisal request is confirmed. + +If there are any existing appraisals for the employee, an {guilabel}`Appraisal` smart button appears +at the top of the page, listing the total number of appraisals there are for the employee. + +### Ask for feedback + +As part of the appraisal process, the manager can request feedback on an employee from anyone in the +company. Feedback is usually requested from co-workers and other people who interact with, or work +with, the employee. This is to get a more well-rounded view of the employee, and aid in the +manager's overall assessment. + +To request feedback, the appraisal **must** be confirmed. Once confirmed, an {guilabel}`Ask +Feedback` button appears at the top of the form. + +When the {guilabel}`Ask Feedback` button is clicked, an {guilabel}`Ask Feedback` email pop-up form +appears, using the {guilabel}`Appraisal: Ask Feedback` email template, which sends the +{guilabel}`360 Feedback` survey. + +Enter the employees being asked to complete the survey in the {guilabel}`Recipients` field. Multiple +employees may be selected. + +The email template has dynamic placeholders to personalize the message. Add any additional text to +the email, if desired. + +If required, an {guilabel}`Answer Deadline` can be added, as well. + +If any attachments are needed, click the {icon}`fa-paperclip` {guilabel}`Attachments` button, and a +file explorer window appears. Navigate to the file(s), select them, then click {guilabel}`Open`. + +When the email is ready to send, click {guilabel}`Send.` + +```{image} new_appraisals/ask-feedback.png +:align: center +:alt: The email pop-up when requesting feedback from other employees. +``` + +### Appraisal form + +Once an appraisal is confirmed, the next steps require the employee to fill out the self-assessment, +after which the manager completes their assessment. + +(appraisals-employee-feedback)= + +#### Employee's feedback + +To complete their portion of feedback, employees should navigate to the main +{menuselection}`Appraisals application` dashboard, where the only entries visible are appraisals for +the employee, themselves, and/or anyone they manage and have to provide manager feedback for. + +Click on the appraisal to open the appraisal form. Enter responses in the {guilabel}`Employee's +Feedback` section, under the {guilabel}`Appraisal` tab. + +When completed, click the {guilabel}`Not Visible to Manager` toggle (the default setting once an +appraisal is confirmed). When clicked, the toggle changes to {guilabel}`Visible to Manager`. + +```{image} new_appraisals/employee-feedback.png +:align: center +:alt: The feedback section for the employee with the toggle button highlighted. +``` + +(appraisals-manager-feedback)= + +#### Manager's feedback + +After the employee has completed the {guilabel}`Employee's Feedback` section, under the +{guilabel}`Appraisal` tab, it is time for the manager to fill out the {guilabel}`Manager's Feedback` +section. + +The manager enters their responses in the fields in the {ref}`same manner as the employee +`. + +When the feedback section is completed, click the {guilabel}`Not Visible to Employee` toggle (the +default setting once an appraisal is confirmed). When clicked, the toggle changes to +{guilabel}`Visible to Employee`. + +```{image} new_appraisals/manager-feedback.png +:align: center +:alt: The feedback section for both employees and managers. The toggle buttons are +: highlighted. +``` + +#### Skills tab + +Part of an appraisal is evaluating an employee's skills, and tracking their progress over time. The +{guilabel}`Skills` tab of the appraisal form auto-populates with the skills from the {ref}`employee +form `, once an appraisal is confirmed. + +Each skill is grouped with like skills, and the {guilabel}`Skill Level`, {guilabel}`Progress`, and +{guilabel}`Justification` are displayed for each skill. + +Update any skills, or add any new skills to the {guilabel}`Skills` tab. + +If a skill level has increased, a reason for the improved rating can be entered into the +{guilabel}`Justification` field, such as `took a fluency language test` or `received Javascript +certification`. + +:::{seealso} +Refer to the {ref}`Create a new employee ` document for detailed instructions +on adding or updating a skill. +::: + +After an appraisal is completed, and the skills have been updated, the next time an appraisal is +confirmed, the updated skills populate the {guilabel}`Skills` tab. + +```{image} new_appraisals/skills.png +:align: center +:alt: The skills tab of an appraisal form, all filled out. +``` + +:::{note} +The {guilabel}`Skills` tab can be modified **after** the employee and their manager have met and +discussed the employee's appraisal. + +This is a common situation as the manager may not have all the necessary information to properly +assess and update the employee's skills before meeting. +::: + +#### Private Note tab + +If managers want to leave notes that are only visible to other managers, they can be entered in the +{guilabel}`Private Note` tab. This can be done before or after meeting with the employee to discuss +the appraisal. + +The employee being evaluated does **not** have access to this tab, and the tab does **not** appear +on their appraisal. + +### Schedule a meeting + +Once both portions of an appraisal are completed (the {ref}`employee ` +and {ref}`manager ` feedback sections), it is time for the employee and +manager to meet and discuss the appraisal. + +A meeting can be scheduled in one of two ways: either from the *Appraisals* application dashboard, +or from an individual appraisal card. + +To schedule an appraisal from the dashboard of the *Appraisals* application, first navigate to +{menuselection}`Appraisals app --> Appraisals`. + +Click the {icon}`fa-clock-o` {guilabel}`(clock)` icon, beneath the appraisal date on the desired +appraisal card, and a pop-up window appears. Then, click {icon}`fa-plus` {guilabel}`Schedule an +activity` to create an activity from a {guilabel}`Schedule Activity` pop-up form that appears. + +Select {guilabel}`Meeting` for the {guilabel}`Activity Type` from the drop-down menu. Doing so +causes the form to change, so only the {guilabel}`Activity Type` and {guilabel}`Summary` fields +appear. + +Enter a brief description in the {guilabel}`Summary` field of the {guilabel}`Schedule Activity` +pop-up form, such as `Annual Appraisal for (Employee)`. + +Next, click the {guilabel}`Open Calendar` button. From the calendar page that appears, navigate to, +and double-click on, the desired date and time for the meeting. + +Doing so opens a {guilabel}`New Event` pop-up form. From this pop-up form, make any desired +modifications, such as designating a {guilabel}`Start` time, or modifying the default +{guilabel}`Title` to the meeting. + +Add the appraisee in the {guilabel}`Attendees` section, and include anyone else who should also be +in the meeting, if necessary. + +To make the meeting a video call, instead of an in-person meeting, click {icon}`fa-plus` +{guilabel}`Odoo meeting`, and a {guilabel}`Videocall URL` link appears in the field. + +Once all the desired changes are complete, click {guilabel}`Save & Close`. + +The meeting now appears on the calendar, and the invited parties are informed, via email. + +```{image} new_appraisals/meeting.png +:align: center +:alt: The meeting form with all information entered for Ronnie Hart's annual appraisal. +``` + +The other way to schedule a meeting is from the individual appraisal form. To do this, navigate to +the {menuselection}`Appraisal app` dashboard, then click on an appraisal card. + +Next, click on the {icon}`fa-calendar` {guilabel}`Meeting` smart button, and the calendar loads. +Follow the same directions above to create the meeting. + +For more detailed information on how to schedule activities, refer to the {doc}`activities +<../../essentials/activities>` documentation. + +:::{note} +If no meetings are scheduled, the {guilabel}`Meeting` smart button reads {guilabel}`No Meeting`. +::: + +## Complete an appraisal + +After the appraisal is complete, and both the manager and employee have met to discuss the +appraisal, the appraisal can be marked as *Done*. When completed, click the {guilabel}`Mark as Done` +button on the appraisal form, located in the top-left corner. + +Once the appraisal is marked as *Done*, the {guilabel}`Mark as Done` button disappears, and a +{guilabel}`Reopen` button appears. + +:::{tip} +Modifications are **not** possible once the appraisal is marked as done. + +To make any changes to an appraisal that is marked as *Done*, click the {guilabel}`Reopen` +button. + +Then, click the {guilabel}`Confirm` button that appears, and make any modifications needed. Once +all modifications are complete, click the {guilabel}`Mark as Done` button again. +::: + +:::{seealso} +- {doc}`../appraisals/goals` +- {doc}`../appraisals/appraisal_analysis` +- {doc}`../appraisals/skills_evolution` +::: + diff --git a/content/applications/hr/appraisals/skills_evolution.md b/content/applications/hr/appraisals/skills_evolution.md new file mode 100644 index 000000000..dc8e4b9c9 --- /dev/null +++ b/content/applications/hr/appraisals/skills_evolution.md @@ -0,0 +1,169 @@ +# Skills evolution + +In Odoo's **Appraisals** app, it is possible to view employee's skills as they progress over time in +the {ref}`Skills Evolution ` report, also known as the +*Appraisal Skills Report*. + +Managers can use this to see who is achieving their various skill goals set on their appraisals, who +is meeting their skill deadlines, who has the highest performance in terms of skill development, and +more. + +The *Skills Evolution* report also provides the ability to {ref}`search for employees with specific +skills ` at certain levels, which can be helpful for scenarios where +specific skills are required. + +(appraisals-identify-skills-evolution)= + +## Skills evolution report + +To access this *Skills Evolution* report, navigate to {menuselection}`Appraisals app --> Reporting +--> Skills Evolution`. + +Doing so reveals the {guilabel}`Appraisal Skills Report` page, which displays a report of all +skills, grouped by employee, in alphabetical order, by default. + +:::{note} +Skill levels are **only** updated after an appraisal is marked as done. Any skill level changes +from ongoing appraisals that have **not** been finalized are **not** included in this report. +::: + +All the {guilabel}`Employee` lines are expanded, with all the various skill types nested below. Each +individual skill type is collapsed, by default. To view the individual skills contained within a +skill type, click anywhere on the skill type line to expand the data. + +Each skill has the following information listed: + +- {guilabel}`Employee`: the name of the employee. +- {guilabel}`Skill Type`: the category the skill falls under. +- {guilabel}`Skill`: the specific, individual skill. +- {guilabel}`Previous Skill Level`: the level the employee had previously achieved for the skill. +- {guilabel}`Previous Skill Progress`: the previous percentage of competency achieved for the skill + (based on the {guilabel}`Skill Level`). +- {guilabel}`Current Skill Level`: the current level the employee has achieved for the skill. +- {guilabel}`Current Skill Progress`: the current percentage of competency achieved for the skill. +- {guilabel}`Justification`: any notes entered on the skill, explaining the progress. + +The color of the skill text indicates any changes from the previous appraisal. Skill levels that +have increased since the last appraisal appear in green, as an *Improvement*. Skill levels that have +**not** changed appear in black, as *No Change*. Skills that have regressed appear in red, as +*Regression*. + +This report can be modified to find specific information by adjusting the {ref}`filters +` and {ref}`groupings ` set in the search bar at the top. + +```{image} skills_evolution/skills-report.png +:align: center +:alt: A report showing all the skills grouped by employee. +``` + +(appraisals-identify-skills)= + +## Use case: Identify employees with specific skills + +Since the {guilabel}`Appraisal Skills Report` organizes all skills by employee, it can be difficult +to find employees with a specific skill at a specific level. To find these employees, a custom +filter must be used. + +In this example, the report is modified to show employees with an expert level of Javascript +knowledge. To view only those employees, first remove all active filters in the search bar. + +Next, click the {icon}`fa-caret-down` {guilabel}`(down arrow)` icon in the search bar, then click +{guilabel}`Add Custom Filter` beneath the {icon}`fa-filters` {guilabel}`Filters` column to load an +{guilabel}`Add Custom Filter` pop-up window. + +Using the drop-down menu in the first field, select {guilabel}`Skill`. Then, keep the second field +as-is, and select {guilabel}`Javascript` from the third drop-down menu in the third field. + +Next, click {guilabel}`New Rule`, and another line appears. In this second line, select +{guilabel}`Current Skill Level` for the first drop-down field, leave the second field as-is, then +select {guilabel}`Expert` for the third drop-down field. + +After the {guilabel}`New Rule` button is clicked, the word {guilabel}`"any"` in the sentence +{guilabel}`Match any of the following rules:`, changes from plain text into a drop-down menu. Click +the {icon}`fa-caret-down` {guilabel}`(down arrow)` icon after the word {guilabel}`any`, and select +{guilabel}`all`. + +Finally, click the {guilabel}`Add` button. + +```{image} skills_evolution/javascript.png +:align: center +:alt: The Custom Filter pop-up with the parameters set. +``` + +Now, only employees that have an {guilabel}`Expert` level for the skill {guilabel}`Javascript` +appear. In this example, only {guilabel}`Marc Demo` meets these criteria. + +```{image} skills_evolution/results.png +:align: center +:alt: The employees with expert Javascript skills. +``` + +## Use case: Assess highest improvement + +Another way to modify the {guilabel}`Appraisal Skills Report` is to identify the employee who has +the highest amount of improved skills over a specific period of time. + +To view this information, first remove the default filter in the search bar. Next, click the +{icon}`fa-caret-down` {guilabel}`(down arrow)` icon in the search bar, then click +{guilabel}`Improvement` beneath the {icon}`fa-filter` {guilabel}`Filters` column. Enabling this +filter only presents skills that have improved. + +It is possible to view the skills that have improved over a period of time, such as a specific +quarter, or month. With the search bar drop-down menu still expanded, click {guilabel}`Add Custom +Filter` at the bottom of the {icon}`fa-filter` {guilabel}`Filters` column, and an {guilabel}`Add +Custom Filter` pop-up window appears. + +Select {guilabel}`Create Date` for the first drop-down field, then select {guilabel}`is between` for +the second drop-down field. Once {guilabel}`is between` is selected, a second field appears after +the last field. Using the calendar selector, select the date range to apply the filter to. Once all +the fields are properly formatted, click {guilabel}`Add`. + +The custom filter presents only the skills that have improved during the specified time period, +organized by employee. + +```{eval-rst} +.. example:: + To determine the employee with the most amount of improved skills for the third quarter, remove + the default filter in the search bar of the :guilabel:`Appraisal Skills Report`. Next, activate + the :guilabel:`Improvement` filter, then click :guilabel:`Add Custom Filter` at the bottom of the + :icon:`fa-filter` :guilabel:`Filters` column. + + In the resulting :guilabel:`Add Custom Filter` pop-up window, select :guilabel:`Create Date` for + the first drop-down field, then select :guilabel:`is between` for the second drop-down field. Two + date fields appear after :guilabel:`is between` is selected. + + Using the calendar selector, set the first date to :guilabel:`07/01/2024` and the second date to + :guilabel:`09/30/2024`, then click :guilabel:`Add`. + + These filters present only the skills that have improved during the third quarter (between July + 1st and September 30th, 2024), organized by employee. + + .. image:: skills_evolution/custom-filter.png + :alt: The Custom Filter pop-up with the parameters set. +``` + +To view the number of employees and skills in further detail, click the {icon}`oi-view-pivot` +{guilabel}`(Pivot)` icon in the top-right corner to view the data in a pivot table. This presents a +pivot table with the employees populating the rows, and the only visible column represents the total +number of improved skills. + +To expand more rows or columns to view which skill types had the most overall improvement, click +{icon}`fa-plus-square` {guilabel}`Total` above the {guilabel}`Count` column, then click +{guilabel}`Skill Type` from the resulting drop-down menu. This organizes the total improved skills +by their respective skill type. + +```{eval-rst} +.. example:: + In this example, it is determined that :guilabel:`Charles Reginald` had the largest improvement + in the third quarter, with six improved skills. Additionally, they also had the most skill + improvements for both :guilabel:`Languages` (three) and :guilabel:`Programming Languages` (two). + + .. image:: skills_evolution/largest-improvement.png + :alt: The pivot table showing the skill improvements for the third quarter. +``` + +:::{seealso} +- {doc}`Odoo essentials reporting <../../essentials/reporting>` +- {doc}`../../essentials/search` +::: + diff --git a/content/applications/hr/attendances.md b/content/applications/hr/attendances.md new file mode 100644 index 000000000..bd15aa97b --- /dev/null +++ b/content/applications/hr/attendances.md @@ -0,0 +1,314 @@ +--- +show-content: true +--- + +# Attendances + +Odoo's *Attendances* application functions as a time clock. Employees are able to check in and out +of work using a dedicated device in kiosk mode, while users are also able to check in and out of +work directly from the database. Managers can quickly see who is available at any given time, create +reports to see everyone's hours, and gain insights on which employees are working overtime, or +checking out of work earlier than expected. + +(attendances-access-rights)= + +## Access rights + +It is important to understand how the different access rights affect what options and features users +can access in the *Attendances* application. + +Every user in the database is able to check in and out directly from the database, without needing +access to the *Attendances* application. Additionally, all users can access their own attendance +records from their employee form in the *Employees* app. + +Access to both the *Attendances* application, and the various features within the application is +determined by access rights. + +To see what access rights a user has, navigate to the {menuselection}`Settings app --> Users & +Companies: Users`, and click on an individual user. The {guilabel}`Access Rights` tab is visible by +default. Scroll down to the {guilabel}`Human Resources` section to see the setting. For the +{guilabel}`Attendances` field, the options are either to leave the field blank or select +{guilabel}`Administrator`. + +If the {guilabel}`Administrator` option is selected, the user has full access to the entire +*Attendances* application, with no restrictions. They can view all employee attendance records, +enter *Kiosk mMode* from the application, access all reporting metrics, and make modifications to +the settings. If left blank, the user does **not** have access to the *Attendances* application. + +(attendances-approvers)= + +### Approvers + +The **only** other scenario where different information may be accessible in the *Attendances* +application is for approvers. If a user does *not* have administrative rights for the *Attendances* +application, but they are set as an employee's approver for the *Attendances* application, that user +is able to view the attendance records for that specific employee, as well as make modifications to +that employee's attendance records, if necessary. This applies to all employees for whom the user is +listed as the *Attendances* application approver. Approvers are typically managers, though this is +not required. + +To see who the attendance approver is for an employee, navigate to the {menuselection}`Employees +application` and click on the specific employee. Click on the {guilabel}`Work Information` tab, +scroll to the {guilabel}`Approvers` section, and check the {guilabel}`Attendance` field. The person +selected is able to view that employees' attendance records, both on the *Attendances* application +dashboard as well as in the attendance reports, and make modifications to their records. + +## Configuration + +Few configurations are needed in the *Attendances* application. Determining how employees check in +and out, defining how the kiosks function, and determining how extra hours are computed are all set +in the Configuration menu. Navigate to the {menuselection}`Attendances application --> +Configuration` to access the configuration menu. + +### Modes + +- {guilabel}`Attendances from Backend`: activate this selection to allow users to check in and out + directly from the Odoo database. If this is not activated, users must use a kiosk to check in and + out of work. + +### Extra hours + +This section specifies how extra time is calculated, including when extra time is counted and what +time is not logged. + +- {guilabel}`Count of Extra Hours`: enable this box to allow employees to log extra hours beyond + their set working hours (sometimes referred to as *overtime*). Activating this selection displays + the following settings as well. If this is not activated, no other configurations appear. + + - {guilabel}`Start From`: the current date is automatically entered in this field. If desired, + click on this field and use the calendar selector to modify the start date on which extra hours + are logged. + + - {guilabel}`Tolerance Time In Favor Of Company`: enter the amount of time, in minutes, that is + **not** counted towards an employee's overtime. When an employee checks out, and the extra time + logged is below the specified minutes, the extra time is **not** counted as overtime for the + employee. + + - {guilabel}`Tolerance Time In Favor Of Employee`: enter the amount of time, in minutes, that an + employee is given, that does **not** adversely affect their attendance if they log less time + than their working hours. When an employee checks out, and the total time logged for the day is + less than their specified working hours and less than this specified grace period, they are + **not** penalized for their reduced hours. + + ```{eval-rst} + .. example:: + A company sets both of the :guilabel:`Tolerance` fields to `15` minutes, and the working + hours for the entire company are set from 9:00 AM to 5:00 PM. + + If an employee checks in at 9:00 AM, and checks out at 5:14 PM, the extra 14 minutes are + **not** counted towards their overtime. + + If an employee checks in at 9:05 AM, and checks out at 4:55 PM, even though they logged a + total of 10 minutes less than their full working hours, they are **not** penalized for this + discrepancy. + ``` + + - {guilabel}`Display Extra Hours`: activate this box to display the extra hours logged by an + employee when they check out with a kiosk, or when a user checks out in the database. + +:::{note} +Employees are still able to log overtime hours even if the {guilabel}`Count of Extra Hours` +option is not activated. The difference is that when {guilabel}`Count of Extra Hours` is +activated, the extra hours can be {ref}`deducted from an approved time off request +`. +::: + +## Overview + +When entering the *Attendances* application, the {guilabel}`Overview` dashboard is presented, +containing all the check in and check out information for the signed in user. If the user has +specific {ref}`access rights ` and/or are {ref}`approvers +` for specific employees, then those additional employee's check in and check +out information is also visible on the {guilabel}`Overview` dashboard. + +### Views + +To change the view from the default Gantt chart to a list view, click the {guilabel}`List` icon in +the top right of the dashboard, beneath the user's photo. To switch back to the Gantt chart, click +the {guilabel}`Gantt` button, located next to the {guilabel}`List` button. + +The default view presents the current day's information. To present the information for the +{guilabel}`Week`, {guilabel}`Month`, or {guilabel}`Year`, click on the {guilabel}`Day` button to +reveal a drop-down, displaying those other options. Select the desired view, and the dashboard +updates, presenting the selected information. To change the {guilabel}`Day`, {guilabel}`Week`, +{guilabel}`Month`, or {guilabel}`Year` presented, click the {guilabel}`← (left arrow)` or +{guilabel}`→ (right arrow)` buttons on either side of the drop-down menu. To jump back to a view +containing the current day, click the {guilabel}`Today` button. This refreshes the dashboard, +presenting information containing the current day's information. + +In the {guilabel}`Day` view, the column for the current hour is highlighted in yellow. If the +{guilabel}`Week` or {guilabel}`Month` view is selected, the column for the current day is +highlighted. If the {guilabel}`Year` view is selected, the current month is highlighted. + +```{image} attendances/overview.png +:align: center +:alt: |- +: The overview dashboard presenting the information for the week, with the current day +: highlighted. +``` + +Any entries that have errors appear in red, indicating they need to be resolved by a user with the +proper {ref}`access rights ` and/or are {ref}`approvers +` for the employee(s) with the errors. + +(attendances-filters-groups)= + +### Filters and groups + +To filter the results in the overview dashboard, or to present different groups of information, +click the {guilabel}`🔻 (triangle drop down)` button in the right side of the {guilabel}`Search` bar +above the dashboard, and select one of the available {guilabel}`Filters` or {guilabel}`Group By` +options. There are several pre-configured filters and groups to choose from, as well as an option to +create custom ones. + +#### Filters + +The default filters that can be selected are: + +- {guilabel}`My Attendances`: this filter only presents the user's attendance data. +- {guilabel}`My Team`: this filter presents the attendance data for the user's team. +- {guilabel}`At Work`: this filter displays the attendance data for everyone currently checked in. +- {guilabel}`Errors`: this filter displays any entries with {ref}`errors ` that + need to be resolved. +- {guilabel}`Check In`: this filter has a drop-down to further select a specific time period. Select + the desired time period from the options presented, a specific month, quarter, or year. +- {guilabel}`Last 7 days`: this filter presents the attendance data for the last seven days. +- {guilabel}`Add Custom Filter`: create a custom filter using the pop-up that appears when this is + selected. + +#### Groups + +The default groups that can be selected are: + +- {guilabel}`Check In`: this grouping presents a drop-down menu containing the following time period + options: {guilabel}`Year`, {guilabel}`Quarter`, {guilabel}`Month`, {guilabel}`Week`, and + {guilabel}`Day`. Selected the time period to display all the check-in information, grouped by the + selected time period. +- {guilabel}`Employee`: this group presents the attendance data organized by employee. +- {guilabel}`Check Out`: this grouping presents a drop-down menu containing the following time + period options: {guilabel}`Year`, {guilabel}`Quarter`, {guilabel}`Month`, {guilabel}`Week`, and + {guilabel}`Day`. Selected the time period to display all the check-out information, grouped by the + selected time period. +- {guilabel}`Add Custom Group`: this option displays a drop-down menu with a variety of options to + group the attendance data by, including {guilabel}`City`, {guilabel}`Country`, {guilabel}`Mode`, + and {guilabel}`IP Address`. + +(attendances-errors)= + +### Attendance log details + +Odoo captures various time and location details when a user checks in and out. The specific details +provided are determined by the method the user checked in and out. + +To view the specific check in and/or check out details for an employee, click on an individual entry +in the overview dashboard. + +A detailed attendance log for the user appears in a pop-up window. To close the detailed attendance +log, click the {guilabel}`Save & Close` button in the bottom-left corner of the form. + +The detailed attendance log contains the following information: + +#### Main details + +- {guilabel}`Employee`: the name of the employee. +- {guilabel}`Check In`: the date and time the employee checked in. +- {guilabel}`Check Out`: the date and time the employee checked out. This only appears if the + employee has checked out. +- {guilabel}`Worked Hours`: the total amount of time the employee logged for the day, in an hour and + minute format (HH:MM). This value calculates all the checks in and check outs for the day, if the + employee checked in and out multiple times. +- {guilabel}`Extra Hours`: any extra hours the employee logged that is beyond their expected working + hours. + +#### Check in/check out details + +The following information appears for both the {guilabel}`Check In` and {guilabel}`Check Out` +sections. + +- {guilabel}`Mode`: the method with which the attendance information was gathered. + {guilabel}`Systray` is displayed if the employee logged in and out {ref}`directly from the + database `, {guilabel}`Manual` is displayed if the employee logged in and + out {ref}`using an attendance kiosk `. +- {guilabel}`IP Address`: the IP address for the computer the employee used to log in or out. +- {guilabel}`Browser`: the web browser the employee used to log in or out. +- {guilabel}`Localization`: the city and country associated with the computer's IP address. +- {guilabel}`GPS Coordinates`: the specific coordinates when the user logged in or out. To view the + specific coordinates on a map, click the {guilabel}`→ View on Maps` button beneath the + {guilabel}`GPS Coordinates`. This opens a map in a new browser tab, with the specific location + pointed out. + +```{image} attendances/details.png +:align: center +:alt: The detailed information for an attendance entry. +``` + +### Errors + +Entries that contain an error appear on the overview dashboard in red. In the {guilabel}`Gantt +view`, the entry appears with a red background. If in the {guilabel}`List view`, the entry text +appears in red. + +An error typically occurs when an employee has checked in but has not checked out within the last +24 hours, or when an employee has a check in and check out period spanning over 16 hours. + +To fix the error, the attendance entry must be modified or deleted. Click on the entry to reveal a +pop-up containing the details for that particular entry. To modify the {guilabel}`Check In` and/or +{guilabel}`Check Out` information, click on the {guilabel}`Check In` or {guilabel}`Check Out` field +and a calendar selector appears. Click on the desired date, then use the time selector beneath the +calendar to select the specific time for the entry. When the information is correct, click +{guilabel}`Apply.` + +```{image} attendances/errors.png +:align: center +:alt: |- +: The pop-up that allows for modifications to an attendance entry with an error. The calendar +: selector is shown, and the time selector is highlighted. +``` + +When all the information on the pop-up is correct, click {guilabel}`Save & Close`. When the entry no +longer has an error, the entry appears in gray instead of red. + +To delete an entry, click {guilabel}`Remove` on the pop-up instead of making modifications to the +entry. + +## Reporting + +To view attendance reports, click {guilabel}`Reporting` in the top menu. The default report displays +each employee's attendance information for the past 3 months, in a {guilabel}`Line Chart`. + +The default view is a {guilabel}`Graph`. To view the data in a pivot table, click the +{guilabel}`Pivot Table` button on the top right of the report. To switch back to the graph view, +click the {guilabel}`Graph` button, located next to the {guilabel}`Pivot Table` button. + +To present different information, adjust the {ref}`filters and groups ` +in the same way as in the {guilabel}`Overview` dashboard. + +The data can be presented in either a {guilabel}`Bar Chart`, {guilabel}`Line Chart`, {guilabel}`Pie +Chart`, {guilabel}`Stacked` chart, or in {guilabel}`Descending` or {guilabel}`Ascending` order. To +change the view to any of these charts, click the corresponding button above the displayed chart. + +To change the {guilabel}`Measures`, click the {guilabel}`Measures` button and select the desired +measure from the drop-down menu. + +The report can also be inserted into a spreadsheet. Click the {guilabel}`Insert in Spreadsheet` +button and a pop-up appears. Select the desired spreadsheet, and click {guilabel}`Confirm`. + +```{image} attendances/reporting.png +:align: center +:alt: The default report view, with all the optional view buttons highlighted. +``` + +:::{seealso} +- {doc}`attendances/check_in_check_out` +- {doc}`attendances/kiosks` +- {doc}`attendances/hardware` +::: + +```{toctree} +:titlesonly: true + +attendances/check_in_check_out +attendances/kiosks +attendances/hardware +``` + diff --git a/content/applications/hr/attendances/check_in_check_out.md b/content/applications/hr/attendances/check_in_check_out.md new file mode 100644 index 000000000..6e87970d0 --- /dev/null +++ b/content/applications/hr/attendances/check_in_check_out.md @@ -0,0 +1,90 @@ +# Check in and out + +Odoo's *Attendances* application allows users, who are logged into the database, to check in and +out, without needing to go into the *Attendances* application, or use a kiosk. For smaller +companies, where every employee is also a user, this feature may be useful. + +A user can check in and/or out on the main database Odoo dashboard, or while inside any application. +To do so, in the upper-right corner of the top main header menu, which is always visible regardless +of what application the user is in, a {guilabel}`🔴 (red circle)` or {guilabel}`🟢 (green circle)` +is visible. Click on the colored circle to reveal the attendance widget, enabling the user to check +in and/or out. + +```{image} check_in_check_out/top-menu.png +:align: center +:alt: Top right main menu with check in button highlighted. +``` + +(attendances-check-in)= + +## Check in + +If the attendance widget circle is red, this indicates the user is not currently checked in. Click +the {guilabel}`🔴 (red circle)`, and the attendance widget appears, displaying a green +{guilabel}`Check in` {icon}`fa-sign-in` button. + +```{image} check_in_check_out/check-in.png +:align: center +:alt: Top right main menu with check in button highlighted. +``` + +When the user checks in from the database, the *Attendances* app logs the location details for the +user, including the IP Address and GPS coordinates. + +:::{important} +For the *Attendances* app to log the location details, the user must allow their computer to +access their location information. +::: + +If the user has not already checked in and out during the current work day, this button is the only +visible item in the widget. If the user has previously checked in and out, a {guilabel}`Total today` +field appears above the button, and the total amount of time that has been logged for the day +appears in that field, in an {guilabel}`HH:MM` (hours:minutes) format. + +Click the {guilabel}`Check in` {icon}`fa-sign-in` button to check in. The {guilabel}`🔴 (red +circle)` in the top menu changes to green, and the widget changes appearance, as well. The widget +updates to reflect that the user has checked in, by changing the green {guilabel}`Check in` +{icon}`fa-sign-in` button to a yellow {guilabel}`Check out` {icon}`fa-sign-out` button. + +Click anywhere on the screen to close the attendance widget. + +## Check out + +If the user is checking out for the first time, {guilabel}`Since HH:MM (AM/PM)` appears at the top +of the widget, with the time the user checked in populating the time field. Beneath that line, the +hours and minutes that have elapsed since checking in are displayed in a {guilabel}`HH:MM` format. +As time passes, this value is updated to reflect the hours and minutes that have passed since the +user checked in. + +If the user has previously checked in and out, additional fields are presented. A {guilabel}`Before +HH:MM (AM/PM)` field appears, in addition to the {guilabel}`Since HH:MM (AM/PM)` field. The times +displayed in both of these fields match, and are populated with the most recent check in time. +Beneath the {guilabel}`Before HH:MM (AM/PM)` field, the previously logged time is displayed, in an +{guilabel}`HH:MM` (hours:minutes) format. + +In addition, beneath both of these fields, a {guilabel}`Total today` field appears. This field is +the sum of both the {guilabel}`Before HH:MM (AM/PM)` and {guilabel}`Since HH:MM (AM/PM)` fields, and +is the total time that is logged for the user, if they were to log out at that moment. + +As time passes, both the {guilabel}`Since HH:MM (AM/PM)` and {guilabel}`Total today` fields are +updated live. To check out, click the yellow {guilabel}`Check out` {icon}`fa-sign-out` button. The +attendance widget updates again, displaying the {guilabel}`Total today` field with the logged time, +while the yellow {guilabel}`Check out` {icon}`fa-sign-out` button changes to a green +{guilabel}`Check in` {icon}`fa-sign-in` button. + +When the user checks out from the database, the *Attendances* app logs the location details for the +user. This information is **only** logged if the user allows their computer to access this +information. + +```{image} check_in_check_out/check-in-database-message.png +:align: center +:alt: The pop-up that appears when an employee checks in inside the database. +``` + +:::{tip} +There is no limit to the amount of times a user can check in and check out. Users are able to +check in and out without any time elapsing (a value of 00:00). Each time an employee logs in and +out, the information is stored and appears on the main *Attendances* dashboard, including check +ins and check outs with no time value. +::: + diff --git a/content/applications/hr/attendances/hardware.md b/content/applications/hr/attendances/hardware.md new file mode 100644 index 000000000..cb675d0ae --- /dev/null +++ b/content/applications/hr/attendances/hardware.md @@ -0,0 +1,109 @@ +# Hardware + +Employees who are **not** database users, and therefore, do **not** have access to the *Attendances* +app, must sign in and out of work using a kiosk. The following are the physical requirements for +setting up a kiosk. + +## Kiosk devices + +A kiosk is a self-service station, where employees can {ref}`check in and out of work +` with either a {ref}`badge ` or an +{ref}`RFID key fob `. Typically, these devices are dedicated as kiosks +only, but any device with an internet browser is able to be set up as a kiosk. + +A kiosk is used by navigating to the webpage specified in the {ref}`configuration +` section of the *Attendances* app. + +Kiosks are set up using one of the following types of devices: + +- Laptop or Desktop computer +- Tablet +- Mobile phone (Android or iOS) + +:::{tip} +Touchscreens are easy to use, and tablets and mobile phones take up less space. That's why most +consider using a smaller device with a touchscreen as a kiosk. + +It is recommended to place kiosks on a secure stand, or mount them securely on a wall. +::: + +(attendances-hardware-badges)= + +## Badges + +Badges are a way for employees to quickly sign in and out from a kiosk, as badges are scanned by the +kiosk's camera to quickly identify the employee. + +To generate a badge, first navigate to the {menuselection}`Employees app`. Next, click on the +desired employee card to open the employee's form, then click the {guilabel}`HR Settings` tab. + +Under the {guilabel}`ATTENDANCE/POINT OF SALE/MANUFACTURING` section, there is a {guilabel}`Badge +ID` field. If this field is blank, click {guilabel}`Generate` at the end of the {guilabel}`Badge +ID` line, and the field is automatically populated with a new badge ID number. Then, click +{guilabel}`Print Badge` at the end of the badge ID number to create a PDF file of the badge. + +If a badge ID number is already present on the employee form, there is no {guilabel}`Generate` +button, only a {guilabel}`Print Badge` button. + +The employee's badge contains the employee's photo, name, job position, company logo, and a barcode +that can be scanned at a kiosk to check in and out. + +Badges can be printed for employees using any thermal or inkjet printer. + +```{image} hardware/badge.png +:align: center +:alt: A badge for an employee that is created from the Employees app. +``` + +:::{note} +Badges are **not** required, as employees can manually identify themselves on the kiosk. +::: + +### Barcode scanners + +When using badges to check in and out, the barcode **must** be scanned to identify the employee. +This can be done with the kiosk's camera, if one is available on the device. + +If a camera is **not** available on the kiosk device, an external barcode scanner must be used to +scan badges. + +Kiosks work with most USB barcode scanners. Bluetooth barcode scanners are also supported for +devices without USB ports, or if a wireless connection is desired. + +Follow the manufacturer's instructions on the barcode scanner to properly connect the barcode +scanner to the kiosk device. + +:::{tip} +If the barcode scanner is connected directly to a computer, it {doc}`must be configured +<../../inventory_and_mrp/barcode/setup/hardware>` to use the computer's keyboard layout. +::: + +:::{note} +An IoT box is **not** required to use a barcode scanner. +::: + +(attendances-hardware-rfid)= + +## RFID key fob readers + +Instead of using a {ref}`badge `, employees can scan a personal RFID +key fob with an RFID reader to check in and out of work. + +It is **required** to purchase *both* RFID key fobs and an RFID reader to use this method to check +in and out. Follow the manufacturer's directions to install the RFID reader, and set up the RFID key +fob. + +```{image} hardware/rfid-reader.jpg +:align: center +:alt: An RFID key fob is placed on an RFID reader. +:width: 50% +``` + +:::{tip} +A recommended RFID reader is the [Neuftech USB RFID Reader](https://neuftech.net/Neuftech-USB-RFID-Reader-ID-Kartenleseger%C3%A4t-Kartenleser-Kontaktlos-Card-Reader-f%C3%BCr-EM4100). +::: + +:::{note} +An IoT box is **not** required to use RFID key fobs. +::: + diff --git a/content/applications/hr/attendances/kiosks.md b/content/applications/hr/attendances/kiosks.md new file mode 100644 index 000000000..8669f1309 --- /dev/null +++ b/content/applications/hr/attendances/kiosks.md @@ -0,0 +1,191 @@ +# Kiosks + +Odoo's *Attendances* app allows employees to check in and out of work directly from the database, or +from a kiosk. + +A kiosk is a {doc}`dedicated device ` (a PC, tablet, or mobile phone) for employees to use +when they check in and out. + +Kiosks are needed for employees who do **not** have access to the database. + +Only employees with access to the database can check in and out from the *Attendances* app, and they +are referred to as *users*. + +:::{important} +If employees {ref}`check in and out ` using a badge or an RFID, +then an {doc}`accessible device ` in {ref}`Kiosk Mode ` +**must** be available in order to use these two methods. +::: + +## Configuration + +There are only a few configurations needed to use kiosks in the *Attendances* application. Navigate +to {menuselection}`Attendances app --> Configuration` to access the {guilabel}`Settings` page to +configure the {ref}`attendances/kiosk-mode` and the {ref}`attendances/kiosk-settings`. + +Once all desired settings have been configured, click the {guilabel}`Save` button on the +{guilabel}`Settings` page, to activate and enable them. + +(attendances-kiosk-mode)= + +### Kiosk Mode section + +Using the drop-down menu, select how an employee checks in when using a kiosk. Options are +{guilabel}`Barcode/RFID`, {guilabel}`Barcode/RFID and Manual Selection`, or {guilabel}`Manual +Selection`. + +:::{note} +The *Barcode* application **does not** need to be installed to use one of the Barcode/RFID +settings. +::: + +(attendances-kiosk-settings)= + +### Kiosk Settings section + +The various settings in the {guilabel}`Kiosk Settings` section determine how employees check in and +out with kiosks. + +- {guilabel}`Barcode Source`: this setting **only** appears if one of the two *Barcode/RFID* + selections were configured for the {ref}`Kiosk Mode ` setting. + + If available, select how barcodes are scanned at the kiosk, via one of the drop-down menu options. + Barcodes can be scanned with a dedicated {guilabel}`Scanner`, or with a device's camera + ({guilabel}`Front Camera` or {guilabel}`Back Camera`). + +- {guilabel}`Employee PIN Identification`: tick this checkbox if employees should use a unique PIN + to check in. PINs are configured on each individual employee record. Refer to the {ref}`new + employee documentation ` documentation for more information on setting up + PINs. + +- {guilabel}`Display Time`: determine how many seconds a check-in/check-out confirmation message + remains on the kiosk screen before returning to the main check in screen. + +- {guilabel}`Attendance Kiosk Url`: Odoo generates a unique web address (URL) to use a device as a + kiosk, without having to sign in to the Odoo database. When setting up a kiosk device, navigate to + this unique web address in a web browser to present the *Attendances* app kiosk. + + :::{important} + These kiosk URLs are **not** secured with any type of access code. Anyone who has the URL can + access the *Attendances* app kiosk. If the URL is compromised for any reason, such as in the + event of a security breach, click {guilabel}`Generate a new Kiosk Mode URL`, located beneath + the link, to generate a new URL, and update the kiosk, accordingly. + ::: + +## Kiosk mode + +Entering *Kiosk Mode* is **only** available for users with specific {ref}`access rights +`. + +*Kiosk Mode* can be activated in two different ways: + +1. Navigate to the {menuselection}`Attendances app`, and click {guilabel}`Kiosk Mode` in the top + menu. The device then signs out of Odoo and enters *Kiosk Mode*. +2. Navigate to the {menuselection}`Attendances app --> Configuration`. In the {guilabel}`Kiosk + Settings` section, use the link in the {guilabel}`Attendance Kiosk Url` field to open *Kiosk + Mode* on any device. + +```{image} kiosks/kiosk-url.png +:align: center +:alt: The Attendances Kiosk URL field in the settings section of the Attendances application. +``` + +As a security measure, once a device is in *Kiosk Mode*, it is not possible to go back into the +database without signing back in. + +:::{note} +At any time, a new kiosk URL can be generated, if needed. Click the {icon}`fa-refresh` +{guilabel}`Generate a new Kiosk Mode URL` +::: + +To exit *Kiosk Mode*, just close the tab in the web browser or return to the main log-in screen of +Odoo. + +(attendances-kiosk-mode-entry)= + +## Check in and out with a kiosk + +### Badge + +To check in or out using a badge, tap the {icon}`fa-camera` {guilabel}`Tap to scan` image in the +center of the kiosk. + +```{image} kiosks/scan-badge.png +:align: center +:alt: The Attendances Kiosk view displaying the scan badge image. +``` + +Then, scan the barcode on the badge using the method configured in the {ref}`Kiosk Settings +` section of the configuration menu. + +Once the barcode is scanned, the employee is checked in or out, and a {ref}`confirmation message +` appears with all the information. + +### RFID + +To check in or out using an RFID key fob, simply scan the fob with an RFID reader. + +Once scanned, the employee is either checked in or checked out, and a {ref}`confirmation message +` appears with all the information. + +### Manually + +Users who do not have a scannable badge, or an RFID fob, can manually check in and out at a kiosk. + +Tap the {guilabel}`Identify Manually` button on the kiosk, and a screen appears with all the +employees that can be checked in or out. The *Employees* application dashboard has the same display. + +Tap on a person to check them in or out, and a {ref}`confirmation message +` appears. + +There are two ways to quickly find a specific person: + +- {guilabel}`Search...`: tap on the {guilabel}`Search...` field, and enter the desired person's + name. As the name is typed in, the matching results are displayed on the screen. +- {guilabel}`Department`: tap on any desired selection in the {guilabel}`Department` section, + located on the left-side of the screen, to **only** view employees from that specific department. + The number at the end of each listed {guilabel}`Department` represents how many employees that + department has. + +#### PIN + +If the {guilabel}`Employee PIN Identification` checkbox was ticked in the {ref}`Kiosk Settings +` section of the configuration menu, the employee is prompted to enter a +PIN when manually checking in or out. + +After the employee is selected, a number pad appears with a message. When checking in, +{guilabel}`(Employee) Welcome! Please enter your PIN to check in` appears above the numbers. When +checking out, {guilabel}`(Employee) Want to check out? Please enter your PIN to check out` appears +above the numbers. + +Tap in the PIN using the number pad, then tap {guilabel}`OK` when done. The employee is then checked +in or out, and a {ref}`confirmation message ` appears. + +```{image} kiosks/enter-pin.png +:align: center +:alt: The pop-up that appears when prompted to enter a pin. +``` + +(attendances-confirmation)= + +### Confirmation message + +When an employee checks in or out, a confirmation message appears, with all the check in or check +out information. When checking in, a welcome message appears, as well as the date and time of check +in. + +An {guilabel}`Hours Previously Today: HH:MM` field also appears, displaying any time that has +already been logged for that employee for the day. If no time has been logged, the value displayed +is: `00:00`. Beneath the message is an {guilabel}`OK` button. + +To exit the screen before the preset time in the kiosk, tap the {guilabel}`OK` button. + +When checking out, the screen displays a goodbye message, with the date and time of check out, and +the total hours logged for the day. Beneath the message is a {guilabel}`Goodbye` button. To exit the +screen before the preset time, tap the {guilabel}`Goodbye` button. + +```{image} kiosks/goodbye-message.png +:align: center +:alt: The goodbye message with all the employee's check out information. +``` + diff --git a/content/applications/hr/employees.md b/content/applications/hr/employees.md new file mode 100644 index 000000000..147a6d1e4 --- /dev/null +++ b/content/applications/hr/employees.md @@ -0,0 +1,20 @@ +--- +nosearch: true +show-content: true +show-toc: true +--- + +# Employees + +Odoo *Employees* organizes a company's employee records, contracts, and departments. + +```{toctree} +:titlesonly: true + +employees/new_employee +employees/departments +employees/certifications +employees/offboarding +employees/retention_report +``` + diff --git a/content/applications/hr/employees/certifications.md b/content/applications/hr/employees/certifications.md new file mode 100644 index 000000000..6870186d4 --- /dev/null +++ b/content/applications/hr/employees/certifications.md @@ -0,0 +1,121 @@ +# Certifications + +When jobs require specific knowledge, it is necessary to track employee certifications to ensure the +necessary knowledge and certifications are in place. + +Certifications include classes, tests, professional seminars, and more. There are no restrictions in +terms of what type of certification records can be added in Odoo. + +:::{important} +To access the *Employee Certifications* report, the **Surveys** app **must** be installed. +::: + +## View certifications + +To view a full list of all employee certifications, navigate to {menuselection}`Employees app --> +Reporting --> Certifications`. + +All certifications appear in a list view, grouped by employee. Each certification entry displays the +following: + +- {guilabel}`Employee`: the employee's name, along with their avatar image. +- {guilabel}`Name`: the title of the certification. +- {guilabel}`Validity Start`: when the employee received the certification. +- {guilabel}`Validity End`: when the certification expires. +- {guilabel}`Certification`: the corresponding course in the **Surveys** app that was completed by + the employee, if applicable. + +The entries are also color-coded. Current certifications that are still valid appear in black, +expired certifications appear in red, and certifications that are going to expire within the next +90 days appear in orange. + +```{image} certifications/certifications.png +:align: center +:alt: The list of employee certifications. +``` + +:::{important} +**Only** certification records with the *Display Type* set to *Certification* on their +{ref}`certification form ` appear on the {guilabel}`Employee +Certifications` report. All other certifications appear in the resume section of the +{doc}`employee form `. +::: + +### View certifications by expiration status + +When managing a large number of employees with a variety of certifications, it can be difficult to +determine which employees need to keep necessary certifications current in the default list view. In +this scenario, it is beneficial to view the certifications by expiration status. + +To do so, navigate to {menuselection}`Employees app --> Reporting --> Certifications`. Next, click +the {icon}`fa-caret-down` {guilabel}`(down arrow)` in the search bar, then click {guilabel}`Add +Custom Group`, revealing a drop-down menu. Click {guilabel}`Expiration Status`, then click away from +the drop-down menu to close it. + +After doing so, all the certifications are organized by status, starting with {guilabel}`Expired` +certifications, then certifications that are {guilabel}`Expiring` soon (within the next 90 days), +and lastly, certifications that are still {guilabel}`Valid`. + +This view provides an easy way to see which employees have certifications that are going to expire +soon, to determine which employees need to take action to keep their certifications current. + +```{image} certifications/status.png +:align: center +:alt: The list of employee certifications, grouped by status. +``` + +(employees-certifications-form)= + +## Log a certification + +To log a certification for an employee, navigate to {menuselection}`Employees app --> Reporting --> +Certifications`. Click {guilabel}`New`, and a blank certification form loads. Enter the following +information on the form: + +- {guilabel}`Title`: Enter a short description for the certification in this field. + +- {guilabel}`Employee`: Using the drop-down menu, select the employee who received the + certification. + +- {guilabel}`Type`: Using the drop-down menu, select the type of certification received. This field + determines where on the employee's resume the certification appears. To create a new + {guilabel}`Type`, enter the type in the field, then click {guilabel}`Create "type"`. + + The default options are: + + - {guilabel}`Experience`: Select this option to have the certification appear in the *Experience* + section of the *Resume* tab on the {doc}`employee form `. + - {guilabel}`Education`: Select this option to have the certification appear in the *Education* + section of the *Resume* tab on the {doc}`employee form `. + - {guilabel}`Internal Certification`: Select this option to have the certification appear in the + *Internal Certification* section of the *Resume* tab on the {doc}`employee form `. + - {guilabel}`Completed Internal Training`: Select this option to have the certification appear in + *Completed Internal Training* section of the *Resume* tab on the {doc}`employee form + `. + +- {guilabel}`Display Type`: Select the visibility of the certification in this field. The default + options are: + + - {guilabel}`Classic`: Select this option to have the certification appear in the *Resume* section + of the employee form, and **not** appear on the *Employee Certifications* report. + - {guilabel}`Course`: Select this option to have the certification appear in the *Resume* section + of the employee form, and **not** appear on the *Employee Certifications* report. Once this + option is selected, a {guilabel}`Course` field appears beneath the {guilabel}`Display Type` + field. Using the drop-down menu, select the course the employee took. The course is created in + the **Surveys** app. + - {guilabel}`Certification`: Select this option to have the certification appear in the *Resume* + section of the employee form, **and** appear on the *Employee Certifications* report. Once this + is selected, a {guilabel}`Certification` field appears beneath the {guilabel}`Display + Type` field. Using the drop-down menu, select the certification the employee took. + +- {guilabel}`Description`: Enter a description for the certification in this field. + +- {guilabel}`Duration`: Click into the first field, and a calendar pop-over window appears. Click on + the start and end dates for the certification validity period. When the correct dates are + selected, click {icon}`fa-check` {guilabel}`Apply`, and both fields are populated. + +```{image} certifications/osha.png +:align: center +:alt: A certification form filled out for an OSHA certificate for construction. +``` + diff --git a/content/applications/hr/employees/departments.md b/content/applications/hr/employees/departments.md new file mode 100644 index 000000000..95a66543b --- /dev/null +++ b/content/applications/hr/employees/departments.md @@ -0,0 +1,153 @@ +# Departments + +All employees in the *Employees* app fall under specific departments within a company. + +## Create new departments + +To make a new department, navigate to {menuselection}`Employees app --> Departments`, then click +{guilabel}`New` in the top-left to reveal a blank department form. Fill out the following +information on the department form: + +```{image} departments/department-form.png +:align: center +:alt: The department for with all fields filled out. +``` + +- {guilabel}`Department Name`: enter a name for the department. +- {guilabel}`Manager`: using the drop-down menu, select the department manager. +- {guilabel}`Parent Department`: if the new department is housed within another department (has a + parent department), select the parent department using the drop-down menu. +- {guilabel}`Custom Appraisal Templates`: if employees in this department require a specific + appraisal form that is different from the default appraisal form, tick the checkbox. If this + option is activated, an {guilabel}`Appraisal Templates` tab appears below the form. This field + **only** appears if the *Appraisals* app is installed. +- {guilabel}`Company`: using the drop-down menu, select the company the department is part of. +- {guilabel}`Appraisal Survey`: using the drop-down menu, select the default survey to use for the + department when requesting feedback from employees. This field **only** appears if the + *Appraisals* app is installed, **and** the *360 Feedback* option is enabled in the settings. +- {guilabel}`Color`: select a color for the department. Click the default white color box to display + all the color options. Click on a color to select it. +- {guilabel}`Appraisal Templates` tab: this tab **only** appears if the {guilabel}`Custom Appraisal + Templates` options is activated on the form. Make any desired edits to the appraisal form. The + appraisal form is used for appraisals for all employees within this department. + +After the form is completed, click the {icon}`fa-cloud-upload` {guilabel}`(cloud upload)` icon to +manually save the changes. When saved, a {guilabel}`Department Organization` chart appears in the +top-right of the department card. + +:::{note} +The form auto-saves while data is entered, however the {guilabel}`Department Organization` chart +does **not** appear until the form is manually saved. If the form is not saved, the +{guilabel}`Department Organization` chart is visible upon opening the department card from the +{guilabel}`Departments` dashboard. +::: + +:::{seealso} +Refer to the {doc}`../appraisals` documentation for more information. +::: + +## Departments dashboard + +To view the currently configured departments, navigate to {menuselection}`Employees app --> +Departments`. All departments appear in a Kanban view, by default, and are listed in alphabetical +order. + +```{image} departments/departments.png +:align: center +:alt: The departments dashboard view with all the department cards in a Kanban view. +``` + +### Kanban view + +Each department has its own Kanban card on the main {guilabel}`Departments` {icon}`oi-view-kanban` +{guilabel}`(Kanban)` dashboard view, that can display the following information: + +- Department name: the name of the department. +- Company: the company the department is part of. +- {guilabel}`Employees`: the number of employees within the department. +- {guilabel}`Appraisals`: the number of appraisals scheduled for employees in the department. +- {guilabel}`Time Off Requests`: the number of unapproved time off requests for employees in the + department {ref}`awaiting approval ` . This **only** appears if there + are requests to approve. +- {guilabel}`Allocation Requests`: the number of unapproved allocation requests for employees in the + department {ref}`awaiting approval `. This **only** appears if there + are requests to approve. +- {guilabel}`New Applicants`: the number of {ref}`new applicants ` for a position + in this department. This **only** appears if there are new applicants. +- {guilabel}`Expense Reports`: the number of employees in the department with {doc}`open expense + reports to approve <../../finance/expenses/approve_expenses>`. This **only** appears if there are + any expense reports waiting for approval. +- {guilabel}`Absence`: the number of absences for the current day. +- Color bar: the selected color for the department appears as a vertical bar on the left side of the + department card. + +:::{note} +Click on an alert in a department card, such as {guilabel}`Time Off Requests`, to reveal a list +view of the requests to approve. This list includes **all** open requests to approve, not just +from the specific department. +::: + +The default view for the {guilabel}`Departments` dashboard is a Kanban view. It is possible to view +the departments in two other forms: a list view and a hierarchy view. + +### List view + +To view the departments in a list view, click the {icon}`fa-align-justify` {guilabel}`(list)` icon +in the top-right corner. The departments appear in a list view, which displays the +{guilabel}`Department Name`, {guilabel}`Company`, {guilabel}`Manager`, {guilabel}`Employees`, +{guilabel}`Parent Department`, and {guilabel}`Color` for each department. + +The departments are sorted alphabetically by {guilabel}`Department Name`, by default. + +```{image} departments/list.png +:align: center +:alt: The departments presented in a list view. +``` + +:::{tip} +When in list view, departments can be managed in batch by selecting one or multiple record's +checkbox, then select the {icon}`fa-cog` {guilabel}`Actions` button to reveal a drop-down menu of +actions. +::: + +### Hierarchy view + +To view the departments in a hierarchy view, click the {icon}`fa-share-alt fa-rotate-90` +{guilabel}`(hierarchy)` icon in the top-right corner. The departments appear in an organizational +chart format, with the highest-level department at the top (typically {guilabel}`Management`), and +all other departments beneath it. All child departments of the first-level child departments are +folded. + +Each department card displays the {guilabel}`Department Name`, the {guilabel}`Manager` (and their +profile image), the {guilabel}`Number of Employees` in the department, and the ability to expand the +department ({guilabel}`Unfold`) if there are child departments beneath it. + +Click the {guilabel}`Unfold` button on a department card to expand it. Once expanded, the +{guilabel}`Unfold` button changes to a {guilabel}`Fold` button. To collapse the department, click +the {guilabel}`Fold` button. Only **one** department *per row* can be unfolded at a time. + +Click anywhere on a department card to open the department form. Click the {guilabel}`(#) Employees` +smart button to view a list of all the employees in that department, including all employees in the +child departments beneath it, organized by individual department. + +```{eval-rst} +.. example:: + In the hierarchy view, if the :guilabel:`(2) Employees` button on the :guilabel:`Management` card + is clicked (the highest-level department card), **all** employees appear in a list view, grouped + by department. This is because **all** departments are children of the :guilabel:`Management` + department. + + If the :guilabel:`(3) Employees` button in the :guilabel:`Sales` department card is clicked, the + employees from the :guilabel:`Sales` department, as well as its two child departments + (:guilabel:`East Coast Territory` and :guilabel:`West Coat Territory`), appear in the list. + + .. image:: departments/hierarchy.png + :align: center + :alt: The departments presented in a hierarchy view. + + .. image:: departments/employee-list.png + :align: center + :alt: The list view of employees for the department that was clicked, including all child + departments. +``` + diff --git a/content/applications/hr/employees/new_employee.md b/content/applications/hr/employees/new_employee.md new file mode 100644 index 000000000..6c71f6892 --- /dev/null +++ b/content/applications/hr/employees/new_employee.md @@ -0,0 +1,570 @@ +# New employees + +When a new employee is hired, the first step is to create a new employee record. This record is a +centralized place where all important information about the employee is stored, including +{ref}`general information `, {ref}`job history and skills +`, {ref}`various work information `, {ref}`personal +details `, {ref}`documents `, and more. + +To begin, open the {menuselection}`Employees` app, then click the {guilabel}`New` button in the +upper-left corner. Doing so reveals a blank employee form. + +Proceed to fill out the required information, along with any additional details. + +```{image} new_employee/new-employee-form.png +:align: center +:alt: Create a new employee form with all fields filled out. +``` + +:::{note} +The current company phone number and name are populated in the {guilabel}`Work Phone` and +{guilabel}`Company` fields. If the *Appraisals* application is installed, the {guilabel}`Next +Appraisal Date` field is populated with a date six months from the current date. +::: + +(employees-general-info)= + +## General information + +The employee form automatically saves as data is entered. However, the form can be saved manually at +any time by clicking the {guilabel}`Save manually` option, represented by a {guilabel}`(cloud with +an upwards arrow)` icon. + +### Required fields + +- {guilabel}`Employee's Name`: enter the employee's name. +- {guilabel}`Company`: from the drop-down menu in this field, select the company the new employee + was hired by, or create a new company by typing the name in the field, and clicking + {guilabel}`Create` or {guilabel}`Create and edit...` from the mini drop-down menu that appears. + +```{image} new_employee/employee-new.png +:align: center +:alt: A new employee form with the required fields highlighted. +``` + +### Optional fields + +- {guilabel}`Photo`: in the top-right image box of the employee form, click on the {guilabel}`✏️ + (pencil)` edit icon to select a photo to upload. + +- {guilabel}`Job Position`: enter the employee's job title under their name, or select it from the + {guilabel}`Job Position` field drop-down menu below to have this top field auto-populate. The + {guilabel}`Job Position` field under the employee name can be modified, and does *not* need to + match the selection made in the {guilabel}`Job Position` drop-down menu in the field below. + + ```{eval-rst} + .. example:: + While it is recommended to have the job positions match, the typed-in description in this top + field can contain more specific information than the selected drop-down :guilabel:`Job + Position`, if desired. + + For instance, if someone is hired for a sales representative position configured as + :guilabel:`Sales Representative` in the *Recruitment* app, that can be selected in the + drop-down :guilabel:`Job Position` field. + + In the typed-in :guilabel:`Job Position` field beneath the :guilabel:`Employee's Name` field, + the position could be more specific, such as `Sales Representative - Subscriptions` if the + employee is focused solely on subscription sales. + + .. image:: new_employee/job-description-fields.png + :align: center + :alt: Both job position fields entered but with different information. + ``` + +- {guilabel}`Tags`: select a tag from the drop-down menu to add relevant tags to the employee. Any + tag can be created in this field by typing it in. Once created, the new tag is available for all + employee records. There is no limit to the amount of tags that can be added. + +- {guilabel}`Work Contact Information`: enter the employee's {guilabel}`Work Mobile`, + {guilabel}`Work Phone`, {guilabel}`Work Email`, and/or {guilabel}`Company` name, if not already + auto-populated. + +- {guilabel}`Department`: select the employee's department from the drop-down menu. + +- {guilabel}`Job Position`: select the employee's job position from the drop-down menu. Once a + selection is made, the {guilabel}`Job Position` field beneath the {guilabel}`Employee's Name` + field automatically updates to reflect the currently selected job position. These positions are + from the {doc}`Recruitment <../../hr/recruitment/new_job/>` application, and reflect the + currently configured job positions. + +- {guilabel}`Manager`: select the employee's manager from the drop-down menu. + +- {guilabel}`Coach`: select the employee's coach from the drop-down menu. + +- {guilabel}`Next Appraisal Date`: this field is **only** visible if the *Appraisals* application is + installed. The date automatically populates with a date that is computed according to the settings + configured in the *Appraisals* application. This date can be modified using the calendar selector. + +:::{note} +After a {guilabel}`Manager` is selected, if the {guilabel}`Coach` field is blank, the selected +manager automatically populates the {guilabel}`Coach` field. +::: + +:::{tip} +To make edits to the selected {guilabel}`Department`, {guilabel}`Manager`, {guilabel}`Coach`, or +{guilabel}`Company`, click the {guilabel}`Internal Link` arrow next to the respective selection. +The {guilabel}`Internal Link` arrow opens the selected form, allowing for modifications. Click +{guilabel}`Save` after any edits are made. +::: + +## Additional information tabs + +(employees-resume)= + +### Resumé tab + +#### Resumé + +Next, enter the employee's work history in the {guilabel}`Resumé` tab. Each resumé line must be +entered individually. When creating an entry for the first time, click {guilabel}`Create a new +entry`, and the {guilabel}`Create Resumé lines` form appears. After an entry is added, the +{guilabel}`Create a new entry` button is replaced with an {guilabel}`Add` button. Enter the +following information for each entry. + +```{image} new_employee/resume-lines.png +:align: center +:alt: "A resum\xE9 entry form with all the information populated." +``` + +- {guilabel}`Title`: type in the title of the previous work experience. +- {guilabel}`Employee`: select the employee from the drop-down menu. +- {guilabel}`Type`: from the drop-down menu, select either {guilabel}`Experience`, + {guilabel}`Education`, {guilabel}`Side Projects`, {guilabel}`Internal Certification`, + {guilabel}`Completed Internal Training`, or type in a new entry, then click {guilabel}`Create + "(Type)"`. +- {guilabel}`Display Type`: from the drop-down menu, choose {guilabel}`Classic` for typical work + experience, {guilabel}`Certification` for experience gained through a certification, or + {guilabel}`Course` for non-certified classes. +- {guilabel}`Duration`: enter the start and end dates for the work experience. To select a date, + click the first empty field to reveal a calendar pop-up window. Proceed to use the {guilabel}`< + (left arrow)` and {guilabel}`> (right arrow)` icons to scroll to the desired month, then click on + the day to select it. Repeat this process to locate and select the end date. When the desired + dates have been selected, click {guilabel}`✔️ Apply`. +- {guilabel}`Description`: enter any relevant details in this field. + +Once all the information is entered, click the {guilabel}`Save & Close` button if there is only one +entry to add, or click the {guilabel}`Save & New` button to save the current entry and create +another resumé line. + +:::{note} +After the new employee form is saved, the current position and company is automatically added to +the {guilabel}`Resumé` tab, with the end date listed as `current`. +::: + +(employees-skills)= + +#### Skills + +An employee's skills can be entered in the {guilabel}`Resumé` tab in the same manner that a resumé +line is created. + +In order to add a skill to an employee record, the skill types must be configured first. If no skill +types are configured, a {guilabel}`Create new Skills` button appears in the {guilabel}`Skills` +section of the {guilabel}`Resumé` tab. {ref}`Configure the skill types ` +before adding any skills to the employee record. + +If the skill types are configured, a {guilabel}`Pick a skill from the list` button appears instead. +Click the {guilabel}`Pick a skill from the list` button, and select the following information for +each skill. + +```{image} new_employee/select-skills.png +:align: center +:alt: A skill form with the information filled out. +``` + +- {guilabel}`Skill Type`: select a {ref}`skill type ` by clicking the radio + button next to the skill type. +- {guilabel}`Skill`: after selecting a {guilabel}`Skill Type`, the corresponding skills associated + with that selected {guilabel}`Skill Type` appear in a drop-down menu. For example, selecting + {guilabel}`Language` as the {guilabel}`Skill Type` presents a variety of languages to select from + under the {guilabel}`Skills` field. Select the appropriate pre-configured skill, or type in a new + skill, then click {guilabel}`Create "(new skill)"`. +- {guilabel}`Skill Level`: pre-defined skill levels associated with the selected {guilabel}`Skill + Type` appear in a drop-down menu. First, select a {guilabel}`Skill Level`, then the progress bar + automatically displays the pre-defined progress for that specific skill level. Skill levels and + progress can be modified in the {guilabel}`Skill Level` pop-up form, which is accessed via the + {guilabel}`Internal Link` arrow next to {guilabel}`Skill Level` field. + +Click the {guilabel}`Save & Close` button if there is only one skill to add, or click the +{guilabel}`Save & New` button to save the current entry and immediately add another skill. + +To delete any line from the {guilabel}`Resumé` tab, click the {guilabel}`🗑️ (trash can)` icon to +delete the entry. Add a new line by clicking the {guilabel}`Add` button next to the corresponding +section. + +:::{important} +Only users with {guilabel}`Officer: Manage all employees` or {guilabel}`Administrator` rights for +the *Employees* app can add or edit skills. +::: + +(employees-skill-types)= + +##### Skill types + +In order to add a skill to an employee's form, the {guilabel}`Skill Types` must be configured. Go to +{menuselection}`Employees app --> Configuration --> Employee: Skill Types` to view the currently +configured skill types and create new skill types. + +:::{note} +The default skill of {guilabel}`Languages` is pre-configured as a skill *type*, but there are no +specific language *skills* listed within that skill type. The {guilabel}`Languages` skill type +must be fully configured before it can be used. +::: + +Click {guilabel}`New` and a new {guilabel}`Skill Type` form appears. Fill out all the details for +the new skill type. Repeat this for all the needed skill types. + +- {guilabel}`Skill Type`: enter the name of the skill type. This acts as the parent category for + more specific skills and should be generic. + +- {guilabel}`Skills`: click {guilabel}`Add a line`, and enter the {guilabel}`Name` for the new + skill, then repeat for all other needed skills. + +- {guilabel}`Levels`: click {guilabel}`Add a line`, and enter the {guilabel}`Name` of the level. + Next, click into the {guilabel}`Progress` field, and enter a percentage (0-100) for that level. + Repeat for all additional levels, as needed. + +- {guilabel}`Default Level`: click the toggle on the level line to set that level as the default. + Typically, the lowest level is set as the default, but any level can be chosen. The toggle turns + green, indicating it is the default level for the skill. Only one level can be set as the default. + + ```{eval-rst} + .. example:: + To add a math skill set, enter `Math` in the :guilabel:`Name` field. Next, in the + :guilabel:`Skills` field, enter `Algebra`, `Calculus`, and `Trigonometry`. Last, in the + :guilabel:`Levels` field enter `Beginner`, `Intermediate`, and `Expert`, with the + :guilabel:`Progress` listed as `25`, `50`, and `100`, respectively. Last, click :guilabel:`Set + Default` on the `Beginner` line to set this as the default skill level. + + .. image:: new_employee/math-skills.png + :align: center + :alt: A skill form for a Math skill type, with all the information entered. + ``` + +The {guilabel}`Skill Type` form automatically saves as data is entered. + +:::{tip} +Once the form is completely filled out, click the {guilabel}`Save manually` button, represented +by a {guilabel}`cloud with an upwards arrow` icon at the top of the screen, and the +{guilabel}`Levels` rearrange in descending order, with the highest level at the top, and the +lowest at the bottom, regardless of the default level and the order they were entered. +::: + +(employees-work-info-tab)= + +### Work information tab + +The {guilabel}`Work Information` tab is where the employee's specific job related information is +found. Their working schedule, various roles, who approves their specific requests (time off, +timesheets, and expenses), their remote work schedule, and specific work location details are listed +here. + +Click on the {guilabel}`Work Information` tab to access this section, and enter the following +information for the new employee: + +- {guilabel}`Location`: select the {guilabel}`Work Address` from the drop-down menu. To modify the + address, hover over the first line (if there are multiple lines) of the address to reveal an + {guilabel}`Internal Link` arrow. Click the {guilabel}`Internal Link` arrow to open up the company + form, and make any edits. + + Use the breadcrumb links to navigate back to the new employee form when done. + + If a new work address is needed, add the address by typing it in the field, then click + {guilabel}`Create (new address)` to add the address, or {guilabel}`Create and edit...` to add the + new address and edit the address form. + +- {guilabel}`Approvers`: to see this section, the user must have either {guilabel}`Administrator` or + {guilabel}`Officer: Manage all employees` rights set for the *Employees* application. Using the + drop-down menus, select the users responsible for approving an {guilabel}`Expense`, a + {guilabel}`Time Off` request, {guilabel}`Timesheet` entries, and {guilabel}`Attendance` records + for the employee. + + Hover over any of the selections to reveal the {guilabel}`Internal Link` arrow. + + Click the {guilabel}`Internal Link` arrow to open a form with the approver's {guilabel}`Name`, + {guilabel}`Email Address`, {guilabel}`Company`, {guilabel}`Phone`, {guilabel}`Mobile`, and + {guilabel}`Default Warehouse` fields. These can be modified, if needed. + + Use the breadcrumb links to navigate back to the new employee form when done. + + :::{important} + The users that appear in the drop-down menu for the {guilabel}`Approvers` section **must** have + *Administrator* rights set for the corresponding human resources role. + + To check who has these rights, go to {menuselection}`Settings app --> Users --> → Manage + Users`. Then, click on an employee, and check the {guilabel}`Human Resources` section of the + {guilabel}`Access Rights` tab. + + - In order for the user to appear as an approver for {guilabel}`Expenses`, they **must** have + either {guilabel}`Team Approver`, {guilabel}`All Approver`, or {guilabel}`Administrator` set + for the {guilabel}`Expenses` role. + - In order for the user to appear as an approver for {guilabel}`Time Off`, they **must** have + either {guilabel}`Officer:Manage all Requests` or {guilabel}`Administrator` set for the + {guilabel}`Time Off` role. + - In order for the user to appear as an approver for {guilabel}`Timesheets`, they **must** have + either {guilabel}`Manager`, {guilabel}`Officer:Manage all contracts`, or + {guilabel}`Administrator` set for the {guilabel}`Payroll` role. + ::: + +- {guilabel}`Remote Work`: use the drop-down menu to select the default location the employee works + from each day of the week. The default options are {guilabel}`Home`, {guilabel}`Office`, or + {guilabel}`Other`. + + A new location can be typed into the field, then click either {guilabel}`Create (new location)` to + add the location, or {guilabel}`Create and edit...` to add the new location and edit the form. + + After edits are done, click {guilabel}`Save & Close`, and the new location is added, and populates + the field. + + Leave the field blank ({guilabel}`Unspecified`) for non-working days like Saturday and Sunday. + + :::{note} + It is also possible to add or modify work locations by navigating to {menuselection}`Employees + app --> Configuration --> Employee: Work Locations`. To modify a location, click on an existing + location, then make any changes on the form. + + Click {guilabel}`New` to create a new location, then enter the following information on the + form. All fields are **required**. + + - {guilabel}`Work Location`: enter the name for the location. This can be as general or as + specific, as needed, such as `Home` or `Building 1, Second Floor`, respectfully. + - {guilabel}`Work Address`: using the drop-down menu, select the address for the location. + - {guilabel}`Cover Image`: click on the icon to select it for the {guilabel}`Cover Image`. + Options are a {guilabel}`house` icon, an {guilabel}`office building` icon, and a + {guilabel}`GPS location marker` icon. + - {guilabel}`Company`: using the drop-down menu, select the company the location applies to. + The current company populates this field, by default. + + ```{image} new_employee/location.png + :align: center + :alt: A new work location form with all fields filled out. + ``` + ::: + +- {guilabel}`Schedule`: select the {guilabel}`Working Hours` and {guilabel}`Timezone` for the + employee. The {guilabel}`Internal Link` arrow opens a detailed view of the specific daily working + hours. Working hours can be modified or deleted here. + + :::{note} + {guilabel}`Working Hours` are related to a company's working schedules, and an Employee + **cannot** have working hours that are outside of a company's working schedule. + + Each individual working schedule is company-specific. So, for multi-company databases, each + company needs to have its own working schedules set. + + If an employee's working hours are not configured as a working schedule for the company, new + working schedules can be added, or existing working schedules can be modified. + + Working hours can be modified in the *Payroll* application, where they are referred to as + {guilabel}`Working Schedules`. + + For more information on how to create or modify {guilabel}`Working Schedules` in the *Payroll* + application, refer to the {doc}`../../hr/payroll` documentation. + ::: + +- {guilabel}`Planning`: select a role from the drop-down menu for both the {guilabel}`Roles` and + the {guilabel}`Default Role` fields. If the {guilabel}`Default Role` is selected as a role, it is + automatically added to the list of {guilabel}`Roles`. + +:::{important} +The users that appear in the drop-down menu for the {guilabel}`Approvers` section **must** have +*Administrator* rights set for the corresponding human resources role. + +To check who has these rights, go to {menuselection}`Settings app --> Users --> → Manage Users`. +Click on an employee, and check the {guilabel}`Human Resources` section of the {guilabel}`Access +Rights` tab. + +- In order for the user to appear as an approver for {guilabel}`Expenses`, they **must** have + either {guilabel}`Team Approver`, {guilabel}`All Approver`, or {guilabel}`Administrator` set + for the {guilabel}`Expenses` role. +- In order for the user to appear as an approver for {guilabel}`Time Off`, they **must** have + either {guilabel}`Officer` or {guilabel}`Administrator` set for the {guilabel}`Time Off` role. +- In order for the user to appear as an approver for {guilabel}`Timesheets`, they **must** have + either {guilabel}`Manager`, {guilabel}`Officer`, or {guilabel}`Administrator` set for the + {guilabel}`Payroll` role. +::: + +:::{note} +{guilabel}`Working Hours` are related to a company's working times, and an employee **cannot** +have working hours that are outside of a company's working times. + +Each individual working time is company-specific. So, for multi-company databases, each company +**must** have its own working hours set. + +If an employee's working hours are not configured as a working time for the company, new working +times can be added, or existing working times can be modified. + +To add or modify a working time, go to the {menuselection}`Payroll app --> Configuration --> +Working Schedules`. Then, either add a new working time by clicking {guilabel}`New`, or edit an +existing one by selecting a {guilabel}`Working Time` from the list to modify it. + +Refer to the {ref}`Working schedules ` section of the payroll +documentation for specific details on creating and editing working schedules. + +After the new working time is created, or an existing one is modified, the {guilabel}`Working +Hours` can be set on the employee form. In the {guilabel}`Schedule` section of the +{guilabel}`Work Information` tab, select the employee's working hours using the drop-down menu. +::: + +(employees-private-info)= + +### Private information tab + +No information in the {guilabel}`Private Information` tab is required to create an employee, +however, some information in this section may be critical for the company's payroll department. In +order to properly process payslips and ensure all deductions are accounted for, the employee's +personal information should be entered. + +Here, the employee's {guilabel}`Private Contact`, {guilabel}`Family Status`, {guilabel}`Emergency` +contact, {guilabel}`Education`, {guilabel}`Work Permit`, and {guilabel}`Citizenship` information is +entered. Fields are entered either using a drop-down menu, ticking a checkbox, or typing in the +information. + +- {guilabel}`Private Contact`: enter the {guilabel}`Private Address`, {guilabel}`Email`, and + {guilabel}`Phone` for the employee. Then, enter the employee's {guilabel}`Bank Account Number` + using the drop-down menu. + + If the bank is not already configured (the typical situation when creating a new employee), enter + the bank account number, and click {guilabel}`Create and edit..`. A {guilabel}`Create Bank Account + Number` form loads. Fill in the necessary information, then click {guilabel}`Save & Close`. + + Next, select the employee's preferred {guilabel}`Language` from the drop-down menu. Then enter the + {guilabel}`Home-Work Distance` in the field. This field is only necessary if the employee is + receiving any type of commuter benefits. + + Lastly, enter the employee's license plate information in the {guilabel}`Private Car Plate` field. + +- {guilabel}`Family Status`: select the current {guilabel}`Marital Status` using the drop-down menu, + either {guilabel}`Single`, {guilabel}`Married`, {guilabel}`Legal Cohabitant`, {guilabel}`Widower`, + or {guilabel}`Divorced`. If the employee has any dependent children, enter the {guilabel}`Number + of Dependent Children` in the field. + +- {guilabel}`Emergency`: type in the {guilabel}`Contact Name` and {guilabel}`Contact Phone` number + of the employee's emergency contact in the respective fields. + +- {guilabel}`Education`: select the highest level of education completed by the employee from the + {guilabel}`Certificate Level` drop-down menu. Default options include {guilabel}`Graduate`, + {guilabel}`Bachelor`, {guilabel}`Master`, {guilabel}`Doctor`, or {guilabel}`Other`. + + Type in the {guilabel}`Field of Study`, and the name of the {guilabel}`School` in the respective + fields. + +- {guilabel}`Work Permit`: if the employee has a work permit, enter the information in this section. + Type in the {guilabel}`Visa No` (visa number), and/or {guilabel}`Work Permit No` (work permit + number) in the corresponding fields. + + Using the calendar selector, select the {guilabel}`Visa Expiration Date`, and/or the + {guilabel}`Work Permit Expiration Date`, to enter the expiration date(s). + + If available, upload a digital copy of the {guilabel}`Work Permit` document. Click + {guilabel}`Upload your file`, navigate to the work permit file in the file explorer, and click + {guilabel}`Open`. + +- {guilabel}`Citizenship`: this section contains all the information relevant to the citizenship of + the employee. Some fields use a drop-down menu, as the {guilabel}`Nationality (Country)`, + {guilabel}`Gender`, and {guilabel}`Country of Birth` fields do. + + The {guilabel}`Date of Birth` uses a calendar selector to select the date. First, click on the + name of the month, then the year, to access the year ranges. Use the {guilabel}`< (left)` and + {guilabel}`> (right)` arrow icons, navigate to the correct year range, and click on the year. + Next, click on the month. Last, click on the day to select the date. + + Type in the information for the {guilabel}`Identification No` (identification number), + {guilabel}`Passport No` (passport number), and {guilabel}`Place of Birth` fields. + + Lastly, if the employee is **not** a resident of the country they are working in, activate the + checkbox next to the {guilabel}`Non-resident` field. + + :::{note} + Depending on the localization setting, other fields may be present. For example, for the United + States, a {guilabel}`SSN No` (Social Security Number) field is present. + ::: + +(employees-hr-settings)= + +### HR settings tab + +This tab provides various fields for different information, depending on the country the company is +located. Different fields are configured for different locations, however some sections appear +regardless. + +- {guilabel}`Status`: select an {guilabel}`Employee Type` and, if applicable, a {guilabel}`Related + User`, with the drop-down menus. The {guilabel}`Employee Type` options include + {guilabel}`Employee`, {guilabel}`Student`, {guilabel}`Trainee`, {guilabel}`Contractor`, or + {guilabel}`Freelancer`. + + :::{important} + Employees do **not** also need to be users. *Employees* do **not** count towards the Odoo + subscription billing, while *Users* **do** count towards billing. If the new employee should + also be a user, the user **must** be created. + + After the employee is created, click the {guilabel}`⚙️ (gear)` icon, then click + {guilabel}`Create User`. A {guilabel}`Create User` form appears. + + Type in the {guilabel}`Name` and {guilabel}`Email Address`. Next, select the + {guilabel}`Company` from the drop-down menu. + + Then, enter the {guilabel}`Phone` and {guilabel}`Mobile` numbers in the respective fields. + + If a photo is available, click the {guilabel}`Edit` icon (which appears as a {guilabel}`✏️ + (pencil)` icon) in the lower-left corner of the image box, which is located in the top-right + corner of the form. + + A file explorer pops up. Navigate to the file, then click {guilabel}`Open` to select it. + Finally, click {guilabel}`Save` after all the information is entered, and the employee record + is automatically updated with the newly-created user populating the {guilabel}`Related User + field`. + + Users can also be created manually. For more information on how to manually add a user, refer + to the {doc}`../../general/users/` document. + ::: + +- {guilabel}`Attendance/Point of Sale/Manufacturing`: the employee's {guilabel}`PIN Code` and + {guilabel}`Badge ID` can be entered here, if the employee needs/has one. Click + {guilabel}`Generate` next to the {guilabel}`Badge ID` to create a badge ID. + + The {guilabel}`PIN Code` is used to sign in and out of the *Attendance* app kiosk, and a + {abbr}`POS (Point Of Sale)` system. + +- {guilabel}`Payroll`: if applicable, enter the {guilabel}`Registration Number of the Employee` in + this section. + + Depending on the localization setting, the other items that appear in this field vary based on + location. In addition, other sections may appear in this tab based on location. It is recommended + to check with the payroll and/or accounting departments to ensure this section, as well as any + other sections relating to payroll that may appear, are filled in correctly. + +- {guilabel}`Application Settings`: enter the employee's {guilabel}`Billing Time Target` for the + billing rate leader board in the *Timesheets* application. Next, enter the {guilabel}`Hourly Cost` + in a XX.XX format. This is factored in when the employee is working at a {doc}`work center + <../../inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers>`. + + If applicable, enter the {guilabel}`Fleet Mobility Card` number. + +:::{note} +Manufacturing costs are added to the costs for producing a product, if the value of the +manufactured product is **not** a fixed amount. This cost does **not** affect the *Payroll* +application. +::: + +```{image} new_employee/hr-settings.png +:align: center +:alt: Enter any information prompted in the HR Settings tab for the employee. +``` + +(employees-docs)= + +## Documents + +All employee-related documents are stored in the *Documents* app. The number of associated documents +is displayed in the {guilabel}`Documents` smart button above the employee record. Click on the smart +button to access all documents. + +Refer to {doc}`documentation <../../productivity/documents>` on the *Documents* app for more +information. + +```{image} new_employee/documents.png +:align: center +:alt: All uploaded documents associated with the employee appear in the documents smart-button. +``` + diff --git a/content/applications/hr/employees/offboarding.md b/content/applications/hr/employees/offboarding.md new file mode 100644 index 000000000..627889549 --- /dev/null +++ b/content/applications/hr/employees/offboarding.md @@ -0,0 +1,106 @@ +# Offboarding + +When an employee leaves the company, it is important to ensure their employee record is updated to +reflect their departure, log the reason why, close any open activities associated with the +employee, and provide them with any important documents. + +## Archive an employee + +In Odoo, when an employee leaves the company they must be *archived*. To archive an employee, first +navigate to the {menuselection}`Employees app`. From here, locate the employee who is leaving the +company, and click on their employee card. + +The employee form loads, displaying all their information. Click the {icon}`fa-gear` +{guilabel}`(gear)` icon in the top-left corner, and a drop-down menu appears. Click +{icon}`oi-archive` {guilabel}`Archive`, and an {guilabel}`Employee Termination` pop-up window +appears. + +Fill out the following fields on the form: + +- {guilabel}`Departure Reason`: Select a reason the employee is leaving from the drop-down menu. The + default options are: + + - {guilabel}`Fired`: Select this option when an employee is being let go, and the company has + given notice. + - {guilabel}`Resigned`: Select this option when the employee no longer wishes to be employed, and + the employee has given notice. + - {guilabel}`Retired`: Select this option when the employee is retiring. + - {guilabel}`Became Freelance`: Select this option when the employee is no longer working for the + company, but is becoming a freelance worker instead. + +- {guilabel}`Contract End Date`: Using the calendar selector, select the last day the employee is + working for the company. + +- {guilabel}`Detailed Reason`: Enter a short description for the employee's departure in this field. + +- {guilabel}`Close Activities`: Tick the checkbox next to each type of activity to close or delete + any open activities associated with it. It is recommended to tick **all** checkboxes that are + applicable. The available options are: + + - {guilabel}`Appraisals`: cancels all appraisals scheduled after the contract end date. + - {guilabel}`Contract`: applies an end date for the current contract. + - {guilabel}`Company Car`: removes the employee as the driver for their current company car, and + {ref}`assigns the next driver `, if applicable. + - {guilabel}`Time Off`: cancels any time off requests after the contract end date. + - {guilabel}`Allocations`: removes the employee from any accrual plans they are on. + +- {guilabel}`HR Info`: Tick the checkbox next to {guilabel}`Send Access Link` to send a download + link to the employee's personal email address, containing all their personal HR files. + +- {guilabel}`Private Email`: This field appears if the {guilabel}`HR Info` checkbox is ticked. Enter + the private email address for the employee. + +When the form is complete, click {guilabel}`Apply`. The employee record is archived, an email with a +download link to their personal documents is sent to the employee's private email address (if +selected), and a red {guilabel}`Archived` banner appears in the top-right corner of the employee +form. The chatter logs the {guilabel}`Departure Date` and {guilabel}`Departure Reason`, and if an +access link was emailed. + +```{image} offboarding/termination.png +:align: center +:alt: The employee termination form with all fields filled out. +``` + +:::{note} +While attempting to send the HR documents access link, an {guilabel}`Invalid Operation` pop-up +window may appear, displaying the following error message: + +{guilabel}`Employee's related user and private email must be set to use "Send Access Link" +function: (Employee Name)` + +If this error appears, click {guilabel}`Close` to close the pop-up window, then tick the +{guilabel}`Send Access Link` checkbox to deselect it on the {guilabel}`Employee Termination` +pop-up window. + +Click {guilabel}`Apply` to archive the employee and close the selected activities on the +{guilabel}`Employee Termination` pop-up window, returning to the employee form. + +Once the employee form, ensure the following fields are populated: + +- {guilabel}`Private Information` tab: Ensure an email address is entered in the + {guilabel}`Email` field. +- {guilabel}`HR Settings` tab: Ensure a {guilabel}`Related User` is selected in the corresponding + field. + +After the necessary information is entered, {ref}`resend the HR documents access link +` +::: + +(employees-send-link)= + +### Send HR documents access link + +If the access link was not sent when first archiving the employee on the *Employee Termination* +form, it can be sent after the employee is archived at any point. + +After an employee is archived, they are no longer visible on the main **Employees** app dashboard. +To view the archived employees, navigate to the {menuselection}`Employees app` dashboard, and click +the {icon}`fa-caret-down` {guilabel}`(down arrow)` in the search bar to reveal a drop-down menu. +Select {guilabel}`Archived`, towards the bottom of the {icon}`fa-filter` {guilabel}`Filters` column, +then click away from the drop-down window to close it. + +Now, only archived employees appear on the dashboard. Click on the desired employee to open their +employee form. On this form, click the {icon}`fa-gear` {guilabel}`(gear)` icon in the top-left +corner, then click {guilabel}`Send HR Documents Access Link` from the resulting drop-down menu. The +chatter logs that the link was sent. + diff --git a/content/applications/hr/employees/retention_report.md b/content/applications/hr/employees/retention_report.md new file mode 100644 index 000000000..31fb4bc20 --- /dev/null +++ b/content/applications/hr/employees/retention_report.md @@ -0,0 +1,108 @@ +# Employee retention report + +It is possible to determine the retention rate for a company by modifying an existing report. + +First, navigate to {menuselection}`Employees app --> Reporting --> Contracts` to open the +{guilabel}`Employee Analysis` report. This report shows the number of all employees for the +{guilabel}`Last 365 Days`, in a default {icon}`fa-line-chart` {guilabel}`Line Chart`. + +```{image} retention_report/employees-analysis.png +:align: center +:alt: The default Employees Analysis report. +``` + +Next, click the {guilabel}`Measures` {icon}`fa-caret-down` button in the upper-left corner, +revealing a drop-down menu. Click {guilabel}`# Departure Employee` in the list, then click away from +the drop-down menu to close it. Now, the report shows all the employees who were archived for the +{guilabel}`Last 365 Days`. + +To view this information in an easier format, click the {icon}`oi-view-pivot` {guilabel}`(Pivot)` +icon in the upper-right corner, and the data is presented in a pivot table. + +The various employees, organized by department, populate the rows. The columns display the following +totals: the monthly {guilabel}`Wage`, the {guilabel}`Fuel Card` budget, total {guilabel}`Annual +Employee Budget` (also referred to as the *annual salary*), the number of {guilabel}`New Employees`, +as well as the number of {guilabel}`Departure Employees` (employees who left). + +```{image} retention_report/pivot-departures.png +:align: center +:alt: The Employees Analysis report, modified to show departed employees only. +``` + +## Employee retention rate comparison report + +It is possible to compare data only for employees who left, compared to the total current employees, +between two separate time periods. This is commonly referred to as the *employee retention rate*. + +To view these metrics, first open the {guilabel}`Employee Analysis` report by navigating to +{menuselection}`Employees app --> Reporting --> Contracts`. Click the {icon}`oi-view-pivot` +{guilabel}`(Pivot)` icon in the upper-right corner to view the information in a pivot table. + +Next, click the {guilabel}`Measures` {icon}`fa-caret-down` button in the upper-left corner, +revealing a drop-down menu. Click {guilabel}`# New Employees`, {guilabel}`Annual Employee Budget`, +{guilabel}`Fuel Card`, and {guilabel}`Wage` in the list, to deselect these metrics and hide them in +the table. Then, click {guilabel}`Count` at the bottom of the list to enable that metric. + +Click away from the drop-down menu to close it. Now, the report shows all the employees who left the +company ({guilabel}`# Departure Employee`), as well as the total number of employees +({guilabel}`Count`), for the {guilabel}`Last 365 Days`. + +To compare the data for the current year with the previous year, click the {icon}`fa-caret-down` +{guilabel}`(down arrow)` in the search bar, revealing multiple filter and grouping options. Click +{guilabel}`Last 365 Days` in the {icon}`fa-filter` {guilabel}`Filters` column, to turn off that +filter. Then, click {guilabel}`Date`, and click the current year (in this example, {guilabel}`2024`) +from the resulting drop-down menu. + +Once a selection is made beneath {guilabel}`Date` in the {icon}`fa-filter` {guilabel}`Filters` +column, a {icon}`fa-adjust` {guilabel}`Comparison` column appears. Click {guilabel}`Date: Previous +Year` in the new column, then click off of the drop-down menu to close it. + +:::{note} +In Odoo, in order to access the {icon}`fa-adjust` {guilabel}`Comparison` column, a specific time +*other than* {guilabel}`Last 365 Days` **must** be selected. If not, the {icon}`fa-adjust` +{guilabel}`Comparison` column is **not** visible. +::: + +Now, the pivot table displays the total number of employees who left the company ({guilabel}`# +Departure Employee`), as well as the total number of employees ({guilabel}`Count`) in the columns. +These are further divided by the two different years, and also displays the {guilabel}`Variation` +between the two. + +The rows display the departments, and lists each individual employee for each department, in the +rows. + +For a more concise view of this report, click {icon}`fa-minus-square-o` {guilabel}`Total` above the +top row of the departments and employees, to collapse the rows. Now, the table presents the total +number of employees who left the company for both years, compared to the total number of employees +for both years, including the difference, in a percentage. + +```{eval-rst} +.. example:: + In this example, :guilabel:`3` employees out of :guilabel:`83` left in 2023, and :guilabel:`8` + employees out of :guilabel:`202` left in 2024. There was a :guilabel:`166.67%` increase in the + employees who left in 2024 as compared to 2023. Additionally, there was a :guilabel:`143.37%` + increase in the total number of employees in 2024 as compared to 2023. + + .. image:: retention_report/comparison-years.png + :align: center + :alt: The report modified to show the difference between two years of employees who left. +``` + +To view more detailed rates for each department, click {icon}`fa-plus-square` {guilabel}`Total` in +the single row, revealing a drop-down menu, and click {guilabel}`Department`. Click away from the +drop-down to close it, and now the pivot table displays the total number of employees who left +({guilabel}`# Departure Employee`), the total number of employees ({guilabel}`Count`), and the +{guilabel}`Variation` (in a percentage) for both 2023 and 2024, organized by department. + +```{eval-rst} +.. example:: + In this example, it can be determined that the :guilabel:`Management` department had the best + retention rate in 2024 as compared to 2023, with a :guilabel:`Variation` rate of + :guilabel:`-100%`. Additionally, it can be determined that the :guilabel:`Management / Research & + Development` department had the most turnover, with a :guilabel:`Variation` of :guilabel:`300%`. + + .. image:: retention_report/department-totals.png + :align: center + :alt: The expanded employee retention report by department. +``` + diff --git a/content/applications/hr/fleet.md b/content/applications/hr/fleet.md new file mode 100644 index 000000000..b523a9263 --- /dev/null +++ b/content/applications/hr/fleet.md @@ -0,0 +1,99 @@ +--- +show-content: true +--- + +# Fleet + +This document outlines the configurations and settings for the *Fleet* application, for both +{ref}`settings ` and {ref}`manufacturers `. + +(fleet-settings)= + +## Settings + +To access the settings menu, go to {menuselection}`Fleet app --> Configuration --> Settings`. Only +two settings need configuration: {guilabel}`End Date Contract Alert` and {guilabel}`New Vehicle +Request`. + +```{image} fleet/fleet-settings.png +:align: center +:alt: Settings available for the Fleet application. +``` + +### End Date Contract Alert + +The {guilabel}`End Date Contract Alert` field how many days before the end of a vehicle contract an +alert should be sent. The responsible people receive an email informing them a vehicle contract is +about to expire in the number of days defined in this field. + +:::{note} +To determine who the responsible person is for a contract, open an individual contract. The +person listed as {guilabel}`Responsible` under the {guilabel}`Contract Information` section of +the contract is the person who will receive the alert. + +To access all contracts, navigate to {menuselection}`Fleet app --> Fleet --> Contracts` and all +contracts appear in the list. Click on a {guilabel}`Contract` to view it. + +An individual contract can also be found by navigating to {menuselection}`Fleet app --> Fleet --> +Fleet` and clicking on an individual vehicle. On the vehicle form, click the +{guilabel}`Contracts` smart button at the top of the page. The contract(s) associated with this +vehicle only appears in the list. Click on an individual contract to open it. The +{guilabel}`Responsible` person is listed on the contract. +::: + +### New Vehicle Request + +The {guilabel}`New Vehicle Request` field sets a limit on how many new vehicles are requested based +on fleet availability. An employee filling out the salary configurator form (after being offered a +position), will *not* be able to request a new car if the number of existing cars is greater than +the number specified in the {guilabel}`New Vehicle Request` field. Enter the specific number limit +for existing available cars in this field. + +```{eval-rst} +.. example:: + If the :guilabel:`New Vehicle Request` limit is set to 20 vehicles, and there are 25 vehicles + available, an employee would not be able to request a new vehicle. If there are only 10 cars + available, then the employee would be able to request a new vehicle. +``` + +(fleet-manufacturers)= + +## Manufacturers + +Odoo *Fleet* comes pre-configured with sixty-six commonly used car and bicycle manufacturers in the +database, along with their logos. To view the pre-loaded manufacturers, go to {menuselection}`Fleet +app --> Configuration --> Manufacturers`. + +The manufacturers appear in an alphabetical list. Each manufacturer's card lists how many specific +models are configured for each particular manufacturer. Odoo comes with forty-six preconfigured +{doc}`models ` from four major auto manufacturers, and one major bicycle manufacturer: +Audi, BMW, Mercedes, Opel (cars), and Eddy Merckx (bicycle). + +```{image} fleet/manufacturer.png +:align: center +:alt: Manufacturer card with the amount of models listed. +``` + +### Add a manufacturer + +To add a new manufacturer to the database, click {guilabel}`Create`. A manufacturer form will load. +Only two pieces of information are needed, the {guilabel}`Name` of the manufacturer, and the logo. +Type the name of the manufacturer in the name field, and select an image to upload for the logo. +When the information is entered, click {guilabel}`Save`. + +:::{seealso} +- {doc}`fleet/models` +- {doc}`fleet/new_vehicle` +- {doc}`fleet/service` +- {doc}`fleet/accidents` +::: + +```{toctree} +:titlesonly: true + +fleet/models +fleet/new_vehicle +fleet/service +fleet/accidents +``` + diff --git a/content/applications/hr/fleet/accidents.md b/content/applications/hr/fleet/accidents.md new file mode 100644 index 000000000..e00ddfdcb --- /dev/null +++ b/content/applications/hr/fleet/accidents.md @@ -0,0 +1,295 @@ +# Accidents + +When managing a fleet, accidents are inevitable. Tracking accidents is crucial for understanding +vehicle maintenance costs and identifying safe drivers. + +Odoo's *Fleet* app offers multiple ways to track accidents. Below are step-by-step instructions for +only **one** method to monitor accidents and repair costs. + +## Structure + +For this example, to track accidents, two {ref}`service types ` are created: +`Accident - Driver's Fault` and `Accident - No Fault`. + +This tracks various repairs associated with accidents, organized by who was at fault. + +When an accident occurs, a service record is created. The specific repairs needed for the accident +are logged in the *Description* of the service record, and the details about the accident are logged +in the *Notes* section. + +With this organizational structure, it is possible to view all accidents organized by fault, car, +driver, or cost. + +:::{note} +To manage accidents, the creation of service records is **required**. + +Refer to the {doc}`service` documentation for detailed instructions on creating service records +in Odoo's *Fleet* app. +::: + +## Log accidents and repairs + +To log an accident, and initiate the repair process, the first step is to {ref}`create a service +record ` detailing the specific repairs needed. + +:::{note} +Some accidents require multiple repairs with several different vendors. For these scenarios, a +separate service record is needed for each vendor performing repairs. To keep records organized, +it is recommended to keep the *Notes* field identical, as well as attaching the same important +documentation, such as a police report. +::: + +Navigate to {menuselection}`Fleet app --> Fleet --> Services` to view the main {guilabel}`Services` +dashboard. Click {guilabel}`New` in the top-left corner, and a blank service form loads. + +Enter the following information on the form: + +- {guilabel}`Description`: enter the description of repairs needed to fully repair the vehicle, such + as `Bodywork`, `Windshield Replacement`, or `Replacement Bumper, Tires, and Windows`. + +- {guilabel}`Service Type`: for this example, select either `Accident - Driver's Fault` or + `Accident - No Fault`, depending on the situation. + + When entering either of these two {guilabel}`Service Types` for the first time, type in the new + service type, then click {guilabel}`Create (new service type)`. A {guilabel}`Create Service Type` + pop-up window appears, with the new service type populating the {guilabel}`Name` field. In the + {guilabel}`Category` field, select {guilabel}`Service` from the drop-down menu, then click the + {guilabel}`Save & Close` button. + + Once an accident service type has been added to the database, it is available to select from the + drop-down menu in the {guilabel}`Service Type` field. + +- {guilabel}`Date`: using the calendar popover window, select the date the accident occurred. + Navigate to the desired month using the {icon}`fa-chevron-left` {icon}`fa-chevron-right` + {guilabel}`(arrow)` icons, then click the date to select it. + +- {guilabel}`Cost`: leave this field blank, as the repair cost is not yet known. + +- {guilabel}`Vendor`: select the vendor performing the repairs using the drop-down menu. If the + vendor has not already been entered in the system, type in the vendor name, and click either + {guilabel}`Create` to add them, or {guilabel}`Create and edit...` to {ref}`add and configure the + vendor `. + +- {guilabel}`Vehicle`: select the vehicle that was in the accident from the drop-down menu. When the + vehicle is selected, the {guilabel}`Driver` field is populated, and the unit of measure for the + {guilabel}`Odometer Value` field appears. + +- {guilabel}`Driver`: the current driver listed for the selected vehicle populates this field when + the {guilabel}`Vehicle` is selected. If a different driver was operating the vehicle when the + accident occurred, select the correct driver from the drop-down menu. + +- {guilabel}`Odometer Value`: enter the odometer reading when the accident occurred. The units of + measure are either in kilometers ({guilabel}`km`) or miles ({guilabel}`mi`), depending on how the + selected vehicle was configured. + +- {guilabel}`NOTES`: enter the specific details of the accident at the bottom of the service form, + such as `Hit a deer` or `Rear-ended at an intersection while stopped`. + +Odoo provides the ability to attach any important paperwork, such as repair estimates and police +reports, to the service record. To do so, click the {icon}`fa-paperclip` {guilabel}`(paperclip)` +icon, located in the *chatter* of the form, and a file explorer pop-up window appears. Navigate to +the desired record, and click {guilabel}`Open` to upload the file. + +> :::{note} +> Once a file is added to a service record, a {guilabel}`Files` section appears in the *chatter*. +> To attach more records, click {icon}`fa-plus-square` {guilabel}`Attach files` to add more +> documents. +> ::: + +```{image} accidents/service-form.png +:align: center +:alt: Enter the information for an accident repair. +``` + +## Service stages + +In Odoo's *Fleet* app, there are four default service stages: + +```{eval-rst} +.. tabs:: + + .. tab:: New + + The default stage when a service record is created. The service has been requested, but + repairs have not begun. The :guilabel:`Cost` field for this stage remains zero. + + .. tab:: Running + + The repair is in-process, but not yet complete. The estimate for repairs is listed in the + :guilabel:`Cost` field. + + .. tab:: Completed + + All repairs listed on the service form have been completed. The :guilabel:`Cost` field is + updated to reflect the final total cost charged for the repairs. + + .. tab:: Cancelled + + The service request has been cancelled. +``` + +During the repair process, change the service status to reflect the vehicle's current state in one +of two ways: on the individual {ref}`service record `, or in the {ref}`Kanban +service view `. + +(fleet-service-record)= + +### Service record + +Open the main *Services* dashboard, by navigating to {menuselection}`Fleet app --> Fleet --> +Services`. Next, click on the individual service record to open the detailed service form. Click the +desired stage in the top-right corner, above the service form, to change the status. + +```{image} accidents/running.png +:align: center +:alt: The stages as seen from the service form. +``` + +(fleet-kanban)= + +### Kanban view + +Open the main *Services* dashboard, by navigating to {menuselection}`Fleet app --> Fleet --> +Services`. First, click the {icon}`oi-view-kanban` {guilabel}`Kanban` icon in the top-right of the +screen, which organizes all repairs by vehicle. + +Next, remove the default {guilabel}`Service Type` filter in the search bar. Upon doing so, all +services appear in a Kanban view, organized by their respective {guilabel}`Status`. + +Drag-and-drop the service record to the desired stage. + +```{image} accidents/drag-n-drop.png +:align: center +:alt: The Kanban view of stages, with a card being dragged and dropped to the Running +: stage. +``` + +## Accident reporting + +One of the main reasons to track accidents using the method outlined in this document is the ability +to view the total accident cost, determine the safest drivers, and calculate the actual total cost +for specific vehicles. + +The main {ref}`Services dashboard ` displays all the various accident +information, while the {ref}`Reporting dashboard ` displays the total +cost for specific vehicles. + +(fleet-services-dashboard)= + +### Services dashboard + +Navigate to {menuselection}`Fleet app --> Fleet --> Services` to view the {guilabel}`Services` +dashboard. All service records are displayed in a {icon}`oi-view-list` {guilabel}`(List)` view, +grouped alphabetically, by {guilabel}`Service Type`. + +The two service types created for accident tracking appear in the list: {guilabel}`Accident - +Driver Fault` and {guilabel}`Accident - No Fault`. + +Each grouping displays the number of records within each type, and lists the individual records +beneath each grouping title. + +```{eval-rst} +.. example:: + In this example, there are six accidents where the driver was at fault, and four accidents that + were not the driver's fault. This dashboard also displays the estimated total :guilabel:`Cost` + for all the accidents in each group. + + An estimated `$19,164.81` dollars are for driver-caused accident repairs, and an estimated + `$2,548.21` dollars are for no-fault accidents. + + .. image:: accidents/group-accidents.png + :align: center + :alt: Accident services, with the total costs highlighted. +``` + +:::{note} +The total {guilabel}`Cost` calculates **all** costs on the repair form, including estimated +costs, as well as final repair costs. This number may not be accurate, if there are any repairs +in the *Running* stage, and the final bill has not yet been calculated. +::: + +(fleet-reporting-dashboard)= + +### Reporting dashboard + +Navigate to {menuselection}`Fleet app --> Reporting --> Costs` to view the {menuselection}`Cost +Analysis` report. This report displays a {icon}`fa-bar-chart` {guilabel}`(Bar Chart)` of all +{guilabel}`Contract` and {guilabel}`Service` costs for the current year, organized by month +({guilabel}`Date : (year)`), by default. The {guilabel}`Sum`, represented by a gray dotted line, is +the combined total of both the {guilabel}`Contract` and {guilabel}`Service` costs. + +To view the total cost by vehicle, click the {icon}`fa-caret-down` {guilabel}`(down arrow)` icon at +the right of the search bar, revealing a drop-down menu. Click {guilabel}`Vehicle` in the +{icon}`oi-group` {guilabel}`Group By` column, and the data is organized by vehicle. + +This displays the true cost for each vehicle, including both the contract cost (such as the monthly +vehicle lease cost) and all service costs, including all accidents. Hover over a column to reveal a +data popover window, which displays the vehicle name and the total cost. This allows for a more +complete view of the vehicle cost. + +```{image} accidents/total-costs.png +:align: center +:alt: The Cost Analysis report, displaying total costs by vehicle. +``` + +To view the individual cost details for both contract costs and repairs, click the +{icon}`oi-view-pivot` {guilabel}`(Pivot)` icon in the top-right corner of the {guilabel}`Cost +Analysis` dashboard. This displays each vehicle on a separate line, and displays the +{guilabel}`Contract` cost and {guilabel}`Service` cost, as well as the {guilabel}`Total` cost. + +```{image} accidents/fleet-pivot.png +:align: center +:alt: |- +: The Cost Analysis report, displaying the contract and service costs separately, as well as +: the total. +``` + +:::{note} +The {icon}`oi-view-pivot` {guilabel}`(Pivot)` view organizes the data by vehicle, by default, +therefore grouping the data by {guilabel}`Vehicle` is not required. If this filer is already +activated, it does not affect the presented data. +::: + +## Manage accident repairs + +For companies with multiple employees, who manage a large fleet of vehicles, displaying only service +records in the {guilabel}`New` and {guilabel}`Running` stages can be time-saving, if there are a +large number of records in the *Services* dashboard. + +Navigate to {menuselection}`Fleet app --> Fleet --> Services`, where all service requests are +organized by {guilabel}`Service Type`. Next, click the {icon}`fa-caret-down` {guilabel}`(down +arrow)` icon at the right of the search bar, revealing a drop-down menu. Click {guilabel}`Add Custom +Filter` in the {icon}`fa-filter` {guilabel}`Filters` column, and a {guilabel}`Add Custom Filter` +pop-up window appears. + +Three drop-down fields need to be configured on the pop-up window. + +In the first field, scroll down, and select {guilabel}`Stage`. + +Leave the second field set to {guilabel}`=`. + +Select {guilabel}`Running` from the drop-down menu in the last field. + +Next, click the {icon}`fa-plus` {guilabel}`(plus)` icon to the right of the last field, and an +identical rule appears beneath the current rule. + +Then, change {guilabel}`Running` to {guilabel}`New` in the third field of the second rule, leaving +the other fields as-is. + +Click the {guilabel}`Add` button at the bottom to add the new custom filter. + +```{image} accidents/custom-filters.png +:align: center +:alt: The filter settings to be added to only display new and running services. +``` + +This slight modification only presents services in the {guilabel}`New` and {guilabel}`Running` +stages. This is a helpful report for a company managing a high number of repairs at any given time. + +To have this report appear as the default report when opening the {guilabel}`Services` dashboard, +click the {icon}`fa-caret-down` {guilabel}`(down arrow)` icon at the far-right of the search bar. +Next, click {guilabel}`Save current search`, beneath the {icon}`fa-star` {guilabel}`Favorites` +column, which reveals another drop-down column beneath it. Tick the checkbox beside +{guilabel}`Default Filter`, then click {guilabel}`Save`. Then, this customized {guilabel}`Services` +dashboard appears, by default, anytime the {guilabel}`Services` dashboard is accessed. + diff --git a/content/applications/hr/fleet/models.md b/content/applications/hr/fleet/models.md new file mode 100644 index 000000000..0916f204b --- /dev/null +++ b/content/applications/hr/fleet/models.md @@ -0,0 +1,188 @@ +# Vehicle models + +When adding a vehicle to the fleet, specify the vehicle model to maintain updated records, which +keeps track of specific details, like maintenance schedules and parts compatibility. + +Odoo comes with preconfigured car models from four major auto manufacturers: Audi, BMW, Mercedes, +and Opel. + +If a new vehicle model joins the fleet, and it is not one of the preconfigured models from these +manufacturers, the model (and/or manufacturer) **must** be {ref}`added to the +database `. + +## Preconfigured models + +The following models are preconfigured in Odoo, and do not need to be added to the database: + +| AUDI | BMW | Mercedes | Opel | +| ---- | ------------ | --------- | ------------- | +| A1 | Serie 1 | Class A | Agilia | +| A3 | Serie 3 | Class B | Ampera | +| A4 | Serie 5 | Class C | Antara | +| A5 | Serie 6 | Class CL | Astra | +| A6 | Serie 7 | Class CLS | AstraGTC | +| A7 | Serie Hybrid | Class E | Combo Tour | +| A8 | Serie M | Class GL | Corsa | +| Q3 | Serie X | Class GLK | Insignia | +| Q5 | Serie Z4 | Class M | Meriva | +| Q7 | | Class R | Mokka | +| TT | | Class S | Zafira | +| | | Class SLK | Zafira Tourer | +| | | Class SLS | | + +(fleet-add-model)= + +## Add a new model + +To add a new vehicle model, navigate to {menuselection}`Fleet app --> Configuration --> Models: +Models`. Click {guilabel}`New`, and in a new vehicle model form, enter the following information on +the form. + +:::{note} +Be advised, some fields are specific to Belgian based companies, so not all fields or sections +may be visible depending on the location of the company. +::: + +- {guilabel}`Model name`: enter the model name in the field. + +- {guilabel}`Manufacturer`: select the manufacturer from the drop-down menu. If the manufacturer is + not configured, type in the manufacturer, and click {guilabel}`Create` or {guilabel}`Create and + edit..`. + + :::{note} + When the manufacturer is selected, if it is one of the default manufacturers in *Odoo*, the + logo for the manufacturer automatically loads in the image box in the top-right corner. + ::: + +- {guilabel}`Vehicle Type`: select one of two preconfigured vehicle types, either {guilabel}`Car` or + {guilabel}`Bike`, from the drop-down menu. The vehicle types are hardcoded in Odoo, and are + integrated with the *Payroll* application, since vehicles can be part of an employee's benefits. + Adding additional vehicle types is *not* possible as it affects payroll. + +- {guilabel}`Category`: select a category for the vehicle from the drop-down menu. To create a new + category, type in the category and then click {guilabel}`Create (new category)`. + +### Information tab + +In the {guilabel}`Information` tab, specify details about the car model, such as the car size, +passenger capacity, cost settings (applicable to the Belgium localization only), and engine +information. + +#### Model section + +- {guilabel}`Seats Number`: enter how many passengers the vehicle can accommodate. +- {guilabel}`Doors Number`: enter the number of doors the vehicle has. +- {guilabel}`Color`: enter the color of the vehicle. +- {guilabel}`Model Year`: enter the year the vehicle was manufactured. +- {guilabel}`Trailer Hitch`: tick this checkbox if the vehicle has a trailer hitch installed. + +#### Salary section + +:::{note} +The {guilabel}`Salary` section **only** appears for Belgian-based companies, and **only** if the +company has their localization setting set to Belgium. The cost values are all *monthly*, with +the exception of the {guilabel}`Catalog Value (VAT Incl.)`. +::: + +- {guilabel}`Can be requested`: tick this checkbox if employees can request this model vehicle, if a + vehicle is part of their employee contract. +- {guilabel}`Catalog Value (VAT Incl.)`: enter the {abbr}`MSRP (Manufacturer's Suggested Retail + Price)` for the vehicle at the time of purchase or lease. +- {guilabel}`C02 fee`: represents the carbon dioxide emission fee paid to the Belgian government. + This value is automatically calculated, based on Belgian laws and regulations, and **cannot** be + modified. The value is based on the figure entered in the {guilabel}`CO2 Emissions` field (in the + {guilabel}`Engine` section of the {guilabel}`Information` tab) on the vehicle form. + +:::{important} +Modifying the {guilabel}`CO2 Emissions` field adjusts the value in the {guilabel}`CO2 fee` field. +::: + +- {guilabel}`Cost (Depreciated)`: enter the monthly vehicle cost, which appears in the salary + configurator for future employees. This value impacts the gross and net salary of the employee + assigned to the vehicle. This figure is depreciated over time, according to local tax laws. The + {guilabel}`Cost (Depreciated)` does **not** depreciate automatically on the *vehicle model*, it + only depreciates based on the *contract* linked to a specific vehicle. +- {guilabel}`Total Cost (Depreciated)`: this value is the combination of the {guilabel}`Cost + (Depreciated)` and the {guilabel}`C02 fee` fields. It also depreciated over time. + +#### Engine + +- {guilabel}`Fuel Type`: select the type of fuel the vehicle uses from the drop-down menu. The + options are {guilabel}`Diesel`, {guilabel}`Gasoline`, {guilabel}`Hybrid Diesel`, {guilabel}`Hybrid + Gasoline`, {guilabel}`Plug-in Hybrid Diesel`, {guilabel}`Plug-in Hybrid Gasoline`, + {guilabel}`CNG`, {guilabel}`LPG`, {guilabel}`Hydrogen`, or {guilabel}`Electric`. +- {guilabel}`CO2 Emissions`: enter the average carbon dioxide emissions the vehicle produces in + grams per kilometer (g/km). This information is provided by the car manufacturer. +- {guilabel}`CO2 Standard`: enter the standard amount of carbon dioxide in grams per kilometer + (g/km) for a similar-sized vehicle. +- {guilabel}`Transmission`: select {guilabel}`Manual` or {guilabel}`Automatic` transmission from the + drop-down menu. +- {guilabel}`Power`: if the vehicle is electric or hybrid, enter the power the vehicle uses in + kilowatts (kW). +- {guilabel}`Horsepower`: enter the vehicle's horsepower in this field. +- {guilabel}`Horsepower Taxation`: enter the amount that is taxed, based on the size of the + vehicle's engine. This is determined by local taxes and regulations, and varies depending on the + location. It is recommended to check with the accounting department to ensure this value is + correct. +- {guilabel}`Tax Deduction`: this field auto-populates, according to the engine specifications, and + **cannot** be modified. The percentage is based on the localization settings and local tax laws. + +### Vendors tab + +Specify the vendors a vehicle can be purchased from in this tab. With proper setup, requests for +quotations for vehicles can be easily created through Odoo's *Purchase* app. + +To add a vendor, click {guilabel}`Add`, which opens an {guilabel}`Add: Vendors` pop-up window, with +a list of all the vendors currently in the database. Add a vendor by ticking the checkbox next to +the vendor name, then click {guilabel}`Select`. There is no limit to the number of vendors that can +be added to this list. + +If a vendor is not in the database, add a vendor by clicking {guilabel}`New` in the bottom-left of +the {guilabel}`Add: Vendors` pop-up window. In the {guilabel}`Create Vendors` form that appears, +enter the necessary information, then click {guilabel}`Save & Close` to add the vendor, or click +{guilabel}`Save & New` to add the current vendor and create another new vendor. + +```{image} models/vendor.png +:align: center +:alt: Vendor form to fill out when adding a new vendor. +``` + +(fleet-categories)= + +## Model category + +To best organize a fleet, it is recommended to have vehicle models housed under a specific category, +to easily see what kinds of vehicles are in the fleet. Model categories are set on the {ref}`vehicle +model form `. + +Odoo does **not** come with any models preconfigured; all models **must** be added. + +To view any models currently set up in the database, navigate to {menuselection}`Fleet app --> +Configuration --> Models: Categories`. All models are displayed in a list view. + +### Add a new model category + +To add a new category, click the {guilabel}`New` button in the top-left corner of the +{guilabel}`Categories` page. A new entry line appears at the bottom of the list. Type in the new +category, then either click {guilabel}`Save`, or click anywhere on the screen, to save the entry. + +To reorganize how the categories appear in the list, click on the {icon}`oi-draggable` +{guilabel}`(draggable)` icon to the left of any desired category name, and drag the line to the +desired position. + +The order of the list does not affect the database in any way. However, it may be preferable to view +the vehicle categories in a specific order, for example, by size, or the numbers of passengers the +vehicle can carry. + +:::{note} +When used with the **Inventory** app, the {guilabel}`Max Weight` and {guilabel}`Max Volume` +fields track a vehicle's capacity. This helps manage in-house deliveries by {doc}`showing how +much space and weight remain for loading products +<../../inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dispatch>`. +::: + +```{image} models/categories.png +:align: center +:alt: List view of the models in the fleet. +``` + diff --git a/content/applications/hr/fleet/new_vehicle.md b/content/applications/hr/fleet/new_vehicle.md new file mode 100644 index 000000000..b0578c12e --- /dev/null +++ b/content/applications/hr/fleet/new_vehicle.md @@ -0,0 +1,348 @@ +# New vehicles + +Odoo's *Fleet* app manages all vehicles, and the accompanying documentation that comes with vehicle +maintenance, and drivers records. + +Upon opening the {menuselection}`Fleet` application, all vehicles are organized within the +{guilabel}`Vehicles` dashboard, which is the default dashboard for the *Fleet* application. Each +vehicle is displayed in its corresponding Kanban stage, based on its status. The default stages are +{guilabel}`New Request`, {guilabel}`To Order`, {guilabel}`Registered`, and {guilabel}`Downgraded`. + +To add a new vehicle to the fleet from the {guilabel}`Vehicles` page, click the {guilabel}`New` +button in the top-left corner, and a blank vehicle form loads. Then, proceed to enter the vehicle +information on the vehicle form. + +The form auto-saves as data is entered. However, the form can be saved manually at any time by +clicking the *save manually* option, represented by a {guilabel}`(cloud upload)` icon, located in +the top-left corner of the page. + +(fleet-new-vehicle-vehicle-form)= + +## Vehicle form fields + +- {guilabel}`Model`: select the vehicle's model from the drop-down menu. Once a model is selected, + additional fields may appear on the form. + + If the model is not listed, type in the model name, and click either {guilabel}`Create "model"`, + or {guilabel}`Create and edit...` to {ref}`create a new model and edit the model details + `. + +- {guilabel}`License Plate`: enter the vehicle's license plate number in this field. + +- {guilabel}`Tags`: select any tags from the drop-down menu, or type in a new tag. There is no limit + on the amount of tags that can be selected. + +```{image} new_vehicle/model.png +:align: center +:alt: The new vehicle form, showing the model section. +``` + +:::{note} +The {guilabel}`Model` is the only required field on the new vehicle form. When a model is +selected, other fields appear on the vehicle form, and relevant information auto-populates the +fields that apply to the model. If some of the fields do not appear, this may indicate there is +no model selected. +::: + +(fleet-new-vehicle-new-driver)= + +### Driver section + +This section of the vehicle form relates to the person who is currently driving the car, as well as +any plans for a change in the driver in the future, and when. + +- {guilabel}`Driver`: select the driver from the drop-down menu, or type in a new driver and click + either {guilabel}`Create "driver"` or {guilabel}`Create and edit...` to {ref}`create a new driver, + and edit the driver details `. + + :::{important} + A driver does **not** have to be an employee. When creating a new driver, the driver is added + to the *Fleet* application, **not** the *Employees* application. + + If the *Contacts* application is installed, the driver information is also stored in the + *Contacts* application. + ::: + +- {guilabel}`Mobility Card`: if the selected driver has a mobility card listed on their employee + card in the *Employees* application, the mobility card number appears in this field. If there is + no mobility card listed, and one should be added, {ref}`edit the employee record + ` in the *Employees* application. + +- {guilabel}`Future Driver`: if the next driver for the vehicle is known, select the next driver + from the drop-down menu. Or, type in the next driver and click either {guilabel}`Create "future + driver"` or {guilabel}`Create and edit...` to {ref}`create a new future driver, and edit the + driver details `. + +- {guilabel}`Plan To Change Car`: if the current driver set for this vehicle plans to change their + vehicle - either because they are waiting on a new vehicle that is being ordered, or this is a + temporary vehicle assignment, and they know which vehicle they are driving next - check this box. + Do **not** check this box if the current driver does not plan to change their vehicle. + +- {guilabel}`Assignment Date`: using the drop-down calendar, select when the vehicle is available + for another driver. Select the date by navigating to the correct month and year using the + {guilabel}`⬅️ (left arrow)` and {guilabel}`➡️ (right arrow)` icons. Then, click on the specific + day. If this field is left blank, that indicates the vehicle is currently available, and can be + reassigned to another driver. If it is populated, the vehicle is not available for another driver + until the selected date. + +- {guilabel}`Company`: select the company from the drop-down menu. This field only appears in a + multi-company database. + +(fleet-new-vehicle-add-driver)= + +#### Create a new driver + +If a driver is not already in the system, the new driver should first be configured and added to the +database. A new driver can be added either from the {guilabel}`Driver` or {guilabel}`Future Driver` +fields on the {ref}`vehicle form `. + +First, type in the name of the new driver in either the {guilabel}`Driver` or {guilabel}`Future +Driver` field, then click {guilabel}`Create and edit...`. A {guilabel}`Create Driver` or +{guilabel}`Create Future Driver` form appears, depending on which field initiated the form. + +Both the {guilabel}`Create Driver` and {guilabel}`Create Future Driver` forms are identical. + +(fleet-new-vehicle-general-info)= + +:::{note} +Depending on the installed applications, different tabs or fields may be visible on the +{guilabel}`Create Driver` and {guilabel}`Create Future Driver` forms. +::: + +##### General information + +Fill out the following information on the top-half of the form: + +- {guilabel}`Individual` or {guilabel}`Company`: choose if the driver being added is an individual + driver or a company. Click the radio button to make a selection. + + When a selection is made, some fields may disappear from the form. If any of the fields below are + not visible, that is because {guilabel}`Company` was selected instead of {guilabel}`Individual`. + +- {guilabel}`Name`: enter the name of the driver or company in this field. + +- {guilabel}`Company Name...`: using the drop-down menu, select the company the driver is associated + with. + + If the {guilabel}`Company` radio button is selected at the top of the form, this field does not + appear. + +- {guilabel}`Contact`: enter the contact information in this section. + + If desired, the {guilabel}`Contact` field can be changed to a different type of contact. Click on + {guilabel}`Contact` to reveal a drop-down menu. The available options to select are + {guilabel}`Contact`, {guilabel}`Invoice Address`, {guilabel}`Delivery Address`, + {guilabel}`Follow-up Address`, or {guilabel}`Other Address`. + + If desired, select one of these other options for the {guilabel}`Contact` field, and enter the + corresponding information. + + If the {guilabel}`Company` radio button is selected at the top of the form, this field is labeled + {guilabel}`Address` and cannot be modified. + +- {guilabel}`Tax ID`: enter the driver or company's tax ID in this field. + +- {guilabel}`Job Position`: enter the driver's job position in this field. If the + {guilabel}`Company` radio button is selected at the top of the form, this field does not appear. + +- {guilabel}`Phone`: enter the driver or company's phone number in this field. + +- {guilabel}`Mobile`: enter the driver or company's mobile number in this field. + +- {guilabel}`Email`: enter the driver or company's email address in this field. + +- {guilabel}`Website`: enter the driver or company's website address in this field. + +- {guilabel}`Title`: using the drop-down menu, select the driver's title in this field. The default + options are {guilabel}`Doctor`, {guilabel}`Madam`, {guilabel}`Miss`, {guilabel}`Mister`, and + {guilabel}`Professor`. + + If the {guilabel}`Company` radio button is selected at the top of the form, this field does not + appear. + +- {guilabel}`Tags`: using the drop-down menu, select any tags that apply to the driver or company. + + To add a new tag, type in the tag, then click {guilabel}`Create "tag"`. + + There is no limit to the number of tags that can be selected. + +```{image} new_vehicle/create-driver.png +:align: center +:alt: The top portion of the create driver form. +``` + +##### Contacts & Addresses tab + +After completing the top-half of the {guilabel}`Create Driver` or {guilabel}`Create Future Driver` +form, add any other contacts and addresses associated with the driver or company in this tab. + +To add a new contact, click the {guilabel}`Add` button, and a {guilabel}`Create Contact` pop-up +window appears. + +Before entering the necessary information on the form, select the type of contact being added from a +series radio button options located at the top of the form. Those options are: + +- {guilabel}`Contact`: select this option to add general contact details for employees of the + associated company. +- {guilabel}`Invoice Address`: select this option to add a preferred address for all invoices. When + added to the form, this address is selected by default when sending an invoice to the associated + company. +- {guilabel}`Delivery Address`: select this option to add a preferred address for all deliveries. + When added to the form, this address is selected by default when delivering an order to the + associated company. +- {guilabel}`Follow-up Address`: select this option to add a preferred address for all follow-up + correspondence. When added to the form, this address is selected by default when sending reminders + about overdue invoices. +- {guilabel}`Other Address`: select this option to add any other necessary addresses for the company + or driver. + +```{image} new_vehicle/create-contact.png +:align: center +:alt: The create contact form with all parts filled in. +``` + +Depending on the {guilabel}`Contact Type`, some optional fields may not be visible. The available +fields are identical to the fields in the {ref}`general information +` section of the new driver form. + +Add any notes to the {guilabel}`Internal notes...` section of the form. + +After entering all of the information, click either {guilabel}`Save & Close` to add the one new +contact, or {guilabel}`Save & New` to add the current address record and create another address +record. + +As contacts are added to this tab, each contact appears in a separate box, with an icon indicating +what type of contact is listed. + +```{eval-rst} +.. example:: + An :guilabel:`Invoice Address` displays a :guilabel:`💲 (dollar sign)` icon inside that specific + address box, whereas a :guilabel:`Delivery Address` displays a :guilabel:`🚚 (truck)` icon + inside. + + .. image:: new_vehicle/contacts-address.png + :align: center + :alt: The create contact form with all parts filled in. +``` + +##### Sales & Purchase tab + +Enter the following sales and purchasing information, in the {guilabel}`Sales & Purchase` tab of the +{guilabel}`Create Driver` or {guilabel}`Create Future Driver` pop-up form for the various sections +below. + +Depending on the other installed applications, additional fields and sections may appear. The +following are all default fields for the *Fleet* application **only**. + +###### Sales section + +- {guilabel}`Salesperson`: using the drop-down menu, select the user who is the main point of + contact for sales with this driver's company. + + This person **must** be an internal user of the company, meaning they can log into the database as + a user. + +###### Misc + +- {guilabel}`Company ID`: if the company has an ID number, **other than** its *tax ID*, enter it in + this field. + +- {guilabel}`Reference`: enter any text to give more information regarding the contact person. This + is an internal note to provide any additional information. + + ```{eval-rst} + .. example:: + A company has several people with the same name, John Smith. The :guilabel:`Reference` field + could state `John Smith at X205 - purchaser` to provide additional details. + ``` + +##### Internal Notes tab + +Add any notes that pertain to the driver, or any other necessary information, in this tab. + +### Vehicle section + +This section of the vehicle form relates to the physical details of the vehicle. + +If a preexisting vehicle in the database was selected for the {guilabel}`Model` field in the top +portion of the form, some fields may auto-populate, and additional fields may also appear. + +Fill in the following fields on the form: + +- {guilabel}`Category`: using the drop-down menu, select the vehicle category from the available + options. To create a new category, type in the new category name, then click {guilabel}`Create + "category"`. +- {guilabel}`Order Date`: using the drop-down calendar, select the date the vehicle was ordered. +- {guilabel}`Registration Date`: using the drop-down calendar, select the date the vehicle was + registered. +- {guilabel}`Cancellation Date`: using the drop-down calendar, select the date the vehicle lease + expires, or when the vehicle is no longer available. +- {guilabel}`Chassis Number`: enter the chassis number in the field. This is known in some countries + as the {abbr}`VIN (Vehicle Identification Number)` number. +- {guilabel}`Last Odometer`: enter the last known odometer reading in the number field. Using the + drop-down menu next to the number field, select whether the odometer reading is in kilometers + {guilabel}`(km)` or miles {guilabel}`(mi)`. +- {guilabel}`Fleet Manager`: select the fleet manager from the drop-down menu, or type in a new + fleet manager, and click either {guilabel}`Create` or {guilabel}`Create and Edit`. +- {guilabel}`Location`: type in the specific location where the vehicle is typically located in this + field. The entry should clearly explain where the vehicle can be found, such as `Main Garage` or + `Building 2 Parking Lot`. + +```{image} new_vehicle/new-vehicle-type.png +:align: center +:alt: The new vehicle form, showing the vehicle tax section. +``` + +### Tax Info tab + +Depending on the localization setting for the database, and what additional applications are +installed, other fields may be present on the form. + +The sections below are default and appear for all vehicles, regardless of other installed +applications or localization settings. + +#### Fiscality + +- {guilabel}`Horsepower Taxation`: enter the amount that is taxed based on the size of the vehicle's + engine. This is determined by local taxes and regulations, and varies depending on the location. + It is recommended to check with the accounting department to ensure this value is correct. + +#### Contract + +- {guilabel}`First Contract Date`: select the start date for the vehicle's first contract using the + drop-down calendar. Typically this is the day the vehicle is purchased or leased. +- {guilabel}`Catalog Value (VAT Incl.)`: enter the MSRP (Manufacturer's Suggested Retail Price) for + the vehicle at the time of purchase or lease. +- {guilabel}`Purchase Value`: enter the purchase price or the value of the lease for the vehicle. +- {guilabel}`Residual Value`: enter the current value of the vehicle. + +:::{note} +The values listed above affect the accounting department. It is recommended to check with the +accounting department for more information and/or assistance with these values. +::: + +```{image} new_vehicle/new-vehicle-tax.png +:align: center +:alt: The new vehicle form, showing the vehicle tax section. +``` + +### Model tab + +If the model for the new vehicle is already configured in the database, the {guilabel}`Model` tab +will be populated with the corresponding information. If the model is not already in the database +and the {guilabel}`Model` tab needs to be configured, {ref}`configure the new vehicle model +`. + +Check the information in the {guilabel}`Model` tab to ensure it is accurate. For example, the color +of the vehicle, or if a trailer hitch is installed, are examples of common information that may need +updating. + +```{image} new_vehicle/model-tab.png +:align: center +:alt: The new vehicle form, showing the vehicle tax section. +``` + +### Note tab + +Enter any notes for the vehicle in this section. + diff --git a/content/applications/hr/fleet/service.md b/content/applications/hr/fleet/service.md new file mode 100644 index 000000000..6548e3648 --- /dev/null +++ b/content/applications/hr/fleet/service.md @@ -0,0 +1,540 @@ +# Services + +To properly maintain a fleet of vehicles, regular maintenance as well as periodic repairs are +needed. Scheduling repairs and managing services for an entire fleet is necessary to ensure all +vehicles are in good working order when they are needed. + +(fleet-service-form)= + +## Create service records + +To log a service for a vehicle, go to the main {guilabel}`Services` dashboard by navigating to +{menuselection}`Fleet app --> Fleet --> Services`. Open a new service form by clicking the +{guilabel}`New` button in the top-left corner. + +Fill out the information on the form. The only two fields that are required to be populated are +{guilabel}`Service Type` and {guilabel}`Vehicle`. + +The service form automatically saves as data is entered. However, the form can be saved manually at +any time by clicking the {guilabel}`Save manually` option, represented by a {guilabel}`(cloud +upload)` icon. + +The fields on the form are: + +- {guilabel}`Description`: enter a brief description of the service. + +- {guilabel}`Service Type`: select the type of service performed using the drop-down menu. Or, enter + a new type of service, and click either {guilabel}`Create "service type"` or {guilabel}`Create and + edit...` to {ref}`add the service type and configure it `. + + :::{important} + {guilabel}`Service Types` are **not** pre-configured in Odoo. When logging a service for the + first time, the *type* of service needs to be {ref}`created ` before it can be + selected. + ::: + +- {guilabel}`Date`: using the calendar popover window, select the date the service was provided, or + is scheduled to be performed. Navigate to the desired month using the {guilabel}`< > (arrow)` + icons, then click on the date to select it. + +- {guilabel}`Cost`: enter the cost of the service. + +- {guilabel}`Vendor`: select the vendor who performed the service using the drop-down menu. If the + vendor has not already been entered in the system, type in the vendor name, and click either + {guilabel}`Create` to add them, or {guilabel}`Create and edit...` to {ref}`add and configure the + vendor `. + +- {guilabel}`Vehicle`: select the vehicle that was serviced from the drop-down menu. When the + vehicle is selected, the {guilabel}`Driver` field is populated, and the unit of measure for the + {guilabel}`Odometer Value` field appears. + +- {guilabel}`Driver`: the current driver listed for the selected vehicle is populated when the + {guilabel}`Vehicle` is selected. If the driver needs to be changed, another driver can be selected + from the drop-down menu. + +- {guilabel}`Odometer Value`: enter the odometer reading when the service was done. The units of + measure are either in kilometers ({guilabel}`km`) or miles ({guilabel}`mi`), depending on how the + selected vehicle was configured. + + When the {guilabel}`Vehicle` is selected, the unit of measure for this field is populated. This + comes from the vehicle form. + + :::{tip} + To change from kilometers to miles, or vice versa, click the {guilabel}`Internal Link` button + to the right of the vehicle selected in the {guilabel}`Vehicle` field. + + Change the unit of measure, then navigate back to the service form, via the breadcrumb links. + The unit of measure is then updated in the {guilabel}`Odometer Value` field. + ::: + +- {guilabel}`Notes`: enter any notes for the repair at the bottom of the service form. + +```{image} service/new-service.png +:align: center +:alt: Enter the information for a new service. The required fields are Service Type +: and Vehicle. +``` + +(fleet-new-type)= + +### Create service type + +Service types must be created from a service form. There is no other way to access the list of +service types. + +On the {ref}`service form `, type in the name of the new {guilabel}`Service +Type` in the corresponding field. Then, click {guilabel}`Create and edit...`, and a +{guilabel}`Create Service Type` pop-up form appears. + +The service type entered on the service form automatically populates the {guilabel}`Name` field, +which can be modified, if desired. + +Then, select the {guilabel}`Category` for the new service type from the drop-down menu in that +field. The two default options to choose from are {guilabel}`Contract` or {guilabel}`Service`. +Additional categories **cannot** be created. + +If the service applies to **only** contracts or services, select the corresponding +{guilabel}`Category`. If the service applies to **both** contracts *and* services, leave this field +blank. + +When done, click {guilabel}`Save & Close`. + +(fleet-new-vendor)= + +### Create vendor + +When a service is done for the first time, typically, the vendor is not in the database yet. It is +best practice to add the full details for a vendor in the database, so that any necessary +information can be easily retrieved. + +On the {ref}`service form `, type in the name of the new {guilabel}`Vendor` in +the corresponding field. Then, click {guilabel}`Create and edit...`, and a {guilabel}`Create +Vendor` form appears. + +The vendor name entered on the service form populates the {guilabel}`Name` field, by default. This +field can be modified, if desired. + +:::{note} +Different tabs or fields may be visible on the {guilabel}`Create Vendor` form, depending on what +other applications are installed. +::: + +#### General information + +Fill out the following information in the top-half of the form: + +- {guilabel}`Individual` or {guilabel}`Company`: select whether the new vendor being added is an + individual or a company, by clicking the corresponding radio button. + + When a selection is made, some fields may disappear from the form. If any of the fields below are + not visible, that is because {guilabel}`Company` was selected, instead of {guilabel}`Individual`. + +- {guilabel}`Name`: enter a name for the individual or company in this field. + +- {guilabel}`Company Name`: using the drop-down menu, select the company that the vendor is + associated with, if any. + + If the {guilabel}`Company` radio button at the top of the form is selected, this field does not + appear. + +- {guilabel}`Contact`: enter the contact information in this section. + + If desired, the {guilabel}`Contact` field can be changed to a different type of contact. Click on + {guilabel}`Contact` to reveal a drop-down menu. The available options to select are + {guilabel}`Contact`, {guilabel}`Invoice Address`, {guilabel}`Delivery Address`, + {guilabel}`Follow-up Address`, or {guilabel}`Other Address`. + + If desired, select one of these other options for the {guilabel}`Contact` field, and enter the + corresponding information. + + If {guilabel}`Company` is selected for the {guilabel}`Individual` or {guilabel}`Company` field, + this field is labeled {guilabel}`Address`, and **cannot** be modified. + +- {guilabel}`Tax ID`: enter the vendor's tax ID in this field. + +- {guilabel}`Job Position`: enter the vendor's job position in this field. If the + {guilabel}`Company` radio button at the top of the form is selected, this field does not appear. + +- {guilabel}`Phone`: enter the vendor's phone number in this field. + +- {guilabel}`Mobile`: enter the vendor's mobile number in this field. + +- {guilabel}`Email`: enter the vendor's email address in this field. + +- {guilabel}`Website`: enter the vendor's website address in this field. + +- {guilabel}`Title`: using the drop-down menu, select the vendor's title in this field. The default + options are {guilabel}`Doctor`, {guilabel}`Madam`, {guilabel}`Miss`, {guilabel}`Mister`, and + {guilabel}`Professor`. + + If the {guilabel}`Company` radio button at the top of the form is selected, this field does not + appear. + +- {guilabel}`Tags`: using the drop-down menu, select any tags that apply to the vendor. + + To add a new tag, type in the tag, then click {guilabel}`Create "tag"`. + + There is no limit to the number of tags that can be selected. + +- {guilabel}`Image`: a photo of either the main contact person, or the company logo, can be added to + the form. Hover over the {guilabel}`📷 (camera)` box, in the top-right of the form, to reveal a + {guilabel}`✏️ (pencil)` icon, and click it. A file explorer window appears. Navigate to the + desired file, then click {guilabel}`Open` to select it. + +```{image} service/create-vendor.png +:align: center +:alt: The top portion of the create vendor form. +``` + +##### Contacts & Addresses tab + +After the top-half of the {guilabel}`Create Vendor` form is filled out, add any other contacts and +addresses associated with the vendor in this tab. + +Click the {guilabel}`Add` button to add a new contact, and a {guilabel}`Create Contact` pop-up +window appears. + +Select one of the appropriate contact type options from the radio buttons, located at the top of the +pop-up window. Those options are as follows: + +- {guilabel}`Contact`: select this option to add general contact details for employees of the + associated vendor. +- {guilabel}`Invoice Address`: select this option to add a preferred address for all invoices. When + added to the form, this address is selected by default when sending an invoice to the associated + vendor. +- {guilabel}`Delivery Address`: select this option to add a preferred address for all deliveries. + When added to the form, this address is selected by default when delivering an order to the + associated vendor. +- {guilabel}`Follow-up Address`: select this option to add a preferred address for all follow-up + correspondence. When added to the form, this address is selected by default when sending reminders + about overdue invoices. +- {guilabel}`Other Address`: select this option to add any other necessary addresses for the vendor. + +```{image} service/vendor-contact.png +:align: center +:alt: The create contact form with all parts filled in. +``` + +:::{note} +If an option *other than* {guilabel}`Contact` is selected for the contact type, an +{guilabel}`Address` section appears on the form. Enter the address details in the +{guilabel}`Address` section. +::: + +Add any notes to the {guilabel}`Internal notes...` section of the form. + +After all of the information is added, click either {guilabel}`Save & Close` to add the one new +contact, or {guilabel}`Save & New` to add the current address record and create another address +record. + +As contacts are added to this tab, each contact appears in a separate box, with an icon indicating +what type of contact is listed. + +```{eval-rst} +.. example:: + A :guilabel:`Delivery Address` displays a :guilabel:`⛟ (truck)` icon inside that specific address + box, whereas an :guilabel:`Invoice Address` displays a :guilabel:`💵 (dollar bill)` icon inside. + + .. image:: service/contact-tab.png + :align: center + :alt: The create contact form with all parts filled in. +``` + +##### Sales & Purchase tab + +Enter the following sales and purchasing information for the various sections below. Depending on +the other installed applications, additional fields and sections may appear. The following are all +default fields for the *Fleet* application only. + +###### Sales + +- {guilabel}`Salesperson`: using the drop-down menu, select a user as the main point of contact for + sales with this vendor. + + This person **must** be an internal user of the company, meaning they can log into the database as + a user. + +###### Misc + +- {guilabel}`Company ID`: if the company has an ID number **other than** its *tax ID*, enter it in + this field. + +- {guilabel}`Reference`: enter any text to give more information regarding the contact. This is an + internal note to provide any additional information. + + ```{eval-rst} + .. example:: + A company has several people with the same name, Mary Jones. The :guilabel:`Reference` field + could state `Mary Jones at X108 - returns` to provide additional details. + ``` + +##### Internal Notes tab + +Add any notes that pertain to the vendor, or any other necessary information, in this tab. + +## List of services + +To view all services logged in the database, including old and new requests, navigate to +{menuselection}`Fleet app --> Fleet --> Services`. All services appear in a list view, including all +the details for each service. + +The service records are grouped by {ref}`service type `. The number of repairs for +each service type appears in parentheses after the name of the service type. + +Each service listed displays the following information: + +- {guilabel}`Date`: the date that the service, or repair, was performed (or requested to be + performed). +- {guilabel}`Description`: a short description of the specific type of service, or repair, performed + to clarify the specific service. +- {guilabel}`Service Type`: the type of service, or repair, performed. This is selected from a list + of services that {ref}`must be configured `. +- {guilabel}`Vehicle`: the specific vehicle the service was performed on. +- {guilabel}`Driver`: the current driver for the vehicle. +- {guilabel}`Vendor`: the specific vendor who performed the service, or repair. +- {guilabel}`Notes`: any information associated with the service, or repair, that is documented to + add clarification. +- {guilabel}`Cost`: the total cost of the service, or repair. +- {guilabel}`Stage`: the status of the service, or repair. Options are {guilabel}`New`, + {guilabel}`Running`, {guilabel}`Done`, or {guilabel}`Cancelled`. + +At the bottom of the {guilabel}`Cost` column, the total cost of all services and repairs are listed. + +```{image} service/services.png +:align: center +:alt: The full list of services in the Odoo database. +``` + +### View services + +It is recommended to view the list of services in one of several pre-configured ways to better view +the information presented. In the top-right corner of the list, there are several icons that when +clicked, sort the data in different ways. + +```{image} service/views.png +:align: center +:alt: |- +: The icons in the top right corner than can be clicked to present the information in +: different ways. +``` + +#### List view + +The default view of the service records is a list view. This presents all the services, first +grouped alphabetically by type of service, then grouped by status. + +The information can be re-sorted by any column. At the top of each column, hover over the column +name, and an arrow appears in the far-right of that column. Click the arrow to sort the data by that +specific column. + +The default sorting is in descending alphabetical order (A to Z), represented by a {guilabel}`⌄ +(down arrow)` icon. Click the {guilabel}`⌄ (down arrow)` icon to reverse the alphabetical order (Z +to A). The {guilabel}`⌄ (down arrow)` icon changes to an {guilabel}`^ (up arrow)` icon. + +The two exceptions to this sorting are the default {guilabel}`Date` column and the {guilabel}`Cost` +column. The {guilabel}`Date` column sorts the information in chronological order (January to +December), instead of alphabetical order. The {guilabel}`Cost` column sorts the information by +repair price, from lowest to highest. + +##### Add a service + +To add a service record from the list view, click the {guilabel}`New` button, and a service form +loads. {ref}`Enter all the information ` on the service form. + +The form automatically saves as data is entered. + +#### Kanban view + +To view services by their stage, click the {guilabel}`Kanban` button, which is the second icon in +the top-right corner, and appears as two different length bars beneath a line. + +All services are organized by service type, and appear in the corresponding Kanban column. + +The number of repairs for each type of service appears in the far-right of each Kanban column +header. + +The collective status of the scheduled activities for each service type appears in the color-coded +bar beneath each Kanban column title. Repairs with activities scheduled in the future appear green, +activities due today appear yellow, overdue activities appear red, and repairs with no activities +scheduled appear gray. + +Each Kanban card displays a color-coded activity-related icon, such as a {guilabel}`🕘 (clock)` icon +or {guilabel}`📞 (phone)` icon, for example. These icons indicate both the type of scheduled +activity and the status. The status of the activity corresponds to the colors in the status bar. +Click on an activity icon to view the details of that specific activity. + +The length of the color bar is proportionate to the number of corresponding activities with that +specific status in that particular stage. Hover over a color section to reveal the number of service +records in that specific grouping. + +```{image} service/kanban.png +:align: center +:alt: The service records presented in a Kanban view. +``` + +To view **only** the records with a specific status, click the desired color bar section. The +background color for the column changes to a pale hue of the same color (either green, yellow, red, +or gray), and the color bar appears striped instead of solid. **Only** repairs and services with the +selected status appear in the column. + +```{image} service/kanban-status.png +:align: center +:alt: The oil change service records showing only repairs with past-due activities. +``` + +(fleet-schedule-activity)= + +##### Schedule activities + +To schedule an activity for a repair or service from the Kanban view, click the activity icon in the +lower-right corner of the service record, and click {guilabel}`+ Schedule an activity`. A +{guilabel}`Schedule Activity` pop-up window appears. + +:::{note} +Depending on what kind of activity, if any, is scheduled, the activity icon may appear +differently. For example, a {guilabel}`📞 (phone)` appears if a phone call is scheduled, or an +{guilabel}`✉️ (envelope)` appears if an email is scheduled. +::: + +Enter the following information on the form: + +- {guilabel}`Activity Type`: using the drop-down menu, select the activity being scheduled. The + default options are {guilabel}`Email`, {guilabel}`Call`, {guilabel}`Meeting`, {guilabel}`To-Do`, + and {guilabel}`Upload Document`. +- {guilabel}`Summary`: enter a short description of the activity, such as `Schedule oil change`. +- {guilabel}`Due Date`: using the calendar popover, select the date the activity must be completed. + Using the {guilabel}`< (left)` and {guilabel}`> (right)` arrow icons, navigate to the desired + month, then click on the date to select it. +- {guilabel}`Assigned to`: using the drop-down menu, select the user responsible for the activity. +- {guilabel}`Notes`: add any notes or details in the blank area in the bottom-half of the form. + +When the {guilabel}`Schedule Activity` is completed, click {guilabel}`Schedule` to schedule the +activity, or click {guilabel}`Done & Schedule Next` to schedule the current activity and schedule +another activity for the same repair. + +:::{seealso} +For more detailed information regarding activities, refer to the main {doc}`activities +<../../essentials/activities>` document. +::: + +##### Add a service + +A new repair can be added from this view. Click the {guilabel}`➕ (plus icon)` in the top-right +corner of the Kanban column, and a new block appears at the top of the column, beneath the Kanban +title. + +Enter a {guilabel}`Title` for the service or repair, then click {guilabel}`Add`. A +{guilabel}`Create` service form appears in a pop-up window. {ref}`Enter all the information +` on the service form, then click {guilabel}`Save & Close` to add the record. +The new record now appears in the Kanban column. + +#### Graph view + +Another way to view the data is in a graph. To change to the graph view, click the {guilabel}`Graph` +icon, which is the third icon in the top-right, and appears as a small graph. + +The default graph view displays the service information in a stacked bar chart, grouped by +{guilabel}`Service Type`. The X-axis represents the {guilabel}`Service Type` and the Y-axis +represents the {guilabel}`Cost`. + +Each column visually represents the total cost for all repairs and services for that specific +{guilabel}`Service Type`. Hover over any bar to reveal a popover window that displays the total +{guilabel}`Cost` for the service and repairs the bar represents. + +The graph can change to either a {guilabel}`Line Chart` or a {guilabel}`Pie Chart` by clicking the +corresponding button above the graph. Additionally, the graph can display the data in either +{guilabel}`Stacked`, {guilabel}`Descending`, or {guilabel}`Ascending` order, by clicking the +corresponding buttons. + +```{image} service/bar-chart.png +:align: center +:alt: A bar chart view of the services and repairs, with the various option buttons +: highlighted. +``` + +#### Pivot view + +Another way to view the service data is in a spreadsheet pivot table. Click the {guilabel}`Pivot` +icon, which is the fourth icon in the top-right, and appears as a small spreadsheet. + +The default way the data is presented shows the total cost of each type of service. The horizontal +rows represent the various types of service, with a different service type in its own line. The +vertical columns represent the total costs for each specific type of service, further divided by the +type of service. + +```{image} service/pivot.png +:align: center +:alt: The default pivot table view of the services. +``` + +The table can either be inserted in a spreadsheet or downloaded, if desired. + +To add the pivot table to a spreadsheet in Odoo, first, the appearance of the pivot table must +change. The default pivot table view does not allow it to be inserted into a spreadsheet (the +{guilabel}`Insert in Spreadsheet` button is grayed out). + +First, click the {guilabel}`➖ (minus)` icon to the left of {guilabel}`Total` at the top of the pivot +table. This collapses the service types, leaving only a single {guilabel}`Cost` column visible. + +Then, click the {guilabel}`Insert in Spreadsheet` button, which is no longer grayed out, and a +{guilabel}`Select a spreadsheet to insert your pivot` pop-up window appears. Two tabs are visible in +this pop-up window, a {guilabel}`Spreadsheets` tab and a {guilabel}`Dashboards` tab. + +Click the desired tab to indicate where the spreadsheet should be placed, either in a +{guilabel}`Spreadsheet` or on a {guilabel}`Dashboard`. After clicking the desired option, click +{guilabel}`Confirm`. The spreadsheet then loads on the screen. + +:::{note} +Spreadsheets are stored in Odoo's *Documents* application, while dashboards are stored in Odoo's +*Dashboards* application. +::: + +Click {guilabel}`Services` in the top-left corner to navigate back to the previous pivot table view. + +To download the table in an *xlsx* format, click the download xlsx icon, represented by a +{guilabel}`⬇️ (down arrow above a line)` icon. + +:::{seealso} +For more detailed information regarding reporting, refer to the main {doc}`reporting +<../../essentials/reporting>` document. +::: + +#### Activity view + +To view the scheduled activities for services or repairs, click the {guilabel}`🕗 (clock)` activity +icon in the top-right corner of the screen. This presents all activities, organized by vehicle and +activity type. + +The vertical columns are organized by activity type, and the horizontal lines are organized by +vehicle. + +The entries are color-coded according to the status of each activity. Green activities are scheduled +in the future, yellow activities are due today, and red activities are overdue. + +The user responsible for the activity appears in a photo in the lower-left corner of each activity +entry. + +The due date of each activity is written in the top-center of each activity entry. + +A color-coded bar at the top of each activity column indicates the status of the activities within +that column. + +The number of activities for each activity type is written on the right side of the color-coded bar +beneath the column name. + +```{image} service/activity-view.png +:align: center +:alt: The activity view, with the columns called out, and an activity box highlighted. +``` + +##### Schedule an activity + +To add a service record from the activity view, click {guilabel}`+ Schedule an activity` in the +bottom-left corner of the list, and a {guilabel}`Search: Services` pop-up window loads. Click the +service that the activity is being scheduled for, and a {guilabel}`Schedule Activity` form loads. + +{ref}`Enter all the information ` on the activity form. + +When the form is complete, click the {guilabel}`Schedule` button. Then, both pop-up windows close, +and the activity now appears on the activity view. + diff --git a/content/applications/hr/frontdesk.md b/content/applications/hr/frontdesk.md new file mode 100644 index 000000000..b4be5c6e3 --- /dev/null +++ b/content/applications/hr/frontdesk.md @@ -0,0 +1,240 @@ +--- +show-content: true +--- + +# Frontdesk + +The Odoo *Frontdesk* application provides a way for visitors to check in to a building or location, +and alert the person they are meeting about their arrival. Additionally, they can request a +pre-configured beverage to be brought to them, while they wait. + +This application is ideal for businesses that do **not** have someone working at a reception desk, +locations **without** a designated waiting area available to guests and visitors. + +## Configuration + +The first item to configure with the *Frontdesk* application is the station, followed by any drink +selections that might optionally be offered. + +### Stations + +In Odoo's *Frontdesk* application, a *Station* can be thought of as any location where someone can +sign in and wait for an employee. This is typically some form of waiting room, such as a lobby. Each +station has a kiosk where visitors check in. + +When setting up the *Frontdesk* application, a minimum of one station **must** be configured, but +there is no limit to how many stations can be created and configured. + +To create a station, navigate to {menuselection}`Frontdesk app --> Configuration --> Stations`, and +click {guilabel}`New`. When clicked, a blank frontdesk form appears. + +Enter the following information on the form: + +- {guilabel}`Frontdesk Name`: enter a name for the specific frontdesk location. This should be + short and easily identifiable, such as `Reception Desk` or `Main Lobby`. This field is required in + order to create a station. + +- {guilabel}`Responsibles`: select the person (or persons) who are alerted when a visitor checks in + using this specific frontdesk. Multiple selections can be entered. This field is required in order + to create a station. + +- {guilabel}`Kiosk URL`: this field auto-populates once the frontdesk form is saved, with at least + the {guilabel}`Frontdesk Name` and {guilabel}`Responsibles` fields filled. To save manually, click + the {guilabel}`(cloud with upward arrow)` icon, located at the top of the form. + + Once saved, a URL is generated in the {guilabel}`Kiosk URL` field. This URL is one way the + frontdesk kiosk is accessed. + + To access the kiosk, click the {guilabel}`Copy` button at the end of the URL, and navigate to that + URL in a web browser. This URL opens that specific station's frontdesk sign-in page. + + :::{tip} + To add an image/photo to a frontdesk form, hover over the {guilabel}`(camera with a '+' sign)` + icon in the top-right of the form to reveal a {guilabel}`✏️ (pencil)` icon. + + Click on the {guilabel}`✏️ (pencil)` icon to open a file explorer, navigate to the desired + image/photo file, then click {guilabel}`Open` to select it. + + The image selected for the station photo appears as the background image for the station kiosk. + ::: + +#### Options tab + +(frontdesk-host)= + +- {guilabel}`Host Selection`: if the visitor is attending a meeting, this option allows the visitor + to select the meeting host from a presented list, and notify that individual. When enabled, + additional fields appear, as detailed below. + +- {guilabel}`Authenticate Guest`: if additional information is required when a guest checks in, + enable this option, and select which of the following are required: + + - {guilabel}`Email`: select whether the guest's email address is {guilabel}`Required`, + {guilabel}`Optional`, or if the information is not requested at all ({guilabel}`None`). + - {guilabel}`Phone`: select whether the guest's phone number is {guilabel}`Required`, + {guilabel}`Optional`, or if the information is not requested at all ({guilabel}`None`). + - {guilabel}`Organization`: select whether the guest's organization is {guilabel}`Required`, + {guilabel}`Optional`, or if the information is not requested at all ({guilabel}`None`). + +- {guilabel}`Theme`: select the color mode of the kiosk. Choose either {guilabel}`Light` or + {guilabel}`Dark`. The {guilabel}`Light` selection displays a pale gray background on the kiosk, + whereas the {guilabel}`Dark` selection displays a dark gray and black background. + +- {guilabel}`Self Check-In`: enable this option to present a check-in QR code on the kiosk. The QR + code allows guests to check in using their mobile device, instead of using the kiosk. This option + is recommended for a busy kiosk with multiple guests checking in at any time. + +- {guilabel}`Offer Drinks`: enable this option to offer guests a drink upon check in. If this option + is enabled, it is necessary to {ref}`configure the drinks being offered `, via + the {guilabel}`Configure Drinks` link that appears when the option is enabled. Once all drink + options are configured, select each drink to be offered using the drop-down menu. + +:::{note} +The following options are only visible in the {guilabel}`Options` tab if the {ref}`Host Selection +` option is enabled. +::: + +- {guilabel}`Notify by email`: enable this option to have an email sent to the person the guest is + visiting upon check in. When enabled, an {guilabel}`Email Template` field appears beneath, with + the default {guilabel}`Frontdesk Email Template` selected. + + To change the default email template, click the drop-down menu in the {guilabel}`Email Template` + field, then select another email template. + + To modify the currently selected template, click the {guilabel}`Internal link (arrow)` icon at the + end of the line, and make any edits to the template. + +- {guilabel}`Notify by SMS`: enable this option to have an SMS (text) message sent to the person the + guest is visiting upon check in. When enabled, an {guilabel}`SMS Template` field appears beneath, + with the default {guilabel}`Frontdesk SMS Template` selected. + + To change the default SMS template, click the drop-down menu in the {guilabel}`SMS Template` + field, and select another SMS template. + + To modify the currently selected template, click the {guilabel}`Internal link (arrow)` icon at the + end of the line, and make any desired edits to the content of the template. The SMS message may + have a maximum of 242 characters, which fits in 4 SMS (UNICODE) messages. + +- {guilabel}`Notify by Discuss`: this option is enabled by default when the {guilabel}`Host + Selection` option is enabled. This option opens a *Discuss* application message window with the + person the guest is visiting upon check in. + + When enabled, a default message appears for the person the guest is visiting. The *Discuss* + application **must** be installed in order for this option to work. + +:::{note} +*Discuss* is installed by default when creating an Odoo database, and does not count towards +billing. As long as the *Discuss* application is not intentionally uninstalled, the +{guilabel}`Notify by Discuss` option works. +::: + +```{eval-rst} +.. example:: + The default message format for the :guilabel:`Notify by Discuss` option is: `(Frontdesk Station) + Check-In: (Guest Name) (Guest Phone Number) (Organization) to meet (Name of employee).` + + An example of how that might appear in a *Discuss* message is: `Main Lobby Check-In: John Doe + (123-555-1234) (Odoo, Inc.) to meet Marc Demo.` +``` + +```{image} frontdesk/station-form.png +:align: center +:alt: Frontdesk station form with all the information filled out. +``` + +#### Side Message tab + +Enter any desired text to appear on the station kiosk after a guest has checked in, such as a +welcome greeting or any necessary instructions. The text appears on the confirmation page, on the +right side of the screen after a guest has completed the check-in process. + +(frontdesk-drinks)= + +### Drinks + +After a station is created, the next step is to configure the drinks to offer visitors, if desired. +This step is **not** necessary or required for the *Frontdesk* application to work, and only needs +to be configured if drinks are offered to guests. + +To add a drink option, navigate to {menuselection}`Frontdesk app --> Configuration --> Drinks`, and +click {guilabel}`New`. Doing so reveals a blank drink form to configure. + +Enter the following information on the drink form: + +- {guilabel}`Drink Name`: type the name of the drink option in this field. This field is required. +- {guilabel}`People to Notify`: use the drop-down menu in this field to select who is notified when + the drink is selected. Multiple people can be entered in this field. This field is required. +- {guilabel}`Sequence`: enter a numerical value in this field to indicate where in the list of drink + options this specific option appears. The lower the number, the higher on the list the drink + appears. For example, entering the number one would place that drink at the top of the list, and + appear first in the sequence. + +:::{tip} +To add an image/photo to a drink form, hover over the {guilabel}`(camera with a '+' sign)` icon +in the top-right of the form to reveal a {guilabel}`✏️ (pencil)` icon. + +Click on the {guilabel}`✏️ (pencil)` icon to open a file explorer, navigate to the desired +image/photo file, then click {guilabel}`Open` to select it. + +The image selected now appears in the picture field, and is set as the image for the drink. +::: + +```{image} frontdesk/espresso.png +:align: center +:alt: Drink form with the information filled out for an espresso. +``` + +## Station dashboard + +:::{tip} +To add an image/photo to a drink form, hover over the {guilabel}`(camera with a '+' sign)` icon +in the top-right of the form to reveal a {guilabel}`✏️ (pencil)` icon. + +Click on the {guilabel}`✏️ (pencil)` icon to open a file explorer, navigate to the desired +image/photo file, then click {guilabel}`Open` to select it. + +The image selected now appears in the picture field, and is set as the image for the drink. +::: + +(frontdesk-kiosk)= + +## Kiosk setup + +Set up each kiosk for use after configuring the various stations. It is recommended to use a +dedicated device for each frontdesk kiosk, such as a tablet. + +Navigate to the kiosk in one of two ways: + +- Navigate to the main *Frontdesk* application dashboard, and click the {guilabel}`Open Desk` + button on the desired station card. The kiosk loads in a new browser tab. +- Navigate to {menuselection}`Frontdesk app --> Configuration --> Stations`, and click on the + desired station. Then, click the {guilabel}`Copy` button at the end of the {guilabel}`Kiosk URL` + line, and paste the URL into a new browser tab or window. + +:::{important} +It is recommended to log out of the database, and close the tab, after navigating to the kiosk. +That way, there is no possibility of a visitor accessing the database when checking-in. +::: + +## Reporting + +The *Frontdesk* application has two reports available: {guilabel}`Visitors` and {guilabel}`Drinks`. + +To access either of these reports, navigate to {menuselection}`Frontdesk app --> Reporting` to +reveal a drop-down menu containing the options: {guilabel}`Visitors` and {guilabel}`Drinks`. + +The {guilabel}`Visitors` report displays the number of visitors by month, for the current year. The +{guilabel}`Drinks` report shows how many total requests were made for each drink. + +As with all reports in Odoo, the filters and groups can be modified to show other metrics, as well. + +:::{seealso} +- {doc}`frontdesk/visitors` +::: + +```{toctree} +:titlesonly: true + +frontdesk/visitors +``` + diff --git a/content/applications/hr/frontdesk/visitors.md b/content/applications/hr/frontdesk/visitors.md new file mode 100644 index 000000000..5ee85b03c --- /dev/null +++ b/content/applications/hr/frontdesk/visitors.md @@ -0,0 +1,163 @@ +# Visitors + +In the Odoo *Frontdesk* application, a *visitor* is defined as any non-employee (e.g., repair +person, job candidate, etc.). These visitors can be logged upon arrival and departure for security +purposes. This ensures an accurate list of people on the premises. + +(frontdesk-list)= + +## Visitor list + +To access a complete list of checked-in visitors, navigate to {menuselection}`Frontdesk app --> +Visitors`. + +:::{note} +By default, the {guilabel}`Planned or Checked-In` and {guilabel}`Today` filters appear in the +{guilabel}`Search...` bar. +::: + +All visitors are presented in a list view, with the following details that were entered upon check +in: + +- {guilabel}`Name`: the guest's name. +- {guilabel}`Visitor Company`: the company the guest represents. +- {guilabel}`Phone`: the guest's phone number. +- {guilabel}`Drinks`\*: the drink the guest requested. +- {guilabel}`Host`: who the guest is waiting to see. +- {guilabel}`CheckIn`: the date and time the guest checked in. +- {guilabel}`Checkout`\*: the date and time the guest checked out. In the default view, only guests + with a {guilabel}`Checked-In` or {guilabel}`Planned` status are visible. Guests with check-out + times are only visible if the {guilabel}`Today` filter is not active. +- {guilabel}`Duration`: the amount of time the guest has been checked in for. +- {guilabel}`Station`: the location of where the guest checked in. +- {guilabel}`Status`: the status of the guest. The options are {guilabel}`Checked-In`, + {guilabel}`Planned`, {guilabel}`Checked-Out`, or {guilabel}`Cancelled`. +- {guilabel}`Email`\*: the guest's email address. + +\* These fields are not visible in the default {guilabel}`Visitor` list. These must be enabled +using the {icon}`oi-settings-adjust` {guilabel}`(settings adjust)` icon in the top-right of the +list. + +To the far-right of the titled columns on the {guilabel}`Visitors` page, there is an untitled +column, where a guest's status can be updated. + +When a guest leaves, click the available {guilabel}`Check out` button to update the guest's record, +and log the date and time they left. + +If a scheduled guest arrives, and they did not check in using the *Frontdesk* kiosk, they can be +checked in here, by clicking the available {guilabel}`Check in` button to log the date and time they +arrived. + +Beside the untitled status column, a {guilabel}`Drink Served` button appears, but only if that +particular visitor requested a drink. + +When their drink has been served, click the {guilabel}`Drink Served` button to indicate the drink +has been delivered to the guest. Once clicked, that button disappears. + +```{image} visitors/visitors.png +:align: center +:alt: The full list of currently checked in visitors, with the drinks to be served +: highlighted. +``` + +If any column is not visible, or if a visible column is preferred to be hidden, click the +{icon}`oi-settings-adjust` {guilabel}`(additional options)` icon, located at the end of the column +name list. Doing so, reveals a reveals a drop-down menu of column options to enable or disable. A +{icon}`fa-check` {guilabel}`(check)` icon indicates the column is visible. + +## Planned visitors + +Enter expected guest information in advance by creating a planned guest in the *Frontdesk* app. + +To create a planned guest, navigate to {menuselection}`Frontdesk app --> Visitors`, and click +{guilabel}`New`. Then, enter the same information as any other {ref}`visitor ` on +the guest form that appears. The only required fields are the visitor's {guilabel}`Name` and the +{guilabel}`Station` at which they are expected to arrive. + +:::{important} +If a guest is planned in advance, they must be checked in from the list on the +{guilabel}`Visitors` page in the *Frontdesk* application ({menuselection}`Frontdesk app --> +Visitors`). If a planned guest checks in using a kiosk, they will be checked in separately, and +their planned visitor entry remains listed as {guilabel}`Planned`. + +The {guilabel}`Planned` status of a planned guest **only** changes to {guilabel}`Checked-In` when +they are checked in *inside* the application's {guilabel}`Visitors` list. + +If a guest does check in using a kiosk, ensure all records are current, and the list of guests +that are currently on-site is correct. Be sure to check in and/or check out the correct entries, +so the visitors list correctly reflects who is currently on the premises. + +Ensure planned guests are informed that they should **not** check in using the kiosk if they are +listed as a planned guest in advance. +::: + +## Visitor flow + +### Visitor check in + +When a visitor arrives at a facility, they approach a {ref}`Frontdesk kiosk `, and +click {guilabel}`Check in`. The information requested from the visitor is what was configured for +that specific *Frontdesk* station. If any information is required, the field displays a red asterisk +(\*). The visitor **must** enter the required information in order to check in. + +Once all the information is entered, the visitor taps the {guilabel}`Check In` button. + +:::{note} +At any point in the check-in process, if ten seconds pass with no selection, the kiosk returns to +the main welcome screen. +::: + +### Drinks + +If drinks were configured for the station, after tapping {guilabel}`Check In`, a registration +confirmation screen loads, along with the question: {guilabel}`Do you want something to drink?` + +The visitor can tap either {guilabel}`Yes, please`, or {guilabel}`No, thank you`. + +If they select {guilabel}`Yes, please`, a drink selection screen appears, and the pre-configured +options are listed. The visitor then taps the desired selection, or, if they do not want anything, +they can tap the {guilabel}`Nothing, thanks` button at the bottom of the screen. + +If a drink selection was made, a {guilabel}`Thank you for registering! Your drink is on the way.` +message appears. + +### Notifications + +Once the visitor has checked in, the person they are visiting, and any other users who were +configured to be notified when check-ins occur at the kiosk, are notified. The notification is +either by email, SMS message, a *Discuss* chat, or any combination of those three options. + +If the visitor requested a drink, the user(s) configured as the {guilabel}`People to Notify` on the +drink form, are notified, via the *Discuss* application. The message that appears is: +{guilabel}`(Visitor Name) just checked-in. They requested (Drink Name).` + +Once the drink has been delivered to the guest, the person who delivered the drink is responsible +for marking the drink as delivered. + +To mark a drink as delivered, navigate to {menuselection}`Frontdesk app --> Stations`, and choose +the desired station card displaying {guilabel}`(#) Drinks to serve`. + +This opens a list of all the visitors checked in at that station, and are waiting for a drink. Click +the {guilabel}`Drink Served` button at the end of the line for the visitor who was served. Once they +are marked as having their drink served, the visitor disappears from the list. + +### Check out + +Once the visitor has completed their business, and has left the premises, it is important to check +them out for accurate record keeping. + +To check visitors out properly, navigate to {menuselection}`Frontdesk app --> Stations`, and choose +the desired station card displaying {guilabel}`(#) Drinks to serve`. Doing so opens a list of all +the visitors who are currently checked-in at that station. + +Click the {guilabel}`Check out` button near the end of the line for the visitor who left. Once they +are marked as checked-out, the visitor disappears from the list. + +:::{important} +Visitors do **not** check themselves out when they leave. It is important for *Frontdesk* users +to check out visitors for accurate record keeping. + +Always have an accurate list of who is on the premises at any given time. This is important for +security purposes, and in the case of an emergency. +::: + diff --git a/content/applications/hr/lunch.md b/content/applications/hr/lunch.md new file mode 100644 index 000000000..2ff8d6c9b --- /dev/null +++ b/content/applications/hr/lunch.md @@ -0,0 +1,141 @@ +--- +show-content: true +--- + +# Lunch + +The *Lunch* application in Odoo allows users a convenient way to order food and pay for their meal +directly from the database. + +Before employees can use the *Lunch* application, there are a number of configurations to consider: +settings, vendors, locations, products, product categories, and alerts. Once these are created, +employees can view offerings and order food. + +## Settings + +Only two settings are needed to configure in the *Lunch* app: overdraft settings and notifications. +To access the settings, navigate to {menuselection}`Lunch app --> Configuration: Settings`. + +Configure the following: + +- {guilabel}`Lunch Overdraft`: enter the maximum overdraft amount for employees. The currency + format is determined by the localization setting of the company. +- {guilabel}`Reception notification`: set the message users receive via the *Discuss* app when their + food has been delivered. The default message `Your lunch has been delivered. Enjoy your meal!` + populates this field, but can be modified, if desired. + +:::{tip} +> If in a database with multiple languages installed, many forms in the *Lunch* application have +> the option of entering translations for various fields. +> +> If translations are available to be configured, a language code appears next to a translatable +> field on a form. To add translations for that field, click the two letter language code (for +> example, {guilabel}`EN` for English) and a translation pop-up window appears. +> +> The following is an example for the {guilabel}`Reception notification` field in the settings +> menu: +> +> Navigate to {menuselection}`Lunch app --> Configuration: Settings`. Click the {guilabel}`EN` In +> the top-right of the text box beneath the {guilabel}`Reception notification` section. A +> {guilabel}`Translate: company_lunch_notify_message` pop-up window loads with the option to enter +> a translation for the other languages used by the database. +> +> The first column lists the different languages in alphabetical order, with the currently selected +> language in bold. The second column has the currently configured message in each column. The last +> column in the far-right provides a text box to type in a translation for each language. +> +> Enter the text that should appear for each language, then click {guilabel}`Save`. + +```{image} lunch/translation.png +:align: center +:alt: |- +: The translation text box, with the current language highlighted, and the Arabic +: translation field highlighted. +``` +::: + +## Locations + +By default, Odoo creates an `HQ Office` location when the *Lunch* application is installed. If a +company has more than one location, they must be configured. + +To add a location, navigate to {menuselection}`Lunch app --> Configuration: Locations`. The +currently configured locations appear in a list view. Click the {guilabel}`New` button in the +top-left corner and a blank line appears beneath the last location in the list. + +Enter the name of the location in the field. Next, click into the {guilabel}`Address` field to the +right of the name, and enter the location's address. It is possible to enter multiple lines in the +address field. + +Repeat this for all locations that need to be added. + +```{image} lunch/locations.png +:align: center +:alt: A list view of the locations with the new button highlighted. +``` + +## Alerts + +It is possible to set up alerts that can either be displayed in the *Lunch* app, or be sent to +specific employees via the *Discuss* app. + +No alerts are pre-configured by default. To set up an alert, navigate to {menuselection}`Lunch app +--> Configuration: Alerts`. Click the {guilabel}`New` button in the top-left corner and a blank +lunch alert form loads. Enter the following information on the form: + +- {guilabel}`Alert Name`: enter a name for the alert. This should be short and descriptive, such as + `New Lunch Vendor` or `Order by 11`. This field is **required**. + +- {guilabel}`Display`: select whether the alert is visible in the *Lunch* app ({guilabel}`Alert in + app)` or sent to employees via the *Discuss* app in a chat window ({guilabel}`Chat notification`). + + - {guilabel}`Recipients`: this field only appears if {guilabel}`Chat notification` is selected for + the {guilabel}`Display` option. Select who receives the chat alert. The options are: + {guilabel}`Everyone`, {guilabel}`Employee who ordered last week`, {guilabel}`Employee who + ordered last month`, or {guilabel}`Employee who ordered last year`. + +- {guilabel}`Location`: select the locations the alert should appear for from the drop-down menu. + Multiple locations can be selected. This field is **required**, therefore, if the alert applies + to all locations, select all the locations from the drop-down menu. + +- {guilabel}`Show Until`: if the alert should expire on a specific date, select the date from the + calendar picker. + +- {guilabel}`Active`: this option is on (appears green) by default. To turn off the alert, click the + toggle so that it no longer appears green. + +- {guilabel}`Message`: Enter the alert message in this field. This field is **required**. + +- {guilabel}`Notification Time`: select the days of the week the alert should be sent. By default, + all seven days are active. Click on a checkbox to change the setting from active to inactive. + + If {guilabel}`Chat notification` was selected for the {guilabel}`Display` option, a + {guilabel}`Time` field also appears. Enter the time the chat message should be sent. Next, select + if the time is either {guilabel}`AM` or {guilabel}`PM` using the drop-down menu to the right of + the {guilabel}`Time` field. + +```{image} lunch/alert.png +:align: center +:alt: |- +: An alert form with all of the information filled out for a chat alert sent at 10:30 AM, +: asking employees to submit orders by 11:30 AM. +``` + +:::{seealso} +- {doc}`lunch/vendors` +- {doc}`lunch/products` +- {doc}`lunch/orders` +- {doc}`lunch/user-accounts` +- {doc}`lunch/management` +::: + +```{toctree} +:titlesonly: true + +lunch/vendors +lunch/products +lunch/orders +lunch/user-accounts +lunch/management +``` + diff --git a/content/applications/hr/lunch/management.md b/content/applications/hr/lunch/management.md new file mode 100644 index 000000000..3815e611c --- /dev/null +++ b/content/applications/hr/lunch/management.md @@ -0,0 +1,197 @@ +# Lunch management + +In Odoo's *Lunch* application, it is required to have someone manage the orders, vendors, and +products. In addition, someone must be responsible for the orders, and notifying employees when +their orders have arrived. This can be the same person. + +Orders can be {ref}`cancelled `, {ref}`sent to the vendor `, +{ref}`confirmed ` upon arrival, and {ref}`employees can be notified +`, either from the {ref}`Today's Orders ` dashboard, or the +{ref}`Control Vendors ` dashboard. + +To manage the *Lunch* app, users need the appropriate {guilabel}`Administrator` rights. These can be +set by navigating to the {menuselection}`Settings app` and selecting {guilabel}`Manage Users`. Then, +click on the desired user to view their access rights. + +For more information on access rights, refer to the {doc}`Access rights +<../../general/users/access_rights/>` documentation. + +:::{note} +Only users with administration rights are able to view the {guilabel}`Manager` and +{guilabel}`Configuration` menus in the *Lunch* application. +::: + +(lunch-todays-orders)= + +## Today's Orders + +To view and manage the orders for the day, navigate to {menuselection}`Lunch app --> Manager --> +Today's Orders`. All orders for the day are presented in a list view on the {guilabel}`Today's +Orders` dashboard, with a filter for {guilabel}`Today`, and grouped by {guilabel}`Vendor`, by +default. + +The following information appears in the list: + +- {guilabel}`Order Date`: the date the order was placed. +- {guilabel}`Vendor`: the vendor the product is being ordered from. +- {guilabel}`Product`: the specific product ordered. +- {guilabel}`Extras`: any extras selected for the product. +- {guilabel}`Notes`: any information needed to be sent to the vendor. +- {guilabel}`User`: the user who ordered the product. +- {guilabel}`Lunch Location`: where the product is set to be delivered. +- {guilabel}`Price`: the total price for the product, including all extras. +- {guilabel}`Status`: the current status of the product. +- {guilabel}`Company`: the company under which the order was placed. This only appears in a + multi-company database. + +```{image} management/today.png +:align: center +:alt: |- +: The list that appears in the Today's Orders dashboard, with the filters and top column +: names highlighted. +``` + +(lunch-cancel)= + +### Cancel orders + +All users can cancel an order, not just managers of the *Lunch* app. + +To cancel an order from a vendor, individual products **must** be cancelled one at a time. + +On the {guilabel}`Today's Orders` dashboard, a {guilabel}`✖️ Cancel` button is shown at the +far-right of each product line that can be cancelled. Click the {guilabel}`✖️ Cancel` button to +cancel the order for that individual product. + +:::{note} +Only products with a red {guilabel}`Status` tag of {guilabel}`Ordered` can be cancelled. +::: + +```{image} management/cancel.png +:align: center +:alt: Order lines with the cancel button highlighted. +``` + +(lunch-send-orders)= + +### Send orders + +The first step in managing the *Lunch* app is to send the orders to the vendors. + +When orders are ready to be sent, the manager responsible for sending orders **must** send the +orders to the vendor, outside of the database (call, online order, etc.). + +Once orders have been placed with the vendors, click the {guilabel}`Send Orders` button that appears +next to each vendor's name and phone number. + +Once sent, the {guilabel}`Send Orders` button changes to a {guilabel}`Confirm Orders` button, and +the {guilabel}`Status` column is updated from red {guilabel}`Ordered` tags to blue {guilabel}`Sent` +tags, indicating the order has been sent to the vendor. Users who have placed orders in the *Lunch* +app rely on the {guilabel}`Status` tags to track their orders. + +```{image} management/send.png +:align: center +:alt: A vendor's order with the X Cancel and Send Orders buttons highlighted. +``` + +(lunch-confirm-orders)= + +### Confirm orders + +After orders have been sent to the vendor, the next step is to confirm the orders after they have +been delivered. + +On the {guilabel}`Today's Orders` dashboard, click the {guilabel}`Confirm Orders` button that +appears next to the vendor's name and phone number. + +Once confirmed, the {guilabel}`Confirm Orders` button disappears, and the {guilabel}`Status` column +is updated from blue {guilabel}`Sent` tags to green {guilabel}`Received` tags, indicating the vendor +has delivered the orders. + +In addition, the {guilabel}`✖️ Cancel` button at the end of each product line changes to a +{guilabel}`✉️ Send Notification` button. + +If needed, instead of confirming all of the individual products from a vendor, individual products +can be confirmed one at a time. To confirm an individual product, click the {guilabel}`✔️ Confirm` +button at the end of the individual product line. When confirming individual products with this +method, the {guilabel}`Confirm Orders` button remains on the vendor line. + +```{image} management/confirm.png +:align: center +:alt: The Today's Orders dashboard, with the two different ways to confirm an order +: highlighted. +``` + +```{eval-rst} +.. example:: + A vendor receives an order for three pizzas, and an order of garlic knots. When the delivery is + made to the company, the *Lunch* manager notices the garlic knots are missing. + + The manager first marks the three pizzas as received, by individually confirming the products + with the :guilabel:`✔️ Confirm` button at the end of each product line. + + Later, when the vendor delivers the garlic knots, the manager can either click the :guilabel:`✔️ + Confirm` button at the end of the line for the garlic knots, or click the :guilabel:`Confirm + Orders` button that appears next to the vendor's name and phone number. +``` + +(lunch-notify)= + +### Notify employees + +After products are received, and the orders are confirmed, the employees **must** be informed that +their orders have been delivered, and are ready to be picked up. + +Unlike sending and confirming orders, notifications must be sent individually, and cannot be sent in +a batch. + +To notify the user their product has arrived, click the {guilabel}`✉️ Send Notification` button at +the end of each product line. An email is sent to the user informing them their products have been +delivered. + +(lunch-control-vendors)= + +## Control Vendors + +All orders for all vendors, both past and present, can be found in the *Control Vendors* dashboard. +To access these records, navigate to {menuselection}`Lunch app --> Manager --> Control Vendors`. + +All orders appear in a list view, grouped alphabetically by {guilabel}`Vendor`. The list loads with +all vendors expanded to show all order lines for every vendor, by default. + +The following information appears in the list: + +- {guilabel}`Order Date`: the date the order was placed. +- {guilabel}`Vendor`: the vendor the product is being ordered from. +- {guilabel}`Product`: the specific product ordered. +- {guilabel}`Extras`: any extras selected for the product. +- {guilabel}`Notes`: any information needed to be sent to the vendor. +- {guilabel}`User`: the user who ordered the product. +- {guilabel}`Lunch Location`: where the product is set to be delivered. +- {guilabel}`Price`: the total price for the product, including all extras. +- {guilabel}`Status`: the current status of the product. +- {guilabel}`Company`: the company under which the order was placed. This only appears in a + multi-company database. + +Orders can be {ref}`cancelled `, {ref}`sent to the vendor `, +{ref}`confirmed ` upon arrival, and {ref}`employees can be notified +` using the same method as on the {ref}`Today's Orders ` +dashboard. + +```{image} management/control.png +:align: center +:alt: A list view of all the orders as seen in the Control Vendors dashboard. +``` + +:::{note} +The difference between the {ref}`Today's Orders ` dashboard and the +{ref}`Control Vendors ` dashboard is that the *Today's Orders* dashboard +**only** displays orders for the current day, while the {guilabel}`Control Vendors` dashboard +displays **all** orders made in the *Lunch* app. +::: + +:::{seealso} +- {doc}`../lunch` +- {doc}`user-accounts` +::: + diff --git a/content/applications/hr/lunch/orders.md b/content/applications/hr/lunch/orders.md new file mode 100644 index 000000000..ba63198e0 --- /dev/null +++ b/content/applications/hr/lunch/orders.md @@ -0,0 +1,229 @@ +--- +show-content: true +--- + +# Orders + +When the *Lunch* application is opened, the {guilabel}`Order Your Lunch` dashboard loads. This view +is also accessed by navigating to {menuselection}`Lunch app --> My Lunch --> New Order`. + +The {guilabel}`Order Your Lunch` dashboard provides a summary of lunch offerings, the user's account +information, and the current day's orders, along with their statuses. + +## Order Your Lunch + +On the main {guilabel}`Order Your Lunch` dashboard, all the necessary information needed to place an +order is visible. The default filter for the products is {guilabel}`Available Today`, which is +present in the {guilabel}`Search...` bar. This filter shows only products that can be purchased that +day, based on the {ref}`vendor's availability `. + +The left-side of the dashboard displays the various {guilabel}`Categories` of products available, +along with the {guilabel}`Vendors` supplying the products. To the right of each line is a number, +which indicates how many products are associated with that respective category or vendor. + +To filter the products by categories or vendors, tick the checkbox next to the desired category or +vendor to only view items related to those selections. Multiple selections can be made in each +section. + +:::{note} +If multiple selections are made, **only** products that fall under **all** the selected options +are shown. +::: + +The top portion of the dashboard, which serves as an order summary, displays the user's account +information, and the order details for today, if any orders have been placed. + +The main section, beneath the user's information, displays all the products in a default Kanban +view. Each product card displays the name, cost, vendor, photo, and description of the product. If +the product is configured as new, it also displays a {guilabel}`New` tag. + +```{image} orders/dashboard.png +:align: center +:alt: The *Lunch* app dashboard with all areas highlighted. +``` + +:::{note} +Anywhere a vendor's name is listed in the *Lunch* app, such as on Kanban product cards, their +phone number is listed, as well. +::: + +The products can also be displayed in a list view, by clicking the {guilabel}`≣ (four parallel +lines)` icon in the top-right corner of the dashboard. + +## Placing orders + +To place a lunch order, navigate to the main {guilabel}`Order Your Lunch` dashboard, by either +opening the *Lunch* app, or by navigating to {menuselection}`Lunch app --> My Lunch --> New Order`. + +### Add products to an order + +From the {guilabel}`Order Your Lunch` dashboard, click on a desired product to add to an order, and +the product appears in a {guilabel}`Configure Your Order` pop-up window. + +At the top of the pop-up window is the product image, name, and price. Beneath that, there is a +potential {guilabel}`Extras` field, showcasing any {ref}`extra items or options `. +Tick the checkbox next to any desired extras present in the {guilabel}`Extras` field to add them to +the order. + +Each extra option is organized by a category, complete with its name and price. As extras are +selected, the displayed price at the top of the pop-up window updates to reflect all current +selections. + +Beneath the {guilabel}`Extras` field is the {guilabel}`Description` of the product, followed by a +{guilabel}`Notes` field. The {guilabel}`Notes` field is used to enter any vital information, which +is then sent to the vendor regarding the order, such as any special requests or food allergies. + +When all selections for the product have been made, click the {guilabel}`Add To Cart` button in the +lower-left of the pop-up window. To cancel the order, click the {guilabel}`Discard` button. + +```{image} orders/pizza.png +:align: center +:alt: The pop-up window for a personal pizza, with all the extras highlighted and selected. +``` + +#### Errors + +Depending on how the various {ref}`extras ` are configured for a vendor, it +is possible to receive an error when attempting to add products to the cart. + +An error can occur when a configured product **requires** the user to select an option in the +{guilabel}`Extras` field, but the user neglects to make one. + +When this occurs, a {guilabel}`Validation Error` pop-up window appears. The error is briefly +explained in the pop-up window. Click {guilabel}`Close` to close the window, and make any necessary +changes to the {guilabel}`Configure Your Order` pop-up window. + +```{eval-rst} +.. example:: + The vendor, The Pizza Palace, provides a free beverage with any purchase. Their products are + configured so that a beverage selection is **required** in the :guilabel:`Extras` field *before* + adding one of their products to the cart. + + If a selection is **not** made, an error occurs. The message that appears is `You have to order + one and only one Free Beverage with Purchase`. + + .. image:: orders/error.png + :align: center + :alt: The :guilabel:`Validation Error` pop-up window with the specific error for the free + beverage displayed. +``` + +### Your Order summary + +When at least one item is added to an order, the items appear at the top of the dashboard in the +{guilabel}`Your Order` summary. In addition to the products, users can view the account information, +in addition to all the information related to orders placed during the current calendar day. + +As products are added to an order, they appear at the top center of the summary box. Each product is +listed beneath the words {guilabel}`Your Order`, with the product name, quantity, and a status tag. + +The available tags that can be displayed for each item are: + +- {guilabel}`To Order`: the product has been added to the cart, but has not been purchased yet by + the user. +- {guilabel}`Ordered`: the product has been purchased by the user, and is waiting to be sent to the + vendor by a *Lunch* app manager. +- {guilabel}`Sent`: the order for the product has been sent to the vendor by a *Lunch* app manager. +- {guilabel}`Received`: the product has been delivered by the vendor to the user's location, and has + been verified as received by a *Lunch* app manager. + +Product quantities can be adjusted by clicking the {guilabel}`➕ (plus sign)` or {guilabel}`➖ (minus +sign)` to the left of the listed product. The product price adjusts in real-time to display the cost +for the currently selected quantity of the product. + +The right side of the {guilabel}`Your Order` summary displays the purchasing information. The +{guilabel}`Total` amount for the entire day's lunch order is displayed. The {guilabel}`Already Paid` +field indicates how much has been paid that day towards the {guilabel}`Total` amount. The +{guilabel}`To Pay` field displays how much of the remaining {guilabel}`Total` amount must be paid, +in order to place the currently configured order. + +```{image} orders/your-order.png +:align: center +:alt: The Your Orders section of the dashboard, with the purchasing information highlighted. +``` + +:::{tip} +Users can place multiple orders throughout the day, and are not restricted to only placing one +lunch order each day. Multiple orders might need to be placed, due to users forgetting to add +items to an order, or if there are multiple meals that are available to be purchased for the +office ()not just lunch), and so on. + +Depending on the various vendors, and how the vendors and products are configured, it is possible +to order breakfast, lunch, dinner, coffee, and/or snacks. +::: + +### Submit an order + +To place the order, click the {guilabel}`Order Now` button on the right-side of the {guilabel}`Your +Order` summary. The user is charged the amount that is displayed in the {guilabel}`To Pay` field, +and the cost is deducted from their *Lunch* account balance. + +Once the order is placed, the tags for the items just purchased in the {guilabel}`Your Order` field +change from orange {guilabel}`To Order` tags to red {guilabel}`Ordered` tags. + +### Track an order + +When orders have been sent to the vendors, the tags for the items in the {guilabel}`Your Order` +summary change from red {guilabel}`Ordered` tags to blue {guilabel}`Sent` tags. + +Once orders have been received and verified, the tags change from blue {guilabel}`Sent` tags to +green {guilabel}`Received` tags. + +### Receive an order + +When orders are received at the delivery location, they are confirmed by a *Lunch* app manager, and +a notification is sent to the employee who ordered the food. + +## My Orders + +To view a full list of all orders placed in the *Lunch* app for the currently signed-in user, +navigate to {menuselection}`Lunch app --> My Lunch --> My Order History`. This navigates to the +{guilabel}`My Orders` dashboard. The data is filtered by {guilabel}`My Orders` and grouped by +{guilabel}`Order Date: Day`, by default, both of which are located in the {guilabel}`Search...` bar. + +All products appear in a list view, organized by date. The list displays the {guilabel}`Order Date`, +{guilabel}`Vendor`, {guilabel}`Product`, {guilabel}`Extras`, {guilabel}`Notes`, {guilabel}`User`, +{guilabel}`Lunch Location`, {guilabel}`Price`, and {guilabel}`Status` information. If in a +multi-company database, a {guilabel}`Company` column also appears. + +The total cost for each order is displayed on the line containing the order date. At the bottom of +the list, beneath all the lines, the overall total amount paid for all the orders appears, under the +{guilabel}`Price` column. + +At the end of each product line with a status of {guilabel}`Ordered` or {guilabel}`Sent`, an +{guilabel}`X Cancel` button appears. Click {guilabel}`X Cancel` to cancel that product order. Once a +product order has been cancelled, the money paid for that product is refunded, and appears in the +user's account. + +At the end of each product line with a status of {guilabel}`Received`, a {guilabel}`Re-order` button +appears. Click {guilabel}`Re-order` to instantly reorder that same product, with the same extras, if +applicable. The new order appears in the list, under the current date, and the product is paid for, +with money deducted from the user's account. + +```{image} orders/my-orders.png +:align: center +:alt: The list view that appears when navigating to the My Orders dashboard. +``` + +## My Account + +To view a summary of all transactions in the user's account, navigate to {menuselection}`Lunch app +--> My Lunch --> My Account History`. Doing so reveals the {guilabel}`My Account` dashboard. + +The default presentation of the {guilabel}`My Account` dashboard displays all entries, from newest +to oldest. The {guilabel}`Date`, {guilabel}`Description`, and {guilabel}`Amount` are the only fields +displayed in the list. + +Entries with a negative figure listed in the {guilabel}`Amount` column represent products purchased +in the *Lunch* app. These appear in a `$-XX.XX` format. + +Entries with a positive balance either represent funds added to the user's lunch account, or +cancelled orders that were eventually refunded to the user. These appear in a `$XX.XX` format. + +```{image} orders/my-account.png +:align: center +:alt: |- +: The My Account dashboard with the entry for adding funds to the user's lunch account +: highlighted. +``` + diff --git a/content/applications/hr/lunch/products.md b/content/applications/hr/lunch/products.md new file mode 100644 index 000000000..77b7eb454 --- /dev/null +++ b/content/applications/hr/lunch/products.md @@ -0,0 +1,62 @@ +# Products + +Odoo's *Lunch* app does **not** come with any products preconfigured. The individual products being +offered must first be configured before orders can be placed. + +To add and configure products for the *Lunch* app, navigate to {menuselection}`Lunch app --> +Configuration --> Products`. Next, click the {guilabel}`New` button in the top-left corner, and a +blank product form loads. + +Enter the following information on the form: + +- {guilabel}`Product Name`: enter the name for the product. This field is **required**. +- {guilabel}`Product Category`: using the drop-down menu, select the {ref}`category + ` this product falls under. This field is **required**. +- {guilabel}`Vendor`: using the drop-down menu, select the vendor that supplies this product. This + field is **required**. +- {guilabel}`Price`: enter the price for the product. The currency is determined by the company's + localization. +- {guilabel}`Description`: enter a description of the product in this field. This description + appears beneath the product photo when users are viewing the day's options. +- {guilabel}`New Until`: using the calendar popover, select the date on which the product is no + longer labeled as new. Until this date, a green `New` tag appears on the product. +- {guilabel}`Company`: if the product should only be available to a specific company, select it from + the drop-down menu. If this field is left blank, this product is available for all companies in + the database. +- **Image**: hover over the image box in the top-right corner of the form, and click the + {icon}`fa-pencil` {guilabel}`(pencil)` icon that appears. A file explorer pop-up window appears. + Navigate to the image, then click {guilabel}`Open`. + +```{image} products/product.png +:align: center +:alt: A product form filled out for a nine inch pizza. +``` + +(lunch-product-categories)= + +## Product categories + +Product categories organize the offerings in the *Lunch* app, and allows users to quickly filter +them when reviewing the menu for the day. + +To add or modify categories, navigate to {menuselection}`Lunch app --> Configuration: Product +Categories`. The available categories appear in a list view. + +In the *Lunch* app, there are four default categories: {guilabel}`Sandwich`, {guilabel}`Pizza`, +{guilabel}`Burger`, and {guilabel}`Drinks`. + +To add a new category, click the {guilabel}`New` button in the top-left corner, and a blank category +form loads. + +Enter a name in the {guilabel}`Product Category` field. If the category is company-specific and +should only appear for a certain company, select the {guilabel}`Company` from the drop-down menu. + +If desired, add a photo for the category. Hover over the image box in the top-right, and click the +{icon}`fa-pencil` {guilabel}`(pencil)` icon that appears. This opens a file explorer pop-up window. +Navigate to the image, then click {guilabel}`Open`. + +```{image} products/category.png +:align: center +:alt: The category form, with the fields filled out for a Soup category. +``` + diff --git a/content/applications/hr/lunch/user-accounts.md b/content/applications/hr/lunch/user-accounts.md new file mode 100644 index 000000000..fc53148ad --- /dev/null +++ b/content/applications/hr/lunch/user-accounts.md @@ -0,0 +1,105 @@ +# Manage user accounts + +In Odoo's *Lunch* application, users pay for products directly from their *Lunch* app account. For +funds to appear in their account, a *Lunch* app manager **must** transfer funds into each user's +account. + +:::{important} +To add funds and manage user accounts, the user must have {guilabel}`Administrator` access rights +set for the *Lunch* application. This is verified by navigating to {menuselection}`Settings app +--> → Manage Users`. Then, click on a user to view their various settings and access rights. + +For more information, refer to the +{doc}`Access rights <../../general/users/access_rights/>` documentation. +::: + +The *Lunch* application does **not** directly interface in any way with software or products linked +to any monetary accounts or billing. Money **cannot** be transferred from users' bank accounts, nor +can users' credit cards be charged. + +Odoo's *Lunch* application **only** allows for manual entries of cash exchanges that are handled by +the *Lunch* app manager. It is up to each individual company to create the method with which lunch +accounts are replenished. + +```{eval-rst} +.. example:: + Some examples of how money can be organized and transferred within a company: + + - Cash is handed to the *Lunch* app manager, who then updates the user's account. + - Money is automatically deducted from the user's paychecks, then the *Lunch* app manager updates + the account when paychecks are issued. This requires :ref:`adding a salary attachment + ` for the user's payslip in the *Payroll* app. + - Companies can sell "lunch tickets" at a set price (for example, one ticket costs $5.00). Users + can purchase tickets from a *Lunch* app manager, who then updates the user's account. +``` + +(lunch-cash-moves)= + +## Cash Moves + +To add funds to user accounts, each cash move must be individually logged. To view all cash move +records, or create a new cash move, navigate to {menuselection}`Lunch app --> Manager --> Cash +Moves`. Doing so reveals the {guilabel}`Cash Moves` dashboard. + +On the {guilabel}`Cash Moves` dashboard, all cash moves are presented in a default list view, +displaying each record's {guilabel}`Date`, {guilabel}`User`, {guilabel}`Description`, and +{guilabel}`Amount`. The total of all the cash moves is displayed at the bottom of the +{guilabel}`Amount` column. + +```{image} user-accounts/cash.png +:align: center +:alt: The list view of all cash moves. +``` + +### Add funds + +To add funds to a lunch account, click the {guilabel}`New` button, located in the top-left corner of +the {guilabel}`Cash Moves` dashboard. + +A blank {guilabel}`Cash Moves` form loads. Enter the following information on the form: + +- {guilabel}`User`: select the user depositing cash into their account from the drop-down menu. If + the user is not in the database, they can be created by typing their name in the {guilabel}`User` + field, and clicking either {guilabel}`Create "user"` or {guilabel}`Create and edit...` to create + the user and edit the {guilabel}`Create User` form. +- {guilabel}`Date`: using the calendar popover, select the date the transaction occurred. +- {guilabel}`Amount`: enter the amount being added to the lunch account. +- {guilabel}`Description`: enter a brief description of the transaction. + +```{image} user-accounts/cash-move-form.png +:align: center +:alt: The cash move form filled out for a transaction of $40.00. +``` + +## Control Accounts + +An overview of every transaction in the *Lunch* app, including all cash deposits and purchases, can +be viewed on the main *Control Accounts* dashboard. To access this dashboard, navigate to +{menuselection}`Lunch app --> Manager --> Control Accounts.` + +All transactions are grouped {guilabel}`By Employee`, and listed alphabetically by the user's first +name. At the end of the user's name, a number appears. This indicates the number of individual +records logged for that user. + +The default view is to have all individual transactions hidden. To view all transactions for a user, +click the {guilabel}`▶ (triangle)` icon to the left of the desired name to expand that specific +group. + +Each record includes the {guilabel}`Date`, {guilabel}`User`, {guilabel}`Description`, and +{guilabel}`Amount`. + +```{image} user-accounts/control-accounts.png +:align: center +:alt: The Control Accounts dashboard with two employee's transactions expanded. +``` + +:::{important} +This list only displays the various transactions within the *Lunch* app, and does **not** allow +modifications to be made to any records listed. + +Cash moves can be modified, but **only** from the {ref}`Cash Moves ` +dashboard, not from the {guilabel}`Control Accounts` dashboard. + +It is **not** possible to modify any product-related records. +::: + diff --git a/content/applications/hr/lunch/vendors.md b/content/applications/hr/lunch/vendors.md new file mode 100644 index 000000000..49984055a --- /dev/null +++ b/content/applications/hr/lunch/vendors.md @@ -0,0 +1,171 @@ +# Vendors + +Before {doc}`products can be added ` to the *Lunch* app, the restaurants that provide the +food **must** be configured. + +To add a new vendor, first navigate to {menuselection}`Lunch app --> Configuration --> Vendors`. +Here, all currently configured vendors for the *Lunch* app appear in a default Kanban view. To +change to a list view, click the {icon}`oi-view-list` {guilabel}`(list)` icon in the top-right +corner. + +:::{note} +No vendors are preconfigured in the *Lunch* app, so all vendors **must** be added to the +database. +::: + +To add a new vendor, click the {guilabel}`New` button in the top-left corner, and a new lunch +supplier form loads. + +Fill out the following fields on the vendor form: + +- {ref}`Vendor information ` +- {ref}`Availability ` +- {ref}`Orders ` +- {ref}`Extras ` + +(lunch-vendor-info)= + +## Vendor information + +- {guilabel}`Vendor`: enter a name for the vendor. + +- {guilabel}`Vendor` (beneath the line for vendor name): select the vendor from the drop-down menu. + If the vendor has not already been entered in the system, type in the vendor name, and click + either {guilabel}`Create "new vendor name"` to add them. Alternatively, click {guilabel}`Create + and edit...` to create the vendor, and edit the vendor form. The vendor form allows for more + detail, aside from the name, to be entered, such as contact information. + + :::{note} + If a selection is made to the drop-down {guilabel}`Vendor` field, the {guilabel}`Vendor` text + field (above, for the vendor's name) updates with the name of the vendor chosen from the + drop-down menu. + + The list of vendors that is presented in the drop-down menu is pulled from the *Contacts* + application. + ::: + +- {guilabel}`Address`: enter the vendor's address in the various fields. + +- {guilabel}`Email`: enter the vendor's email. + +- {guilabel}`Phone`: enter the vendor's phone number. + +- {guilabel}`Company`: if this vendor is only available to a specific company, select the company + from the drop-down menu. If this field is left blank, the vendor's items are available to **all** + companies. + +```{image} vendors/vendor-info.png +:align: center +:alt: The top portion of the vendor form filled out. +``` + +(lunch-availability)= + +## Availability + +The {guilabel}`AVAILABILITY` section presents a table with two rows. The days of the week populate +the top row, and the bottom row has checkboxes. Tick the corresponding checkbox for each day of the +week the vendor is available. + +By default, Monday through Friday are ticked. + +```{image} vendors/availability.png +:align: center +:alt: The default view of the availability section, with Mon-Fri enabled. +``` + +(lunch-orders)= + +## Orders + +The {guilabel}`ORDERS` section of the vendor form details which locations the vendor is available +for, in addition to how and when orders are placed and received. + +- {guilabel}`Delivery`: using the drop-down menu, select {guilabel}`Delivery` if the vendor + delivers to the office, or select {guilabel}`No Delivery` if orders must be picked up. + +- {guilabel}`Location`: select which locations are able to order from this vendor. Multiple + locations can be selected. If this field is left blank, **all** locations can order from the + vendor. + + :::{note} + An `HQ Office` location is created by default when creating a database, and is + available to select from the list. + ::: + +- {guilabel}`Send Order By`: click the radio button to select how orders are sent to the vendor. The + available options are {guilabel}`Phone` or {guilabel}`Email`. + +- {guilabel}`Order Time`: this field **only** appears if {guilabel}`Email` is selected in the + {guilabel}`Send Order By` field. Enter the time that an order must be emailed for it to be + accepted. Enter the time in the following format: `HH:MM`. Then select either {guilabel}`AM` or + {guilabel}`PM` from the drop-down menu, next to the time field. + +```{image} vendors/orders.png +:align: center +:alt: The orders section of a vendor form, with all fields filled out. +``` + +(lunch-extras)= + +## Extras + +When ordering an item in the *Lunch* app, optional extra items, sometimes referred to as *add-ons*, +can be shown. These can be configured in any manner that suits the products being offered. + +By default, Odoo allows for three types of extra items, which can be thought of as *categories*. By +default, the first type (or *category*) of add-ons is labeled `Extras`, the second is labeled +`Beverages`, and the third is labeled `Extra Label 3`. + +:::{important} +When configuring the extras, it is important to keep in mind that all the extras configured +appear for **every item** offered by the vendor. That means that only items which apply to +**all** products from the vendor should be added. +::: + +(lunch-configure-extras)= + +### Configure extras + +Enter the following information for each of the three available extra sections: + +- {guilabel}`Extra (#) Label`: enter a name for the type of extra, such as `Toppings`. This can be + thought of as a *category*. + +- {guilabel}`Extra (#) Quantity`: select how the extras are selected. The options are: + + - {guilabel}`None or More`: select this if the user is not required to make a selection. + - {guilabel}`One or More`: select this to **require** the user to make **at least one** selection. + - {guilabel}`Only One`: select this to **require** the user to **make only one** selection. + +### Add extras + +After the labels and quantities have been configured for an extra category, the individual extra +items must be added for each category. + +Click {guilabel}`Add a line` at the bottom of the list that appears on the right-hand side of the +extra category. Enter the {guilabel}`Name` and {guilabel}`Price` for each item being added. The +price can remain at `$0.00` if there is no cost. This is common for items like disposable silverware +or condiments. + +```{eval-rst} +.. example:: + For a pizzeria that only offers personal pizzas, see their extras configured as follows: + + The first extra is configured for the various toppings they offer. The :guilabel:`Extra 1 Label` + is set to `Toppings`, and the :guilabel:`Extra 1 Quantity` is set to :guilabel:`None or More`. + The various toppings are then added, with their corresponding costs. + + .. image:: vendors/extras.png + :align: center + :alt: The first of the extras configured for pizza toppings. + + The pizzeria also offers a free beverage with any purchase. To set this up, the :guilabel:`Extra + 2 Label` is set to `Beverages`, and the :guilabel:`Extra 1 Quantity` is set to :guilabel:`Only + One`. The various beverage choices are added, and the cost for each remains zero. + + .. image:: vendors/beverages.png + :align: center + :alt: The second of the extras configured for a free beverage with purchase. +``` + diff --git a/content/applications/hr/payroll.md b/content/applications/hr/payroll.md new file mode 100644 index 000000000..bdf793ce7 --- /dev/null +++ b/content/applications/hr/payroll.md @@ -0,0 +1,1003 @@ +--- +show-content: true +--- + +# Payroll + +Odoo *Payroll* is used to process work entries and create payslips for employees. *Payroll* works in +conjunction with other Odoo apps, such as *Employees*, *Time Off*, *Attendances*, and *Planning*. + +The *Payroll* app helps ensure there are no issues or conflicts when validating work entries. It +also handles country-specific localizations to ensure payslips follow local rules and taxes, and +allows for salary assignments. + +## Settings + +Configure the *Payroll* app by navigating to {menuselection}`Payroll app --> Configuration --> +Settings`. The various settings for accounting, localizations, time off, alerts, and payslips are +specified here. + +(payroll-accounting)= + +### Accounting + +The accounting section of the configuration menu relates to three options: + +- {guilabel}`Payroll Entries`: enable this option to post payroll slips in accounting. +- {guilabel}`Payroll SEPA`: enable this option to create SEPA payments. +- {guilabel}`Batch Account Move Lines`: enable this option to have a single account move line + 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 locality. 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 configured for that specific +company, since company locations can vary and be located 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 + +- {guilabel}`Deferred Time Off`: if time off is taken after payslips are validated, the time off + needs to be applied to the following pay period. Select the person responsible for validating + these specific time off situations using the drop-down menu in the {guilabel}`Responsible` field. + + ```{eval-rst} + .. example:: + An employee is paid on the 15th of the month and the last day of the month. Payslips are + typically processed a day before. + + If an employee's payslip is approved and processed on the 30th, but that same employee takes an + unexpected sick day on the 31st, the time off needs to be logged. + + Since the employee is already paid for a regular work day on the 31st, to keep the time off + balances correct, the sick day is moved/applied to the 1st of the next month (the next pay + period). + ``` + +### Payroll + +- {guilabel}`Contract Expiration Notice Period`: enter the number of {guilabel}`Days` before a + contract expires, and Odoo notifies the responsible person about the upcoming expiration at that + time. +- {guilabel}`Work Permit Expiration Notice Period`: enter the number of {guilabel}`Days` before a + work permit expires, and Odoo notifies the responsible person about the upcoming expiration at + that time. +- {guilabel}`Payslip PDF Display`: enable this option to have payslips display a PDF file on the + payslip form. + +(payroll-work-entries-config)= + +## Contracts + +In order for an employee to be paid, they **must** have an active contract for a specific type of +employment. Creating and viewing contract templates, and creating and viewing employment types, is +possible from this section of the configuration header menu. + +(payroll-contract-templates)= + +### Templates + +Contract templates are used with the *Recruitment* application when sending an offer to a candidate. +The contract template forms the basis of an offer, and can be modified for specific candidates or +employees, when necessary. If a contract template is created or modified in the *Payroll* +application, the changes are also reflected in the *Recruitment* application. + +:::{important} +To access contract templates, the *Salary Configurator* (`hr_contract_salary`) module **must** be +{ref}`installed `. +::: + +To view all the current contract templates in the database, navigate to {menuselection}`Payroll app +--> Configuration --> Contracts: Templates`. + +On the {guilabel}`Contract Templates` page, all current contract templates appear in a list view. To +view the details of a contract template, click anywhere on the line to open the contract form. The +contract template can be modified from this form. Proceed to make any desired changes to the +contract. + +To create a new contract template, click the {guilabel}`New` button. Then, enter the following +information on the blank contract template form that appears: + +- {guilabel}`Contract Reference`: enter a brief description for the template. This should be clear + and easily understood, as this name appears in the *Recruitment* application, as well. + +- {guilabel}`Working Schedule`: select the desired working schedule the contract applies to from the + drop-down menu. If a new working schedule is needed, create a {ref}`new working schedule + `. + +- {guilabel}`Work Entry Source`: select how the work entries are generated. Choices are either: + + - {guilabel}`Working Schedule`: work entries are generated based on the selected working schedule. + - {guilabel}`Attendances`: work entries are generated based on the employee's attendance, as they + are logged in the *Attendances* application. Refer to the {ref}`Attendances + ` documentation for information on checking in and out. + - {guilabel}`Planning`: work entries are generated based on the employee's planning in the + *Planning* application. + +- {guilabel}`Salary Structure Type`: select the {ref}`salary structure type + ` from the drop-down menu. + +- {guilabel}`Department`: select the department the contract template applies to from the drop-down + menu. If blank, the template applies to all departments. + +- {guilabel}`Job Position`: select the {ref}`job position ` the contract + template applies to from the drop-down menu. If blank, the template applies to all job positions. + +- {guilabel}`Wage on Payroll`: enter the monthly wage in the field. + +- {guilabel}`Contract Type`: select the type of contract from the drop-down menu. This list is the + same as the {ref}`Employment Types `. + +- {guilabel}`HR Responsible`: select the employee responsible for validating contracts, using this + template, from the drop-down menu. + +- {guilabel}`New Contract Document Template`: select a default document that a new employee has to + sign to accept an offer. + +- {guilabel}`Contract Update Document Template`: select a default document that a current employee + has to sign to update their contract. + +```{image} payroll/contract-template.png +:align: center +:alt: A new contract template form, with the fields filled in. +``` + +#### Salary information tab + +- {guilabel}`Wage Type`: select either {guilabel}`Fixed Wage` or {guilabel}`Hourly Wage` from the + drop-down menu. +- {guilabel}`Schedule Pay`: using the drop-down menu, select how often the employee is paid. Options + include {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 gross wage. The time period presented in this field is based on what + is selected for the {guilabel}`Scheduled Pay` field. It is recommended to populate the + {guilabel}`Yearly Cost (Real)` field *first*, since that entry updates this field automatically. +- {guilabel}`Yearly Cost (Real)`: enter the total yearly cost the employee costs the employer. When + this value is entered, the {guilabel}`Monthly Cost (Real)` is automatically updated. +- {guilabel}`Monthly Cost (Real)`: this field is **not** editable. The value is automatically + populated after the {guilabel}`Yearly Cost (Real)` is entered. + +:::{important} +The {guilabel}`Schedule Pay`, {guilabel}`Wage`, and {guilabel}`Yearly Cost (Real)` fields are all +linked. If any of these fields are updated, the other two fields automatically update to reflect +the change. It is best practice to check these three fields if any modifications have been made, +to ensure they are accurate. +::: + +```{image} payroll/salary-information.png +:align: center +:alt: The salary information tab, with the fields filled in. +``` + +#### Pre-tax benefits and post-tax deductions + +Depending on the localization settings set for the company, the entries presented in this section +either vary, or may not appear at all. + +For example, some entries may pertain to retirement accounts, health insurance benefits, and +commuter benefits. + +Enter the monetary amounts or percentages to specify how much of the employee's salary goes to the +various benefits and/or deductions. + +(payroll-employment-types)= + +### Employment types + +To view all the pre-configured employment types, navigate to {menuselection}`Payroll application --> +Configuration --> Contracts: Employment Types`. + +The employment types are presented in a list view on the {guilabel}`Employment Types` page. + +The default employment types are {guilabel}`Permanent`, {guilabel}`Temporary`, {guilabel}`Seasonal`, +{guilabel}`Interim`, {guilabel}`Full-Time`, {guilabel}`Part-Time`, and {guilabel}`Permanent`. + +To make a new employment type, click the {guilabel}`New` button in the upper-left corner, and a +blank line appears at the bottom of the {guilabel}`Employment Types` page. + +On this new blank line, enter the name of the employment type in the {guilabel}`Name` column. If the +employment type is country-specific, select the country using the drop-down menu in the +{guilabel}`Country` column. If a country is selected, then the employment type is *only* applicable +for that specific country. + +To rearrange the order of the employment types, click the {guilabel}`six small gray boxes` icon to +the left of the employment type {guilabel}`Name`, and drag the line to the desired position on the +list. + +```{image} payroll/employment-types.png +:align: center +:alt: The employment types in the database by default, in a list view. +``` + +(payroll-work-entries)= + +## Work entries + +A *work entry* is an individual record on an employee's timesheet. Work entries can be configured to +account for all types of work and time off, such as {guilabel}`Attendance`, {guilabel}`Sick Time +Off`, {guilabel}`Training`, or {guilabel}`Public Holiday`. + +:::{seealso} +{doc}`Manage work entries ` +::: + +### Work entry types + +When creating a work entry in the *Payroll* application, or when an employee enters information in +the *Timesheets* application, a {guilabel}`Work Entry Type` needs to be selected. The list of +{guilabel}`Work Entry Types` is automatically created based on localization settings set in the +database. + +To view the current work entry types available, go to {menuselection}`Payroll app --> Configuration +--> Work Entries --> Work Entry Types`. + +Each work entry type has a code to aid in the creation of payslips, and to ensure all taxes and fees +are correctly entered. + +```{image} payroll/work-entry-types.png +:align: center +:alt: List of all work entry types currently available for use, with the payroll code +: and color. +``` + +#### New work entry type + +To create a new {guilabel}`Work Entry Type`, click the {guilabel}`New` button, and enter the +information for the following sections on the form. + +##### General information section + +- {guilabel}`Work Entry Type Name`: the name should be short and descriptive, such as `Sick Time` or + `Public Holiday`. +- {guilabel}`Payroll Code`: this code appears with the work entry type on timesheets and payslips. + Since the code is used in conjunction with the *Accounting* application, it is advised to check + with the accounting department for a code to use. +- {guilabel}`DMFA code`: this code is used to identify {abbr}`DMFA (De Multifunctionele Aangifte)` + entries on a corresponding {abbr}`DMFA (De Multifunctionele Aangifte)` report. The {abbr}`DMFA + (De Multifunctionele Aangifte)` report is a quarterly report that Belgian-based companies are + required to submit for social security reporting purposes. This report states the work done by the + employees during the quarter, as well as the salaries paid to those employees. +- {guilabel}`External Code`: this code is used for exporting data to a third-party payroll service. + Check with the third-party being used to determine the {guilabel}`External Code` to enter for the + new work entry type. +- {guilabel}`SDWorx code`: this code is only for companies that use SDWorx, a payroll service + provider. +- {guilabel}`Color`: select a color for the particular work entry type. + +##### Display in payslip section + +- {guilabel}`Rounding`: the rounding method selected determines how quantities on timesheet entries + are displayed on the payslip. + + - {guilabel}`No Rounding`: a timesheet entry is not modified. + - {guilabel}`Half Day`: a timesheet entry is rounded to the closest half day amount. + - {guilabel}`Day`: a timesheet entry is rounded to the closest full day amount. + +```{eval-rst} +.. example:: + If the working time is set to an 8-hour work day (40-hour work week), and an employee enters a + time of 5.5 hours on a timesheet, and :guilabel:`Rounding` is set to :guilabel:`No Rounding`, the + entry remains 5.5 hours. If :guilabel:`Rounding` is set to :guilabel:`Half Day`, the entry is + changed to 4 hours. If it is set to :guilabel:`Day`, it is changed to 8 hours. +``` + +##### Unpaid section + +- {guilabel}`Unpaid in Structures Types`: if the work entry is for work that is not paid, specify + which pay structure the unpaid work entry applies to from the drop-down menu. Some situations + where work is logged on a timesheet, but no compensation given would be for unpaid internships, + unpaid training, or volunteer work. + +##### Valid for advantages section + +- {guilabel}`Meal Voucher`: if the work entry should count towards a meal voucher, check the box. +- {guilabel}`Representation Fees`: if the work entry should count towards representation fees, check + the box. +- {guilabel}`Private Car Reimbursement`: if the work entry should count towards a private car + reimbursement, check the box. + +##### Time off options section + +- {guilabel}`Time Off`: check this box if the work entry type can be selected for a time off + request, or entry, in the *Time Off* application. + + If {guilabel}`Time Off` is checked, a {guilabel}`Time Off Type` field appears. This field has a + drop-down menu to select the specific type of time off, such as `Paid Time Off`, `Sick Time Off`, + or `Extra Hours`, for example. + + A new type of time off can be entered in the field, if the listed types of time off in the + drop-down menu do **not** display the type of time off needed. + +- {guilabel}`Keep Time Off Right`: this is for Belgian-specific companies **only**, and does + **not** appear for other localizations. Check this box if the work entry is for time off that + affects the time off benefits for the following year. Workers are given time off each year, + according to the government, and in some cases, time off taken during a specific time period can + affect how much time off the employee receives or accrues the following year. + +##### Reporting section + +- {guilabel}`Unforeseen Absence`: if the work entry should be visible on the unforeseen absences + report, check this box. + +```{image} payroll/new-work-entry-type.png +:align: center +:alt: New work entry type form with all fields to be filled in. +``` + +(payroll-working-times)= + +### Working schedules + +To view the currently configured working schedules, go to {menuselection}`Payroll app --> +Configuration --> Work Entries --> Working Schedules`. The working schedules that are available for +an employee's contracts and work entries are found in this list. + +Working schedules are company-specific. Each company **must** identify each type of working schedule +they use. If the database is created for only one company, the company column is not available. + +```{eval-rst} +.. example:: + An Odoo database containing multiple companies that use a standard 40-hour work week needs to + have a separate working schedule entry for each company that uses the 40-hour standard work week. + + A database with five companies that all use a standard 40-hour work week needs to have five + separate 40-hour working schedules configured. +``` + +```{image} payroll/working-schedules.png +:align: center +:alt: All working schedules available to use currently set up in the database for the +: company. +``` + +(payroll-new-working-schedule)= + +#### New working schedule + +To create a new working schedule, click the {guilabel}`New` button, and enter the information on the +form. + +The fields are auto-populated for a regular 40-hour work week but can be modified. First, change the +name of the working time by modifying the text in the {guilabel}`Name` field. Next, make any +adjustments to the days and times that apply to the new working time. + +In the {guilabel}`Working Hours` tab, modify the {guilabel}`Day of Week`, {guilabel}`Day Period`, +and {guilabel}`Work Entry Type` selections by clicking on the drop-down menus in each column and +making the desired selection. The {guilabel}`Work From` and {guilabel}`Work To` columns are modified +by typing in the time. + +:::{note} +The {guilabel}`Work From` and {guilabel}`Work To` times must be in a 24-hour format. For example, +`2:00 PM` would be entered as `14:00`. +::: + +If the working time should be in a two-week configuration, click the {guilabel}`Switch to 2 weeks +calendar` button in the top-left. This creates entries for an {guilabel}`Even week` and an +{guilabel}`Odd week`. + +```{image} payroll/new-working-schedule.png +:align: center +:alt: New working schedule form. +``` + +## Salary + +(payroll-structure-types)= + +### Structure types + +In Odoo, an employee's payslip is based on *structures* and *structure types*, which both affect how +an employee enters timesheets. Each structure type is an individual set of rules for processing a +timesheet entry, which consists of different structures nested within it. Structure types define how +often an employee gets paid, the working hours, and if wages are based on a salary (fixed) or how +many hours the employee worked (varied). + +For example, a structure type could be `Employee`, and that structure type could have two different +structures in it: a `Regular Pay` structure which includes all the separate rules for processing +regular pay, as well as a structure for an `End of Year Bonus` which includes the rules only for the +end of year bonus. Both the `Regular Pay` structure and `End of Year Bonus` structure are structures +within the `Employee` structure type. + +The different {guilabel}`Structure Types` can be seen by navigating to {menuselection}`Payroll app +--> Configuration --> Salary: Structure Types`. + +Two default structure types are configured in Odoo: {guilabel}`Employee` and {guilabel}`Worker`. + +Typically, {guilabel}`Employee` is used for salaried employees, which is why the wage type is +{guilabel}`Monthly Fixed Wage`, and {guilabel}`Worker` is typically used for employees paid by the +hour, so the wage type is {guilabel}`Hourly Wage`. + +```{image} payroll/structure-type.png +:align: center +:alt: List of all currently configured structure types available to use. +``` + +(payroll-new-structure-type)= + +#### New structure type + +To make a new structure type, click the {guilabel}`New` button, and a blank structure type form +appears. + +Proceed to enter information in the fields. Most fields are pre-populated, but all the fields can be +modified. + +- {guilabel}`Structure Type`: enter the name for the new structure type, such as `Employee` or + `Worker`. + +- {guilabel}`Country`: select the country that the new structure type applies to from the drop-down + menu. + +- {guilabel}`Wage Type`: select what type of wage the new structure type uses, either + {guilabel}`Fixed Wage` or {guilabel}`Hourly Wage`. + + If the type is to be used for salaried employees, who receive the same wage every pay period, + select {guilabel}`Fixed Wage`. + + If the type is to be used for employees, who receive wages based on how many hours they worked + during a pay period, select {guilabel}`Hourly Wage`. + +- {guilabel}`Default Scheduled Pay`: select the typical pay schedule for the new structure type from + the drop-down menu. Options are {guilabel}`Monthly`, {guilabel}`Quarterly`, + {guilabel}`Semi-annually`, {guilabel}`Annually`, {guilabel}`Weekly`, {guilabel}`Bi-weekly`, + {guilabel}`Bi-monthly`. This indicates how often this specific type of structure is paid out. + +- {guilabel}`Default Working Hours`: select the default working hours for the new structure type + from the drop-down menu. All available working hours for the currently selected company appear in + the drop-down menu. The default working hours that are pre-configured in Odoo is the + {guilabel}`Standard 40 hours/week` option. If the needed working hours do not appear in the list, + a {ref}`new set of default working hours can be created `. + +- {guilabel}`Regular Pay Structure`: type in the name for the regular pay structure. + +- {guilabel}`Default Work Entry Type`: select the default type of work entry the new structure type + falls under from the drop-down menu. The default options include {guilabel}`Attendance`, + {guilabel}`Overtime Hours`, {guilabel}`Generic Time Off`, {guilabel}`Compensatory Time Off`, + {guilabel}`Home Working`, {guilabel}`Unpaid`, {guilabel}`Sick Time Off`, {guilabel}`Paid Time + Off`, {guilabel}`Out Of Contract`, {guilabel}`Extra Hours`, and {guilabel}`Long Term Time Off`. + + To view all the options for the {guilabel}`Default Work Entry Type`, click the {guilabel}`Search + More..` button at the bottom of the drop-down list. + + Depending on the localization settings, this list may contain more options in addition to the + default options. + +```{image} payroll/new-structure.png +:align: center +:alt: New structure type form to fill out when creating a new structure type. +``` + +(new-default-working-hours)= + +#### New default working hours + +To make new default working hours, type the name for the new working hours in the {guilabel}`Default +Working Hours` field on the new structure type form. Click {guilabel}`Create and edit`. A default +working hours form pops up. The default working hours form has two sections, a general information +section and a tab listing out all the individual working hours by day and time. When the form is +completed, click {guilabel}`Save & Close`. + +- {guilabel}`Name`: type in the name for the new default working hours. This should be descriptive + and clear to understand, such as `Standard 20 Hours/Week`. + +- {guilabel}`Company`: select the company that can use these new default working hours from the + drop-down menu. Keep in mind, working hours are company-specific, and cannot be shared between + companies. Each company needs to have their own working hours set. + +- {guilabel}`Average Hour Per Day`: the average hours per day field is auto-populated, based on the + working hours configured in the {guilabel}`Working Hours` tab. This entry affects resource + planning, since the average daily hours affect what resources can be used, and in what quantity, + per work day. + +- {guilabel}`Timezone`: select the time zone to be used for the new default working hours from the + drop-down menu. + +- {guilabel}`Company Full Time`: enter the number of hours per week an employee would need to work + to be considered a full-time employee. Typically, this is approximately 40 hours, and this number + affects what types of benefits an employee can receive, based on their employment status + (full-time vs part-time). + +- {guilabel}`Work Time Rate`: this percentage is auto-generated based on the entry for the + {guilabel}`Company Full Time` and the working hours configured in the {guilabel}`Working Hours` + tab. This number should be between `0.00%` and `100%`, so if the percentage is above `100%`, it is + an indication that the working times and/or {guilabel}`Company Full Time` hours need adjustment. + +- {guilabel}`Working Hours` Tab: this tab is where each day's specific working hours are listed. + When a new default working hour form is created, the {guilabel}`Working Hours` tab is + pre-populated with a default 40-hour week, with each day divided into three timed sections. + + Every day has morning (8:00-12:00), lunch (12:00-13:00), and evening (13:00-17:00) hours + configured, using a 24 hour time format. + + To adjust any of these hours, click on the specific field to adjust, and make the adjustment using + the drop-down menus, or in the specific case of the times, type in the desired time. + + Keep in mind, working hours are company-specific, and cannot be shared between companies. Each + company needs to have their own working hours set. + + :::{note} + If the working hours are not consistent each week, and the hours are on a bi-weekly schedule + instead, click the {guilabel}`Switch to 2 week calendar` button at the top of the new default + working hours form. This changes the {guilabel}`Working Hours` tab to display two weeks of + working times that can be adjusted. + ::: + +### Structures + +*Salary structures* are the different ways an employee gets paid within a specific *structure*, and +are specifically defined by various rules. + +The amount of structures a company needs for each structure type depends on how many different ways +employees are paid, and how their pay is calculated. For example, a common structure that could be +useful to add may be a `Bonus`. + +To view all the various structures for each structure type, go to {menuselection}`Payroll app --> +Configuration --> Salary --> Structures`. + +Each {ref}`structure type ` lists the various structures associated with +it. Each structure contains a set of rules that define it. + +```{image} payroll/salary-structure.png +:align: center +:alt: All available salary structures. +``` + +Click on a structure to view its {guilabel}`Salary Rules`. These rules are what calculate the +payslip for the employee. + +```{image} payroll/structure-regular-pay-rules.png +:align: center +:alt: Salary structure details for Regular Pay, listing all the specific Salary Rules. +``` + +### Rules + +Each structure has a set of *salary rules* to follow for accounting purposes. These rules are +configured by the localization, and affect actions in the *Accounting* application, so modifications +to the default rules, or the creation of new rules, should only be done when necessary. + +To view all the rules, go to {menuselection}`Payroll app --> Configuration --> Salary --> Rules`. +Click on a structure (such as {guilabel}`Regular Pay`) to view all the rules. + +To make a new rule, click {guilabel}`New`. A new rule form appears. Enter the following information +in the fields. + +#### Top section + +- {guilabel}`Rule Name`: enter a name for the rule. This field is required. +- {guilabel}`Category`: select a category the rule applies to from the drop-down menu, or enter a + new one. This field is required. +- {guilabel}`Code`: enter a code to be used for this new rule. It is recommended to coordinate with + the accounting department for a code to use as this affects accounting reports and payroll + processing. This field is required. +- {guilabel}`Sequence`: enter a number indicating when this rule is calculated in the sequence of + all other rules. +- {guilabel}`Salary Structure`: select a salary structure the rule applies to from the drop-down + menu, or enter a new one. This field is required. +- {guilabel}`Active`: enable this toggle, so the rule is available for use. Disable the toggle to + hide the rule without deleting it in the database. +- {guilabel}`Appears on payslip`: tick the checkbox to have the rule appear on employee payslips. +- {guilabel}`View on Employer Cost Dashboard`: tick the checkbox to have the rule appear on the + {guilabel}`Employer Cost` report, located on the *Payroll* app dashboard. +- {guilabel}`View on Payroll Reporting`: tick the checkbox to have the rule appear on payroll + reports. + +```{image} payroll/new-rule.png +:align: center +:alt: Enter the information for the new rule on the new rule form. +``` + +#### General tab + +##### Conditions + +- {guilabel}`Condition Based on`: select from the drop-down menu whether the rule is + {guilabel}`Always True` (always applies), a {guilabel}`Range` (applies to a specific range, which + is entered beneath the selection), or a {guilabel}`Python Expression` (the code is entered beneath + the selection). This field is required. + +##### Computation + +- {guilabel}`Amount Type`: select from the drop-down menu whether the amount is a {guilabel}`Fixed + Amount`, a {guilabel}`Percentage (%)`, or a {guilabel}`Python Code`. Depending on what is + selected, the fixed amount, percentage, or Python code needs to be entered next. This field is + required. + +##### Company contribution + +- {guilabel}`Partner`: if another company financially contributes to this rule, select the company + from the drop-down menu. + +#### Description tab + +Provide any additional information in this tab to help clarify the rule. This tab only appears in +the rule form. + +#### Accounting tab + +- {guilabel}`Debit Account`: select the debit account from the drop-down menu the rule affects. +- {guilabel}`Credit Account`: select the credit account from the drop-down menu the rule affects. +- {guilabel}`Not computed in net accountability`: tick the checkbox to delete the value of this rule + in the `Net Salary` rule. + +### Rule parameters + +:::{note} +Currently, the {guilabel}`Rule Parameters` feature found inside the {menuselection}`Payroll app +--> Configuration --> Salary --> Rule Parameters` menu is still in development and only serves a +specific use case for Belgian markets. The documentation will be updated when this section has +matured to more markets. +::: + +### Other input types + +When creating payslips, it is sometimes necessary to add other entries for specific circumstances, +like expenses, reimbursements, or deductions. These other inputs can be configured by navigating to +{menuselection}`Payroll app --> Configuration --> Salary --> Other Input Types`. + +```{image} payroll/other-input.png +:align: center +:alt: |- +: A list of other input types for payroll that can be selected when creating a new entry for +: a payslip. +``` + +To create a new input type, click the {guilabel}`New` button. Enter the {guilabel}`Description`, the +{guilabel}`Code`, and which structure it applies to in the {guilabel}`Availability in Structure` +field. + +:::{important} +The {guilabel}`Code` is used in the salary rules to compute payslips. If the +{guilabel}`Availability in Structure` field is left blank, it indicates that the new input type +is available for all payslips and is not exclusive to a specific structure. +::: + +```{image} payroll/input-type-new.png +:align: center +:alt: A new Input Type form filled in. +``` + +(payroll-salary-attachment-types)= + +## Salary package configurator + +The various options under the {guilabel}`Salary Package Configurator` section of the +{menuselection}`Payroll app --> Configuration --> Salary Package Configurator` menu all affect an +employee's potential salary. These sections ({guilabel}`Benefits`, {guilabel}`Personal Info`, +and {guilabel}`Resume`) specify what benefits can be offered to an employee in their salary package. + +Depending on what information an employee enters (such as deductions, dependents, etc.), their +salary is adjusted accordingly. When an applicant applies for a job on the company website, the +sections under {guilabel}`Salary Package Configurator` directly affect what the applicant sees, and +what is populated, as the applicant enters information. + +### Benefits + +When offering potential employees a position, there can be certain benefits set in Odoo, in addition +to the salary, to make an offer more appealing (such as extra time off, the use of a company car, +reimbursement for a phone or internet, etc.). + +To view the benefits, go to {menuselection}`Payroll app --> Configuration --> Salary Package +Configurator: Benefits`. Benefits are grouped by {guilabel}`Structure type`, and the benefit listed +for a particular structure type is only available for that specific structure. + +```{image} payroll/benefits.png +:align: center +:alt: A list view of all the benefits available for each structure type. +``` + +```{eval-rst} +.. example:: + A company has two structure types, one labeled :guilabel:`Employee`, and another labeled + :guilabel:`Intern`. The :guilabel:`Employee` structure type contains the benefit of using a + company car, while the :guilabel:`Intern` structure type has a meal voucher benefit available. + + A person hired under the :guilabel:`Employee` structure type can use the company car benefit, but + cannot have meal vouchers. A person hired under the :guilabel:`Intern` structure type would have + meal voucher benefits available to them, not the use of a company car. +``` + +To make a new benefit, click the {guilabel}`New` button, and enter the information in the fields on +the blank benefits form. + +The various fields for creating a benefit are as follows: + +#### General information section + +- {guilabel}`Benefits`: enter the name for the benefit. This field is required. + +- {guilabel}`Benefit Field`: select from the drop-down menu the type of benefit this is. + +- {guilabel}`Cost Field`: select from the drop-down menu the type of cost incurred by the company + for this specific benefit. The default options are {guilabel}`Calendar Changed`, {guilabel}`Yearly + Cost (Real)`, {guilabel}`Extra Time Off`, {guilabel}`Hourly Wage`, {guilabel}`Part Time`, + {guilabel}`Wage`, {guilabel}`Wage with Holidays`, and {guilabel}`Work time rate`. Depending on the + localization settings, additional options are available. + +- {guilabel}`Related Type`: select from the drop-down menu what type of benefit it is. Select from + {guilabel}`Monthly Benefit in Kind`, {guilabel}`Monthly Benefit in Net`, {guilabel}`Monthly + Benefit in Cash`, {guilabel}`Yearly Benefits in Cash`, or {guilabel}`Non Financial Benefits`. This + field is required. + +- {guilabel}`Benefit Field`: select from the drop-down menu the specific field on the contract the + benefit appears. + +- {guilabel}`Cost Field`: select the specific field on the contract that the cost of the benefit is + linked to, using the drop-down menu. If this field is left blank, the cost of the benefit is not + computed in the employee budget. + +- {guilabel}`Impacts Net Salary`: tick the checkbox if the benefit should impact the employee's net + salary. + +- {guilabel}`Requested Documents`: select any document that is required to be submitted for this + benefit, from the drop-down menu. + +- {guilabel}`Mandatory Benefits`: using the drop-down menu, select the benefit that is required in + order for this specific benefit to be offered to the employee. + + For example, a benefit for car insurance would populate `Company Car` in this field. This would + allow the car insurance benefit to **only** be displayed if the employee has selected/enabled the + benefit of a company car. + +- {guilabel}`Salary Structure Type`: select from the drop-down menu which salary structure type this + benefit applies to. This field is required. + +- {guilabel}`Unit of Measure`: select the metric that the benefit is granted, using the drop-down + menu. The options are {guilabel}`Days`, {guilabel}`Percent`, or {guilabel}`Currency`. + +```{image} payroll/new-benefit.png +:align: center +:alt: A new benefit form filled out for an internet subscription. +``` + +#### Display section + +- {guilabel}`Show Name`: tick the checkbox to have the benefit name appear in the salary package + configurator. + +- {guilabel}`Display Type`: select from the drop-down menu how this benefit is displayed. The + options are {guilabel}`Always Selected`, {guilabel}`Dropdown`, {guilabel}`Dropdown Group`, + {guilabel}`Slider`, {guilabel}`Radio Buttons`, {guilabel}`Manual Input`, or {guilabel}`Text`. This + field is required. + + Depending on the selection made, additional configurations need to be made. For example, if + {guilabel}`Radio Buttons` is selected, the individual radio buttons must be entered. + +- {guilabel}`Icon`: an icon from the [Font Awesome 4 library](https://fontawesome.com/v4/icons/) + can be visible for this benefit. Enter the text code for the icon in this field. For example, to + display a suitcase icon, the code `fa fa-suitcase` is entered on this line. + +- {guilabel}`Hide Description`: tick the checkbox to hide the benefit description if the benefit is + not selected by the employee. + +- {guilabel}`Folded`: if the benefit should be folded, or hidden, because it is dependant on another + benefit selection, tick the checkbox. The following fields appear when this is active: + + - {guilabel}`Fold Label`: enter a name for the folded section of the benefit. + - {guilabel}`Fold Res Field`: select the contract field this benefit is tied to using the + drop-down menu. If this field is selected on the contract, then this benefit becomes visible. + +#### Activity section + +- {guilabel}`Activity Type`: from the drop-down menu, select the activity type that is automatically + created when this benefit is selected by the employee. +- {guilabel}`Activity Creation`: select when the activity is created, either when the + {guilabel}`Employee signs his contract`, or when the {guilabel}`Contract is countersigned`. Click + the radio button next to the desired selection. +- {guilabel}`Activity Creation Type`: select the parameters for when the activity is created, either + {guilabel}`When the benefit is set` or {guilabel}`When the benefit is modified`. Click the radio + button next to the desired selection. +- {guilabel}`Assigned to`: select the user the activity is automatically assigned to, using the + drop-down menu. + +#### Sign section + +- {guilabel}`Template to Sign`: if the employee is required to sign a document when selecting this + benefit, select the document template from the drop-down menu. + + For example, a benefit regarding the use of a company car may require the employee to sign a + document acknowledging the company's car policies. + +#### Description tab + +Provide any additional information in this tab to help clarify the benefit. + +### Personal info + +Every employee in Odoo has an *employee card* which is created when a candidate becomes an +employee. This card includes all of their personal information, resume, work information, and +documents. + +The personal information is gathered from the salary package configurator section that a +candidate fills out after being offered a position. This personal information is then transferred to +the employee card when they are hired. + +To view an employee's card, go to the main {menuselection}`Employees` app dashboard, and click on +the employee's card. + +:::{note} +An employee card can be thought of as an employee personnel file. +::: + +The {guilabel}`Personal Info` section lists all of the fields that are available to enter on the +employee's card. To access this section, go to {menuselection}`Payroll app --> Configuration --> +Salary Package Configurator: Personal Info`. + +```{image} payroll/personal-info.png +:align: center +:alt: A list of all the personal information that appears on the employee card to enter. +``` + +To edit a personal info entry, select an entry from the list on the {guilabel}`Personal Info` page, +and modify the personal info on the form that appears. + +To create a new personal info entry, click the {guilabel}`New` button. + +The required fields, aside from entering the {guilabel}`Information` name, are {guilabel}`Related +Model`, {guilabel}`Related Field`, and {guilabel}`Category`. + +Select a {guilabel}`Related Model` from the drop-down menu. {guilabel}`Employee` populates the field +by default, but the {guilabel}`Bank Account` option is also available if the information is related +to a bank account, instead. + +Select a {guilabel}`Related Field` from the drop-down menu that best describes what kind of personal +information this entry is, and where it is stored in the backend. Then, select a +{guilabel}`Category` from the drop-down menu that the personal information should be under, such as +{guilabel}`Address` or {guilabel}`Personal Documents`. + +The two most important fields on the personal info form are {guilabel}`Is Required` and +{guilabel}`Display Type`. + +Checking the {guilabel}`Is Required` box makes the field mandatory on the employee's card. The +{guilabel}`Display Type` drop-down menu allows for the information to be entered in a variety of +ways, like a {guilabel}`Text` box, to a customizable {guilabel}`Radio` button, a +{guilabel}`Checkbox`, a {guilabel}`Document`, and more. + +```{image} payroll/personal-new.png +:align: center +:alt: New personal information entry. +``` + +### Resumé + +The resumé section, housed within the salary package configurator section of the settings menu, is +how salary information rules are configured when offering a position to potential employees. + +When an offer is sent to a prospective employee, the values for the offer are computed from these +settings, and appear on the offer page. + +To configure this section, navigate to {menuselection}`Payroll app --> Configuration --> Salary +Package Configurator: Resumé`. + +By default, there are three {guilabel}`Salary Structure Types` pre-configured in Odoo: +{guilabel}`Worker`, {guilabel}`Employee`, and {guilabel}`None`. + +Each {guilabel}`Salary Structure Type` has several rules configured. These affect how an offer is +calculated using that particular {guilabel}`Salary Structure Type`. + +To create a new rule, click the {guilabel}`New` button, and a blank {guilabel}`Contract Salary +Resumé` form loads. + +Enter the following information on the form: + +- {guilabel}`Information`: type in a name for this field. + +- {guilabel}`Category`: select the category this value is housed under, using the drop-down menu. + The default options are {guilabel}`Monthly Salary`, {guilabel}`Monthly Benefits`, + {guilabel}`Yearly Benefits`, and {guilabel}`Total`. + + New categories can be made if needed. + + Click the {guilabel}`New` button, then enter the name for the new category in the {guilabel}`Name` + field. Next, select the {guilabel}`Periodicity` from the drop-down menu, either + {guilabel}`Monthly` or {guilabel}`Yearly`. Last, enter a number for the sequence. This corresponds + to where this rule appears in the {guilabel}`Salary Structure Type` rule list. + + Finally, click {guilabel}`Save & Close`. + +- {guilabel}`Impacts Monthly Total`: tick the checkbox if this value is added in the monthly total + calculation. + +- {guilabel}`Unit of Measure`: select what kind of value this rule is, either {guilabel}`Currency`, + {guilabel}`Days`, or {guilabel}`Percent`. + + {guilabel}`Currency` is for a set monetary value, {guilabel}`Days` is for compensation in the form + of time off, and {guilabel}`Percent` is for a monetary value awarded that is based upon another + metric, such as commissions. + +- {guilabel}`Salary Structure Type`: select which {guilabel}`Salary Structure Type` this rule is + nested under, from the drop-down menu. + +- {guilabel}`Value Type`: select how the value is computed, using the drop-down menu. The default + options are {guilabel}`Fixed Value`, {guilabel}`Contract Value`, {guilabel}`Payslip Value`, + {guilabel}`Sum of Benefits Values`, and {guilabel}`Monthly Total`. + +- {guilabel}`Code`: select the code this rule applies to from the drop-down menu. + +```{image} payroll/resume-net.png +:align: center +:alt: The net wage rule form filled out, with all the information for net pay. +``` + +## Jobs + +Since the *Payroll* application is responsible for paying employees for specific job positions, the +complete list of job positions can be found in both the *Payroll* and *Recruitment* applications. + +(payroll-job-positions)= + +### Job positions + +The job positions listed in the *Payroll* application are identical to the job positions listed in +the *Recruitment* application. If a new job position is added in the *Recruitment* application, it +is also visible in the *Payroll* application, and vice versa. + +To view the job positions, navigate to {menuselection}`Payroll app --> Configuration --> Jobs: Job +Positions`. + +A list of all the job positions appear, along with the corresponding department, on the +{guilabel}`Job Position` page. + +```{image} payroll/job-positions.png +:align: center +:alt: A list of all the job positions and corresponding departments. +``` + +To create a new job description, click the {guilabel}`New` button and a job form appears. + +Enter the information on the form for the new position. The information is identical as to the +information entered when creating a new job position in the *Recruitment* application. + +Refer to the {doc}`../hr/recruitment/new_job` documentation for more details on how to fill out this +form. + +:::{seealso} +- {doc}`payroll/contracts` +- {doc}`payroll/work_entries` +- {doc}`payroll/salary_attachments` +- {doc}`payroll/payslips` +- {doc}`payroll/reporting` +- {doc}`payroll/work_entry_analysis` +- {doc}`payroll/salary_attachment` +::: + +```{toctree} +:titlesonly: true + +payroll/contracts +payroll/work_entries +payroll/salary_attachments +payroll/payslips +payroll/reporting +payroll/work_entry_analysis +payroll/salary_attachment +``` + diff --git a/content/applications/hr/payroll/contracts.md b/content/applications/hr/payroll/contracts.md new file mode 100644 index 000000000..079aebffe --- /dev/null +++ b/content/applications/hr/payroll/contracts.md @@ -0,0 +1,409 @@ +# Contracts + +Every employee in Odoo is required to have a 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. + +:::{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 +contracts. Please refer to the {doc}`../../productivity/documents` and +{doc}`../../productivity/sign` documentation. +::: + +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 +Kanban view, by default. The Kanban view displays running contracts, contracts that require action, +expired contracts, and cancelled contracts. + +```{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. +::: + +(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. Required fields are underlined in bold. + +## New contract form + +(payroll-gen-info)= + +## General information section + +- {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**. + + :::{tip} + The {guilabel}`Working Schedule` drop-down menu displays all the working schedules for the + selected company. To modify or add to this list, go to {menuselection}`Payroll app --> + 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}`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}`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. + + :::{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. + +:::{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. +::: + +- {guilabel}`Contact Reference`: type in the name or title for the contract, such as `John Smith + Contract`. This field is **required**. + +- {guilabel}`Employee`: name of the employee the contract applies to. + +- {guilabel}`Contract Start Date`: the date the contract 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}`Contract End Date`: the date the contract ends. 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}`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 new + salary structure type can be created by typing the name in the field. This field is **required**. + +- {guilabel}`Working Schedule`: select one of the working schedules from the drop-down menu. This + field is **required**. + +- {guilabel}`Department`: the department the contract applies to. + +- {guilabel}`Job Position`: the specific job position the contract applies to. + +- {guilabel}`Wage on Payroll`: the amount to be paid to the employee each month. + +- {guilabel}`Contract Type`: choose from {guilabel}`CDI`, {guilabel}`CDD`, or {guilabel}`PFI` from + the drop-down menu. + + - {guilabel}`CDI` is an open-ended contract with only a start date, but no end date. + - {guilabel}`CDD` is a contract with both a start date and an end date. + - {guilabel}`PFI` is a Belgian-specific contract used when hiring employees that need training, + and covers the training period specifically. + +- {guilabel}`HR Responsible`: if there is a specific person in HR that is responsible for the + contract, select the person from the drop-down menu. This field is required. + +:::{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}`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 + 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. + ``` + +## Contract 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. + +:::{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 +`. + +When the *Salary Configurator* module is installed, the *Salary Configurator - Holidays* and +*Salary Configurator - Payroll* modules install, as well. + +Once the modules are installed, the database reverts to the main dashboard. +::: + +- {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}`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. + +:::{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. + + ```{eval-rst} + .. 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. +``` + +- {guilabel}`Analytic Account`: this field allows a link between the contract and a specific + analytic account for accounting purposes. +- {guilabel}`Contract Template`: select a pre-existing contract template from the drop-down menu. + Contract templates are typically created through the *Recruitment* application. +- {guilabel}`New Contract Document Template`: select a contract from the drop-down menu to be + modified for this new employee contract. +- {guilabel}`Contract Update Document Template`: select a contract from the drop-down menu, if the + employee has an existing contract that requires updating. +- {guilabel}`Notes`: the notes field is a text field where any notes for the employee contract can + be entered for future reference. + +### 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 contract 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. + +## Salary information + +```{image} contracts/salary-info.png +:align: center +:alt: Optional tabs for a new contract. +``` + +This section is where the specific salary details are defined. This section is country-specific, so +these fields vary, depending on where the company is located. + +Enter the amount in the various fields, or tick a checkbox to apply a benefit. Some options that can +be entered here include {guilabel}`Group Insurance Sacrifice Rate` and {guilabel}`Canteen Cost`, for +example. + +Some fields may be automatically filled in as other fields are entered. For example, the +{guilabel}`Yearly Cost (Real)` and {guilabel}`Monthly Cost (Real)` updates once the {guilabel}`Wage` +is populated. + +## Personal documents + +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. + +The available documents in this tab can be downloaded. Click the {icon}`fa-download` +{guilabel}`(download)` icon next to the document to download it. + +## Save and send the contract + +Once a contract has been created and/or modified, save the contract by clicking the {guilabel}`Save` +button. Next, the contract must be sent to the employee to be signed. + +Click on one of the following buttons to send the contract to the employee: + +```{image} contracts/send-contract.png +:align: center +:alt: Send the contract to the employee via one of the buttons. +``` + +- {guilabel}`Generate Simulation Link`: this option is **only** for Belgian companies. 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. + +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. + +> :::{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. +> ::: + +- {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. + +:::{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. +::: + +## 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. + Choose from: + + - {guilabel}`Attachment of Salary`: any payments taken out towards something that is *not* child + support. Typically any garnishments, such as lawsuit payments, payments toward taxes owed, etc. + - {guilabel}`Assignment of Salary`: any deduction that is not required, but voluntary, such as a + pre-tax allocation to a college savings account. + - {guilabel}`Child Support`: any payments taken out specifically for child support. + +- {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. + diff --git a/content/applications/hr/payroll/payslips.md b/content/applications/hr/payroll/payslips.md new file mode 100644 index 000000000..abb97cb71 --- /dev/null +++ b/content/applications/hr/payroll/payslips.md @@ -0,0 +1,494 @@ +# Payslips + +*Payslips* are created either by the employees themselves or their managers, and are approved by +authorized employees (typically managers). Then, once payslips are approved, employees are issued +payslips and are paid either by check or direct deposit, depending on how their employee profile is +configured. + +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. On this page, Odoo displays the payslips that have not been generated yet, and can be created +from this dashboard. + +```{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. + +(payroll-new-payslip)= + +### Create a new 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. + +#### 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**. + + :::{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 + 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}`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 + 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. +::: + +:::{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. +::: + +(payroll-worked-days-inputs)= + +##### Worked days & inputs tab + +- {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. + + Click {guilabel}`Add a line` to create an entry in the {guilabel}`Other Inputs` section. + + 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. + +```{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. +- {guilabel}`Has Negative Net To Report`: click the checkbox if the employee has a negative net + amount for this payslip. This **only** appears if the employee's payslip has a negative balance. + +```{image} payslips/salary-comp-tab.png +:align: center +:alt: The fields filled out in the salary computation tab. +``` + +##### 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. + +```{image} payslips/other-info-tab.png +:align: center +:alt: The fields filled out in the other info tab. +``` + +#### Process the new 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. + +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. + +Once everything on the payslip form is correct, click the {guilabel}`Create Draft Entry` button to +create the payslip. + +Then, a confirmation pop-up window appears, asking {guilabel}`Are you sure you want to proceed?`. +Click {guilabel}`OK` to confirm. + +The chatter is automatically updated to show the email sent to the employee, along with a PDF copy +of the payslip. + +:::{note} +The database may need to be refreshed for the payslip and email to appear. +::: + +To print the payslip, click the {guilabel}`Print` button. To cancel the payslip, click the +{guilabel}`Cancel` button. + +```{image} payslips/payslip-chatter.png +:align: center +:alt: The new payslip is emailed to the employee and the email appears in the chatter. +``` + +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. + +:::{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/banking.png +:align: center +:alt: Banking information can be entered in an employee's card. +``` +::: + +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 `. + +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. + +:::{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. +> +> 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. +> ``` +> +> 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. +> +> If the warnings are not resolved, at any point in the payslip processing process, an error may +> occur. Errors appear in a pop-up window, and provide details for the error, and how to resolve +> them. + +Payslips **cannot** be completed if there are any warnings or issues associated with the payslip. +::: + +(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. + +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. + +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: + +- {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. + +```{image} payslips/all-payslips.png +:align: center +:alt: View all payslips organized by batches. Click on the arrow to expand each batch. +``` + +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. + +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. + +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. + +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. + +```{image} payslips/export.png +:align: center +:alt: Click on the Export All smart button to export all payslips to an Excel payslip. +``` + +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`. + +```{image} payslips/export-select.png +:align: center +:alt: The individual list of employee ayslips with three selected to be exported. +``` + +:::{note} +Both *To Pay* and *All Payslips* display all the detailed information for each payslip. +::: + +## Batches + +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. + +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`. + +```{image} payslips/batches.png +:align: center +:alt: View displaying all batches created. +``` + +### 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. + +On the new payslip batch form, enter the {guilabel}`Batch Name`. + +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} payslips/new-batch-details.png +:align: center +:alt: Enter the details for the new batch. +``` + +(payroll-batch-process)= + +### Process a batch + +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: + +- {guilabel}`New` status: batches without any payslips added to them have a status of + {guilabel}`New`. The following button options appear for these batches: + + > ```{image} payslips/batch-new.png + > :align: center + > :alt: A batch with a status of new, with the available buttons highlighted. + > ``` + > + > - {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`. + > + > - {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. + > + > 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. + > + > 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`. + +- {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: + + ```{image} payslips/batch-confirmed.png + :align: center + :alt: A batch with a status of confirmed, with the available buttons highlighted. + ``` + + - {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. + +- {guilabel}`Done` status: batches with confirmed payslips in them have a status of + {guilabel}`Done`. The following button options appear for these batches: + + ```{image} payslips/batch-done.png + :align: center + :alt: A batch with a status of done, with the available buttons highlighted. + ``` + + - {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. + + 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. + + 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. + +- {guilabel}`Paid` status: batches that have been completed have a status of {guilabel}`Paid`. No + other button options appear for this status. + + ```{image} payslips/batch-paid-2.png + :align: center + :alt: A batch with a status of paid, with the available buttons highlighted. + ``` + +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. + +Use the breadcrumb menu to navigate back to the individual batch detail page, or back to the list of +all batches. + +### Generate warrant payslips + +Commissions are paid to employees in Odoo using *warrant payslips*. + +Warrant payslips can be generated directly from the {guilabel}`Payslips Batches` page +({menuselection}`Payroll app --> Payslips --> Batches`). + +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. + +Doing so reveals a {guilabel}`Generate Warrant Payslips` pop-up window, in which the necessary +information **must** be filled out. + +```{image} payslips/commission-details.png +:align: center +:alt: Enter the commission details. +``` + +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. + +In the {guilabel}`Department` field, select the desired department from the drop-down menu. + +When a department is selected, the employees listed for that department appear in the +{guilabel}`Employee` section. + +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. + +Add a new entry by clicking {guilabel}`Add a Line`, and entering the {guilabel}`Employee` and the +appropriate {guilabel}`Commission Amount`. + +Click the {guilabel}`Upload your file` button to add a file, if necessary. Any file type is +accepted. + +Once all the commissions are properly entered, click the {guilabel}`Generate Payslips` button to +create the warrant payslips in a batch. + +{ref}`Process the batch ` in the same way as a typical batch to complete the +payment process. + diff --git a/content/applications/hr/payroll/reporting.md b/content/applications/hr/payroll/reporting.md new file mode 100644 index 000000000..c823fdbd3 --- /dev/null +++ b/content/applications/hr/payroll/reporting.md @@ -0,0 +1,235 @@ +# Reporting + +The *Reporting* section of the *Payroll* app offers a variety of reports to choose from, organized +by location. + +The *Payroll* report, *Work Entry Analysis* report, and *Salary Attachment Report* are default +reports in the *Payroll* app, and are available for all companies, regardless of location. + +Beneath the three default reports are all localization-based reports, organized by country, in +alphabetical order. These reports contain all the various information for the offered benefits and +local tax laws. + +To view all the available reports for the database, including all the localization-specific ones, +navigate to {menuselection}`Payroll app --> Reporting` to view the available reports in a drop-down +menu. Click on a specific report to view it. + +```{image} reporting/reports.png +:align: center +:alt: Report dashboard view showing extra reports for Belgium databases. +``` + +If a report is unavailable to a user, an {guilabel}`Invalid Operation` pop-up window appears, +stating: {guilabel}`You must be logged in to a (country) company to use this feature`, where +"(country)" is the specific country the company is configured for. + +## Default reports + +### Payroll + +Click on {menuselection}`Payroll app --> Reporting --> Payroll` to display the {guilabel}`Payroll +Analysis` report. This report shows all the payslips generated in the last 365 days, due to the +default {ref}`filter `: `Last 365 Days Payslip`. + +```{image} reporting/payroll-report.png +:align: center +:alt: Payroll overview report showing payroll for the last 365 days. +``` + +The report can display metrics for a variety of parameters. Click the {guilabel}`Measures` box to +view a drop-down menu with the various metric options to display. The default options available +include: + +- {guilabel}`# Payslip` +- {guilabel}`Basic Wage` +- {guilabel}`Basic Wage for Time Off` +- {guilabel}`Days of Paid Time Off` +- {guilabel}`Days of Unforeseen Absence` +- {guilabel}`Days of Unpaid Time Off` +- {guilabel}`Gross Wage` +- {guilabel}`Net Wage` +- {guilabel}`Number of Days` +- {guilabel}`Number of Hours` +- {guilabel}`Work Days` +- {guilabel}`Work Hours` +- {guilabel}`Count` + +{guilabel}`Net Wage` is the default metric for the {guilabel}`Payroll` report. + +```{image} reporting/measures.png +:align: center +:alt: The various measures available to display for the Payroll Analysis report. +``` + +#### Line chart + +A line chart is the default view for the *Payroll* report. If a different view is selected, click +the {guilabel}`Line Chart` button (represented by a {guilabel}`📈 (chart increasing)` icon) in the +menu bar to change the view back to a line chart. + +Several options are available for the line chart. Click the corresponding button to activate the +selection, and change the way the data is presented. These icons appear at the end of the chart +options. The various options are: + +(payroll-stacked)= + +- {guilabel}`Stacked`: data is presented with each metric in its own line, "stacked" on top of each + other. This helps visualize the distribution and variances between different categories. + +(payroll-cumulative)= + +- {guilabel}`Cumulative`: data is presented with each metric on an individual line, with the total + amount calculated by combining all the lines. This provides a comprehensive view of the cumulative + data. + +(payroll-descending)= + +- {guilabel}`Descending`: data is shown with the largest values on the left side of the chart, + gradually decreasing towards the smallest values on the right side, along the x-axis. This + arrangement helps emphasize trends or outliers at the extremes. + +(payroll-ascending)= + +- {guilabel}`Ascending`: data is presented with the smallest values on the left side of the chart, + increasing towards the largest values on the right side, along the x-axis. This arrangement can be + useful for highlighting progressive growth or trends. + +:::{note} +These options can be combined to create a variety of views. +::: + +```{image} reporting/line-chart.png +:align: center +:alt: Menu buttons with the line chart called out, along with the other option buttons. +``` + +#### Bar chart + +To display the data in a bar chart, click on the {guilabel}`Bar Chart` button (represented by a +{guilabel}`📊 (bar chart)` icon) in the menu bar. + +Click the {ref}`Stacked ` icon to view the bar chart in a stacked format (where +multiple values appear in each column). {ref}`Cumulative ` bar charts are useful +for visualizing the progression over time or other categories. + +An option to display the columns in {ref}`Descending ` or {ref}`Ascending +` order appears at the end of the options. + +```{image} reporting/bar-chart.png +:align: center +:alt: Menu buttons with the bar chart called out, along with the other option buttons. +``` + +:::{tip} +Clicking an option enables it. To turn off the option, click it again. When the option is enabled +the icon appears lighter, with a turquoise outline. When it is inactive, it appears gray, with no +outline. +::: + +#### Pie chart + +To display the data in a pie chart, click on the {guilabel}`Pie Chart` button (represented by a +{guilabel}`(pie chart)` icon) in the menu bar. There are no additional options available in this +view. + +```{image} reporting/pie-chart.png +:align: center +:alt: Menu buttons with the pie chart called out. +``` + +#### Pivot table + +To display the data in a pivot table, click on the {guilabel}`Pivot` button (represented by a +{guilabel}`(pivot)` icon) located in the far-right side of the top menu bar. + +The default information displayed includes the number of payslips ({guilabel}`# Payslip`), the +{guilabel}`Net Wage`, the {guilabel}`Gross Wage`, the number of {guilabel}`Days of Paid Time Off`, +and the number of {guilabel}`Days of Unpaid Time Off`. The information is organized by department. + +To display more information on the report, click the {guilabel}`Measures` button to reveal a +drop-down menu. Then, click on any other metric to display it on the pivot table. + +```{image} reporting/pivot.png +:align: center +:alt: Pivot table view with the various metrics called out. +``` + +To sort the entries by a specific column, such as {guilabel}`Net Wage`, click on the column name +twice. The first click selects the column, and the second click sorts the information in descending +order. + +To export the data in an XLSX format, click the {guilabel}`Download xlsx` button, represented by a +{guilabel}`⬇️ (down arrow above a horizontal bar)` icon, located at the far-right of the available +icons. The information is then downloaded into a spreadsheet. + +```{image} reporting/xlsx.png +:align: center +:alt: The menu options with the download button highlighted. +``` + +Any report can be inserted into a spreadsheet by clicking the {guilabel}`Insert in Spreadsheet` +button. A {guilabel}`Select a spreadsheet to insert your (type of report)` pop-up window appears, +asking which spreadsheet to place the information in. Select an existing spreadsheet or dashboard, +or select a new {guilabel}`Blank spreadsheet`. Click the {guilabel}`Confirm` button to move to a +spreadsheet view with the report added to it. + +```{image} reporting/spreadsheet.png +:align: center +:alt: The view of data sent to a spreadsheet. +``` + +(payroll-doc-storage)= + +:::{note} +If the **Documents** app is **not** installed, the {guilabel}`Insert in Spreadsheet` option +places the newly-created spreadsheet in the **Dashboards** app. + +If the **Documents** application *is* installed, the spreadsheet has the option to be stored in +either the **Dashboards** app or **Documents** app. +::: + +(payroll-filters)= + +## Filters + +At the top of each report, the default filters are shown inside the {guilabel}`Search...` box. + +Click the {guilabel}`⬇️ (down arrow)` icon in the search bar to display the available +{guilabel}`Filters`. Filters show information that match the specific filter parameters. + +```{eval-rst} +.. example:: + The :guilabel:`Work Entries Analysis` report has two default filters, the `Current month:(Month) + (Year)` filter, and the `Validated` filter. + + .. image:: reporting/custom-filter.png + :align: center + :alt: Filters enabled for the Work Entries Analysis report. + + The :guilabel:`Payroll` report has only one default filter, the `Last 365 Days Payslip` filter. + + The :guilabel:`Salary Attachment Report` has only one default filter, the `Payslip End Date: + (Year)` filter. +``` + +All reports can include custom filters, or group information, by different metrics (employee, +department, company, etc.). + +Some reports have the option to compare the current report to the previous time period or year (a +{guilabel}`Comparison` option). + +Click on a parameter to select it and activate it. The report is immediately updated with the new +parameters. + +The updated report can be set as a *favorite* report, meaning the parameters are stored for quick +access in the future. To do that, click {guilabel}`Save the current search`, under the +{guilabel}`Favorites` section, located in the search bar drop-down mega menu of filter options. +Doing so reveals two options and a {guilabel}`Save` button. + +To set the current report as the default configuration when the report is accessed, check the box +next to {guilabel}`Default filter`. If the current report should be accessible to everyone in the +database, check the box next to {guilabel}`Share`. + +Finally, click {guilabel}`Save`, which saves the currently configured report. Then, it appears +beneath the {guilabel}`Favorites` in the search bar drop-down mega menu of filter options. + diff --git a/content/applications/hr/payroll/salary_attachment.md b/content/applications/hr/payroll/salary_attachment.md new file mode 100644 index 000000000..8b83a89c1 --- /dev/null +++ b/content/applications/hr/payroll/salary_attachment.md @@ -0,0 +1,64 @@ +# 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_attachments.md b/content/applications/hr/payroll/salary_attachments.md new file mode 100644 index 000000000..fa152d01e --- /dev/null +++ b/content/applications/hr/payroll/salary_attachments.md @@ -0,0 +1,153 @@ +# Salary attachments + +Salary attachments are portions of earnings taken directly out of a payslip for a specific purpose, +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*. + +(payroll-salary-attachment-types)= + +## 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`. + +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). + +```{image} salary_attachments/attachment-types.png +:alt: The default salary attachment types. +``` + +### Create new salary attachment types + +:::{danger} +Upon installation of the **Payroll** application, the pre-configured 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 `. + +It is **not** recommended to alter or modify **any** of the preconfigured salary attachment +types, especially if they have been previously used on payslips in the database. Doing so may +affect various salary rules, and can prevent the creation of payslips. + +A new salary attachment type *can* be created, but this should only be done when absolutely +necessary. All salary attachments can be associated with one of the three default salary +attachment types. +::: + +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. + +(payroll-salary-attachment-create)= + +## Create a salary attachment + +All salary attachments must be configured separately for each employee, for each type of salary +attachment. To view the currently configured salary attachments, navigate to {menuselection}`Payroll +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`. + +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: + +- {guilabel}`Employees`: Using the drop-down menu, select the desired employees. Multiple employees + can be listed in this field. +- {guilabel}`Description`: Enter a short description of the salary attachment. +- {guilabel}`Type`: Using the drop-down menu, select the specific {ref}`salary attachment type + `. +- {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}`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.) + +```{image} salary_attachments/salary-attachment-form.png +:alt: The salary attachment form with all fields filled out. +``` + +Since the salary attachment form auto saves as the fields are populated, after making a salary +attachment for an individual employee, there is no further action required. + +If creating salary attachments for multiple employees on a single salary attachment form, after the +form is filled out, click the {guilabel}`Create Individual Attachments` button. This creates +separate salary attachments for each of the employees listed in the {guilabel}`Employees` field. + +After the separate salary attachments have been created, the screen returns to the {guilabel}`Salary +Attachment` dashboard, but with a {guilabel}`Description` filter, populated with the description +filled in on the salary attachment form. All the salary attachments have a status of +{guilabel}`Running`, since they are currently active. Clear the filter in the search box to view the +default {guilabel}`Salary Attachment` dashboard in its entirety. + +## Manage salary attachments + +Salary attachments can have one of three statuses: *Running*, *Completed*, or *Canceled*. To view +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. + +### Completed salary attachments + +When a salary attachment is created, it has a status of {guilabel}`Running`. Once the salary +attachment is finished (the *Total Amount* entered on the {ref}`salary attachment form +` has been paid in full), the status automatically changes to +*Completed*, and the employee no longer has the money taken out of future paychecks. + +If a salary attachment has been fulfilled, but has not automatically changed to *Completed*, the +record can be manually updated. To change the status, open the *Salary Attachment* dashboard by +navigating to {menuselection}`Payroll app --> Contracts --> Salary Attachments`. + +Click on the record to update, and the detailed {guilabel}`Salary Attachment` form loads. On the +individual {guilabel}`Salary Attachment` record, click the {guilabel}`Mark as Completed` button in +the upper-left corner, and the status changes to {guilabel}`Completed`. + +```{eval-rst} +.. example:: + The following is an example of when a payroll manager may need to manually change a salary + attachment from :guilabel:`Active` to :guilabel:`Cancelled`. + + Rose Smith has a salary attachment for a lawsuit settlement, where she is required to pay + $3,000.00. A salary attachment is created that takes $250.00 a month out of Rose's paycheck, to + go towards this settlement payment. + + After six months, Rose has paid $1,500.00 from her salary. She received a tax refund, and uses + the money to pay off the remainder of the lawsuit settlement. After sending the relevant + documentation to the payroll manager, showing the settlement has been paid in full, the payroll + manager manually changes the status of her salary attachment to :guilabel:`Completed`. +``` + +### Cancel salary attachments + +Any salary attachment can be cancelled at any time. To cancel a salary attachment, click on the +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/work_entries.md b/content/applications/hr/payroll/work_entries.md new file mode 100644 index 000000000..0c050a782 --- /dev/null +++ b/content/applications/hr/payroll/work_entries.md @@ -0,0 +1,348 @@ +# 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 *Work Entries* dashboard of the *Payroll* application 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`. + +On the {guilabel}`Work Entry` dashboard, work entries appear in alphabetical order, based on the +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. + +```{image} work_entries/work-entries-overview.png +:align: center +:alt: Conflicts dashboard view showing all employee's conflicts in 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. + +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. + +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. + +(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. + +A {guilabel}`Create` work entry pop-up form appears. + +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 + drop-down menu. + +- {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. + + 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. + + 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). + +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)= + +## 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. + +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 --> +Work Entries`. Only conflicts needing resolution are shown by default. + +Conflicts are indicated with an orange triangle in the top-left corner of each individual work +entry. Click on an individual work entry to see the date and time for the specific work entry, then +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. +``` + +### 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 +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. + +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. + +#### 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. + +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. + +#### Resolve on time off 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. + +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. +``` + +Now, the {guilabel}`Approve Time Off` button is hidden, only the {guilabel}`Refuse Time Off` button +is visible. + +If the approval was a mistake, the request can be refused here, by clicking the {guilabel}`Refuse +Time Off` button. + +Since the time off was approved in the time off window, click the {guilabel}`X` in the top-right +corner to close the window. The conflict disappears from the {guilabel}`Work Entry` dashboard, since +it has been resolved. + +(payroll-regenerate-work-entries)= + +## 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. + +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. + +First, ensure the issues are resolved in the specific applications that caused the work entry +conflicts. + +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. + +Select the {guilabel}`Employees` to regenerate work entries for from the drop-down menu, and 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. +``` + +```{eval-rst} +.. 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. + +Click the {guilabel}`Create Draft Entry` button to create the payslips for the batch. + +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. +``` + +:::{seealso} +{ref}`Configure work entries ` +::: + diff --git a/content/applications/hr/payroll/work_entry_analysis.md b/content/applications/hr/payroll/work_entry_analysis.md new file mode 100644 index 000000000..7283f0343 --- /dev/null +++ b/content/applications/hr/payroll/work_entry_analysis.md @@ -0,0 +1,81 @@ +# Work entry analysis + +The default *Work Entries Analysis* report provides an overview of the validated work entries for +the current month. To view this report, navigate to {menuselection}`Payroll app --> Reporting --> +Work Entry Analysis`. + +The work entries appear in a pivot table, with the default filters of {guilabel}`Current month: +(Month)(Year)` and {guilabel}`Validated`. The various types of {doc}`work_entries` populate the +rows, while the {guilabel}`Total` values populate the only visible column. + +To change the displayed information, click {icon}`fa-plus-square` {guilabel}`Total` above the main +column, revealing a drop-down menu of available metrics. Click on one of the available groupings, +and the data is further organized by that selected metric. The default options are {guilabel}`Work +Entry Type`, {guilabel}`Employee`, and {guilabel}`Department`. If in a multi-company database, a +{guilabel}`Company` option also appears. + +## Work entry analysis comparison + +It is possible to compare the work entries from one time period to a previous time period. To view +this comparison, first navigate to {menuselection}`Payroll app --> Reporting --> Work Entry +Analysis`. + +Next, click the {icon}`fa-caret-down` {guilabel}`(down arrow)` icon in the search bar, revealing a +drop-down menu. Under the {icon}`fa-adjust` {guilabel}`Comparison` section, click on either +{guilabel}`Current Month: Previous Period` or {guilabel}`Current Month: Previous Year`. + +The report updates and displays the data for the current time period, data for the selected previous +time period, as well as the {guilabel}`Variation` between the two, in a percentage. + +```{image} work_entry_analysis/work-entry-comparison.png +:alt: A pivot table comparing the work entries of the current month and the previous +: month. +``` + +:::{note} +If no work entries for a specific {ref}`work entry type ` are logged for +the time period, it does **not** appear on the report. That does **not** mean the work entry type +does not exist, or is not configured. + +Additionally, if the default {guilabel}`Current month: (Month)(Year)` filter is removed from the +search bar, the {guilabel}`Comparison` column does **not** appear; there must be a time-frame +selected to view the {guilabel}`Comparison` column. +::: + +## Use case: overtime report comparison + +It is possible to alter the *Work Entries Analysis* report to show a comparison of only overtime +work entries, grouped by employee, for a specific time period. To view this data, first navigate to +the default *Work entry analysis* report by going to {menuselection}`Payroll app --> Reporting --> +Work Entry Analysis`. + +Next, click the {icon}`fa-caret-down` {guilabel}`(down arrow)` icon in the search bar, revealing a +drop-down menu. Under the {icon}`fa-filter` {guilabel}`Filters` column, click {guilabel}`Add Custom +Filter`, and a {guilabel}`Add Custom Filter` pop-up window appears. + +Using the drop-down menu, select {guilabel}`Work Entry Type` for the first field, leave the middle +field as-is (with {guilabel}`is in` populating the field), and select {guilabel}`Overtime Hours` for +the last field. Click {guilabel}`Add`, and all other work entry types disappear, and +{guilabel}`Overtime Hours` appear in the sole row. + +To compare overtime from the current month to the previous month, to see which month had more +overtime logged, click the {icon}`fa-caret-down` {guilabel}`(down arrow)` icon again in the search +bar. Under the {icon}`fa-adjust` {guilabel}`Comparison` section, click {guilabel}`Current Month: +Previous Period`. Click away from the drop-down menu to close it. + +Now, the report displays the {guilabel}`Overtime Hours` for the current month and the previous +month, along with the {guilabel}`Variation`, in a percentage. + +To view which employees received the most overtime, click {icon}`fa-plus-square` {guilabel}`Overtime +Hours`, revealing a drop-down menu of options. Click {guilabel}`Employee`, and all employees with +overtime work entries for either the current or previous month appears. + +In this example, it can be determined that {guilabel}`Marc Demo` worked the most overtime in +{guilabel}`August 2024`, whereas {guilabel}`Beth Evans` worked the most overtime hours in +{guilabel}`September 2024`. Additionally, {guilabel}`Mitchell Admin` had the largest variation +change, with a {guilabel}`-100%` change from {guilabel}`August 2024` to {guilabel}`September 2024`. + +```{image} work_entry_analysis/variation.png +:alt: A pivot table comparing the overtime from September 2024 with August 2024. +``` + diff --git a/content/applications/hr/recruitment.md b/content/applications/hr/recruitment.md new file mode 100644 index 000000000..6a7b0f166 --- /dev/null +++ b/content/applications/hr/recruitment.md @@ -0,0 +1,408 @@ +--- +show-content: true +--- + +# Recruitment + +Odoo keeps all job applicants organized with a pre-configured series of steps and stages that each +applicant goes through. Each stage has a specific step(s) that should be performed. These range from +scheduling a phone call, conducting an interview, or sending a job offer, for example. This process +is referred to as the 'applicant flow.' + +When an applicant applies for a job position, an *applicant card* is automatically created in Odoo's +*Recruitment* app for that specific job position. As the applicant progresses through the +recruitment pipeline, the recruitment team moves their card from one stage to the next. + +{ref}`Stages can be configured ` so that an email is automatically sent +out using a set, pre-configured template as soon as an applicant's card enters a stage. These +automated emails are defined on each stage in the applicant flow. + +The applicant flow explained in this document is the default flow in Odoo, and goes through the +applicant flow when using the *Recruitment* application's default configuration. The applicant flow +is able to be modified to suit the specific recruitment flow for any business. + +:::{note} +The applicant flow with all its stages are universal and applies to all job positions, unless +specified. {ref}`A specific stage can be configured ` to be +job-specific, meaning that specific stage is only visible for that specific job position. +Otherwise, if a new stage is created, or an existing stage is modified, those changes are +visible on all job positions. +::: + +(recruitment-settings)= + +## Settings + +Before creating a job position in Odoo, configure the necessary settings for the *Recruitment* app. +To view and edit the settings, navigate to {menuselection}`Recruitment app --> Configuration --> +Settings`. After any changes are made, click the {guilabel}`Save` button in the top-left corner to +save all the changes. + +### Job posting + +The {guilabel}`Job Posting` section of the *Recruitment* app settings has only one selection to +make. If job positions are to be posted to the company's website, enable the {guilabel}`Online +Posting` option. + +:::{note} +The {guilabel}`Online Posting` is only available if the *Website* application is also installed. +::: + +### Recruitment process + +The {guilabel}`Recruitment process` section of the settings page specifies what the database can and +cannot do during the recruitment process. + +#### Send interview survey + +Odoo is capable of having a survey sent to an applicant to gather more information about them. +Surveys can be thought of as exams, or questionnaires, and can be customized in various ways to +provide the recruitment team with valuable insights into the applicant + +Enable the {guilabel}`Send Interview Survey` option to send surveys to applicants. Once enabled, an +{icon}`fa-arrow-right` {guilabel}`Interview Survey` internal link appears. Click the +{icon}`fa-arrow-right` {guilabel}`Interview Survey` link to navigate to a list of all created +surveys. + +This list includes all surveys that were created in the database, not just surveys used in the +*Recruitment* app. If no surveys have been created, the surveys list displays a {guilabel}`No Survey +Found` message, and presents options to create a survey from several pre-configured survey +templates. + +:::{seealso} +For more detailed information about surveys, refer to the {doc}`survey essentials +<../marketing/surveys/create>` documentation. +::: + +:::{note} +Enabling the {guilabel}`Send Interview Survey` option will install the *Surveys* application once +the settings are saved, if it is not installed already. +::: + +#### Send SMS + +It is possible to send text messages to applicants directly through the *Recruitment* app. To do so, +enable the {guilabel}`Send SMS` option. This option requires credits to use, which can be obtained +by clicking the {icon}`fa-arrow-right` {guilabel}`Buy credits` internal link that emerges when the +feature is enabled. + +:::{seealso} +For more information, refer to the {doc}`SMS pricing and FAQs +<../marketing/sms_marketing/pricing_and_faq>` documentation. +::: + +(recruitment-cv-display)= + +#### CV display + +When applicants submit an application, one of the default required fields is a resumé, or {abbr}`CV +(curriculum vitae)`. All resumés are stored in the *Documents* application, and are accessible on +the applicant's card. + +A resumé has the option to appear on the applicant's form, which can be viewed by clicking on the +applicant's card. The resumé appears on the right-side of the screen. If this is not enabled, the +resumé is accessed via a link in the chatter, where it needs to be clicked to expand and view it, or +downloaded. + +Enable the {guilabel}`CV Display` option to show the resumé on the applicant's card by default, and +in addition to the document link. When enabled, the resumé appears on the right side of the +applicant's card. + +:::{note} +For the resumé to appear on the right-side, the browser window must be in full-screen mode (where +the browser spans the entire screen). + +If the browser window is set to a size smaller than the entire width of the screen (not +full-screen), then the resumé does not appear on the right-side. Instead, the resumé appears in +the {guilabel}`Files` section of the chatter, below the applicant's card. +::: + +```{image} recruitment/cv-display.png +:align: center +:alt: "The resum\xE9 on an applicant's card, appearing on the right side." +``` + +(recruitment-cv-ocr)= + +#### CV digitization (OCR) + +When an application is submitted using any of the available methods, such as an online application +submission, emailing a resume to the job position alias, or creating an applicant record directly +from the database, it is possible to have Odoo extract the applicant's name, phone number, and email +address from the resumé and populate the applicant's form. To do so, enable the {guilabel}`CV +Digitization (OCR)` option. + +When enabled, additional options appear. Click on the corresponding radio button to select one of +the following options: + +- {guilabel}`Do not digitize`: this option turns off resumé digitization. +- {guilabel}`Digitize on demand only`: this option only digitizes resumes when requested. A + {guilabel}`Digitize document` buttons appears on applicant cards. When clicked, the resumé is + scanned and the applicant's card is updated. +- {guilabel}`Digitize automatically`: this option automatically digitizes all resumés when they are + submitted. + +Beneath these options are two additional links. Click the {icon}`fa-arrow-right` {guilabel}`Buy +credits` button to purchase credits for CV digitization. Click the {icon}`fa-arrow-right` +{guilabel}`View My Services` to view a list of all current services, and their remaining credit +balances. + +For more information on document digitization and {abbr}`IAP's (in-app purchases)`, refer to the +{doc}`In-app purchase (IAP) <../essentials/in_app_purchase>` documentation. + +:::{note} +The {guilabel}`Do not digitize` option for {guilabel}`CV digitization (OCR)` at first may seem +like a redundancy. It seems to be the same as disabling the {guilabel}`CV digitization (OCR)` +option. + +When the {guilabel}`CV digitization (OCR)` option is enabled, a module is installed so that +resumés can be scanned. Disabling this option would uninstall the module. + +If at some point, there is a desire to temporarily stop digitizing resumés, the {guilabel}`Do not +digitize` option is selected. The reason this option is available is so that the module is not +uninstalled, allowing for digitization to be enabled in the future by selecting one of the other +two options. +::: + +#### Salary package configurator + +When sending an offer to an applicant, an expiration date can be set on the offer. Enter the number +of days an offer is valid for in the {guilabel}`days` field. After the set amount of days has +passed, if the applicant has not accepted the offer, the offer is no longer available. + +## Kanban view + +To access the Kanban view for a job position, navigate to the main {menuselection}`Recruitment app` +dashboard, which is the default view when opening the application. All job positions appear on the +main dashboard. Click the {guilabel}`(#) New Applications` smart button on a job position card to +navigate to the Kanban view for all the applicants for that particular job position. + +```{image} recruitment/new-applicants-button.png +:align: center +:alt: Main dashboard view of job position card, showing new applications button. +``` + +Inside the job application, the Kanban stages appear, with all the applicants populated in their +respective columns, indicating what stage they are currently in. There are six default stages in +Odoo: + +- {ref}`New ` +- {ref}`Initial Qualification ` +- {ref}`First Interview ` +- {ref}`Second Interview ` +- {doc}`Contract Proposal ` +- {ref}`Contract Signed ` + +The last column, {guilabel}`Contract Signed`, is folded by default. Folded columns appear gray, and +the applicants in it are hidden from view. To expand the folded stage and view the applicant cards +for that column, click anywhere on the thin gray column that says the stage name and the column +expands, revealing the applicants. + +```{image} recruitment/stages.png +:align: center +:alt: Expand a folded column by clicking on it in the Kanban view. +``` + +Each stage has a color-coded bar beneath the stage name, providing status information for the +applicant's in that specific stage. The status colors are: + +- {guilabel}`Green`: the applicant is ready to move to the next stage. +- {guilabel}`Red`: the applicant is blocked from moving to the next stage. +- {guilabel}`Gray`: the applicant is still in progress in the current stage and is neither ready nor + blocked from the next stage. + +The status for each card is set manually. To set the status, click on the small circle in the +lower-left of the applicant card. A status pop-up window appears. Click on the desired status for +the applicant. The status dot on the applicant card as well as the status bar updates. + +```{image} recruitment/status-dots.png +:align: center +:alt: The applicant card statuses, and status bar. +``` + +:::{tip} +The names for the three status colors (`In Progress`, `Blocked`, and `Ready for Next Stage`) +{ref}`can be modified `, if desired. +::: + +(recruitment-customize-stages)= + +## Customize stages + +Stages can be modified, added, or deleted to best meet the needs of the particular hiring steps of +a business. + +### New stage + +To create a new stage, click on {icon}`fa-plus` {guilabel}`Stage` and a new column appears. Enter +the title for the new stage in the {guilabel}`Stage title` field, then click {guilabel}`Add`. The +new column appears, and another new stage is available to create. If no new stages are needed, click +anywhere on the screen to exit the new stage creation. + +```{image} recruitment/add-column.png +:align: center +:alt: The plus sign to click to add a new column to the Kanban stages. +``` + +(recruitment-modify-stages)= + +### Modify stage + +To modify the settings of a stage, hover over the name of the stage, and a {icon}`fa-cog` +{guilabel}`(gear)` icon appears in the upper right hand side of the stage. Click on the +{icon}`fa-cog` {guilabel}`(gear)` icon and a menu appears. Then click on the {guilabel}`Edit` +option. An {guilabel}`Edit: (Stage)` form appears. Make any desired modifications to the form, then +click {guilabel}`Save & Close` when done. + +```{image} recruitment/gear.png +:align: center +:alt: |- +: The gear icon that appears when a column name is moused over, and the drop-down menu it +: displays when clicked. +``` + +(recruitment-edit-stage)= + +#### Edit stage form + +The {guilabel}`Edit: (Stage)` form is where the stage's settings are configured. The only required +field is the {guilabel}`Stage Name`. + +The fields to be populated or modified are: + +- {guilabel}`Stage Name`: type in a name for the stage. +- {guilabel}`Email Template`: select an email template to be used from the drop-down menu. If a + template is selected, when the applicant card enters the stage, an email is automatically sent to + the applicant using the selected template. +- {guilabel}`Folded in Kanban`: check the box to have the stage appear folded (hidden) at all times + in the default view. +- {guilabel}`Hired Stage`: check the box if this stage indicates that the applicant is hired. When + an applicant's card enters this stage, the card displays a {guilabel}`Hired` banner in the upper + right corner. If this box is checked, this stage is used to determine the hire date of an + applicant. +- {guilabel}`Job Specific`: if the stage only applies to specific job positions, select the job + positions from the drop-down menu. Multiple job positions can be selected. +- {guilabel}`Show in Referrals`: check the box if this stage should be seen in the *Referrals* + application, and allow the referrer to accrue points when a referral of theirs reaches this stage. + If this is active, a {guilabel}`Points` field appears. Enter the amount of referral points the + employee receives when an applicant enters this stage. The *Referrals* app must be installed in + order to use this option. +- {guilabel}`Tooltips` section: there are three pre-configured status labels (colored circles) for + each applicant's card, indicating its status. These colors are displayed at the top of each stage + to reflect the statuses of the applicants in the stage. The *names* for the label can be modified, + but the label itself (the color) cannot. The default names and labels are: {guilabel}`In Progress` + (gray), {guilabel}`Blocked` (red), and {guilabel}`Ready for Next Stage` (green). +- {guilabel}`Requirements`: enter any internal notes for this stage explaining any requirements of + the stage. + +### Delete stage + +If a stage is no longer needed, the stage can be deleted. To delete a stage, hover over the name of +the stage, and a {icon}`fa-cog` {guilabel}`(gear)` icon appears. First, click on the {icon}`fa-cog` +{guilabel}`(gear)` icon to reveal a drop-down menu, then click {guilabel}`Delete`. A +{guilabel}`Confirmation` pop-up warning appears, asking {guilabel}`Are you sure you want to delete +this column?` Click {guilabel}`Delete` to delete the column. + +:::{important} +If there are applicants currently in the stage being deleted, an error pops up when attempting to +delete the stage. The records currently in the stage to need to be either deleted, archived, or +moved to a different stage before the stage can be deleted. +::: + +## Email templates + +To communicate with the applicant, Odoo has several pre-configured email templates that can be used. +The pre-configured email templates and when to use them are as follows: + +- {guilabel}`Recruitment: Applicant Acknowledgement`: this template is used to let the applicant + know that their application was received. This email is automatically sent out once the applicant + is in the {guilabel}`New` stage. +- {guilabel}`Recruitment: Interest`: this template is used to let the applicant know that their + application caught the recruiter's attention, and they have been shortlisted for either a phone + call or an interview. +- {guilabel}`Recruitment: Schedule Interview`: this template is used to let the applicant know that + they have passed the {guilabel}`Initial Qualification` stage, and they will be contacted to set up + an interview with the recruiter. This email is automatically sent out once the applicant is in the + {guilabel}`Initial Qualification` stage. +- {guilabel}`Recruitment: Not interested anymore`: this template is used when an applicant + communicates that they are no longer interested in the position, and thanks them for their time + and consideration. +- {guilabel}`Recruitment: Refuse`: this template is used when an applicant is no longer being + considered for the position. + +:::{note} +Email templates can be created, modified, and deleted to suit the needs of a business. For more +information on email templates, refer to the {doc}`../general/companies/email_template` document. +::: + +To manually send an email, click {guilabel}`Send message` in the chatter. A text box appears, as +well as the applicant's email address. + +```{image} recruitment/full-composer.png +:align: center +:alt: Send an email from the chatter. +``` + +Click the {icon}`fa-expand` {guilabel}`(expand)` full composer icon in the bottom right corner of +the {guilabel}`Send Message` tab in the chatter. A {guilabel}`Compose Email` pop-up window loads, +with the {guilabel}`Recipients` and {guilabel}`Subject` pre-populated. The applicant's email address +is entered in the {guilabel}`Recipients` line, and the {guilabel}`Subject` is `(Job Position)`. The +email body is empty by default. + +To use a pre-configured email template, click the field next to {guilabel}`Load template` in the +bottom section of the window. Select the email template to use from the drop-down menu. + +Pre-configured email templates may contain dynamic placeholders so unique information can be +populated in the email for a more personalized message to the applicant. There are several +pre-configured email templates to choose from. Depending on the template selected, the email subject +and/or body may change. + +:::{note} +Only the email templates that are configured for the model load. There are other email templates +pre-configured in Odoo, but if they are not configured for the recruitment application, they do +not appear in the list of available templates. +::: + +If any attachments are to be added, click the {guilabel}`Attachments` button in the lower left +corner. Navigate to the file to be attached, then click {guilabel}`Open` to attach it. To delete an +attachment, click the {icon}`fa-close` {guilabel}`(delete)` icon to the right of the attachment. + +If any changes need to be made to the email, edit the body of the email. If the edits should be +saved to be used in the future, the email can be saved as a new template. Click the {guilabel}`Save +Template` button in the bottom. To send the email, click {guilabel}`Send` and the email is sent to +the applicant. The email then appears in the chatter. + +```{image} recruitment/send-survey.png +:align: center +:alt: |- +: Send a custom survey, also referred to as an interview form, to an applicant using a +: pre-configured template. +``` + +:::{seealso} +- {doc}`recruitment/new_job` +- {doc}`recruitment/add-new-applicants` +- {doc}`recruitment/schedule_interviews` +- {doc}`recruitment/offer_job_positions` +- {doc}`recruitment/refuse_applicant` +- {doc}`recruitment/source_analysis` +- {doc}`recruitment/recruitment_analysis` +- {doc}`recruitment/time_in_stage` +- {doc}`recruitment/team_performance` +::: + +```{toctree} +:titlesonly: true + +recruitment/new_job +recruitment/recruitment-flow +recruitment/add-new-applicants +recruitment/schedule_interviews +recruitment/offer_job_positions +recruitment/refuse_applicant +recruitment/source_analysis +recruitment/recruitment_analysis +recruitment/time_in_stage +recruitment/team_performance +``` + diff --git a/content/applications/hr/recruitment/add-new-applicants.md b/content/applications/hr/recruitment/add-new-applicants.md new file mode 100644 index 000000000..0cedcd7cb --- /dev/null +++ b/content/applications/hr/recruitment/add-new-applicants.md @@ -0,0 +1,165 @@ +# Add new applicants + +Once an applicant submits an application, either using the online application, or emailing a job +position alias, an applicant card is automatically created in the *Recruitment* application. + +However, in some instances, applicants may need to be created manually in the database. This could +be necessary if, for example, a company accepts paper applications in the mail, or is meeting +prospective applicants at an in-person job fair. + +To view current applicants, navigate to the {menuselection}`Recruitment` app, then click the desired +job position card. Doing so reveals the {guilabel}`Applications` page, which displays all +applicants for that specific role, in a default Kanban view, organized by stage. + +Add new applicants from a job position's {guilabel}`Applications` page by using either: the +{ref}`New ` button or the {ref}`quick add +` button. + +(recruitment-quick-add-applicant)= + +## Quick add + +On the {guilabel}`Applications` page, click the on the quick add button, represented by a small +{icon}`fa-plus` {guilabel}`(plus)` icon in the top-right corner of each stage to quickly add a new +applicant to that stage. + +Enter the following information on the card: + +- {guilabel}`Subject/Application`: enter the title for the card. Typically, this is the applicant's + name, and job position being applied to. For example: `Laura Smith - HR Manager`. The text entered + in this field is **not** visible in the Kanban view of the {guilabel}`Applications` page, unless + the {guilabel}`Applicant's Name` field is left blank. +- {guilabel}`Applicant's Name`: enter the applicant's name. Displays as the card title in the + Kanban view of the {guilabel}`Applications` page. +- {guilabel}`Email`: enter the applicant's email address. +- {guilabel}`Applied Job`: the current job position populates this field. If needed, the job + position can be changed by selecting a different position from the drop-down menu. If a different + job position is selected, after the card is created, the card appears on the + {guilabel}`Applications` page for that newly-selected job position. + +After the information is entered, click {guilabel}`Add`. The applicant appears in the list, and a +new blank applicant card appears. + +If preferred, after entering the {guilabel}`Applicant's Name` in the Kanban card that appears, click +{guilabel}`Edit`, and a detailed applicant form loads. Refer to the {ref}`New applicant form +` section for details about filling out the form. + +When doing a quick add, clicking away from an empty card, or clicking the {icon}`fa-trash-o` +({guilabel}`trash`) icon, discards the applicant. + +```{image} add-new-applicants/quick-add.png +:align: center +:alt: All the fields for a new applicant form entered when using the Quick Add option. +``` + +(recruitment-create-new-applicant)= + +## New applicant form + +On the new applicant form, the {guilabel}`Subject / Application` field is populated with the +pre-selected job position, by default. Certain fields on the applicant card may also be +pre-populated, depending on how the job position is configured. Typically, the {guilabel}`Job` +section, as well as the {guilabel}`Recruiter` field, are pre-populated. + +Complete the fields in the following sections on the new applicant form. + +:::{note} +Depending on installed applications and configurations, some fields may **not** be displayed. +::: + +```{image} add-new-applicants/new-applicant.png +:align: center +:alt: All the fields for a new applicant form entered. +``` + +(recruitment-applicant-details)= + +### Applicant section + +- {guilabel}`Subject/Application Name`: this is the **only** required field. Enter the title for the + card in this field. Typically, this is the applicant's name, and the job position being applied + to. For example: `John Smith - Experienced Developer`. This field is **not** visible in the Kanban + view of the {guilabel}`Applications` page, unless the {guilabel}`Applicant's Name` is left blank. +- {guilabel}`Applicant's Name`: enter the applicant's name. This field is displayed as the card + title in the Kanban view of the {guilabel}`Applications` page. +- {guilabel}`Email`: enter the applicant's email address. +- {guilabel}`Phone`: enter the applicant's phone number. +- {guilabel}`Mobile`: enter the applicant's mobile number. +- {guilabel}`LinkedIn Profile`: enter the web address for the applicant's personal profile on + LinkedIn. +- {guilabel}`Degree`: select the applicant's highest level of education from the drop-down menu. + Options are: {guilabel}`Graduate`, {guilabel}`Bachelor Degree`, {guilabel}`Master Degree`, or + {guilabel}`Doctoral Degree`. The {guilabel}`Graduate` option indicates the applicant graduated at + the highest level of school before a Bachelor's degree, such as a high school or secondary school + diploma, depending on the country. +- {guilabel}`Interviewers`: using the drop-down menu, select the people to conduct the interviews. + The selected people **must** have either *recruiter* or *officer* rights configured for the + *Recruitment* application to appear in the drop-down list. Refer to the {doc}`Access rights + <../../general/users/access_rights>` documentation for more information. +- {guilabel}`Recruiter`: select the user responsible for the entire recruitment process for the job + position. +- {guilabel}`Evaluation`: represents a rating for the applicant: one star ({icon}`fa-star` + {icon}`fa-star-o` {icon}`fa-star-o`) is {guilabel}`Good`, two stars ({icon}`fa-star` + {icon}`fa-star` {icon}`fa-star-o`) is {guilabel}`Very Good`, and three stars ({icon}`fa-star` + {icon}`fa-star` {icon}`fa-star`)is {guilabel}`Excellent.` +- {guilabel}`Source`: using the drop-down menu, select where the applicant learned about the job + position. The following options come pre-configured in Odoo: {guilabel}`Search engine`, + {guilabel}`Lead Recall`, {guilabel}`Newsletter`, {guilabel}`Facebook`, {guilabel}`Twitter`, + {guilabel}`LinkedIn`, {guilabel}`Monster`, {guilabel}`Glassdoor`, and {guilabel}`Craigslist`. To + add a new {guilabel}`Source`, type in the source, then click {guilabel}`Create "(new source)"`. +- {guilabel}`Medium`: using the drop-down menu, specify how the job listing was found. The + pre-configured options are: {guilabel}`Banner`, {guilabel}`Direct`, {guilabel}`Email`, + {guilabel}`Facebook`, {guilabel}`Google Adwords`, {guilabel}`LinkedIn`, {guilabel}`Phone`, + {guilabel}`Television`, {guilabel}`Twitter` (now known as "X"), or {guilabel}`Website`. To add a + new {guilabel}`Medium`, type in the medium, then click {guilabel}`Create "(new medium)"`. +- {guilabel}`Referred By User`: if referral points are to be earned for this job position in the + *Referrals* application, select the user who referred the applicant from the drop-down menu. The + *Referrals* application **must** be installed for this field to appear. +- {guilabel}`Availability`: select the available start date for the applicant. To select a date, + click on the field to reveal a popover calendar. Use the {icon}`fa-angle-left` {guilabel}`(left)` + and {icon}`fa-angle-right` {guilabel}`(right)` arrows on either side of the month to navigate to + the desired month, then click the desired date. Leaving this field blank indicates the applicant + can start immediately. +- {guilabel}`Tags`: select as many tags as desired from the drop-down menu. To add a tag that does + not exist, type in the tag name, then click {guilabel}`Create "new tag"` from the resulting + drop-down menu. + +### Job section + +The following fields are pre-populated when creating a new applicant, as long as these field are +specified on the job position form. Editing the fields is possible, if desired. + +- {guilabel}`Applied Job`: select the job position the applicant is applying to from the drop-down + menu. +- {guilabel}`Department`: select the department the job position falls under from the drop-down + menu. +- {guilabel}`Company`: select the company the job position is for using the drop-down menu. This + field **only** appears when in a multi-company database. + +### Contract section + +- {guilabel}`Expected Salary`: enter the amount the applicant is requesting in this field. The + number should be in a `XX,XXX.XX` format. The currency is determined by the localization setting + for the company. + + - {guilabel}`Extra advantages...`: if any extra advantages are requested by the applicant, enter + it in the {guilabel}`Extra advantages...` field to the right of the {guilabel}`Expected Salary` + field. This should be short and descriptive, such as `1 week extra vacation` or `dental plan`. + +- {guilabel}`Proposed Salary`: enter the amount to be offered to the applicant for the role in this + field. The number should be in a `XX,XXX.XX` format. + + - {guilabel}`Extra advantages...`: if any extra advantages are offered to the applicant, enter it + in the {guilabel}`Extra advantages...` field to the right of the {guilabel}`Proposed Salary` + field. This should be short and descriptive, such as `unlimited sick time` or `retirement plan`. + +### Application Summary tab + +Any additional details or notes that should be added to the applicant's card can be typed into this +field. + +### Skills tab + +Skills can be added to the applicant's card. For details on adding skills, refer to the +{ref}`Create new employees ` document. + diff --git a/content/applications/hr/recruitment/new_job.md b/content/applications/hr/recruitment/new_job.md new file mode 100644 index 000000000..4caa0fd1e --- /dev/null +++ b/content/applications/hr/recruitment/new_job.md @@ -0,0 +1,153 @@ +# Job positions + +In Odoo *Recruitment*, all job positions are shown on the default dashboard in the *Recruitment* +app. This includes positions that are being actively recruited for, as well as inactive positions. + +Each job position is shown in an individual Kanban card. If the job position is active, and +candidates can apply, a {guilabel}`Published` banner appears in the top-right corner of the card. + +View submitted applications by clicking anywhere on a job position card. + +```{image} new_job/jobs.png +:align: center +:alt: Main dashboard view of Recruitment app showing all job positions. +``` + +## Create a new job position + +To create a new job position from the main dashboard in the *Recruitment* app, click the +{guilabel}`New` button in the top-left corner, and a {guilabel}`Create a Job Position` modal +appears. + +First, enter the name of the {guilabel}`Job Position` (such as `Sales Manager`, `Mechanical +Engineer`, etc.) in the field. + +Next, enter an {guilabel}`Application email` by typing in the first half of the email address in the +first field, then select the second half of the email using the drop-down menu in the second field. +Applicants can send a resumé to this specific email address, and Odoo creates an application for +them automatically. + +When complete, click the {guilabel}`Create` button to save the entry, or the {guilabel}`Discard` +button to delete it. + +```{image} new_job/job-title.png +:align: center +:alt: Create a new job position. +``` + +Once the job position has been created, it appears as a card in the Kanban view on the main +*Recruitment* app dashboard. + +(recruitment-new-job-position-edit)= + +### Edit a new job position + +After the job position is created, it's time to enter the details for the position. Click on the +{guilabel}`⋮ (three dots)` icon in the upper-right corner of the relevant card to reveal several +options, and then click {guilabel}`Configuration` to edit the details. + +```{image} new_job/edit-job.png +:align: center +:alt: Edit the job position card. +``` + +All the basic information about the job position is listed under the {guilabel}`Recruitment` tab. + +None of the fields are required, but it is important to configure and populate the +{guilabel}`Department`, {guilabel}`Location`, {guilabel}`Employment Type`, and {guilabel}`Job +Summary` fields, as they are all visible to prospective applicants on the website. + +The fields can be filled out as follows: + +- {guilabel}`Department`: select the relevant department for the job position. This is visible on + the website. + +- {guilabel}`Job Location`: select the physical address for the job. If the job position is remote, + leave this field blank. This is visible on the website. + +- {guilabel}`Email Alias`: enter an email address to which applicants can send a resumé. Once + emailed, Odoo automatically creates an application for them. + +- {guilabel}`Employment Type`: select what type of position the job is, using the drop-down menu. + The default options are {guilabel}`Permanent`, {guilabel}`Temporary`, {guilabel}`Seasonal`, + {guilabel}`Interim`, {guilabel}`Full-Time`, and {guilabel}`Part-Time`. This is visible on the + website. + +- {guilabel}`Company`: select the company the job is for. This field only appears if using a + multi-company database. + +- {guilabel}`Target`: enter the number of employees to be hired for this position. + +- {guilabel}`Is Published`: activate this option to publish the job online. + +- {guilabel}`Website`: select the website the job is published on. + +- {guilabel}`Recruiter`: select the person responsible for recruiting this role. + +- {guilabel}`Interviewers`: select who should perform the interviews. Multiple people can be + selected. + +- {guilabel}`Interview Form`: select an {ref}`Interview form ` that + applicants fill out prior to their interview. + +- {guilabel}`Contract Template`: select a contract template to be used when offering the job to a + candidate. + +- {guilabel}`Process Details` section: this section contains information that is displayed online + for the job position. This informs the applicants of the timeline and steps for the recruitment + process, so they know when to expect a reply. + + - {guilabel}`Time to Answer`: enter the number of days before the applicant is contacted. + - {guilabel}`Process`: enter the various stages the candidate goes through during the recruitment + process. + - {guilabel}`Days to get an Offer`: enter the number of days before the applicant should expect + an offer after the recruitment process has ended. + +:::{note} +The {guilabel}`Process Details` section is a text field. All answers are typed in rather than +selected from a drop-down menu. The text is displayed on the website exactly as it appears in +this tab. +::: + +Finally, enter the job description in the {guilabel}`Job Summary` tab. + +```{image} new_job/recruitment-tab.png +:align: center +:alt: Enter job information details in the recruitment tab. +``` + +(recruitment-interview)= + +### Create interview form + +An *Interview Form* is used to determine if a candidate is a good fit for a job position. Interview +forms can be as specific or general as desired, and can take the form of a certification, an exam, +or a general questionnaire. Interview forms are determined by the recruitment team. + +Before creating an interview form, ensure the proper settings are enabled. Navigate to +{menuselection}`Recruitment app --> Configuration --> Settings`, and under the +{guilabel}`Recruitment Process` section, ensure the {guilabel}`Send Interview Survey` option is +enabled. + +Since there are no pre-configured forms in Odoo, all interview forms must be created. To create an +interview form, start from the {guilabel}`Recruitment` tab of the {guilabel}`Job Position` form. In +the {guilabel}`Interview Form` field, enter a name for the new interview form. As the name is typed, +several options populate beneath the entry: {guilabel}`Create (interview form name)`, +{guilabel}`Search More...`, and {guilabel}`Create and edit...`. Click {guilabel}`Create and edit...` +and a {guilabel}`Create Interview Form` modal appears. + +```{image} new_job/blank-interview-form.png +:align: center +:alt: The blank interview form modal. +``` + +:::{note} +The option {guilabel}`Search More...` only appears if there are any interview forms already +created. If no interview forms exist, the only options available are {guilabel}`Create (interview +form name)`, and {guilabel}`Create and edit...`. +::: + +Proceed to fill out the modal interview form as a typical survey. For specific directions on how to +create a survey, refer to the {doc}`survey essentials <../../marketing/surveys/create>` document, +which provides step-by-step instructions on how to create and configure a survey. + diff --git a/content/applications/hr/recruitment/offer_job_positions.md b/content/applications/hr/recruitment/offer_job_positions.md new file mode 100644 index 000000000..1ceffef85 --- /dev/null +++ b/content/applications/hr/recruitment/offer_job_positions.md @@ -0,0 +1,168 @@ +# 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. + +:::{seealso} +Refer to the {doc}`recruitment <../recruitment>` documentation for details on the various stages +of the recruitment process. +::: + +## Contract proposal + +When an offer is ready to be sent, first open the applicant's card by navigating to the +{menuselection}`Recruitment app`, and clicking on the desired job position card. + +From the resulting {guilabel}`Job Positions` Kanban view, the corresponding applicant card can be +dragged-and-dropped to the {guilabel}`Contract Proposal` stage. Or, click into the desired +applicant's card, and click the {guilabel}`Contract Proposal` stage, located in the status bar in +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. + +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 +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. + +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. + +- {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. + + :::{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`. + ::: + +- {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. + + ```{eval-rst} + .. 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 + :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. + +### 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. +::: + +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. + +If any attachments need to be added, click the {icon}`fa-paperclip` {guilabel}`Attachments` 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. + +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. + +:::{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. +::: + +```{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 + +If applicable, the applicant can modify their salary package. This option is not available for all +localizations. Depending on where the company is located, this option may not be available. + +The email template includes a {guilabel}`Configure your package` button. This link takes the +applicant to a webpage, where they can modify the proposed salary package, and enter their personal +information. + +Once the applicant is hired, the personal information entered on the webpage is imported to their +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* +application. + +(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. + +```{image} offer_job_positions/hired.png +:align: center +:alt: Hired banner in the top right corner of applicant card. +``` + +(recruitment-new-employee)= + +## Create employee + +Once the applicant has been hired, the next step is to create their employee record. Click the +{guilabel}`Create Employee` button in the top-left corner of the hired applicant's form. + +An employee form appears, with information from the applicant's card, and the employee contract. + +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. + diff --git a/content/applications/hr/recruitment/recruitment-flow.md b/content/applications/hr/recruitment/recruitment-flow.md new file mode 100644 index 000000000..7b095e5cb --- /dev/null +++ b/content/applications/hr/recruitment/recruitment-flow.md @@ -0,0 +1,237 @@ +# 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. + +:::{important} +The following is based on Odoo's default recruitment pipeline. Be advised that if +{ref}`modifications are made ` to the pipeline, the process +differs. +::: + +(recruitment-new)= + +## New + +At the start of the process, all applicants appear in the {guilabel}`New` stage on the +{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. + +:::{note} +If the website application form is modified, different fields may be populated, based on what +information is requested 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. + +### 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. + +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. + +:::{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. +::: + +### 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 +installed. + +Odoo uses the term *interview*, but these can be thought of as questionnaires, surveys, tests, +certifications, etc. Custom interviews can be formatted to suit each individual job position's +needs. For more information on creating and editing interviews, refer to the +{doc}`../../hr/recruitment/new_job` documentation. + +```{eval-rst} +.. example:: + A job position for a computer programmer could have an interview in the form of a programming + quiz to determine the skill level of the applicant. A job position for a restaurant server could + have a questionnaire inquiring about the applicant's availability, if the desired applicant needs + to be available on weekend evenings. +``` + +To send an interview to an applicant, first click the applicant's card from the +{guilabel}`Applications` page, to view the detailed applicant information. At the top-left of the +applicant's card, click the {guilabel}`Send Interview` button. + +If the applicant's card has an email address on file, a {guilabel}`Send an interview` pop-up window +appears, with the {guilabel}`Recipients`, {guilabel}`Subject`, and email body populated. + +:::{note} +To send an email to an applicant, there **must** be an {guilabel}`Email` address on the +applicant's card. + +If an email address is not entered on the applicant's card, when the {guilabel}`Send Interview` +button is clicked, an {guilabel}`Edit: (Applicant's Name)` pop-up window appears, *on top of* the +{guilabel}`Send an interview` pop-up window. + +Enter the email address in the {guilabel}`Email` field, then click {guilabel}`Save & Close`. + +Once the applicant's information is saved, the {guilabel}`Edit: (Applicant's Name)` pop-up window +closes, and the {guilabel}`Send an interview` pop-up window remains. +::: + +Sometimes, preconfigured email templates in Odoo use dynamic placeholders, which are automatically +filled with specific data when the email is sent. For example, if a placeholder for the applicant's +name is used, it is replaced with the actual name of the applicant in the email. For more detailed +information on email templates, refer to the {doc}`../../general/companies/email_template` +documentation. + +Add the email addresses of any additional recipients for the survey in the {guilabel}`Additional +emails` field, if more people should receive the email. If an email address is in the database as a +contact, add that contact in the {guilabel}`Recipients` field. If an email should be sent to someone +who is not in the database as a contact, and they should **not** be added as a contact, add their +email address in the {guilabel}`Additional emails` field. + +If any attachments need to be added, click the {icon}`fa-paperclip` {guilabel}`Attachments` button, +and a file explorer window appears. Navigate to the desired file, and click {guilabel}`Open` to +attach it to the email. The attachment loads, and is listed above the {icon}`fa-paperclip` +{guilabel}`Attachments` button. + +If the emailed interview must be completed by a specific date, enter that date in the +{guilabel}`Answer deadline` field, located in the lower-right area of the pop-up window. + +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. + +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 +selected, the new email template loads in the email body. + +To send the email with the interview link to the applicant, click {guilabel}`Send` at the bottom of +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. +``` + +(recruitment-initial-qualification)= + +## 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. + +:::{note} +> In order to move an applicant's card from one stage to another, the applicant's card can either +> be dragged and dropped in the Kanban view of the {guilabel}`Applications` page to the desired +> stage, or the stage can be modified on the applicant's card. +> +> To change the stage on the applicant's card, first click the desired applicant's card from the +> {guilabel}`Applications` page. The current stage for the card is highlighted at the top on a +> status bar, above the card. +> +> Click the desired stage for the card, and the stage changes. A log note indicating the stage +> 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. +``` +::: + +(recruitment-first-interview)= + +## First interview + +After an applicant has passed the {guilabel}`Initial Qualification` stage, they can be manually +moved to the {guilabel}`First Interview` stage on the {guilabel}`Applications` page, while in Kanban +view. + +To move the applicant to the next stage, drag-and-drop the applicant's card to the {guilabel}`First +Interview` stage. + +Alternatively, open the desired applicant's card from the {guilabel}`Applications` page, and click +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 +calendar appears, allowing the applicant to schedule their interview. + +{ref}`Edit ` the {guilabel}`First Interview` stage, and select the +{guilabel}`Recruitment: Schedule Interview` option in the {guilabel}`Email Template` field, to +automate this action. +::: + +(recruitment-second-interview)= + +## Second interview + +After an applicant has passed the {guilabel}`First Interview` stage, they can be moved to the +{guilabel}`Second Interview` stage. To move the applicant to the next stage, drag-and-drop the +applicant's card to the {guilabel}`Second Interview` stage from the Kanban view of the +{guilabel}`Applications` page, or click on the {guilabel}`Second Interview` stage at the top of the +individual applicant's card. + +When the applicant's card moves to the {guilabel}`Second Interview` stage, there are no automatic +activities or emails configured for this stage, by default. The recruiter can now {ref}`schedule a +second interview ` with the applicant, +following the same process as the first interview. + +(recruitment-contract-proposal)= + +## Contract Proposal + +After the applicant has completed the various interview processes, the next step is to {doc}`send +the job offer `. + +Once the offer has been sent, drag-and-drop the applicant's card to the {guilabel}`Contract +Proposal` stage from the Kanban view of the {guilabel}`Applications` page, or click on the +{guilabel}`Contract Proposal` stage at the top of the individual applicant's card. + +## Contract Signed + +Once the contract has been signed, and the applicant has been hired, the applicant's card moves to +the {guilabel}`Contract Signed` stage. + +Drag-and-drop the applicant's card to the {guilabel}`Contract Signed` stage from the Kanban view of +the {guilabel}`Applications` page, or click the {icon}`fa-ellipsis-h` {guilabel}`(ellipsis)` icon at +the top of the individual applicant's card, then click {guilabel}`Contract Signed` on the status +bar. + +## Refuse applicant + +At any point in the recruitment process, a candidate can be {doc}`refused `. + diff --git a/content/applications/hr/recruitment/recruitment_analysis.md b/content/applications/hr/recruitment/recruitment_analysis.md new file mode 100644 index 000000000..61fe9308d --- /dev/null +++ b/content/applications/hr/recruitment/recruitment_analysis.md @@ -0,0 +1,102 @@ +# 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/refuse_applicant.md b/content/applications/hr/recruitment/refuse_applicant.md new file mode 100644 index 000000000..9a1ac59ba --- /dev/null +++ b/content/applications/hr/recruitment/refuse_applicant.md @@ -0,0 +1,145 @@ +# 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 +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 + --> Applications --> By Job Position`. Next, click on the desired job position card, then click on + the individual applicant card from the {guilabel}`Applications` page. + +At the top of the applicant's card, there are several buttons. Click the one labeled +{guilabel}`Refuse`. + +(recruitment-refuse-reasons)= + +## Refuse reasons + +*Refuse reasons* allow recruiters to document why an applicant was not a good fit, and send specific +refusal reason email templates to the applicant. + +Clicking {guilabel}`Refuse` on an applicant's form makes the {guilabel}`Refuse Reason` pop-up window +appear. + +The default refuse reasons in Odoo, and their corresponding email templates, are: + +```{eval-rst} +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - Email Template + - Refusal Reason + * - :guilabel:`Recruitment: Refuse` + - | :guilabel:`Doesn't fit the job requirements` + | :guilabel:`Language issues` + | :guilabel:`Role 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` +``` + +Additional refusal reasons {ref}`can be created, and existing ones can be modified (or deleted) +`. + +Select a refusal reason to {ref}`send a refusal email `. + +(recruitment-new-refuse)= + +### 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. + +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 +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. + +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 +window appears. + +In the {guilabel}`Create Email Template` pop-up window, enter a {guilabel}`Name` for the form, and +an email {guilabel}`Subject` in the corresponding fields. + +Enter the desired email content in the {guilabel}`Content` tab. Proceed to make any other +modifications to the template in the {guilabel}`Email Configuration` and {guilabel}`Settings` tabs, +then click {guilabel}`Save & Close` to save the template. Upon clicking that, Odoo returns to the +{guilabel}`Refuse Reasons` list. + +The new template appears in the new refuse reason {guilabel}`Email Template` field. + +:::{note} +Pre-configured recruitment refusal email templates in Odoo use dynamic placeholders, which are +personalized placeholders that populate data from the applicant's record in the email body. + +For example, if the applicant's name is a used in a dynamic placeholder, the applicant's name +appears anytime that dynamic placeholder appears on the email template. + +For more detailed information on email templates, refer to the +{doc}`../../general/companies/email_template` documentation. +::: + +(recruitment-send-refusal-email)= + +## 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. +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 +email recipients **cannot** be added. + +If an email should **not** be sent to the applicant, uncheck the {guilabel}`Send Email` checkbox. + +The email template associated with the refusal reason populates the {guilabel}`Email Template` +field. If a different email template is desired, select a different template from the +{guilabel}`Email Template` drop-down menu. + +To send the refusal email to the applicant, ensure the {guilabel}`Send Email` checkbox is ticked, +then click {guilabel}`Refuse` at the bottom of the {guilabel}`Refuse Reason` pop-up window. The +refusal email is sent to the applicant, and a red {guilabel}`Refused` banner appears on the +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 + +After refusal, the applicant's card is no longer visible in the job position's Kanban view. However, +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. + +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/schedule_interviews.md b/content/applications/hr/recruitment/schedule_interviews.md new file mode 100644 index 000000000..36c1be6ca --- /dev/null +++ b/content/applications/hr/recruitment/schedule_interviews.md @@ -0,0 +1,340 @@ +# 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 +`, or by the {ref}`applicant +`. + +(recruitment-schedule-interviews-recruitment-scheduled)= + +## Recruitment team scheduled interviews + +When an applicant reaches the interview stage, the recruitment team should schedule the interview, +by first coordinating a suitable date and time with the applicant and interviewers. + +To schedule the interview, navigate to the applicant's card, by first going to the +{menuselection}`Recruitment app`, and clicking the relevant job card. This opens the +{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. + +:::{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. + +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. +::: + +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 +{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 +meeting and drag down to the end time. Doing so selects the date, time, and the length of the +meeting. + +A meeting can also be added in this view by clicking on the desired day *and* time slot. + +Both methods cause a {ref}`New Event ` pop-up window to +appear. + +(recruitment-schedule-interviews-event-card)= + +### New event pop-up window + +Clicking a grid, corresponding with the time and date, opens the {guilabel}`New Event` pop-up window +to schedule a meeting. + +Enter the information on the form. The only required fields to enter are a title for the meeting, +along with the {guilabel}`Start` (and end date/time) fields. + +Once the card details are entered, click {guilabel}`Save & Close` to save the changes and create the +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 + 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` 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, + 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 + 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. + + Scroll through the options and click on the desired item. The item appears in the field, and can + be modified. Each command presents a different pop-up window. Follow the instructions for each + command to complete the entry. + +#### More options + +To add additional information to the meeting, click the {guilabel}`More Options` button in the +lower-right corner of the {ref}`New Event ` pop-up +window. Enter any of the following additional fields: + +- {guilabel}`Duration`: this field auto populates based on the {guilabel}`Start` (and end) date and + time. If the meeting time is adjusted, this field automatically adjusts to the correct duration + length. The default length of a meeting is one hour. + +- {guilabel}`Recurrent`: if the meeting should repeat at a selected interval (not typical for a + first interview), tick the checkbox next to {guilabel}`Recurrent`. Several additional fields + appear when this is enabled: + + - {guilabel}`Timezone`: using the drop-down menu, select the {guilabel}`Timezone` for the + recurrent meetings. + - {guilabel}`Repeat`: choose {guilabel}`Daily`, {guilabel}`Weekly`, {guilabel}`Monthly`, + {guilabel}`Yearly`, or {guilabel}`Custom` recurring meetings. If {guilabel}`Custom` is selected, + a {guilabel}`Repeat Every` field appears beneath it, along with another time frequency parameter + ({guilabel}`Days`, {guilabel}`Weeks`, {guilabel}`Months`, or {guilabel}`Years`). Enter a number + in the blank field, then select the time period using the drop-down menu. + - {guilabel}`Repeat on`: enabled when the {guilabel}`Weekly` option is selected in the + {guilabel}`Repeat` field. Choose the day the weekly meeting falls on. + - {guilabel}`Day of Month`: configure the two drop-down menu options to select a specific day of + the month, irrespective of the date (e.g. the first Tuesday of every month). To set a specific + calendar date, choose {guilabel}`Date of Month` and enter the calendar date in the field (e.g. + `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` 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`, + {guilabel}`Private`, and {guilabel}`Only internal users`. {guilabel}`Public` allows for everyone + to see the meeting, {guilabel}`Private` allows only the attendees listed on the meeting to see the + meeting, and {guilabel}`Only internal users` allows anyone logged into the company database to see + the meeting. + +- {guilabel}`Organizer`: the employee who created the meeting is populated in this field. Use the + drop-down menu to change the selected employee. + +- {guilabel}`Reminders`: select a reminder from the drop-down menu. Default options include + {guilabel}`Notification`, {guilabel}`Email`, and {guilabel}`SMS Text Message`, each with a + specific time period before the event (hours, days, etc). The chosen reminder chosen alerts the + meeting participants of the meeting, via the selected option at the specified time. Multiple + 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 + +Once changes have been entered on the {ref}`New Event ` +pop-up window, and the meeting details are correct, the meeting can be sent to the attendees, via +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 +{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`. + +```{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. + +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 +{guilabel}`Close`, and edit the attendee's record, then redo these steps. + +When no warning message appears, type in the message to be sent to the attendees in the +{guilabel}`Message` field. To add any emojis to the message, click the {icon}`oi-smile-add` +{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 +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} +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. +::: + +(recruitment-schedule-interviews-applicant-scheduled)= + +## Applicant scheduled interviews + +By default, the recruitment interview stages are **not** set up for applicants to schedule their own +interviews. + +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. + +(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. + +```{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?` + +`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?` + +`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 +**only** accessible through the emailed link. + +This page displays the {guilabel}`MEETING DETAILS` on the right side of the screen. This includes +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. + +```{image} schedule_interviews/select-date-time.png +:align: center +:alt: The calendar screen with dates and times to schedule an interview. +``` + +:::{tip} +Be sure to check the {guilabel}`Timezone` field, beneath the calendar, to ensure it is set to the +correct time zone. Changing the time zone may alter the available times presented. +::: + +Once the date and time are selected, the applicant is navigated to an {guilabel}`Add more details +about you` page. This page asks the applicant to enter their {guilabel}`Full name`, +{guilabel}`Email`, and {guilabel}`Phone number`. The contact information entered on this form is how +the applicant is contacted to remind them about the scheduled interview. + +When everything is entered on the {guilabel}`Add more details about you` page, the applicant clicks +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 +of the interview are displayed. The option to add the meeting to the applicant's personal calendars +is available, through the {guilabel}`Add to iCal/Outlook` and {guilabel}`Add to Google Agenda` +buttons, beneath the interview details. + +The applicant is also able to cancel or reschedule the interview, if necessary, with the +{guilabel}`Cancel/Reschedule` button. + diff --git a/content/applications/hr/recruitment/source_analysis.md b/content/applications/hr/recruitment/source_analysis.md new file mode 100644 index 000000000..1df5ee808 --- /dev/null +++ b/content/applications/hr/recruitment/source_analysis.md @@ -0,0 +1,85 @@ +# Source analysis reporting + +Reporting is a critical tool used by recruiting departments to gain insights into the entire +recruitment process. + +Determining where applicants come from can provide information about which sources have the best +results. This information is determined by the *Source Analysis* report. With this data, recruitment +teams can better pivot their recruiting strategies to gain better applicants, in both quantity and +quality. + +## Open report + +To access the *Source Analysis* report, navigate to {menuselection}`Recruitment app --> Reporting +--> Source Analysis`. + +This presents the data for the {icon}`fa-filter` {guilabel}`Last 365 Days Applicant`, in a default +{icon}`fa-area-chart` {guilabel}`(Graph)` view, showing the amount of applicants by +{guilabel}`Source`, and further separated by stage ({guilabel}`In Progress` and {guilabel}`Hired`) + +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 + +To identify which sources (e.g., job boards, social media, employee referrals, company website) +produce the most hires, the pivot table view of the {guilabel}`Source Analysis` report can be +configured to display further details. + +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}`Hired`, and {guilabel}`Refused`. + +This information, as presented, makes it difficult to view the specific numbers for each source. +Click the {icon}`fa-exchange` {guilabel}`(Flip axis)` icon, to swap the information. After that, the +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 +for each source, as well as for each stage by job position. + +### Medium + +Viewing the medium for the applicants can be beneficial to see which specific medium is more +successful. + +*Mediums* are the specific methods the applicant used to discover and then apply for job positions, +such as organic search, paid search, social media ad, email, etc. + +To further group the results by medium, click into one of the {icon}`fa-plus-square` +{guilabel}`[Source]` rows. Click {guilabel}`Medium` in the resulting drop-down menu. The row +presents the specific mediums, relevant to that specific source. + +Once {guilabel}`Medium` is selected for one source, clicking into another row automatically reveals +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} +The only mediums that appear for a source, are mediums that have been set on an applicant's form. +If a medium has **not** been set for any applicants, the medium does not appear in the drop-down +rows beneath the source. + +For example, if no applicants applied with the medium *Google Adwords*, that medium does **not** +appear beneath the *Search engine* source row. +::: + diff --git a/content/applications/hr/recruitment/team_performance.md b/content/applications/hr/recruitment/team_performance.md new file mode 100644 index 000000000..484fe4aa8 --- /dev/null +++ b/content/applications/hr/recruitment/team_performance.md @@ -0,0 +1,95 @@ +# Team performance reporting + +The *Team Performance* report in the **Recruitment** app shows how many applicants each recruiter is +managing. + +This information is determined by the individuals populating the {ref}`Recruiter +` field on each applicant form. + +## Open report + +To access the *Team Performance* report, navigate to {menuselection}`Recruitment app --> Reporting +--> 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. + +The information shown is for the {icon}`fa-filter` {guilabel}`Last 365 Days Applicant` default +filter, as displayed in the search bar. + +Hover the cursor over any column to view a popover window, displaying the specific details for that +column. + +```{image} team_performance/team-performance.png +:align: center +:alt: The default bar chart of the team performance report. +``` + +### Pivot table view + +For a more detailed view of the information in the {guilabel}`Team Performance` 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, while the columns display the total +number of applicants. The applicants are further organized by {guilabel}`# Applicant` (in process), +{guilabel}`# Hired`, and {guilabel}`# Refused`. + +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. + +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 pivot table also shows that the {guilabel}`Chief Executive Officer` 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 + +One way to modify this report is to show how recruiters are performing over time. To show this +information, begin with the {guilabel}`Team Performance` report in the {icon}`oi-view-pivot` +{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 +{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. + +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`. + +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. + +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. + diff --git a/content/applications/hr/recruitment/time_in_stage.md b/content/applications/hr/recruitment/time_in_stage.md new file mode 100644 index 000000000..34711062c --- /dev/null +++ b/content/applications/hr/recruitment/time_in_stage.md @@ -0,0 +1,81 @@ +# Time in stage 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. + +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 + +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 +the x-axis, and the number of days populating the y-axis, in a {icon}`fa-line-chart` +{guilabel}`(Line Chart)`. + +The default filter is {guilabel}`Last 365 Days Applicant`, showing information for the last 365 +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. + +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. + +```{image} time_in_stage/bar-chart.png +:align: center +:alt: The bar chart view of the Time In Stage 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. + +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 +the various boxes. + +:::{note} +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. +``` + +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. +Click {guilabel}`Add Custom Group` {icon}`fa-caret-down` at the bottom of the list, revealing +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 +: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 +average. In addition, the {guilabel}`Contract Proposal` stage had the longest wait time in July, +with an average of {guilabel}`31.62` days in that stage. + +While this report does not display the reasons applicants stayed in the various stages for these +lengths of time, it can be helpful to know when delays occur. + +:::{seealso} +{doc}`Essentials reporting documentation <../../essentials/reporting>` +::: + diff --git a/content/applications/hr/referrals.md b/content/applications/hr/referrals.md new file mode 100644 index 000000000..737ba5cda --- /dev/null +++ b/content/applications/hr/referrals.md @@ -0,0 +1,281 @@ +--- +show-content: true +--- + +# Referrals + +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. + +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. + +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 +{doc}`../general/users/access_rights`. + +(referrals-onboarding)= + +## 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. + +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. + +The text that appears on each slide is as follows: + +1. {guilabel}`Oh no! Villains are lurking the city! Help us recruit a team of superheroes to save + the day!` +2. {guilabel}`Browse through open job positions, promote them on social media, or refer friends.` +3. {guilabel}`Collect points and exchange them for awesome gifts in the shop.` +4. {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 +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 +{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. +::: + +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. + +```{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 +` 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 +{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. + +Make any changes to the message in the {guilabel}`Text` field. A {guilabel}`Company` may be +selected, as well. However, if this field is populated, that slide is *only* displayed for that +particular company. + +:::{note} +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. + +```{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. + +```{image} referrals/onboarding-reorder.png +:align: center +:alt: The onboarding slides in a list, with the drag and drop arrows highlighted. +``` + +(referrals-hired)= + +## 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. + +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. + +```{image} referrals/avatars.png +:align: center +:alt: |- +: The hired screen. A selection of avatars are presented to chose 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 +{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. + +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 +to the desired selection, and the friend will appear either in front of or behind the user's avatar +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. + +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. + +```{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. + +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.* +::: + +(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*, +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. + +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. + +### 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. + +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. + +Type in the name (or number) of the level in the {guilabel}`Level Name` field. What is entered is +displayed beneath the user's photo on the main dashboard when they reach that level. Enter the +number of referral points needed to reach that level in the {guilabel}`Requirements` field. The +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. + +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. + +```{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 +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 +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 +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. +``` + +:::{note} +Once a user has reached the highest configured level, they will continue to accrue points that +can be redeemed for rewards, but they are no longer able to level up. The ring around their photo +remains solid cyan. +::: + +:::{seealso} +- {doc}`referrals/share_jobs` +- {doc}`referrals/points` +- {doc}`referrals/rewards` +- {doc}`referrals/alerts` +- {doc}`referrals/reporting` +::: + +```{toctree} +referrals/share_jobs +referrals/points +referrals/rewards +referrals/alerts +referrals/reporting +``` + diff --git a/content/applications/hr/referrals/alerts.md b/content/applications/hr/referrals/alerts.md new file mode 100644 index 000000000..1f483da3c --- /dev/null +++ b/content/applications/hr/referrals/alerts.md @@ -0,0 +1,63 @@ +# 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. + +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. +``` + +## 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`. + +Click {guilabel}`New` to open a blank alert form. Enter the following information on the form: + +- {guilabel}`Date From`: the date the alert starts. On this date, the alert is visible on the + dashboard. + +- {guilabel}`Date To`: the date the alert ends. After this date, the alert is hidden from view. + +- {guilabel}`Company`: the current company populates this field, by default. To modify the company + 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 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. + +- {guilabel}`Alert`: enter the text for the alert. This message appears inside the alert banner on + the main *Referrals* dashboard. + +- {guilabel}`On Click`: there are three options for the alert. Click the radio button next to the + desired selection. The options are: + + - {guilabel}`Not Clickable`: the alert only displays text, there is no link to click. + - {guilabel}`Go to All Jobs`: the alert contains a link that, when clicked, navigates to the + website with all the job positions that are currently posted. + - {guilabel}`Specify URL`: the alert contains a link to a specific URL that, when clicked, + navigates to that URL. When selected, a {guilabel}`URL` field appears below the {guilabel}`On + 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. +``` + +## 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. + +This prevents the alert from appearing again, even when opening the *Referrals* application for the +first time in a new session. + diff --git a/content/applications/hr/referrals/points.md b/content/applications/hr/referrals/points.md new file mode 100644 index 000000000..dac5310d5 --- /dev/null +++ b/content/applications/hr/referrals/points.md @@ -0,0 +1,71 @@ +# Referral points + +The *Referrals* application allows employees to earn points that are then exchanged for +{doc}`rewards `. + +Current referral points can be viewed on the main *Referrals* app dashboard, which appears when the +application is opened, after the {ref}`onboarding ` slides have been viewed or +skipped. + +At the top, a summary of the user's current points is displayed. The left side of the summary +displays the {guilabel}`Total` points earned, and the right side displays the points that are +available {guilabel}`To Spend`. + +To view the various referral stages, and their respective earned points, click one of the referral +statuses beneath the avatar. The options are: {guilabel}`Referrals`, {guilabel}`Ongoing`, and +{guilabel}`Successful`. + +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 +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. + +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 +are in process have a purple {guilabel}`In Progress` badge in the top-right corner. + +Each referral card lists the name of the applicant, the subject/application title as it appears on +the applicant card in the *Recruitment* app, the name of the job position, the person responsible +for filling the role (i.e. the recruiter), and the points earned. + +For referrals that have been hired, the selected avatar also appears on the card. + +```{image} points/referrals.png +:align: center +:alt: Two referral cards, one hired and one in-progress. +``` + +### Points + +The points that can be earned for a referral are the same across all job positions. Each stage of +the recruitment process has corresponding points assigned to it. The stages listed correspond to the +stages configured in the *Recruitment* application. + +On each individual referral card, beneath the points earned, is a progress bar that displays how +many points have been earned out of the total possible points that can be earned, if the applicant +is hired. + +Beneath the bar chart is a list of the various recruitment stages, and the points earned when the +referral moves to that stage. If a stage has been achieved, and the points have been earned, a green +{icon}`fa-check` {guilabel}`(checkmark)` appears next to the stage. + +:::{note} +The preconfigured point structure for referrals is as follows: + +- {guilabel}`Initial Qualification`: 1 point +- {guilabel}`First Interview`: 20 points +- {guilabel}`Second Interview`: 9 points +- {guilabel}`Contract Proposal`: 5 points +- {guilabel}`Contract Signed`: 50 points + +The default total points earned for a referral that is hired is 85 points. Modifications of the +points earned for each stage are made in the *Recruitment* application. Refer to the +{ref}`Recruitment ` documentation to modify the points for each stage. +::: + diff --git a/content/applications/hr/referrals/reporting.md b/content/applications/hr/referrals/reporting.md new file mode 100644 index 000000000..e92974015 --- /dev/null +++ b/content/applications/hr/referrals/reporting.md @@ -0,0 +1,89 @@ +# Reporting + +The reporting function in the **Referrals** app helps recruiters and managers learn where applicants +are applying from, when referred by a current employee. Additionally, the reporting feature shows +the number of applicants hired, refused, and still in the recruitment pipeline, for each medium. + +:::{important} +Only users with *Administrator* rights for the **Recruitment** app have access to the reporting +feature in the **Referrals** app. +::: + +## Employees referral analysis report + +To access the *Employees Referral Analysis* report, navigate to {menuselection}`Referrals app --> +Reporting`. This loads the {guilabel}`Employees Referral Analysis` report, in a default +{icon}`fa-bar-chart` {guilabel}`Bar Chart`. + +The graph is presented in a {icon}`fa-database` {guilabel}`Stacked` view, with the number of +referrals on the y-axis, and the source, referred to as the {guilabel}`Medium`, of the applicant +(e.g.: *Facebook*, *LinkedIn*, *Email*, etc.) on the x-axis. If a medium does **not** appear on the +report, that indicates there are no referrals from that particular medium. + +Referral amounts for all stages are displayed, including {guilabel}`Not Hired` (refused), +{guilabel}`In Progress`, and {guilabel}`Hired`. The default filter is set to the current month. + +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. + +```{eval-rst} +.. 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 + +One way to use the reporting feature is to assess which employees are referring the highest quality +applicants. This is done by examining how many of their referrals go on to become employees. + +In this example, data is examined to determined which employee has the highest number of hired +referrals for the current year. + +To view this information, first click the {icon}`oi-view-pivot` {guilabel}`(Pivot)` icon in the +upper-right corner. Next, remove the current filter in the search bar. + +Click the {icon}`fa-caret-down` {guilabel}`(down arrow)` in the search bar to reveal a drop-down +menu. Click {guilabel}`Date` in the {icon}`fa-filter` {guilabel}`Filters` column, revealing a +drop-down menu of available time periods, and click the current year (in this example, +{guilabel}`2024`). + +Next, click {guilabel}`Measures` {icon}`fa-caret-down`, then deselect {guilabel}`Earned Points` and +{guilabel}`Employee Referral Refused` to hide those metrics. Click anywhere on the screen to close +the drop-down menu. + +The information displayed shows how many total applicants each employee referred, and how many of +those applicants were hired, for the current year. + +In this example, it can be determined that {guilabel}`Bob Wilson` is the most successful referrer, +with three hired referrals, and nine total referred applicants. Additionally, {guilabel}`Mitchell +Admin` has the lowest performance in terms of referrals, as he has only one applicant, and no hires. + +This information can be helpful to the recruitment team, so they can determine the most active +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} +The pivot table can be inserted into a new or existing {doc}`spreadsheet +<../../productivity/spreadsheet/insert>`, if desired. + +To do so, click the {guilabel}`Insert in Spreadsheet` button right above the chart. A pop-up +window appears, asking which spreadsheet to insert the pivot chart into. Select the desired +spreadsheet or dashboard from the presented options. Alternatively, select {guilabel}`Blank +Spreadsheet` to create a new one. + +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. +::: + diff --git a/content/applications/hr/referrals/rewards.md b/content/applications/hr/referrals/rewards.md new file mode 100644 index 000000000..316014410 --- /dev/null +++ b/content/applications/hr/referrals/rewards.md @@ -0,0 +1,94 @@ +# 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 +configured ` before employees can {ref}`redeem points for rewards +`. + +(referrals-create)= + +## Create rewards + +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 +modify rewards. + +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: + +- {guilabel}`Product Name`: enter the name as it should appear for the reward. This field is + required. + +- {guilabel}`Cost`: enter the amount of points required to redeem the reward. + +- {guilabel}`Company`: using the drop-down menu, select the company the reward is configured for. If + a reward is available for multiple companies, each company **must** configure a reward for their + specific company. This field **only** appears if in a multi-company environment; if this field + appears, it is required. + + ```{eval-rst} + .. example:: + A corporation with three different companies offers a gift card as a reward. In the database, + there are three separate rewards listed for a gift card, one for each of the three companies. + ``` + +- {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. + +- {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. + +- {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} +It is advised to enter a {guilabel}`Cost` and add a {guilabel}`Photo`. If a cost is not entered, +the default cost is listed as zero, which would list the reward as free in the reward shop. If a +photo is not selected, a placeholder icon is displayed on the rewards page. +::: + +(referrals-redeem)= + +## Redeem rewards + +In order to redeem a reward, points must be earned. These points can then be used to purchase a +reward. + +To purchase a reward, click the {guilabel}`Rewards` button on the main {guilabel}`Referrals` +dashboard. All the configured rewards are listed in individual reward cards. + +The required point amount needed to purchase a reward is listed in the top-right corner of the card. + +If the user has enough points to purchase a reward, a {icon}`fa-shopping-basket` {guilabel}`Buy` +button appears at the bottom of the reward card. If they do not have enough points for a reward, the +reward card displays {guilabel}`You need another (x) points to buy this`, instead of a +{icon}`fa-shopping-basket` {guilabel}`Buy` button. + +Click the {icon}`fa-shopping-basket` {guilabel}`Buy` button on a reward to purchase it. A +{guilabel}`Confirmation` pop-up window appears, asking if the user is sure they want to purchase the +reward. Click {guilabel}`OK` to purchase the item, or {guilabel}`Cancel` to close the window, and +cancel the purchase. + +After {guilabel}`OK` is clicked, the pop-up window closes, and the points used to purchase the +reward are subtracted from the user's available points. The rewards presented are now updated to +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.md b/content/applications/hr/referrals/share_jobs.md new file mode 100644 index 000000000..9aba5ddd3 --- /dev/null +++ b/content/applications/hr/referrals/share_jobs.md @@ -0,0 +1,162 @@ +# 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. + +:::{note} +Sharing jobs can **only** occur after onboarding slides have been viewed or skipped. +::: + +(referrals-view-jobs)= + +## View 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 +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 +: displayed on the card. +``` + +Each job position card contains the following information: + +- The title of the job position. This information is taken from the *Job Position* field of the job + 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 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. +::: + +## Refer friends + +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. + +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. + +The specific title of the job position populates the *Job Position* placeholder in the email body. +The `See Job Offer` text in the email body is an individualized tracking link to the specific job +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. + +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 + +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. + +```{image} share_jobs/share.png +:align: center +:alt: The various sharing icons that appear for each job. +``` + +### Link + +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. + +### Facebook + +To share the job position using Facebook, click the {guilabel}`Share Now` button with the +{icon}`fa-facebook` {guilabel}`(Facebook)` icon above it. + +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. + +Type in any additional information to add to the post, then share the job position using the +available options in Facebook. + +### 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. + +If the user is already signed-in to X, when the {guilabel}`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: + +`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. + +### LinkedIn + +To share a job position on LinkedIn, click the {guilabel}`Share Now` button with the +{icon}`fa-linkedin` {guilabel}`(LinkedIn)` icon above it. + +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. + +The job position can be shared either in a public post, or in a private message to an individual (or +group of individuals). + +Type in any additional information, or make any edits to the message or post, then share using the +available options in LinkedIn. + +(referrals-email-jobs)= + +### Email a friend + +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` + +The {guilabel}`See Job Offers` text 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/time_off.md b/content/applications/hr/time_off.md new file mode 100644 index 000000000..e587640d3 --- /dev/null +++ b/content/applications/hr/time_off.md @@ -0,0 +1,626 @@ +--- +show-content: true +--- + +# Time Off + +Odoo's **Time Off** application serves as a centralized hub for all time-off-related information. +This application manages requests, balances, allocations, approvals, and reports. + +Users can {doc}`request time off <../hr/time_off/request_time_off>`, and see an overview of their +requests and time off balances. Managers can {doc}`allocate time off ` to +individuals, teams, or the whole company, and {ref}`approve time off requests +`. + +Detailed {ref}`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. + +:::{note} +Be advised, only users with specific access rights can see all aspects of the **Time Off** app. + +All users can access the *My Time Off* and *Overview* sections of the **Time Off** app. All other +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. +::: + +## Configuration + +In order to allocate time off to employees, and for employees to request and use their time off, the +various time off types must be configured first, then allocated to employees (if allocation is +required). + +(time-off-time-off-types)= + +### Time off types + +To view the currently configured time off types, navigate to {menuselection}`Time Off app --> +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. + +#### Create time off type + +To create a new time off type, navigate to {menuselection}`Time Off app --> Configuration --> Time +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. + +:::{note} +The only **required** fields on the time off type form are the name of the {guilabel}`Time Off +Type`, the {guilabel}`Take Time Off In`, and the {guilabel}`Kind of Time Off`. In addition, the +{guilabel}`Time Off Requests` and {guilabel}`Allocation Requests` sections **must** be +configured. +::: + +##### Time Off Requests section + +- {guilabel}`Approval`: select what specific kind of approval is required for the time off type. The + options are: + + - {guilabel}`No Validation`: No approvals are required when requesting this type of time off. The + time off 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 time off 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 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 + ` are required to approve the time off request. + +##### Allocation Requests section + +- {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 + appear on the form. + +- {guilabel}`Employee Requests`: Select {guilabel}`Extra Days Requests Allowed` if the employee is + able to request more time off than was allocated. + + If employees should **not** be able to make requests for more time off than what was allocated, + select the {guilabel}`Not Allowed` option. + + ```{eval-rst} + .. example:: + Ten days are allocated to the employee for this particular type of time off, and the + :guilabel:`Extra Days Requests Allowed` option is enabled. The employee wants to take a + vacation for twelve days. They may submit a request for two additional days, since the + :guilabel:`Extra Days Requests Allowed` option is enabled. + ``` + + :::{important} + It is important to note that requesting additional time off does **not** guarantee that time + off is granted. + ::: + +- {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. + +##### Configuration section + +> (time-off-time-off-officer)= + +- {guilabel}`Notified Time Off Officer`: Select the person 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: + + - {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). + - {guilabel}`Hours`: if the time off can be taken in hourly increments. + + (time-off-deduct-extra-hours)= + +- {guilabel}`Deduct Extra Hours`: Enable this option if the time off request should factor in any + extra time accrued by the employee. + + ```{eval-rst} + .. example:: + If an employee works two extra hours for the week, and requests five hours of time off, the + request would be for three hours, since the two extra worked hours are used first, and deducted + from the request. + ``` + +- {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. + +- {guilabel}`Kind of Time Off`: From the drop-down menu, select the type of time off, either + {guilabel}`Worked Time` or {guilabel}`Absence`. {guilabel}`Worked Time` indicates the time off + taken counts toward worked time for any type of accrual the employee is working towards, whereas + {guilabel}`Absence` does not count toward any type of accrual. + +- {guilabel}`Company`: If multiple companies are created in the database, and this time off type + only applies to one company, select the company from the drop-down menu. If this field is left + blank, the time off type applies to all companies in the database. This field **only** appears in + a multi-company database. + +##### 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` +field appears. In this field, enter the maximum amount of negative time allowed, in days. + +```{eval-rst} +.. example:: + Sara currently has three days of the time off type `Vacation`. She is planning a trip that + 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. + + 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. +``` + +##### Payroll section + +If the time off type should create {doc}`../hr/payroll/work_entries` in the **Payroll** app, select +the {guilabel}`Work Entry Type` from the drop-down list. + +##### Timesheets section + +:::{note} +The {guilabel}`Timesheets` section only appears if the user is in developer mode. Refer to the +{ref}`developer-mode` document for details on how to access the developer mode. +::: + +When an employee takes time off, and is also using timesheets, Odoo creates entries in the +**Timesheets** app for the time off. This section defines how they are entered. + +- {guilabel}`Project`: Select the project the time off type entries appear in. +- {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 + +- {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. +``` + +(time-off-accrual-plans)= + +### Accrual plans + +Some time off is earned through an accrual plan, meaning that for every specified amount of time an +employee works (hour, day, week, etc), they earn or *accrue* a specified amount of time off. + +```{eval-rst} +.. example:: + If an employee accrues a vacation day for every week they work, they would earn 0.2 vacation days + for each hour they work. At the end of a forty hour work week, they would earn one whole vacation + day (8 hours). +``` + +#### Create accrual plan + +To create a new accrual plan, navigate to {menuselection}`Time Off app --> Configuration --> Accrual +Plans`. Then, click the {guilabel}`New` button, which reveals a blank accrual plan form. + +Enter the following information on the form: + +- {guilabel}`Name`: Enter the accrual plan name. + +- {guilabel}`Accrued Gain Time`: Select when the employee begins to accrue time off, either + {guilabel}`At the start of the accrual period` or {guilabel}`At the end of the accrual period`. + +- {guilabel}`Carry-Over Time`: Select when the employee received previously earned time. The options + are: + + - {guilabel}`At the start of the year`: Select this if the accrual rolls over on January 1 of the + upcoming year. + - {guilabel}`At the allocation date`: Select this if the accrual rolls over as soon as time is + allocated to the employee. + - {guilabel}`Other`: Select this option if neither of the other two options are applicable. When + selected, a {guilabel}`Carry-Over Date` field appears. Select the date using the two drop-down + menus, one for the day and one for the month. + +- {guilabel}`Based on worked time`: Enable this option if time off accrual is determined by the + employee's worked hours. Days **not** considered as worked time do **not** contribute to the + accrual plan in Odoo. + + ```{eval-rst} + .. 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). + + 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`. + + 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. + ``` + +- {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 + when employees move up to a new milestone. If they qualify to change milestones in the middle of a + 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 + 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)= + +##### Rules + +Rules must be created in order for employees to accrue time off from the accrual plan. + +To create a new rule, click the {guilabel}`New Milestone` button in the gray {guilabel}`Rules` +section, and a {guilabel}`Create Milestone` modal form appears. + +Fill out the following fields on the form: + +- {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 + the drop-down menu. + + Next, enter the numerical amount of the selected parameter that is accrued. The numerical format + is `X.XXXX`, so that partial days or hours can also be configured. + + Last, select how often the time is accrued using the drop-down menu. The default options are + {guilabel}`Hourly`, {guilabel}`Daily`, {guilabel}`Weekly`, {guilabel}`Twice a month`, + {guilabel}`Monthly`, {guilabel}`Twice a year`, and {guilabel}`Yearly`. + + 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 + 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`. + + 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. + + 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`. + +- {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}`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. + +:::{important} +If the {guilabel}`Carry over` field is set to {guilabel}`None. Accrued time reset to 0`, that +rule *overrides* the {guilabel}`Carry-Over Time` set on the accrual plan. + +If a company creates an accrual plan, granting employees time off {guilabel}`At the start of the +accrual period` (i.e., the beginning of the year), and sets the {guilabel}`Carry-Over Time` on +the *accrual plan* to {guilabel}`At the start of the year`, it allows unused vacation time to +rollover to the following year. + +Then, the company adds rules to the accrual plan, allocating five days of vacation, annually, on +the first of the year (one week of vacation allocated on January 1st). + +If the {guilabel}`Carry over` field is set to {guilabel}`None. Accrual time reset to 0` on the +{guilabel}`Create Milestone` pop-up for, any unused vacation time *does not* carry over, even +though on the {guilabel}`Accrual Plan` form, the {guilabel}`Carry-Over Time` is set to +{guilabel}`At the start of the year`. + +The carry over set on the *rule* takes precedence over the carry over set on the *accrual plan +form*. +::: + +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. +``` + +(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. + +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). + +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. + +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 + +To create a public holiday, navigate to {menuselection}`Time Off app --> Configuration --> Public +Holidays`. + +All currently configured public holidays appear in a list view. + +Click the {guilabel}`New` button, and a new line appears at the bottom of the list. + +Enter the following information on that new line: + +- {guilabel}`Name`: Enter the name of the holiday. + +- {guilabel}`Company`: If in a multi-company database, the current company populates this field by + default. It is **not** possible to edit this field. + + :::{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 + list, to the far-right of the column titles, and activate the {guilabel}`Company` selection + from the drop-down menu that appears. + ::: + +- {guilabel}`Start Date`: Using the date and time picker, select the date and time the holiday + 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. + +- {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 + schedules `). If the user's computer is set to a different time zone, the + start time is adjusted accordingly, compared to the company's time zone. + + ```{eval-rst} + .. example:: + A company located in San Francisco operates from 9:00 AM - 6:00 PM, with an eight hour work day + and one hour lunch break. + + For a user in New York, with a computer time zone set to Eastern Standard Time, a created + public holiday displays a start time of 12:00 PM - 9:00 PM, accounting for the three hour time + zone difference. + + Similarly, a user located in Los Angeles, with a computer time zone set to Pacific Standard + Time, sees a public holiday time as 9:00 AM - 6:00 PM. + ``` + +- {guilabel}`Working Hours`: If the holiday should only apply to employees who have a specific set + of working hours, select the working hours from the drop-down menu. If left blank, the holiday + applies to all employees. + +- {guilabel}`Work Entry Type`: If using the **Payroll** app, this field defines how the {ref}`work + entries ` for the holiday appear. Select the work entry type from the + drop-down menu. + +```{image} time_off/holidays.png +:align: center +:alt: The list of public holidays in the configuration menu. +``` + +### Mandatory days + +Some companies have special days where specific departments, or the entire staff, is required to be +present, and time off is not allowed on those specific days. + +These types of days are called *mandatory days* in Odoo. These can be configured to be company-wide, +or department specific. When configured, employees in the specified department or company are unable +to submit time off requests for these mandatory days. + +#### Create mandatory days + +No mandatory days are configured in Odoo by default. To create a mandatory day, navigate to +{menuselection}`Time Off app --> Configuration --> Mandatory Days`. + +Click the {guilabel}`New` button in the top-left corner, and a blank line appears in the list. + +Enter the following information on that new line: + +- {guilabel}`Name`: Enter the name of the mandatory day. + +- {guilabel}`Company`: If in a multi-company database, this field is visible, and the current + company populates this field, by default. Using the drop-down menu, select the company the + mandatory day is for. + +- {guilabel}`Departments`: This column is hidden by default. First, click the + {icon}`oi-settings-adjust` {guilabel}`(additional options)` icon in the top-right corner, next to + {guilabel}`Color`, and then tick the checkbox next to {guilabel}`Departments` to reveal that + column. + + Next, select the desired departments from the drop-down menu. Multiple departments can be + selected, and there is no limit to the amount of departments that can be added. + + If this field is left blank, the mandatory day applies to the entire company. + +- {guilabel}`Start Date`: Using the calendar picker, select the date the mandatory day starts. + +- {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. + +```{image} time_off/mandatory.png +:align: center +:alt: The Mandatory Days section with three configured days. +``` + +## 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. + +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 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. + +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 {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. + +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. + +The status of the time off is represented by the color detail of the request, either appearing solid +(*validated*) or striped (*to approve*). + +The number of days or hours requested is written on the request (if there is enough space). + +At the bottom of the calendar, in the {guilabel}`Total` line, a bar graph shows how many people are +projected to be out on any given day. The number on each individual bar represents the number of +employees out for those highlighted days. + +Click on a time off entry to view the details for the specific time off entry. The total number of +hours or days are listed, along with the start and end time of the time off. To view the details of +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` +::: + +```{toctree} +:titlesonly: true + +time_off/allocations +time_off/request_time_off +time_off/my_time +time_off/management +``` + diff --git a/content/applications/hr/time_off/allocations.md b/content/applications/hr/time_off/allocations.md new file mode 100644 index 000000000..cdd7153cb --- /dev/null +++ b/content/applications/hr/time_off/allocations.md @@ -0,0 +1,183 @@ +# Allocations + +Once {ref}`time off types ` and {ref}`accrual plans +` have been configured, the next step is to *allocate*, or give, time off to +employees. + +The *Allocations* page of the **Time Off** app is **only** visible to users who have either *Time +Off Officer* or *Administrator* access rights for the **Time Off** application. For more information +on access rights, refer to the {doc}`access rights <../../general/users/access_rights/>` +documentation. + +(time-off-allocation-form)= + +## Allocate time off + +To create a new allocation, navigate to {menuselection}`Time Off app --> Management --> +Allocations`. + +This presents a list of all current allocations, including their respective statuses. + +Click {guilabel}`New` to allocate time off, and a blank {guilabel}`Allocation` form appears. + +After entering a name for the allocation on the first blank field of the form, enter the following +information: + +- {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}`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`. + +- {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 + labeled {guilabel}`Start Date`. + + The current date populates the first date field, by default. To select another date, click on the + pre-populated date to reveal a popover calendar window. Navigate to the desired start date for the + 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. + + 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}`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. + +```{image} allocations/new-allocation.png +:alt: |- +: A new allocation form with all the fields filled out for the annual two week vacation +: granted to all employees. +``` + +### Multiple Allocations + +When allocating time off, it is common to allocate time to several employees at once. This is done +using the {guilabel}`Multiple Requests` feature. + +To allocate time to multiple employees in a single allocation, navigate to {menuselection}`Time Off +app --> Management --> Allocations`. Then, click the {icon}`fa-gear` {guilabel}`(Actions)` icon in +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. + +Using the drop-down menu, select one of the following {guilabel}`Modes`: + +- {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 + {guilabel}`Employees` field. Select the employees to receive the allocation in the + {guilabel}`Employees` field. There is no limit to the amount of employees that can be selected. +- {guilabel}`By Company`: This option allows for the selection of all employees within a specific + company. Selecting this reveals a {guilabel}`Company` field. Select the {guilabel}`Company` to + assign the allocation to. Only one company can be assigned in the {guilabel}`Company` field. When + a company is selected, *all* employees within the company receive the allocation. +- {guilabel}`By Department`: This option allows for the selection of all employees within a specific + department. Selecting this reveals a {guilabel}`Department` field. Select the + {guilabel}`Department` to assign the allocation to. Only one department can be assigned in the + {guilabel}`Department` field. When a department is selected, *all* employees within the department + receive the allocation. +- {guilabel}`By Employee Tag`: This option allows for the selection of all employees with a specific + tag. Selecting this reveals an {guilabel}`Employee Tag` field. Select the desired + {guilabel}`Employee Tag` to select all employees with that tag. Only one tag can be assigned in + the {guilabel}`Employee Tag` field. When a tag is selected, *all* employees with that tag receive + the allocation. + +Next, select the {guilabel}`Time Off Type` using the drop-down menu. Once a {guilabel}`Time Off +Type` is selected, the placeholder name, 'Allocation Request', changes to the name of the selected +{guilabel}`Time Off Type`, including the amount of days. Change the name of the allocation, if +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. +``` + +(time-off-request-allocation)= + +## Request allocation + +If an employee has used all their time off, or will run out of time off, they can request an +allocation for additional time. Allocations can be requested in one of two ways, either from the +{ref}`Dashboard ` or the {ref}`My Allocations ` view. + +To create a new allocation request, click either the {guilabel}`New Allocation Request` button on +the main **Time Off** dashboard, or the {guilabel}`New` button in the {guilabel}`My Allocations` +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. +::: + +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}`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`). +- {guilabel}`Allocation`: Enter the amount of time being requested in this field. The format is + presented in either {guilabel}`Days` or {guilabel}`Hours`, depending on how the {guilabel}`Time + Off Type` is configured. Once this field is populated, the name of the allocation request is + updated to include the amount of time being requested. +- {guilabel}`Add a reason...`: Enter a description for the allocation request in this field. This + should include any details that approvers may need to approve the request. + +If the request was created from the {guilabel}`Dashboard`, click the {guilabel}`Save & Close` button +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. + +```{image} allocations/allocation-request.png +:alt: |- +: An allocation request form filled out for an employee requesting an additional week of +: sick time. +``` + diff --git a/content/applications/hr/time_off/management.md b/content/applications/hr/time_off/management.md new file mode 100644 index 000000000..1e5c9e649 --- /dev/null +++ b/content/applications/hr/time_off/management.md @@ -0,0 +1,150 @@ +# Management + +(time-off-approvals)= + +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. + +Only people who can approve allocation and time off requests have the {guilabel}`Management` section +visible in the *Time Off* application. + +(time-off-manage-time-off)= + +## Manage time off + +To view time off requests that need approval, navigate to {menuselection}`Time Off app --> +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* +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`. + +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 +{guilabel}`Department` headings. + +Since only time off requests that need to be approved are shown, the only {guilabel}`Status` options +are {guilabel}`All`, {guilabel}`To Approve`, and {guilabel}`Second Approval`. + +The various departments the user is a member of, and manages employees under, also appear on the +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. +::: + +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. + +The status column displays the status of each request, with the status highlighted in a specific +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. + +{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. + +To approve a time off request, click the {icon}`fa-thumbs-up` {guilabel}`Approve` button at the end +of the line. + +To validate a time off request that has already been approved, and is waiting on a second approval, +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 at the far end of 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` +{guilabel}`Approve`, {icon}`fa-check` {guilabel}`Validate` icon, and {icon}`fa-times` +{guilabel}`Refuse` buttons). Doing so loads that specific time off request form. Depending on the +rights of the user, changes can be made. + +To modify the request, make any desired changes to the form. All changes are automatically saved. + +It is also possible to approve, validate, or refuse the request from this form. Click the +{guilabel}`Approve` button to approve, the {guilabel}`Validate` button to validate, or the +{guilabel}`Refuse` button to refuse the request. + +(time-off-manage-allocations)= + +## Manage allocations + +To view allocations that need approval, navigate to {menuselection}`Time Off app --> Management --> +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. + +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 left side of the {guilabel}`Allocations` page has various grouping options to narrow down the +presented allocation requests. + +The {guilabel}`Status` options are: {guilabel}`All`, {guilabel}`To Approve`, {guilabel}`Refused`, +and {guilabel}`Approved`. Click on a specific {guilabel}`Status` to view only requests with that +specific status. + +To view all allocation requests, regardless of status, click {guilabel}`All` under the +{guilabel}`Status` heading. + +It is also possible to display allocation requests by department. Click on the desired +{guilabel}`Department` on the left side of the {guilabel}`Allocations` page, to only present +allocations for that specific department. + +:::{note} +The groupings on the left side **only** present allocation requests that fall under the default +filters of {guilabel}`My Team` and {guilabel}`Active Employee`, if those default filters are not +removed from the {guilabel}`Search...` bar. Only the statuses for allocation requests that fall +under those filters are presented on the left side. + +For example, if there are no requests with a status of {guilabel}`To Submit`, that status option +does not appear in the left-hand side of the {guilabel}`Allocations` page. + +All departments for the user's employees appear in the list. If there are no allocation requests +that fall under that department matching the preconfigured filters, the list is blank. + +It is always possible to remove any of the preconfigured filters, by clicking the +{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. + +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. + +```{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 +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` +button to approve, or the {guilabel}`Refuse` button to refuse the request. + diff --git a/content/applications/hr/time_off/my_time.md b/content/applications/hr/time_off/my_time.md new file mode 100644 index 000000000..24f4e638e --- /dev/null +++ b/content/applications/hr/time_off/my_time.md @@ -0,0 +1,114 @@ +# My time + +The *My Time* menu of the *Time Off* application 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. + +(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 +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. + +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 +corresponding view. + +:::{note} +To change the displayed dates, click the {icon}`fa-arrow-left` {guilabel}`(left arrow)` or +{icon}`fa-arrow-right` {guilabel}`(right arrow)` icons to the left of the {guilabel}`Year` +button. The calendar view adjusts in increments of the selected view. + +For example, if {guilabel}`Year` is selected, the arrows adjust the view by one year. + +To reset the view, so it includes the current date, click the {guilabel}`Today` button. +::: + +Above the calendar view is a summary of the user's time off balances. Every time off type that has +been allocated appears in its own summary box. Each summary lists the type of time off, the +corresponding icon, the current available balance (in hours or days), and an expiration date (if +applicable). + +To view the full details of a time off balance, click the {icon}`fa-question-circle-o` +{guilabel}`(question mark)` icon at the end of the {guilabel}`(DAYS/HOURS) AVAILABLE` on the time +off summary. The complete details are presented in a popover window, including the +{guilabel}`Allocated` time, {guilabel}`Accrual (Future)` time, {guilabel}`Approved` time off +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 +point. On the right side of the time off summary blocks, there is a {guilabel}`Balance at the +(date)` field. Click on the date, and a calendar selector popover appears. + +:::{note} +The {guilabel}`Balance at the (date)` field **only** appears if the user is accruing time off +through an {ref}`accrual plan `. +::: + +The current date is the default date selected. Navigate to the desired date, and Odoo displays the +time off balances the user should have on that date. This takes into account all time off currently +planned and approved. To return to the current date, click the {guilabel}`Today` button to the right +of the date field. + +On the right side of the calendar, the various time off types are displayed, each with their own +corresponding color. The {guilabel}`Legend` explains how the various statuses for time off requests +are presented. + +Time off that has been validated appears in a solid color. Time off requests that still are still in +the {guilabel}`To Approve` stage, appear with white stripes in the color. {guilabel}`Refused` time +off requests have a line through the dates. + +The color for each request corresponds to the specified color set with the various time off types, +listed in the section above the {guilabel}`Legend`. + +New time off requests can be made from the {guilabel}`Dashboard`. Click the {guilabel}`New` button +in the upper-left corner, and a {doc}`New Time Off ` pop-up window appears. + +New allocation requests can also be made from the {guilabel}`Dashboard`. Click the {guilabel}`New +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. + +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 +{guilabel}`Status`. + +A new time off request can be made from this view. Click the {guilabel}`New` button to +{doc}`request_time_off`. + +(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`. + +A new allocation request can be made from this view, as well. Click the {guilabel}`New` button to +{ref}`request an allocation `. + diff --git a/content/applications/hr/time_off/request_time_off.md b/content/applications/hr/time_off/request_time_off.md new file mode 100644 index 000000000..4af7ba30d --- /dev/null +++ b/content/applications/hr/time_off/request_time_off.md @@ -0,0 +1,75 @@ +# Request time off + +Once time off has been allocated to an employee, a request to use it can be submitted. + +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`). + +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. + +:::{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. +::: + +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 + 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, + and the dates between them are highlighted (if applicable). + + If only requesting time off for a single day, click on the start date, then click the same date + again for the end date. + + When the correct dates are selected, click the {guilabel}`Apply` button. + + The selected dates now populate the two portions of the {guilabel}`Dates` field. + + 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 + 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 + 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 + 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. + + 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. +``` + diff --git a/content/applications/inventory_and_mrp.md b/content/applications/inventory_and_mrp.md new file mode 100644 index 000000000..c81838b67 --- /dev/null +++ b/content/applications/inventory_and_mrp.md @@ -0,0 +1,17 @@ +--- +nosearch: true +--- + +# Supply Chain + +```{toctree} +inventory_and_mrp/inventory +inventory_and_mrp/manufacturing +inventory_and_mrp/purchase +inventory_and_mrp/barcode +inventory_and_mrp/quality +inventory_and_mrp/maintenance +inventory_and_mrp/plm +inventory_and_mrp/repairs +``` + diff --git a/content/applications/inventory_and_mrp/barcode.md b/content/applications/inventory_and_mrp/barcode.md new file mode 100644 index 000000000..1f007c11e --- /dev/null +++ b/content/applications/inventory_and_mrp/barcode.md @@ -0,0 +1,25 @@ +--- +hide-page-toc: true +nosearch: true +show-content: true +show-toc: true +--- + +# Barcode + +**Odoo Barcode** allows users to assign barcodes to individual products and product categories, and +track inventory movements using those barcodes. By connecting a barcode scanner, certain inventory +processes can be triggered by scanning barcodes. + +:::{seealso} +[Odoo Tutorials: Barcode](https://www.odoo.com/slides/barcode-30) +::: + +```{toctree} +:glob: true +:titlesonly: true + +barcode/setup +barcode/operations +``` + diff --git a/content/applications/inventory_and_mrp/barcode/operations.md b/content/applications/inventory_and_mrp/barcode/operations.md new file mode 100644 index 000000000..4525ab24a --- /dev/null +++ b/content/applications/inventory_and_mrp/barcode/operations.md @@ -0,0 +1,19 @@ +--- +nosearch: true +--- + +# Daily operations + +```{toctree} +:glob: true +:titlesonly: true + +operations/adjustments +operations/receipts_deliveries +operations/process_transfers +operations/transfers_scratch +operations/barcode_nomenclature +operations/gs1_nomenclature +operations/gs1_usage +``` + diff --git a/content/applications/inventory_and_mrp/barcode/operations/adjustments.md b/content/applications/inventory_and_mrp/barcode/operations/adjustments.md new file mode 100644 index 000000000..ef00af51d --- /dev/null +++ b/content/applications/inventory_and_mrp/barcode/operations/adjustments.md @@ -0,0 +1,156 @@ +# Apply inventory adjustments with barcodes + +In a warehouse, the recorded inventory counts in the database might not always match the actual, +real inventory counts. In such cases, inventory adjustments can be made to reconcile the +differences, and ensure that the recorded counts in the database match the actual counts in the +warehouse. In Odoo, the *Barcode* app can be used to make these adjustments. + +These adjustments can be done in real time using an Odoo-compatible barcode scanner or the Odoo +mobile app. + +:::{note} +For a list of Odoo-compatible barcode mobile scanners, and other hardware for the *Inventory* and +*Barcode* apps, refer to the [Odoo Inventory • Hardware page](https://www.odoo.com/app/inventory-hardware). +::: + +:::{seealso} +{doc}`../../inventory/warehouses_storage/inventory_management/count_products` +::: + +## Enable Barcode app + +To use the *Barcode* app to create and apply inventory adjustments, it **must** be installed by +enabling the feature from the settings of the *Inventory* app. + +To do so, go to the {menuselection}`Inventory app --> Configuration --> Settings`. Then, scroll down +to the {guilabel}`Barcode` section, and click the checkbox next to the {guilabel}`Barcode Scanner` +option. + +Once the checkbox is ticked, click {guilabel}`Save` at the top of the page to save changes. + +After saving, a new drop-down menu appears under the {guilabel}`Barcode Scanner` option, labeled +{guilabel}`Barcode Nomenclature`, where either {guilabel}`Default Nomenclature` or +{guilabel}`Default GS1 Nomenclature` can be selected. Each nomenclature option determines how +scanners interpret barcodes in Odoo. + +There is also a {guilabel}`Configure Product Barcodes` internal link arrow, along with a set of +{guilabel}`Print` buttons for printing barcode commands and a barcode demo sheet. + +```{image} adjustments/adjustments-barcode-setting.png +:align: center +:alt: Enabled Barcode feature in Inventory app settings. +``` + +:::{seealso} +For more information on setting up and configuring the {guilabel}`Barcode` app, refer to the +{doc}`Set up your barcode scanner <../setup/hardware>` and {doc}`Activate the Barcodes in Odoo +<../setup/software>` docs. +::: + +## Perform an inventory adjustment + +Begin by navigating to the {menuselection}`Barcode app --> Barcode Scanning` dashboard, where +different options will be displayed, including {guilabel}`Operations`, {guilabel}`Inventory +Adjustments`, and {guilabel}`Batch Transfers`. + +To create and apply inventory adjustments, click on the {guilabel}`Inventory Adjustments` button at +the bottom of the screen. + +Doing so navigates to the *Barcode Inventory Client Action* page, labeled as {guilabel}`Inventory +Adjustment` in the top header section. + +```{image} adjustments/adjustments-barcode-scanner.png +:align: center +:alt: Barcode app start screen with scanner. +``` + +To begin the adjustment, first scan the *source location*, which is the current location in the +warehouse of the product whose count should be adjusted. Then, scan the product barcode(s). + +The barcode of a specific product can be scanned multiple times to increase the quantity of that +product in the adjustment. + +:::{tip} +If the warehouse *multi-location* feature is **not** enabled in the database, a source location +does not need to be scanned. Instead, simply scan the product barcode to start the inventory +adjustment. +::: + +Alternatively, the quantity can be changed by clicking the {guilabel}`✏️ (pencil)` icon on the far +right of the product line. + +Doing so opens a separate window with a keypad. Edit the number in the {guilabel}`Quantity` line to +change the quantity. Additionally, the {guilabel}`+1` and {guilabel}`-1` buttons can be clicked to +add or subtract quantity of the product, and the number keys can be used to add quantity, as well. + +```{eval-rst} +.. example:: + In the below inventory adjustment, the source location `WH/Stock/Shelf/2` was scanned, assigning + the location. Then, the barcode for the product `[FURN_7888] Desk Stand with Screen` was scanned + 3 times, increasing the units in the adjustment. Additional products can be added to this + adjustment by scanning the barcodes for those specific products. + + .. image:: adjustments/adjustments-barcode-inventory-client-action.png + :align: center + :alt: Barcode Inventory Client Action page with inventory adjustment. +``` + +To complete the inventory adjustment, click the green {guilabel}`✅ Apply` button with the check mark +at the bottom of the page. + +Once applied, Odoo navigates back to the {guilabel}`Barcode Scanning` screen. A small green banner +appears in the top right corner, confirming validation of the adjustment. + +:::{admonition} Did you know? +Odoo's *Barcode* application provides demo data with barcodes to explore the features of the app. +These can be used for testing purposes, and can be printed from the home screen of the app. + +To access this demo data, navigate to the {menuselection}`Barcode app` and click {guilabel}`stock +barcodes sheet` and {guilabel}`commands for Inventory` (bolded and highlighted in blue) in the +information pop-up window above the scanner. + +```{image} adjustments/adjustments-barcode-stock-sheets.png +:align: center +:alt: Demo data prompt pop-up on Barcode app main screen. +``` +::: + +## Manually add products to inventory adjustment + +When the barcodes for the location or product are not available, Odoo *Barcode* can still be used to +perform inventory adjustments. + +To do this, navigate to the {menuselection}`Barcode app --> Barcode Scanning --> Inventory +Adjustments`. + +Doing so navigates to the *Barcode Inventory Client Action* page, labeled as {guilabel}`Inventory +Adjustment` in the top header section. + +To manually add products to this adjustment, click the white {guilabel}`➕ Add Product` button at the +bottom of the screen. + +This navigates to a new, blank page where the desired product, quantity, and source location must be +chosen. + +> ```{image} adjustments/adjustments-keypad.png +> :align: center +> :alt: Keypad to add products on Barcode Inventory Client Action page. +> ``` + +First, click the {guilabel}`Product` line, and choose the product whose stock count should be +adjusted. Then, manually enter the quantity of that product, either by changing the `1` in the +{guilabel}`Quantity` line, or by clicking the {guilabel}`+1` and {guilabel}`-1` buttons to add or +subtract quantity of the product. The number pad can be used to add quantity, as well. + +Below the number pad is the {guilabel}`location` line, which should read `WH/Stock` by default. +Click this line to reveal a drop-down menu of locations to choose from, and choose the +{guilabel}`source location` for this inventory adjustment. + +Once ready, click {guilabel}`Confirm` to confirm the changes. + +To apply the inventory adjustment, click the green {guilabel}`✅ Apply` button with the check mark, +at the bottom of the page. + +Once applied, Odoo navigates back to the {guilabel}`Barcode Scanning` screen. A small green banner +appears in the top right corner, confirming validation of the adjustment. + diff --git a/content/applications/inventory_and_mrp/barcode/operations/barcode_nomenclature.md b/content/applications/inventory_and_mrp/barcode/operations/barcode_nomenclature.md new file mode 100644 index 000000000..d00944df4 --- /dev/null +++ b/content/applications/inventory_and_mrp/barcode/operations/barcode_nomenclature.md @@ -0,0 +1,256 @@ +--- +substitutions: + EAN: '{abbr}`EAN (European Article Number)`' + GTIN: '{abbr}`GTIN (Global Trade Item Number)`' + GTINs: '{abbr}`GTINs (Global Trade Item Numbers)`' + UPC: '{abbr}`UPC (Universal Product Code)`' +--- + +# Default barcode nomenclature + +*Barcode nomenclatures* define how barcodes are recognized and categorized. When a barcode is +scanned, it is associated to the **first** rule with a matching pattern. The pattern syntax is +described in Odoo's nomenclature list using a regular expression, and a barcode is successfully read +by Odoo if its prefix and/or length matches the one defined in the barcode's rule. + +For instance, at a {doc}`Point of Sale <../../../sales/point_of_sale>` station, product weight +barcodes in the European Article Number (EAN) format, which begin with `21` and have five digits +specifying the weight, are used to weigh products and generate a barcode depicting the weight and +price. The `21` and five-digit weight is the barcode pattern used to identify the barcode and can be +customized to ensure Odoo correctly interprets all barcodes for the business. + +:::{note} +Barcodes are also commonly used with Odoo's **Inventory** and **Barcode** apps. +::: + +Odoo **Barcode** supports {{ EAN }}, Universal Product Code (UPC), and {doc}`GS1 ` +formats. This document exclusively focuses on {ref}`default rules and patterns in Odoo +`, which use {{ UPC }} and {{ EAN }} encoding. + +:::{important} +To use {{ UPC }} and {{ EAN }} barcodes for uniquely identifying products across the entire supply chain, +they **must** be [purchased from GS1](https://www.gs1.org/standards/get-barcodes). + +In Odoo, custom barcode patterns can be defined to recognize barcodes specific to the company. +Barcodes do not need to be purchased if used only within the company, such as in the +{ref}`example ` where the barcode is written in the {{ EAN }} +format. +::: + +## Configuration + +To use default nomenclature, navigate to {menuselection}`Inventory app --> Configuration --> +Settings`. Under the {guilabel}`Barcode` section, tick the {guilabel}`Barcode Scanner` checkbox. +Doing so installs the **Barcode** app in the database. + +Next, in the {guilabel}`Barcode Nomenclature` field, ensure {guilabel}`Default Nomenclature` is +selected. Then, click {guilabel}`Save`. + +```{image} barcode_nomenclature/enable-nomenclature.png +:align: center +:alt: Enabled barcode setting with Default Nomenclature selected. +``` + +With the **Barcode** module installed, and the {guilabel}`Default Nomenclature` selected, the +barcode actions using {{ UPC }} and {{ EAN }}, detailed in the {ref}`default nomenclature list +`, are available for use. And, by default, Odoo +automatically handles {{ UPC }}/{{ EAN }} conversion. + +(barcode-operations-product-weight)= + +## Example: product weight barcode + +To better understand how barcode nomenclature is used to identify products in Odoo, this example +where product weight barcodes in {{ EAN }} format are used to allow a {doc}`Point of Sale +<../../../sales/point_of_sale>` business to automatically print barcodes, and calculate the price +using the weight of the item. + +To set up barcodes for weighted products, the following rule is used: + +```{eval-rst} +.. list-table:: + :header-rows: 1 + + * - Rule Name + - Barcode Pattern + - Field in Odoo + * - Weighted Barcodes 3 Decimals + - (21)....{NNDDD} + - :guilabel:`Barcode` field on product form +``` + +```{eval-rst} +.. example:: + To better understand the barcode pattern for weighted products, consider the barcode, + `2112345000008`: + + - `21`: code that identifies this a barcode for weighted products. + - `12345`: five digits (denoted by `.....` in the table above) that identify the product. + - `00000`: five digits (denoted by `{NNDDD}` in the table) representing the weight of the + product. On the product form, the five weight values **must** be `00000`. The first two digits + are whole number values, and the last three digits are decimal values. For example, "13.5 + grams" in the `{NNDDD}` format is `13500`. + - `8`: `check digit `_ for `211234500000`. + + Together, these components make up a 13-character |EAN| - 13 barcode. +``` + +To configure the product barcode for `Pasta Bolognese`, the {{ EAN }} barcode for weighted products, +`2112345000008`, is entered in the {guilabel}`Barcode` field on the product form (accessible by +going to {menuselection}`Inventory app --> Products --> Products`, and selecting the desired +product). In addition, the {guilabel}`Unit of Measure` is set to {guilabel}`kg`. + +```{image} barcode_nomenclature/barcode.png +:align: center +:alt: Barcode field on the product form. +``` + +Next, a customer's bowl of pasta is weighed to be `1.5` kilograms. This generates a new barcode for +the pasta, according to the weight: `211234501500`, which has a check digit of `2`. The new barcode +is `2112345015002`. + +```{image} barcode_nomenclature/weighted-barcode.png +:align: center +:alt: Generated barcode that includes a weight of 1.5 kg. +``` + +Ensure the products scan properly, by navigating to the {menuselection}`Barcode app --> Operations`. +Next, click any operation type, such as {guilabel}`Receipts`. Then, click the {guilabel}`New` button +to create a draft stock move. Scan the product weight barcode, such as `2112345015002`, and if the +intended product appears, the barcode setup is correct. + +```{image} barcode_nomenclature/barcode-scan.png +:align: center +:alt: Show successfully scanned barcode. +``` + +## Create rules + +:::{important} +Adding new rules is necessary for {{ UPC }} and {{ EAN }} formats that are **not** in Odoo's default +list, since barcodes cannot be read successfully if there are unknown fields. + +> While new rules can be created, Odoo fields do **not** auto-populate with information from these +> rules. [Custom development](https://www.odoo.com/appointment/132) is required for this +> functionality. +::: + +To create a rule, first enable {ref}`developer mode `. Then, navigate to +{menuselection}`Inventory app --> Configuration --> Barcode Nomenclatures`, and select +{guilabel}`Default Nomenclature`. + +On this page, configure the following optional fields: + +- {guilabel}`UPC/EAN Conversion`: determines if a {{ UPC }}/{{ EAN }} barcode should be automatically + converted when matching a rule with another encoding. Options include {guilabel}`Always` (the + default option), {guilabel}`Never`, {guilabel}`EAN-13 to UPC-A`, and {guilabel}`UPC-A to EAN-13`. +- {guilabel}`Is GS1 Nomenclature`: ensure this checkbox is **not** ticked, as the + {guilabel}`Default Nomenclature` uses {{ UPC }} and {{ EAN }} encoding, *not* GS1 encoding. + +```{image} barcode_nomenclature/rule-config.png +:align: center +:alt: Default Nomenclature page setting fields. +``` + +On the {guilabel}`Default Nomenclature` page, click {guilabel}`Add a line` at the bottom of the +table, which opens a {guilabel}`Create Rules` pop-up window to create a new rule. + +The {guilabel}`Rule Name` field is used internally to identify what the barcode represents. + +The {guilabel}`Sequence` field represents the priority of the rule; meaning the smaller the value, +the higher the rule appears on the table. + +The barcode {guilabel}`Type` field represents different classifications of information that can be +understood by the system (e.g., {guilabel}`Package`, {guilabel}`Lot`, {guilabel}`Location`, +{guilabel}`Coupon`, etc.). + +The {guilabel}`Encoding` field specifies which encoding the barcode uses. This rule **only** applies +if the barcode uses this specific encoding. The available {guilabel}`Encoding` options are: +{guilabel}`EAN-13`, {guilabel}`EAN-8`, {guilabel}`UPC-A`, and {guilabel}`GS1-28`. + +The {guilabel}`Barcode Pattern` field represents how the sequence of letters or numbers is +recognized by the system to contain information about the product. Sometimes, when a certain amount +of digits are required, the number of `.` is shown. `N` represents whole number digits, and `D` +represent decimal digits. + +```{eval-rst} +.. example:: + `1...` represents any 4-digit number that starts with 1. `NNDD` represents a two digit number + with two decimal points. For example, `14.25` is 1425. +``` + +After filling in the information, click the {guilabel}`Save & New` button to save the rule, and +instantly start creating another rule. Or, click {guilabel}`Save & Close` to save the rule, and +return to the table of rules. + +(barcode-operations-default-nomenclature-list)= + +## Default nomenclature list + +The table below contains Odoo's list of {guilabel}`Default Nomenclature` rules. Barcode patterns are +written in regular expressions. + +```{eval-rst} +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - Rule Name + - Type + - Encoding + - Barcode Pattern + * - Price Barcodes 2 Decimals + - Priced Product + - EAN-13 + - 23.....{NNNDD} + * - Discount Barcodes + - Discounted Product + - Any + - 22{NN} + * - Weight Barcodes 3 Decimals + - Weighted Product + - EAN-13 + - 21.....{NNDDD} + * - Customer Barcodes + - Client + - Any + - 042 + * - Coupon & Gift Card Barcodes + - Coupon + - Any + - 043|044 + * - Cashier Barcodes + - Cashier + - Any + - 041 + * - Location barcodes + - Location + - Any + - 414 + * - Package barcodes + - Package + - Any + - PACK + * - Lot barcodes + - Lot + - Any + - 10 + * - Magnetic Credit Card + - Credit Card + - Any + - %.* + * - Product Barcodes + - Unit Product + - Any + - .* +``` + +:::{note} +When the {guilabel}`Barcode Pattern` contains `.*`, it means it can contain any number or type of +characters. +::: + +:::{seealso} +{doc}`gs1_nomenclature` +::: + diff --git a/content/applications/inventory_and_mrp/barcode/operations/gs1_nomenclature.md b/content/applications/inventory_and_mrp/barcode/operations/gs1_nomenclature.md new file mode 100644 index 000000000..5c6f1082d --- /dev/null +++ b/content/applications/inventory_and_mrp/barcode/operations/gs1_nomenclature.md @@ -0,0 +1,197 @@ +--- +substitutions: + AI: '{abbr}`A.I. (Application Identifier)`' + GTIN: '{abbr}`GTIN (Global Trade Item Number)`' + GTINs: '{abbr}`GTINs (Global Trade Item Numbers)`' +--- + +# GS1 barcode nomenclature + +(barcode/operations/gs1)= + +[GS1 nomenclature](https://www.gs1us.org/) consolidates various product and supply chain data into +a single barcode. Odoo takes in [unique Global Trade Item Numbers](https://www.gs1.org/standards/get-barcodes) (GTIN), purchased by businesses, to enable global +shipping, sales, and eCommerce product listing. + +Configure GS1 nomenclature to scan barcodes of sealed boxes and identify essential product +information, such as {{ GTIN }}, lot number, quantity information, and more. + +:::{important} +{{ GTINs }} are unique product identification that **must** be [purchased from GS1](https://www.gs1.org/standards/get-barcodes) to use GS1 barcodes. +::: + +:::{seealso} +- [All GS1 barcodes](https://www.gs1.org/standards/barcodes/application-identifiers) +- {ref}`Odoo's default GS1 rules ` +- {ref}`Why's my barcode not working? ` +::: + +(barcode-operations-set-up-barcode-nomenclature)= + +## Set up barcode nomenclature + +To use GS1 nomenclature, navigate to the {menuselection}`Inventory app --> Configuration --> +Settings`. Then under the {guilabel}`Barcode` section, check the {guilabel}`Barcode Scanner` box. +Next, select {menuselection}`Barcode Nomenclature --> Default GS1 Nomenclature` from the default +barcode nomenclature options. + +```{image} gs1_nomenclature/setup-gs1-nomenclature.png +:align: center +:alt: Choose GS1 from dropdown and click the external link to see the list of GS1 rules. +``` + +The list of GS1 *rules* and *barcode patterns* Odoo supports by default is accessible by clicking +the {guilabel}`➡️ (arrow)` icon to the right of the {guilabel}`Barcode Nomenclature` selection. + +In the {guilabel}`Open: Nomenclature` pop-up table, view and edit the GS1 {guilabel}`Rule Names` +available in Odoo. The table contains all the information that can be condensed with a GS1 barcode, +along with the corresponding {guilabel}`Barcode Pattern`. + +:::{tip} +After setting GS1 as the barcode nomenclature, the {menuselection}`Barcode Nomenclatures` +settings can also be accessed by a hidden menu that's discoverable after enabling {ref}`developer +mode `. Once enabled, navigate to the {menuselection}`Inventory app --> +Configuration --> Barcode Nomenclatures` menu and finally, select {guilabel}`Default GS1 +Nomenclature`. +::: + +(barcode-operations-create-gs1-barcode)= + +## Use GS1 barcodes in Odoo + +For product identification using GS1 barcodes in Odoo, businesses obtain a [unique GTIN](https://www.gs1.org/standards/get-barcodes) as an internationally distinct product identifier +purchased from GS1. This {{ GTIN }} is combined with specific product details following GS1's designated +*barcode pattern*. The barcode pattern's arrangement of numbers and letters must adhere to GS1 +conventions for accurate interpretation by global systems along the supply chain. + +Every barcode starts with a 2-4 digit [application identifier](https://www.gs1.org/standards/barcodes/application-identifiers) (A.I.). This required prefix +universally indicates what kind of information the barcode contains. Odoo follows GS1 rules for +identifying information, as detailed in the {ref}`default GS1 rules list +`. Including the relevant {{ AI }} from the list +enables Odoo to correctly interpret GS1 barcodes. While most barcode patterns have a fixed length +requirement, certain ones, such as lots and serial numbers, have flexible length. + +:::{tip} +For flexible-length barcode patterns not placed at the end of the GS1 barcode, use the FNC1 +separator (`\\x1D`) to end the barcode. + +Example: The barcode pattern for lot numbers is 20 characters long. Instead of creating a +20-character lot number barcode, like `LOT00000000000000001`, use the FNC1 separator to make it +shorter: `LOT001\x1D`. +::: + +Refer to the {ref}`GS1 nomenclature list ` to see +a comprehensive list of all barcode patterns and rules to follow. Otherwise, refer to {ref}`this +GS1 usage doc ` for specific examples of combining {{ GTIN }} to product +information and configuring the workflow. + +:::{seealso} +- {ref}`Lots workflow ` +- {ref}`Non-unit quantities workflow ` +::: + +(barcode-operations-create-new-rules)= + +### Create rules + +GS1 rules are a specific format of information contained in the barcode, beginning with an {{ AI }} and +containing a defined length of characters. Scanning GS1 barcodes from the {ref}`default GS1 list +` auto-fills corresponding data in the Odoo +database. + +Adding GS1 barcode rules in Odoo ensures accurate interpretation of unique, non-standard GS1 +formats. + +To do so, begin by turning on {ref}`developer mode ` and navigating to the +{guilabel}`Barcode Nomenclatures` list in {menuselection}`Inventory app --> Configuration --> +Barcode Nomenclatures`. Then, select the {guilabel}`Default GS1 Nomenclature` list item. + +On the {guilabel}`Default GS1 Nomenclature` page, select {guilabel}`Add a line` at the bottom of the +table, which opens a window to create a new rule. The {guilabel}`Rule Name` field is used internally +to identify what the barcode represents. The barcode {guilabel}`Types` are different classifications +of information that can be understood by the system (e.g. product, quantity, best before date, +package, coupon). The {guilabel}`Sequence` represents the priority of the rule; this means the +smaller the value, the higher the rule appears on the table. Odoo follows the sequential order of +this table and will use the first rule it matches based on the sequence. The {guilabel}`Barcode +Pattern` is how the sequence of letters or numbers is recognized by the system to contain +information about the product. + +After filling in the information, click the {guilabel}`Save & New` button to make another rule or +click {guilabel}`Save & Close` to save and return to the table of rules. + +(barcode-operations-troubleshooting)= + +## Barcode troubleshooting + +Since GS1 barcodes are challenging to work with, here are some checks to try when the barcodes are +not working as expected: + +1. Ensure that the {guilabel}`Barcode Nomenclature` setting is set as {menuselection}`Default GS1 + Nomenclature`. Jump to the {ref}`nomenclature setup section + ` for more details. + +2. Ensure that the fields scanned in the barcode are enabled in Odoo. For example, to scan a barcode + containing lots and serial numbers, make sure the {guilabel}`Lots & Serial Numbers` feature is + enabled in {ref}`Odoo's settings ` and {ref}`on the product + `. + +3. Omit punctuation such as parentheses `()` or brackets `[]` between the {abbr}`A.I. (Application + Identifier)` and the barcode sequence. These are typically used in examples for ease of reading + and should **not** be included in the final barcode. For more details on building GS1 barcodes, + go to {ref}`this section `. + +4. When a single barcode contains multiple encoded fields, Odoo requires all rules to be listed in + the barcode nomenclature for Odoo to read the barcode. {ref}`This section + ` details how to add new rules in the barcode nomenclature. + +5. Test barcodes containing multiple encoded fields, piece by piece, to figure out which field is + causing the issue. + + ```{eval-rst} + .. example:: + When testing a barcode containing the |GTIN|, lot number, and quantity, start by scanning the + |GTIN| alone. Then, test the |GTIN| with the lot number, and finally, try scanning the whole + barcode. + ``` + +6. After diagnosing the encoded field is unknown, {ref}`add new rules + ` to Odoo's default list to recognize GS1 barcodes with + unique specifications. + + :::{important} + While the new field will be read, the information won't link to an existing field in Odoo + without developer customizations. However, adding new rules is necessary to ensure the rest of + the fields in the barcode are interpreted correctly. + ::: + +(barcode-operations-default-gs1-nomenclature-list)= + +## GS1 nomenclature list + +The table below contains Odoo's default list of GS1 rules. Barcode patterns are written in regular +expressions. Only the first three rules require a [check digit](https://www.gs1.org/services/check-digit-calculator) as the final character. + +| Rule Name | Type | Barcode Pattern | GS1 Content Type | Odoo field | +| ------------------------------------ | -------------------- | --------------------------------- | ------------------ | ----------------------------------------- | +| Serial Shipping Container Code | Package | (00)(\\d\{18}) | Numeric identifier | Package name | +| Global Trade Item Number (GTIN) | Unit Product | (01)(\\d\{14}) | Numeric identifier | {guilabel}`Barcode` field on product form | +| GTIN of contained trade items | Unit Product | (02)(\\d\{14}) | Numeric identifier | Packaging | +| Ship to / Deliver to global location | Destination location | (410)(\\d\{13}) | Numeric identifier | Destination location | +| Ship / Deliver for forward | Destination location | (413)(\\d\{13}) | Numeric identifier | Source location | +| I.D. of a physical location | Location | (414)(\\d\{13}) | Numeric identifier | Location | +| Batch or lot number | Lot | (10) ([!"%-/0-9:-?A-Z_a-z]{0,20}) | Alpha-numeric name | Lot | +| Serial number | Lot | (21) ([!"%-/0-9:-?A-Z_a-z]{0,20}) | Alpha-numeric name | Serial number | +| Packaging date (YYMMDD) | Packaging Date | (13)(\\d\{6}) | Date | Pack date | +| Best before date (YYMMDD) | Best before Date | (15)(\\d\{6}) | Date | Best before date | +| Expiration date (YYMMDD) | Expiration Date | (17)(\\d\{6}) | Date | Expiry date | +| Variable count of items | Quantity | (30)(\\d{0,8}) | Measure | UoM: Units | +| Count of trade items | Quantity | (37)(\\d{0,8}) | Measure | Qty in units for containers (AI 02) | +| Net weight: kilograms (kg) | Quantity | (310[0-5])(\\d\{6}) | Measure | Qty in kg | +| Length in meters (m) | Quantity | (311[0-5])(\\d\{6}) | Measure | Qty in m | +| Net volume: liters (L) | Quantity | (315[0-5])(\\d\{6}) | Measure | Qty in L | +| Net volume: cubic meters (m{sup}`3`) | Quantity | (316[0-5])(\\d\{6}) | Measure | Qty in m{sup}`3` | +| Length in inches (in) | Quantity | (321[0-5])(\\d\{6}) | Measure | Qty in inches | +| Net weight/volume: ounces (oz) | Quantity | (357[0-5])(\\d\{6}) | Measure | Qty in oz | +| Net volume: cubic feet (ft{sup}`3`) | Quantity | (365[0-5])(\\d\{6}) | Measure | Qty in ft{sup}`3` | +| Packaging type | Packaging Type | (91) ([!"%-/0-9:-?A-Z_a-z]{0,90}) | Alpha-numeric name | Package type | + diff --git a/content/applications/inventory_and_mrp/barcode/operations/gs1_usage.md b/content/applications/inventory_and_mrp/barcode/operations/gs1_usage.md new file mode 100644 index 000000000..8aad3b52b --- /dev/null +++ b/content/applications/inventory_and_mrp/barcode/operations/gs1_usage.md @@ -0,0 +1,235 @@ +--- +substitutions: + AI: '{abbr}`A.I. (Application Identifier)`' + GTIN: '{abbr}`GTIN (Global Trade Item Number)`' +--- + +# GS1 barcode usage + +(barcode/operations/gs1_usage)= + +GS1 barcodes provide a standardized format that barcode scanners can interpret. They encode +information in a {ref}`specific structure recognized globally `, allowing +scanners to understand and process supply chain data consistently. + +Odoo *Barcode* interprets and prints GS1 barcodes, automating product identification and tracking +in warehouse operations such as receiving, picking, and shipping. + +The following sections contain examples of how Odoo uses GS1 barcodes provided by the business to +identify common warehouse items and automate certain warehouse workflows. + +:::{important} +Odoo **does not** create GS1 barcodes. Businesses must purchase a unique Global Trade Item Number +(GTIN) from GS1. Then, they can combine their existing GS1 barcodes with product and supply chain +information (also provided by GS1) to create barcodes in Odoo. +::: + +:::{seealso} +- [Purchase GTINs](https://www.gs1.org/standards/get-barcodes) +- {ref}`GS1 nomenclature ` +::: + +(barcode-operations-gs1-lots)= + +## Configure barcodes for product, quantity, and lots + +To build a GS1 barcode that contains information about a product, its quantities, and the lot +number, the following barcode patterns and Application Identifiers (A.I.) are used: + +| Name | Rule Name | A.I. | Barcode Pattern | Field in Odoo | +| ---------- | ------------------------------- | ---- | -------------------------------- | --------------------------------------------- | +| Product | Global Trade Item Number (GTIN) | 01 | (01)(\\d\{14}) | {guilabel}`Barcode` field on product form | +| Quantity | Variable count of items | 30 | (30)(\\d{0,8}) | {guilabel}`Units` field on transfer form | +| Lot Number | Batch or lot number | 10 | (10)([!"%-/0-9:-?A-Z_a-z]{0,20}) | {guilabel}`Lot` on Detailed Operations pop-up | + +(barcode-operations-lot-setup)= + +### Configuration + +First, {ref}`enable product tracking using lots ` by +navigating to {menuselection}`Inventory app --> Configuration --> Settings`, and checking the box +for {guilabel}`Lots & Serial Numbers` under the {guilabel}`Traceability` heading. + +Then, set up the product barcode by navigating to the intended product form in +{menuselection}`Inventory app --> Products --> Products` and selecting the product. On the product +form, click {guilabel}`Edit`. Then, in the {guilabel}`General Information` tab, fill in the +{guilabel}`Barcode` field with the unique 14-digit [Global Trade Item Number (GTIN)](https://www.gs1.org/standards/get-barcodes), which is a universally recognized identifying number +that is provided by GS1. + +:::{important} +On the product form, omit the {{ AI }} `01` for {{ GTIN }} product barcode pattern, as it is only used to +encode multiple barcodes into a single barcode that contains detailed information about the +package contents. +::: + +```{eval-rst} +.. example:: + + To record the GS1 barcode for the product, `Fuji Apple`, enter the 14-digit |GTIN| + `20611628936004` in the :guilabel:`Barcode` field on the product form. + + .. image:: gs1_usage/barcode-field.png + :align: center + :alt: Enter 14-digit GTIN into the Barcode field on product form. +``` + +:::{tip} +To view a list of *all* products and their corresponding barcodes in the Odoo database, navigate +to {menuselection}`Inventory app --> Configuration --> Settings`. Under the {guilabel}`Barcode` +heading, click on the {guilabel}`Configure Product Barcodes` button under the {guilabel}`Barcode +Scanner` section. Enter the 14-digit {{ GTIN }} into the {guilabel}`Barcode` column, then click +{guilabel}`Save`. + +```{image} gs1_usage/product-barcodes-page.png +:align: center +:alt: View the Product Barcodes page from inventory settings. +``` +::: + +(barcode-operations-lot-setup-on-product)= + +After activating tracking by lots and serial numbers from the settings page, specify that this +feature is to be applied on each product by navigating to the {guilabel}`Inventory` tab on the +product form. Under {guilabel}`Tracking`, choose the {guilabel}`By Lots` radio button. + +```{image} gs1_usage/track-by-lots.png +:align: center +:alt: Enable product tracking by lots in the "Inventory" tab of the product form. +``` + +### Scan barcode on receipt + +To ensure accurate lot interpretation in Odoo on product barcodes scanned during a receipt +operation, navigate to the {menuselection}`Barcode` app to manage the {ref}`receipt picking process +`. + +From the {guilabel}`Barcode Scanning` dashboard, click the {guilabel}`Operations` button, then the +{guilabel}`Receipts` button to view the list of vendor receipts to process. Receipts generated from +{abbr}`POs (Purchase Orders)` are listed, but new receipt operations can also be created directly +through the {menuselection}`Barcode` app using the {guilabel}`Create` button. + +On the list of receipts, click on the warehouse operation (`WH/IN`) and scan product barcodes and +lot numbers with a barcode scanner. The scanned product then appears on the list. Use the +{guilabel}`✏️ (pencil)` button to open a window and manually enter quantities for specific lot +numbers. + +```{eval-rst} +.. example:: + After placing a :abbr:`PO (Purchase Order)` for fifty apples, navigate to the associated receipt + in the *Barcode* app. + + Scan the barcode containing the |GTIN|, quantity, and lot number. For testing with a barcode + scanner, below is an example barcode for the fifty Fuji apples in Lot 2. + + .. list-table:: + :widths: 50 50 + :header-rows: 1 + :stub-columns: 1 + + * - 50 Fuji apples in Lot0002 + - + * - 2D Matrix + - .. image:: gs1_usage/fuji-apples-barcode.png + :alt: 2D matrix of GS1 barcode of 50 fuji apples with an assigned lot number. + * - |AI| (product) + - 01 + * - GS1 Barcode (product) + - 20611628936004 + * - |AI| (quantity) + - 30 + * - GS1 Barcode (quantity) + - 00000050 + * - |AI| (lot) + - 10 + * - GS1 Barcode (lot #) + - LOT0002 + * - Full GS1 barcode + - 0120611628936004 3000000050 10LOT0002 + + :ref:`If the configuration is correct `, `50/50` + :guilabel:`Units` processed will be displayed and the :guilabel:`Validate` button turns green. + Click the :guilabel:`Validate` button to complete the reception. + + .. image:: gs1_usage/receive-50-apples.png + :align: center + :alt: Scan the barcode for a product on the reception picking page in the *Barcode* app. +``` + +(barcode-operations-quantity-ex)= + +## Configure barcode for product and non-unit quantity + +To build a GS1 barcode that contains products measured in a non-unit quantity, like kilograms, for +example, the following barcode patterns are used: + +| Name | Rule Name | A.I. | Barcode Pattern | Field in Odoo | +| --------------------- | ------------------------------- | -------- | ------------------- | ----------------------------------------- | +| Product | Global Trade Item Number (GTIN) | 01 | (01)(\\d\{14}) | {guilabel}`Barcode` field on product form | +| Quantity in kilograms | Variable count of items | 310[0-5] | (310[0-5])(\\d\{6}) | {guilabel}`Units` field on transfer form | + +### Scan barcode on receipt + +To confirm that quantities are correctly interpreted in Odoo, place an order in the *Purchase* app +using the appropriate unit of measure ({guilabel}`UoM`) for the quantity of products to be +purchased. + +:::{seealso} +{ref}`Simplify vendor unit conversions with UoMs +` +::: + +After the order is placed, navigate to the {menuselection}`Barcode` app to {ref}`receive the vendor +shipment `. + +```{eval-rst} +.. example:: + On the receipt in the *Barcode* app, receive an order for `52.1 kg` of peaches by scanning the + barcode containing the |GTIN| and quantity of peaches in kilograms. + + .. list-table:: + :widths: 50 50 + :header-rows: 1 + :stub-columns: 1 + + * - 52.1 kg of Peaches + - + * - 2D Matrix + - .. image:: gs1_usage/peaches-barcode.png + :alt: 2D matrix of GS1 barcode of 52.1 kg of peaches. + * - |AI| (product) + - 01 + * - GS1 Barcode (product) + - 00614141000012 + * - |AI| (kg, 1 decimal point) + - 3101 + * - GS1 Barcode (quantity) + - 000521 + * - Full GS1 barcode + - 0100614141000012 3101000521 + + :ref:`If the configuration is correct `, `52.1 / 52.1` + :guilabel:`kg` will be displayed and the :guilabel:`Validate` button turns green. Finally, press + :guilabel:`Validate` to complete the validation. + + .. image:: gs1_usage/scan-barcode-peaches.png + :align: center + :alt: Scan barcode screen for a reception operation in the Barcode app. +``` + +## Verify product moves + +For additional verification, the quantities of received products are also recorded on the +{guilabel}`Product Moves` report, accessible by navigating to {menuselection}`Inventory app --> +Reporting --> Product Moves`. + +The items on the {guilabel}`Product Moves` report are grouped by product by default. To confirm the +received quantities, click on a product line to open its collapsible drop-down menu, which displays +a list of *stock move lines* for the product. The latest stock move matches the warehouse reception +reference number (e.g. `WH/IN/00013`) and quantity processed in the barcode scan, demonstrating that +the records processed in the *Barcode* app were properly stored in *Inventory*. + +```{image} gs1_usage/stock-moves-peach.png +:align: center +:alt: Reception stock move record for 52.1 kg of peaches. +``` + diff --git a/content/applications/inventory_and_mrp/barcode/operations/process_transfers.md b/content/applications/inventory_and_mrp/barcode/operations/process_transfers.md new file mode 100644 index 000000000..16d60b465 --- /dev/null +++ b/content/applications/inventory_and_mrp/barcode/operations/process_transfers.md @@ -0,0 +1,58 @@ +# Process batch transfers + +The Odoo **Barcode** app can be used to process *Batch*, *Wave*, and *Cluster* transfers that are +created in the **Inventory** app. + +:::{seealso} +This document covers the steps to process transfers in the **Barcode** app. Instructions on +creating transfers can be found below: + +- {doc}`../../inventory/shipping_receiving/picking_methods/batch` +- {doc}`../../inventory/shipping_receiving/picking_methods/wave` +- {doc}`../../inventory/shipping_receiving/picking_methods/cluster` +::: + +## Process the batch + +First, navigate to {menuselection}`Barcode app --> Operations` and select an operation type (like +delivery orders) grouped into batches. From here, select the card for the appropriate batch +transfer, and click the {guilabel}`BATCH` smart button. + +```{image} process_transfers/batch-transfer.png +:alt: The Delivery Orders page. +``` + +On the batch transfer screen, the products in the picking are grouped by location, and each line is +color-coded to associate products in the same picking together. + +Then, follow the prompt to {guilabel}`Scan the source location` barcode for the storage location of +the first product. Scan the barcode for the product and package to process the transfer. To record +multiple quantities, click the {icon}`fa-pencil` {guilabel}`(edit)` icon, and enter the required +quantities for the picking. + +Repeat this for all products, and click the {guilabel}`Validate` button to mark the transfer as +{guilabel}`Done`. + +:::{note} +After creating a batch transfer and assigning a package to a picking, Odoo suggests the specified +package by displaying the name *in italics* under the product name, ensuring pickers place +products into the correct boxes. + +Products from the same order are labeled with the same color on the left. Completed pickings are +highlighted in green. +::: + +```{eval-rst} +.. example:: + In a batch transfer for 2 `Cabinet with Doors`, 3 `Acoustic Bloc Screens`, and 4 `Four Person + Desks`, the `3/3` and `4/4` :guilabel:`Units` indicate that the last two product pickings are + complete. + + `1/2` units of the `Cabinet with Doors` has already been picked, and after scanning the product + barcode for the second cabinet, Odoo prompts the user to `Scan a serial number` to record the + unique serial number for :ref:`product tracking `. + + .. image:: process_transfers/batch-products.png + :alt: Products to be picked in barcode view. +``` + diff --git a/content/applications/inventory_and_mrp/barcode/operations/receipts_deliveries.md b/content/applications/inventory_and_mrp/barcode/operations/receipts_deliveries.md new file mode 100644 index 000000000..b12ec6efc --- /dev/null +++ b/content/applications/inventory_and_mrp/barcode/operations/receipts_deliveries.md @@ -0,0 +1,210 @@ +# Process receipts and deliveries with barcodes + +(barcode-operations-intro)= + +The *Barcode* app can be used to process receipts, deliveries, and other types of operations in real +time using a barcode scanner or the Odoo mobile app. + +This makes it possible to process operations on the warehouse floor when they happen, instead of +having to wait to validate transfers from a computer. Processing operations this way can help to +properly attribute barcodes to the appropriate products, pickings, locations, and more. + +## Enable Barcode app + +To use the *Barcode* app to process transfers, it must be installed by enabling the feature from the +settings of the *Inventory* app. + +To do so, go to the {menuselection}`Inventory app --> Configuration --> Settings`. Then, scroll down +to the {guilabel}`Barcode` section, and click the checkbox next to the {guilabel}`Barcode Scanner` +feature. + +Once the checkbox is ticked, click {guilabel}`Save` at the top of the page to save changes. + +Once the page has refreshed, new options will be displayed under the {guilabel}`Barcode Scanner` +feature: {guilabel}`Barcode Nomenclature` (with a corresponding drop-down menu), where either +{guilabel}`Default Nomenclature` or {guilabel}`Default GS1 Nomenclature` can be selected. + +There is also a {guilabel}`Configure Product Barcodes` internal link arrow, and a set of +{guilabel}`Print` buttons for printing barcode commands and a barcode demo sheet. + +```{image} receipts_deliveries/receipts-deliveries-barcode-setting.png +:align: center +:alt: Enabled Barcode feature in Inventory app settings. +``` + +For more on setting up and configuring the {guilabel}`Barcode` app, refer to the {doc}`Set up your +barcode scanner <../setup/hardware>` and {doc}`Activate the Barcodes in Odoo <../setup/software>` +documentation pages. + +(barcode-operations-scan-received-products)= + +## Scan barcodes for receipts + +To process warehouse receipts for incoming products, there first needs to be a purchase order (PO) +created, and a receipt operation to process. + +To create a {abbr}`PO (purchase order)`, navigate to the {menuselection}`Purchase app --> Create` to +create a new request for quotation (RFQ). + +From the blank {abbr}`RFQ (request for quotation)` form, click the drop-down menu next to the +{guilabel}`Vendor` field to add a vendor. Then, on the {guilabel}`Product` line under the +{guilabel}`Products` tab, click {guilabel}`Add a product`, and select the desired product(s) to add +to the quotation. + +Once ready, click {guilabel}`Save` at the top of the form, then click {guilabel}`Confirm Order` to +confirm the {abbr}`RFQ (request for quotation)` to a {abbr}`PO (purchase order)`. + +```{image} receipts_deliveries/receipts-deliveries-purchase-order.png +:align: center +:alt: Completed purchase order for barcode product. +``` + +To process and scan barcodes for warehouse receipts, navigate to the {menuselection}`Barcode app`. + +Once inside the {guilabel}`Barcode app`, a {guilabel}`Barcode Scanning` screen displaying different +options is presented. To process receipts, click on the {guilabel}`Operations` button at the bottom +of the screen. This navigates to an {menuselection}`Operations` overview page. + +```{image} receipts_deliveries/receipts-deliveries-barcode-scanner.png +:align: center +:alt: Barcode app start screen with scanner. +``` + +From this page, locate the {guilabel}`Receipts` card, and click the {guilabel}`# To Process` button +to view all outstanding receipts. Then, select the desired receipt operation to process. This +navigates to the barcode transfer screen. + +:::{note} +If *only* using a barcode scanner or the Odoo mobile app, the barcodes for each transfer of a +corresponding operation type can be scanned to be processed easily. Once scanned, the products +that are part of an existing transfer can be scanned, and new products can be added to the +transfer, as well. Once all products have been scanned, validate the transfer to proceed with the +stock moves. +::: + +From this screen, an overview of all receipts to process within that transfer (**WH/IN/000XX**) is +shown. At the bottom of the screen, there are options to {guilabel}`Add Product` or +{guilabel}`Validate`, depending on if products need to be added to the operation, or if the whole +operation should be validated at once. + +```{image} receipts_deliveries/receipts-deliveries-scanner-overview.png +:align: center +:alt: Overview of receipts in transfer to scan. +``` + +To process and scan each product individually, choose a specific product line. The {guilabel}`+#` +button (in this case, {guilabel}`+10`) can be clicked to indicate receipt of that product, or the +{guilabel}`pencil` icon can be clicked to open a new screen to edit that product line. + +From this screen, the product that's being received is listed. Under the product name, the +{guilabel}`Quantity` line can be edited. Either change the `0` in the line to the desired quantity, +or click the {guilabel}`/# Units` button (in this case, {guilabel}`/10 Units`) to automatically fill +the quantity ordered from the {abbr}`PO (purchase order)`. + +```{eval-rst} +.. example:: + In the reception operation `WH/IN/00019`, `10 Units` of the `Barcode Product` is expected to be + received. `[BARCODE_PROD]` is the :guilabel:`Internal Reference` set on the product form. Scan + the barcode of the `Barcode Product` to receive one unit. Afterwards, click the + :guilabel:`pencil` icon to manually enter the received quantities. + + .. image:: receipts_deliveries/receipts-deliveries-product-line-editor.png + :align: center + :alt: Product line editor for individual transfer in Barcode app. +``` + +Additionally, the {guilabel}`+1` and {guilabel}`-1` buttons can be clicked to add or subtract +quantity of the product, and the {guilabel}`number keys` can be used to add quantity, as well. + +Below the {guilabel}`number keys` is the {guilabel}`location` line, which reads `WH/Stock` by +default, unless another *location* is listed on the product itself. Click this line to reveal a +drop-down menu of additional locations to choose from. + +Once ready, click {guilabel}`Confirm` to confirm the changes made to the product line. + +Then, from the overview page with all receipts to process within that transfer (**WH/IN/000XX**), +click the {guilabel}`+#` button on the product line for the products being received, and click +{guilabel}`Validate`. The receipt has now been processed, and the {guilabel}`Barcode app` can be +closed out. + +```{image} receipts_deliveries/receipts-deliveries-validate-transfer.png +:align: center +:alt: Overview of receipts in transfer to validate. +``` + +## Scan barcodes for delivery orders + +To process warehouse deliveries for outgoing products, there first needs to be a sales order (SO) +created, and a delivery operation to process. + +To create a {abbr}`SO (sales order)`, navigate to the {menuselection}`Sales app --> Create` to +create a new quotation. + +From the blank quotation form, click the drop-down menu next to the {guilabel}`Customer` field to +add a customer. Then, on the {guilabel}`Product` line under the {guilabel}`Order Lines` tab, click +{guilabel}`Add a product`, and select the desired product(s) to add to the quotation. + +Once ready, click {guilabel}`Save` at the top of the form, and click {guilabel}`Confirm Order` to +confirm the quotation to a {abbr}`SO (sales order)`. + +```{image} receipts_deliveries/receipts-deliveries-sales-order.png +:align: center +:alt: Completed sales order for barcode product. +``` + +To process and scan barcodes for warehouse deliveries, navigate to the {menuselection}`Barcode app`. + +Once inside the {guilabel}`Barcode app`, a {guilabel}`Barcode Scanning` screen displaying different +options is presented. To process deliveries, click on the {guilabel}`Operations` button at the +bottom of the screen. This navigates to an {guilabel}`Operations` overview page. + +From this page, locate the {guilabel}`Delivery Orders` card, and click the {guilabel}`# To Process` +button to view all outstanding deliveries. Then, select the desired delivery order to process. This +navigates to the barcode transfer screen. + +```{image} receipts_deliveries/receipts-deliveries-operations-page.png +:align: center +:alt: Operations overview page in Barcode app dashboard. +``` + +From this screen, an overview of all deliveries to process within that transfer (**WH/OUT/000XX**) +is shown. At the bottom of the screen, there are options to {guilabel}`Add Product` or +{guilabel}`Validate`, depending on if products need to be added to the operation, or if the whole +operation should be validated at once. + +To process and scan each product individually, choose a specific product line. The {guilabel}`+1` +button can be clicked to indicate delivery of that product, or the {guilabel}`pencil icon` can be +clicked to open a new screen to edit that product line. + +From this screen, the product that's being delivered is listed. Under the product name, the +{guilabel}`Quantity` line can be edited. Either change the `0` in the line to the desired quantity, +or click the {guilabel}`/# Units` button (in this case, {guilabel}`/10 Units`) to automatically fill +the quantity ordered from the {abbr}`SO (sales order)`. + +Additionally, the {guilabel}`+1` and {guilabel}`-1` buttons can be clicked to add or subtract +quantity of the product, and the {guilabel}`number keys` can be used to add quantity, as well. + +Below the {guilabel}`number keys` is the {guilabel}`location` line, which reads `WH/Stock` by +default, unless another location is listed on the product itself. + +This is the location that the product is being pulled from for delivery. Click this line to reveal a +drop-down menu of additional locations to choose from (if this product is stored in multiple +locations in the warehouse). + +:::{tip} +For warehouses that have multiple different storage locations, putaway rules, and removal +strategies, additional steps can be added for various operation types, while using the *Barcode* +app. +::: + +Once ready, click {guilabel}`Confirm` to confirm the changes made to the product line. + +Then, from the overview page with all receipts to process within that transfer (**WH/OUT/000XX**), +click the {guilabel}`+#` button on the product line for the products being received, and click +{guilabel}`Validate`. The delivery has now been processed, and the *Barcode* app can be closed out. + +```{image} receipts_deliveries/receipts-deliveries-validate-delivery.png +:align: center +:alt: Overview of deliveries in transfer to validate. +``` + diff --git a/content/applications/inventory_and_mrp/barcode/operations/transfers_scratch.md b/content/applications/inventory_and_mrp/barcode/operations/transfers_scratch.md new file mode 100644 index 000000000..3388694d1 --- /dev/null +++ b/content/applications/inventory_and_mrp/barcode/operations/transfers_scratch.md @@ -0,0 +1,229 @@ +# Create and process transfers with barcodes + +The *Barcode* app can be used to process internal transfers for all types of products, including +transfers for products tracked using lots or serial numbers. Transfers can be created from scratch +in real time using an Odoo-compatible barcode scanner or the Odoo mobile app. + +For a list of Odoo-compatible barcode mobile scanners, and other hardware for the *Inventory* app, +refer to the [Odoo Inventory • Hardware page](https://www.odoo.com/app/inventory-hardware). + +## Enable Barcode app + +To use the *Barcode* app to process transfers, it must be installed by enabling the feature from the +settings of the *Inventory* app. + +To do so, go to the {menuselection}`Inventory app --> Configuration --> Settings`. Then, scroll down +to the {guilabel}`Barcode` section, and click the checkbox next to the {guilabel}`Barcode Scanner` +feature. + +Once the checkbox is ticked, click {guilabel}`Save` at the top of the page to save changes. + +When the page has refreshed, new options are displayed under the {guilabel}`Barcode Scanner` +feature: {guilabel}`Barcode Nomenclature` (with a corresponding drop-down menu), where either +{guilabel}`Default Nomenclature` or {guilabel}`Default GS1 Nomenclature` can be selected. The +nomenclature selected changes how scanners interpret barcodes in Odoo. + +There is also a {guilabel}`Configure Product Barcodes` internal link arrow, and a set of +{guilabel}`Print` buttons for printing barcode commands and a barcode demo sheet. + +```{image} transfers_scratch/transfers-scratch-enabled-barcode-setting.png +:align: center +:alt: Enabled Barcode feature in Inventory app settings. +``` + +For more on setting up and configuring the {guilabel}`Barcode` app, refer to the {doc}`Set up your +barcode scanner <../setup/hardware>` and {doc}`Activate the Barcodes in Odoo <../setup/software>` +documentation pages. + +## Scan barcodes for internal transfers + +To create and process internal transfers for products in a warehouse, the {guilabel}`Storage +Locations` and {guilabel}`Multi-Step Routes` features **must** be enabled. + +To do so, go to the {menuselection}`Inventory app --> Configuration --> Settings`. Then, scroll down +to the {guilabel}`Warehouse` section, and click the checkboxes next to {guilabel}`Storage Locations` +and {guilabel}`Multi-Step Routes`. + +Then, click {guilabel}`Save` at the top of the page to save changes. + +### Create an internal transfer + +To process existing internal transfers, there first needs to be an internal transfer created, and an +operation to process. + +To create an internal transfer, navigate to the {menuselection}`Inventory app`. From the +{guilabel}`Inventory Overview` dashboard, locate the {guilabel}`Internal Transfers` card, and click +on the {guilabel}`0 To Process` button. + +Then, click {guilabel}`Create` in the top left of the resulting page. This navigates to a new +{guilabel}`Internal Transfer` form. + +On this blank form, the {guilabel}`Operation Type` is automatically listed as {guilabel}`Internal +Transfers`. Under that field, the {guilabel}`Source Location` and {guilabel}`Destination Location` +are set as {guilabel}`WH/Stock` by default, but can be changed to whichever locations the products +are being moved from, and moved to. + +```{image} transfers_scratch/transfers-scratch-internal-transfer-form.png +:align: center +:alt: Blank internal transfer form with source location and destination location. +``` + +Once the desired locations have been selected, products can be added to the transfer. On the +{guilabel}`Product` line under the {guilabel}`Products` tab, click {guilabel}`Add a product`, and +select the desired product(s) to add to the transfer. + +Once ready, click {guilabel}`Save` at the top of the form to save the new internal transfer. Once +saved, click the {guilabel}`Detailed Operations` icon (four lines, at the far right of the +{guilabel}`Product` line) to open the {guilabel}`Detailed Operations` pop-up window. + +```{image} transfers_scratch/transfers-scratch-detailed-operations-popup.png +:align: center +:alt: Internal transfer detailed operations pop-up window. +``` + +From the pop-up, click {guilabel}`Add a line`. + +Then, in the {guilabel}`To` column, change the location from {guilabel}`WH/Stock` to a different +location, where the products should be moved. + +Next, in the {guilabel}`Done` column, change the quantity to the desired quantity to transfer. Once +ready, click {guilabel}`Confirm` to close out the pop-up window. + +### Scan barcodes for internal transfer + +To process and scan barcodes for internal transfers, navigate to the {menuselection}`Barcode app`. + +Once inside the {guilabel}`Barcode app`, a {guilabel}`Barcode Scanning` screen displaying different +options is presented. + +To process internal transfers, click on the {guilabel}`Operations` button at the bottom of the +screen. This navigates to an {menuselection}`Operations` overview page. + +```{image} transfers_scratch/transfers-scratch-barcode-app.png +:align: center +:alt: Barcode app start screen with scanner. +``` + +From this page, locate the {guilabel}`Internal Transfers` card, and click the {guilabel}`# To +Process` button to view all outstanding internal transfers. Then, select the desired operation to +process. This navigates to the barcode transfer screen. + +:::{note} +When using the *Barcode* app without the *Inventory* app (**only** if using a barcode scanner or +the Odoo mobile app), the barcodes for each transfer of a corresponding operation type can be +scanned to be processed easily. + +Once scanned, the products that are part of an existing transfer can be scanned, and new products +can be added to the transfer, as well. Once all products have been scanned, validate the transfer +to proceed with the stock moves. +::: + +From this screen, an overview of all products to process within that specific internal transfer +(**WH/INT/000XX**) is shown. At the bottom of the screen, there are options to {guilabel}`Add +Product` or {guilabel}`Validate`, depending on if products need to be added to the operation, or if +the whole operation should be validated at once. + +```{image} transfers_scratch/transfers-scratch-receipts-overview.png +:align: center +:alt: Overview of receipts in transfer to scan. +``` + +Then, scan the barcode of the product to process the internal transfer. + +Or, to process and scan each product individually, choose a specific product line. The +{guilabel}`+ 1` button can be clicked to add additional quantity of that product to the transfer, or +the {guilabel}`pencil icon` can be clicked to open a new screen to edit that product line. + +In the product's pop-up window, the product and the units to process is displayed with a number pad. +Under the product name, the {guilabel}`Quantity` line can be edited. Change the number in the line +to the quantity listed to be transferred on the internal transfer form. + +```{eval-rst} +.. example:: + In the internal transfer operation `WH/INT/000XX`, `50 Units` of the `Transfer Product` is + moved from `WH/Stock` to `WH/Stock/Shelf 1`. `[TRANSFER_PROD]` is the :guilabel:`Internal + Reference` set on the product form. Scan the barcode of the `Transfer Product` to receive one + unit. Afterwards, click the :guilabel:`pencil icon` to manually enter the transferred quantities. + + .. image:: transfers_scratch/transfers-scratch-product-line-editor.png + :align: center + :alt: Product line editor for individual transfer in Barcode app. +``` + +Additionally, the {guilabel}`+1` and {guilabel}`-1` buttons can be clicked to add or subtract +quantity of the product, and the number keys can be used to add quantity, as well. + +Below the number keys are the two {guilabel}`location` lines, which read whichever locations were +previously specified on the internal transfer form, in this case `WH/Stock` and `WH/Stock/Shelf 1`. +Click these lines to reveal a drop-down menu of additional locations to choose from. + +Once ready, click {guilabel}`Confirm` to confirm the changes made to the product line. + +Then, from the overview page with all products to process within that transfer (**WH/INT/000XX**), +click {guilabel}`Validate`. The receipt has now been processed, and the *Barcode* app can be closed +out. + +:::{tip} +The *Barcode* app can also be used to scan products in internal transfers containing unique lot +numbers and serial numbers. + +From the barcode transfer screen, scan the barcode of a lot or serial number, and Odoo +automatically increases the quantity of the product to the quantity recorded in the database. If +the same lot or serial number is shared between different products, scan the product barcode +first, then the barcode of the lot/serial number. +::: + +:::{seealso} +{ref}`Connect to the Barcode Lookup database ` to quickly create new +products by scanning their barcodes during internal transfers. +::: + +## Create a transfer from scratch + +In addition to processing and scanning barcodes for existing, previously-created internal transfers, +the *Barcode* app can also be used to create transfers from scratch, simply by scanning a printed +operation type barcode. + +:::{admonition} Did you know? +Odoo's *Barcode* application provides demo data with barcodes to explore the features of the app. +These can be used for testing purposes, and can be printed from the home screen of the app. To +access this demo data, navigate to the {menuselection}`Barcode app` and click {guilabel}`stock +barcodes sheet` (bolded and highlighted in blue) in the information pop-up above the scanner. + +```{image} transfers_scratch/transfers-scratch-demo-data.png +:align: center +:alt: Demo data prompt pop-up on Barcode app main screen. +``` +::: + +To do this, first navigate to the {menuselection}`Barcode app`. Once inside the *Barcode* app, a +{guilabel}`Barcode Scanning` screen displaying different options is presented. + +From this screen, when using a USB or bluetooth barcode scanner, directly scan the product barcode. + +When using a smartphone as the barcode scanner, click the {guilabel}`Tap to Scan` button (next to +the camera icon, at the center of the screen). This opens a {guilabel}`Barcode Scanner` pop-up +screen that enables the camera of the device being used. + +Face the camera toward the printed operation type barcode to scan it. Doing so processes the +barcode, and navigates to a barcode transfer screen. + +From this screen, an overview of all products to process within that specific internal transfer +(**WH/INT/000XX**) is shown. Since this is a new transfer created from scratch, however, there +should not be any products listed on the page. + +To add products, scan the product barcode. If the barcode is not available, manually enter the +product into the system by clicking the {guilabel}`Add Product` button at the bottom of the screen, +and add the products and product quantities that should be transferred. + +Once ready, click {guilabel}`Confirm` to confirm the changes made to the product line. + +```{image} transfers_scratch/transfers-scratch-blank-product-editor.png +:align: center +:alt: Blank product editor in scratch internal transfer. +``` + +Then, from the overview page with all products to process within that transfer (**WH/INT/000XX**), +click {guilabel}`Validate`. The internal transfer has now been processed, and the *Barcode* app can +be closed out. + diff --git a/content/applications/inventory_and_mrp/barcode/setup.md b/content/applications/inventory_and_mrp/barcode/setup.md new file mode 100644 index 000000000..7f418645d --- /dev/null +++ b/content/applications/inventory_and_mrp/barcode/setup.md @@ -0,0 +1,15 @@ +--- +nosearch: true +--- + +# Setup + +```{toctree} +:glob: true +:titlesonly: true + +setup/device_troubleshooting +setup/hardware +setup/software +``` + diff --git a/content/applications/inventory_and_mrp/barcode/setup/device_troubleshooting.md b/content/applications/inventory_and_mrp/barcode/setup/device_troubleshooting.md new file mode 100644 index 000000000..4c428dccf --- /dev/null +++ b/content/applications/inventory_and_mrp/barcode/setup/device_troubleshooting.md @@ -0,0 +1,212 @@ +# Barcode device troubleshooting + +Odoo *Barcode* supports three main types of barcode scanners: USB scanners, bluetooth scanners, and +mobile computer scanners. While configuring each type of scanner, common issues may arise, in which +the scanners do not work as intended, and Odoo returns errors to the device. + +Read the sections below to identify general and unique device issues, related to specific, popular +types of scanners. + +## General issues + +Refer to the following sections below for common issues involving popular barcode scanner devices. + +For issues related to specific devices, refer to the {ref}`Android scanners +` section for mobile computer scanners, or to the {ref}`Screenless +scanners ` section for USB and bluetooth scanners. + +### Barcode cannot be read + +One common issue encountered when using barcode scanners is an error resulting from barcodes that +cannot be read. + +This can occur due to any of the following reasons: + +- The barcode is damaged. +- The device cannot read the required barcode type (some scanners can only read 2D barcodes). +- The barcode being scanned is on a screen. Some scanners don't support this, and the barcodes + **must** be printed out to be scanned. This is most common with 1D barcodes. +- The device has no battery, or is broken. To rule this out, follow the troubleshooting instructions + in the following sections. + +### Odoo returns barcode error + +All types of barcode scanners have their own device "language", which affects how they output +barcode data to Odoo's *Barcode* app. Sometimes, this can cause Odoo *Barcode* to return a barcode +error after scanning. This could be due to any of the following reasons: + +- The computer is configured with a different keyboard layout than the barcode scanner. To rule this + out, ensure that the device is configured with the same keyboard layout. + + For example, if the computer is configured to use an FR-BE keyboard, configure the scanner to send + FR-BE keystrokes. The same logic applies if using a tablet instead of a computer. + + For more information on configuring keystrokes, refer to the {doc}`Barcode scanner setup + ` documentation. + +- For mobile computer scanners (such as Zebra devices, for example), the scanner might interpret the + barcode differently than intended. To rule this out, scan a test barcode to see how the scanner + interprets the barcode. + +(barcode-setup-android-scanners)= + +## Android scanners + +The most recent barcode scanner models using Android and Google Chrome should work with Odoo. +However, due to the variety of models and configurations, it is recommended to first test a +scanner's compatibility with Odoo. + +The Zebra product line is recommended; specifically, the **Zebra TC21 (WiFi-only)**, and **Zebra +TC26 (WiFi/cellular)**. + +:::{seealso} +[Odoo Inventory & Barcode compatible hardware](https://www.odoo.com/app/inventory-hardware) +::: + +### Barcode app does not give feedback + +By default, Android barcode scanners pre-process the barcode, then send a full text. Since Odoo +*Barcode* does not read this type of output, settings for each type of scanner **must** be +configured correctly. + +Odoo *Barcode* expects that the scanner works like an analogue keyboard, and so, only detects *key +events*. Refer to the following sections for configuration settings for the most popular devices. + +### Zebra TC21/TC26 + +When using Zebra scanners, ensure the following keystroke configurations are set to prevent errors. + +Begin on the Zebra scanner's home screen, and select the {guilabel}`DataWedge` app (the app is +represented by a {guilabel}`(light blue barcode)` icon). + +On the {guilabel}`DataWedge Profiles` page, select the profile option to access the Zebra scanner's +settings. + +Once the profile is selected, scroll down to the {guilabel}`Keyboard Output` option, and ensure the +{guilabel}`Enable/disable keystroke output` option is {guilabel}`Enabled`. + +```{image} device_troubleshooting/device-troubleshooting-zebra-settings.png +:align: center +:alt: Show keystroke option in the Zebra scanner's DataWedge app. +``` + +Once that option is enabled, go back to the {guilabel}`Profile` options page, and go to the +{guilabel}`Keystroke output` section. Then, open the {guilabel}`Key event options` submenu. Under +{guilabel}`Characters`, ensure the {guilabel}`Send Characters as Events` option is checked. + +:::{important} +The {guilabel}`Send Characters as Events` option **must** be checked on the Zebra scanner, or +Odoo **cannot** recognize the barcodes that are scanned. +::: + +Once the above steps have been taken, perform a test scan to ensure the Zebra scanner is working as +intended. + +### MUNBYN Android devices + +When using MUNBYN Android scanners, ensure the following configurations are set to prevent errors. + +From the device's home screen, click {menuselection}`AppSettings`. On the resulting page, locate the +{guilabel}`Process mode` section, and select {guilabel}`Keyboard input`. + +```{image} device_troubleshooting/device-troubleshooting-munbyn-process-mode.png +:align: center +:alt: Process mode section on MUNBYN scanner's AppSettings page. +``` + +:::{tip} +The selected *Process mode* controls how data is processed after barcode data has been read out. + +*Keyboard input* enters read-out data at the position of the cursor, the same as input data on an +analogue keyboard would. +::: + +Once the above steps have been taken, perform a test scan to ensure the MUNBYN Android scanner is +working as intended. + +:::{admonition} Why is there no data output in the app after a successful scan? +When scanning a barcode, the scanner might beep, indicating a successful scan, but there is no +data output in the app. + +To fix this issue, adjust the output method to *keyboard analogue* in the *Scanner* app on the +device. + +From the device's home screen, click {menuselection}`Scanner App --> Settings`. From the +{guilabel}`Settings` page, click {guilabel}`Output Mode`. The resulting pop-up window presents +the different output options available to users. Select {guilabel}`Keyboard Mode`, then click +{guilabel}`OK`. + +```{image} device_troubleshooting/device-troubleshooting-output-mode-popup.png +:align: center +:alt: Output mode pop-up window on MUNBYN scanner. +``` + +Go back to the app that needs to be scanned, and click on the input dialog box first before +scanning. Finally, perform a test scan to ensure the MUNBYN Android scanner is working as +intended. +::: + +### Datalogic Android devices + +When using Datalogic Android scanners, ensure the following configurations are set to prevent +errors. + +To view and configure all settings for the scanner, use the *Settings* app on the Datalogic Android +device. From the applications menu, select {menuselection}`Settings --> System --> Scanner +Settings`. + +From the resulting list of settings, select {guilabel}`Wedge`. From this menu, under the +{guilabel}`Keyboard wedge` section, ensure that the {guilabel}`Enable keyboard wedge` feature is +activated. + +Then, also under the {guilabel}`Keyboard wedge` section, locate the {guilabel}`Keyboard wedge input +mode` option. By default, the input mode is set to {guilabel}`Text injection`. + +```{image} device_troubleshooting/device-troubleshooting-wedge-menu.png +:align: center +:alt: Wedge configuration menu on Datalogic scanner. +``` + +Click {guilabel}`Keyboard wedge input mode`, and change the setting to {guilabel}`Key pressure`. +This ensures that scanned barcodes are translated into keyboard strokes, instead of being injected +into the text area. + +```{image} device_troubleshooting/device-troubleshooting-keyboard-wedge-input.png +:align: center +:alt: Keyboard wedge input mode selection on Datalogic scanner. +``` + +Once all those steps have been taken, perform a test scan to ensure the Datalogic Android scanner is +working as intended. + +(barcode-setup-screenless-scanners)= + +## Screenless scanners + +Screenless scanners are barcode scanning devices that have no screens. These include USB scanners +and bluetooth scanners. + +:::{important} +Odoo supports most USB and Bluetooth barcode scanners, as they all emulate a keyboard. However, +to verify that a scanner is compatible with a specific keyboard layout (or can be configured to +do so), refer to Odoo's [Inventory & Barcode compatible hardware](https://www.odoo.com/app/inventory-hardware) documentation. +::: + +### NETUM devices + +By default, the NETUM barcode scanner's user manual only shows the French keyboard configuration. To +use the Belgian keyboard, scan the code below: + +```{image} device_troubleshooting/device-troubleshooting-belgium-fr-key.png +:align: center +:alt: Belgian FR key barcode. +``` + +Once that code has been scanned, ensure the NETUM scanner has the correct keyboard configuration, +and is working as intended. + +:::{seealso} +- {doc}`../setup/hardware` +- {doc}`../setup/software` +::: + diff --git a/content/applications/inventory_and_mrp/barcode/setup/hardware.md b/content/applications/inventory_and_mrp/barcode/setup/hardware.md new file mode 100644 index 000000000..6696ab541 --- /dev/null +++ b/content/applications/inventory_and_mrp/barcode/setup/hardware.md @@ -0,0 +1,170 @@ +# Barcode scanner setup + +(barcode-setup-hardware)= + +Follow this guide to choose and set up a barcode scanner compatible with Odoo's *Inventory* and +*Barcode* apps. + +:::{figure} hardware/barcode-scanner.png +:align: center +:alt: An image of an example barcode scanner. +::: + +## Scanner types + +Before setting up a barcode scanner, it is important to determine which type of scanner best meets +the needs of the business. There are three main types of scanners that can be used with Odoo, each +with their own benefits and use cases: + +- **USB scanners** are connected to a computer, and are suitable for businesses that scan products + at a fixed location, like at the checkout line in a grocery store. + +- **Bluetooth scanners** pair with a smartphone or tablet, making them both a cost-effective and + portable barcode scanner option. In this scenario, Odoo is installed on the smartphone, allowing + warehouse operators to handle operations, and check stock, directly through their mobile devices. + +- **Mobile computer scanners** are mobile devices with a built-in barcode scanner. + + :::{important} + If using a USB scanner, ensure the scanner is compatible with the keyboard layout of the + computer. + + If using a mobile computer scanner, ensure the device can run the Odoo mobile app properly. + Recent models that use Android OS with the Google Chrome browser, or Windows OS with Microsoft + Edge, should work. However, testing is crucial due to the variety of available models and + configurations. + ::: + +:::{seealso} +[Odoo Inventory & Barcode • Compatible Hardware](https://www.odoo.com/app/inventory-hardware) +::: + +## Configuration + +When setting up the barcode scanner, make sure the following configurations are correct so the +scanner can properly interpret barcodes with Odoo. + +### Keyboard layout + +When using a USB barcode scanner, match its keyboard layout with the operating system's layout for +proper interpretation of characters. Generally, the scanning mode should be set to accept a USB +keyboard (HID), with the language set based on the keyboard that is in use. + +To configure the keyboard layout for a **Zebra** scanner, scan the keyboard wedge barcode for the +desired language in the scanner's user manual. + +:::{figure} hardware/keyboard-barcode.png +:align: center +:alt: Example of a user manual for keyboard layout. + +Examples of keyboard language settings in the Zebra scanner user manual. +::: + +### Automatic carriage return + +Odoo has a default 100-millisecond delay between scans to prevent accidental double scanning. To +synchronize with the barcode scanner, set it to include a *carriage return* ({dfn}`character like +the "Enter" key on a keyboard`) after each scan. Odoo interprets the carriage return as the end of +the barcode input; so Odoo accepts the scan, and waits for the next one. + +Typically, on the scanner, a carriage return is included by default. Ensure it is set by scanning a +specific barcode in the user manual, like `CR suffix ON` or `Apply Enter for suffix`. + +## Zebra scanner + +When using Zebra scanners, ensure the following keystroke configurations are set to prevent errors. + +Begin on the Zebra scanner's home screen, and select the {guilabel}`DataWedge` app (the app is +represented by a {guilabel}`(light blue barcode)` icon). + +On the {guilabel}`DataWedge Profiles` page, select the profile option to access the Zebra scanner's +settings. + +:::{warning} +It is **not** suggested to use the "DWDemo" profile, as it does not work properly in every +circumstance. + +Instead, it is recommended to create a new, personal profile. Once a new profile is created, add +the *Odoo Mobile* app and *Google Chrome* app in the {guilabel}`Associated Apps` on the scanner's +home screen. +::: + +Once the profile is selected, scroll down to the {guilabel}`Keyboard Output` option, and ensure the +{guilabel}`Enable/disable keystroke output` option is {guilabel}`Enabled`. + +```{image} hardware/enable-keystroke.png +:align: center +:alt: Show keystroke option in the Zebra scanner's DataWedge app. +``` + +Once that option is enabled, go back to the {guilabel}`Profile` options page, and go to the +{guilabel}`Keystroke output` section. Then, open the {guilabel}`Key event options` submenu. Under +{guilabel}`Characters`, ensure the {guilabel}`Send Characters as Events` option is checked. + +:::{important} +The {guilabel}`Send Characters as Events` option **must** be checked on the Zebra scanner, or +Odoo **cannot** recognize the barcodes that are scanned. +::: + +Once all those steps have been taken, perform a test scan to ensure the Zebra scanner is working +properly, as intended. + +## Honeywell mobile computer scanner + +When using Honeywell scanners, follow the instructions below to ensure barcodes can be scanned in +Odoo. + +Begin on the Honeywell scanner's home screen, and select {guilabel}`Settings`, represented by a +{guilabel}`⚙️ (gear)` icon. Then, click {guilabel}`Honeywell Settings`, followed by +{guilabel}`Scanning`. + +From here, click {guilabel}`Internal Scanner`, followed by {guilabel}`Default Profile`. From the +resulting list of options, select {guilabel}`Data Processing Settings`. + +The {guilabel}`Data Processing Settings` specify how barcode data is processed by the computer. +Locate the {guilabel}`Wedge Method` setting. By default, this is set to {guilabel}`Standard`. + +```{image} hardware/hardware-honeywell-settings.png +:align: center +:alt: Data processing settings options for Honeywell scanner. +``` + +Change the {guilabel}`Wedge Method` setting to {guilabel}`Keyboard`. + +After completing the steps, conduct a test scan to verify the Honeywell scanner is working as +intended. + +## Cipherlab mobile computer scanner + +When using Cipherlab scanners, follow the instructions below to ensure barcodes can be scanned in +Odoo. + +Begin on the Cipherlab scanner's home screen, and navigate to the {menuselection}`App Drawer (All +Applications)`. Then, click the {guilabel}`ReaderConfig` app, represented by an orange +{guilabel}`⚙️ (gear)` icon over a blue {guilabel}`(barcode)` icon. + +Next, select the {guilabel}`Default Profile`, or create a new profile, if needed. + +Under the {guilabel}`General Settings`, click {guilabel}`Data Output`, followed by +{guilabel}`Keyboard Emulation`. + +```{image} hardware/hardware-cipherlab-settings.png +:align: center +:alt: Cipherlab scanner data output setting page. +``` + +By default, the {guilabel}`Input Method`, under {guilabel}`Keyboard Emulation`, is set to +{guilabel}`Default Mode`. Change this setting to {guilabel}`KeyEvent`. + +```{image} hardware/hardware-cipherlab-emulation.png +:align: center +:alt: Cipherlab scanner keyboard emulation settings. +``` + +After completing the steps, conduct a test scan to verify the Cipherlab scanner is working as +intended. + +:::{seealso} +{doc}`../setup/software` +::: + diff --git a/content/applications/inventory_and_mrp/barcode/setup/software.md b/content/applications/inventory_and_mrp/barcode/setup/software.md new file mode 100644 index 000000000..7b2d94dde --- /dev/null +++ b/content/applications/inventory_and_mrp/barcode/setup/software.md @@ -0,0 +1,102 @@ +# Activate the Barcodes in Odoo + +(inventory-barcode-software)= + +The barcode scanning features can save you a lot of time usually lost +switching between the keyboard, the mouse and the scanner. Properly +attributing barcodes to products, pickings locations, etc. allows you to +work more efficiently by controlling the software almost exclusively +with the barcode scanner. + +## Configuration + +To use this feature, you first need to activate the *Barcode* +functionality via {menuselection}`Inventory --> Settings --> Barcode Scanner`. Once you +have ticked the feature, you can hit save. + +```{image} software/software_01.png +:align: center +``` + +## Set Product Barcodes + +You can easily assign barcodes to your different products via the +*Inventory* app. To do so, go to {menuselection}`Settings --> Configure Products Barcodes`. + +```{image} software/software_02.png +:align: center +``` + +Then, you have the possibility to assign barcodes to your products +directly at creation on the product form. + +```{image} software/software_03.png +:align: center +``` + +```{image} software/software_04.png +:align: center +``` + +:::{note} +Be careful to add barcodes directly on the product variants and not on +the template product. Otherwise, you won’t be able to differentiate +them. +::: + +(barcode-setup-location)= + +## Set Locations Barcodes + +If you manage multiple locations, you will find useful to attribute a +barcode to each location and stick it on the location. You can configure +the locations barcodes in {menuselection}`Inventory --> Configuration --> Locations`. + +```{image} software/software_05.png +:align: center +``` + +```{image} software/software_06.png +:align: center +``` + +:::{note} +You can easily print the barcode you allocate to the locations via the +*Print* menu. +::: + +## Barcode Formats + +Most retail products use EAN-13 barcodes, also known as GTIN (Global Trade Identification Numbers). +GTIN are used by companies to uniquely identify their products and services. While GTIN and UPC are +often used synonymously, GTIN refers to the number a barcode represents, while UPC refers to the +barcode itself. More information about GTIN can be found on the GS1 website. + +In order to create GTIN for items, a company must have a GS1 Company Prefix. This prefix is the +number that will appear at the beginning of each GTIN, and will identify the company as the owner of +the barcode any the products it appears on. To learn more about GS1 Company Prefixes, or purchase a +license for a prefix, visit the GS1 Company Prefix page. + +Odoo users are able to use GTIN barcodes to identify their products. However, since Odoo supports +any numeric string as a barcode, it is also possible to define a custom barcode for internal use. + +(barcode-setup-barcodelookup)= + +## Barcode Lookup + +[Barcode Lookup](https://www.barcodelookup.com/) allows you to scan (or enter) products' barcodes +({abbr}`UPC (Universal Product Code)`, {abbr}`EAN (European Article Number)`, or {abbr}`ISBN +(International Standard Book Number)`) to automatically create them in your Odoo database, complete +with product names, descriptions, images, categories, etc. + +To use Barcode Lookup to scan and create products in Barcode, go to {menuselection}`Inventory --> +Configuration --> Settings`, scroll down to the {guilabel}`Barcode` section, and enable +{guilabel}`Stock Barcode Database`. + +:::{note} +If your database is hosted on **Odoo.sh** or **on-premise**, you must also {ref}`configure +an API key `. +If your database is hosted on **Odoo Online**, you can use Barcode Lookup without further +configuration. +::: + diff --git a/content/applications/inventory_and_mrp/inventory.md b/content/applications/inventory_and_mrp/inventory.md new file mode 100644 index 000000000..2dab078f2 --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory.md @@ -0,0 +1,24 @@ +--- +hide-page-toc: true +nosearch: true +show-content: true +show-toc: true +--- + +# Inventory + +Odoo *Inventory* is both an inventory application and a warehouse management system. The app allows +users to easily manage lead times, automate replenishment, configure advanced routes, and more. + +:::{seealso} +- [Odoo Tutorials: Inventory](https://www.odoo.com/slides/inventory-24) +::: + +```{toctree} +:titlesonly: true + +inventory/product_management +inventory/warehouses_storage +inventory/shipping_receiving +``` + diff --git a/content/applications/inventory_and_mrp/inventory/product_management.md b/content/applications/inventory_and_mrp/inventory/product_management.md new file mode 100644 index 000000000..a5499c5cc --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/product_management.md @@ -0,0 +1,14 @@ +--- +nosearch: true +--- + +# Product management + +```{toctree} +:titlesonly: true + +product_management/configure +product_management/product_tracking +product_management/inventory_valuation +``` + diff --git a/content/applications/inventory_and_mrp/inventory/product_management/configure.md b/content/applications/inventory_and_mrp/inventory/product_management/configure.md new file mode 100644 index 000000000..3a51a70e7 --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/product_management/configure.md @@ -0,0 +1,168 @@ +--- +show-content: true +substitutions: + UoM: '{abbr}`UoM (Unit of Measure)`' + UoMs: '{abbr}`UoMs (Units of Measure)`' +--- + +# Configure product + +A group of products in Odoo can be further defined using: + +- {doc}`Units of measure (UoM) `: a standard quantity for specifying product amounts + (e.g., meters, yards, kilograms). Enables automatic conversion between measurement systems in + Odoo, such as centimeters to feet. + + - *Ex: Purchasing fabric measured in meters but receiving it in yards from a vendor.* + +- {doc}`configure/package`: A physical container used to group products together, regardless of + whether they are the same or different. + + - *Ex: A box containing assorted items for delivery, or a storage box of two hundred buttons on a + shelf.* + +- {doc}`configure/packaging`: groups the *same* products together to receive or sell them in + specified quantities. + + - *Ex: Cans of soda sold in packs of six, twelve, or twenty-four.* + +## Comparison + +This table provides a detailed comparison of units of measure, packages, and packaging to help +businesses evaluate which best suits their requirements. + +```{eval-rst} +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - Feature + - Unit of measure + - Packages + - Packaging + * - Purpose + - Standardized measurement for product units (e.g., cm, lb, L) + - Tracks the specific physical container and its contents + - Groups a fixed number of items together for easier management (e.g., packs of 6, 12 or 24) + * - Product uniformity + - Defined per product; saved as one |UoM| in the database + - Allows mixed products + - Same products only + * - Flexible + - Converts between vendor/customer |UoMs| and database |UoM| + - Items can be added or removed from the container + - Quantities are fixed (e.g., always packs of 6, 12 or 24) + * - Complexity + - Simplest for unit conversions + - More complex due to container-level inventory tracking + - Simpler; suitable for uniform product groupings + * - Inventory tracking + - Tracks product quantities within the warehouse in the specific |UoM| defined in the product + form + - Tracks package location and contents within the warehouse + - Tracks grouped quantities but not individual items' locations + * - Smooth barcode operations + - Not available + - Requires scanning both the package and individual items for reception. (even if there are 30 + items in a package). Can enable the :ref:`Move Entire Packages + ` feature to update the package's contained + items' locations, when moving the package + - Scanning a packaging barcode automatically records all included units. (e.g. 1 pack = 12 + units) + * - Product lookup + - Not available + - Scanning a product's barcode identifies its typical storage location in the Odoo database + - Barcode identifies grouped quantity, not storage location + * - Unique barcodes + - Not available + - Unique barcodes for individual packages (e.g. Pallet #12) + - Barcodes set at the packaging type level (e.g. for a pack of 6) + * - Reusability + - Not applicable + - Can be disposable or reusable, configured via the :ref:`Package Use + ` field + - Disposable only + * - Container weight + - Not applicable + - Weight of the container itself is included in the *Shipping Weight* field of a package + (:menuselection:`Inventory app --> Products --> Packages`) + - Weight of the container is defined in the *Package Type* settings + * - Lot/serial number tracking + - Requires manual adjustments to track |UoMs| via lots (See :ref:`use case + ` for details) + - Applies only to contained products + - Applies to both contained products and the container + * - Custom routes + - Cannot be set + - Cannot be set + - Routes can define specific warehouse paths for a particular packaging type +``` + +## Use cases + +After comparing the various features, consider how these businesses, with various inventory +management and logistics workflows, came to their decision. + +### Pallets of items using packaging + +A warehouse receives shipments of soap organized on physical pallets, each containing 96 bars. These +pallets are used for internal transfers and are also sold as standalone units. For logistical +purposes, the pallet's weight must be included in the total shipping weight for certain deliveries. +Additionally, the pallet requires a barcode to facilitate tracking, and the number of individual +bars of soap must be included in the stock count when the pallet is received. + +After evaluating various options, *product packaging* was the most suitable solution. Packaging +enables assigning a barcode to a pallet, identifying it as a "pallet type" containing 96 soap bars. +This barcode streamlines operations by automatically registering the grouped quantity. Key +distinctions include: + +- **Warehouse tracking limitations**: Odoo tracks only the total quantity, not the number of + packagings. For instance, if a pallet with 12 and 24 quantities is received, Odoo records 36 + quantities, not the pallet details. +- **Packaging barcodes are type-specific, not unique**: Barcodes represent packaging types (e.g., + "pallet of 96 soap bars") but do not uniquely identify individual pallets, such as Pallet #1 or + Pallet #2. + +### Capture product information using barcode + +An Odoo user expects the **Barcode** app to display the typical storage location of a product by +scanning a barcode for a container. + +*Packages* was the most suitable. When the {ref}`appropriate setting is enabled +`, scanning a package barcode displays its contents in +the **Barcode** app. + +Packages represent physical containers, enabling detailed tracking of the items they hold. +Scanning a package provides visibility into its contents and facilitates operations, like inventory +moves. + +(inventory-product-management-lots-uom)= + +### Track different units of measure in storage + +A fruit juice distributor tracks multiple {{ UoMs }} for their operations: + +- Fruits are purchased in tons. +- Juice is produced and stored in kilograms. +- Small samples are stored in grams for recipe testing. + +*Unit of Measure* was most suitable. Odoo automatically converts tons to kilograms during +receipts. However, since Odoo tracks only one {{ UoM }} per product in the database, the company uses +lot numbers to differentiate {{ UoMs }}: + +- LOT1: Grams (g) +- LOT2: Kilograms (kg) + +Manual inventory adjustments are required to convert between lots, such as subtracting 1 kg from +LOT2 to add 1,000 g to LOT1. While functional, this workaround can be time-consuming and prone to +errors. + +```{toctree} +:titlesonly: true + +configure/type +configure/uom +configure/package +configure/packaging +``` + diff --git a/content/applications/inventory_and_mrp/inventory/product_management/configure/package.md b/content/applications/inventory_and_mrp/inventory/product_management/configure/package.md new file mode 100644 index 000000000..e2ddee716 --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/product_management/configure/package.md @@ -0,0 +1,228 @@ +--- +substitutions: + SO: '{abbr}`SO (Sales Order)`' +--- + +# Packages + +A *package* is a physical container holding one or more products. Packages can also be used to store +items in bulk. + +Packages are commonly used for the following purposes: + +1. {ref}`Grouping products to move them in bulk `. +2. {ref}`Shipping to customers `: configure package types + to align with shipping carriers' size and weight requirements, streamlining the packing process, + and ensuring compliance with carrier shipping specifications. +3. Storing items in bulk. + +*Package use* is a field on the package form in Odoo that is only visible by enabling the *Batch +Transfers* and *Packages* features ({menuselection}`Inventory app --> Configuration --> Settings`). + +By default, the *Package Use* field on a packages form is set to *Disposable Box*. Change this field +to *Reusable Box* **only** when configuring packages for {ref}`cluster pickings +`. + +*Package type* is an optional feature used for {doc}`calculating shipping cost +<../../shipping_receiving/setup_configuration>`, based on real shipping weight. Create package types +to include the weight of the package itself (e.g. boxes, pallets, other shipping containers) in +shipping cost calculations. + +:::{note} +While packages are commonly used in the {doc}`three-step delivery route +<../../shipping_receiving/daily_operations/delivery_three_steps>`, they can be used in any +workflow involving storable products. +::: + +(inventory-warehouses-storage-enable-package)= + +## Configuration + +To use packages, first go to {menuselection}`Inventory app --> Configuration --> Settings`. Under +the {guilabel}`Operations` heading, activate the {guilabel}`Packages` feature. Then, click +{guilabel}`Save`. + +```{image} package/enable-pack.png +:align: center +:alt: Activate the *Packages* setting in Inventory > Configuration > Settings. +``` + +(inventory-product-management-move-entire-pack)= + +When moving packages internally, the *Move Entire Packages* feature can be enabled on an operation +type to update a package's contained item's location upon updating the package's location. + +To do that, go to {menuselection}`Inventory app --> Configuration --> Operations Types` and select +the desired operation this feature will apply to (may have to set it for multiple). + +On the operation type page, in the {guilabel}`Packages` section, tick the {guilabel}`Move Entire +Packages` checkbox. + +(inventory-warehouses-storage-pack)= + +## Pack items + +Products can be added to packages in any transfer by: + +1. Clicking each {ref}`Detailed Operations ` icon + on the product line. +2. Using the {ref}`Put in Pack ` button to place + everything in the transfer into a package. + +(inventory-warehouses-storage-detailed-operations)= + +### Detailed operations + +On any warehouse transfer (e.g. receipt, delivery order), add a product to a package by clicking the +{guilabel}`⦙≣ (bulleted list)` icon in the {guilabel}`Operations` tab. + +```{image} package/detailed-operations.png +:align: center +:alt: Show "Detailed Operations" icon in the product line. +``` + +Doing so opens the {guilabel}`Detailed Operations` pop-up window for the {guilabel}`Product`. + +To put the {guilabel}`Product` in a package, click {guilabel}`Add a line`, and assign the product to +a {guilabel}`Destination Package`. Select an existing package, or create a new one by typing the +name of the new package, then select {guilabel}`Create...`. + +:::{figure} package/destination-package.png +:align: center +:alt: Assign a package to "Destination Package" field. + +Twelve units of `Acoustic Bloc Screen` are placed in `PACK0000001`. +::: + +Then, specify the quantity of items to go into the package in the {guilabel}`Done` column. Repeat +the above steps to place the {guilabel}`Product` in different packages. Once finished, click +{guilabel}`Confirm` to close the window. + +:::{seealso} +{doc}`Ship one order in multiple packages +<../../shipping_receiving/setup_configuration/multipack>` +::: + +(inventory-warehouses-storage-put-in-pack)= + +### Put in pack + +Alternatively, click the {guilabel}`Put in Pack` button on **any** warehouse transfer to create a +new package, and place all the items in the transfer in that newly-created package. + +:::{important} +The {guilabel}`Put in Pack` button appears on receipts, delivery orders, and other transfer forms +with the *Packages* feature enabled in {menuselection}`Inventory app --> Configuration --> +Settings`. +::: + +:::{figure} package/put-in-pack.png +:align: center +:alt: Image of the "Put in Pack" button being clicked. + +In batch transfer `BATCH/00003`, the {guilabel}`Put in Pack` button was clicked to create a new +package, `PACK0000002`, and assign all items to it in the {guilabel}`Destination Package` field. +::: + +(inventory-warehouses-storage-package-type)= + +## Package type + +Create package types by navigating to {menuselection}`Inventory app --> Configuration --> Package +Types`, in order to set custom dimensions and weight limits. This feature is mainly used to +calculate package weights for shipping costs. + +:::{seealso} +- {doc}`Shipping carriers <../../shipping_receiving/setup_configuration/third_party_shipper>` +- {doc}`../../shipping_receiving/setup_configuration` +::: + +On the {guilabel}`Package Types` list, clicking {guilabel}`New` opens a blank package type form. The +fields of the form are as follows: + +- {guilabel}`Package Type` (required): define the package type's name. +- {guilabel}`Size`: define the dimensions of the package in millimeters (mm). The fields, from left + to right, define the {guilabel}`Length`, {guilabel}`Width`, and {guilabel}`Height`. +- {guilabel}`Weight`: weight of an empty package (e.g. an empty box, pallet). + +:::{note} +Odoo calculates the package's weight by adding the weight of the empty package plus the weight of +the item(s), which can be found in the {guilabel}`Weight` field, in the {guilabel}`Inventory` +tab, of each product form. +::: + +- {guilabel}`Max Weight`: maximum shipping weight allowed in the package. +- {guilabel}`Barcode`: define a barcode to identify the package type from a scan. +- {guilabel}`Company`: specify a company to make the package type available **only** at the selected + company. Leave the field blank if it is available at all companies. +- {guilabel}`Carrier`: specify the intended shipping carrier for this package type. +- {guilabel}`Carrier Code`: define a code that is linked to the package type. + +```{image} package/package-type.png +:align: center +:alt: Package type for FedEx's 25 kilogram box. +``` + +(inventory-warehouses-storage-cluster-pack)= + +## Cluster packages + +To use *cluster packages*, first navigate to {menuselection}`Inventory app --> Configuration --> +Settings`, and activate the {guilabel}`Batch Transfers` feature, located in the +{guilabel}`Operations` section. Doing so makes the *Package Use* field become visible on a package +form. + +```{image} package/enable-batch.png +:align: center +:alt: Activate the *Batch Transfers* feature in Inventory > Configuration > Settings. +``` + +Add new packages by going to {menuselection}`Inventory app --> Products --> Packages`. Then, click +{guilabel}`New`, or select an existing package. Doing so opens the package form, which contains the +following fields: + +- {guilabel}`Package Reference` (required): name of the package. + +- {guilabel}`Package Type`: used for {ref}`configuring shipping boxes to ship to the customer + `. + + :::{note} + {guilabel}`Package Type` is unnecessary for configuring packages for cluster pickings. + ::: + +- {guilabel}`Shipping Weight`: used to input the weight of the package after measuring it on a + scale. + +- {guilabel}`Company`: specify a company to make the package available **only** at the selected + company. Leave the field blank if the package is available at all companies. + +- {guilabel}`Location`: current location of the package. + +- {guilabel}`Pack Date`: the date the package was created. + +- {guilabel}`Package Use`: choose {guilabel}`Reusable` for packages used for moving products within + the warehouse; {guilabel}`Disposable` for packages used to ship products to customers. + +```{image} package/package.png +:align: center +:alt: Display package form to create a cluster pack. +``` + +:::{seealso} +{doc}`Using cluster packages <../../shipping_receiving/picking_methods/cluster>` +::: + +## View packages + +To view all packages go to {menuselection}`Inventory app --> Products --> Packages`. By default, +packages are shown in Kanban view, in their current storage location. + +:::{tip} +Drag-and-drop packages to move them between internal locations. +::: + +```{image} package/packages-kanban.png +:align: center +:alt: Packages dashboard. +``` + diff --git a/content/applications/inventory_and_mrp/inventory/product_management/configure/packaging.md b/content/applications/inventory_and_mrp/inventory/product_management/configure/packaging.md new file mode 100644 index 000000000..65d02f076 --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/product_management/configure/packaging.md @@ -0,0 +1,198 @@ +--- +substitutions: + adjust: '{icon}`oi-settings-adjust` {guilabel}`(additional options)`' +--- + +# Packaging + +In Odoo *Inventory*, *packaging* refers to disposable containers holding multiple units of a +specific product. + +For example, different packages for cans of soda, such as a 6-pack, a 12-pack, or a case of 36, +**must** be configured on the individual product form. This is because packagings are product +specific, not generic. + +:::{tip} +Packaging can be used in conjunction with Odoo {ref}`Barcode `. When +receiving products from suppliers, scanning the packaging barcode automatically adds the number +of units in the packaging to the internal count of the product. +::: + +## Configuration + +To use packagings, navigate to {menuselection}`Inventory app --> Configuration --> Settings`. Then, +under the {guilabel}`Products` heading, enable the {guilabel}`Product Packagings` feature, and click +{guilabel}`Save`. + +```{image} packaging/enable-packagings.png +:align: center +:alt: Enable packagings by selecting "Product Packagings". +``` + +(inventory-product-management-packaging-setup)= + +## Create packaging + +Packagings can be created directly on the product form, or from the {guilabel}`Product Packagings` +page. + +### From product form + +Create packagings on a product form by going to {menuselection}`Inventory app --> Products --> +Products`, and select the desired product. + +Under the {guilabel}`Inventory` tab, scroll down to the {guilabel}`Packaging` section, and click +{guilabel}`Add a line`. In the table, fill out the following fields: + +- {guilabel}`Packaging` (required): name of packaging that appears on sales/purchase orders as a + packaging option for the product. +- {guilabel}`Contained quantity` (required): amount of product in the packaging. +- {guilabel}`Unit of Measure` (required): measurement unit for quantifying the product. +- {guilabel}`Sales`: check this option for packagings intended for use on sales orders. +- {guilabel}`Purchase`: check this option for packagings intended for use on purchase orders. + +:::{note} +Access additional fields in the {guilabel}`Packaging` table below by clicking the {{ adjust }} icon +to the far-right of the column titles in the {guilabel}`Packaging` section, and selecting the +desired options from the drop-down menu that appears. +::: + +- {guilabel}`Barcode`: identifier for tracing packaging in stock moves or pickings, using the + {ref}`Barcode app `. Leave blank if not in use. +- {guilabel}`Company`: indicates the packaging is only available at the selected company. Leave + blank to make the packaging available across all companies. + +```{eval-rst} +.. example:: + To create a packaging type for six units of the product, `Grape Soda`, begin by clicking + :guilabel:`Add a line`. In the line, name the :guilabel:`Packaging` `6-pack`, and set the + :guilabel:`Contained quantity` to `6`. Repeat this process for additional packagings. + + .. image:: packaging/create-product-packaging.png + :align: center + :alt: Create 6-pack case for product. +``` + +### From product packagings page + +To view all packagings that have been created, go to {menuselection}`Inventory app --> Configuration +--> Product Packagings`. Doing so reveals the {guilabel}`Product Packagings` page with a complete +list of all packagings that have been created for all products. Create new packagings by clicking +{guilabel}`New`. + +```{eval-rst} +.. example:: + Two soda products, `Grape Soda` and `Diet Coke`, have three types of packagings configured. On + the :guilabel:`Product Packagings` page, each product can be sold as a `6-Pack` that contains 6 + products, as a `12-Pack` of 12 products, or as a `Case` of 32 products. + + .. image:: packaging/packagings.png + :align: center + :alt: List of different packagings for products. +``` + +### Partial reservation + +After {ref}`completing the packaging setup `, +packagings can be reserved in full or partial quantities for outgoing shipments. Partial packaging +flexibility expedites order fulfillment by allowing the immediate shipment of available items, while +awaiting the rest. + +To configure packaging reservation methods, go to {menuselection}`Inventory app --> Configuration +--> Product Categories`. Then, click {guilabel}`New`, or select the desired product category. + +On the product category's form, in the {guilabel}`Logistics` section, {guilabel}`Reserve Packagings` +can be set to {guilabel}`Reserve Only Full Packagings` or {guilabel}`Reserve Partial Packagings`. + +:::{important} +To see the {guilabel}`Reserve Packaging` field, the {guilabel}`Product Packaging` feature +**must** be enabled. To enable this feature, go to {menuselection}`Inventory app --> +Configuration --> Settings`, scroll to the {guilabel}`Products` section, tick the +{guilabel}`Product Packagings` checkbox, and click {guilabel}`Save`. +::: + +```{image} packaging/reserve-packaging.png +:align: center +:alt: Show Reserve Packagings field on the product categories page. +``` + +```{eval-rst} +.. example:: + To better evaluate the options based on business needs, consider the following example: + + - a product is sold in twelve units per packaging. + - an order demands two packagings. + - there are only twenty-two units in stock. + + When :guilabel:`Reserve Only Full Packagings` is selected, only twelve units are reserved for the + order. + + Conversely, when :guilabel:`Reserve Partial Packagings` is selected, twenty-two units are + reserved for the order. +``` + +## Apply packagings + +When creating a sales order in the {menuselection}`Sales` app, specify the packagings that should be +used for the product. The chosen packaging is displayed on the {abbr}`SO (Sales Order)` under the +{guilabel}`Packaging` field. + +```{eval-rst} +.. example:: + 18 cans of the product, `Grape Soda`, is packed using three 6-pack packagings. + + .. image:: packaging/packagings-sales-order.png + :align: center + :alt: Assign packagings on the Sales Order Line. +``` + +(inventory-product-management-packaging-route)= + +## Routes for packaging + +When receiving packagings, by default, they follow the warehouse's {doc}`configured reception route +<../../shipping_receiving/daily_operations>`. To **optionally** set up a packaging-specific route, +go to {menuselection}`Inventory app --> Configuration --> Routes`. + +:::{important} +The *Product Packagings*, *Storage Locations*, and *Multi-Step Routes* features (found by going +to {menuselection}`Inventory app --> Configuration --> Settings`) **must** be activated, and +saved. +::: + +:::{seealso} +{doc}`../../shipping_receiving/daily_operations/use_routes` +::: + +### Create route + +On the {guilabel}`Routes` page, click {guilabel}`New`, or select a route that is **not** for a +warehouse. Next, in the {guilabel}`Applicable on` section, tick the {guilabel}`Packagings` checkbox. + +:::{figure} packaging/route.png +:align: center +:alt: Create route for a packaging. + +Route with "Packagings" selected, with "Products" and "Warehouses" not selected. +::: + +(inventory-product-management-route-on-packaging)= + +### Apply route on packaging + +Then, to apply the route, go to {menuselection}`Inventory app --> Products --> Products`, and +select the product that uses packaging. + +In the product form, switch to the {guilabel}`Inventory` tab. In the {guilabel}`Packaging` section +that contains {ref}`configured packagings `, click the +{{ adjust }} icon. Tick the {guilabel}`Routes` checkbox to make the column visible in the +{guilabel}`Packaging` table. + +In the {guilabel}`Routes` field, select the packaging-specific route. Repeat these steps for all +packaging intended to use the route. + +```{image} packaging/apply-route.png +:align: center +:alt: Set route on a packaging. +``` + diff --git a/content/applications/inventory_and_mrp/inventory/product_management/configure/type.md b/content/applications/inventory_and_mrp/inventory/product_management/configure/type.md new file mode 100644 index 000000000..db764a773 --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/product_management/configure/type.md @@ -0,0 +1,349 @@ +--- +substitutions: + BOM: '{abbr}`BoM (Bill of Materials)`' +--- + +# Product type + +In Odoo, goods and services are both set up as *products*. When setting up a new product, there are +several fields that should be carefully chosen, as they determine how to invoice and track a +business' goods or services. + +To configure an existing product, go to {menuselection}`Inventory app --> Products --> Products`, +and select the desired product from the list. Alternatively, from the {guilabel}`Products` menu, +click {guilabel}`New` to create a new product. + +:::{seealso} +[Odoo Tutorials: Product Type](https://www.youtube.com/watch?v=l6j0ZkP5mLM) +::: + +(inventory-product-management-for-sale-or-purchase)= + +## For sale vs. purchase + +Goods and services can be designated as those that can be bought, sold, or both. On the product +form, tick the {guilabel}`Sales` checkbox if a product can be *sold* to a customer (e.g. finished +goods). Tick {guilabel}`Purchase` if the product can be *purchased* (e.g. raw materials). + +```{eval-rst} +.. example:: + If a resale clothing shop buys discounted denim jackets and sells them at a higher cost to the + end consumer, the `Jacket` product form might have *both* the :guilabel:`Sales` and + :guilabel:`Purchase` checkbox ticked. + + On the other hand, say the store occasionally sews new jackets using denim and thread as + raw materials. In the `Denim` and `Thread` product forms, only :guilabel:`Purchase` should be + ticked, whereas the `Handmade Jacket` product form would only tick :guilabel:`Sales`. +``` + +## Goods vs. services + +When configuring a product, a {guilabel}`Product Type` needs to be selected on the +{guilabel}`General Information` tab of a product form. Each product type impacts different +operations in other Odoo applications, such as **Sales** and **Purchase**, and should be chosen +carefully. + +- {guilabel}`Goods`: a tangible, material object (e.g. anything from a hamburger to a house) +- {guilabel}`Service`: an intangible, immaterial offering (e.g., a repair, a haircut, call center + assistance) +- {guilabel}`Combo`: any mix of goods and services (e.g. a new car (*good*) with an oil change + included (*service*)) + +:::{note} +Due to their immaterial nature, services are not trackable in Odoo's **Inventory** application. +::: + +(inventory-product-management-manufacture)= + +## Configure goods + +Selecting {guilabel}`Goods` as the {guilabel}`Product Type` automatically triggers the appearance of +a few fields and tabs in the product form: + +- {guilabel}`Inventory` tab: From here, + {doc}`purchasing and manufacturing routes <../../shipping_receiving/daily_operations/use_routes>` + and product logistics, such as product weight and customer lead time, can be specified. + +- {ref}`Invoicing Policy ` field: This field + determines at what point in the sales process a customer is invoiced. + + :::{important} + The {guilabel}`Invoicing Policy` field **only** appears if the **Sales** app is installed. + ::: + +- {ref}`Track Inventory ` field: This checkbox + determines whether Odoo tracks inventory for this product. + +- Smart buttons: Some smart buttons appear above the form when {guilabel}`Goods` is selected; + others show upon selecting a {guilabel}`Track Inventory` method. For example, + {guilabel}`On Hand` and {guilabel}`Forecasted` display when {guilabel}`Track Inventory` is + ticked. In general, most smart buttons on a product form link to {ref}`inventory operations + `. + +```{image} type/product-form.png +:alt: Designate a product as a good or service. +``` + +(inventory-product-management-invoicing-policy)= + +### Invoicing policy + +The {guilabel}`Invoicing policy` field only shows on the product form if a product is for sale (in +other words, if {guilabel}`Sales` is ticked, and the **Sales** app is installed). + +When configuring a product for sale, it is necessary to choose an +{doc}`invoicing policy <../../../../sales/sales/invoicing/invoicing_policy>`. When an invoicing +policy of {guilabel}`Ordered quantities` is selected, customers are invoiced once the sales order +is confirmed. When {guilabel}`Delivered quantities` is selected, customers are invoiced once the +delivery is completed. + +(inventory-product-management-tracking-inventory)= + +### Tracked vs. untracked goods + +The {guilabel}`Track Inventory` field on the product form determines a lot of Odoo's **Inventory** +operations. + +*Tracked* products are those for which stock and inventory are maintained. Examples include finished +goods and, often, the raw materials or components needed to make them. + +When {guilabel}`Track Inventory` is ticked, a drop-down menu appears, offering for inventory to be +tracked one of three ways: {guilabel}`By Unique Serial Number`, {guilabel}`By Lots`, or +{guilabel}`By Quantity`. + +```{image} type/tracked.png +:alt: Configure a tracked good. +``` + +*Untracked* products (sometimes referred to as *non-inventory* products) are typically consumed in a +short period of time, meaning that stock/inventory does *not* need to be maintained. Non-inventory +products are often essential, but exact counts are unnecessary. Examples include: office supplies, +packaging materials, or items used in production that do not need to be individually tracked. + +:::{tip} +Tick the {guilabel}`Track Inventory` checkbox if it is necessary to track a product's stock at +various locations, for inventory valuation, with lots and/or serial numbers, or when using +reordering rules. +::: + +:::{seealso} +{doc}`Tracking storable products using lot and serial numbers <../product_tracking>` +::: + +(inventory-product-management-inventory-ops-by-product-type)= + +### Inventory operations by product type + +{ref}`Whether a good is tracked or untracked ` +affects common **Inventory** operations, like transfers and reordering rules. + +The table below summarizes which operations (and smart buttons) are enabled for tracked vs. +untracked goods. Click highlighted chart items to navigate to detailed sections and related +documents. + +```{eval-rst} +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - Inventory operation + - Tracked + - Untracked + * - :ref:`Show on-hand quantity ` + - Yes + - No + * - :ref:`Show forecasted quantity ` + - Yes + - No + * - :ref:`Use reordering rules ` + - Yes + - No + * - :ref:`Can be included in a purchase order ` + - Yes + - Yes + * - :ref:`Use putaway rules ` + - Yes + - No + * - :ref:`Can be manufactured, subcontracted, or used in another good's BoM + ` + - Yes + - Yes + * - :doc:`Use inventory adjustments <../../warehouses_storage/inventory_management/count_products>` + - Yes + - No + * - :doc:`Use inventory valuation <../inventory_valuation/using_inventory_valuation>` + - Yes + - No + * - :ref:`Create transfer ` + - Yes + - Yes + * - :doc:`Use lot/serial number tracking <../product_tracking>` + - Yes + - No + * - :doc:`Can be placed in a kit <../../../manufacturing/advanced_configuration/kit_shipping>` + - Yes + - Yes + * - :ref:`Can be placed in a package ` + - Yes + - Yes + * - :ref:`Appears on inventory reports ` + - Yes + - No +``` + +#### Inventory + +(inventory-product-management-on-hand)= + +##### On-hand and forecasted quantities + +A tracked product's on-hand and forecasted quantities, based on incoming and outgoing orders, are +reflected on the product form with two smart buttons: + +- {icon}`fa-cubes` {guilabel}`On-Hand Quantity`: This represents the number of units currently + available in inventory. Click the button to view or add stock levels for a tracked product. +- {icon}`fa-area-chart` {guilabel}`Forecasted`: This represents the number of units *expected* to be + available in inventory after all orders are taken into account. In other words, + $\text{forecasted} = \text{on hand quantity} + \text{incoming shipments} - \text{outgoing shipments}$. + Click the button to view the {guilabel}`Forecasted Report`. + +On the other hand, untracked products are regarded as *always* available. Consequently, +{guilabel}`On-Hand Quantity` is not tracked, and there is no {guilabel}`Forecasted` quantity +available. + +(inventory-product-management-putaway)= + +##### Putaway rules and storage + +Both tracked and untracked goods can optimize storage using: + +- {icon}`fa-random` {doc}`Putaway Rules <../../shipping_receiving/daily_operations/putaway>`: + This represents putaway rules that apply to a good, such as where to store it when a new shipment + arrives. +- {icon}`fa-cubes` + {doc}`Storage Capacities <../../shipping_receiving/daily_operations/storage_category>`: + This represents any storage capacity limitations specified for this good. For example, a warehouse + may require that only ten (or less) sofas be stored there at any given time, due to their large + size. + +(inventory-product-management-replenishment)= + +##### Replenishment + +###### Reordering rules + +Only tracked products can trigger +{doc}`reordering rules <../../warehouses_storage/replenishment/reordering_rules>` to generate +purchase orders. Untracked goods *cannot* be managed using reordering rules. + +Reordering rules can be configured directly on the product form via the +{icon}`fa-refresh` {guilabel}`(refresh)` icon. + +:::{note} +If reordering rules already exist on a product, Odoo re-labels this button to +{guilabel}`Min / Max`, to show the minimum and maximum number of units that must be in stock. +::: + +(inventory-product-management-po)= + +###### Create purchase orders + +Both tracked and untracked products can be included in a request for quotation in the **Purchase** +app. However, when receiving untracked products, their on-hand quantity does not change upon +validating the receipt (`WH/IN`). + +###### Replenish smart button + +The {guilabel}`Replenish` smart button allows all goods to be restocked directly from the product +form, according to the *Preferred Route*. + +:::{seealso} +{doc}`Replenishment <../../warehouses_storage/replenishment>` +[Odoo Tutorials: Replenishment Methods for Manufacturing](https://www.youtube.com/watch?v=vtjeMGcG8aM) +::: + +(inventory-product-management-manufacturing)= + +#### Manufacturing + +Both tracked and untracked products can be manufactured, +{doc}`subcontracted <../../../manufacturing/subcontracting>`, or included in another product's +{doc}`bill of materials (BoM) <../../../manufacturing/basic_setup/bill_configuration>`. + +(inventory-product-management-bom)= + +On the product form for a tracked or untracked good, there are several smart buttons that may +appear for manufacturing operations: + +- {icon}`fa-flask` {guilabel}`Bill of Materials`: This shows the BoMs used to make this product. +- {icon}`fa-level-up` {guilabel}`Used In`: This shows other goods that include this product in their + BoM. + +(inventory-product-management-transfer-store)= + +#### Transfer goods + +*Transfers* are warehouse operations that involve the movement of goods. Examples of transfers +include {doc}`deliveries and receipts +<../../shipping_receiving/daily_operations/receipts_delivery_one_step>`, as well as +{doc}`internal transfers <../../warehouses_storage/replenishment/resupply_warehouses>` between +warehouses. + +When creating a transfer for tracked products in the **Inventory** app, transfers modify the on-hand +quantity at each location. For example, transferring five units from the internal location +`WH/Stock` to `WH/Packing Zone` decreases the recorded quantity at `WH/Stock` and increases it at +`WH/Packing Zone`. + +For untracked products, transfers can be created, but exact quantities at each storage location are +not tracked. + +(inventory-product-management-package)= + +#### Packages + +Both tracked and untracked (non-inventory), products can be placed in {doc}`packages `. + +However, for non-inventory products, the quantity is not tracked, and the product is not listed in +the package's {guilabel}`Contents` (which can be accessed by going to {menuselection}`Inventory app +--> Products --> Packages`, and selecting the desired package). + +:::{figure} type/package-content.png +:alt: Show Packages page, containing the package contents list. + +An untracked product was placed in the package, but the **Content** section does not list it. +::: + +Additionally, if the *Move Entire Packages* feature is enabled, moving a package updates the +location of the contained tracked products but not the contained untracked products. To enable this +feature, navigate to {menuselection}`Inventory app --> Configuration --> Operations Types`, select +any operation, and tick the {guilabel}`Move Entire Packages` checkbox. + +(inventory-product-management-report)= + +#### Inventory reports + +**Only** tracked products appear on the following reports. + +:::{important} +These reports are only available to users with +{doc}`administrator access <../../../../general/users/access_rights>`. +::: + +- {doc}`Stock report <../../warehouses_storage/reporting/stock>`: This report provides a + comprehensive list of all on-hand, unreserved, incoming, and outgoing tracked inventory. To access + the report, go to {menuselection}`Inventory app --> Reporting --> Stock`. +- {doc}`Location report <../../warehouses_storage/reporting/locations>`: This report shows a + breakdown of which tracked products are held at each location (internal, external, or virtual). + The report is only available with the *Storage Location* feature activated + ({menuselection}`Inventory app --> Configuration --> Settings`). To access it, go to + {menuselection}`Inventory app --> Reporting --> Locations`. +- {doc}`Moves History report <../../warehouses_storage/reporting/moves_history>`: This report + summarizes where and when this good has moved in/out of stock. To access the report, go to + {menuselection}`Inventory app --> Reporting --> Moves History`. Alternatively, click the + {icon}`fa-exchange` {guilabel}`In / Out` smart button on a product form to filter the report + on that product's specific moves history. +- {guilabel}`Moves Analysis`: This report provides a pivot table view of inventory transfers by + operation type. +- {ref}`Stock Valuation report `: A detailed record + of the monetary value of all tracked inventory. + diff --git a/content/applications/inventory_and_mrp/inventory/product_management/configure/uom.md b/content/applications/inventory_and_mrp/inventory/product_management/configure/uom.md new file mode 100644 index 000000000..e97607010 --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/product_management/configure/uom.md @@ -0,0 +1,173 @@ +--- +substitutions: + PO: '{abbr}`PO (Purchase Order)`' + POs: '{abbr}`POs (Purchase Orders)`' + RFQ: '{abbr}`RFQ (Request for Quotation)`' + SO: '{abbr}`SO (Sales Order)`' + UOM: '{abbr}`UoM (Unit of Measure)`' +--- + +# Units of measure + +In some cases, handling products in different units of measure is necessary. For example, a business +can buy products from a country that uses the metric system, and then sell those products in a +country that uses the imperial system. In that case, the business needs to convert the units. + +Another case for unit conversion is when a business buys products in a big pack from a supplier, and +then sells those products in individual units. + +Odoo can be set up to use different *units of measure (UoM)* for one product. + +## Configuration + +To use different units of measure in Odoo, first go to {menuselection}`Inventory app --> +Configuration --> Settings`, and under the {guilabel}`Products` section, activate the +{guilabel}`Units of Measure` setting. Then, click {guilabel}`Save`. + +```{image} uom/uom-enable-setting.png +:align: center +:alt: Enable Units of Measure in the Inventory settings. +``` + +## Units of measure categories + +After enabling the *Units of Measure* setting, view the default units of measure categories in +{menuselection}`Inventory app --> Configuration --> UoM Categories`. The category is important for +unit conversion; Odoo can convert a product's units from one unit to another **only** if both units +belong to the same category. + +```{image} uom/category.png +:align: center +:alt: Set units of measure categories. +``` + +Each units of measure category has a reference unit. The reference unit is highlighted in blue in +the {guilabel}`Uom` column of the {guilabel}`Units of Measure Categories` page. Odoo uses the +reference unit as a base for any new units. + +To create a new unit, first select the correct category from the {guilabel}`Units of Measure +Categories` page. For example, to sell a product in a box of six units, click the {guilabel}`Unit` +category line. Then, on the category page that appears, click {guilabel}`Add a line` in the +{guilabel}`Units of Measure` tab. Then, in the {guilabel}`Unit of Measure` field, title the new +unit, such as `Box of 6`, then in the {guilabel}`Type` field, select the appropriate size reference, +such as {guilabel}`Bigger than the reference Unit of Measure`. + +If applicable, enter a {guilabel}`UNSPSC Category`, which is a globally recognized [code managed by +GS1](https://www.unspsc.org/), that **must** be purchased in order to use. + +In the {guilabel}`Ratio` field, enter how many individual units are in the new {{ UOM }}, such as +`6.00000` when using the example of the `6-Pack` (since a box of six is six times *bigger* than the +reference unit, `1.00000`). + +```{image} uom/convert-products-by-unit.png +:align: center +:alt: Convert products from one unit to another as long as they belong to the same +: category. +``` + +## Specify a product's units of measure + +To set units of measure on a product, first go to {menuselection}`Inventory app --> Products --> +Products` and select a product to open its product form page. + +In the {guilabel}`General Information` tab, edit the {guilabel}`Unit of Measure` field to specify +the unit of measure that the product is sold in. The specified unit is also the unit used to keep +track of the product's inventory and internal transfers. + +Edit the {guilabel}`Purchase UoM` field to specify the unit of measure that the product is purchased +in. + +(inventory-product-replenishment-unit-conversion)= + +## Unit conversion + +Odoo automatically converts unit measurements when products have different {abbr}`UoMs (Units of +Measure)` and purchase {abbr}`UoMs (Units of Measure)`. + +This occurs in various scenarios, including: + +1. {ref}`Vendor orders `: purchase {{ UOM }} on purchase + orders (POs) converts to {{ UOM }} on internal warehouse documents +2. {ref}`Automatic replenishment `: generates {{ POs }} when + the stock levels of a product (tracked in {{ UOM }}) dips below a certain level. But, the {{ POs }} are + created using the purchase {{ UOM }} +3. {ref}`Sell products `: if a different {{ UOM }} is used + on the sales order (SO), the quantity is converted to the warehouse's preferred {{ UOM }} on the + delivery order + +(inventory-product-replenishment-buy-in-uom)= + +### Buy products in the purchase UoM + +When creating a new request for quotation (RFQ) in the *Purchase* app, Odoo automatically uses the +product's specified purchase unit of measure. If needed, manually edit the {guilabel}`UoM` value on +the {{ RFQ }}. + +After the {{ RFQ }} is confirmed into a {{ PO }}, click the {guilabel}`Receipt` smart button at the top of +the {{ PO }}. + +Odoo automatically converts the purchase unit of measure into the product's sales/inventory unit of +measure, so the {guilabel}`Demand` column of the delivery receipt shows the converted quantity. + +```{eval-rst} +.. example:: + When the product's purchase :guilabel:`UoM` is `Box of 6`, and its sales/inventory unit of + measure is `Units`, the |PO| shows the quantity in boxes of six, and the receipt (and other + internal warehouse documents) shows the quantity in units. + + .. figure:: uom/on-po.png + :align: center + :alt: Image of a purchase order that is using the purchase unit of measure. + + An order of three quantities is placed using the purchase "UoM": `Box of 6`. + + .. figure:: uom/on-receipt.png + :align: center + :alt: Image of receipt displaying the unit of measure. + + Upon warehouse receipt, the recorded quantities are in the internal "Unit of Measure": + `Units`. +``` + +(inventory-product-replenishment-replenish)= + +### Replenishment + +A request for quotation for a product can also be generated directly from the product form using +the {guilabel}`Replenish` button. + +After clicking {guilabel}`Replenish`, a replenish assistant box pops up. The purchase unit of +measure can be manually edited in the {guilabel}`Quantity` field, if needed. Then, click +{guilabel}`Confirm` to create the {{ RFQ }}. + +:::{important} +A {{ PO }} can **only** be automatically generated if at least **one** vendor is listed in the +product form's {guilabel}`Purchase` tab. +::: + +```{image} uom/replenish.png +:align: center +:alt: Click Replenish button to manually replenish. +``` + +Navigate to the created {{ PO }} by clicking the {guilabel}`Forecasted` smart button on the product +form. Scroll down to the {guilabel}`Forecasted Inventory` section, and in the {guilabel}`Requests +for quotation` line, click the {{ RFQ }} reference number to open the draft {{ RFQ }}. If necessary, the +purchase {{ UOM }} can be edited directly on the {{ PO }}. + +(inventory-product-replenishment-sell-in-uom)= + +### Sell in a different UoM + +When creating a new quotation in the *Sales* app, Odoo automatically uses the product's specified +unit of measure. If needed, the {guilabel}`UoM` can be manually edited on the quotation. + +After the quotation is sent to the customer, and confirmed into a sales order (SO), click the +{guilabel}`Delivery` smart button at the top of the {{ SO }}. Odoo automatically converts the unit of +measure into the product's inventory unit of measure, so the {guilabel}`Demand` column of the +delivery shows the converted quantity. + +For example, if the product's {{ UOM }} on the {{ SO }} was changed to `Box of 6`, but its inventory unit of +measure is `Units`, the {{ SO }} shows the quantity in boxes of six, and the delivery shows the quantity +in units. + diff --git a/content/applications/inventory_and_mrp/inventory/product_management/inventory_valuation.md b/content/applications/inventory_and_mrp/inventory/product_management/inventory_valuation.md new file mode 100644 index 000000000..b7894032a --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/product_management/inventory_valuation.md @@ -0,0 +1,15 @@ +--- +nosearch: true +--- + +# Inventory valuation + +```{toctree} +:titlesonly: true + +inventory_valuation/inventory_valuation_config +inventory_valuation/using_inventory_valuation +inventory_valuation/landed_costs +inventory_valuation/valuation_by_lots +``` + diff --git a/content/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/inventory_valuation_config.md b/content/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/inventory_valuation_config.md new file mode 100644 index 000000000..655028901 --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/inventory_valuation_config.md @@ -0,0 +1,502 @@ +--- +substitutions: + right arrow: '{icon}`fa-arrow-right` {guilabel}`(right arrow)`' +--- + +# Automatic inventory valuation + +All of a company's stock on-hand contributes to the valuation of its inventory. That value should +be reflected in the company's accounting records to accurately show the value of the company and +all of its assets. + +By default, Odoo uses a periodic inventory valuation (also known as manual inventory valuation). +This method implies that the accounting team manually posts journal entries, based on the physical +inventory of the company, and warehouse employees take the time to count the stock. In Odoo, each +product category reflects this, with the {guilabel}`Costing Method` set to {guilabel}`Standard +Price`, and the {guilabel}`Inventory Valuation` (not visible by default) set to {guilabel}`Manual`. + +```{image} inventory_valuation_config/inventory-valuation-fields.png +:align: center +:alt: The Costing Method field is located on the Product Categories form. +``` + +Alternatively, perpetual (automatic) inventory valuation creates real-time *journal entries* in the +*Accounting* app whenever stock enters or leaves the company's warehouse. + +This document is focused on the proper setup of automatic inventory valuation, which is an +integrated valuation method that ensures journal entries in the *Accounting* app match stock +valuation updates in the *Inventory* app. For an introduction of inventory valuation in Odoo, refer +to the {doc}`using_inventory_valuation` documentation. + +:::{warning} +Switching from manual to automatic inventory valuation may cause discrepancies between stock +valuation and accounting journals. + +One [successful strategy](https://www.odoo.com/r/Kvfg) for switching to automated valuation: + +1. Clear existing stock (possibly with an {doc}`inventory adjustment + <../../warehouses_storage/inventory_management/count_products>`) +2. Change the inventory valuation method to *Automatic* +3. Return the existing stock, with the original monetary value (using an inventory adjustment) + +Once the existing stock is recovered, the Odoo *Accounting* app automatically generates the +journal entries to corresponding stock valuation records. +::: + +## Configuration + +To properly set up automatic inventory valuation, follow these steps in Odoo: + +1. {ref}`Install Accounting app and enable specific settings + ` +2. {ref}`Set Automatic inventory valuation on product categories + ` +3. {ref}`Set costing method ` + +(inventory-warehouses-storage-accounting-setup)= + +### Accounting setup + +To use automatic inventory valuation, install the *Accounting* app. Next, go to +{menuselection}`Accounting app --> Configuration --> Settings`, and in the {guilabel}`Stock +Valuation` section, tick the {guilabel}`Automatic Accounting` checkbox. Then, click +{guilabel}`Save`. + +:::{note} +Enabling {guilabel}`Automatic Accounting` shows the previously invisible *Inventory Valuation* +field on a product category. +::: + +```{image} inventory_valuation_config/auto-accounting.png +:align: center +:alt: Automatic Accounting feature in Stock Valuation section of Settings page. +``` + +Refer to the {ref}`Expense ` and {ref}`Stock +input/output ` sections of documentation for details on +configuring the accounting journals shown. + +(inventory-warehouses-storage-valuation-on-product-category)= + +### Product category setup + +After {ref}`enabling inventory valuation `, the next +step is to set the product category to use automatic inventory valuation. + +Go to {menuselection}`Inventory app --> Configuration --> Product Categories`, and select the +desired product category. In the {guilabel}`Inventory Valuation` section, set the +{guilabel}`Inventory Valuation` field to {guilabel}`Automated`. Repeat this step for every product +category intending to use automatic inventory valuation. + +:::{note} +After enabling automatic accounting, each new stock move layer (SVL), that is created during +inventory valuation updates, generates a journal entry. +::: + +```{image} inventory_valuation_config/automated-inventory-valuation.png +:align: center +:alt: Inventory Valuation field on the product category, with its various stock accounts. +``` + +(inventory-warehouses-storage-costing-methods)= + +## Costing method + +After {ref}`enabling inventory valuation `, the +*costing method* for calculating and recording inventory costs is defined on the product category in +Odoo. + +Go to {menuselection}`Inventory app --> Configuration --> Product Categories` and select the desired +product category. In the {guilabel}`Inventory Valuation` section, select the appropriate +{guilabel}`Costing Method`: + +```{eval-rst} +.. tabs:: + + .. tab:: Standard Price + + The default costing method in Odoo. The cost of the product is manually defined on the product + form, and this cost is used to compute the valuation. Even if the purchase price on a purchase + order differs, the valuation is the cost defined on the product form. + + .. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - Operation + - Unit Cost + - Qty On Hand + - Incoming Value + - Inventory Value + * - + - $10 + - 0 + - + - $0 + * - Receive 8 products for $10/unit + - $10 + - 8 + - 8 * $10 + - $80 + * - Receive 4 products for $16/unit + - $10 + - 12 + - 4 * $10 + - $120 + * - Deliver 10 products + - $10 + - 2 + - -10 * $10 + - $20 + * - Receive 2 products for $9/unit + - $10 + - 4 + - 2 * $10 + - $40 + + .. tab:: Average Cost (AVCO) + + Calculates the valuation of a product based on the average cost of that product, divided by + the total number of available stock on-hand. With this costing method, inventory valuation is + *dynamic*, and constantly adjusts based on the purchase price of products. + + .. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - Operation + - Unit Cost + - Qty On Hand + - Incoming Value + - Inventory Value + * - + - $0 + - 0 + - + - $0 + * - Receive 8 products for $10/unit + - $10 + - 8 + - 8 * $10 + - $80 + * - Receive 4 products for $16/unit + - $12 + - 12 + - 4 * $16 + - $144 + * - Deliver 10 products + - $12 + - 2 + - -10 * $12 + - $24 + * - Receive 2 products for $6/unit + - $9 + - 4 + - 2 * $6 + - $36 + + How are unit cost and inventory value calculated at each step? + + - When receiving four products for $16 each: + + - Inventory value is calculated by adding the previous inventory value with the incoming + value: :math:`$80 + (4 * $16) = $144`. + - Unit cost is calculated by dividing the inventory value by the quantity on-hand: + :math:`$144 / 12 = $12`. + + - When delivering ten products, the average unit cost is used to calculate the inventory + value, regardless of the purchase price of the product. Therefore, inventory value is + :math:`$144 + (-10 * $12) = $24`. + + - Receive two products for $6 each: + + - Inventory value: :math:`$24 + (2 * $6) = $36` + - Unit cost: :math:`$36 / 4 = $9` + + .. note:: + When choosing :guilabel:`Average Cost (AVCO)` as the :guilabel:`Costing Method`, changing + the numerical value in the *Cost* field for products in the respective product category + creates a new record in the *Inventory Valuation* report to adjust the value of the + product. The *Cost* amount is then automatically updated, based on the average purchase + price of both the inventory on-hand and the costs accumulated from validated purchase + orders. + + .. tab:: First In First Out (FIFO) + + Tracks the costs of incoming and outgoing items in real-time, and uses the real price of the + products to change the valuation. The oldest purchase price is used as the cost for the next + good sold, until an entire lot of that product is sold. When the next inventory lot moves up + in the queue, an updated product cost is used based on the valuation of that specific lot. + + This method is arguably the most accurate inventory valuation method for a variety of reasons, + but it is highly sensitive to input data and human error. + + .. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - Operation + - Unit Cost + - Qty On Hand + - Incoming Value + - Inventory Value + * - + - $0 + - 0 + - + - $0 + * - Receive 8 products for $10/unit + - $10 + - 8 + - 8 * $10 + - $80 + * - Receive 4 products for $16/unit + - $12 + - 12 + - 4 * $16 + - $144 + * - Deliver 10 products + - $16 + - 2 + - | -8 * $10 + | -2 * $16 + - $32 + * - Receive 2 products for $6/unit + - $11 + - 4 + - 2 * $6 + - $44 + + How are unit cost and inventory value calculated at each step? + + - When receiving four products for $16 each: + + - Inventory value is calculated by adding the previous inventory value to the incoming + value: :math:`$80 + (4 * $16) = $144`. + - Unit cost is calculated by dividing the inventory value by the quantity on-hand: + :math:`$144 / 12 = $12`. + + - When delivering ten products, eight units were purchased for $10, and two units were + purchased for $16. + + - First, the incoming value is calculated by multiplying the on-hand quantity by the + purchased price: :math:`(-8 * $10) + (-2 * $16) = -112`. + - The inventory value is calculated by subtracting the incoming value from the previous + inventory value: :math:`$144 - $112 = $32`. + - Unit cost is calculated by dividing the inventory value by the remaining quantity: + :math:`$32 / 2 = $16`. + + - When receiving two products for $6, inventory value is :math:`$32 + $12 = $44`. Unit cost is + :math:`$44 / 4 = $11`. +``` + +:::{warning} +Changing the costing method greatly impacts inventory valuation. It is highly recommended to +consult an accountant first before making any adjustments here. +::: + +:::{seealso} +{doc}`using_inventory_valuation` +::: + +When the {guilabel}`Costing Method` is changed, products already in stock that were using the +{guilabel}`Standard` costing method **do not** change value; rather, the existing units keep their +value, and any product moves from then on affect the average cost, and the cost of the product will +change. If the value in the {guilabel}`Cost` field on a product form is changed manually, Odoo +generates a corresponding record in the *Inventory Valuation* report. + +:::{note} +It is possible to use different valuation settings for different product categories. +::: + +(inventory-warehouses-storage-accounting-types)= + +## Types of accounting + +With automated inventory valuation set up, the generated journal entries depend on the chosen +accounting mode: *Continental* or *Anglo-Saxon*. + +:::{tip} +Verify the accounting mode by activating the {ref}`developer-mode`, and navigating to +{menuselection}`Accounting app --> Configuration --> Settings`. + +Then, in the {guilabel}`Search...` bar, look for `Anglo-Saxon Accounting`, to see if the feature +is enabled. If it is **not** enabled, *Continental* accounting mode is in use. + +```{image} inventory_valuation_config/anglo-saxon.png +:align: center +:alt: Show the Anglo-Saxon accounting mode feature. +``` +::: + +In *Anglo-Saxon* accounting, the costs of goods sold (COGS) are reported when products are sold or +delivered. This means the cost of a good is only recorded as an expense when a customer is invoiced +for a product. + +So, for **manual** valuation method, set the *Expense Account* to *Stock Valuation* for the current +asset type; for **automatic** valuation method, set the *Expense Account* to an *Expenses* or a +*Cost of Revenue* type (e.g. *Cost of Production*, *Cost of Goods Sold*, etc.). + +In *Continental* accounting, the cost of a good is reported as soon as a product is received into +stock. Because of this, the *Expense Account* can be set to **either** *Expenses* or a *Cost of +Revenue* type, however, it is more commonly set to an *Expenses* account. + +Refer to the {ref}`Expense ` and {ref}`Stock +input/output ` sections for details on configuring each +account type. + +(inventory-warehouses-storage-expense-account)= + +### Expense account + +To configure the *expense account*, which is used in both manual and automatic inventory valuation, +go to the {guilabel}`Account Properties` section of the intended product category +({menuselection}`Inventory app --> Configuration --> Product Categories`). Then, choose an existing +account from the {guilabel}`Expense Account` drop-down menu. + +To ensure the chosen account is the correct {guilabel}`Type,` click the {{ right arrow }} icon to the +right of the account. Then, set the account type based on the information below. + +```{eval-rst} +.. tabs:: + + .. group-tab:: Anglo-Saxon + + .. tabs:: + + .. group-tab:: Automated + + In Anglo-Saxon accounting for automated inventory valuation, set the :guilabel:`Expense + Account` to the `Expenses` account. Then, click the |right arrow| icon to the right of + the account. + + In the pop-up window, choose :guilabel:`Expenses` or :guilabel:`Cost of Revenue` from + the :guilabel:`Type` drop-down menu. + + .. image:: inventory_valuation_config/external-link.png + :align: center + :alt: Show **Expense Account** field, and external link icon. + + .. group-tab:: Manual + + To configure the :guilabel:`Expense Account`, choose :guilabel:`Stock Valuation` from + the field's drop-down menu. Verify the account's type by clicking the |right arrow| + icon, and then ensure the :guilabel:`Type` is :guilabel:`Current Assets`. + + .. image:: inventory_valuation_config/manual-anglo-saxon-expense.png + :align: center + :alt: Show the **Expense Account** field. + + .. group-tab:: Continental + + .. tabs:: + + .. group-tab:: Automated + + Set the :guilabel:`Expense Account` to the :guilabel:`Expenses` or :guilabel:`Cost of + Revenue` account type. + + .. group-tab:: Manual + + Set the :guilabel:`Expense Account` to the :guilabel:`Expenses` or :guilabel:`Cost of + Revenue` account type. +``` + +(inventory-warehouses-storage-stock-account)= + +#### Stock input/output (automated only) + +To configure the {guilabel}`Stock Input Account` and {guilabel}`Stock Output Account`, go to +{menuselection}`Inventory app --> Configuration --> Product Categories` and select the desired +product category. + +In the {guilabel}`Inventory Valuation` field, select {guilabel}`Automated`. Doing so makes the +{guilabel}`Account Stock Properties` section appear. These accounts are defined as follows: + +- {guilabel}`Stock Valuation Account`: when automated inventory valuation is enabled on a product, + this account will hold the current value of the products. +- {guilabel}`Stock Journal`: accounting journal where entries are automatically posted when a + product's inventory valuation changes. +- {guilabel}`Stock Input Account`: counterpart journal items for all incoming stock moves will be + posted in this account, unless there is a specific valuation account set on the source location. + This is the default value for all products in a given category, and can also be set directly on + each product. +- {guilabel}`Stock Output Account`: counterpart journal items for all outgoing stock moves will be + posted in this account, unless there is a specific valuation account set on the destination + location. This is the default value for all products in a given category, and can also be set + directly on each product. + +```{eval-rst} +.. tabs:: + + .. group-tab:: Anglo-Saxon + + In Anglo-Saxon accounting, the :guilabel:`Stock Input Account` and :guilabel:`Stock Output + Account` are set to *different* :guilabel:`Current Assets` accounts. This way, delivering + products and invoicing the customer balance the *Stock Output* account, while receiving + products and billing vendors balance the *Stock Input* account. + + To modify the account type, go to the click the |right arrow| icon to the right of the stock + input/output account. In the pop-up window, choose :guilabel:`Current Assets` from the + :guilabel:`Type` drop-down menu. + + .. figure:: inventory_valuation_config/account-type.png + :align: center + :alt: Display account setup page, highlighting the **Type** field. + + The *Stock Input* account is set to `Stock Interim (Received)`, a *Current Asset* account + type. + + .. group-tab:: Continental + + In Continental accounting, the :guilabel:`Stock Input Account` and :guilabel:`Stock Output + Account` are set to **the same** :guilabel:`Current Assets` account. That way, one account can + be balanced when items are bought and sold. + + .. example:: + The stock input and output accounts are both set to `Stock Interim (Received)`, a + :guilabel:`Current Assets` account type. They can also be set to the `Stock Interim + (Delivered)`, as long as the input and output accounts are assigned to the **same** + account. + + .. image:: inventory_valuation_config/continental-stock-account.png + :align: center + :alt: Show the Stock Input and Output accounts. +``` + +## Inventory valuation reporting + +To start, go to {menuselection}`Accounting app --> Reporting --> Balance Sheet`. Click the +{guilabel}`Current Assets` line item to unfold the drop-down menu, and look for the nested +{guilabel}`Stock Valuation`, {guilabel}`Stock Interim (Received)`, and {guilabel}`Stock Interim +(Delivered)` lines. + +:::{tip} +At the top of the dashboard, click the {guilabel}`As of [date]` button to display accounting +records up to a specified date. +::: + +:::{seealso} +- {ref}`Stock accounts and what they do ` +- {doc}`../../../../finance/accounting/get_started/cheat_sheet` +::: + +```{image} inventory_valuation_config/stock-balance-sheet.png +:align: center +:alt: See the full inventory valuation breakdown in Odoo Accounting app. +``` + +Access more specific information by clicking the {icon}`fa-ellipsis-v` {guilabel}`(ellipsis)` icon +to the right of the desired journal. Select {guilabel}`General Ledger` to see a list of all of the +journal entries, where each line item's {icon}`fa-ellipsis-v` {guilabel}`(ellipsis)` icon can be +clicked to reveal the {guilabel}`View Journal Entry` option to open the individualized journal +entry. + +Additionally, annotations to the {guilabel}`Balance Sheet` can be added by choosing +{guilabel}`Annotate`, filling in the text box, and clicking {guilabel}`Save`. + +```{image} inventory_valuation_config/journals.png +:align: center +:alt: Show Stock Valuation journals in a list. +``` + diff --git a/content/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/landed_costs.md b/content/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/landed_costs.md new file mode 100644 index 000000000..2af9279af --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/landed_costs.md @@ -0,0 +1,176 @@ +--- +substitutions: + AVCO: '{abbr}`AVCO (Average Costing)`' + FIFO: '{abbr}`FIFO (First In First Out)`' + PO: '{abbr}`PO (Purchase Order)`' + RfQ: '{abbr}`RfQ (Request for Quotation)`' +--- + +# Landed costs + +When shipping products to customers, the landed cost is the total price of a product or shipment, +including all expenses associated with shipping the product. + +In Odoo, the *Landed Costs* feature is used to take additional costs into account when calculating +the valuation of a product. This includes the cost of shipment, insurance, customs duties, taxes, +and other fees. + +## Configuration + +To add landed costs to products, the *Landed Costs* feature must first be enabled. To enable this +feature, navigate to {menuselection}`Inventory app --> Configuration --> Settings`, and scroll to +the {guilabel}`Valuation` section. + +Tick the checkbox next to the {guilabel}`Landed Costs` option, and click {guilabel}`Save` to save +changes. + +Once the page refreshes, a new {guilabel}`Default Journal` field appears below the {guilabel}`Landed +Costs` feature in the {guilabel}`Valuation` section. + +Click the {guilabel}`Default Journal` drop-down menu to reveal a list of accounting journals. Select +a journal for which all accounting entries related to landed costs should be recorded. + +```{image} landed_costs/integrating-landed-costs-enabled-setting.png +:alt: Landed Costs feature and resulting Default Journal field in the Inventory settings. +``` + +## Create landed cost product + +For charges that are consistently added as landed costs, a landed cost product can be created in +Odoo. This way, a landed cost product can be quickly added to a vendor bill as an invoice line, +instead of having to be manually entered every time a new vendor bill is created. + +To do this, create a new product by going to {menuselection}`Inventory app --> Products --> +Products`, and clicking {guilabel}`New`. + +Assign a name to the landed cost product in the {guilabel}`Product Name` field (i.e. `International +Shipping`). In the {guilabel}`Product Type` field, click the drop-down menu, and select +{guilabel}`Service` as the {guilabel}`Product Type`. + +:::{important} +Landed cost products **must** have their {guilabel}`Product Type` set to {guilabel}`Service`. +::: + +Click the {guilabel}`Purchase` tab, and tick the checkbox next to {guilabel}`Is a Landed Cost` in +the {guilabel}`Vendor Bills` section. Once ticked, a new {guilabel}`Default Split Method` field +appears below it, prompting a selection. Clicking that drop-down menu reveals the following options: + +- {guilabel}`Equal`: splits the cost equally across each product included in the receipt, regardless + of the quantity of each. +- {guilabel}`By Quantity`: splits the cost across each unit of all products in the receipt. +- {guilabel}`By Current Cost`: splits the cost according to the cost of each product unit, so a + product with a higher cost receives a greater share of the landed cost. +- {guilabel}`By Weight`: splits the cost, according to the weight of the products in the receipt. +- {guilabel}`By Volume`: splits the cost, according to the volume of the products in the receipt. + +```{image} landed_costs/integrating-landed-costs-landed-cost-product.png +:alt: Is a Landed Cost checkbox and Default Split Method on service type product form. +``` + +When creating new vendor bills, this product can be added as an invoice line as a landed cost. + +:::{important} +To apply a landed cost on a vendor bill, products in the original {{ PO }} **must** belong to a +*Product Category* with a *Costing Method* of either {{ AVCO }} or {{ FIFO }}, and the valuation method +can be {doc}`manual ` or {doc}`automatic +`. +::: + +## Create purchase order + +Navigate to {menuselection}`Purchase app --> New` to create a new request for quotation (RfQ). In +the {guilabel}`Vendor` field, add a vendor to order products from. Then, click {guilabel}`Add a +product`, under the {guilabel}`Products` tab, to add products to the {{ RfQ }}. + +Once ready, click {guilabel}`Confirm Order` to confirm the order. Then, click {guilabel}`Receive +Products` once the products have been received, followed by {guilabel}`Validate`. + +### Create vendor bill + +Once the vendor fulfills the {{ PO }} and sends a bill, a vendor bill can be created from the {{ PO }} in +Odoo. + +Navigate to the {menuselection}`Purchase app`, and click into the {{ PO }} for which a vendor bill +should be created. Then, click {guilabel}`Create Bill`. This opens a new {guilabel}`Vendor Bill` in +the {guilabel}`Draft` stage. + +In the {guilabel}`Bill Date` field, click the line to open a calendar popover menu, and select the +date on which this draft bill should be billed. + +Then, under the {guilabel}`Invoice Lines` tab, click {guilabel}`Add a line`, and click the drop-down +menu in the {guilabel}`Product` column to select the previously-created landed cost product. Click +the {icon}`fa-cloud-upload` {guilabel}`(cloud with arrow)` icon to manually save and update the +draft bill. + +```{image} landed_costs/integrating-landed-costs-checkboxes.png +:alt: Landed Costs column checkboxes for product and landed cost. +``` + +In the {guilabel}`Landed Costs` column, the product ordered from the vendor does **not** have its +checkbox ticked, while the landed cost product's checkbox **is** ticked. This differentiates landed +costs from all other costs displayed on the bill. + +Additionally, at the top of the form, a {guilabel}`Create Landed Costs` button appears. + +```{image} landed_costs/integrating-landed-costs-create-button.png +:alt: Create Landed Costs button on vendor bill. +``` + +## Add landed cost + +Once a landed cost is added to the vendor bill, click {guilabel}`Create Landed Costs` at the top of +the vendor bill. + +Doing so automatically creates a landed cost record, with a set landed cost pre-filled in the +product line in the {guilabel}`Additional Costs` tab. + +From the {guilabel}`Landed Cost` form, click the {guilabel}`Transfers` drop-down menu, and select +which transfer the landed cost belongs to. + +```{image} landed_costs/integrating-landed-costs-transfers-menu.png +:alt: Landed cost form with selected receipt transfer. +``` + +:::{tip} +In addition to creating landed costs directly from a vendor bill, landed cost records can *also* +be created by navigating to {menuselection}`Inventory app --> Operations --> Landed Costs`, and +clicking {guilabel}`New`. +::: + +After setting the picking from the {guilabel}`Transfers` drop-down menu, click {guilabel}`Compute` +(at the bottom of the form, under the {guilabel}`Total:` cost). + +Click the {guilabel}`Valuation Adjustments` tab to see the impact of the landed costs. The +{guilabel}`Original Value` column lists the original price of the {{ PO }}, the {guilabel}`Additional +Landed Cost` column displays the landed cost, and the {guilabel}`New Value` displays the sum of the +two, for the total cost of the {{ PO }}. + +Once ready, click {guilabel}`Validate` to post the landed cost entry to the accounting journal. + +This causes a {guilabel}`Valuation` smart button to appear at the top of the form. Click the +{guilabel}`Valuation` smart button to open a {guilabel}`Stock Valuation` page, with the product's +updated valuation listed. + +:::{note} +For a {guilabel}`Valuation` smart button to appear upon validation, the product's +{guilabel}`Product Type` **must** be set to {guilabel}`Storable`. +::: + +To view the valuation of *every* product, including landed costs, navigate to +{menuselection}`Inventory app --> Reporting --> Valuation`. + +:::{note} +Each journal entry created for a landed cost on a vendor bill can be viewed in the *Accounting* +app. + +To locate these journal entries, navigate to {menuselection}`Accounting app --> Accounting --> +Journal Entries`, and locate the correct entry, by number (i.e. `PBNK1/2024/XXXXX`). + +Click into the journal entry to view the {guilabel}`Journal Items`, and other information about +the entry. + +```{image} landed_costs/integrating-landed-costs-journal-entry.png +:alt: Journal Entry form for landed cost created from vendor bill. +``` +::: + diff --git a/content/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/using_inventory_valuation.md b/content/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/using_inventory_valuation.md new file mode 100644 index 000000000..c77860023 --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/using_inventory_valuation.md @@ -0,0 +1,188 @@ +# Using inventory valuation + +(inventory-reporting-using-inventory-val)= + +*Inventory valuation* is a quintessential accounting procedure that calculates the value of on-hand +stock. Once determined, the inventory valuation amount is then incorporated into a company's overall +value. + +In Odoo, this process can be conducted manually— by warehouse employees physically counting the +products— or automatically through the database. + +## Automatic inventory valuation + +To use Odoo to automatically generate a trail of inventory valuation entries, first navigate to the +{menuselection}`Product Categories` list by going to {menuselection}`Inventory app --> Configuration +--> Product Categories` and select the desired product category. On the form, set the +{guilabel}`Inventory Valuation` as {guilabel}`Automated` and the {guilabel}`Costing Method` to any +of the three options. + +:::{seealso} +{doc}`Set up inventory valuation ` +::: + +In order to understand how moving products in and out of stock affects the company's overall value, +consider the following product and stock moves scenario below. + +### Receive a product + +To track the value of incoming products, such as a simple *table*, configure the product category on +the the product itself. To get there, navigate to {menuselection}`Inventory app --> Products --> +Products` and click the desired product. On the product form, click the {guilabel}`➡️ (right arrow)` +icon beside the {guilabel}`Product Category` field, which opens an internal link to edit the product +category. Next, set the {guilabel}`Costing Method` as {guilabel}`First In First Out (FIFO)` and +{guilabel}`Inventory Valuation` as {guilabel}`Automated`. + +:::{tip} +Alternatively access the {guilabel}`Product Categories` dashboard by navigating to +{menuselection}`Inventory app --> Configuration --> Product Categories` and select the desired +product category. +::: + +Next, assume 10 tables are purchased at a price of \$10.00, each. The {abbr}`PO (Purchase Order)` for +those tables will show the subtotal of the purchase as \$100, plus any additional costs or taxes. + +```{image} using_inventory_valuation/purchase-order.png +:align: center +:alt: Purchase order with 10 tables products valued at $10.00 each. +``` + +After selecting {guilabel}`Validate` on the {abbr}`PO (Purchase Order)`, the {guilabel}`Valuation` +smart button is enabled. Clicking on this button displays a report showing how the inventory +valuation for the table was affected by this purchase. + +:::{important} +{ref}`Developer mode ` **must** be turned on to see the {guilabel}`Valuation` +smart button. +::: + +:::{tip} +The {doc}`consignment <../../shipping_receiving/daily_operations/owned_stock>` feature allows +ownership to items in stock. Thus, products owned by other companies are not accounted for in the +host company's inventory valuation. +::: + +```{image} using_inventory_valuation/valuation-smart-button.png +:align: center +:alt: See Valuation smart button on a receipt, with Developer mode enabled. +``` + +For a comprehensive dashboard that includes the inventory valuation of all product shipments, +inventory adjustments, and warehouse operations, refer to the {ref}`stock valuation report +`. + +### Deliver a product + +In the same logic, when a table is shipped to a customer and leaves the warehouse, the stock +valuation decreases. The {guilabel}`Valuation` smart button on the {abbr}`DO (Delivery Order)`, +likewise, displays the stock valuation record as it does on a {abbr}`PO (Purchase Order)`. + +```{image} using_inventory_valuation/decreased-stock-valuation.png +:align: center +:alt: Decreased stock valuation after a product is shipped. +``` + +(inventory-management-reporting-valuation-report)= + +## Inventory valuation report + +To view the current value of all products in the warehouse, first turn on {ref}`Developer mode +` and navigate to {menuselection}`Inventory app --> Reporting --> Valuation`. The +{guilabel}`Stock Valuation` dashboard displays detailed records of products with the +{guilabel}`Date`, {guilabel}`Quantity`, {guilabel}`Unit Value`, and {guilabel}`Total Value` of the +inventory. + +:::{important} +{ref}`Developer mode ` **must** be enabled to see the {guilabel}`Valuation` +option under {guilabel}`Reporting`. +::: + +```{image} using_inventory_valuation/inventory-valuation-products.png +:align: center +:alt: Inventory valuation report showing multiple products. +``` + +The {guilabel}`Valuation At Date` button, located in the top-left corner of the {guilabel}`Stock +Valuation` page, reveals a pop-up window. In this pop-up, the inventory valuation of products +available during a prior specified date can be seen and selected. + +:::{tip} +View a detailed record of a product's inventory value, stock move, and on-hand stock by selecting +the teal {guilabel}`➡️ (right arrow)` button to the right of the {guilabel}`Reference` column +value. +::: + +(inventory-product-management-update-unit-price)= + +### Update product unit price + +For any company: lead times, supply chain failures, and other risk factors can contribute to +invisible costs. Although Odoo attempts to accurately represent the stock value, *manual valuation* +serves as an additional tool to update the unit price of products. + +:::{important} +Manual valuation is intended for products that can be purchased and received for a cost greater +than 0, or have product categories set with {guilabel}`Costing Method` set as either +{guilabel}`Average Cost (AVCO)` or {guilabel}`First In First Out (FIFO)`. +::: + +```{image} using_inventory_valuation/add-manual-valuation.png +:align: center +:alt: Add manual valuation of stock value to a product. +``` + +Create manual valuation entries on the {guilabel}`Stock Valuation` dashboard by first navigating to +{menuselection}`Inventory app --> Reporting --> Valuation`. Next, to enable the *product +revaluation* feature, select {menuselection}`Group by --> Product` to organize all the records by +product. Click on the gray {guilabel}`▶️ (drop-down triangle)` icon to reveal stock valuation line +items below, as well as a teal {guilabel}`➕ (plus)` button on the right. + +Click the teal {guilabel}`+ (plus)` button to open up the {guilabel}`Product Revaluation` form. +Here, the inventory valuation for a product can be recalculated, by increasing or decreasing the +unit price of each product. + +:::{note} +The {guilabel}`▶️ (drop-down triangle)` and {guilabel}`➕ (plus)` buttons are only visible after +grouping entries by product. +::: + +```{image} using_inventory_valuation/product-revaluation.png +:align: center +:alt: Product revaluation form adding a value of $1.00 with the reason being inflation. +``` + +### Inventory valuation journal entries + +In Odoo, automatic inventory valuation records are also recorded in the {menuselection}`Accounting +app --> Accounting --> Journal Entries` dashboard. On this comprehensive list of accounting entries, +inventory valuation records are identified by checking values in the {guilabel}`Journal` column, or +looking for the {guilabel}`Reference` column value which matches the warehouse operation reference +(e.g. `WH/IN/00014` for receipts). + +Clicking on an inventory valuation journal entry opens a *double-entry accounting* record. These +records are generated by Odoo to track the change of value in inventory valuation as products are +moved in and out of the warehouse. + +```{eval-rst} +.. example:: + To view the inventory valuation of 10 *tables*, costing $10.00 each, upon reception from the + vendor, go to the :menuselection:`Journal Entries` page found in :menuselection:`Accounting app + --> Accounting --> Journal Entries`. Here, click the journal line where the :guilabel:`Reference` + column value matches the reference on the receipt, `WH/IN/00014`. + + .. image:: using_inventory_valuation/stock-valuation-product.png + :align: center + :alt: Stock valuation page depicting the products within a shipment. + + `Stock interim` is a holding account for money intended to pay vendors for the product. The + `stock valuation` account stores the value of all on-hand stock. + + .. image:: using_inventory_valuation/inventory-valuation-entry.png + :align: center + :alt: Accounting entry for the inventory valuation of 10 tables. +``` + +:::{seealso} +[Odoo Tutorial: Inventory Valuation](https://www.odoo.com/slides/slide/2795/share) +::: + diff --git a/content/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/valuation_by_lots.md b/content/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/valuation_by_lots.md new file mode 100644 index 000000000..bda87d706 --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/valuation_by_lots.md @@ -0,0 +1,215 @@ +# Valuation by lots/serial numbers + +Track {doc}`inventory valuation ` by {doc}`lots or serial numbers +<../../product_management/product_tracking>` to: + +1. {ref}`Compare and differentiate purchasing cost `, + based on lot or serial numbers. +2. Track the actual cost of manufactured products, based on the real cost of each tracked component + used. +3. Depreciate specific lot or serial numbers when they {doc}`sit in stock for too long + <../../warehouses_storage/reporting/aging>`. + +:::{important} +Please read this {doc}`introduction to inventory valuation ` before +setting up valuation by lot/serial numbers. +::: + +## Configuration + +To enable valuation by lots or serial numbers, begin by enabling the {doc}`Lots and Serial Numbers +feature <../product_tracking>`. After that, go to {menuselection}`Inventory app --> Products --> +Products`, and select the desired product, or create a new product, by clicking {guilabel}`New`. + +On the product form, in the {guilabel}`Category` field, choose a product category. Ensure the +product category's {ref}`Costing Method ` is set to +*First In First Out (FIFO)* or *Average Cost (AVCO)*. + +:::{tip} +To check the costing method set on the product category, hover over the {guilabel}`Category` +field, and click the {icon}`oi-arrow-right` {guilabel}`(Internal Link)` icon. +::: + +:::{seealso} +{ref}`Costing methods ` +::: + +Next, activate the product to be tracked by lots or serial numbers by ticking the {guilabel}`Track +Inventory` checkbox. Then, click the adjacent field that appears, and choose either {guilabel}`By +Lots` or {guilabel}`By Unique Serial Number` from the resulting drop-down menu. + +Doing so makes the {guilabel}`Valuation by Lot/Serial number` checkbox appear below it. Tick that +checkbox, and the configuration to track valuation by lot or serial numbers is complete. + +:::{figure} valuation_by_lots/product-form.png +:alt: Product form showing the Valuation by Lot or Serial Number feature. + +Product form showing the Valuation by Lot or Serial Number feature +::: + +## Valuation layers + +To understand how valuation by lots and serial numbers works, consider these scenarios: + +1. {ref}`Purchase and sell products `: cost is + calculated based on the *product category's* costing method. +2. {ref}`Create new lot/serial numbers ` using an + inventory adjustment: value of the new lot/serial number is assigned to the cost from the product + form. +3. Inventory adjustment to update quantities for an {ref}`existing lot/serial number + `: value is assigned based on the most + recent cost for that lot/serial number. + +For both {abbr}`AVCO (Average Cost)` and {abbr}`FIFO (First In First Out)` methods, the *Cost* field +on the product form is calculated using this formula: + +$Avg~Cost = \frac{Total~Value}{Total~Qty}$ + +(inventory-product-management-valuation-cost-example)= + +### Purchase products + +Consider how purchasing products affect the inventory valuation, in the table below. + +```{eval-rst} +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - + - Quantity + - Lot number + - Math + - Average cost on product form + * - Empty stock + - 0.00 + - + - + - $0 + * - Day 1: Receive one product at $10/unit + - 1.00 + - LOT 1 + - :math:`\frac{10}{1}` + - $10 + * - Day 2: Receive another product at $20/unit + - 1.00 + - LOT 2 + - :math:`\frac{10+20}{2}` + - $15 +``` + +:::{figure} valuation_by_lots/lip-gloss.png +:alt: Show Cost on the product form. + +As a result, the product form displays an average cost of \$15 in the **Cost** field. +::: + +(inventory-product-management-valuation-cost-new)= + +### Create new lot/serial number + +Creating a new lot/serial number through an {doc}`inventory adjustment +<../../warehouses_storage/inventory_management/count_products>` assigns the same value as the cost +on the product form. + +To make an inventory adjustment, and assign a lot number, go to {menuselection}`Inventory app --> +Operations --> Physical Inventory`. Then, click {guilabel}`New`. + +In the new inventory adjustment line that appears, set the {guilabel}`Product`, create the +{guilabel}`Lot/Serial Number`, set the {guilabel}`Counted Quantity`, and click {icon}`fa-floppy-o` +{guilabel}`Apply`. + +To view the valuation layer, go to {menuselection}`Inventory app --> Reporting --> Valuation`. The +{guilabel}`Total Value` per unit matches the *Cost* on the product form. + +```{eval-rst} +.. example:: + Continuing the example in the table above, when the product cost is `$15`, the valuation for a + newly-created `LOT3` is also be `$15`. + + .. image:: valuation_by_lots/create-new.png + :alt: Show inventory adjustment valuation. +``` + +(inventory-product-management-valuation-cost-existing)= + +### Existing lot/serial number + +When adjusting the quantity of an existing lot/serial number, the value is based on the most recent +valuation layer for that specific lot/serial number. + +```{eval-rst} +.. example:: + Continuing the example in the table above, the value for `LOT 1` is `$10`. + + So, when the quantity is updated from `1.00` to `2.00`, the additional quantity is also valued at + `$10`, reflecting the latest valuation layer for `LOT 1`. + + .. figure:: valuation_by_lots/existing.png + :alt: Show valuation of LOT 1 getting updated. + + The inventory adjustment (top line) is valued the same as LOT 1 (bottom line). +``` + +(inventory-product-management-view-valuation)= + +## View valuation + +To find the average cost of a specific lot/serial number, go to {menuselection}`Inventory app --> +Products --> Lots/Serial Numbers`, and select the desired record. + +Both the {guilabel}`Cost` and {guilabel}`Average Cost` fields show a unit's average cost. The +{guilabel}`Total Value` reflects the total on-hand value for that lot/serial number. + +:::{important} +Ensure the costing method is set to *First In First Out (FIFO)* or *Average Cost (AVCO)* to +display the cost on this page. +::: + +:::{figure} valuation_by_lots/lot.png +:alt: Show cost of the lot/serial number. + +Lot form, displaying **Cost** field. The **Valuation** smart button is in the top-right. +::: + +Valuation layers of a lot/serial number can be viewed through the {ref}`valuation report +`, or by clicking the lot/serial number's +{guilabel}`Valuation` smart button. These detailed, line-by-line records can help determine how each +inventory move of the specific lot/serial number affects its valuation. + +(inventory-product-management-valuation-report)= + +### Valuation report + +Display the valuation of lots and serial numbers in the database by going to +{menuselection}`Inventory app --> Reporting --> Valuation`. + +On the resulting {guilabel}`Stock Valuation` report, click the search bar, and in the +{icon}`oi-group` {guilabel}`Group By` section of the resulting drop-down menu, select +{guilabel}`Lot/Serial number`. + +:::{tip} +Click the {icon}`fa-plus` {guilabel}`(plus)` icon to the right of a collapsed lot number line to +{ref}`manually modify the cost `. + +This is useful for adjusting individual lot prices when a purchase order or bill includes +multiple lots/serial numbers, as initial prices are identical upon reception. +::: + +```{image} valuation_by_lots/stock-valuation.png +:alt: Show valuation report, by lots. +``` + +### Valuation smart button + +To access a filtered part of the *Stock Valuation* report, specific to a lot or serial number, go to +{menuselection}`Inventory app --> Products --> Lots/Serial Numbers`, and select the desired item. + +On the {guilabel}`Lot/Serial Numbers` page, click the {guilabel}`Valuation` smart button. + +:::{figure} valuation_by_lots/lot-stock-valuation.png +:alt: All stock moves relating to `LOT 1`. + +All stock moves that affect the valuation of `LOT 1`. +::: + diff --git a/content/applications/inventory_and_mrp/inventory/product_management/product_tracking.md b/content/applications/inventory_and_mrp/inventory/product_management/product_tracking.md new file mode 100644 index 000000000..5256908d4 --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/product_management/product_tracking.md @@ -0,0 +1,115 @@ +--- +hide-page-toc: true +show-content: true +--- + +# Product tracking + +*Lots* and *serial numbers* are the two ways to identify and track products in Odoo. While there are +similarities between the two traceability methods, there are also notable differences that affect +receipts, deliveries, and inventory reports. + +A *lot* usually indicates a specific batch of an item that was received, is currently stored, or was +shipped from a warehouse. However, it can also pertain to a batch of products manufactured in-house, +as well. + +A *serial number* is a unique identifier assigned incrementally (or sequentially) to an item or +product, used to distinguish it from other items or products. + +:::{seealso} +- {doc}`product_tracking/lots` +- {doc}`product_tracking/serial_numbers` +::: + +## Enable lots & serial numbers + +To track products using lots and serial numbers, the *Lots & Serial Numbers* feature must be +enabled. + +To do that, go to the {menuselection}`Inventory app --> Configuration --> Settings`, scroll down to +the {guilabel}`Traceability` section, and click the box next to {guilabel}`Lots & Serial Numbers`. +Then, click the {guilabel}`Save` button to save changes. + +```{image} product_tracking/differences-enabled-setting.png +:align: center +:alt: Enabled lots and serial numbers feature in inventory settings. +``` + +## When to use lots + +Lots are useful for products that are manufactured or received in large quantities, such as clothes +or food. Lots and can be used to trace a product back to a group, which is especially useful when +managing product recalls or expiration dates. + +```{eval-rst} +.. example:: + .. image:: product_tracking/differences-lot.png + :align: center + :alt: Created lot with quantity of products in it. +``` + +Manufacturers assign lot numbers to groups of products that have common properties; this can lead to +multiple goods sharing the same lot number. This helps identify a number of products in a single +group, and allows for end-to-end traceability of these products through each step in their life +cycles. + +## When to use serial numbers + +The goal of assigning serial numbers to individual products is to make sure every item's history is +identifiable when it travels through the supply chain. This can be especially useful for +manufacturers that provide after-sales services related to products they sell and deliver. + +```{eval-rst} +.. example:: + .. image:: product_tracking/differences-serial-numbers.png + :align: center + :alt: List of serial numbers for product. +``` + +Serial numbers can contain many different types of characters: numbers, letters, typographical +symbols, or a mixture of all three types. + +## Traceability + +Manufacturers and companies can refer to traceability reports to see the entire life cycle of a +product. These reports include vital information, like where it came from (and when), where it was +stored, and to whom it was sent. + +To see the full traceability of a product, or group products by lots and/or serial numbers, go to +{menuselection}`Inventory app --> Products --> Lots/Serial Numbers`. Doing so reveals the +{guilabel}`Lots/Serial Numbers` dashboard. + +From here, products with lots or serial numbers assigned to them are listed by default. They can +also be expanded to show what lots or serial numbers have been specifically assigned to them. + +To group by lots or serial numbers, first remove any default filters from the search bar in the +upper-right corner. Then, click {guilabel}`Group By`, and select {guilabel}`Add Custom Group`, which +reveals a mini drop-down menu. From this mini drop-down menu, select {guilabel}`Lot/Serial Number`, +and click {guilabel}`Apply`. + +Doing so reveals all existing lots and serial numbers, and each can be expanded to show all product +quantities with that assigned number. For unique serial numbers that are *not* reused, there should +*only* be one product per serial number. + +```{image} product_tracking/differences-tracking.png +:align: center +:alt: Reporting page with drop-down lists of lots and serial numbers. +``` + +:::{tip} +For additional information regarding an individual lot number or serial number, click the line +item for the lot or serial number to reveal that specific number's {guilabel}`Lot` or +{guilabel}`Serial Number` form. From this form, click the {guilabel}`Location` and +{guilabel}`Traceability` smart buttons to see all stock on-hand using that serial number. Any +operations made using that lot or serial number can be found here, as well. +::: + +```{toctree} +:titlesonly: true + +product_tracking/serial_numbers +product_tracking/lots +product_tracking/reassign +product_tracking/expiration_dates +``` + diff --git a/content/applications/inventory_and_mrp/inventory/product_management/product_tracking/expiration_dates.md b/content/applications/inventory_and_mrp/inventory/product_management/product_tracking/expiration_dates.md new file mode 100644 index 000000000..d9a2b9d94 --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/product_management/product_tracking/expiration_dates.md @@ -0,0 +1,275 @@ +--- +substitutions: + RFQ: '{abbr}`RFQ (request for quotation)`' +--- + +# Expiration dates + +(inventory-product-management-product-tracking-expiration-dates)= + +In Odoo, *expiration dates* can be used to manage and track the lifecycles of perishable products, +from purchase to sale. Using expiration dates reduces product loss due to unexpected expiry, and +helps to avoid sending expired products to customers. + +In Odoo, only products that are tracked using *lots* and *serial numbers* can be assigned expiration +information. Once a lot or serial number has been assigned, an expiration date can be set. This is +especially helpful for companies (such as food manufacturers) that consistently, or exclusively, buy +and sell perishable products. + +:::{seealso} +- {doc}`../product_tracking/lots` +- {doc}`../product_tracking/serial_numbers` +::: + +## Enable expiration dates + +To enable the use of *expiration dates*, go to {menuselection}`Inventory app --> Configuration --> +Settings`, and scroll down to the {guilabel}`Traceability` section. Then, click the checkbox to +enable the {guilabel}`Lots & Serial Numbers` feature. + +Once that feature is activated, a new option will appear to enable {guilabel}`Expiration Dates`. +Click that checkbox to enable the feature, and be sure to {guilabel}`Save` changes. + +```{image} expiration_dates/expiration-dates-enabled-settings.png +:alt: Enabled lots and serial numbers and expiration dates settings. +``` + +:::{tip} +Once the {guilabel}`Lots & Serial Numbers` feature is activated, an additional feature appears to +{guilabel}`Display Lots & Serial Numbers on Delivery Slips`. Activating these features helps with +end-to-end traceability, making it easier to manage product recalls, identify batches of faulty +products, and more. +::: + +## Configure expiration dates on products + +Once the {guilabel}`Lots & Serial Numbers` and {guilabel}`Expiration Dates` features have been +enabled in the **Inventory** app settings, expiration information can be configured on individual +products. + +To do so, go to {menuselection}`Inventory app --> Products --> Products`, and select a product to +edit. Selecting a product reveals the product form for that particular item. + +:::{important} +To be tracked using lots or serial numbers, or to configure expiration information, products +*must* have their {guilabel}`Product Type` set as {guilabel}`Goods` under the {guilabel}`General +Information` tab. Then, in the {guilabel}`Track Inventory` field, select either {guilabel}`By +Unique Serial Number` or {guilabel}`By Lots`. +::: + +Then, click the {guilabel}`Inventory` tab, and scroll down to the {guilabel}`Traceability` section. +Tick the {guilabel}`Expiration Date` checkbox. + +:::{note} +If a product has stock on-hand prior to activating tracking by lots or serial numbers, an +inventory adjustment might need to be performed in order to assign lot numbers to the existing +stock. +::: + +:::{tip} +For processing large quantities of products on receipts or deliveries, it is recommended to track +using lots, so multiple products can be traced back to the same lot, if any issues arise. +::: + +```{image} expiration_dates/expiration-dates-product-configuration.png +:alt: Expiration dates configuration on the product form. +``` + +Under the {guilabel}`Dates` section, there are four categories of expiration information to +configure for the product: + +- {guilabel}`Expiration Time`: the number of days after receiving products (either from a vendor or + in stock after production) in which goods may become dangerous and should not be used or consumed. +- {guilabel}`Best Before Time`: the number of days before the expiration date in which the goods + start deteriorating, **without** being dangerous yet. +- {guilabel}`Removal Time`: the number of days before the expiration date in which the goods should + be removed from stock. +- {guilabel}`Alert Time`: the number of days before the expiration date in which an alert should be + raised on goods in a particular lot or containing a particular serial number. + +:::{note} +The values entered into these fields automatically compute the expiration date for goods entered +into stock, whether purchased from a vendor or manufactured in-house. +::: + +:::{tip} +If the {guilabel}`Dates` field is not populated with any values for expiration information, dates +(and lots) can be manually assigned upon receipts and deliveries in and out of the warehouse. +Even when assigned, they can still be overwritten and changed manually if needed, as well. +::: + +## Set expiration dates on receipts with lots & serial numbers + +Generating expiration dates for *incoming* goods can be done directly on the {guilabel}`Receipt`. +Navigate to {menuselection}`Inventory app --> Operations --> Receipts`, then click on a line to +open the {guilabel}`Receipt` record. + +:::{important} +Clicking {guilabel}`Validate` before assigning a serial number to the ordered product quantities +causes a {guilabel}`User Error` popup to appear. The popup requires entry of a lot or serial +number for the ordered products. The receipt cannot be validated without an assigned lot or +serial number. + +```{image} expiration_dates/expiration-dates-user-error-popup.png +:alt: User error popup when validating an order with no lot number. +``` +::: + +From here, click the {icon}`fa-list` {guilabel}`(Details)` icon located on the of the product line. +When clicked, a {guilabel}`Detailed Operations` pop-up will appear. + +In the pop-up, the {guilabel}`Expiration Date` automatically populates, based on the configuration +on the product form. Click the {guilabel}`Lot/Serial Number` field on the appropriate line, then +enter the lot or serial number. + +:::{tip} +If the {guilabel}`Dates` field on the product form has not been configured, the +{guilabel}`Expiration Date` can be manually entered. +::: + +Click {guilabel}`Save` when finished to close the pop-up. Finally, click {guilabel}`Validate`. + +```{image} expiration_dates/expiration-dates-detailed-operations-popup.png +:alt: Detailed operations popup showing expiration dates for ordered products. +``` + +A {guilabel}`Traceability` smart button will appear upon validating the receipt. Click the +{guilabel}`Traceability` smart button to see the updated {guilabel}`Traceability Report`, which +includes: a {guilabel}`Reference` document; the {guilabel}`Product` being traced; the +{guilabel}`Lot/Serial #`; and more. + +## Set expiration dates on manufactured products + +Expiration dates can also be generated for products manufactured in-house. To assign expiration +dates to manufactured products, a manufacturing order (MO) needs to be completed. + +To create a {abbr}`MO (manufacturing order)`, go to {menuselection}`Manufacturing app --> Operations +--> Manufacturing Orders`, and click {guilabel}`New`. Choose a product to manufacture from the +{guilabel}`Product` field drop-down menu, then select the {guilabel}`Quantity` to produce. + +```{image} expiration_dates/expiration-dates-manufacturing-order.png +:alt: Manufacturing order for product with expiration date. +``` + +:::{note} +To manufacture a product, there must be materials to consume in the lines in the +{guilabel}`Product` column. This can be achieved either by creating a {guilabel}`Bill of +Material` for the {guilabel}`Product`, or manually adding materials to consume by clicking +{guilabel}`Add a line`. +::: + +Once ready, click {guilabel}`Confirm`. + +The appropriate number of {guilabel}`Lots/Serial Numbers` automatically populated in the field. +Click the {icon}`fa-list` {guilabel}`(Details)` icon to reveal additional information for those +specific numbers. On that pop-up, all expiration information that was previously configured for the +product is displayed. + +```{image} expiration_dates/components-popup.png +:alt: Components pop-up with expiration information for specific lot number. +``` + +## Sell products with expiration dates + +Selling perishable products with expiration dates is done the same as any other type of product. The +first step in selling perishable products is to create a sales order. + +To do that, go to {menuselection}`Sales app --> New` to create a new quotation, and fill out the +information on the sales order form. + +Add a {guilabel}`Customer`, then click {guilabel}`Add a product` to add the desired products to the +{guilabel}`Product` lines, and set a {guilabel}`Quantity` for the products. + +Then, click the {guilabel}`Other Info` tab. Under the {guilabel}`Delivery` section, change the +{guilabel}`Delivery Date` to a date after the expected date, and click {guilabel}`Apply` to confirm +the date. Finally, click {guilabel}`Confirm` to confirm the sales order. + +:::{important} +If the products are delivered before the {guilabel}`Alert Date` set on the product form, then no +alerts are created. +::: + +Next, click the {guilabel}`Delivery` smart button at the top of the sales order to see the warehouse +receipt form. + +On the warehouse receipt form, click {guilabel}`Validate`, and then {guilabel}`Apply` in the +accompanying pop-up window, to automatically process all {guilabel}`Done` quantities, and deliver +the products to the customer. + +:::{important} +To sell perishable products with expiration dates, the {guilabel}`Removal Strategy` for the +{guilabel}`Location` the products are stored in must be set to {abbr}`FEFO (First Expiry, First +Out)`. If there is not enough stock of perishable products in one lot, Odoo will automatically +take the remaining quantity required from a second lot with the next-soonest expiration date. +Removal strategies can also be set on {guilabel}`Product Categories`. +::: + +:::{seealso} +{doc}`../../shipping_receiving/removal_strategies` +::: + +## View expiration dates for lots & serial numbers + +To view (and/or group) all products with expiration dates by lot number, go to +{menuselection}`Inventory app --> Products --> Lots/Serial Numbers`. + +Once there, remove any default search filters from the search bar. Then, click {guilabel}`Group By`, +choose {guilabel}`Add Custom Group`, and select the {guilabel}`Expiration Date` parameter from the +drop-down menu. Doing so breaks down all perishable products, their expiration dates, and the +assigned lot number. + +```{image} expiration_dates/expiration-dates-group-by-dates.png +:alt: Group by expiration dates on lots and serial numbers page. +``` + +:::{tip} +Customers can also view the expiration date alert in their customer portal. +::: + +(inventory-product-management-expiration-alerts)= + +### Expiration alerts + +To see expiration alerts, go to {menuselection}`Inventory app --> Products --> Lots/Serial Numbers`. + +Then, click into a {guilabel}`Lot/Serial Number` with perishable products. Doing so reveals the +serial number detail form. + +:::{tip} +To view expiration date information in the list view, click the {icon}`oi-settings-adjust` +{guilabel}`(adjust settings)` icon at the top of the list of records, then tick the +{guilabel}`Expiration Date` checkbox. +::: + +On the {guilabel}`Lot/Serial Number` detail form, the {guilabel}`Dates` lists all expiration +information related to the products. + +If the expiration date for a lot/serial number has passed, the form displays a red +{guilabel}`Expiration Alert` at the top of the page to indicate that the products in this lot are +either expired or expiring soon. + +From here, click back to the {guilabel}`Lots/Serial Numbers` page (via the breadcrumbs). + +To see the new expiration alert, or any expiration alerts for products that are expired (or will +expire soon), click back to the {guilabel}`Lots/Serial Numbers` page via the breadcrumbs. Remove +all of the search filters from the search bar on the {guilabel}`Lots/Serial Numbers` dashboard. + +Then, click {guilabel}`Filters`, and choose {guilabel}`Expiration Alerts`. + +```{image} expiration_dates/expiration-dates-expiration-alert.png +:alt: Expiration alert for product past the expiration date. +``` + +### Expiration notifications + +Users can be notified when the expiration date for a product has passed. This can help keep specific +employees up to date on the status of items under their purview. + +To configure a notification, navigate to {menuselection}`Inventory app --> Products --> Products`. +Select a product configured with lot/serial numbers and expiration date tracking. Navigate to the +{guilabel}`Inventory` tab. Under the {guilabel}`Logistics` section, select a user in the +{guilabel}`Responsible` field. + +When the expiation date passes for a lot/serial number for this product, a notification is sent to +the user in this field. + diff --git a/content/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots.md b/content/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots.md new file mode 100644 index 000000000..a0120c980 --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots.md @@ -0,0 +1,443 @@ +--- +substitutions: + DO: '{abbr}`DO (Delivery Order)`' + PO: '{abbr}`PO (Purchase Order)`' + SO: '{abbr}`SO (Sales Order)`' + list: '{icon}`fa-list` {guilabel}`(list)`' +--- + +# Lot numbers + +*Lots* are one of the two ways to identify and track products in Odoo. They typically represent a +specific batch of products that were received, stored, shipped, or manufactured in-house. + +Manufacturers assign lot numbers to groups of products sharing common properties, facilitating +end-to-end traceability through their lifecycles. + +Lots are useful for managing large quantities of manufactured or received products, aiding in +tracing items back to their group, particularly for product recalls or {doc}`expiration dates +`. + +:::{seealso} +{doc}`serial_numbers` +::: + +## Enable lots & serial numbers + +To track products using lots, enable the *Lots & Serial Numbers* feature. Go to the +{menuselection}`Inventory app --> Configuration --> Settings`, scroll down to the +{guilabel}`Traceability` section, and tick the checkbox next to {guilabel}`Lots & Serial Numbers`. +Then, click {guilabel}`Save`. + +:::{seealso} +- {doc}`Tracking expiration dates ` +- {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)= + +## Track by lots + +Once the {guilabel}`Lots & Serial Numbers` feature is activated, configure individual products to be +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. + +:::{seealso} +{doc}`expiration_dates` +::: + +:::{important} +If a product has stock on-hand prior to activating tracking by lots or serial numbers, a warning +message appears. Use an {doc}`inventory adjustment ` to assign lot numbers to existing +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 + +Assign new lot numbers to {ref}`incoming goods ` on the +receipt form. When shipping {ref}`outgoing goods +`, select products with specific lot numbers on +the delivery order form. + +(inventory-product-management-assign-lots)= + +### On receipts + +Assigning new or existing lot numbers to incoming goods can be done directly on receipts. + +To begin, go to the {menuselection}`Purchase` app to [create and confirm](https://www.youtube.com/watch?v=o_uI718P1Dc) a {{ PO }} for products tracked by lot numbers. Then, +click the {guilabel}`Receipt` smart button that appears at the top of the page to navigate to the +warehouse receipt form. + +:::{note} +Alternatively, navigate to an existing receipt by going to the {menuselection}`Inventory` app, +clicking the {guilabel}`Receipts` Kanban card, and choosing the desired receipt. +::: + +:::{important} +Clicking {guilabel}`Validate` before assigning a lot number triggers an error, indicating that a +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 +Number` and {guilabel}`Quantity` are assigned. + +The two ways to assign lot numbers: **manually** and **importing**. + +#### Manual assignment + +To manually assign lot numbers, click {guilabel}`Add a line`. Input the {guilabel}`Lot/Serial +Number`, {guilabel}`Store To` location for the lot, {guilabel}`Quantity`, and {guilabel}`Destination +Package`, if any. + +:::{note} +To assign multiple lot numbers, or store to multiple locations, click {guilabel}`Add a line`, and +type a new {guilabel}`Lot/Serial Number` for additional quantities. Repeat until the total in the +{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 + +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. +::: + +Tick the {guilabel}`Keep current lines` checkbox to generate *additional* lot numbers in the +{guilabel}`Open: Stock move` pop-up window. To replace the lot numbers in the list, leave the +{guilabel}`Keep current lines` option unticked. + +Finally, click {guilabel}`Generate`. + +Once all product quantities have been assigned a lot number, click {guilabel}`Save` to close the +pop-up window. Then, click {guilabel}`Validate` on the receipt form. + +:::{seealso} +{ref}`Traceability report for lot numbers ` +::: + +(inventory-product-management-assign-lots-delivery)= + +### On delivery orders + +Odoo makes it possible to specify which lot numbers for a product are chosen for outgoing shipment +on a delivery order form. + +To begin, create or select an existing quotation from the {menuselection}`Sales` app. After +confirming the {{ SO }}, the {guilabel}`Delivery` smart button becomes available. Click the +{guilabel}`Delivery` smart button to view the warehouse receipt form for that specific {{ SO }}. + +:::{note} +Alternatively, navigate to delivery orders by going to the {menuselection}`Inventory` app, and +clicking the {guilabel}`Delivery Orders` kanban card. +::: + +Clicking the {guilabel}`Delivery` smart button opens the the delivery order form, where lot numbers +are picked for delivery. In the {guilabel}`Operations` tab, click the {{ list }} icon to the right of +the product that is tracked by lot numbers. Clicking that icon reveals a {guilabel}`Open: Stock +move` pop-up window. + +In the pop-up window, the chosen lot number and its storage location is displayed in the +{guilabel}`Pick From` column, with the with the full {guilabel}`Quantity` taken from that specific +lot (if there is enough stock in that particular lot). + +If there is insufficient stock in that lot, or if partial quantities of the {guilabel}`Demand` +should be taken from multiple lots, change the {guilabel}`Quantity` directly. + +:::{note} +The lot automatically chosen for delivery orders varies, depending on the selected removal +strategy ({abbr}`FIFO (First In, First Out)`, {abbr}`LIFO (Last In, First Out)`, or {abbr}`FEFO +(First Expiry, First Out)`). It also depends on the ordered quantity, and whether the lot's +on-hand quantity is enough to fulfill the order. +::: + +:::{seealso} +{doc}`../../shipping_receiving/removal_strategies` +::: + +Repeat the above steps to select enough lots to fulfill the {guilabel}`Demand`, and click +{guilabel}`Save` to close the pop-up window. Lastly, click the {guilabel}`Validate` button on the +{{ DO }} to deliver the products. + +```{image} lots/pick-from-lots.png +:align: center +:alt: Popup for source lot number on sales order. +``` + +:::{seealso} +{ref}`Traceability report for lot numbers ` +::: + +## Lot management + +Manage and view existing lot numbers for products in the {guilabel}`Lot/Serial Numbers` dashboard by +going to {menuselection}`Inventory app --> Products --> Lots/Serial Numbers`. + +By default, lot numbers are grouped by product, and selecting the drop-down menu for each product +displays the existing lot numbers. Select a lot number to {ref}`modify or add details +` linked to the lot. Lot numbers can also be {ref}`created +` from this page, by clicking the {guilabel}`New` +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. +::: + +(inventory-product-management-edit-lot)= + +### Modify lot + +Clicking a lot from the {guilabel}`Lot/Serial Number` dashboard reveals a separate page where +additional information can be provided about the lot. + +:::{tip} +Odoo automatically generates a new {guilabel}`Lot/Serial Number` to follow the most recent +number. However, it can be edited, by clicking the line under the {guilabel}`Lot/Serial Number` +field, and changing the generated number to any desired one. +::: + +On the lot number form, the following fields can be modified: + +- {guilabel}`Lot/Serial Number`: change the lot number linked to the {guilabel}`Product` +- {guilabel}`Internal Reference`: records an alternative lot/serial number used within the warehouse + that differs from the one used by the supplier manufacturer. +- {guilabel}`Company`: specify the company where the lot number is available. +- {guilabel}`Description`: add extra details about the lot or serial number in this text field. + +:::{important} +On existing lots, the {guilabel}`Product` and {guilabel}`On Hand Quantity` fields **cannot** be +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} +{doc}`Set expiration dates for lots ` +::: + +#### Add property + +To add custom fields to lots for enhanced traceability, there are two methods of adding properties +on a lot number form: + +1. Click the {icon}`fa-cog` {guilabel}`(cog)` icon at the top-left of the page, then select + {icon}`fa-cogs` {guilabel}`Add Properties` from the drop-down menu. +2. 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. + +```{eval-rst} +.. 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>` +::: + +(inventory-product-management-create-new-lot)= + +### Reserve lot number for a product + +To create a lot number for a product, begin by going to {menuselection}`Inventory app --> Products +--> Lot/Serial Numbers`, and click {guilabel}`New`. + +:::{important} +Creating a lot number reserves it for a product but **does not** assign it. To assign lot +numbers, refer to the section on {ref}`assigning lot numbers on receipts +`. +::: + +:::{tip} +While Odoo automatically generates a new {guilabel}`Lot/Serial Number` to follow the most recent +number, it can be edited and changed to any desired number, by clicking the line under the +{guilabel}`Lot/Serial Number` field on the lot form, and changing the generated number. +::: + +Once the new {guilabel}`Lot/Serial Number` is generated, click the blank field next to +{guilabel}`Product` to reveal a drop-down menu. From this menu, select the product to which this new +number will be assigned. + +```{eval-rst} +.. example:: + 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. + +```{eval-rst} +.. 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. +``` + +## Manage lots for different operations types + +By default, new lots can only be created when receiving products, and existing lot numbers cannot +be used. For sales orders, only existing lot numbers can be utilized, and new ones cannot be created +on the delivery order. + +To change the ability to use new (or existing) lot numbers on any operation type, go to the +{menuselection}`Inventory app --> Configuration --> Operations Types`, and select the desired +operation type. + +On the operation type form, under the {guilabel}`Lots/Serial Numbers` section, tick the +{guilabel}`Create New` checkbox to enable new lot numbers to be created during this operation type. +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} +For inter-warehouse transfers involving products tracked by lots, it can be useful to enable the +{guilabel}`Use Existing Lots/Serial Numbers` option for warehouse receipts. +::: + +(inventory-product-management-lot-traceability)= + +## Display lots on delivery slips + +When selling products tracked with lots, it is possible to include the lot numbers on the delivery +slips sent to customers. This can be helpful to customers in cases where lot numbers are needed, +such as filing an RMA or repair request, or registering the product. + +To include lot numbers on delivery slips, open the {menuselection}`Inventory` app, and navigate to +{menuselection}`Configuration --> Settings`. Scroll down to the {guilabel}`Traceability` section, +tick the {guilabel}`Display Lots & Serial Numbers on Delivery Slips` checkbox, and click +{guilabel}`Save`. + +After enabling the {guilabel}`Display Lots & Serial Numbers on Delivery Slips` setting, lot numbers +are listed on delivery slips for products tracked by lots, once the delivery order is validated. + +To view lot numbers on delivery orders and delivery slips, navigate to the +{menuselection}`Inventory` app, click on {guilabel}`Delivery Orders`, and select an order containing +a product tracked using lots. + +To view the lot numbers of products included in the order, make sure the {guilabel}`Operations` tab +is selected, then click the {icon}`oi-settings-adjust` {guilabel}`(adjust)` button to the right of +the tab. Ensure that the {guilabel}`Serial Numbers` checkbox is ticked, which causes a +{guilabel}`Serial Numbers` column to appear. The lot number(s) for each product included in the +order are displayed in this column. + +When the order is ready to be processed, click {guilabel}`Validate` to confirm the delivery and add +product information to the delivery slip. + +At the top of the order's form, click the {icon}`fa-cog` {guilabel}`(Actions)` button, and select +{guilabel}`Print --> Delivery Slip`. The delivery slip is then downloaded. Open the delivery slip +using the device's browser or file manager. Lot numbers are listed next to their respective products +in the {guilabel}`Lot/Serial Number` column. + +```{image} lots/delivery-slip.png +:alt: The order lines section of a delivery slip, showing a product and its serial +: number. +``` + +## Traceability + +Manufacturers and companies can refer to traceability reports to see the entire lifecycle of a +product: where it came from, when it arrived, where it was stored, who it went to (and when). + +To see the full traceability of a product, or group by lots, go to the {menuselection}`Inventory app +--> Products --> Lots/Serial Numbers`. Doing so reveals the {menuselection}`Lots/Serial Numbers` +dashboard. + +From here, products with lot numbers assigned to them will be listed by default, and can be expanded +to show the lot numbers those products have assigned to them. + +To group by lots, begin by removing any filters in the {guilabel}`Search...` bar. Then, click the +{icon}`fa-caret-down` {guilabel}`(caret down)` icon to open a drop-down menu of {guilabel}`Filters`, +{guilabel}`Group By` options, and {guilabel}`Favorites`. Under the {guilabel}`Group By` section, +click the {guilabel}`Add Custom Group` option, and select {guilabel}`Lot/Serial Number` from the +drop-down menu. + +Doing so reorganizes all the records on the page to display all existing lots and serial numbers, +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 + +To view a full stock moves report for a lot number, select the lot number line from the +{guilabel}`Lots/Serial Number` dashboard. On the lot number form, click the {guilabel}`Traceability` +smart button. + +```{image} lots/traceability-report.png +:align: center +:alt: Show the Traceability Report for a lot, that displays the stock moves. +``` + +:::{seealso} +{doc}`../product_tracking` +::: + diff --git a/content/applications/inventory_and_mrp/inventory/product_management/product_tracking/reassign.md b/content/applications/inventory_and_mrp/inventory/product_management/product_tracking/reassign.md new file mode 100644 index 000000000..66116eed0 --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/product_management/product_tracking/reassign.md @@ -0,0 +1,97 @@ +# Reassign lot/serial numbers + +Changing a product's tracking settings to use lots or serial numbers, *after* storing products in +Odoo without them, can lead to inconsistent records. Follow this documentation to learn how to use +an inventory adjustment to assign lot or serial numbers to products that were not originally +assigned lots. + +```{image} reassign/warning.png +:align: center +:alt: 'Warning message: products in stock have no lot/serial number.' +``` + +:::{note} +This document outlines the process of using two inventory adjustments: one to remove incorrect +records *without* lot numbers, and another to save the quantities *with* the lot numbers. +::: + +:::{seealso} +- {doc}`Set up and use lot numbers ` +- {doc}`Use serial numbers ` +::: + +## Change on-hand quantity to zero + +To change the product's settings to track by lots or serial numbers, begin by navigating to +{menuselection}`Inventory app --> Products --> Products`, and select the intended product. + +Next, click the product's {guilabel}`On Hand` smart button to open the {guilabel}`Update Quantity` +page. In the {guilabel}`On Hand Quantity` column, change the value to zero. + +:::{note} +If the product is stored in multiple locations, make sure the **total** on hand quantity at +**all** locations is zero. +::: + +```{image} reassign/remove-quant.png +:align: center +:alt: Show the Inventory Adjustments model, highlighting the "On Hand Quantity" field. +``` + +## Change traceability setting + +Return to the product form ({menuselection}`Inventory app --> Products --> Products`), and switch to +the {guilabel}`Inventory` tab. In the {guilabel}`Traceability` section, change the +{guilabel}`Tracking` option from {guilabel}`No Tracking` to {guilabel}`By Lots` or {guilabel}`By +Unique Serial Number`. + +:::{seealso} +{doc}`expiration_dates` +::: + +```{image} reassign/tracking.png +:align: center +:alt: Enable lots and serial numbers. +``` + +## Restore on-hand quantity + +After manually changing the on-hand quantity to zero and changing the {guilabel}`Tracking` setting +to lots or serial numbers, restore the quantities by clicking the {guilabel}`On Hand` smart button +from the desired product form. + +On the {guilabel}`Update Quantity` page, because the on-hand quantity had been previously changed to +zero, a {guilabel}`No Stock On Hand` warning appears on the page. From here, click the +{guilabel}`New` button in the top-left corner. Doing so reveals a new, modifiable line on the +{guilabel}`Update Quantity` page. Then, input a desired lot number in the {guilabel}`Lot/Serial +Number` field, and adjust the {guilabel}`On Hand Quantity` to its original value. + +:::{seealso} +{doc}`../../warehouses_storage/inventory_management/count_products` +::: + +```{image} reassign/update-quantity.png +:align: center +:alt: Fill in the "Lot/Serial Number" and "On Hand Quantity" field. +``` + +:::{tip} +To find the original quantity, and adjust the {guilabel}`On Hand Quantity` accordingly, after +assigning a new lot or serial number, click the {icon}`fa-pencil` {guilabel}`(pencil)` icon in +the {guilabel}`On Hand Quantity` column. Then, click the {icon}`fa-history` {guilabel}`History` +button on the far-right. + +```{image} reassign/adjustment.png +:align: center +:alt: Show the "History" button on the Inventory Adjustments page. +``` + +The inventory adjustment that changed the on-hand quantity to zero is displayed in the +{guilabel}`Quantity` field. + +> ```{image} reassign/history.png +> :align: center +> :alt: Show the history entry. +> ``` +::: + diff --git a/content/applications/inventory_and_mrp/inventory/product_management/product_tracking/serial_numbers.md b/content/applications/inventory_and_mrp/inventory/product_management/product_tracking/serial_numbers.md new file mode 100644 index 000000000..c775f321f --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/product_management/product_tracking/serial_numbers.md @@ -0,0 +1,395 @@ +# Serial numbers + +*Serial numbers* are one of the two ways to identify and track products in Odoo, along with +{doc}`lots `. A serial number is a unique identifier assigned to a product to distinguish it +from other products in a series. Serial numbers can consist of several character types: they can +contain numbers, letters, other typographical characters, or any mix of these character types. + +The goal of assigning serial numbers allows for the tracking of individual products and their +{doc}`expiration dates ` and location throughout the supply chain. For instance, +serial numbers can help manufacturers locate products to provide after-sales services or in the +event of a recall. + +:::{seealso} +[Odoo Tutorials: Serial Numbers](https://www.youtube.com/watch?v=ZP-gMz2X5AY) +::: + +(inventory-product-management-enable-lots)= + +## Enable lots & serial numbers + +To track products using serial numbers, two settings need to be enabled: the {ref}`Lots & Serial +Numbers traceability setting `, and {ref}`serial +number usage by operation type `. + +(inventory-product-management-traceability-setting)= + +### Traceability setting + +The *Lots & Serial Numbers* traceability feature *must* be enabled first to track +products. To do so, go to {menuselection}`Inventory app --> Configuration --> Settings`, scroll down +to the {guilabel}`Traceability` section, and tick the {guilabel}`Lots & Serial Numbers` checkbox. +Remember to click the {guilabel}`Save` button to save changes. + +```{image} serial_numbers/enabled-setting.png +:alt: Enabled Lots & Serial Numbers setting. +``` + +(inventory-product-management-operation-type-setting)= + +### By operation type + +Next, specify whether the ability to create new or use existing serial numbers should be turned on +for particular operation types (such as shipping or receiving goods). In other words, this setting +allows for serial number tracking on warehouse receipts and delivery orders. + +```{eval-rst} +.. example:: + Enabling the *Create New* option for receipts allows new serial numbers to be assigned + as items are received. However, for delivery orders, it is often disabled to prevent workers from + accidentally assigning serial numbers that do not exist in inventory. +``` + +To enable the creation of new serial numbers on an operation, navigate to {menuselection}`Inventory +app --> Configuration --> Operations Types`. + +From the {guilabel}`Operations Types` page, select the desired operation type (e.g. +{guilabel}`Receipts`, {guilabel}`Delivery Orders`, or {guilabel}`Manufacturing`), and select the +{guilabel}`Create New` option in the {guilabel}`Lots/Serial Numbers` section of the operation type's +configuration page. + +```{image} serial_numbers/create-new-setting.png +:alt: Show "Create New" option is selected on the Receipts operation type. +``` + +(inventory-product-management-detailed-operations)= + +## Configure serial number tracking on individual products + +Once the {ref}`Lots & Serial Numbers setting ` +has been activated, individual products can now be tracked using serial numbers. To track a product, +go to {menuselection}`Inventory app --> Products --> Products`, and select the desired product. + +In the {guilabel}`General Information` tab on the product form, make sure the box next to +{guilabel}`Track Inventory` is checked. Then, select {guilabel}`By Unique Serial Number`, and click +{guilabel}`Save` to save the changes. Now, existing or new serial numbers can now be selected and +assigned to newly-received or manufactured batches of this product. + +```{image} serial_numbers/product-tracking.png +:alt: Enabled serial number tracking on product form. +``` + +(inventory-product-management-assign-sn)= + +## Assign serial numbers + +In Odoo, serial numbers can be assigned at several times and places: + +- When a product is {ref}`already in stock ` +- Via the {ref}`Moves smart button ` on a receipt +- Via the {ref}`Open: Stock move window ` on a receipt +- {doc}`During a manufacturing order + <../../../manufacturing/basic_setup/configure_manufacturing_product>` for a product tracked by + lots/serial numbers +- When {doc}`making an inventory adjustment + <../../warehouses_storage/inventory_management/count_products>` + +(inventory-product-management-already-in-stock)= + +### Create new serial numbers for products already in stock + +New serial numbers can be created for products already in stock with no assigned serial number. To +do so, go to {menuselection}`Inventory --> Products --> Lots/Serial Numbers`, and click +{guilabel}`New`. Doing so reveals a blank lot/serial number form. On this form, a new +{guilabel}`Lot/Serial Number` is generated automatically. + +:::{tip} +While Odoo automatically generates a new lot/serial number to follow the most recent number, it +can be edited and changed to any desired number, by clicking the line under the +{guilabel}`Lot/Serial Number` field, and changing the generated number. +::: + +Once the {guilabel}`Lot/Serial Number` is generated, click the blank field next to +{guilabel}`Product` to reveal a drop-down menu. From this menu, select the product to which this new +number will be assigned. + +This form also provides the option to adjust the {guilabel}`On Hand Quantity`, to assign a unique +{guilabel}`Internal Reference` number (for additional traceability), and to assign this specific +lot/serial number configuration to a specific company in the {guilabel}`Company` field. A detailed +description of this specific lot/serial number can also be added in the {guilabel}`Description` tab +below. + +:::{tip} +The {guilabel}`Internal Reference` number field is a space for manufacturers to input an +additional unique number to allow for easier tracking. For instance, SKU values may be used +here. +::: + +When all desired configurations are complete, click the {guilabel}`Save` button to save all changes. + +```{image} serial_numbers/new-serial-number.png +:alt: New serial number created for existing product stock. +``` + +After a new serial number has been created, assigned to the desired product, and saved, navigate +back to the product form, by going to {menuselection}`Inventory app --> Products --> Products`, and +selecting the product that this newly-created serial number was just assigned to. + +On that product's detail form, click the {guilabel}`Lot/Serial Numbers` smart button to view the new +serial number. + +(inventory-product-management-incoming-outgoing-products)= + +### Create serial numbers for incoming or outgoing products + +Serial numbers can be assigned to both incoming and outgoing goods. The receipt and delivery order +forms mirror one another; the instructions below can be followed to assign serial numbers in either +form. + +- **Incoming goods:** Assign serial numbers directly on the **receipt**. Receipts can be accessed by + navigating to {menuselection}`Inventory app --> Operations --> Receipts`. +- **Outgoing goods:** Assign serial numbers directly on the **delivery order**. Receipts can be + accessed by navigating to {menuselection}`Inventory app --> Operations --> Deliveries`. + +:::{important} +Before assigning serial numbers on receipts or delivery orders, be sure that the ability to +{ref}`create new serial numbers by operations type +` is enabled. +::: + +#### Lots/serial number field + +Serial numbers can be entered directly into the {guilabel}`Serial Numbers` field on a receipt or +delivery order. + +```{image} serial_numbers/enter-in-field.png +:alt: Select value for Serial Number field on receipt. +``` + +::::{tip} +To make the {guilabel}`Serial Numbers` field visible on a receipt or delivery order, click the +{icon}`oi-settings-adjust` {guilabel}`(Adjust Settings)` icon, and in the drop-down menu, tick +the {guilabel}`Serial Numbers` checkbox. + +:::{figure} serial_numbers/field-visible.png +:alt: Allow Serial Numbers field to show on a receipt or delivery order. + +Example **Serial Numbers** field on a delivery order. +::: +:::: + +(inventory-product-management-stock-move)= + +#### Stock move pop-up window + +For various methods of assigning serial numbers individually or in bulk, click the {icon}`fa-list` +{guilabel}`(list)` icon in the product line of a receipt. + +##### Add a line + +In the {guilabel}`Open: Stock move` pop-up window, manually enter serial numbers in the +{guilabel}`Lot/Serial Number` column. This method is best reserved for adding only one or a few +serial numbers. + +```{image} serial_numbers/stock-move-add-line.png +:alt: Add a line on the stock move pop-up. +``` + +(inventory-product-management-generate-serials)= + +##### Generate Serials/Lots + +Assign multiple serial numbers at once by clicking the {guilabel}`Generate Serials/Lots` button in +the {guilabel}`Open: Stock move` pop-up window. + +```{image} serial_numbers/stock-move-generate-serials.png +:alt: Show generate serials pop-up. +``` + +Doing so opens a new popup, {guilabel}`Generate Serial numbers`, which contains a few fields: + +- {guilabel}`First SN`: Input the first serial number that should start the sequence. From there, + Odoo automatically detects what pattern should be followed to generate more serial numbers. + +- {guilabel}`Number of SN`: Specify the desired number of serial numbers to generate. + + :::{note} + The number of serials generated will be reflected in the {guilabel}`Quantity` field on a + receipt or delivery order. Even if the number of serial numbers generated exceeds the + {guilabel}`Demand` value, Odoo still allows the quantity (based on the serial numbers) to be + delivered or received. + + ```{image} serial_numbers/stock-move-generate-quantity-tip.png + :alt: Show how the quantity of serial numbers alters the delivery order quantity. + ``` + ::: + +- {guilabel}`Keep current lines` checkbox: Check this box to keep existing serial numbers that may + have been previously added. To replace existing serial numbers in the list, leave the box + unchecked. + +After filling out these fields, click the {guilabel}`Generate` button. The newly generated serials +now appear in the {guilabel}`Open: Stock move` window. By clicking {icon}`fa-cloud-upload` +{guilabel}`(Save)`, the {guilabel}`Quantity` and the {guilabel}`Serial Numbers` fields on the +delivery order or receipt update automatically. + +##### Import Serials/Lots + +Another option for assigning multiple serial numbers at once is to click the {guilabel}`Import +Serials/Lots` button in the {guilabel}`Open: Stock move` pop-up window. + +:::{important} +If the import button is not visible, ensure the {guilabel}`Create New` box is checked in the +{ref}`receipt's configuration page `. +::: + +Doing so opens the {guilabel}`Import Serials` pop-up window. Enter each serial number on a separate +line in the {guilabel}`Lots/Serial numbers` text field. + +As when {ref}`generating serials `, check the +{guilabel}`Keep current lines` box to keep existing serial numbers, or leave it unchecked to +overwrite them. + +:::{tip} +To expedite this process, copy/paste serial numbers from an existing spreadsheet and add them to +the {guilabel}`Lots/Serial numbers` text field. +::: + +Finally, click {guilabel}`Generate`. + +```{image} serial_numbers/stock-move-import-serials.png +:alt: Show import serials pop-up. +``` + +```{eval-rst} +.. example:: + For a receipt with a :guilabel:`Demand` of `3.00` products, one product has already been assigned + a serial number in the :guilabel:`Open: Stock move` pop-up window. + + So, in the :guilabel:`Import Lots` pop-up window, two serial numbers, `124` and `125` are + assigned to the remaining products by entering the following in the :guilabel:`Lots/Serial + numbers` input field: + + .. code-block:: + + 124 + 125 + + The :guilabel:`Keep current lines` option is selected to add these two serial numbers **in + addition** to the serial number, `123`, that has already been assigned. + + .. image:: serial_numbers/import-serial.png + :alt: Show example of correctly inputting serial numbers in the text field. +``` + +(inventory-product-management-moves-button)= + +#### Detailed operations + +Accessible from both receipt and delivery order forms, the *Detailed Operations* page shows a +detailed view of product movements, including information about serial numbers, exact locations, +expiration dates, etc. This level of detail permits more precise tracking, for example, when +handling perishable or regulated goods. + +To access this page, first {ref}`select a warehouse receipt or delivery order +`. Then, click on the {icon}`fa-bars` +{guilabel}`Moves` smart button at the top of the page. + +In the {guilabel}`Lot/Serial Number` column, manually type (or select from the drop-down menu) +the desired serial numbers for each individual product. + +```{image} serial_numbers/moves-button.png +:alt: Show the detailed Moves page. +``` + +When finished, click the receipt/delivery order's breadcrumbs, and the assigned serial numbers are +automatically saved. + +## Display serial numbers on delivery slips + +When selling products tracked using serial numbers, it is possible to include the serial numbers on +the delivery slips sent to customers. This can be helpful to customers in cases where serial numbers +are needed, such as filing an RMA or repair request, or registering the product. + +To include serial numbers on delivery slips, open the {menuselection}`Inventory` app, and navigate +to {menuselection}`Configuration --> Settings`. Scroll down to the {guilabel}`Traceability` section, +tick the {guilabel}`Display Lots & Serial Numbers on Delivery Slips` checkbox, and click +{guilabel}`Save`. + +After enabling the {guilabel}`Display Lots & Serial Numbers on Delivery Slips` setting, serial +numbers are listed on delivery slips for products tracked by serial numbers, once the delivery order +is validated. + +To view serial numbers on delivery orders and delivery slips, navigate to the +{menuselection}`Inventory` app, click on {guilabel}`Delivery Orders`, and select an order containing +a product tracked using serial numbers. + +To view the serial numbers of products included in the order, make sure the {guilabel}`Operations` +tab is selected, then click the {icon}`oi-settings-adjust` {guilabel}`(adjust)` icon to the right of +the tab. Ensure that the {guilabel}`Serial Numbers` checkbox is ticked, which causes a +{guilabel}`Serial Numbers` column to appear. The serial number(s) for each product included in the +order are displayed in this column. + +When the order is ready to be processed, click {guilabel}`Validate` to confirm the delivery and add +product information to the delivery slip. + +At the top of the order's form, click the {icon}`fa-cog` {guilabel}`(Actions)` button, and select +{menuselection}`Print --> Delivery Slip`. The delivery slip is then downloaded. Open the delivery +slip using the device's browser or file manager. Serial numbers are listed next to their respective +products in the {guilabel}`Lot/Serial Number` column. + +```{image} serial_numbers/delivery-slip.png +:alt: The order lines section of a delivery slip, showing a product and its serial +: number. +``` + +## Traceability & reporting + +Manufacturers and companies can refer to the *Lots/Serial Numbers* dashboard and traceability +reports to see the entire lifecycle of a product: when and where it originated, where it was stored, +and who it was shipped to. + +### Lots/Serial Numbers dashboard + +To see the full traceability of a product, or group by serial numbers, go to +{menuselection}`Inventory app --> Products --> Lots/Serial Numbers`. Doing so reveals the +{guilabel}`Lots/Serial Numbers` dashboard. + +#### Reporting + +On the {guilabel}`Lots/Serial Numbers` dashboard, products with serial numbers assigned to them are +listed by default. Click the {icon}`fa-caret-right` {guilabel}`(expand)` icon to show which serial +numbers are assigned to the chosen product. + +To group by serial numbers (or lots), first remove any default filters from the search bar in the +upper-right corner. Then, click the {icon}`fa-caret-down` {guilabel}`(down arrow)` icon and select +{guilabel}`Add Custom Group`, which reveals a mini drop-down menu. From this mini drop-down menu, +select {guilabel}`Lot/Serial Number`, and click {guilabel}`Apply`. + +Doing so reveals all existing serial numbers and lots. Each row can be expanded to show all +quantities of product assigned to that serial/lot number. For unique serial numbers that are not +reused, there should be just one product per serial number. + +```{image} serial_numbers/serial-numbers-dashboard.png +:alt: Serial numbers reporting page with drop-down lists. +``` + +:::{tip} +For additional information regarding an individual serial (or lot) number, click the line +item for the serial number to reveal that specific {guilabel}`Serial Number` form. From this +form, click the {guilabel}`Location` and {guilabel}`Traceability` smart buttons to see all stock +on-hand using that serial number, and any operations made using that serial number. +::: + +:::{seealso} +{doc}`Reassign ` + +In addition to using the {guilabel}`Lots/Serial Numbers` dashboard, there are several other +reporting templates that display the {guilabel}`Lot/Serial Number` field or the ability to filter +by serial number. Go to {menuselection}`Inventory app --> Reporting` to access: + +- {guilabel}`Locations` report +- {guilabel}`Moves History` report +- {guilabel}`Moves Analysis` report +::: + diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving.md b/content/applications/inventory_and_mrp/inventory/shipping_receiving.md new file mode 100644 index 000000000..c5120af1b --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/shipping_receiving.md @@ -0,0 +1,16 @@ +--- +nosearch: true +--- + +# Shipping and receiving + +```{toctree} +:titlesonly: true + +shipping_receiving/daily_operations +shipping_receiving/setup_configuration +shipping_receiving/reservation_methods +shipping_receiving/picking_methods +shipping_receiving/removal_strategies +``` + diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations.md b/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations.md new file mode 100644 index 000000000..bfb90ff8d --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations.md @@ -0,0 +1,104 @@ +--- +hide-page-toc: true +show-content: true +--- + +# Inbound and outbound flows + +There are several ways to handle how a warehouse receives products (receipts) and ships products +(deliveries). Depending on several factors, such as the type of products stocked and sold, warehouse +size, and the amount of daily confirmed receipts and delivery orders, the way products are handled +when coming in and out of the warehouse can vary a lot. Different settings can be configured for +receipts and deliveries; they do not have to be configured to have the same number of steps. + +:::{seealso} +- [Using Routes (eLearning Tutorial)](https://www.odoo.com/slides/slide/using-routes-1018) +- [Push & Pull Rules (eLearning Tutorial)](https://www.odoo.com/slides/slide/push-pull-rules-1024) +::: + +## Choosing the right inventory flow to handle receipts and deliveries + +By default, Odoo handles shipping and receiving in three different ways: in one, two, or three +steps. The simplest configuration is one step, which is the default. Each additional step required +for a warehouse for either the receiving or shipping process will add an additional layer of +operations to perform before a product is either received or shipped. These configurations depend +entirely on the requirements for the products stored, such as performing quality checks on received +products, or using special packaging on shipped products. + +### One-step flow + +The receiving and shipping rules for a one-step configuration are as follows: + +- **Receipt**: Receive products directly into stock. No intermediate steps between receipt and stock + occur, such as a transfer to a quality control location. +- **Shipping**: Ship products directly from stock. No intermediate steps between stock and shipping + occur, such as a transfer to a packing location. +- Can only be used if not using {abbr}`FIFO (First In, First Out)`, {abbr}`LIFO (Last In, First + Out)`, or {abbr}`FEFO (First Expired, First Out)` removal strategies. +- Receipts and/or deliveries are handled quickly. +- Recommended for small warehouses with low stock levels, and for non-perishable items. +- Items are received or shipped directly into/from stock. + +:::{seealso} +{doc}`daily_operations/receipts_delivery_one_step` +::: + +### Two-step flow + +The receiving and shipping rules for a two-step configuration are as follows: + +- **Input + stock**: Bring products to an input location *before* moving into stock. Products can be + organized by different internal storage locations, such as various shelves, freezers, and locked + areas, before being stocked in the warehouse. +- **Pick + ship**: Bring products to an output location before shipping. Packages can be organized + by different carriers or shipping docks before being shipped. +- Minimum requirement to use lot numbers or serial numbers to track products with a + {abbr}`FIFO (First In, First Out)`, {abbr}`LIFO (Last In, First Out)` or + {abbr}`FEFO (First Expired, First Out)` removal strategy. +- Recommended for larger warehouses with high stock levels, or when stocking large items (such as + mattresses, large furniture, heavy machinery, etc.). +- Products received will not be available for manufacturing, shipping, etc., until they are + transferred into stock. + +:::{seealso} +{doc}`daily_operations/receipts_delivery_two_steps` +::: + +### Three-step flow + +The receiving and shipping rules for a three-step configuration are as follows: + +- **Input + quality + stock**: Receive products at the input location, transfer them to a quality + control area, and move the ones that pass inspection into stock. +- **Pick + pack + ship**: Pick products according to their removal strategy, pack them in a + dedicated packing area, and bring them to an output location for shipping. +- Can be used when tracking products by lot or serial numbers when using a {abbr}`FIFO (First In, + First Out)`, {abbr}`LIFO (Last In, First Out)`, or {abbr}`FEFO (First Expired, First Out)` removal + strategy. +- Recommended for very large warehouses with very high stock levels. +- Required for any warehouse needing to perform quality control inspections before receiving items + into stock. +- Products received will not be available for manufacturing, shipping, etc., until they are + transferred into stock. + +:::{seealso} +- {doc}`daily_operations/receipts_three_steps` +- {doc}`daily_operations/delivery_three_steps` +::: + +```{toctree} +:titlesonly: true + +daily_operations/use_routes +daily_operations/receipts_delivery_one_step +daily_operations/receipts_delivery_two_steps +daily_operations/receipts_three_steps +daily_operations/delivery_three_steps +daily_operations/putaway +daily_operations/storage_category +daily_operations/cross_dock +daily_operations/stock_warehouses +daily_operations/owned_stock +daily_operations/dropshipping +``` + diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/cross_dock.md b/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/cross_dock.md new file mode 100644 index 000000000..59a439269 --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/cross_dock.md @@ -0,0 +1,104 @@ +# Organize a cross-dock in a warehouse + +Cross-docking is the process of sending products that are received directly to the customers, +without making them enter the stock. The trucks are simply unloaded in a *Cross-Dock* area in order +to reorganize products and load another truck. + +```{image} cross_dock/cross1.png +:align: center +``` + +:::{note} +For more information on how to organize your warehouse, read our blog: [What is cross-docking and +is it for me?](https://www.odoo.com/blog/business-hacks-1/post/what-is-cross-docking-and-is-it-for-me-270) +::: + +## Configuration + +In the *Inventory* app, open {menuselection}`Configuration --> Settings` and activate the +*Multi-Step Routes*. + +```{image} cross_dock/cross2.png +:align: center +``` + +:::{note} +Doing so will also enable the *Storage Locations* feature. +::: + +Now, both *Incoming* and *Outgoing* shipments should be configured to work with 2 steps. To adapt +the configuration, go to {menuselection}`Inventory --> Configuration --> Warehouses` and edit your +warehouse. + +```{image} cross_dock/cross3.png +:align: center +``` + +This modification will lead to the creation of a *Cross-Docking* route that can be found in +{menuselection}`Inventory --> Configuration --> Routes`. + +```{image} cross_dock/cross4.png +:align: center +``` + +## Configure products with Cross-Dock Route + +Create the product that uses the *Cross-Dock Route* and then, in the inventory tab, select the +routes *Buy* and *Cross-Dock*. Now, in the purchase tab, specify the vendor to who you buy the +product and set a price for it. + +```{image} cross_dock/cross5.png +:align: center +``` + +```{image} cross_dock/cross6.png +:align: center +``` + +Once done, create a sale order for the product and confirm it. Odoo will automatically create two +transfers which will be linked to the sale order. The first one is the transfer from the *Input +Location* to the *Output Location*, corresponding to the move of the product in the *Cross-Dock* +area. The second one is the delivery order from the *Output Location* to your *Customer Location. +Both are in state \*Waiting Another Operation* because we still need to order the product to our +supplier. + +```{image} cross_dock/cross7.png +:align: center +``` + +```{image} cross_dock/cross8.png +:align: center +``` + +Now, go to the *Purchase* app. There, you will find the purchase order that has been automatically +triggered by the system. Validate it and receive the products in the *Input Location*. + +```{image} cross_dock/cross9.png +:align: center +``` + +```{image} cross_dock/cross10.png +:align: center +``` + +When the products have been received from the supplier, you can go back to your initial sale order +and validate the internal transfer from *Input* to *Output*. + +```{image} cross_dock/cross11.png +:align: center +``` + +```{image} cross_dock/cross12.png +:align: center +``` + +The delivery order is now ready to be processed and can be validated too. + +```{image} cross_dock/cross13.png +:align: center +``` + +```{image} cross_dock/cross14.png +:align: center +``` + diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/delivery_three_steps.md b/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/delivery_three_steps.md new file mode 100644 index 000000000..b0e1f46c4 --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/delivery_three_steps.md @@ -0,0 +1,123 @@ +# Three-step delivery + +Some companies process large amounts of deliveries every day, many of which include multiple +products or require special packaging. To make this efficient, a packing step is needed before +shipping out products. For this, Odoo has a three step process for delivering goods. + +In the default three-step delivery process, products that are part of a delivery order are picked in +the warehouse according to their removal strategy, and brought to a packing zone. After the items +have been packed into the different shipments in the packing zone, they are brought to an output +location before being shipped. These steps can be modified if they do not fit the needs of the +business. + +## Configuration + +To change delivery settings from {doc}`one step ` to three steps, make +sure the *Multi-Step Routes* option is enabled in {menuselection}`Inventory app --> Configuration +--> Settings --> Warehouse`. Note that activating {guilabel}`Multi-Step Routes` will also activate +*Storage Locations*. + +```{image} delivery_three_steps/delivery-three-steps-multi-step-routes.png +:align: center +:alt: Activate multi-step routes and storage locations in inventory settings. +``` + +Next, the warehouse needs to be configured for three step deliveries. To do this, go to +{menuselection}`Inventory app --> Configuration --> Warehouses`, and click on the +{guilabel}`warehouse` to edit. Then, select {guilabel}`Pack goods, send goods in output and then +deliver (3 steps)` for {guilabel}`Outgoing Shipments`. + +```{image} delivery_three_steps/delivery-three-steps-outgoing-shipments.png +:align: center +:alt: Set outgoing shipment option to deliver in three steps. +``` + +Activating three-step receipts and deliveries creates two new internal locations: a *Packing Zone* +(WH/Packing Zone), and *Output* (WH/Output). To rename these locations, go to +{menuselection}`Inventory app --> Configuration --> Locations`, click on the {guilabel}`Location` to +change, and update the name. + +## Deliver in three steps (pick + pack + ship) + +### Create a sales order + +To create a new quote, go to {menuselection}`Sales app --> Create`, which reveals a blank quotation +form. On the blank quotation form, select a {guilabel}`Customer`, add a storable +{guilabel}`Product`, and click {guilabel}`Confirm`. + +A {guilabel}`Delivery` smart button appears in the top right of the quotation form. Clicking it +opens the picking order to move the ordered product from `WH/Stock` to `WH/Packing Zone`. + +```{image} delivery_three_steps/delivery-three-steps-smart-button.png +:align: center +:alt: |- +: After confirming the sales order, the Delivery smart button appears showing three items +: associated with it. +``` + +### Process a picking + +The picking order will be created once the sales order is confirmed. To view the picking, navigate +to the {menuselection}`Inventory app`, and locate the {guilabel}`Pick` task card on the +{guilabel}`Inventory Overview` dashboard. + +Click the {guilabel}`# To Process` button, which reveals the picking order generated from the +previously confirmed sales order. + +Click on the picking to process. If the product is in stock, Odoo will automatically reserve the +product. Click {guilabel}`Validate` to mark the picking as done, and complete the transfer to the +{guilabel}`Packing Zone`. + +```{image} delivery_three_steps/delivery-three-steps-picking-order.png +:align: center +:alt: Picking order operation showing source location and destination location. +``` + +### Process a packing + +After validating the picking, the packing order is ready to process. Click back to the +{guilabel}`Inventory Overview`, and locate the {guilabel}`Pack` task card on the dashboard. + +Click the {guilabel}`# To Process` button (in this case, {guilabel}`1 To Process`). This reveals the +packing order generated from the previously confirmed sales order. + +Click on the packing order associated with the sales order, then click on {guilabel}`Validate` to +complete the packing. + +```{image} delivery_three_steps/delivery-three-steps-packing-order.png +:align: center +:alt: Packing order operation showing source location and destination location. +``` + +Once the packing order is validated, the product leaves the {guilabel}`WH/Packing Zone` location and +moves to the {guilabel}`WH/Output` location. Then, the status of the document will change to +{guilabel}`Done`. + +### Process a delivery + +Once the packing order has been validated, the delivery order is ready to process. Navigate back to +the original sales order to process the delivery by going to {menuselection}`Sales app`, and +selecting the sales order created previously. + +:::{tip} +Delivery orders can *also* be accessed by going to {menuselection}`Inventory app --> Operations +--> Deliveries`. +::: + +The {guilabel}`Delivery` smart button now indicates there are 3 transfers, instead of one. Clicking +the {guilabel}`Delivery` smart button shows the three operations for this sales order: the picking, +the packing, and the delivery. + +Click the delivery (WH/OUT) transfer to open the delivery order. Then, click {guilabel}`Validate`. + +```{image} delivery_three_steps/delivery-three-steps-delivery-order.png +:align: center +:alt: |- +: Click Validate on the delivery order to transfer the product from the output location to +: the customer location. +``` + +Once the delivery order is validated, the product leaves the {guilabel}`WH/Output` location and +moves to the {guilabel}`Partners/Customers` location. Then, the status of the document will change +to {guilabel}`Done`. + diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/dropshipping.md b/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/dropshipping.md new file mode 100644 index 000000000..7be778e7e --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/dropshipping.md @@ -0,0 +1,92 @@ +--- +substitutions: + RfQ: '{abbr}`RfQ (request for quotation)`' +--- + +# Dropshipping + +Dropshipping is an order fulfillment strategy that allows sellers to have items shipped directly +from suppliers to customers. Normally, a seller purchases a product from a supplier, stores it in +their inventory, and ships it to the end customer once an order is placed. With dropshipping, the +supplier is responsible for storing and shipping the item. This benefits the seller by reducing +inventory costs, including the price of operating warehouses. + +## Configure products to be dropshipped + +To use dropshipping as a fulfillment strategy, navigate to the {menuselection}`Purchase` app and +select {menuselection}`Configuration --> Settings`. Under the {guilabel}`Logistics` heading, click +the {guilabel}`Dropshipping` checkbox, and {guilabel}`Save` to finish. + +Next, go to the {menuselection}`Sales` app, click {menuselection}`Products --> Products` and choose +an existing product or select {guilabel}`Create` to configure a new one. On the {guilabel}`Product` +page, make sure that the {guilabel}`Can be Sold` and {guilabel}`Can be Purchased` checkboxes are +enabled. + +```{image} dropshipping/sold-purchased-checkboxes.png +:align: center +:alt: Enable the "Can be Sold" and "Can be Purchased" checkboxes on the product form. +``` + +Click on the {guilabel}`Purchase` tab and specify a vendor and the price that they sell the product +for. Multiple vendors can be added, but the vendor at the top of the list will be the one +automatically selected for purchase orders. + +```{image} dropshipping/product-vendor-config.png +:align: center +:alt: The product form with a vendor specified. +``` + +Finally, select the {guilabel}`Inventory` tab and enable the {guilabel}`Dropship` checkbox in the +{guilabel}`Routes` section. + +```{image} dropshipping/enable-dropship-route.png +:align: center +:alt: Enable the Dropship option in the product inventory tab. +``` + +:::{note} +While it is not necessary to enable the {guilabel}`Buy` route in addition to the +{guilabel}`Dropship` route, enabling both provides the option of dropshipping the product or +purchasing it directly. +::: + +## Fulfill orders using dropshipping + +When a sales order is created for a dropshipped product, an associated request for quotation (RfQ) +is automatically generated to purchase the product from the vendor. Sales orders can be viewed in +the {menuselection}`Sales` app by selecting {menuselection}`Orders --> Orders`. Click the +{guilabel}`Purchase` smart button at the top right of a sales order to view the associated +{abbr}`RFQ (Request for Quotation)`. + +```{image} dropshipping/dropship-sales-order.png +:align: center +:alt: A dropship sales order with the Purchase smart button in the top right corner. +``` + +Once the {abbr}`RFQ (Request for Quotation)` is confirmed, it becomes a purchase order, and a +dropship receipt is created and linked to it. The receipt can be viewed by clicking the +{guilabel}`Dropship` smart button in the top-right corner of the purchase order form. + +```{image} dropshipping/dropship-purchase-order.png +:align: center +:alt: A dropship purchase order with the Receipt smart button in the top right corner. +``` + +The dropship receipt displays {guilabel}`Partners/Vendors` in the {guilabel}`Source Location` field, +and {guilabel}`Partners/Customers` in the {guilabel}`Destination Location` field. Upon delivery of +the product to the customer, click on the {guilabel}`Validate` button at the top-left of the +dropship receipt to confirm the delivered quantity. + +```{image} dropshipping/validate-dropship-receipt.png +:align: center +:alt: Validate the dropship receipt after delivery. +``` + +To view all dropship orders, simply navigate to the {menuselection}`Inventory` {guilabel}`Overview` +dashboard and click the teal {guilabel}`# TO PROCESS` button on the {guilabel}`Dropship` card. + +```{image} dropshipping/view-all-dropship-orders.png +:align: center +:alt: Click the green button on the Dropship card to view all dropship orders. +``` + diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/owned_stock.md b/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/owned_stock.md new file mode 100644 index 000000000..3edce1679 --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/owned_stock.md @@ -0,0 +1,128 @@ +# Consignment: buy and sell stock without owning it + +Most of the time, products stored in a company's warehouse are either purchased from suppliers, or +are manufactured in-house. However, suppliers will sometimes let companies store and sell products +in the company's warehouse, without having to buy those items up-front. This is called +*consignment*. + +Consignment is a useful method for suppliers to launch new products, and easily deliver to their +customers. It's also a great way for the company storing the products (the consignee) to earn +something back for their efforts. Consignees can even charge a fee for the convenience of storing +products they don't actually own. + +## Enable the consignment setting + +To receive, store, and sell consignment stock, the feature needs to be enabled in the settings. To +do this, go to {menuselection}`Inventory --> Configuration --> Settings`, and under the +{guilabel}`Traceability` section, check the box next to {guilabel}`Consignment`, and then click +{guilabel}`Save` to finish. + +```{image} owned_stock/owned-stock-enable-consignment.png +:align: center +:alt: Enabled Consignment setting in Inventory configuration. +``` + +## Receive (and store) consignment stock + +With the feature enabled in Odoo, consignment stock can now be received into a warehouse. From the +main {menuselection}`Inventory` dashboard, click into the {guilabel}`Receipts` section. Then, click +{guilabel}`Create`. + +:::{note} +Consignment stock is not actually purchased from the vendor; it is simply received and stored. +Because of this, there are no quotations or purchase orders involved in receiving consignment +stock. So, *every* receipt of consignment stock will start by creating manual receipts. +::: + +Choose a vendor to enter in the {guilabel}`Receive From` field, and then choose the same vendor to +enter in the {guilabel}`Assign Owner` field. + +:::{important} +Since the products received from the vendor will be owned by the same vendor, the +{guilabel}`Receive From` and {guilabel}`Assign Owner` fields must match. +::: + +Once the vendor-related fields are set, enter products into the {guilabel}`Product` lines, and set +the quantities to be received into the warehouse under the {guilabel}`Done` column. If the +{guilabel}`Units of Measure` feature is enabled, the {abbr}`UoM (Units of Measure)` can be changed, +as well. Once all the consignment stock has been received, {guilabel}`Validate` the receipt. + +```{image} owned_stock/owned-stock-receipt-fields.png +:align: center +:alt: Matching vendor fields in consignment Receipt creation. +``` + +## Sell and deliver consignment stock + +Once consignment stock has been received into the warehouse, it can be sold the same as any other +in-stock product that has the {guilabel}`Can Be Sold` option enabled on the product form. + +To create a sales order, navigate to the {menuselection}`Sales` app, and from the +{guilabel}`Quotations` overview, click {guilabel}`Create`. Next, choose a customer to enter into the +{guilabel}`Customer` field. + +:::{note} +The {guilabel}`Customer` *must* be different from the {guilabel}`Vendor` that supplied the +consignment stock received (and stored) in the warehouse. +::: + +Add the consignment product under the {guilabel}`Product` column in the order lines, set the +{guilabel}`Quantity`, and fill out any other pertinent product details on the form. Once the +quotation is complete, click {guilabel}`Confirm`. + +```{image} owned_stock/owned-stock-sales-order.png +:align: center +:alt: Sales order of consignment stock. +``` + +Once the quotation has been confirmed, it becomes a sales order. From here, the products can be +delivered by clicking on the {guilabel}`Delivery` smart button, and selecting {guilabel}`Validate` +to validate the delivery. + +## Traceability and reporting of consignment stock + +Although consignment stock is owned by the vendor who supplied it, and not by the company storing it +in their warehouse, consignment products will *still* appear in certain inventory reports. + +To find inventory reports, go to {menuselection}`Inventory --> Reporting`, and choose a report to +view. + +:::{note} +Since the consignee does not actually own consignment stock, these products are *not* reflected +in the {guilabel}`Stock Valuation` report, and have no impact on the consignee's inventory +valuation. +::: + +### Product moves report + +To view all information about on-hand stock moves, navigate to the {guilabel}`Product Moves` +dashboard by going to {menuselection}`Inventory --> Reporting --> Product Moves`. For consignment +products, the information in this report is the same as any other product: the history of its +product moves can be reviewed; the {guilabel}`Quantity Done` and {guilabel}`Reference` document are +available; and its {guilabel}`Locations` are available, as well. The consignment stock will +originate from {guilabel}`Partner Location/Vendors`. + +:::{tip} +To view a consignment product's moves by ownership, select the {guilabel}`Group By` filter, +choose the {guilabel}`Add Custom Group` parameter, and then select {guilabel}`From Owner`, and +{guilabel}`Apply` to finish. +::: + +```{image} owned_stock/owned-stock-moves-history.png +:align: center +:alt: Consignment stock moves history. +``` + +:::{tip} +To see forecasted units of consignment stock, go to {menuselection}`Inventory --> Reporting --> +Forecasted Inventory`. +::: + +### Stock on hand report + +View the {guilabel}`Stock On Hand` dashboard by navigating to {menuselection}`Inventory --> +Reporting --> Inventory Report`. From this report, the {guilabel}`Locations` of all stock on-hand +are displayed, in addition to the quantities per location. For consignment products, the +{guilabel}`Owner` column will be populated with the owner of those products, or the original vendor +who supplied the products in the first place. + diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/putaway.md b/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/putaway.md new file mode 100644 index 000000000..97737a970 --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/putaway.md @@ -0,0 +1,97 @@ +# Putaway rules + +Putaway is the process of routing products to appropriate storage locations upon shipment arrival. + +Odoo can accomplish this seamlessly using *putaway rules*, which dictate how products move through +specified warehouse locations. + +Upon shipment arrival, operations are generated based on putaway rules to efficiently move products +to specified locations, and ensure easy retrieval for future delivery orders. + +In warehouses that process specific kinds of products, putaway rules can also prevent volatile +substances from being stored in close proximity, by directing them to different locations determined +by the warehouse manager. + +:::{seealso} +[Odoo Tutorials: Putaway Rules](https://www.youtube.com/watch?v=nCQMf6sj_w8) +::: + +## Configuration + +To use putaway rules, navigate to {menuselection}`Inventory app --> Configuration --> Settings`, and +activate the {guilabel}`Multi-Step Routes` feature under the {guilabel}`Warehouse` section. By doing +so, the {guilabel}`Storage Locations` feature is also automatically activated. + +Finally, click {guilabel}`Save`. + +```{image} putaway/activate-multi-step-routes.png +:align: center +:alt: Activate Multi-Step Routes in Inventory configuration settings. +``` + +(inventory-routes-putaway-rule)= + +### Define putaway rule + +To manage where specific products are routed for storage, navigate to {menuselection}`Inventory app +--> Configuration --> Putaway Rules`. Use the {guilabel}`Create` button to configure a new putaway +rule on a {guilabel}`Product` or {guilabel}`Product Category` that the rule affects. + +:::{important} +Putaway rules can be defined either per product/product category, and/or package type (the +*Packages* setting must be enabled in {menuselection}`Inventory app --> Configuration --> +Settings` for that). +::: + +In the same line, the {guilabel}`When product arrives in` location is where the putaway rule is +triggered to create an operation to move the product to the {guilabel}`Store to` location. + +For this to work, the {guilabel}`Store to` location must be a *sub-location* of the first (e.g., +`WH/Stock/Fruits` is a specific, named location inside `WH/Stock` to make the products stored here +easier to find). + +```{eval-rst} +.. example:: + In a warehouse location, **WH/Stock**, there are the following sub-locations: + + - WH/Stock/Fruits + - WH/Stock/Vegetables + + Ensure all apples are stored in the fruits section by filling the field :guilabel:`Store to` with + the location `WH/Stock/Fruits` when the :guilabel:`Product`, `Apple` arrives in `WH/Stock`. + + Repeat this for all products and hit :guilabel:`Save`. + + .. image:: putaway/create-putaway-rules.png + :align: center + :alt: Create putaway rules for apples and carrots. +``` + +### Putaway rule priority + +Odoo selects a putaway rule based on the following priority list (from highest to lowest) until a +match is found: + +1. Package type and product +2. Package type and product category +3. Package type +4. Product +5. Product category + +```{eval-rst} +.. example:: + The product `Lemonade can` has the following putaway rules configured: + + #. When receiving a `Pallet` (:guilabel:`Package Type`) of `Lemonade cans`, it is redirected to + `WH/Stock/Pallets/PAL1`. + #. `Lemonade can`'s :guilabel:`Product Category` is `All/drinks`, and when receiving a `Box` of + any item in this product category, items are redirected to `WH/Stock/Shelf 1`. + #. Any product on a `Pallet` is redirected to `WH/Stock/Pallets` + #. The product `Lemonade can` is redirected to `WH/Stock/Shelf 2` + #. Items in the `All/drinks` product category are redirected to `WH/Stock/Small Refrigerator`. + + .. image:: putaway/putaway-example.png + :align: center + :alt: Some examples of putaway rules. +``` + diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_one_step.md b/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_one_step.md new file mode 100644 index 000000000..cdb5fbbd6 --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_one_step.md @@ -0,0 +1,152 @@ +--- +substitutions: + PO: '{abbr}`PO (Purchase Order)`' + RfQ: '{abbr}`RfQ (Request for Quotation)`' + SO: '{abbr}`SO (Sales Order)`' +--- + +# One-step receipt and delivery + +In Odoo *Inventory*, both incoming and outgoing shipments are configured to process in one step, by +default. This means purchases will be received directly into stock, and deliveries will be moved +directly from stock to customers. + +:::{tip} +Incoming and outgoing shipments do **not** need to be configured with the same amount of steps. + +For example, a warehouse's settings can be configured so products can be received directly in one +step, and delivered in three steps (pick + pack + ship). +::: + +## Configuration + +To configure one-step receipts and deliveries for a warehouse, navigate to {menuselection}`Inventory +app --> Configuration --> Warehouses`, and select a warehouse to edit. + +Under the {guilabel}`Warehouse Configuration` tab, set {guilabel}`Incoming Shipments` to +{guilabel}`Receive goods directly (1 step)`, and set {guilabel}`Outgoing Shipments` to +{guilabel}`Deliver goods directly (1 step)`. + +```{image} receipts_delivery_one_step/receipts-delivery-one-step-warehouse-settings.png +:align: center +:alt: Incoming and outgoing shipments set to one-step on warehouse form. +``` + +:::{note} +Since one-step receipt and delivery is the default for incoming and outgoing shipments in Odoo, +the *Multi-Step Routes* feature is *not* required. + +However, for the {guilabel}`Shipments` settings to appear on a warehouse form, the feature +**must** be enabled. + +To enable *Multi-Step Routes*, navigate to {menuselection}`Inventory app --> Configuration --> +Settings`. Under the {guilabel}`Warehouse` section, tick the checkbox next to +{guilabel}`Multi-Step Routes`, and click {guilabel}`Save`. Doing so also activates the +{guilabel}`Storage Locations` feature. +::: + +(inventory-receipts-delivery-one-step-wh)= + +## Receive goods directly (1 step) + +When products are received in one step, they will move from the vendor location to warehouse stock +in the database immediately upon validation of a purchase order (PO). + +### Create purchase order + +To create a {{ PO }}, navigate to the {menuselection}`Purchase app`, and click {guilabel}`New`. This +opens a blank {guilabel}`Request for Quotation` (RfQ) form. + +Add a vendor in the {guilabel}`Supplier` field. Then, fill out the various fields on the {{ RfQ }}, as +necessary. + +```{image} receipts_delivery_one_step/receipts-delivery-one-step-new-rfq.png +:align: center +:alt: Filled out new request for quotation form. +``` + +Under the {guilabel}`Products` tab, click {guilabel}`Add a product`, and select a product to add to +the {{ RfQ }}. + +Once ready, click {guilabel}`Confirm Order`. This moves the {{ RfQ }} to the {guilabel}`Purchase Order` +stage. + +Once the {{ PO }} is confirmed, a {guilabel}`Receipt` smart button appears at the top of the form. +Clicking the smart button opens the warehouse receipt (WH/IN) form. + +```{image} receipts_delivery_one_step/receipts-delivery-one-step-receipt-smart-button.png +:align: center +:alt: Receipt smart button on confirmed purchase order form. +``` + +### Process receipt + +From the warehouse receipt form, the products ordered can be received into the warehouse. To receive +the products, click {guilabel}`Validate`. Once validated, the receipt moves to the {guilabel}`Done` +stage. + +```{image} receipts_delivery_one_step/receipts-delivery-one-step-done-receipt.png +:align: center +:alt: Validated warehouse receipt in Done stage. +``` + +Click back to the {{ PO }} (via the breadcrumbs, at the top of the form) to view the {{ PO }} form. On the +product line, the quantity in the {guilabel}`Received` column now matches the ordered +{guilabel}`Quantity`. + +(inventory-delivery-one-step)= + +## Deliver goods directly (1 step) + +When products are delivered in one step, they will move from warehouse stock to the customer +location in the database immediately upon validation of a sales order (SO). + +### Create sales order + +To create a {{ SO }}, navigate to the {menuselection}`Sales app`, and click {guilabel}`New`. This +opens a blank sales quotation form. + +Add a customer in the {guilabel}`Customer` field. Then, fill out the various fields on the sales +quotation form, as necessary. + +```{image} receipts_delivery_one_step/receipts-delivery-one-step-new-sales-order.png +:align: center +:alt: Filled out new sales quotation form. +``` + +Under the {guilabel}`Product` tab, click {guilabel}`Add a product`, and select a product to add to +the sales order quotation. + +Once ready, click {guilabel}`Confirm`. This moves the quotation to the {guilabel}`Sales Order` +stage. + +Once the {{ SO }} is confirmed, a {guilabel}`Delivery` smart button appears at the top of the form. +Clicking the smart button opens the warehouse delivery (WH/OUT) form. + +```{image} receipts_delivery_one_step/receipts-delivery-one-step-delivery-button.png +:align: center +:alt: Delivery smart button on confirmed sales order form. +``` + +### Process delivery + +From the warehouse delivery form, the products ordered by the customer can be delivered from the +warehouse. To deliver the products, change the value in the {guilabel}`Quantity` field to match the +ordered quantity in the {guilabel}`Demand` field. + +Once ready, click {guilabel}`Validate`. Once validated, the delivery order moves to the +{guilabel}`Done` stage. + +```{image} receipts_delivery_one_step/receipts-delivery-one-step-done-delivery.png +:align: center +:alt: Validated delivery order in Done stage. +``` + +Click back to the {{ SO }} (via the breadcrumbs, at the top of the form) to view the {{ SO }} form. On the +product line, the quantity in the {guilabel}`Delivered` column now matches the ordered +{guilabel}`Quantity`. + +:::{seealso} +{doc}`../daily_operations` +::: + diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_two_steps.md b/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_two_steps.md new file mode 100644 index 000000000..cfd9bd549 --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_delivery_two_steps.md @@ -0,0 +1,236 @@ +--- +substitutions: + DO: '{abbr}`DO (Delivery Order)`' + PO: '{abbr}`PO (Purchase Order)`' + RfQ: '{abbr}`RfQ (Request for Quotation)`' + SO: '{abbr}`SO (Sales Order)`' +--- + +# Two-step receipt and delivery + +Depending on a company's needs, receiving and shipping products in and out of the warehouse might +require multi-step operations. In Odoo *Inventory*, this can be done using *Multi-Step Routes*. + +In the two-step receipt process, products are received in an input area, then transferred to stock. +This kind of process for incoming shipments might be beneficial for warehouses with specific storage +locations, such as freezers and refrigerators, secured locked areas, or special aisles and shelves. + +Products can be sorted according to where they are going to be stored, and employees can stock all +the products going to a specific location. The products are *not* available for further processing, +until they are transferred into stock. + +In the two-step delivery process, products are first picked from their respective location in the +warehouse, then transferred to an output location before being shipped to the customer. + +This might be beneficial for companies using a First In, First Out (FIFO), Last In, First Out +(LIFO), or First Expired, First Out (FEFO) removal strategy. + +:::{tip} +Incoming and outgoing shipments do **not** need to be configured with the same amount of steps. + +For example, a warehouse's settings can be configured so products can be received in two steps +(input + stock), and delivered in three steps (pick + pack + ship). +::: + +## Configuration + +In Odoo *Inventory*, both incoming and outgoing shipments are configured to process in one step, by +default. To change these settings, the *Multi-Step Routes* feature must be enabled. + +To enable *Multi-Step Routes*, navigate to {menuselection}`Inventory app --> Configuration --> +Settings`. Under the {guilabel}`Warehouse` section, tick the checkbox next to {guilabel}`Multi-Step +Routes`, and click {guilabel}`Save`. Doing so also activates the {guilabel}`Storage Locations` +feature. + +```{image} receipts_delivery_two_steps/receipts-delivery-two-steps-settings.png +:align: center +:alt: Enabled Multi-Step Routes feature in Inventory app settings. +``` + +Next, configure a warehouse for two-step receipts and deliveries. Navigate to +{menuselection}`Inventory app --> Configuration --> Warehouses`, and select a warehouse to edit. + +Under the {guilabel}`Warehouse Configuration` tab, set {guilabel}`Incoming Shipments` to +{guilabel}`Receive goods in input and then stock (2 steps)`, and set {guilabel}`Outgoing Shipments` +to {guilabel}`Send goods in output and then deliver (2 steps)`. + +```{image} receipts_delivery_two_steps/receipts-delivery-two-steps-shipments.png +:align: center +:alt: Incoming and outgoing shipments set to two-step on warehouse form. +``` + +:::{note} +Selecting two-step receipts and deliveries automatically creates new *Input* and *Output* +warehouse locations in the database, named `WH/Input` and `WH/Output`, respectively. + +To rename or edit these locations, navigate to {menuselection}`Inventory app --> Configuration +--> Locations`, and select the desired location. + +On the location's form, change the {guilabel}`Location Name`, and make any other necessary +changes. +::: + +## Process receipt in two steps (input + stock) + +When products are received in two steps, they first move from the vendor location to an input +location. Then, they move from the input location to warehouse stock in the database, upon +validation of a purchase order (PO), and a subsequent internal transfer. + +### Create purchase order + +To create a {{ PO }}, navigate to the {menuselection}`Purchase app`, and click {guilabel}`New`. This +opens a blank {guilabel}`Request for Quotation` (RfQ) form. + +Add a vendor in the {guilabel}`Vendor` field. Then, fill out the various fields on the {{ RfQ }}, as +necessary. + +```{image} receipts_delivery_two_steps/receipts-delivery-two-steps-new-rfq.png +:align: center +:alt: Filled out new Request for Quotation from vendor. +``` + +Under the {guilabel}`Products` tab, click {guilabel}`Add a product`, and select a product to add to +the {{ RfQ }}. + +Once ready, click {guilabel}`Confirm Order`. This moves the {{ RfQ }} to the {guilabel}`Purchase Order` +stage. + +Once the {{ PO }} is confirmed, a {guilabel}`Receipt` smart button appears at the top of the form. +Clicking the smart button opens the warehouse receipt (WH/IN) form. + +```{image} receipts_delivery_two_steps/receipts-delivery-two-steps-smart-button.png +:align: center +:alt: Delivery smart button for validated purchase order. +``` + +:::{tip} +For businesses with multiple warehouses that have different step configurations, the +{guilabel}`Deliver To` field on the {{ PO }} form **must** be specified as the correct *input +location* connected to the two-step warehouse. + +This can be done by selecting the warehouse from the drop-down menu that includes the `Receipts` +label at the end of the name. +::: + +### Process receipt + +From the warehouse receipt form, the products ordered can be received into the warehouse. To receive +the products, click {guilabel}`Validate`. Once validated, the receipt moves to the {guilabel}`Done` +stage, and the products move to the {guilabel}`WH/Input` location. + +```{image} receipts_delivery_two_steps/receipts-delivery-two-steps-receipt-form.png +:align: center +:alt: Receipt form for products ordered from vendor. +``` + +Click back to the {{ PO }} (via the breadcrumbs, at the top of the form) to view the {{ PO }} form. On the +product line, the quantity in the {guilabel}`Received` column now matches the ordered +{guilabel}`Quantity`. + +### Process internal transfer + +Once the receipt is validated, an internal transfer is created and ready to process. + +To view the internal transfer, navigate to the {menuselection}`Inventory app`, and locate the +{guilabel}`Internal Transfers` task card. + +Click the {guilabel}`# To Process` button on the task card to reveal a list of all internal +transfers to process, and select the transfer associated with the previously validated receipt. + +Once ready, click {guilabel}`Validate` to complete the transfer, and move the product from +{guilabel}`WH/Input` to {guilabel}`WH/Stock`. + +Once the transfer is validated, the products enter inventory, and are available for customer +deliveries or manufacturing orders. + +```{image} receipts_delivery_two_steps/receipts-delivery-two-steps-internal-transfer.png +:align: center +:alt: Internal transfer form for products ordered from vendor. +``` + +(inventory-shipping-receiving-two-step-delivery)= + +## Process delivery order in two steps (pick + ship) + +When products are delivered in two steps, they move from warehouse stock to an output location. +Then, they move from the output location to a customer location in the database, upon validation of +a picking order, and a subsequent delivery order (DO). + +### Create sales order + +To create a {{ SO }}, navigate to the {menuselection}`Sales app`, and click {guilabel}`New`. This +opens a blank sales quotation form. + +Add a customer in the {guilabel}`Customer` field. Then, fill out the various fields on the sales +quotation form, as necessary. + +```{image} receipts_delivery_two_steps/receipts-delivery-two-steps-new-sales-order.png +:align: center +:alt: Filled out new sales order form. +``` + +Under the {guilabel}`Order Lines` tab, click {guilabel}`Add a product`, and select a product to add +to the sales order quotation. + +Once ready, click {guilabel}`Confirm`. This moves the quotation to the {guilabel}`Sales Order` +stage. + +Once the {{ SO }} is confirmed, a {guilabel}`Delivery` smart button appears at the top of the form. +Clicking the smart button opens the warehouse delivery (WH/OUT) form. + +```{image} receipts_delivery_two_steps/receipts-delivery-two-steps-delivery-button.png +:align: center +:alt: Delivery smart button on validated sales order form. +``` + +### Process picking + +Once the sales order is confirmed, a picking order is generated and ready to process. + +To complete the picking, navigate to the {guilabel}`Inventory app`, and locate the {guilabel}`Pick` +task card on the {guilabel}`Inventory Overview` dashboard. Alternatively, the picking order can also +be accessed via the {guilabel}`Delivery` smart button at the top of the sales order form. + +From the {guilabel}`Inventory Overview` page, click the {guilabel}`# To Process` button on the +{guilabel}`Pick` task card. This reveals a list of all pickings to process. + +Click on the picking (WH/PICK) operation associated with the sales order to reveal the picking +order. + +```{image} receipts_delivery_two_steps/receipts-delivery-two-steps-picking-form.png +:align: center +:alt: Picking order form for products included in sales order. +``` + +Manually set the quantity by changing the value in the {guilabel}`Quantity` column, to match the +value in the {guilabel}`Demand` column. + +Once ready, click {guilabel}`Validate` to complete the picking, and move the product from +{guilabel}`WH/Stock` to {guilabel}`WH/Output.` + +### Process delivery + +Once the picking is validated, a delivery order is created, and ready to process. Clicking the +{guilabel}`Delivery` smart button on the sales order form reveals the newly created delivery order. + +Alternatively, to view the delivery order, navigate back to the {guilabel}`Inventory Overview` page, +via the breadcrumbs, and locate the {guilabel}`Delivery Orders` task card. + +Click the {guilabel}`# To Process` button on the task card to reveal a list of all delivery orders +to process, and select the order associated with the previously validated picking. + +```{image} receipts_delivery_two_steps/receipts-delivery-two-steps-delivery-order.png +:align: center +:alt: Delivery order form for products ordered by customer. +``` + +To deliver the products, change the value in the {guilabel}`Quantity` field to match the ordered +quantity in the {guilabel}`Demand` field. + +Once ready, click {guilabel}`Validate`. Once validated, the delivery order moves to the +{guilabel}`Done` stage. + +:::{seealso} +{doc}`../daily_operations` +::: + diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_three_steps.md b/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_three_steps.md new file mode 100644 index 000000000..dae8f2ed5 --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/receipts_three_steps.md @@ -0,0 +1,112 @@ +# Three-step receipt + +Some companies require a quality control process before receiving goods from suppliers. To +accomplish this, Odoo has a three-step process for receiving goods. + +In the three-step receipt process, products are received in an input area, then transferred to a +quality area for inspection. Products that pass the quality inspection are then transferred into +stock. The products are not available for further processing until they are transferred out of the +quality area and into stock. + +## Configuration + +Odoo is configured by default to {doc}`receive and deliver goods in one step +`, so the settings need to be changed in order to utilize three-step +receipts. First, make sure the *Multi-Step Routes* option is enabled in {menuselection}`Inventory +--> Configuration --> Settings --> Warehouse`. Note that activating {guilabel}`Multi-Step Routes` +will also activate *Storage Locations*. + +```{image} receipts_three_steps/receipts-three-steps-multi-step-routes.png +:align: center +:alt: Activate multi-step routes and storage locations in Inventory settings. +``` + +Next, the warehouse needs to be configured for three-step receipts. To do that, go to +{menuselection}`Inventory app --> Configuration --> Warehouses`, and select the desired warehouse to +be edited. Doing so reveals the detail form for that specific warehouse. + +On that {guilabel}`Warehouse` detail form page, select {guilabel}`Receive goods in input, then +quality and then stock (3 steps)` for {guilabel}`Incoming Shipments`. + +```{image} receipts_three_steps/receipts-three-steps-incoming-shipments.png +:align: center +:alt: Set incoming shipment option to receive in three steps. +``` + +Activating three-step receipts and deliveries creates two new internal locations: *Input* +(WH/Input), and *Quality Control* (WH/Quality Control). To rename these locations, go to +{menuselection}`Inventory app --> Configuration --> Locations`, then click on the desired location +to change (or update) the name. + +## Receive in three steps (input + quality + stock) + +### Create a purchase order + +To create a new {abbr}`RfQ (Request for Quotation)`, navigate to {menuselection}`Purchase app --> +New`, which reveals a blank {abbr}`RfQ (Request for Quotation)` form page. On this page, select a +{guilabel}`Vendor`, add a storable {guilabel}`Product`, and click {guilabel}`Confirm Order`. + +A {guilabel}`Receipt` smart button will appear in the top right, and the receipt will be associated +with the purchase order. Clicking on the {guilabel}`Receipt` smart button will show the receipt +order. + +```{image} receipts_three_steps/receipts-three-steps-smart-button.png +:align: center +:alt: After confirming a purchase order, a Receipt smart button will appear. +``` + +### Process a receipt + +Once the purchase order (PO) is confirmed, a receipt (`WH/IN`) operation is generated and ready to +process. + +The receipt can be confirmed from the original purchase order form, or it can be accessed by +navigating to the {menuselection}`Inventory app`, and locating the {guilabel}`Receipts` task card. + +Click the {guilabel}`# To Process` button to reveal all incoming receipts to process. Click the +receipt associated with the previous purchase order. + +Click {guilabel}`Validate` to validate the receipt, and move the product to the destination +location, {guilabel}`WH/Input`. + +```{image} receipts_three_steps/receipts-three-steps-receipt-form.png +:align: center +:alt: Receipt operation for product being moved to WH/Input location. +``` + +### Process a transfer to Quality Control + +Once the receipt has been validated, an internal transfer operation to move the product to quality +control is ready to process. + +Click {guilabel}`Inventory Overview` in the breadcrumbs to navigate back to the dashboard, and +locate the {guilabel}`Internal Transfers` task card. + +Select the {guilabel}`# To Process` button to reveal all internal transfers to process. Then, choose +the internal transfer associated with the validated receipt. + +Once ready, click {guilabel}`Validate` to complete the transfer, and move the product from +{guilabel}`WH/Input` to {guilabel}`WH/Quality Control`. + +```{image} receipts_three_steps/receipts-three-steps-internal-transfer.png +:align: center +:alt: Internal transfer for product being moved to quality control zone. +``` + +## Process a transfer to stock + +Once the internal transfer to move the product to quality control has been validated, another +internal transfer operation to move the product into warehouse stock is ready to process. + +Click {guilabel}`YourCompany: Internal Transfers` in the breadcrumbs to reveal the list of all +internal transfers to process. Then, select the new internal transfer to move the product from +`WH/Quality Control` to `WH/Stock`. + +Once ready, click {guilabel}`Validate` to complete the transfer, and move the product from +{guilabel}`WH/Quality Control` to {guilabel}`WH/Stock`. + +```{image} receipts_three_steps/receipts-three-steps-second-transfer.png +:align: center +:alt: Internal transfer for product being moved to warehouse stock. +``` + diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/stock_warehouses.md b/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/stock_warehouses.md new file mode 100644 index 000000000..3a935fa8b --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/stock_warehouses.md @@ -0,0 +1,252 @@ +# Sell stock from multiple warehouses using virtual locations + +While keeping stock and selling inventory from one warehouse might work for smaller companies, +bigger companies might need to keep stock in, or sell from, multiple warehouses in multiple +locations. + +Sometimes products included in a single sales order might take stock from two (or more) warehouses; +in Odoo, pulling products from multiple warehouses to satisfy sales demands can be done using +*virtual locations*. + +:::{important} +The solution in this document, describing the use of a virtual warehouse to fulfill orders for +multiple warehouses, has some limitations. Consider the following before proceeding: + +1. When the {guilabel}`Warehouse` field is set to a virtual warehouse on a sales order, the + virtual warehouse's address is indicated on the picking, packing, and delivery forms, **not** + the actual warehouse's address. +2. Each location has a `warehouse_id` (hidden field). This means that the stock in the virtual + warehouse will **not** be the sum of the stock of the real warehouses, but rather the sum of + the stock in the locations whose warehouse ID is the virtual warehouse. +::: + +:::{danger} +Potential limitation for those using {doc}`two +<../../shipping_receiving/daily_operations/receipts_delivery_two_steps>` or {doc}`three-step +delivery <../../shipping_receiving/daily_operations/delivery_three_steps>`: + +1. The output or packing zone on the various forms is incorrectly listed as the virtual + warehouse's address. +2. There is no workaround for two or three-step deliveries. +3. Proceed **only** if setting a virtual warehouse's address as the output or packing zone makes + sense for the company's workflow. +::: + +:::{note} +In order to create virtual locations in warehouses, and proceed to the following steps, the +{guilabel}`Storage Locations` and {guilabel}`Multi-Step Routes` features **must** be enabled. + +To do so, go to {menuselection}`Inventory app --> Configuration --> Settings`, scroll down to the +{guilabel}`Warehouse` section, and enable the {guilabel}`Storage Locations` and +{guilabel}`Multi-Step Routes` options. Then, {guilabel}`Save` the changes to finish. +::: + +(inventory-routes-virtual-wh)= + +## Create virtual parent location + +Before creating any virtual stock locations, create a new warehouse that acts as a *virtual* +warehouse — the *parent* location of other physical warehouses. + +```{eval-rst} +.. spoiler:: Why a "virtual" warehouse? + + Virtual warehouses are great for companies with multiple physical warehouses. This is because a + situation might arise when one warehouse runs out of stock of a particular product, but another + warehouse still has stock on-hand. In this case, stock from these two (or more) warehouses could + be used to fulfill a single sales order. + + The "virtual" warehouse acts as a single aggregator of all the inventory stored in a company's + physical warehouses, and is used (for traceability purposes) to create a hierarchy of locations + in Odoo. +``` + +To create a new warehouse, go to {menuselection}`Inventory app --> Configuration --> Warehouses`, +and click {guilabel}`Create`. From here, the warehouse {guilabel}`Name` and {guilabel}`Short Name` +can be changed, and other warehouse details can be changed under the {guilabel}`Warehouse +Configuration` tab. + +Lastly, click {guilabel}`Save` to finish creating a *regular* warehouse. Continue following the +steps below to finish configuring the virtual parent warehouse. + +```{image} stock_warehouses/stock-warehouses-create-warehouse.png +:align: center +:alt: New warehouse form. +``` + +:::{seealso} +- {doc}`Warehouse configurations <../../warehouses_storage/inventory_management/warehouses>` +- {ref}`Incoming and outgoing shipments ` +- {doc}`../../warehouses_storage/replenishment/resupply_warehouses` +::: + +(inventory-routes-child-wh)= + +## Create child warehouses + +Create at least two *child* warehouses to link to the virtual warehouse. + +:::{important} +In order to take stock from multiple warehouses to fulfill a sales order, there needs to be at +least **two** warehouses acting as child locations of the virtual parent location warehouse. +::: + +To do that, navigate to {menuselection}`Inventory app --> Configuration --> Warehouses`, click +{guilabel}`Create`, and follow the {ref}`preceding instructions ` to +configure the physical stock locations. + +```{eval-rst} +.. example:: + + | **Parent Warehouse** + | :guilabel:`Warehouse`: `Virtual Warehouse` + | :guilabel:`Location`: `VWH/Stock` + + | **Child Warehouses** + | :guilabel:`Warehouses`: `Warehouse A` and `Warehouse B` + | :guilabel:`Locations`: `WHA` and `WHB` + + .. image:: stock_warehouses/parent-location.png + :align: center + :alt: Graphic of child locations 'WHA' and 'WHB' tied to the parent location. +``` + +:::{important} +While the virtual stock location will be changed to 'View' later, the {guilabel}`Location Type` +**must** be {guilabel}`Internal Location` at this point to {ref}`link the child warehouses +` in the next section. +::: + +(inventory-routes-link-to-vwh)= + +## Link child warehouses to virtual stock + +To set physical warehouses as child locations of the virtual location configured in the +{ref}`previous step `, navigate to {menuselection}`Inventory app --> +Configuration --> Locations`. + +Remove any filters from the search bar. Then, click the physical warehouse {guilabel}`Location` that +was previously created to be a child location (e.g. `WHA`), and click {guilabel}`Edit`. + +Change the {guilabel}`Parent Location` field from {guilabel}`Physical Locations` to the virtual +warehouse's **stock location** (e.g. `VWH/Stock`) from the drop-down menu, and click +{guilabel}`Save`. + +:::{important} +To select the virtual warehouse's stock location in the {guilabel}`Parent Location` drop-down +menu, the parent warehouse stock location (e.g. `VWH/Stock`) **must** have its +{guilabel}`Location Type` set to {guilabel}`Internal Location`. +::: + +```{image} stock_warehouses/configure-physical-wh.png +:align: center +:alt: Set the child warehouse's *Parent Location* to the virtual warehouse. +``` + +Repeat the preceding steps to configure two or more child warehouses. + +Once complete, the virtual, parent warehouse (e.g. `VWH/Stock`) fulfills orders using stock from +child warehouses (e.g. `WHA` and `WHB`), if there is insufficient stock in any one location. + +## Set virtual stock location as 'view' + +Set the virtual stock location's {guilabel}`Location Type` to {guilabel}`View`, as it is a +non-existent location used to group various physical warehouses together. + +To do that, navigate to {menuselection}`Inventory app --> Configuration --> Locations`. + +Click the virtual warehouse's stock location (e.g. `VWH/Stock`) that was {ref}`previously created +`, from the {guilabel}`Locations` list. + +On the location form, under the {guilabel}`Additional Information` heading, set the +{guilabel}`Location Type` to {guilabel}`View`. {guilabel}`Save` the changes. + +```{image} stock_warehouses/set-location-type-view.png +:align: center +:alt: Warehouse location types in location creation screen. +``` + +:::{tip} +To view the total quantity across **all** linked child warehouses, go to the product form and +click the {guilabel}`On Hand` smart button. + +```{image} stock_warehouses/on-hand.png +:align: center +:alt: Display stock across all linked warehouses. +``` +::: + +## Example: sell products from a virtual warehouse + +To sell products from multiple warehouses using a virtual parent location, the database must have at +least **two** warehouses configured — with at least **one** product, with quantity on-hand in each +warehouse, respectively. + +```{eval-rst} +.. example:: + The following product, `Toy soldier`, is available at each location with the quantities: + + - `WHA/Stock` : 1 + - `WHB/Stock` : 2 + - Warehouses `WHA` and `WHB` are child warehouses of the virtual warehouse `VWH`. +``` + +Create a quotation for the product by navigating to the {menuselection}`Sales` app and clicking +{guilabel}`Create`. On the quote, add a {guilabel}`Customer`, and click {guilabel}`Add a product` to +add the two products stored in the two warehouses. + +Then, click the {guilabel}`Other Info` tab on the sales order form. Under the {guilabel}`Delivery` +section, change the {guilabel}`Warehouse` field value to the virtual warehouse that was +{ref}`previously created `. Next, {guilabel}`Confirm` the sales order. + +```{image} stock_warehouses/set-virtual-wh.png +:align: center +:alt: Set virtual warehouse as the *Warehouse* field in sales order's *Other Info* +: tab. +``` + +Then, click the {guilabel}`Delivery` smart button. From the warehouse delivery form, confirm that +the {guilabel}`Source Location` value matches the {guilabel}`Warehouse` field value from the sales +order. Both should list the virtual warehouse location. + +Finally, on the warehouse delivery form, under the {guilabel}`Detailed Operations` tab, confirm that +the {guilabel}`Locations` in the {guilabel}`From` column for each product match the child locations +that are tied to the virtual parent location. + +```{image} stock_warehouses/delivery-order.png +:align: center +:alt: Delivery order with matching source and child locations. +``` + +:::{important} +> The {guilabel}`Source Location` on the warehouse delivery form, and the {guilabel}`Warehouse` +> under the {guilabel}`Other Info` tab on the sales order, **must** match for products in the sales +> order to be pulled from different warehouses. + +- If the virtual warehouse is not in the {guilabel}`Source Location` field on the warehouse + delivery form, retry product reservation by: + + - Running the scheduler: turn on {ref}`developer mode `, and then go to + {menuselection}`Inventory app --> Operations --> Run Scheduler`. + - Clicking {guilabel}`Check Availability` on the delivery order. + +- If the virtual warehouse is **not** assigned to the {guilabel}`Warehouse` field on the sales + order, then cancel it, and create a new sales order with the virtual warehouse set in the + {guilabel}`Warehouse` field. + +- If the {guilabel}`Warehouse` field is missing on the sales order form, then the multiple child + warehouses may not have been set up correctly. Review the {ref}`previous section + ` to ensure the correct settings. +::: + +:::{tip} +To use a virtual *parent* location as the default warehouse for sales orders, each salesperson +should have the virtual warehouse assigned to them from the drop-down menu next to +{guilabel}`Default Warehouse` on their employee form. + +```{image} stock_warehouses/stock-warehouses-employee-form.png +:align: center +:alt: Default warehouse location on employee form. +``` +::: + diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/storage_category.md b/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/storage_category.md new file mode 100644 index 000000000..3bc439275 --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/storage_category.md @@ -0,0 +1,182 @@ +# Storage categories + +A *storage category* is used with {doc}`putaway rules `, as an extra location attribute to +automatically propose optimal storage locations for products. + +Follow these steps to complete the setup: + +1. {ref}`Enable the Storage Category feature ` +2. {ref}`Define a storage category ` with specific limitations +3. Assign a {ref}`category to storage locations ` +4. Add the storage category as an attribute to a {ref}`putaway rule + ` + +:::{seealso} +{doc}`putaway` +::: + +:::{note} +Assigning categories to storage locations tells Odoo these locations meet specific +requirements, such as temperature or accessibility. Odoo then evaluates these locations, based on +defined capacity, and recommends the best one on the warehouse transfer form. +::: + +(inventory-routes-enable-storage-categories)= + +## Configuration + +To enable storage categories, go to {menuselection}`Inventory app --> Configuration --> Settings`. +Then, in the {guilabel}`Warehouse` section, ensure the {guilabel}`Storage Locations` and +{guilabel}`Multi-Step Routes` features are enabled. + +Next, activate the {guilabel}`Storage Categories` feature. Finally, click {guilabel}`Save`. + +```{image} storage_category/enable-categories.png +:align: center +:alt: Show the Storage Categories feature. +``` + +(inventory-routes-define-storage)= + +## Define storage category + +A storage category with specific limitations **must** be created first, before it is applied to +locations, in order to decide the optimal storage location. + +To create a storage category, go to {menuselection}`Inventory app --> Configuration --> Storage +Categories`, and click {guilabel}`Create`. + +On the storage category form, type a name for the category in the {guilabel}`Storage Category` +field. + +Options are available to limit capacity by weight, product, and package type. + +:::{note} +Weight limits can be combined with capacity by package or product (e.g. a maximum of one hundred +products with a total weight of two hundred kilograms). + +While it is possible to limit capacity by product and package type at the same location, it may +be more practical to store items in different amounts across various locations, as shown in this +example of {ref}`capacity by package `. +::: + +The {guilabel}`Allow New Product` field defines when the location is considered available to store a +product: + +- {guilabel}`If location is empty`: a product can be added there only if the location is empty. +- {guilabel}`If products are the same`: a product can be added there only if the same product is + already there. +- {guilabel}`Allow mixed products`: several different products can be stored in this location at + the same time. + +:::{tip} +When clicked, the {guilabel}`Location` smart button shows which storage locations the category +has been assigned to. +::: + +### Capacity by weight + +On a storage category form ({menuselection}`Inventory app --> Configuration --> Storage +Categories`), set a maximum product weight in the {guilabel}`Max Weight` field. This limit applies +to each location assigned this storage category. + +### Capacity by product + +In the {guilabel}`Capacity by Product` tab, click {guilabel}`Add a Line` to input items, and enter +their capacities in the {guilabel}`Quantity` field. + +```{eval-rst} +.. example:: + Ensure only a maximum of five `Large Cabinets` and two `Corner Desk Right Sit` are stored at a + single storage location, by specifying those amounts in the :guilabel:`Capacity by Product` tab + of a storage category form. + + .. image:: storage_category/capacity-by-product.png + :align: center + :alt: Show storage category limiting by product count. +``` + +(inventory-routes-set-capacity-package)= + +### Capacity by package + +For companies using {doc}`packages <../../product_management/configure/package>`, it becomes +possible to ensure real-time storage capacity checks, based on package types (e.g., crates, bins, +boxes, etc.). + +:::{important} +Enable the {guilabel}`Packages` feature in {menuselection}`Inventory app --> Configuration --> +Settings` to show the {guilabel}`Capacity by Package` tab. +::: + +```{eval-rst} +.. example:: + Create putaway rules for pallet-stored items, by creating the `High Frequency pallets` storage + category. + + In the :guilabel:`Capacity by Package` tab, specify the number of packages for the designated + :guilabel:`Package Type`, and set a maximum of `2.00` `Pallets` for a specific location. + + .. image:: storage_category/storage-category.png + :align: center + :alt: Create a storage category on the page. +``` + +(inventory-routes-assign-location)= + +## Assign to location + +Once the storage category is created, assign it to a location. Navigate to the location by going to +{menuselection}`Inventory app --> Configuration --> Locations`, and select the desired location. +Then, select the created category in the {guilabel}`Storage Category` field. + +```{eval-rst} +.. example:: + Assign the `High Frequency pallets` storage category (which limits pallets stored at any location + to two pallets) to the `WH/Stock/pallets/PAL 1` sub-location. + + .. image:: storage_category/location-storage-category.png + :align: center + :alt: When a Storage Category is created, it can be linked to a warehouse location. +``` + +(inventory-routes-set-putaway-attribute)= + +## Putaway rule + +With the {ref}`storage category ` and {ref}`location +` set up, create the {doc}`putaway rule ` by navigating +to {menuselection}`Inventory app --> Configuration --> Putaway Rules`. + +Click the {guilabel}`Create` button to create the putaway rule. In the {guilabel}`Having Category` +field of the new putaway rule form, select the storage category. + +```{eval-rst} +.. example:: + Continuing the example from above, the `High Frequency Pallets` storage category is assigned to + the putaway rule directing pallets of lemonade to locations with the `High Frequency Pallets` + storage category :ref:`assigned to them `. + + .. image:: storage_category/smart-putaways.png + :align: center + :alt: Storage Categories used in a variety of putaway rules. +``` + +## Use case: limit capacity by package + +To limit the capacity of a storage location by a specific number of packages, {ref}`create a storage +category with a Capacity By Package `. + +Continuing the example from above, the `High Frequency Pallets` storage category is assigned to the +`PAL1` and `PAL2` locations. + +Then, {ref}`putaway rules ` are set, so that any pallets received in +the warehouse are directed to be stored in `PAL1` and `PAL2` locations. + +Depending on the number of pallets on-hand at each of the storage locations, when one pallet of +lemonade cans is received, the following scenarios happen: + +- If `PAL1` and `PAL2` are empty, the pallet is redirected to `WH/Stock/Pallets/PAL1`. +- If `PAL1` is full, the pallet is redirected to `WH/Stock/Pallets/PAL2`. +- If `PAL1` and `PAL2` are full, the pallet is redirected to `WH/Stock/Pallets`. + diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes.md b/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes.md new file mode 100644 index 000000000..4493894ac --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations/use_routes.md @@ -0,0 +1,364 @@ +# Routes and push/pull rules + +*Routes* in Odoo control the movement of products between different locations, whether internal or +external, using push and pull rules. Once set up, these rules help automate the logistics of product +movement based on specific conditions. + +:::{seealso} +- [Odoo Tutorials: Routes](https://www.youtube.com/watch?v=qkhDUezyZuc) +- {doc}`Standard routes in Odoo <../daily_operations>` +::: + +:::{note} +Routes are applicable on products, product categories, shipping methods, {ref}`packagings +`, and on the sales order line. +::: + +## About routes and terminology + +In a generic warehouse, there are receiving docks, a quality control area, storage locations, +picking and packing areas, and shipping docks. All products go through all these locations. As the +products move through the locations, each location triggers the products' specified route and +rules. + +```{image} use_routes/stock-example.png +:align: center +:alt: View of a generic warehouse with stock and quality control area. +``` + +In this example, vendor trucks unload pallets of ordered products at the receiving docks. Operators +then scan the products in the receiving area. Depending on the product's route and rules, some of +these products are sent to a quality control area (for example, products that are components used +in the manufacturing process), while others are directly stored in their respective locations. + +```{image} use_routes/push-to-rule-example.png +:align: center +:alt: View of a generic push to rule when receiving products. +``` + +Here is an example of a fulfillment route. In the morning, items are picked for all the orders that +need to be prepared during the day. These items are picked from storage locations and moved to the +picking area, close to where the orders are packed. Then, the orders are packed in their respective +boxes, and conveyor belts bring them to the shipping docks, ready to be delivered to customers. + +```{image} use_routes/pull-from-rule-example.png +:align: center +:alt: View of a generic pull from rule when preparing deliveries. +``` + +### Push rules + +Push rules are used to *supply products into a storage locations* as soon as they arrive at a +specific receiving location. + +:::{note} +Push rules can only be triggered if there are no pull rules that have already generated the +product transfers. +::: + +In a {doc}`one-step receipt route `, which uses one push rule, when a +product arrives in the warehouse, a push rule can automatically transfer it to the *Storage +Location*. Different push rules can be applied to different products, allowing for customized +storage locations. + +:::{figure} use_routes/push-rule.png +:align: center +:alt: Rule for a Receive in one step route. + +Push rule for the 'Receive in one step' route. +::: + +For more information about configuring rules, skip to the {ref}`Configure rules section +`. + +### Pull rules + +Pull rules trigger product moves on demand, such as a sales order or a {doc}`need to restock +<../../warehouses_storage/replenishment/reordering_rules>`. + +Pull rules work backward from the demand location. For example, in a {ref}`two-step delivery +` route, where items move from *Stock* to *Output* +before being delivered to the *Customer Location*, the pull rule first creates a transfer from +*Output* to the customer. If the product is not at *Output*, another pull rule creates a transfer +from *Stock* to *Output*. The warehouse workers then process these transfers in the reverse order: +picking, then shipping. + +:::{figure} use_routes/pull-rule.png +:align: center +:alt: Example pull rule. + +Pull rules for the 'Deliver in two steps' route. +::: + +For more information about configuring rules, skip to the {ref}`Configure rules section +`. + +(use-routes-routes-rules)= + +## Configuration + +Since *Routes* are a collection of *Push and Pull Rules*, Odoo helps you manage advanced route +configurations such as: + +- Manage product manufacturing chains. +- Manage default locations per product. +- Define routes within the stock warehouse according to business needs, such as quality control, + after-sales services, or supplier returns. +- Help rental management by generating automated return moves for rented products. + +To configure a route for a product, first, open the {guilabel}`Inventory` application and go to +{menuselection}`Configuration --> Settings`. Then, in the {guilabel}`Warehouse` section, enable the +{guilabel}`Multi-Step Routes` feature and click {guilabel}`Save`. + +```{image} use_routes/multi-steps-routes-feature.png +:align: center +:alt: Activate the Multi-Step Routes feature in Odoo Inventory. +``` + +:::{note} +The {guilabel}`Storage Locations` feature is automatically activated with the +{guilabel}`Multi-Step Routes` feature. +::: + +Once this first step is completed, the user can use pre-configured routes that come with Odoo, or +they can create custom routes. + +### Pre-configured routes + +To access Odoo's pre-configured routes, go to {menuselection}`Inventory --> Configuration --> +Warehouses`. Then, open a warehouse form. In the {guilabel}`Warehouse Configuration` tab, the user +can view the warehouse's pre-configured routes for {guilabel}`Incoming Shipments` and +{guilabel}`Outgoing Shipments`. + +```{image} use_routes/example-preconfigured-warehouse.png +:align: center +:alt: A pre-configured warehouse in Odoo Inventory. +``` + +Some more advanced routes, such as pick-pack-ship, are also available. The user can select the +route that best fits their business needs. Once the {guilabel}`Incoming Shipments` and +{guilabel}`Outgoing Shipments` routes are set, head to {menuselection}`Inventory --> Configuration +--> Routes` to see the specific routes that Odoo generated. + +```{image} use_routes/preconfigured-routes.png +:align: center +:alt: View of all the preconfigured routes Odoo offers. +``` + +On the {guilabel}`Routes` page, click on a route to open the route form. In the route form, the +user can view which places the route is {guilabel}`Applicable On`. The user can also set the route +to only apply on a specific {guilabel}`Company`. This is useful for multi-company environments; for +example, a user can have a company and warehouse in Country A and a second company and warehouse in +Country B. + +:::{seealso} +{ref}`Applicable on packagings ` +::: + +```{image} use_routes/routes-example.png +:align: center +:alt: View of a route example applicable on product categories and warehouses. +``` + +At the bottom of the route form, the user can view the specific {guilabel}`Rules` for the route. +Each {guilabel}`Rule` has an {guilabel}`Action`, a {guilabel}`Source Location`, and a +{guilabel}`Destination Location`. + +```{image} use_routes/rules-example.png +:align: center +:alt: An example of rules with push & pull actions in Odoo Inventory. +``` + +### Custom Routes + +To create a custom route, go to {menuselection}`Inventory --> Configuration --> Routes`, and click +on {guilabel}`Create`. Next, choose the places where this route can be selected. A route can be +applicable on a combination of places. + +```{image} use_routes/advanced-custom-route.png +:align: center +:alt: View of a pick-pack-ship route. +``` + +Each place has a different behavior, so it is important to tick only the useful ones and adapt each +route accordingly. Then, configure the {guilabel}`Rules` of the route. + +If the route is applicable on a product category, the route still needs to be manually set on the +product category form by going to {menuselection}`Inventory --> Configuration --> Product +Categories`. Then, select the product category and open the form. Next, click {guilabel}`Edit` and +under the {guilabel}`Logistics` section, set the {guilabel}`Routes`. + +When applying the route on a product category, all the rules configured in the route are applied to +**every** product in the category. This can be helpful if the business uses the dropshipping +process for all the products from the same category. + +```{image} use_routes/routes-logistic-section.png +:align: center +:alt: View of a route applied to the "all" product category. +``` + +The same behavior applies to the warehouses. If the route can apply to {guilabel}`Warehouses`, all +the transfers occurring inside the chosen warehouse that meet the conditions of the route's rules +will then follow that route. + +```{image} use_routes/applicable-on-warehouse.png +:align: center +:alt: View of the warehouse drop-down menu when selecting applicable on warehouse. +``` + +If the route is applicable on {guilabel}`Sales Order Lines`, it is more or less the opposite. The +route must be manually chosen when creating a quotation. This is useful if some products go through +different routes. + +Remember to toggle the visibility of the {guilabel}`Route` column on the quotation/sales order. +Then, the route can be chosen on each line of the quotation/sales order. + +```{image} use_routes/add-routes-to-sales-lines.png +:align: center +:alt: View of the menu allowing to add new lines to sales orders. +``` + +Finally, there are routes that can be applied to products. Those work more or less like the product +categories: once selected, the route must be manually set on the product form. + +To set a route on a product, go to {menuselection}`Inventory --> Products --> Products` and select +the desired product. Then, go to the {guilabel}`Inventory` tab and under the {guilabel}`Operations` +section, select the {guilabel}`Routes`. + +```{image} use_routes/on-product-route.png +:align: center +:alt: View of a product form, where the route must be selected. +``` + +:::{important} +Rules must be set on the route in order for the route to work. +::: + +(inventory-shipping-receiving-configure-rules)= + +#### Rules + +The rules are defined on the route form. First, go to {menuselection}`Inventory --> Configuration +--> Routes` and open the desired route form. Next, click {guilabel}`Edit` and in the +{guilabel}`Rules` section, click on {guilabel}`Add a line`. + +```{image} use_routes/add-new-rules.png +:align: center +:alt: View of the rules menu, where it is possible to add new rules. +``` + +The available rules trigger various actions. If Odoo offers *Push* and *Pull* rules, others are +also available. Each rule has an {guilabel}`Action`: + +- {guilabel}`Pull From`: this rule is triggered by a need for the product in a specific location. + The need can come from a sales order being validated or from a manufacturing order requiring a + specific component. When the need appears in the destination location, Odoo generates a picking to + fulfill this need. +- {guilabel}`Push To`: this rule is triggered by the arrival of some products in the defined source + location. In the case of the user moving products to the source location, Odoo generates a picking + to move those products to the destination location. +- {guilabel}`Pull & Push`: this rule allows the generation of pickings in the two situations + explained above. This means that when products are required at a specific location, a transfer is + created from the previous location to fulfill that need. This creates a need in the previous + location and a rule is triggered to fulfill it. Once the second need is fulfilled, the products + are pushed to the destination location and all the needs are fulfilled. +- {guilabel}`Buy`: when products are needed at the destination location, a request for quotation is + created to fulfill the need. +- {guilabel}`Manufacture`: when products are needed in the source location, a manufacturing order + is created to fulfill the need. + +```{image} use_routes/pull-from-rule-stock-to-packing.png +:align: center +:alt: |- +: Overview of a "Pull From" rule that creates a transfer between the stock and the packing +: zone. +``` + +The {guilabel}`Operation Type` must also be defined on the rule. This defines which kind of picking +is created from the rule. + +If the rule's {guilabel}`Action` is set to {guilabel}`Pull From` or {guilabel}`Pull & Push`, a +{guilabel}`Supply Method` must be set. The {guilabel}`Supply Method` defines what happens at the +source location: + +- {guilabel}`Take From Stock`: the products are taken from the available stock of the source + location. +- {guilabel}`Trigger Another Rule`: the system tries to find a stock rule to bring the products to + the source location. The available stock is ignored. +- {guilabel}`Take From Stock, if Unavailable, Trigger Another Rule`: the products are taken from + the available stock of the source location. If there is no stock available, the system tries to + find a rule to bring the products to the source location. + +## Example flow + +In this example, let's use a custom *Pick - Pack - Ship* route to try a full flow with an advanced +custom route. + +First, a quick look at the route's rules and their supply methods. There are three rules, all +{guilabel}`Pull From` rules. The {guilabel}`Supply Methods` for each rule are the following: + +- {guilabel}`Take From Stock`: When products are needed in the {guilabel}`WH/Packing Zone`, *picks* + (internal transfers from {guilabel}`WH/Stock` to {guilabel}`WH/Packing Zone`) are created from + {guilabel}`WH/Stock` to fulfill the need. +- {guilabel}`Trigger Another Rule`: When products are needed in {guilabel}`WH/Output`, *packs* + (internal transfers from {guilabel}`WH/Packing Zone` to {guilabel}`WH/Output`) are created from + {guilabel}`WH/Packing Zone` to fulfill the need. +- {guilabel}`Trigger Another Rule`: When products are needed in {guilabel}`Partner + Locations/Customers`, *delivery orders* are created from {guilabel}`WH/Output` to fulfill the + need. + +```{image} use_routes/transfers-overview.png +:align: center +:alt: Overview of all the transfers created by the pick - pack - ship route. +``` + +This means that, when a customer orders products that have a *pick - pack - ship* route set on it, +a delivery order is created to fulfill the order. + +```{image} use_routes/operations-on-transfers.png +:align: center +:alt: View of the operations created by a pull from transfer. +``` + +:::{note} +If the source document for multiple tranfers is the same sales order, the status is not the same. +The status will be {guilabel}`Waiting Another Operation` if the previous transfer in the list is +not done yet. +::: + +```{image} use_routes/waiting-status.png +:align: center +:alt: View of the transfers' various statuses at the beginning of the process. +``` + +To prepare the delivery order, packed products are needed at the output area, so an internal +transfer is requested from the packing zone. + +```{image} use_routes/detailed-operations-2.png +:align: center +:alt: View of the detailed operations for a transfer between the packing and output +: zones. +``` + +Obviously, the packing zone needs products ready to be packed. So, an internal transfer is +requested to the stock and employees can gather the required products from the warehouse. + +```{image} use_routes/detailed-operations-transfer.png +:align: center +:alt: View of the detailed operations for a transfer between the stock and packing +: zones. +``` + +As explained in the introduction of the documentation, the last step in the process (for this +route, the delivery order) is the first to be triggered, which then triggers other rules until we +reach the first step in the process (here, the internal transfer from the stock to the packing +area). Now, everything is ready to be processed so the customer can get the ordered items. + +In this example, the product is delivered to the customer when all the rules have been triggered and +the transfers are done. + +```{image} use_routes/transfers-status.png +:align: center +:alt: View of the transfers' statuses when the route is completed. +``` + diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods.md b/content/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods.md new file mode 100644 index 000000000..4f55df8f5 --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods.md @@ -0,0 +1,14 @@ +--- +nosearch: true +--- + +# Picking methods + +```{toctree} +:titlesonly: true + +picking_methods/batch +picking_methods/cluster +picking_methods/wave +``` + diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/batch.md b/content/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/batch.md new file mode 100644 index 000000000..3fc71a7b1 --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/batch.md @@ -0,0 +1,238 @@ +# Batch picking + +(inventory-misc-batch-picking)= + +*Batch picking* enables a single picker to handle multiple orders at once, reducing the number of +times needed to navigate to a warehouse location. When picking in batches, orders are grouped and +consolidated into a picking list. After the picking, the batch is taken to an output location, where +the products are sorted into their respective delivery packages. + +Since orders *must* be sorted at the output location after being picked, this picking method suits +businesses with a few products that are ordered often. Storing high-demand items in easily +accessible locations can increase the number of orders that are fulfilled efficiently. + +Batch picking is ideal for industries or warehouses that handle high order volumes with a stable +demand. This method increases efficiency by allowing workers to pick items for multiple orders in +one trip through the warehouse, reducing travel time and boosting productivity. + +## Configuration + +To activate the batch picking option, begin by going to {menuselection}`Inventory app --> +Configuration --> Settings`. Under the {guilabel}`Operations` section, check the {guilabel}`Batch, +Wave & Cluster Transfers` box. + +```{image} batch/batch-transfer-checkbox.png +:alt: Enable the *Batch Transfers* in Inventory > Configuration > Settings. +``` + +Since batch picking is a method to optimize the *pick* operation in Odoo, the {guilabel}`Storage +Locations` and {guilabel}`Multi-Step Routes` options under the {guilabel}`Warehouse` heading must +also be checked on this settings page. When finished, click {guilabel}`Save`. + +```{image} batch/locations-routes-checkbox.png +:alt: Enable *Storage Locations* and *Multi-Step Routes* Inventory > Configuration +: > Settings. +``` + +:::{seealso} +- {doc}`Delivery in two steps <../daily_operations/receipts_delivery_two_steps>` +- {doc}`../daily_operations/delivery_three_steps` +::: + +## Create batch transfers + +To manually group transfers directly from the {menuselection}`Inventory app`, hover over the +desired operation type from the {guilabel}`Inventory Overview` menu (e.g. the {guilabel}`Receipts` +Kanban card), click the {icon}`fa-ellipsis-v` {guilabel}`(vertical ellipsis)` icon, then select +{guilabel}`Prepare Batch`. + +```{image} batch/prepare-batch.png +:alt: The Inventory dashboard with the Prepare Batch option highlighted. +``` + +On the batch transfer form, fill the following fields out accordingly: + +- {guilabel}`Responsible`: employee assigned to the picking. Leave this field blank if *any* worker + can fulfill this picking. +- {guilabel}`Operation Type`: from the drop-down menu, select the operation type under which the + picking is categorized. +- {guilabel}`Scheduled Date`: specifies the date by which the {guilabel}`Responsible` person should + complete the transfer to the output location. + +:::{seealso} +To learn more about the {guilabel}`Dock Location`, {guilabel}`Vehicle`, and {guilabel}`Vehicle +Category` fields, see {doc}`dispatch management system +<../../shipping_receiving/setup_configuration/dispatch>`. +::: + +Next, in the {guilabel}`Transfers` list, click {guilabel}`Add a line` to open the {guilabel}`Add: +Transfers` window. + +If the {guilabel}`Operation Type` field was filled, the list will filter transfer records matching +the selected {guilabel}`Operation Type`. + +Click the {guilabel}`New` button to create a new transfer. + +Once the transfer records are selected, click {guilabel}`Confirm` to confirm the batch picking. + +```{eval-rst} +.. example:: + A new batch transfer is assigned to the :guilabel:`Responsible`, `Joel Willis`, for the `Pick` + :guilabel:`Operation Type`. The :guilabel:`Scheduled Date` is set to `August 11`. + + .. image:: batch/batch-transfer-form.png + :alt: View of *Batch Transfers* form. + + Clicking the :guilabel:`Add a line` button opens the :guilabel:`Add:Transfers` window, + displaying only pickings. This is because the :guilabel:`Operation Type` was set to `Pick` on the + batch transfer form. + + Click the checkbox to the left of the transfers, `WH/PICK/00001` and `WH/PICK/00002`, to include + them in the new transfer. Then, click the :guilabel:`Select` button to close the + :guilabel:`Add:Transfers` window. + + .. image:: batch/add-transfers-window.png + :alt: Select multiple transfers from the *Add:Transfers* window. +``` + +(inventory-warehouses-storage-add-batch-transfers)= + +### Add batch from transfers list + +Another method of creating batch transfers is available using the {guilabel}`Add to batch` option in +a list. Navigate to the {menuselection}`Inventory app --> Operations` drop-down menu, and select any +of the {guilabel}`Transfers` to open a filtered list of transfers. + +```{image} batch/transfers-drop-down.png +:alt: |- +: Show all transfer types in a drop-down menu: Receipts, Deliveries, Internal Transfers, +: Manufacturings, Batch Transfers, Dropships. +``` + +On the transfers list, select the checkbox to the left of the selected transfers to add in a batch. +Next, navigate to the {icon}`fa-cog` {guilabel}`Actions` button, and click {guilabel}`Add to batch` +from the resulting drop-down menu. + +```{image} batch/add-to-batch.png +:alt: Use *Add to batch* button, from the *Action* button's list. +``` + +Doing so opens an {guilabel}`Add to batch` pop-up window, wherein the employee +{guilabel}`Responsible` for the picking can be assigned. + +Choose from the two radio options to add to {guilabel}`an existing batch transfer` or create +{guilabel}`a new batch transfer`. + +Add a {guilabel}`Description` for this batch. + +:::{tip} +The {guilabel}`Description` field can be used to add additional information to help workers +identify the source of the batch, where to place the batch, what shipping containers to use, etc. +::: + +To create a batch to be processed at a later time, select the {guilabel}`Draft` checkbox. + +Conclude the process by clicking {guilabel}`Confirm`. + +```{image} batch/add-to-batch-window.png +:alt: Show *Add to batch* window to create a batch transfer. +``` + +### Automatic batches + +Batches can be automatically created and assigned based on several criteria. The *Automatic Batches* +option is defined on the *operation type* level. + +```{eval-rst} +.. example:: + In a multi-steps delivery process, the picking operation can be grouped by customer, while the + shipping operation can be organized by carrier and destination country. +``` + +To enable *Automatic Batches*, navigate to {menuselection}`Inventory app --> Configuration --> +Operation Types`, and select the desired operation type (e.g. {guilabel}`Delivery`, +{guilabel}`Pick`, etc). Then, select one or more {guilabel}`Batch Grouping` criteria by ticking the +appropriate checkbox. Even if more than one grouping option is selected, only one batch is created. + +Batches can be automatically generated based on the following criteria: + +- {guilabel}`Contact` +- {guilabel}`Carrier` +- {guilabel}`Destination Country` +- {guilabel}`Source Location` +- {guilabel}`Destination Location` + +```{image} batch/auto-batch-grouping.png +:alt: The Batch and Wave Transfers settings page with the Auto batch grouping criteria +: visible. +``` + +## Process batch transfer + +Handle batch transfers in the {menuselection}`Inventory app --> Operations --> Batch Transfers` +page. + +From here, select the intended transfer from the list. Then, on the batch transfer form, input the +{guilabel}`Done` quantities for each product, under the {guilabel}`Detailed Operations` tab. +Finally, select {guilabel}`Validate` to complete the picking. + +:::{tip} +Be certain the batch transfer is complete when the {guilabel}`Validate` button is highlighted in +purple. If the {guilabel}`Check Availability` button is highlighted instead, that means there are +items in the batch that are currently *not* available in-stock. +::: + +(inventory-management-batch-transfers-example)= + +```{eval-rst} +.. example:: + In a batch transfer involving products from pickings, `WH/PICK/00001` and `WH/PICK/00002`, the + :guilabel:`Detailed Operations` tab shows that the product, `Cabinet with Doors`, has been picked + because the :guilabel:`Done` column matches the value in the :guilabel:`Reserved` column. + However, `0.00` quantities have been picked for the other product, `Cable Management Box`. + + .. image:: batch/process-batch-transfer.png + :alt: Show batch transfer of products from two pickings in the *Detailed Operations* tab. +``` + +Only in-stock products are visible in the {guilabel}`Detailed Operations` tab. + +To view the complete product list, switch to the {guilabel}`Operations` tab. On this list, the +{guilabel}`Demand` column indicates the required quantity for the order. The {guilabel}`Reserved` +column shows the available stock to fulfill the order. Lastly, the {guilabel}`Done` column specifies +the products that have been picked, and are ready for the next step. + +```{eval-rst} +.. example:: + The product, `Desk Pad`, from the same batch as the :ref:`example above + `, is only visible in the :guilabel:`Operations` + tab because there are no :guilabel:`Reserved` quantities in stock to fulfill the batch transfer. + + Click the :guilabel:`Check Availability` button to search the stock again for available products. + + .. image:: batch/operations-tab.png + :alt: Show unavailable reserved quantities in the *Operations* tab. +``` + +### Create backorder + +On the batch transfer form, if the {guilabel}`Done` quantity of the product is *less* than the +{guilabel}`Reserved` quantity, a pop-up window appears. + +This pop-up window provides the option: {guilabel}`Create Backorder?`. + +Clicking the {guilabel}`Create Backorder` button automatically creates a new batch transfer. + +:::{note} +When creating a new backorder, the transfers that have **not** been validated in the batch will +be removed from it. +::: + +Click {guilabel}`No Backorder` to finish the picking *without* creating another batch picking. + +Click {guilabel}`Discard` to cancel the validation, and return to the batch transfer form. + +```{image} batch/create-backorder.png +:alt: Show the *Create Backorder* pop-up. +``` + diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/cluster.md b/content/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/cluster.md new file mode 100644 index 000000000..05cc146f7 --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/cluster.md @@ -0,0 +1,181 @@ +--- +substitutions: + SO: '{abbr}`SO (Sales Order)`' + SOS: '{abbr}`SOs (Sales Orders)`' +--- + +# Cluster picking + +(inventory/misc/cluster_picking)= + +Cluster picking is an advanced picking method that combines the efficiency of {ref}`batch picking +` with immediate sorting during the picking process. It is best suited +for warehouses with high order volumes where organization and speed are critical. + +Unlike batch picking, which requires a separate sorting step after picking, cluster picking sorts +items directly into designated bins or containers for each *sales order* (SO). This eliminates the +need for post-picking consolidation, making it ideal for operations prioritizing speed and accuracy. + +Cluster picking is particularly effective in environments where immediate organization is crucial, +and orders contain a mix of items that need precise sorting during, rather than after, the picking +process. + +However, cluster picking does have some disadvantages. For instance, urgent orders cannot be +prioritized, and optimized batches must be manually created beforehand. As a result, the picking +process can lead to bottlenecks. + +(inventory-misc-cluster-picking-example)= + +```{eval-rst} +.. example:: + #. |SO| 1 calls for one apple and orange + #. |SO| 2 calls for one apple and banana + #. |SO| 3 calls for one apple, orange, and banana + + Apples are stored in Shelf A, oranges in Shelf B, and bananas in Shelf C. + + To pick products for three orders at once, the cart is loaded with three empty packages. + + Starting at Shelf A, the picker places apples into each package. Next, the picker navigates to + Shelf B, and places oranges in the packages designated for |SO| 1 and |SO| 3. Finally, the picker + pushes the cart to Shelf C, and loads packages for |SO| 2 and |SO| 3 with a banana, each. + + With the packages for all three |SOS| packed, the picker pushes the cart to the output location, + where the packages are sealed and prepared for shipment. + + .. image:: cluster/cluster-example.png + :alt: Show example of fulfilling sales orders 2 and 3 at once. +``` + +## Configuration + +To enable cluster picking, begin by navigating to {menuselection}`Inventory app --> Configuration +--> Settings`. Under the {guilabel}`Operations` heading, activate the {guilabel}`Packages` and +{guilabel}`Batch, Wave & Cluster Transfers` options. + +```{image} cluster/configs.png +:alt: Activate *Packages* and *Batch Transfers* features in the settings. +``` + +Since batch picking is used to optimize the *pick* operation in Odoo, the {guilabel}`Storage +Locations` and {guilabel}`Multi-Step Routes` options, under the {guilabel}`Warehouse` heading, must +also be checked on this settings page. + +*Storage locations* allow products to be stored in specific locations they can be picked from, while +*multi-step routes* enable the picking operation itself. + +When finished, click {guilabel}`Save`. + +```{image} cluster/locations-routes-checkbox.png +:alt: Enable *Storage Locations* and *Multi-Step Routes* Inventory > Configuration +: > Settings. +``` + +(inventory-misc-create-package)= + +### Packages setup + +To configure the containers to be used during the picking process, navigate to +{menuselection}`Inventory app --> Products --> Packages`. Click the {guilabel}`New` button to create +a new package. + +On the new package form, the {guilabel}`Package Reference` is pre-filled with the next available +`PACK` number in the system. {guilabel}`Pack Date` is automatically set to the creation date of the +form. + +Set the {guilabel}`Package Use` field to {guilabel}`Reusable Box`. + +:::{seealso} +{doc}`Packages <../../product_management/configure/package>` +::: + +```{eval-rst} +.. example:: + A package intended for cluster picking is named `CLUSTER-PACK-3` for easy identification. For + this workflow, the products are directly packed using their intended shipping boxes, so + :guilabel:`Package Use` is set to :guilabel:`Reusable Box`. + + .. image:: cluster/cluster-package.png + :alt: Create new package form. +``` + +## Create cluster batch + +To create a cluster, navigate to {menuselection}`Inventory app` and select the operation type card, +{guilabel}`Delivery Orders` or {guilabel}`Pick` (whichever is the first operation in the delivery +flow). + +:::{note} +Cluster pick batches can be created for outgoing shipments in one, two, or three steps. +::: + +:::{seealso} +- {doc}`Delivery in one step <../daily_operations/receipts_delivery_one_step>` +- {doc}`Delivery in two steps <../daily_operations/receipts_delivery_two_steps>` +- {doc}`Delivery in three steps <../daily_operations/delivery_three_steps>` +::: + +Click the checkbox to the left of the corresponding outgoing operation to add them to the batch. +With the desired pickings selected, click the {icon}`fa-cog` {guilabel}`Actions` button, and select +the {guilabel}`Add to batch` option from the resulting drop-down menu. + +```{eval-rst} +.. example:: + To create a cluster batch, as shown in the :ref:`example above + `, in a warehouse configured with two-step outgoing + shipments, the following pick operations are selected: + + - `WH/PICK/00007`: linked to |SO| 88 for one apple and orange. + - `WH/PICK/00008`: linked to |SO| 89 for one apple and banana. + - `WH/PICK/00009`: linked to |SO| 90 for one apple, orange, and banana. + + .. image:: cluster/select-picks.png + :alt: Use *Add to batch* button, from the *Action* button's list. +``` + +Doing so opens an {guilabel}`Add to batch` pop-up window, wherein the employee +{guilabel}`Responsible` for the picking can be assigned. + +Choose from the two options in the {guilabel}`Add to` field to either: add to {guilabel}`an existing +batch transfer`, or create {guilabel}`a new batch transfer`. + +Then, add a {guilabel}`Description` for this batch. + +:::{tip} +The {guilabel}`Description` field can be used to add additional information to help workers +identify the source of the batch, where to place the batch, what shipping containers to use, etc. +::: + +To create draft batch pickings to be confirmed at a later date, select the {guilabel}`Draft` +checkbox. + +Conclude the process by clicking {guilabel}`Confirm`. + +```{image} cluster/add-to-batch-window.png +:alt: Show *Add to batch* window to create a batch transfer. +``` + +## Process batches + +To process batches, navigate to {menuselection}`Inventory app --> Operations --> Batch Transfers`. +Click on a batch to select it. + +In the {guilabel}`Detailed Operations` tab, products that are to be picked are grouped by location. + +Set the {guilabel}`Destination Package` to the package dedicated to that particular order. + +```{eval-rst} +.. example:: + Process the cluster batch for the three orders of apples, oranges, and bananas :ref:`example + ` by assigning each picking to a dedicated package. + + At the storage location for apples, `WH/Stock/Shelf A`, assign the apples in all three pickings + to one of the three reusable packages, `CLUSTER-PACK-1`, `CLUSTER-PACK-2`, or `CLUSTER-PACK-3`. + + Record this in Odoo using the :guilabel:`Destination Package` field in the :guilabel:`Detailed + Operations` tab. + + .. image:: cluster/cluster-batch-example.png + :alt: Example of processing cluster pickings in *Inventory*. +``` + diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/wave.md b/content/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/wave.md new file mode 100644 index 000000000..d250c0c80 --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/shipping_receiving/picking_methods/wave.md @@ -0,0 +1,143 @@ +--- +substitutions: + SO: '{abbr}`SO (sales order)`' +--- + +# Wave transfers + +While a batch transfer is a group of several pickings, a **wave transfer** contains certain parts +of different pickings. In Odoo, wave transfers are batch transfers with an extra step: transfers are +split before being grouped in a batch. + +Wave picking is ideal for warehouses that need to optimize the handling of high order volumes while +managing complex picking criteria. With wave transfers, orders are grouped into waves based on +factors like product location, category, or scheduled shipping times. Each wave is assigned to a +different employee for the most efficient execution. + +Wave picking is particularly useful for operations where multiple sales orders (SOs), or a single +order, must be picked across different waves. This approach enables flexible scheduling, allowing +warehouses to align picking activities with shipping deadlines, or resource availability. + +```{eval-rst} +.. example:: + #. |SO| 1 calls for one apple and one orange + #. |SO| 2 calls for one apple and one banana + #. |SO| 3 calls for one apple, one orange, and two bananas + + Apples are stored in Shelf A, oranges in Shelf B, and bananas in Shelf C. A warehouse employee is + assigned to the wave, and is provided with the following instructions: + + - Shelf A: Pick three apples. Place them into a central cart designated for the wave. + - Shelf B: Pick two oranges. Add them to the same cart. + - Shelf C: Pick three bananas. Add them to the cart. + + The employee then takes the cart to the sorting/packing station. Items are then sorted and packed + into individual orders. +``` + +## Configuration + +To enable wave picking, begin by navigating to {menuselection}`Inventory --> Configuration --> +Settings`. In the {guilabel}`Operations` section, tick the {guilabel}`Batch, Wave & Cluster +Transfers` checkbox to enable the setting. + +```{image} wave/wave-transfers-setting.png +:alt: View of Odoo Inventory app settings to enable the wave transfers option. +``` + +Next, the {guilabel}`Storage Locations` and {guilabel}`Multi-Step Routes` options, under the +{guilabel}`Warehouse` heading, must also be checked on this settings page. + +*Storage locations* allow products to be stored in specific locations they can be picked from, while +*multi-step routes* enable the picking operation itself. + +Then, click {guilabel}`Save` to save the changes. + +## Create a wave + +Wave transfers can only contain product lines from transfers of the same operation type. To view +all the transfers and product lines in a specific operation, navigate to the +{menuselection}`Inventory app`. Find the desired Kanban card, then click the {icon}`fa-ellipsis-v` +{guilabel}`(vertical ellipsis)` icon to open the options menu. Under {guilabel}`New`, click +{guilabel}`Prepare Wave`. + +```{image} wave/list-of-operations.png +:alt: How to get an operation type's list of operations. +``` + +### Create a new wave + +On the {guilabel}`Prepare Wave` pop-up, stock moves lines are grouped by source location. Select the +checkboxes for the product lines that should be added. Then, click {guilabel}`Add to Wave`. + +```{image} wave/select-lines.png +:alt: Select lines to add to the wave. +``` + +:::{tip} +Use the {guilabel}`Filters` in the search bar to group lines with the same product, location, +carrier, etc. +::: + +### Add products to an existing wave + +To add products to an existing wave, navigate to {menuselection}`Inventory --> Operations --> Wave +Transfers`. Click on the appropriate wave from the list to open it. + +Under the {guilabel}`Detailed Operations` tab, click {guilabel}`Add a line`. Then, in the +{guilabel}`Product` field, search for the desired product. + +## Process a wave + +To view all wave transfers and their statuses, go to {menuselection}`Inventory --> Operations --> +Wave Transfers`. Click on the appropriate wave from the list to open it. + +To assign the wave to a specific employee, click the {guilabel}`Responsible` field and select the +appropriate name from the drop-down list. + +To designate a {ref}`Dock location `, select an option from the +drop-down menu in the {guilabel}`Docks Location` field. + +:::{note} +The {doc}`dispatch management system <../../shipping_receiving/setup_configuration/dispatch>` +feature in Odoo is used to plan and build shipments. Assigning batches to loading docks ensures +the right products are pack into the appropriate trucks for delivery. +::: + +Select a {guilabel}`Vehicle` from the drop-down. Making a selection in this field automatically +updates the {guilabel}`Vehicle Category` field. + +Enter a {guilabel}`Description` for this wave, if desired. + +:::{note} +The {guilabel}`Description` field is automatically generated for {ref}`automatic waves +`. +::: + +(inventory-shipping-receiving-auto-waves)= + +## Automatic waves + +Waves can be automatically created and assigned based on different criteria. The *Automatic Batches* +option is defined on the *operation type* level, which enables the creation of waves with distinct +grouping criteria for each operation type. + +To enable *Automatic Batches*, navigate to {menuselection}`Inventory app --> Configuration --> +Operation Types`, and select the desired operation type (e.g. {guilabel}`Delivery`, +{guilabel}`Pick`, etc). Under the {guilabel}`Batch & Wave Transfers` heading, tick the +{guilabel}`Automatic Batches` checkbox. + +Then, select one or more {guilabel}`Wave Grouping` criteria by ticking the appropriate checkbox. +Even if more than one grouping option is selected, only one wave is created. + +Automatic waves can be created based on the following criteria: + +- {guilabel}`Product`: Split transfers by product, then group transfers that have the same product. +- {guilabel}`Product Category`: Split transfers by product category, then group transfers that have + the same product category. + +```{image} wave/auto-wave-grouping.png +:alt: The Automatic batches feature with the wave grouping option for product category +: selected. +``` + diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies.md b/content/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies.md new file mode 100644 index 000000000..e67027a08 --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies.md @@ -0,0 +1,191 @@ +--- +hide-page-toc: true +show-content: true +--- + +# Removal strategies + +For companies with warehouses, *removal strategies* determine **which** products are taken from the +warehouse, and **when**. For example, for perishable products, prioritizing the picking of goods +with the nearest expiration date helps minimize food spoilage. + +The following columns in the table below list the removal strategies available in Odoo, and detail +how pickings are determined along with the picking order. Leverage these removal strategies to have +Odoo automatically select how products are selected for orders: + +```{eval-rst} +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - + - :doc:`FIFO ` + - :doc:`LIFO ` + - :doc:`FEFO ` + - :doc:`Closest Location ` + - :doc:`Least Packages ` + * - Based on + - :ref:`Incoming date ` + - :ref:`Incoming date ` + - :ref:`Removal date ` + - :ref:`Location sequence ` + - :ref:`Package quantity ` + * - Selection order + - First in + - Last in + - :ref:`First to expire ` + - Alphanumeric name of location + - Quantity closest to fulfilling demand +``` + +For comprehensive examples for how to use each removal strategy, refer to each individual +documentation page. + +(inventory-warehouses-storage-removal-config)= + +## Configuration + +Removal strategies are set on either the product category or storage location. + +```{image} removal_strategies/navigate-location-category.png +:align: center +:alt: Change the Force Removal Strategy for either the Product Categories or Locations. +``` + +Configure removal strategies on the location by going to {menuselection}`Inventory --> Configuration +--> Locations`, and selecting the desired location. On the location form, choose a removal strategy +from the {guilabel}`Removal Strategy` field's drop-down menu options. + +:::{important} +To set a removal strategy on a location, the {guilabel}`Storage Locations` and +{guilabel}`Multi-Step Routes` settings **must** be enabled in {menuselection}`Inventory --> +Configuration --> Settings`. + +These features are **only** necessary when setting the removal strategy on a location. +::: + +Configure removal strategies on product categories by going to {menuselection}`Inventory --> +Configuration --> Product Categories` and selecting the intended product category. Next, choose a +removal strategy from the {guilabel}`Force Removal Strategy` drop-down menu options. + +:::{important} +When there are different removal strategies applied on both the location and product category for +a product, the value set on the {guilabel}`Force Removal Strategy` field set on a +{guilabel}`Product Category` form is applied as top priority. +::: + +## Required features + +While some removal strategies are available by default, some additional features **must** be enabled +in {menuselection}`Inventory --> Configuration --> Settings` for the removal strategy option to +appear in the drop-down menu of the {guilabel}`Force Removal Strategy` or {guilabel}`Removal +Strategy` field. + +Refer to the table below for a summary of required features. Otherwise, refer to the dedicated +sections for the removal strategy for more details on requirements and usage. + +```{eval-rst} +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - + - FIFO + - LIFO + - FEFO + - Closest Location + - Least Packages + * - Required features + - Lots & Serial Numbers + - Lots & Serial Numbers + - Lots & Serial Numbers, Expiration Date + - Storage Locations, Multi-Step Routes + - Packages +``` + +(inventory-warehouses-storage-lots-setup)= + +### Lots and serial numbers + +Lots and serial numbers differentiate identical products and track information like arrival or +expiration dates. To enable this feature, navigate to {menuselection}`Inventory --> Configuration +--> Settings`. Under the {guilabel}`Traceability` heading, check the box beside {guilabel}`Lots & +Serial Numbers` to enable the feature. + +```{image} removal_strategies/enable-lots.png +:align: center +:alt: Enable lots and serial numbers. +``` + +Next, ensure the intended product is tracked by lots or serial numbers by navigating to the product +form through {menuselection}`Inventory --> Products --> Products`, and selecting the desired +product. On the product form, switch to the {guilabel}`Inventory` tab, and under the +{guilabel}`Tracking` field, select either the {guilabel}`By Unique Serial Number` or {guilabel}`By +Lots` options. + +After enabling the features, assign lot or serial numbers to products using an {doc}`inventory +adjustment <../warehouses_storage/inventory_management/count_products>` or during {ref}`product +reception `. + +### Locations and routes + +**Storage locations** and **multi-step routes** are necessary features for setting **all** types of +removal strategies on a location. However, these features are specifically required for the closest +location removal strategy since it is only applied at the location level. + +To activate these features, navigate to {menuselection}`Inventory --> Configuration --> Settings`. +Under the {guilabel}`Warehouse` heading, enable the {guilabel}`Storage Location` and +{guilabel}`Multi-Step Routes` features. + +```{image} removal_strategies/enable-location.png +:align: center +:alt: Enable the locations and route features. +``` + +(inventory-warehouses-storage-exp-setup)= + +### Expiration date + +Enable the **expiration date** feature to track expiration dates, best before dates, removal dates, +and alert dates on a lot or serial number by navigating to {menuselection}`Inventory --> +Configuration --> Settings`. + +Under the {guilabel}`Traceability` heading, ensure the {guilabel}`Lots & Serial Numbers` feature is +selected, and then select the check box for {guilabel}`Expiration Dates` to enable the feature. + +```{image} removal_strategies/enable-expiration.png +:align: center +:alt: Enable expiration dates feature for FEFO. +``` + +(inventory-warehouses-storage-pack-setup)= + +### Packages + +The *packages* feature is used to group products together and is required for the least packages +removal strategy. + +Navigate to {menuselection}`Inventory --> Configuration --> Settings` and select the check box for +the {guilabel}`Packages` feature. + +```{image} removal_strategies/enable-pack.png +:align: center +:alt: Enable the packages feature. +``` + +:::{seealso} +- {doc}`Packages <../product_management/configure/package>` +- {doc}`2-step delivery ` +- {doc}`3-step delivery ` +::: + +```{toctree} +:titlesonly: true + +removal_strategies/fifo +removal_strategies/lifo +removal_strategies/fefo +removal_strategies/closest_location +removal_strategies/least_packages +``` + diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/closest_location.md b/content/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/closest_location.md new file mode 100644 index 000000000..0af0d3ea6 --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/closest_location.md @@ -0,0 +1,105 @@ +# Closest location removal + +For the *Closest Location* removal strategy, products are picked based on the alphanumeric order of +storage location titles. + +The goal of this strategy is to save the warehouse worker from taking a long journey to a farther +shelf when the product is also available at a closer location. + +:::{seealso} +{doc}`About removal strategies <../removal_strategies>` +::: + +(inventory-warehouses-storage-sequence)= + +To understand *location sequence* in the closest removal strategy, consider the following example: + +```{eval-rst} +.. example:: + A product is stored in the following locations: `Shelf A/Pallet`, `Shelf A/Rack 1`, and `Shelf + A/Rack 2`. + + .. image:: closest_location/locations.png + :align: center + :alt: Show a mockup of real storage location in a warehouse. + + The sublocation, `Pallet`, is on the ground level. Products stored here are easier to retrieve, + compared to requiring a forklift to reach `Rack 1` and `Rack 2`. The storage locations were + strategically named in alphabetic order, based on ease of access. +``` + +:::{important} +To use this removal strategy, the {guilabel}`Storage Locations` and {guilabel}`Multi-Step Routes` +settings **must** be enabled in {menuselection}`Inventory app --> Configuration --> Settings`. +::: + +:::{seealso} +{ref}`Set up removal strategy ` +::: + +(inventory-warehouses-storage-location-name)= + +## Location names + +To configure location names, begin by navigating to {menuselection}`Inventory app --> Configuration +--> Locations`. Then, select an existing location, or click {guilabel}`New` to create a new one, and +then enter the desired name in the {guilabel}`Location Name` field. + +Once the locations are named in alphabetical order, based on their proximity to the output or +packing location, set the removal strategy on the {ref}`parent location +`. + +To do that, in the {guilabel}`Locations` list, select the parent location of the alphabetically +named storage locations. + +Doing so opens the form for the parent location. In the {guilabel}`Removal Strategy` field, select +{guilabel}`Closest Location`. + +```{eval-rst} +.. example:: + In a warehouse, the storage location `WH/Stock/Shelf 1` is located closest to the packing area, + where products retrieved from shelves are packed for shipment. The popular product, `iPhone + charger` is stored in three locations, `WH/Stock/Shelf 1`, `WH/Stock/Shelf 2`, and + `WH/Stock/Shelf 3`. + + To use closest location, set the removal strategy on the parent location, 'WH/Stock'. +``` + +## Workflow + +To see how the closest location removal strategy works, consider the following example, featuring +the popular product, `iPhone charger`, which is stored in `WH/Stock/Shelf 1`, `WH/Stock/Shelf 2`, +and `WH/Stock/Shelf 3`. + +Fifteen, five, and thirty units are in stock at each respective location. + +:::{tip} +To check the on-hand stock at each storage location, navigate to the product form, and click the +{guilabel}`On Hand` smart button. + +```{image} closest_location/on-hand-stock.png +:align: center +:alt: Show on-hand stock at all locations. +``` +::: + +Create a {ref}`delivery order ` for eighteen units of the `iPhone +charger` by navigating to the {menuselection}`Sales app` and creating a new quotation. + +After adding the products, clicking {guilabel}`Confirm` creates a delivery order that reserves items +stored at the closest location, using the removal strategy. + +For more details about *where* the units were picked, select the {guilabel}`⦙≣ (bulleted list)` +icon, located on the far-right. Doing so opens the {guilabel}`Open: Stock move` pop-up window that +displays how the reserved items were picked, according to the removal strategy. + +In the {guilabel}`Open: Stock move` pop-up window, the {guilabel}`Pick from` field displays where +the quantities to fulfill the {guilabel}`Demand` are picked. All fifteen of the units stored at the +closest location, `WH/Stock/Shelf 1`, are picked first. The remaining three units are then selected +from the second closest location, `WH/Stock/Shelf 2`. + +```{image} closest_location/stock-move-window.png +:align: center +:alt: Display *Pick From* quantities for the order for iPhone chargers. +``` + diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/fefo.md b/content/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/fefo.md new file mode 100644 index 000000000..ca8495db8 --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/fefo.md @@ -0,0 +1,134 @@ +# FEFO removal + +The *First Expired, First Out* (FEFO) removal strategy targets products for removal based on their +assigned removal dates. + +:::{seealso} +{doc}`About removal strategies <../removal_strategies>` +::: + +(inventory-warehouses-storage-removal-date)= + +## Removal date + +Products **must** be removed from inventory before their *removal date*, which is set as a certain +number of days before the product's *expiration date*. + +The user sets this number of days by navigating to the product form's {guilabel}`Inventory` tab. +Under the {guilabel}`Traceability` section, ensure the {guilabel}`Tracking` field is set to either +{guilabel}`By Lots` or {guilabel}`By Unique Serial Number`. + +Next, select the {guilabel}`Expiration Date` option, which makes the {guilabel}`Removal Date` field +(and other date fields) appear. + +:::{important} +The {guilabel}`Lots and Serial Numbers` and {guilabel}`Expiration Dates` features **must** be +enabled in {menuselection}`Inventory app --> Configuration --> Settings` to track expiration +dates. +::: + +The expiration date of a product is determined by adding the date the product was received to the +number of days specified in the {guilabel}`Expiration Date` field of the product form. + +The removal date takes this expiration date, and subtracts the number of days specified in the +{guilabel}`Removal Date` field of the product form. + +:::{seealso} +{doc}`Expiration dates <../../product_management/product_tracking/expiration_dates>` +::: + +```{eval-rst} +.. example:: + In the :guilabel:`Inventory` tab of the product, `Egg`, the following :guilabel:`Dates` are set + by the user: + + - :guilabel:`Expiration Date`: `30` days after receipt + - :guilabel:`Removal Date`: `15` days before expiration date + + .. image:: fefo/user-set-date.png + :align: center + :alt: Display expiration and removal dates set on the product form. + + A shipment of Eggs arrive at the warehouse on January 1st. So, the expiration date of the Eggs is + **January 31st** (Jan 1st + 30). By extension, the removal date is **January 16th** (Jan 31 - + 15). +``` + +(inventory-warehouses-storage-exp-date)= + +To view the expiration dates of items in stock, navigate to the product form, and click the +{guilabel}`On Hand` smart button. + +Next, click the additional options icon, located on the far-right, and select the columns: +{guilabel}`Expiration Date` and {guilabel}`Removal Date`. + +```{image} fefo/removal-date.png +:align: center +:alt: |- +: Show expiration dates from the inventory adjustments model accessed from the *On Hand* +: smart button from the product form. +``` + +## Workflow + +Using the {abbr}`FEFO (First Expired, First Out)` removal strategy ensures that products with the +nearest removal date are picked first. + +To understand how this removal strategy works, consider the following example below about the +product, `Carton of eggs`, which is a box containing twelve eggs. + +The product is tracked {guilabel}`By Lots`, and the product category's {guilabel}`Force Removal +Strategy` is set to {guilabel}`First Expired, First Out (FEFO)`. + +:::{seealso} +- {ref}`Set up force removal strategy ` +- {ref}`Enable lots tracking ` +- [Odoo Tutorials: Perishable Products](https://www.odoo.com/slides/slide/5324/share) +::: + +```{eval-rst} +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - + - LOT1 + - LOT2 + - LOT3 + * - On-hand stock + - 5 + - 2 + - 1 + * - Expiration date + - April 4 + - April 10 + - April 15 + * - :ref:`Removal date ` + - February 26 + - March 4 + - March 9 +``` + +To see the removal strategy in action, go to the {menuselection}`Sales app` and create a new +quotation. + +Clicking {guilabel}`Confirm` creates a delivery order for today, December 29th, and the lot numbers +with the soonest expiration dates are reserved, using the {abbr}`FEFO (First Expired, First Out)` +removal strategy. + +To view the detailed pickings, click the {guilabel}`⦙≣ (bulleted list)` icon, located on the +far-right of the Carton of egg's product line, in the {guilabel}`Operations` tab of the delivery +order. Doing so opens the {guilabel}`Open: Stock move` pop-up window. + +In the {guilabel}`Open: Stock move` pop-up window, the {guilabel}`Pick from` field displays where +the quantities to fulfill the {guilabel}`Demand` are picked from. + +Since the order demanded six Cartons of eggs, using the {abbr}`FEFO (First Expired, First Out)` +removal strategy, all five Cartons from `LOT1`, with the removal date of February 26th, are picked. +The remaining Carton is selected from `LOT2`, which has a removal date of March 4th. + +```{image} fefo/eggs-picking.png +:align: center +:alt: The stock moves window that shows the lots to be removed using FEFO. +``` + diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/fifo.md b/content/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/fifo.md new file mode 100644 index 000000000..c2b6e6f92 --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/fifo.md @@ -0,0 +1,104 @@ +# FIFO removal + +The *First In, First Out* (FIFO) removal strategy selects products with the earliest arrival dates. +This method is useful for companies selling products that have short demand cycles, like clothes, +for example. By using {abbr}`FIFO (First In, First Out)`, companies can prevent prolonged stock +retention of specific styles. + +:::{seealso} +{doc}`About removal strategies <../removal_strategies>` +::: + +```{eval-rst} +.. example:: + Various quantities of the product, `T-shirt`, tracked by lot numbers, arrive on August 1st and + August 25th. For an order made on September 1st, the :abbr:`FIFO (First In, First Out)` removal + strategy prioritizes lots that have been in stock the longest. So, products received on August + 1st are selected first for picking. + + .. image:: fifo/fifo-example.png + :align: center + :alt: Illustration of FIFO selecting the oldest products in stock. +``` + +:::{seealso} +{ref}`Lot/serial number setup details ` +::: + +(inventory-warehouses-storage-arrival-date)= + +## Arrival date + +To see the product lot or serial number that arrived in inventory first, navigate to +{menuselection}`Inventory app --> Products --> Lots/Serial Numbers`. + +Then, select the {guilabel}`▶️ (right-pointing arrow)` icon on the left of a product line, in order +to reveal a list of the product's lots or serial numbers that are in stock. The {guilabel}`Created +On` field shows the lot/serial number creation date, which is, essentially, the arrival date. + +```{eval-rst} +.. example:: + Serial number `00000000500` of the product, `Cabinet with Doors`, arrived on December 29th, as + displayed in the :guilabel:`Created On` field. + + .. image:: fifo/created-on.png + :align: center + :alt: Display arrival date of a lot for an item. +``` + +## Workflow + +To understand how {abbr}`FIFO (First In, First Out)` rotates products out, consider the following +example, focusing on three lots of white shirts. + +The shirts are from the *All/Clothes* category, where {abbr}`FIFO (First In, First Out)` is set as +the {guilabel}`Force Removal Strategy`. + +The white shirts are tracked {guilabel}`By Lots` in the {guilabel}`Inventory` tab of the product +form. + +:::{seealso} +- {ref}`Set up force removal strategy ` +- {ref}`Enable lots tracking ` +::: + +The following table represents the on-hand stock and lot number details of white shirts. + +```{eval-rst} +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - + - LOT1 + - LOT2 + - LOT3 + * - On-hand stock + - 5 + - 3 + - 2 + * - :ref:`Created on ` + - March 1 + - April 1 + - May 1 +``` + +To see the removal strategy in action, create a {ref}`delivery order ` +for six white shirts by navigating to the {menuselection}`Sales app` and creating a new quotation. + +After clicking {guilabel}`Confirm` on the sales order, a delivery order with the oldest lot numbers +for shirts are reserved, using the {abbr}`FIFO (First In, First Out)` removal strategy. + +To view the detailed pickings, click the {guilabel}`⦙≣ (bulleted list)` icon, located on the +far-right of the white shirt's product line in the {guilabel}`Operations` tab of the delivery order. +Doing so opens the {guilabel}`Open: Stock move` pop-up window. + +In the {guilabel}`Open: Stock move` pop-up window, the {guilabel}`Pick from` field displays where +the quantities to fulfill the {guilabel}`Demand` are picked from. Since the order demanded six +shirts, all five shirts from `LOT1`, and one shirt from `LOT2`, are selected. + +```{image} fifo/white-shirt-picking.png +:align: center +:alt: Two lots being reserved for a sales order with the FIFO strategy. +``` + diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/least_packages.md b/content/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/least_packages.md new file mode 100644 index 000000000..984d54bc3 --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/least_packages.md @@ -0,0 +1,78 @@ +# Least packages removal + +The *Least Packages* removal strategy fulfills an order by opening the fewest number of packages, +which is ideal for maintaining organized stock without needing to open multiple boxes. + +:::{seealso} +- {doc}`About removal strategies <../removal_strategies>` +- [Odoo Tutorials: Least Packages](https://www.odoo.com/slides/slide/5477/share) +::: + +To understand how the removal strategy works, consider the following example, featuring a warehouse +that stores packages of flour in bulk packages of `100 kg`. + +To minimize moisture, and/or prevent pests from entering open packages, the least packages removal +strategy is used to pick from a single, opened package. + +(inventory-warehouses-storage-pkg-qty)= + +```{eval-rst} +.. example:: + A package of `100 kg` of flour is depleted to `54 kg` after fulfilling some orders. There are + other packages of `100 kg` in stock. + + #. When an order for `14 kg` of flour is placed, the package of `54 kg` is selected. + #. When an order for *more* than `54 kg` of flour is placed, an unopened `100 kg` package is used + to fulfill the order. While this temporarily results in two open packages, these open packages + are prioritized in the next picking. +``` + +## Workflow + +Using the least package removal strategy, the fewest number of packages is used to fulfill an order. + +:::{important} +The {ref}`Packages feature ` **must** be enabled to use +this strategy. +::: + +Consider the following example, featuring the product, `Flour`. The product's {guilabel}`Units of +Measure` field, located on the product form, is set to `kg`. The product is stored in packages of +`100 kg`, with one remaining package containing `54 kg`. The product category's {guilabel}`Force +Removal Strategy` is set to {guilabel}`Least Packages`. + +:::{seealso} +- {ref}`Set removal strategy on product category ` +::: + +:::{tip} +To check the product's on-hand stock, navigate to the product form, and click the {guilabel}`On +Hand` smart button. + +```{image} least_packages/on-hand-flour.png +:align: center +:alt: Show on-hand stock in each package. +``` +::: + +Create a {ref}`delivery order ` for eighty kilograms of flour by going +to the {menuselection}`Sales app` and creating a new quotation. After clicking {guilabel}`Confirm`, +the delivery order is created. + +On the delivery order, the {guilabel}`Quantity` field displays the amount automatically picked, +according to the removal strategy. + +For more details about *where* the units were picked, select the {guilabel}`⦙≣ (bulleted list)` +icon, located on the far-right. Doing so opens the {guilabel}`Open: Stock move` pop-up window, +displaying how the reserved items were picked, according to the removal strategy. + +In the {guilabel}`Open: Stock move` pop-up window, the {guilabel}`Pick from` field displays where +the quantities to fulfill the {guilabel}`Demand` are picked. Since the order demanded eighty +kilograms, which exceeds the quantity in the opened package of `54 kg`, an unopened package of `100 +kg` is selected. + +```{image} least_packages/least-package.png +:align: center +:alt: Show which package was picked in the *Pick From* field. +``` + diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/lifo.md b/content/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/lifo.md new file mode 100644 index 000000000..18b39c843 --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/lifo.md @@ -0,0 +1,70 @@ +# LIFO removal + +The *Last In, First Out* (LIFO) removal strategy picks the **newest** products on-hand, based on the +date they entered a warehouse's stock. + +Every time an order is placed for products using the {abbr}`LIFO (Last In, First Out)` strategy, a +transfer is created for the lot/serial number that has most recently entered the stock (the **last** +lot/serial number that entered the warehouse's inventory). + +:::{seealso} +{doc}`About removal strategies <../removal_strategies>` +::: + +:::{warning} +In many countries, the {abbr}`LIFO (Last In, First Out)` removal strategy is banned, since it can +potentially result in old, expired, or obsolete products being delivered to customers. +::: + +Consider the following example, with the product, `Cinder Block`, which is tracked {guilabel}`By +Lots` in the {guilabel}`Inventory` tab of the product form. The {guilabel}`Force Removal Strategy` +for the cinder block's product category is set to {guilabel}`Last In, First Out (LIFO)`. + +:::{seealso} +- {ref}`Set up force removal strategy ` +- {ref}`Enable lots tracking ` +- {ref}`Check arrival date ` +::: + +The following table represents the cinder blocks in stock, and their various lot number details. + +```{eval-rst} +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - + - LOT1 + - LOT2 + - LOT3 + * - On-hand stock + - 10 + - 10 + - 10 + * - :ref:`Created on ` + - June 1 + - June 3 + - June 6 +``` + +To see the removal strategy in action, create a {ref}`delivery order ` +for seven cinder blocks by navigating to the {menuselection}`Sales app` and creating a new +quotation. + +{guilabel}`Confirm` the sales order to create a delivery order. Doing so reserves the newest lot +numbers are using the {abbr}`LIFO (Last In, First Out)` removal strategy. + +To view the detailed pickings, click the {guilabel}`⦙≣ (bulleted list)` icon, located on the +far-right of the cinder block's product line in the {guilabel}`Operations` tab of the delivery +order. Doing so opens the {guilabel}`Open: Stock move` pop-up window. + +In the {guilabel}`Open: Stock move` pop-up window, the {guilabel}`Pick from` field displays where +the quantities to fulfill the {guilabel}`Demand` are picked from. Since the order demanded seven +cinder blocks, the newest cinder blocks from `LOT3` are selected, using the {abbr}`LIFO (Last In, +First Out)` removal strategy. + +```{image} lifo/cinder-block-picking.png +:align: center +:alt: The detailed operations shows which lots are being selected for the picking. +``` + diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods.md b/content/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods.md new file mode 100644 index 000000000..6e25ba65f --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods.md @@ -0,0 +1,121 @@ +--- +hide-page-toc: true +show-content: true +--- + +# Reservation methods + +Companies that sell and deliver goods to customers need to make sure they always have stock on-hand, +so when new sales orders are confirmed, they can deliver products on time. + +In Odoo, this can be handled using *reservation methods*. Reservation methods control how products +included in a delivery order (DO) should be reserved for delivery, ensuring they are reserved at the +correct times, for the correct orders. + +There are three different reservation methods in Odoo: *At Confirmation*, *Manually*, and *Before +scheduled date*. + +```{eval-rst} +.. tabs:: + + .. tab:: At Confirmation + + Reserves products **only** when a sales order is confirmed, **and** if stock is already + available. + + .. tab:: Manually + + Once a quote is confirmed, product availability **must** be checked manually, and the required + quantity **must** be reserved manually. + + .. tab:: Before scheduled date + + A specific number of days can be selected; this is the maximum number of days **before** a + scheduled delivery date that products should be reserved. +``` + +## Configuration + +Reservation methods are set on individual operations types. To configure reservation methods, go to +{menuselection}`Inventory app --> Configuration --> Operations Types`. Then, select the desired +operation type. Or, create a new one by clicking {guilabel}`New`. + +In the {guilabel}`General` tab of the operation type form, locate the {guilabel}`Reservation Method` +option, and choose which method should be used for this type of operation. + +```{image} reservation_methods/reservation-methods-operations-type-field.png +:align: center +:alt: Reservation method field on delivery order operation type form. +``` + +:::{tip} +If the {guilabel}`Before scheduled date` reservation method is selected, a new +{guilabel}`Reserve before scheduled date` field appears below. From this field, the number of +{guilabel}`days before` and {guilabel}`days before when starred` can be changed from the default +`0`. + +Changing the {guilabel}`days before` value changes the maximum number of days before a scheduled +date that products should be reserved. + +Changing the {guilabel}`days before when starred` value changes the maximum number of days before +a scheduled date that starred (favorited) transfers for products should be reserved. + +```{image} reservation_methods/reservation-methods-before-scheduled-date.png +:align: center +:alt: Reserve before scheduled date fields with before scheduled date method chosen. +``` +::: + +## Required applications + +The two required applications that **must** be {ref}`installed ` to use reservation +methods are the *Sales* and *Inventory* apps. + +:::{note} +In addition to delivery orders, reservation methods can also be used for *manufacturing orders*, +*resupply subcontractor* orders, orders for *repairs*, and *internal transfers*, if desired. To +enable this, configure the additional settings: + +- **For manufacturing orders:** Install the *Manufacturing* application by going to the + {menuselection}`Apps` application, locating the *Manufacturing* app, and clicking + {guilabel}`Install`. +- **For resupply subcontractor:** Navigate to {menuselection}`Manufacturing app --> Configuration + --> Settings`, and under the {guilabel}`Operations` section, enable {guilabel}`Subcontracting`. + Then, click {guilabel}`Save`. +- **For repairs:** Install the *Repairs* application by going to the {menuselection}`Apps` + application, locating the *Repairs* app, and clicking {guilabel}`Install`. +- **For internal transfers:** Navigate to {menuselection}`Inventory app --> Configuration --> + Settings`, and under the {guilabel}`Warehouse` section, enable {guilabel}`Storage Locations`. + Then, click {guilabel}`Save`. +::: + +Once these apps are installed, no additional features need to be enabled from the settings for +reservation methods to work. They will be available by default on certain operations types, and can +be viewed and changed by navigating to {menuselection}`Inventory app --> Configuration --> +Operations Types`, and then clicking on a specific operations type. + +:::{note} +When the {guilabel}`Type of Operation` is changed to {guilabel}`Receipt` on an +{guilabel}`Operations Type` form, reservation methods are **not** available. +::: + +```{image} reservation_methods/reservation-methods-operations-type-menu.png +:align: center +:alt: Operations Types highlighted from the Configurations submenu in the Inventory +: app. +``` + +:::{seealso} +- {doc}`reservation_methods/at_confirmation` +- {doc}`reservation_methods/manually` +- {doc}`reservation_methods/before_scheduled_date` +::: + +```{toctree} +:titlesonly: true + +reservation_methods/at_confirmation +reservation_methods/manually +reservation_methods/before_scheduled_date +``` + diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/at_confirmation.md b/content/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/at_confirmation.md new file mode 100644 index 000000000..a5c26ca74 --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/at_confirmation.md @@ -0,0 +1,97 @@ +--- +substitutions: + SO: '{abbr}`SO (Sales Order)`' +--- + +# At confirmation reservation + +(inventory/reservation_methods/at-confirmation)= + +The *at confirmation* reservation method reserves products **only** when a sales order (SO) is +confirmed, **and** if enough stock of the products included in the {{ SO }} is already available. + +:::{seealso} +{doc}`About reservation methods <../reservation_methods>` +::: + +## Configuration + +To set the reservation method to *at confirmation*, navigate to {menuselection}`Inventory app --> +Configuration --> Operations Types`. Then, select the desired {guilabel}`Operation Type` to +configure, or create a new one by clicking {guilabel}`New`. + +In the {guilabel}`General` tab on the operation type form, locate the {guilabel}`Reservation Method` +field, and select {guilabel}`At Confirmation`. + +```{image} at_confirmation/at-confirmation-operations-type.png +:align: center +:alt: Reservation method field on delivery order operation type form. +``` + +## Workflow + +To see the *at confirmation* reservation method in action, create a new {{ SO }} by navigating to +{menuselection}`Sales app --> New`. + +Add a customer in the {guilabel}`Customer` field. Then, in the {guilabel}`Order Lines` tab, click +{guilabel}`Add a product`, and select a product to add to the quotation from the drop-down menu. +Finally, in the {guilabel}`Quantity` column, adjust the desired quantity of the product to sell. + +Once ready, click {guilabel}`Confirm` to confirm the sales order. + +Click the {guilabel}`📈 (area graph)` icon on the product line to reveal the product's +{guilabel}`Availability` tooltip, which reveals the {guilabel}`Reserved` number of units for this +order. + +:::{note} +If there is **not** sufficient quantity of stock for the product included in the {{ SO }}, the +{guilabel}`📈 (area graph)` icon is red, instead of green. + +Instead of revealing the reserved number of units for the order, the {guilabel}`Availability` +tooltip reads {guilabel}`Available`, and reveals the available number of units (e.g., `0 Units`). +::: + +```{image} at_confirmation/at-confirmation-availability-tooltip.png +:align: center +:alt: Confirmed sales order with product availability tooltip selected. +``` + +:::{admonition} Forecasted Report +To see all the factors that affect product reservation, click the {guilabel}`View Forecast` +internal link arrow to view the {guilabel}`Forecasted Report` dashboard. + +The {guilabel}`Forecasted Report` displays forecast information about the product(s) included in +the sales order; namely, any live receipts of the product, and any active sales orders, which are +listed in the {guilabel}`Used By` column. See how each order is fulfilled in the +{guilabel}`Replenishment` column. + +Additionally, the {guilabel}`Forecasted` quantity is calculated at the top of the page, by adding +the {guilabel}`On Hand` and {guilabel}`Incoming` quantity, and subtracting the +{guilabel}`Outgoing` quantity, as shown below: + +```{image} at_confirmation/at-confirmation-forecasted-equation.png +:align: center +:alt: Forecasted quantity equation from the Forecasted Report page. +``` + +If one order should be prioritized over another order, click the {guilabel}`Unreserve` button on +the corresponding order line in the {guilabel}`Replenishment` column. +::: + +To deliver the products, click the {guilabel}`Delivery` smart button at the top of the sales order +form. To confirm that the reservation worked properly, ensure that the {guilabel}`Product +Availability` field reads `Available` (in green text), and the numbers in the {guilabel}`Demand` and +{guilabel}`Quantity` columns match (in this case, both should read `100.00`). + +```{image} at_confirmation/at-confirmation-delivery-order.png +:align: center +:alt: Delivery order for product included in sales order with at confirmation reservation. +``` + +Once ready, click {guilabel}`Validate`. + +:::{seealso} +- {doc}`Manual reservation ` +- {doc}`Before scheduled date reservation ` +::: + diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/before_scheduled_date.md b/content/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/before_scheduled_date.md new file mode 100644 index 000000000..4c946db91 --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/before_scheduled_date.md @@ -0,0 +1,163 @@ +--- +substitutions: + SO: '{abbr}`SO (Sales Order)`' +--- + +# Before scheduled date reservation + +(inventory/reservation_methods/before-scheduled-date)= + +The *Before scheduled date* reservation method allows users to select a specific number of days that +act as the maximum number of days **before** a scheduled delivery date, when products included in a +sales order (SO) should be reserved. + +:::{seealso} +{doc}`About reservation methods <../reservation_methods>` +::: + +## Configuration + +To set the reservation method to *Before scheduled date*, navigate to {menuselection}`Inventory app +--> Configuration --> Operations Types`. Then, select the desired {guilabel}`Operation Type` to +configure, or create a new one by clicking {guilabel}`New`. + +In the {guilabel}`General` tab, locate the {guilabel}`Reservation Method` field, and select +{guilabel}`Before scheduled date`. + +```{image} before_scheduled_date/before-scheduled-date-configuration.png +:align: center +:alt: Reservation method field on delivery order operation type form. +``` + +:::{note} +When the {guilabel}`Type of Operation` is changed to {guilabel}`Receipt` on an +{guilabel}`Operations Type` form, reservation methods are **not** available. +::: + +Once selected, a new {guilabel}`Reserve before scheduled date` field appears below. From this field, +the number of {guilabel}`days before` and {guilabel}`days before when starred` can be changed from +the default `0`. + +Changing the {guilabel}`days before` value changes the maximum number of days before a scheduled +date that products should be reserved. + +Changing the {guilabel}`days before when starred` value changes the maximum number of days before a +scheduled date that products should be reserved if the transfers are starred (favorited). + +```{eval-rst} +.. example:: + Here, the :guilabel:`days before` value is set to `2` days before, and the :guilabel:`days before + when starred` value is set to `3`. + + This means products are reserved two days before the scheduled delivery date for normal orders, + and three days before the scheduled delivery date for starred (favorited) transfers. + + .. image:: before_scheduled_date/before-scheduled-date-days-before.png + :align: center + :alt: Reserve before scheduled date field with set numerical values. + + This is the configuration applied for the following workflow found below. +``` + +### Edit product form + +Before the *Before scheduled date* reservation method can be used, ensure that a *customer lead +time* is added to products that plan to be sold with this method. + +To do that, navigate to {menuselection}`Inventory app --> Products --> Products`, and select the +desired product to configure. + +On the product form, click the {guilabel}`Inventory` tab, and under the {guilabel}`Logistics` +section, change the value in the {guilabel}`Customer Lead Time` field. + +For this example workflow, change it to `5` days. + +This sets the scheduled delivery date for this specific product to five days after the creation date +of the sales order. + +```{image} before_scheduled_date/before-scheduled-date-customer-lead-time.png +:align: center +:alt: Product form with customer lead time set in Inventory tab. +``` + +## Workflow + +To see the *Before scheduled date* reservation method in action, create a new {{ SO }} by navigating to +{menuselection}`Sales app --> New`. + +Add a customer in the {guilabel}`Customer` field, then, in the {guilabel}`Order Lines` tab, click +{guilabel}`Add a product`, and select a product from the drop-down menu that has a configured +*customer lead time*, to add to the quotation form. + +Finally, in the {guilabel}`Quantity` column, adjust the desired quantity of the product to sell. + +For this sample workflow, set the {guilabel}`Quantity` to `10`. + +Once ready, click {guilabel}`Confirm` to confirm the sales order. + +Click the green {guilabel}`📈 (area graph)` icon on the product line to reveal the product's +{guilabel}`Availability` tooltip. This tooltip reveals the reserved number of units for this order. +Because the reservation method is set to *Before scheduled date*, the {guilabel}`Reserved` quantity +reads `0 Units`. + +However, below that quantity reads `Available in stock`. This is because the quantity is available, +but the scheduled date, for this example workflow, is five days from the order date. + +Since reservation is not until two days before the scheduled delivery, it will not reserve the +products until then. + +:::{note} +If there is **not** sufficient quantity of stock for the product included in the {{ SO }}, the +{guilabel}`📈 (area graph)` icon is red, instead of green. + +Instead of revealing the reserved number of units for the order, the {guilabel}`Availability` +tooltip reads {guilabel}`Reserved`, and reveals the available number of units (e.g., `0 Units`). + +Additionally, unless there is a set replenishment or a live receipt, it also reads {guilabel}`No +future availability`, in red text. +::: + +```{image} before_scheduled_date/before-scheduled-date-availability-tooltip.png +:align: center +:alt: Confirmed sales order with product availability tooltip selected. +``` + +Click the {guilabel}`Delivery` smart button to see the delivery order form. + +On the delivery order form, the status in the {guilabel}`Product Availability` field is listed as +`Available`, in yellow text, instead of green. This is because there is sufficient stock on-hand for +this order, but no quantity has been reserved yet. + +Note the {guilabel}`Scheduled Date` field, above the {guilabel}`Product Availability` field, +displays the date five days from the order creation date. This indicates that the products are not +reserved until three days from today's date (two days before the scheduled delivery date). + +```{image} before_scheduled_date/before-scheduled-date-delivery-order-form.png +:align: center +:alt: Delivery order form with product availability and reserved quantity. +``` + +In the {guilabel}`Operations` tab on the {guilabel}`Product` line, the numbers in the +{guilabel}`Demand` column and the {guilabel}`Quantity` column do not match (in this case, the +{guilabel}`Demand` column lists `10.00`, while the {guilabel}`Quantity` column lists `0`). + +The {guilabel}`Quantity` column lists `0` because the products aren't reserved until two days +*before* their delivery date. Odoo automatically reserves the products once the scheduled date +arrives, at which point the {guilabel}`Demand` and {guilabel}`Quantity` columns will match. + +:::{tip} +If the products in the {{ SO }} should be reserved *sooner* than the scheduled reservation date, the +reservation can be manually overridden. To manually reserve the products sooner than scheduled, +click {guilabel}`Check Availability` at the top of the form. + +This turns the `Available` status in the {guilabel}`Product Availability` field green, and +changes the number in the {guilabel}`Quantity` column to match the {guilabel}`Demand` column. + +Once ready, click {guilabel}`Validate`. +::: + +:::{seealso} +- {doc}`Manual reservation ` +- {doc}`At confirmation reservation ` +::: + diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/manually.md b/content/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/manually.md new file mode 100644 index 000000000..f14106590 --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/shipping_receiving/reservation_methods/manually.md @@ -0,0 +1,149 @@ +--- +substitutions: + SO: '{abbr}`SO (Sales Order)`' +--- + +# Manual reservation + +(inventory/reservation_methods/manually)= + +Unlike the *At Confirmation* reservation method, the *Manually* reservation method does **not** +reserve products automatically. + +Instead, once a sales order (SO) is confirmed, product availability **must** be checked manually, +and the required quantity **must** be reserved manually. + +:::{seealso} +{doc}`About reservation methods <../reservation_methods>` +::: + +## Configuration + +To set the reservation method to *Manually*, navigate to {menuselection}`Inventory app --> +Configuration --> Operations Types`. Then, select the desired {guilabel}`Operation Type` to be +configured, or create a new one by clicking {guilabel}`New`. + +In the {guilabel}`General` tab, locate the {guilabel}`Reservation Method` field, and select +{guilabel}`Manually`. + +```{image} manually/manually-operations-type.png +:align: center +:alt: Reservation method field on delivery order operation type form. +``` + +:::{note} +When the {guilabel}`Type of Operation` is changed to {guilabel}`Receipt` on an +{guilabel}`Operations Type` form, reservation methods are **not** available. +::: + +## Workflow + +To see the *Manually* reservation method in action, create a new {{ SO }} by navigating to +{menuselection}`Sales app --> New`. + +Add a customer in the {guilabel}`Customer` field. Then, in the {guilabel}`Order Lines` tab, click +{guilabel}`Add a product`, and select a product to add to the quotation from the drop-down menu. +Finally, in the {guilabel}`Quantity` column, adjust the desired quantity of the product to sell. + +Once ready, click {guilabel}`Confirm` to confirm the sales order. + +Click the green {guilabel}`📈 (area graph)` icon on the product line to reveal the product's +{guilabel}`Availability` tooltip. This tooltip reveals the reserved number of units for this order. +Because the reservation method is set to *Manually*, the {guilabel}`Reserved` quantity reads `0 +Units`. + +However, below that quantity reads `Available in stock`. This is because the quantity is available, +but must be manually reserved. + +:::{note} +If there is **not** sufficient quantity of stock for the product included in the {{ SO }}, the +{guilabel}`📈 (area graph)` icon is red, instead of green. + +Instead of revealing the reserved number of units for the order, the {guilabel}`Availability` +tooltip reads {guilabel}`Reserved`, and reveals the available number of units (e.g., `0 Units`). + +Additionally, unless there is a set replenishment or a live receipt, it also reads {guilabel}`No +future availability`, in red text. +::: + +```{image} manually/manually-availability-tooltip.png +:align: center +:alt: Confirmed sales order with product availability tooltip selected. +``` + +Once the {{ SO }} is confirmed, navigate to the {menuselection}`Inventory app`, and locate the +{guilabel}`Delivery Orders` card on the {guilabel}`Inventory Overview` page. + +The {guilabel}`Delivery Orders` card displays the current status of live orders, including those +with a {guilabel}`Waiting` status. Orders with this status indicate that the products in those +orders have either not been reserved yet, or are not in stock at all. + +```{image} manually/manually-delivery-orders-card.png +:align: center +:alt: Delivery orders task card with waiting status orders. +``` + +To see the {{ SO }} created previously, click the {guilabel}`(#) Waiting` button on the card (in this +case, `8 Waiting`). + +Locate the delivery order (DO) tied to the {{ SO }} that was previously created, and click the line to +view it. + +On the {guilabel}`Delivery Order` form, the status in the {guilabel}`Product Availability` field is +listed as `Available`, in yellow text, instead of green. This is because there is sufficient stock +on hand for this order, but no quantity has been reserved yet. + +In the {guilabel}`Operations` tab, on the {guilabel}`Product` line, the numbers in the +{guilabel}`Demand` column and the {guilabel}`Quantity` column do *not* match. + +In this case, the {guilabel}`Demand` column lists `10.00`, while the {guilabel}`Quantity` column +lists `0`. + +```{image} manually/manually-delivery-order-form.png +:align: center +:alt: Delivery order form with product availability and reserved quantity. +``` + +To manually reserve the specified quantity of the product for this order, click the +{guilabel}`Check Availability` button at the top of the form. Doing so turns the `Available` status +in the {guilabel}`Product Availability` field green, and changes the number in the +{guilabel}`Quantity` column to match the {guilabel}`Demand` column. + +This is because there is sufficient quantity in stock to reserve for the order. + +Once ready, click {guilabel}`Validate`. + +:::{tip} +Multiple orders with a *Waiting* status can be manually reserved at the same time, and set to +*Ready* status. + +To do that, open the {menuselection}`Inventory` app, which reveals the {guilabel}`Inventory +Overview` page. The {guilabel}`Inventory Overview` page is also accessible by navigating to +{menuselection}`Inventory app --> Overview`. + +From the {guilabel}`Inventory Overview` page, click the {guilabel}`(#) Waiting` button on the +{guilabel}`Delivery Orders` card. + +Then, tick the checkboxes to the left of each desired order, or tick the checkbox in the header +row, to the far-left, to select all orders on the page at once. + +Then, click the {guilabel}`Check Availability` button at the top of the page. + +If the products included in every selected order have enough stock on-hand, this reserves the +products, and moves the order into {guilabel}`Ready` status. Upon receiving a {guilabel}`Ready` +status, the order disappears from the {guilabel}`Waiting` list. + +If there is *not* enough stock on-hand, the order retains its current status, and remains on the +list. + +```{image} manually/manually-check-availability.png +:align: center +:alt: List of orders in waiting status and check availability button. +``` +::: + +:::{seealso} +- {doc}`At confirmation reservation ` +- {doc}`Before scheduled date reservation ` +::: + diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration.md b/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration.md new file mode 100644 index 000000000..87959d2fa --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration.md @@ -0,0 +1,92 @@ +--- +show-content: true +--- + +# Delivery methods + +When activated in Odoo, the *Delivery Methods* setting adds the option of calculating the cost of +shipping on sales orders and e-commerce shopping carts. + +When integrated with a {ref}`third-party carrier `, shipping prices +are calculated based on the carrier's pricing information. + +:::{seealso} +- {ref}`Third-party shipping carrier setup ` +- [Odoo Tutorials: Delivery Prices](https://www.odoo.com/slides/slide/delivery-prices-613?fullscreen=1) +::: + +## Configuration + +To calculate shipping on sales orders and e-commerce, the *Delivery Costs* module must be installed. +To do so, navigate to the {menuselection}`Apps` application from the main Odoo dashboard. + +Then, remove the {guilabel}`Apps` filter, and type in `Delivery Costs` in the {guilabel}`Search...` +bar. After finding the {guilabel}`Delivery Costs` module, click {guilabel}`Activate` to install it. + +```{image} setup_configuration/install-module.png +:alt: Install the Delivery Costs module. +``` + +(inventory-shipping-sales-order)= + +## Add shipping + +Shipping methods can be added to sales orders in the form of delivery products, which appear as +individual line items. First, navigate to the desired sales order by going to {menuselection}`Sales +app --> Orders --> Orders`. + +On the sales order, click the {guilabel}`Add shipping` button, which opens the {guilabel}`Add a +shipping method` pop-up window. Then, choose a {guilabel}`Shipping Method` from the list. + +The {guilabel}`Total Order Weight` is pre-filled based on product weights (that are defined in the +{guilabel}`Inventory` tab for each product form). Edit the field to specify the exact weight, and +then click {guilabel}`Add` to add the shipping method. + +:::{note} +The amount defined in {guilabel}`Total Order Weight` overwrites the total product weights defined +on the product form. +::: + +The shipping cost is added to the *sales order line* as the {guilabel}`Delivery Product` detailed on +the shipping method form. + +```{eval-rst} +.. example:: + `Furniture Delivery`, a delivery product with a fixed rate of `$200`, is added to sales order + `S00088`. + + .. image:: setup_configuration/delivery-product.png + :alt: Show delivery order on the sales order line. +``` + +### Delivery order + +The shipping method added to the sales order is linked to the shipping carrier details on the +delivery order. To add or change the delivery method on the delivery itself, go to the +{guilabel}`Additional Info` tab and modify the {guilabel}`Carrier` field. + +```{image} setup_configuration/delivery-order.png +:alt: Shipping carrier information on the delivery form. +``` + +```{toctree} +:titlesonly: true + +setup_configuration/new_delivery_method +setup_configuration/third_party_shipper +setup_configuration/labels +setup_configuration/bpost +setup_configuration/dhl_credentials +setup_configuration/fedex +setup_configuration/sendcloud_shipping +setup_configuration/starshipit_shipping +setup_configuration/ups_credentials +setup_configuration/zebra +setup_configuration/cancel +setup_configuration/invoicing +setup_configuration/label_type +setup_configuration/multipack +setup_configuration/print_on_validation +setup_configuration/dispatch +``` + diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/bpost.md b/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/bpost.md new file mode 100644 index 000000000..188704bd6 --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/bpost.md @@ -0,0 +1,113 @@ +# Bpost integration + +Set up the *Bpost* shipping connector in Odoo to manage Bpost shipments to clients directly within +Odoo. To configure it, complete these steps: + +1. Create a Bpost account. +2. Get the {ref}`Account ID and passphrase `. +3. {ref}`Set up the shipping method in Odoo `. + +Upon completion, it is possible to calculate the cost of shipping, based on package size and weight, +have the charges applied directly to a Bpost business account, and automatically print Bpost +tracking labels through Odoo. + +:::{seealso} +- {doc}`third_party_shipper` +- {doc}`../setup_configuration` +- {doc}`dhl_credentials` +- {doc}`ups_credentials` +::: + +## Account setup + +To begin, go to the [Bpost website](https://parcel.bpost.be/en/home/business) to create, or log +into, the company's Bpost business account. When creating the Bpost account, have the company's VAT +number and mobile phone number ready. + +Follow the website's steps to complete registration, and sign up for shipping services. Doing so +submits a request to enter a contractual business relationship between the company and Bpost. + +:::{important} +Odoo **cannot** be integrated with [non-business Bpost](https://www.odoo.com/r/Z4wZ) accounts. +::: + +After completing the setup, get the Bpost account ID and passphrase, by navigating to the +{guilabel}`Shipping Manager` menu item. + +(inventory-shipping-receiving-bpost-account)= + +On the {guilabel}`Shipping Manager` page, go to the {guilabel}`Admin` tab, then the +{guilabel}`General Settings` tab, to find the {guilabel}`Account ID` and {guilabel}`Passphrase` +needed to configure Odoo's shipping method. + +```{image} bpost/credentials.png +:alt: In the *Admin* tab, show the Account ID and Passphrase. +``` + +(inventory-shipping-receiving-bpost-method)= + +## Shipping method configuration + +With those necessary credentials, configure the Bpost shipping method in Odoo by going to +{menuselection}`Inventory app --> Configuration --> Shipping Methods`. + +On the {guilabel}`Shipping Methods` page, click {guilabel}`Create`. + +In the {guilabel}`Provider` field, select {guilabel}`Bpost` from the drop-down menu. Doing so +reveals the {guilabel}`Bpost Configuration` tab at the bottom of the form, where the Bpost +credentials can be entered. + +For details on configuring the other fields on the shipping method, such as {guilabel}`Delivery +Product`, refer to the {doc}`Configure third-party carrier ` documentation. + +:::{note} +To generate Bpost {doc}`shipping labels ` through Odoo, ensure the {guilabel}`Integration +Level` option is set to {guilabel}`Get Rate and Create Shipment`. +::: + +In the {guilabel}`Bpost Configuration` tab, complete the following fields: + +- {guilabel}`Bpost Account Number` (required field): enter the company's unique {ref}`account ID + ` from the Bpost website. + +- {guilabel}`Passphrase` (required field): enter the {ref}`passphrase + ` from the Bpost website. + +- {guilabel}`Bpost Delivery Nature`: select either {guilabel}`Domestic` or {guilabel}`International` + shipping services. Choosing {guilabel}`Domestic` shows the {guilabel}`Options` section, while + {guilabel}`International` enables the {guilabel}`Bpost Shipment Type` and {guilabel}`Bpost Parcel + Return Instructions` fields. + +- {guilabel}`Bpost Package Type`: select the type of shipping service from the drop-down menu. + + For [domestic delivery](https://www.odoo.com/r/uOVM), the options are: {guilabel}`bpack 24h + Pro`, {guilabel}`bpack 24h business`, or {guilabel}`bpack Bus`. + + For [international delivery](https://www.odoo.com/r/s6G), the options are: {guilabel}`bpack + World Express Pro`, {guilabel}`bpack World Business`, or {guilabel}`bpack Europe Business`. + +- {guilabel}`Bpost Shipment Type` (required field): for international deliveries, declare the type + of goods in the package as {guilabel}`SAMPLE`, {guilabel}`GIFT`, {guilabel}`GOODS`, + {guilabel}`DOCUMENTS`, or {guilabel}`OTHER`. + +- {guilabel}`Bpost Parcel Return Address`: return address when an international shipment fails to + deliver. Select from the drop-down menu: {guilabel}`Destroy`, {guilabel}`Return to sender by air`, + or {guilabel}`Return to sender by road`. + +- {guilabel}`Label Type`: choose {guilabel}`A6` or {guilabel}`A4` label sizes from the drop-down + menu. + +- {guilabel}`Label Format`: choose {guilabel}`PDF` or {guilabel}`PNG` from the drop-down menu. + +For domestic deliveries, these features are available in the {guilabel}`Options` section: + +- Enable the {guilabel}`Delivery on Saturday` feature to include Saturdays as possible delivery + dates. Depending on the {guilabel}`Bpost Package Type` selected, this option might incur + additional costs to the company. +- Enable the {guilabel}`Generate Return Label` feature to automatically print a return label upon + validating the delivery order. + +```{image} bpost/bpost.png +:alt: Show Bpost shipping method. +``` + diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/cancel.md b/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/cancel.md new file mode 100644 index 000000000..185f13e9d --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/cancel.md @@ -0,0 +1,50 @@ +# How to cancel a shipping request to a shipper? + +## Overview + +Odoo can handle various delivery methods, including third party +shippers. Odoo will be linked with the transportation company tracking +system. + +It will allow you to manage the transport company, the real prices and +the destination. + +You can easily cancel the request made to the carrier system. + +## How to cancel a shipping request? + +- If the delivery order is not **Validated**, then the request hasn't been + made. You can choose to cancel the delivery or to change the + carrier. +- If you have clicked on **Validate**, the request has been made and you + should have received the tracking number and the label. You can + still cancel the request. + Simply click on the **Cancel** button next to the **Carrier Tracking Ref**: + +```{image} cancel/cancel01.png +:align: center +``` + +You will now see that the shipment has been cancelled. + +```{image} cancel/cancel02.png +:align: center +``` + +You can now change the carrier if you wish. + +## How to send a shipping request after cancelling one? + +After cancelling the shipping request, you can change the carrier you +want to use. Confirm it by clicking on the **Send to shipper** button. You +will get a new tracking number and a new label. + +```{image} cancel/cancel03.png +:align: center +``` + +:::{seealso} +- {doc}`invoicing` +- {doc}`multipack` +::: + diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dhl_credentials.md b/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dhl_credentials.md new file mode 100644 index 000000000..a8f6d6dc2 --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dhl_credentials.md @@ -0,0 +1,129 @@ +# DHL integration + +DHL is one of the shipping carriers for which a *shipping connector* is available in Odoo's +**Inventory** app. By enabling the shipping connector in the app's settings, and configuring at +least one *shipping method*, the process of {doc}`calculating shipping rates +<../setup_configuration>` and {doc}`generating shipping labels ` is greatly simplified. + +:::{note} +While a variety of shipping connectors are available for different carriers, this documentation +details the configuration settings specific to integrating DHL. For instructions on configuring +the integration settings common to all shippers, see the documentation on {doc}`third-party +shippers `. +::: + +## Enable DHL shipping connector + +Before creating a DHL shipping method, it is necessary to enable the carrier's shipping connector. +To do so, navigate to {menuselection}`Inventory app --> Configuration --> Settings`. + +Scroll down to the {guilabel}`Shipping Connectors` section, and tick the checkbox next to +{guilabel}`DHL Express Connector`. Finally, click {guilabel}`Save` to apply the changes. + +Once the connector has been enabled, a {icon}`oi-arrow-right` {guilabel}`DHL Shipping Methods` link +appears below. Click the link to open a page showing all shipping methods configured for DHL. + +## Configure DHL shipping method + +After enabling the shipping connector for DHL, shipping methods can be configured for the carrier. +Once configured, a shipping method can be added as a line item to sales orders (SOs), which allows +for automatic computation of shipping rates, and generation of shipping labels. + +To create a new DHL shipping method, navigate to {menuselection}`Inventory app --> Configuration --> +Settings`. In the {guilabel}`Shipping Connectors` section, select the {guilabel}`DHL Shipping +Methods` link below the {guilabel}`DHL Express Connector` checkbox. + +:::{note} +It is also possible to see existing shipping methods for every carrier, by navigating to +{menuselection}`Inventory app --> Configuration --> Shipping Methods`. +::: + +Click {guilabel}`New` to open a blank shipping method form. If a shipping method has already been +created, it can be selected from this screen. + +```{image} dhl_credentials/dhl-form.png +:align: center +:alt: The form for a DHL shipping method. +``` + +### General information + +Begin configuring the shipping method by entering its title in the {guilabel}`Shipping Method` +field. + +In the {guilabel}`Provider` drop-down menu, select the {guilabel}`DHL` option. After doing so, a new +{guilabel}`DHL Configuration` tab appears at the bottom of the form. + +All other fields in this section are identical on the shipping method forms for each shipping +carrier. See the documentation on {doc}`third-party shippers ` for instructions +on how to properly configure them. + +### DHL Configuration + +The {guilabel}`DHL Configuration` tab on the shipping method form is used to connect the user's DHL +account to Odoo, and configure the shipping method's details. + +#### DHL SiteID, password, and account number + +A DHL SiteID, password, and account number are used to link a DHL account with third-party services, +like Odoo's **Inventory** app. The SiteID and password are different credentials than the ones used +to log in to a DHL account. + +To obtain a DHL SiteID, password, and account number, it is necessary to register on the [DHL API +Developer Portal](https://developer.dhl.com/user/register), by filling out the following +information: + +- {guilabel}`First name` +- {guilabel}`Last name` +- {guilabel}`Email address` +- {guilabel}`Username` +- {guilabel}`Company Name` +- {guilabel}`Country` + +After filling out all of the fields, tick the {guilabel}`I have read and accept the terms of use and +the privacy policy` checkbox, and click {guilabel}`Send` to register. + +After registering, a confirmation email is sent to verify the application. Click the link inside the +email to activate the developer portal account, and set a password. + +This email also includes the account number for the developer portal account. Enter the number in +the {guilabel}`DHL Account Number` field on the shipping method form. + +Once the developer portal account has been confirmed, log in to the portal using the username and +password. Click on the user avatar in the top-right corner of the screen to open the user dashboard. + +On the dashboard, click on the {guilabel}`Apps` tab, and select an app. In the +{guilabel}`Credentials` section, click the {guilabel}`Show key` button below the {guilabel}`API Key` +and {guilabel}`API Secret` fields. + +Return to the shipping method form in the Odoo database. Enter the *DHL API Key* in the +{guilabel}`DHL SiteID` field, and the *API Secret* in the {guilabel}`DHL Password` field. + +#### Shipping details + +The rest of the fields in the {guilabel}`DHL Configuration` tab are used to configure the shipping +method itself: + +- {guilabel}`Region`: the region in which the shipping method is used. +- {guilabel}`DHL Product`: the shipping service purchased from DHL (e.g. Express Worldwide). +- {guilabel}`DHL Package Type`: the type of DHL package used for delivery (e.g. DHL Box). +- {guilabel}`Package Weight Unit`: the unit of measure used to display package weight. +- {guilabel}`Package Dimension Unit`: the unit of measure used to display package size. +- {guilabel}`Label Format`: the file format used to generate shipping labels. +- {guilabel}`Label Template`: the paper size used to print shipping labels. + +:::{important} +Before selecting service options for a shipping method, make sure those services are actually +available for the DHL account. Available services depend on the contract negotiated with DHL. +::: + +#### Options + +Additional settings are available in the {guilabel}`Options` section at the bottom of the +{guilabel}`DHL Configuration` tab: + +- {guilabel}`Generate Return Label`: Enable this option to automatically generate a return label + after validating a delivery order. +- {guilabel}`Dutiable Material`: Enable this option if the shipping method is liable to customs or + other duties. + diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dispatch.md b/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dispatch.md new file mode 100644 index 000000000..2f075d89e --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dispatch.md @@ -0,0 +1,268 @@ +# Dispatch management system + +The *dispatch management system* feature in Odoo is used to plan and build shipments. Key features +include: + +- **Load building**: Group products for specific carriers, assign those {doc}`batches + <../picking_methods/batch>` to loading docks, and manage vehicle assignments based on fleet + capacity. This ensures the right products are packed into the appropriate trucks for delivery. +- {doc}`Fleet management <../../../../hr/fleet>`: Track and manage the capacity of in-house + delivery vehicles. + +## Configuration + +To use the dispatch management system, the following setup must be completed: + +1. {ref}`Install ` the **Fleet** application. +2. Configure vehicle {ref}`capacity (volume and weight) + `. +3. Enter vehicle {doc}`car model(s) <../../../../hr/fleet/models>`. +4. Enable {ref}`necessary features ` in the + **Inventory** app. +5. Set up {ref}`vehicles as delivery methods + `. +6. Create {ref}`dock locations `. + +(inventory-shipping-receiving-vehicle-capacity)= + +### Vehicle capacity + +To configure the vehicle capacity, go to {menuselection}`Fleet app --> Configuration --> +Categories`. + +Next, click {guilabel}`New` to add a new category, or click into an existing category to modify it. +In the {guilabel}`Name` field, enter the type of vehicle (e.g., `Pick-up truck`, `Van`, or `Cargo +truck`). Then, enter the vehicle capacity in the {guilabel}`Max Weight` (in kilograms) and +{guilabel}`Max Volume` (in cubic meters) fields. + +```{image} dispatch/categories.png +:alt: Vehicle categories with defined weight and volume. +``` + +:::{note} +The units of measurement for vehicle capacity are assigned at the global level in the +**Settings** app, in the {guilabel}`Units of Measure` section. + +```{image} dispatch/settings.png +:alt: Show units of measure settings. +``` +::: + +:::{seealso} +{ref}`Vehicle category ` +::: + +### Car model + +Configuring a vehicle's car model is required when adding vehicles in Odoo. Ensure the correct +*Category* is selected for a car model. Doing so automatically applies weight and volume capacities +to all vehicles of that type. + +To configure, navigate to {menuselection}`Fleet app --> Configuration --> Models`. + +From the {guilabel}`Models` list, select an existing model, or click {guilabel}`New` in the top-left +corner to create a new model. Then, set the relevant {guilabel}`Category` field to the relevant +vehicle category. + +:::{seealso} +{doc}`Create car model <../../../../hr/fleet/models>` +::: + +(inventory-shipping-receiving-inventory-features)= + +### Inventory settings + +Next, go to {menuselection}`Inventory app --> Configuration --> Settings`, and enable the required +features for dispatch management. + +In the {guilabel}`Operations` section, tick the {guilabel}`Batch, Wave & Cluster Transfers` +checkbox to prepare batches of orders for delivery. + +In the {guilabel}`Shipping` section, tick the {guilabel}`Delivery Methods` and {guilabel}`Dispatch +Management System` checkboxes. Doing so allows specific vehicles to be {ref}`set as carriers +`. + +In the {guilabel}`Warehouse` section, tick the {guilabel}`Storage Locations` checkbox to assign +specific locations in the warehouse as loading zones for delivery trucks. + +Then, once all the configurations are complete, be sure to click {guilabel}`Save`. + +(inventory-shipping-receiving-delivery-method-for-carrier)= + +### Delivery method + +Next, assign each delivery vehicle as a *Carrier* by configuring a delivery method. + +To configure delivery methods, go to {menuselection}`Inventory app --> Configuration --> Delivery +Methods`. Select an existing delivery method, or click {guilabel}`New`. + +:::{seealso} +{doc}`Configure delivery method <../setup_configuration>` +::: + +On the {guilabel}`Delivery Method` form, enter a name for the delivery method. It is recommended to +use identifying information, such as the vehicle description and license plate number (e.g. `Truck +123-ABCD`). + +Since the delivery methods are managed internally, set the {guilabel}`Provider` to either +{guilabel}`Fixed Price` or {guilabel}`Based on Rules`. For more information about how shipping +prices are calculated, refer to the {doc}`Delivery method <../setup_configuration>` article. + +Next, set a {guilabel}`Delivery Product`, which is the product that shows up as the customer's +{ref}`delivery charge ` on the sales order or invoice. + +Optionally, in the {guilabel}`Availability` tab, set the {guilabel}`Countries`, {guilabel}`States`, +or {guilabel}`Zip Prefixes` to limit the range of local delivery. + +:::{figure} dispatch/delivery-method.png +:alt: Delivery method form. + +Example delivery method, with the {guilabel}`Zip Prefixes` set to San Francisco's zip code. +::: + +(inventory-shipping-receiving-docks)= + +### Dock locations + +Each loading dock must have a dedicated location. To create or configure dock locations, go to +{menuselection}`Inventory app --> Configuration --> Locations`. + +Click the desired location, which opens the {guilabel}`Location` form. In the {guilabel}`Additional +Information` section, tick the {guilabel}`Is a Dock Location` checkbox. + +:::{figure} dispatch/dock-location.png +:alt: Location configuration. + +Location configuration page with {guilabel}`Is a Dock Location` checkbox ticked. +::: + +## Build loads + +Once setup is complete, {ref}`assign orders to a carrier +` and {ref}`group them into batches +`. Then, {ref}`configure the batch form +`, as needed. + +To group products, go to the {menuselection}`Inventory app --> Operations --> Deliveries`, which +reveals a list of outgoing deliveries. + +:::{seealso} +Since this article is about a specific use case, explore details about each picking method in +their dedicated articles. + +- {doc}`../picking_methods/batch` +- {doc}`Wave picking <../picking_methods/wave>` +- {doc}`../picking_methods/cluster` +::: + +(inventory-shipping-receiving-assign-carrier)= + +### Carrier assignment + +Reveal the *Carrier* column, if it is not visible by default, by clicking the +{icon}`oi-settings-adjust` {guilabel}`(settings)` icon in the top-right corner, and ticking the +{guilabel}`Carrier` checkbox. + +:::{tip} +Other useful columns to enable can be {guilabel}`Zip` code, {guilabel}`Shipping Weight`, and +{guilabel}`Shipping Volume`. +::: + +Select the delivery orders for the batch by ticking the checkboxes on the left. Next, click into the +line's {guilabel}`Carrier` fields. In the resulting drop-down menu, choose the desired vehicle's +{ref}`delivery method `. A +{guilabel}`Confirmation` pop-up window appears, indicating the number of orders being added to the +batch. Click {guilabel}`Confirm`, and the carrier is updated for all the selected records. + +:::{figure} dispatch/set-carrier.png +:alt: Set carrier. + +The delivery method `Truck 1-MER-001` is set as the {guilabel}`Carrier` for two delivery orders. +::: + +(inventory-shipping-receiving-create-batch)= + +### Create batch + +With the carrier set, begin adding orders to a batch or wave transfer by ticking the checkbox. + +:::{note} +If a delivery order is already assigned to a batch transfer, assigning a batch transfer here does +**not** update it. +::: + +Then, click the {icon}`fa-cog` {guilabel}`Actions` button, and click either {guilabel}`Add to batch` +or {guilabel}`Add to wave`. In the pop-up window, ensure {guilabel}`Add to` is set to {guilabel}`a +new [batch/wave] transfer`, then click {guilabel}`Confirm`. + +:::{figure} dispatch/add-to-wave.png +:alt: Example wave. + +Delivery orders are selected to be grouped into a wave transfer. +::: + +#### Alternative batch creation method + +Another place to create batches is by going to the {menuselection}`Inventory` app, and in the +{guilabel}`Delivery Orders` card, click the {icon}`fa-ellipsis-v` {guilabel}`(three dots)` icon. In +the resulting drop-down menu, click {guilabel}`Prepare batch`. + +:::{note} +The {guilabel}`Transport Management` drop-down menu contains other tools for fleet management: + +- {guilabel}`Manage Batches`: open list of batches +- {guilabel}`Dock Dispatching`: open weekly calendar view of scheduled batch operations +- {guilabel}`Batches by Route`: Kanban view of batches grouped by fulfillment route +- {guilabel}`Calendar`: open hourly calendar view of scheduled operations +- {guilabel}`Statistics`: open pivot table of the batch transfers +::: + +```{image} dispatch/prepare-batch.png +:alt: Show prepare batch option from the Transport Management drop-down menu. +``` + +(inventory-shipping-receiving-batch-form)= + +### Batch form + +On the batch transfer form, fill the following fields out accordingly: + +- {guilabel}`Responsible`: employee assigned to the picking. Leave blank if *any* worker can fulfill + this picking. +- {guilabel}`Operation Type`: from the drop-down menu, select the operation type under which the + picking is categorized. +- {guilabel}`Scheduled Date`: specifies the date by which the {guilabel}`Responsible` person should + complete the transfer to the output location. +- {guilabel}`Dock Location`: select the loading location. +- {guilabel}`Vehicle`: select the vehicle, which will auto-fill {guilabel}`Vehicle Category`. +- {guilabel}`Vehicle Category`: show if the order exceeds the {ref}`vehicle's capacity limits + ` + +```{eval-rst} +.. example:: + The :guilabel:`Volume` bar is grayed out because the capacity has been reached. + + .. image:: dispatch/batch-form.png + :alt: Show batch form. +``` + +#### Prepare delivery route + +To help the driver prepare, click the {guilabel}`Map` button at the top of the batch or wave form to +view delivery destinations on a map. Selecting an individual delivery order pinpoints its location. + +:::{note} +The {guilabel}`Map` button is only visible for transfers with the {guilabel}`In progress` status. +::: + +```{image} dispatch/map.png +:alt: Show map in Odoo, with information of the delivery orders. +``` + +Additionally, use the {guilabel}`View in Google Maps` button to generate a route from the warehouse +to the delivery points. + +```{image} dispatch/google-map.png +:alt: Show Google Map route. +``` + diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/fedex.md b/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/fedex.md new file mode 100644 index 000000000..9a6ff3a78 --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/fedex.md @@ -0,0 +1,169 @@ +# 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. +This is accomplished by enabling the FedEx *shipping connector*, then configuring at least one +*shipping method*. + +:::{note} +This documentation contains configuration details specific to FedEx integration. See the +documentation on {doc}`third-party shippers ` for general shipper +integration instructions. +::: + +## Enable shipping connector + +To enable the shipping connector for FedEx, navigate to {menuselection}`Inventory app --> +Configuration --> Settings`. Scroll down to the {guilabel}`Shipping Connectors` section, and tick +the checkbox next to {guilabel}`FedEx Connector`. + +Finally, click {guilabel}`Save` to save the changes. After doing so, a {icon}`oi-arrow-right` +{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 + +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. + +To enable a shipping 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. + +:::{note} +To see all shipping methods for every shipper with a connector enabled, navigate to +{menuselection}`Inventory app --> Configuration --> Shipping Methods`. +::: + +Select a shipping method to open its form. Alternatively, click {guilabel}`New` to open a blank +form, and configure a new shipping method. + +```{image} fedex/fedex-form.png +:align: center +:alt: The form for a FedEx shipping 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 +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 +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 +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 +(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](https://www.fedex.com/en-us/open-account.html) page, click on {guilabel}`Create Account`, and +follow the instructions. + +#### Developer Key and Meter Number fields + +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. + +To get a developer key and meter number, begin by navigating to FedEx's [Developer Resource Center](https://www.fedex.com/en-us/developer/web-services.html). Then, click on the {guilabel}`FedEx Web +Services` drop-down menu. + +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. + +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. + +After clicking either option, follow the instructions until the {guilabel}`Confirmation` screen is +reached. This screen displays the developer key and meter number. + +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. + +#### Password and Account Number fields + +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. + +To find a FedEx account number, log in to a FedEx account at . Click on the +account holder's name in the top-right corner of the screen, and select {menuselection}`My Profile` +from the drop-down menu. + +On the profile page, click {guilabel}`Account Management` on the left side of the screen. The +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 +form. + +#### Shipping details + +The main section of the {guilabel}`Fedex Configuration` tab includes a number of additional fields +used provide information about the shipping 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}`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}`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 +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. +::: + +#### Options section + +The {guilabel}`Options` section of the {guilabel}`Fedex Configuration` tab provides a few additional +options to further configure the shipping method: + +- {guilabel}`Saturday Delivery`: Tick the checkbox to allow packages shipped with the delivery + method to be delivered on Saturdays. +- {guilabel}`Generate Return Label`: Tick the checkbox to automatically generate a return label upon + validation of a delivery order. +- {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 + +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. + +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, +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. + +Click the {icon}`fa-play` {guilabel}`Production Environment` smart button to return the shipping +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. +::: + diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/invoicing.md b/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/invoicing.md new file mode 100644 index 000000000..d3ca108a5 --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/invoicing.md @@ -0,0 +1,128 @@ +# Shipping cost invoicing + +Invoicing customers for shipping after delivery ensures accurate charges based on real-time shipping +factors like distance, weight, and method. + +In Odoo, shipping costs can be invoiced in two ways: + +1. Agree with the customer on a fixed cost and {ref}`include it in the sale order. + ` +2. {ref}`Invoice shipping costs to the customer post-delivery + `, reflecting the actual expenses incurred by the business. + +## Configuration + +To set prices to delivery methods, go to {menuselection}`Inventory app --> Configuration --> +Settings`. Under the {guilabel}`Shipping` section, enable the {guilabel}`Delivery Methods` feature. +Then, click {guilabel}`Save`. + +```{image} invoicing/enable-delivery.png +:align: center +:alt: Enable the "Delivery Methods" feature in Settings. +``` + +## Add shipping method + +Next, configure the the price of each delivery method by going to {menuselection}`Inventory app --> +Configuration --> Shipping Methods` and click the {guilabel}`Create` button. Doing so opens a form +to provide details about the shipping provider, including: + +- {guilabel}`Shipping Method` (*required*) the name of the delivery method (e.g. `flat-rate + shipping`, `same day delivery`, etc.). + +- {guilabel}`Provider` (*required*): choose the delivery service, like FedEx, if using a + third-party carrier Ensure the integration with the shipping carrier is properly installed and + select the provider from the drop-down menu. + + :::{seealso} + {doc}`../setup_configuration/third_party_shipper` + ::: + +- {guilabel}`Company`: if the shipping method should apply to a specific company, select it from the + drop-down menu. Leave the field blank to apply the method to all companies. + +- {guilabel}`Website`: configure shipping methods for an e-commerce page. Select the applicable + website from the drop-down menu, or leave it blank to apply the method to all web pages. + +- {guilabel}`Delivery Product` (*required*): the product listed on the {ref}`sales order line + ` as the delivery charge. + +- {guilabel}`Free if order amount is above`: checking this box enables free shipping if the customer + spends above the specified amount. + +(inventory-shipping-invoice-so)= + +## Invoice cost on sales order + +To invoice shipping costs on the sales order, before the item is delivered, go to the +{menuselection}`Sales app` and select the desired sales order. + +On the sales order, click the {guilabel}`Add Shipping` button at the bottom-right corner. + +```{image} invoicing/add-shipping.png +:align: center +:alt: Click "Add Shipping" button at the bottom right, near the total. +``` + +In the {guilabel}`Add a shipping method` pop-up window, choose the intended carrier in the +{guilabel}`Shipping Method` field. + +Then, click the {guilabel}`Get Rate` button to the calculate shipping price based on real-time +shipping data Odoo's shipping carrier integration. + +The {guilabel}`Cost` is automatically calculated using the weight of the items in the order. +Finally, click the {guilabel}`Add` button to close the window. + +```{image} invoicing/add-a-shipping-method.png +:align: center +:alt: Calculate shipping by selecting a shipping method. +``` + +(inventory-shipping-invoice-on-so)= + +On the sales order, the delivery product appears in the {guilabel}`Order Lines` tab, with the +{guilabel}`Unit Price` set as the shipping cost calculated in the {guilabel}`Add a shipping method` +pop-up window. + +```{image} invoicing/delivery-product.png +:align: center +:alt: Show delivery product on the sales order line. +``` + +Finally, after the product is delivered, click the {guilabel}`Create invoice` button, and an invoice +is created that includes the shipping cost that was added earlier. + +```{image} invoicing/create-invoice.png +:align: center +:alt: Show "Create Invoice" button. +``` + +Then, click the {guilabel}`Create and View Invoice` button, and a draft invoice is generated, with +the shipping cost included in the {guilabel}`Invoice Lines` tab. + +```{image} invoicing/invoice-line.png +:align: center +:alt: Show delivery product in the invoice line. +``` + +(inventory-shipping-invoice-shipping)= + +## Invoice real shipping costs + +To modify the invoice to reflect the real cost of shipping, follow the steps {ref}`above +` to create an invoice with a delivery product with a {guilabel}`Unit +Price` of zero. + +Then, on a draft invoice, modify the {guilabel}`Unit Price` to reflect the real shipping cost. +Finally, invoice the customer the adjusted shipping cost by clicking {guilabel}`Confirm`. + +```{image} invoicing/invoice-cost.png +:align: center +:alt: Show delivery product on the invoice line. +``` + +:::{seealso} +- {doc}`../setup_configuration/third_party_shipper` +- {doc}`../setup_configuration/labels` +::: + diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/label_type.md b/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/label_type.md new file mode 100644 index 000000000..6e6fa290a --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/label_type.md @@ -0,0 +1,75 @@ +# Change shipping label size + +## Overview + +In Odoo, there are a variety of different types of shipping labels that can be selected for delivery +orders. Depending on the types of shipping packages used, different label sizes may be more +appropriate, and can be configured to fit the package. + +## Configuration + +In the {menuselection}`Inventory` module, go to {menuselection}`Configuration --> Delivery --> +Shipping Methods.` Click on a delivery method to choose it. For the following example, *FedEx +International* will be used. + +```{image} label_type/shipping-options.png +:align: center +:alt: Different shipping methods. +``` + +In the {guilabel}`Configuration` tab, under {guilabel}`Label Type`, choose one of the label types +available. The availability varies depending on the carrier. + +```{image} label_type/label-type-dropdown.png +:align: center +:alt: Select a label type. +``` + +When a sales order with the corresponding shipping company is confirmed and a delivery order is +validated, the shipping label will be automatically created as a PDF and appear in the +{guilabel}`Chatter`. + +## Create a sales order + +In the {menuselection}`Sales` application, click {guilabel}`Create` and select an international +customer. Click {guilabel}`Add A Product` and select an item. Click {guilabel}`Add Shipping`, select +a shipping method, then click {guilabel}`Get Rate`, and finally, click {guilabel}`Add`. + +```{image} label_type/shipping-rate.png +:align: center +:alt: Add a shipping method and rate to a sales order. +``` + +Once the quotation is confirmed by clicking {guilabel}`Confirm`, a {guilabel}`Delivery` smart button +will appear. + +```{image} label_type/shipping-italy-so.png +:align: center +:alt: Delivery order smart button. +``` + +Once the delivery order is validated by clicking {guilabel}`Validate` in the delivery order, the +shipping documents appear in the {guilabel}`Chatter`. + +```{image} label_type/shipping-pdfs.png +:align: center +:alt: Shipping PDF documents. +``` + +## Example labels + +The default {guilabel}`Label Type` is {guilabel}`Paper Letter`. An example of a FedEx letter sized +label is: + +```{image} label_type/full-page-fedex.png +:align: center +:alt: Full page letter size FedEx shipping label. +``` + +For comparison, an example of a FedEx bottom-half label is: + +```{image} label_type/half-page-fedex.png +:align: center +:alt: Half page letter size FedEx shipping label. +``` + diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/labels.md b/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/labels.md new file mode 100644 index 000000000..2c54fcae3 --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/labels.md @@ -0,0 +1,178 @@ +--- +substitutions: + DO: '{abbr}`DO (Delivery Order)`' + SO: '{abbr}`SO (Sales Order)`' +--- + +# Print shipping labels + +Integrate Odoo with {doc}`third-party shipping carriers +<../setup_configuration/third_party_shipper>` to automatically generate shipping labels that +includes prices, destination addresses, tracking numbers, and barcodes. + +:::{seealso} +{ref}`Automatically print shipping carrier labels ` +::: + +## Configuration + +To generate labels for a third-party shipping carrier, first {doc}`install the third-party shipping +connector <../setup_configuration/third_party_shipper>`. Then, configure and activate the +{ref}`delivery method `, being sure to set +the {guilabel}`Integration Level` to {guilabel}`Get Rate and Create Shipment` to generate shipping +labels. Finally, provide the company's {ref}`source address +` and {ref}`product weights +`. + +:::{seealso} +{doc}`../setup_configuration/third_party_shipper` +::: + +```{image} labels/integration-level.png +:align: center +:alt: Set the "Get Rate and Create Shipment" option. +``` + +(inventory-shipping-receiving-picking-config)= + +### Labels for multi-step + +For companies using {doc}`two <../daily_operations/receipts_delivery_two_steps>` or {doc}`three step +delivery <../daily_operations/delivery_three_steps>`, labels can be triggered to print after +validating the picking or packing operation. To do that, go to {menuselection}`Inventory app --> +Configuration --> Operations Types`, and choose the desired operation. + +On the {guilabel}`Operation Type` configuration page, tick the {guilabel}`Print Label` checkbox. +Enabling this feature ensures that the third-party shipping label is printed upon validating this +operation. + +```{eval-rst} +.. example:: + For :doc:`two-step delivery <../daily_operations/receipts_delivery_two_steps>`, where products + are placed directly in packages during picking, companies can print shipping labels during + picking instead of delivery. Odoo allows users to enable the :guilabel:`Print Label` feature on + the `Pick` operation itself to achieve this flexibility. + + .. image:: labels/pick-print-label.png + :align: center + :alt: Enable the "Print Label" feature. +``` + +## Print tracking labels + +Tracking labels are printed when specific operations are validated. By default, validating a +delivery order (DO) generates a tracking label in the chatter. + +:::{note} +For companies using two or three step delivery, refer to the {ref}`printing labels for multi-step +delivery ` section to learn how to print the label +after validating a picking or packing operation. +::: + +When both the *Sales* and *Inventory* apps are installed, begin in the {menuselection}`Sales` app, +and proceed to the desired quotation or sales order (SO). There, and {ref}`add the shipping cost +` to the order. Then, navigate to the linked {{ DO }} — +or another operation type when using multi-step delivery — to validate the operation and print the +label. + +If only the *Inventory* app is installed, create {abbr}`DOs (Delivery Orders)` directly in the +{menuselection}`Inventory` app, {ref}`add the third-party carrier +` in the {guilabel}`Carrier` field, and validate +the {{ DO }}. + +(inventory-shipping-receiving-add-shipping-quote)= + +### Add shipping on quotation + +To generate a tracking label for an order, begin by creating a quotation in {menuselection}`Sales +app --> Orders --> Quotations`, clicking {guilabel}`New`, and filling out the quotation form. Then, +click the {guilabel}`Add Shipping` button in the bottom-right corner of the quotation. + +```{image} labels/add-shipping-button.png +:align: center +:alt: Show the "Add Shipping" button on the quotation. +``` + +In the resulting pop-up window, select the intended carrier from the {guilabel}`Shipping Method` +drop-down menu. The {guilabel}`Total Order Weight` field is automatically populated, based on the +{ref}`weight of products in the order `. Modify this +field to overwrite the predicted weight, and use this weight to estimate the cost of shipping. + +Next, click {guilabel}`Get Rate` to display the shipping cost for the customer, via the third-party +carrier in the {guilabel}`Cost` field. + +:::{important} +If clicking {guilabel}`Get Rate` results in an error, ensure the {ref}`warehouse's address +` and {ref}`weight of products in the +order ` are properly configured. +::: + +Click {guilabel}`Add` to add the cost to the quotation, which is listed as the {ref}`configured +delivery product `. Finally, click +{guilabel}`Confirm` on the quotation, and click the {guilabel}`Delivery` smart button to access the +{{ DO }}. + +```{image} labels/get-rate.png +:align: center +:alt: Show "Get rate" pop-up window. +``` + +:::{tip} +For users who do not have the *Sales* app installed, specify the {guilabel}`Carrier` by going to +the {menuselection}`Inventory` app, navigating to the {{ DO }}, and going to the +{guilabel}`Additional Info` tab. + +```{image} labels/additional-info-tab.png +:align: center +:alt: Show the "Additional Info" tab of a delivery order. +``` +::: + +(inventory-shipping-receiving-validate-print-label)= + +### Validate delivery order + +On a delivery order form, navigate to the {guilabel}`Additional Info` tab to ensure the third-party +shipping carrier has been added to the {guilabel}`Carrier` field. + +:::{important} +If the *Sales* app is not installed, the third-party carrier is set in the {guilabel}`Carrier` +field. +::: + +After the items in the order have been packed, click {guilabel}`Validate` to get the shipping +carrier's tracking number, and generate the shipping label. + +:::{note} +Create or select an existing delivery order by going to the {menuselection}`Inventory` app, and +selecting the {guilabel}`Delivery Orders` card. +::: + +The {guilabel}`Tracking Reference` number is generated in the {guilabel}`Additional Info` tab of the +delivery order. Click the {guilabel}`Tracking` smart button to access the tracking link from the +shipping carrier's website. + +The tracking label is found in PDF format in the chatter. + +```{image} labels/shipping-label.png +:align: center +:alt: Show generated shipping label in the chatter. +``` + +:::{note} +For multi-package shipping, one label is generated per package. Each label appears in the +chatter. +::: + +:::{figure} labels/sample-label.png +:align: center +:alt: Sample label generated from Odoo's shipping connector with FedEx. + +Sample label generated from Odoo's shipping connector with FedEx. +::: + +:::{seealso} +- {doc}`invoicing` +- {doc}`multipack` +::: + diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/multipack.md b/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/multipack.md new file mode 100644 index 000000000..71b6fa951 --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/multipack.md @@ -0,0 +1,122 @@ +# Multi-package shipments + +In some cases, a delivery order with multiple items may need to be shipped in more than one package. +This may be necessary if the items are too large to ship in a single package, or if certain items +cannot be packaged together. Shipping a single delivery order in multiple packages provides +flexibility for how each item is packaged, without the need to create multiple delivery orders. + +## Configuration + +In order to split a delivery order across multiple packages, the *Packages* setting must be enabled. +To do so, navigate to {menuselection}`Inventory --> Configuration --> Settings`, then enable the +checkbox next to {guilabel}`Packages`. Click {guilabel}`Save` to confirm the change. + +```{image} multipack/packages-setting.png +:align: center +:alt: The Packages setting on the Inventory app settings page. +``` + +(inventory-shipping-multiple-packages)= + +## Ship items in multiple packages + +To split items in the same delivery order across multiple packages, begin by navigating to +{menuselection}`Inventory --> Delivery Orders`, then select a delivery order that has multiple +items, a multiple quantity of the same item, or both. + +On the {guilabel}`Operations` tab, select the {guilabel}`⁞≣ (menu)` icon in the line of the product +that will be shipped in the first package. + +```{image} multipack/product-menu-icon.png +:align: center +:alt: The menu icon for a product in a delivery order. +``` + +This makes a {guilabel}`Detailed Operations` pop-up window appear. In the table at the bottom of the +pop-up window, the {guilabel}`Reserved` column shows the total quantity of the product included in +the delivery order. + +If the full quantity will be shipped in the first package, enter the number from the +{guilabel}`Done` column in the {guilabel}`Reserved` column. If less than the full quantity will be +shipped in the first package, enter a smaller number than the one that appears in the +{guilabel}`Reserved` column. Click {guilabel}`Confirm` to confirm the {guilabel}`Done` quantities +and close the pop-up. + +```{image} multipack/detailed-operations.png +:align: center +:alt: The Detailed Operations pop-up for a product in a delivery order. +``` + +Repeat the same steps for every item quantity that is included in the first package. Then, click +{guilabel}`Put In Pack` to create a package with all of the selected items. + +```{image} multipack/put-in-pack.png +:align: center +:alt: The Put In Pack button on a delivery order. +``` + +For the next package, follow the same steps as detailed above, marking the quantity of each item to +be included in the package as {guilabel}`Done` before clicking {guilabel}`Put In Pack` on the +delivery order. Continue doing so until the full quantity of all items are added to a package. + +Finally, after all of the packages have been shipped, click {guilabel}`Validate` to confirm that the +delivery order has been completed. + +:::{tip} +After one or more packages are created, a {guilabel}`Packages` smart button appears in the +top-right corner of the delivery order. Click the {guilabel}`Packages` smart button to go to the +{guilabel}`Packages` page for the delivery order, where each package can be selected to view all +of the items included in it. + +```{image} multipack/packages-smart-button.png +:align: center +:alt: The Packages smart button on a delivery order. +``` +::: + +## Create a backorder for items to be shipped later + +If some items will be shipped at a later date than others, there is no need to put them in a package +until they are ready to be shipped. Instead, create a backorder for the items being shipped later. + +Begin by shipping the items that will be shipped immediately. If they will be shipped in multiple +packages, follow the {ref}`steps above ` to package them as +required. If they will be shipped in a single package, simply mark in the {guilabel}`Done` column +the quantity of each item being shipped, but **do not** click the {guilabel}`Put In Pack` button. + +After all quantities being shipped immediately are marked as {guilabel}`Done`, click the +{guilabel}`Validate` button, and a {guilabel}`Create Backorder?` pop-up window appears. Then, click +the {guilabel}`Create Backorder` button. Doing so confirms the items being shipped immediately and +creates a new delivery order for the items that will be shipped later. + +```{image} multipack/backorder-pop-up.png +:align: center +:alt: The Create Backorder? pop-up window. +``` + +The backorder delivery order will be listed in the chatter of the original delivery order in a +message that reads {guilabel}`The backorder WH/OUT/XXXXX has been created.`. Click on +{guilabel}`WH/OUT/XXXXX` in the message to view the backorder delivery order. + +```{image} multipack/backorder-chatter.png +:align: center +:alt: The backorder delivery order listed in the chatter of the original delivery order. +``` + +The backorder delivery order can also be accessed by navigating to {menuselection}`Inventory`, +clicking the {guilabel}`# Back Orders` button on the {guilabel}`Delivery Orders` card, and selecting +the delivery order. + +```{image} multipack/back-orders-button.png +:align: center +:alt: The Back Orders button on the Delivery Orders card. +``` + +Once the remaining items are ready to be shipped, navigate to the backorder delivery order. The +items can be shipped in a single package by clicking {guilabel}`Validate` and selecting +{guilabel}`Apply` on the {guilabel}`Immediate Transfer?` pop-up window that appears, or shipped in +multiple packages by following the steps detailed in the section above. + +It is also possible to ship out some of the items while creating another backorder for the rest. To +do so, simply follow the same steps used to create the first backorder. + diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/new_delivery_method.md b/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/new_delivery_method.md new file mode 100644 index 000000000..f64c47427 --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/new_delivery_method.md @@ -0,0 +1,205 @@ +# Add a new delivery method + +The *Delivery Methods* setting adds the option of calculating the cost of shipping on sales orders +and e-commerce shopping carts. The shipping cost can then be added to a sales order as a delivery +product, and the shipping details can be added to the delivery order. + +:::{seealso} +{doc}`../setup_configuration` +::: + +## Configuration + +To configure delivery methods, go to {menuselection}`Inventory app --> Configuration --> Delivery +Methods`. + +:::{note} +If the {guilabel}`Delivery Methods` option is not available from the {guilabel}`Configuration` +drop-down menu, verify whether the feature is enabled by following these steps: + +1. Go to {menuselection}`Inventory app --> Configuration --> Settings`. +2. Scroll to the {guilabel}`Shipping` section and enable the {guilabel}`Delivery Methods` feature + by checking the corresponding checkbox. + +```{image} new_delivery_method/enable-delivery.png +:alt: The Delivery Methods feature enabled in the settings. +``` +::: + +(inventory-shipping-receiving-delivery-product)= + +On the {guilabel}`Delivery Methods` page, add a method by clicking {guilabel}`New`. Doing so opens +a form to provide details about the shipping provider, including: + +- {guilabel}`Delivery Method` (*Required field*): the name of the delivery method (e.g. `flat-rate + shipping`, `same day delivery`, etc.). +- {guilabel}`Website`: configure shipping methods for an **eCommerce** page. Select the applicable + website from the drop-down menu, or leave it blank to apply the method to all web pages. +- {guilabel}`Provider` (*Required field*): choose the delivery service, like FedEx, if using a + {ref}`third-party carrier `. Ensure the integration with the + shipping carrier is properly installed and select the provider from the drop-down menu. For more + details on configuring custom shipping methods, such as {ref}`fixed price + ` or {ref}`based on rules ` options, refer to + their respective sections below. +- {guilabel}`Company`: If the shipping method should apply to a specific company, select it from the + drop-down menu. Leave the field blank to apply the method to all companies. +- {guilabel}`Routes`: select the applicable routes to define different delivery methods, such as + standard or express shipping, based on varying lead times. For more information, jump to the + {ref}`Set routes on shipping method ` section. +- {guilabel}`Delivery Product` (*Required field*): the product listed on the {ref}`sales order line + ` as the delivery charge. +- {guilabel}`Free if order amount is above`: checking this box enables free shipping if the customer + spends above the specified amount. +- {guilabel}`Tracking Link`: This option adds a link to the portal so the customer can track their + delivery. When a custom carrier is added in a delivery order, the tracking button is enabled, and + the link directs to the tracking portal with that URL. + +(inventory-shipping-receiving-availability)= + +Use the {guilabel}`Availability` tab to define conditions for the delivery method based on the +order's content or destination: + +- {guilabel}`Countries`: Specify one or more countries where the method is available. +- {guilabel}`Max Weight`: Set a maximum weight; the method is only available for orders below this + limit. +- {guilabel}`Max Volume`: Set a maximum volume; the method is only available for orders below this + limit. +- {guilabel}`Must Have Tags`: The method is available only if at least one product in the order has + one of these tags. +- {guilabel}`Excluded Tags`: The method is unavailable if at least one product in the order has one + of these tags. + +For examples on how to configure specific shipping methods, refer to the sections below. + +(inventory-shipping-fixed)= + +## Fixed price + +To configure a shipping price that is the same for all orders, go to {menuselection}`Inventory app +--> Configuration --> Delivery Methods`. Then, click {guilabel}`New`, and on the shipping method +form, set the {guilabel}`Provider` to the {guilabel}`Fixed Price` option. Selecting this option +makes the {guilabel}`Fixed Price` field become available, which is where the fixed rate shipping +amount is defined. + +To enable free shipping if the amount of the order exceeds a specified amount, check the box +{guilabel}`Free if order amount is above` and fill in the amount. + +```{eval-rst} +.. example:: + To set up `$20` flat-rate shipping that becomes free if the customer spends over `$100`, fill in + the following fields: + + - :guilabel:`Delivery Method`: `Flat-rate shipping` + - :guilabel:`Provider`: :guilabel:`Fixed Price` + - :guilabel:`Fixed Price`: `$20.00` + - :guilabel:`Free if order amount is above`: `$100.00` + - :guilabel:`Delivery Product`: `[SHIP] Flat` + + .. image:: new_delivery_method/new-shipping-method.png + :alt: Example of filling out a shipping method. +``` + +(inventory-shipping-rules)= + +## Based on rules + +To calculate the price of shipping based on pricing rules, set the {guilabel}`Provider` field to the +{guilabel}`Based on Rules` option. Optionally, adjust {guilabel}`Margin on Rate` and +{guilabel}`Additional margin` to include additional shipping costs. + +### Create pricing rules + +Navigate to the {guilabel}`Pricing` tab and click {guilabel}`Add a line`. Doing so opens the +{guilabel}`Create Pricing Rules` window, where the {guilabel}`Condition` related to the product +weight, volume, price, or quantity is compared to a defined amount to calculate the +{guilabel}`Delivery Cost`. + +Once finished, click either {guilabel}`Save & New` to add another rule, or {guilabel}`Save & Close`. + +```{eval-rst} +.. example:: + To charge customers $20 in shipping for orders with five or fewer products, set the + :guilabel:`Condition` to `Quantity <= 5.00`, and the :guilabel:`Delivery Cost` to `$20`. + + .. image:: new_delivery_method/pricing-rule.png + :alt: Display window to add a pricing rule. Set a condition and delivery cost. +``` + +To restrict shipping to specific destinations on the **eCommerce** website, in the shipping method +form, navigate to the {guilabel}`Destination Availability` tab and define the {guilabel}`Countries`, +{guilabel}`States`, and {guilabel}`Zip Prefixes`. Leave these fields empty if all locations apply. + +### Calculate delivery cost + +Shipping cost is the {guilabel}`Delivery cost` specified in the rule that satisfies the +{guilabel}`Condition`, plus any extra charges from the {guilabel}`Margin on rate` and +{guilabel}`Additional margin`. + +$$ +Total = Rule's~Delivery~Cost + (Margin~on~rate \times Rule's~Delivery~Cost) + Additional~margin +$$ + +```{eval-rst} +.. example:: + With the two following rules set up: + + #. If the order contains five or fewer products, shipping is $20 + #. If the order contains more than five products, shipping is $50. + + :guilabel:`Margin on Rate` is `10%` and :guilabel:`Additional margin` is `$9.00`. + + .. image:: new_delivery_method/delivery-cost-example.png + :alt: Show example of "Based on rules" shipping method with margins configured. + + When the first rule is applied, the delivery cost is $31 (20 + (0.1 * 20) + 9). When the second + rule is applied, the delivery cost is $64 (50 + (0.1 * 50) + 9). +``` + +(inventory-shipping-receiving-shipping-route)= + +## Route on shipping method + +Optionally, set different warehouse delivery processes for a shipping method by configuring +different {doc}`routes <../daily_operations/use_routes>` for it. + +```{eval-rst} +.. example:: + Configuring multiple routes per shipping method is helpful for adjusting warehouse delivery + processes based on: + + - speed (e.g., use :doc:`one-step delivery <../daily_operations/receipts_delivery_one_step>` for + express shipping, or :doc:`two-step <../daily_operations/receipts_delivery_two_steps>` for + standard shipping). + - international shipping (e.g. use :doc:`three-step delivery + <../daily_operations/delivery_three_steps>` to prepare documents for customs) + - in-store pickup or home delivery: ship from the central warehouse, or pick from the store's + stock, depending on customer selection. +``` + +To set up routes, go to {menuselection}`Inventory app --> Configuration --> Routes`. Click +{guilabel}`New`, or select the desired route. + +On the route form, in the {guilabel}`Applicable On` section, tick the {guilabel}`Shipping Methods` +checkbox. + +:::{figure} new_delivery_method/shipping-route.png +:alt: Routes form with the Shipping Methods checkbox selected. + +Routes form with the {guilabel}`Shipping Method` checkbox ticked. +::: + +Then, go to {menuselection}`Inventory app --> Configuration --> Delivery Methods`, and select the +desired shipping method. + +On the shipping method form, in the {guilabel}`Routes` field, select the available fulfillment +routes from the drop-down menu. + +:::{note} +If the desired route is not selectable, check that the *Shipping Methods* option is enabled in +the route's *Applicable On* section. +::: + +```{image} new_delivery_method/set-routes.png +:alt: Show set routes on shipping method form. +``` + diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/print_on_validation.md b/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/print_on_validation.md new file mode 100644 index 000000000..0a156faae --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/print_on_validation.md @@ -0,0 +1,353 @@ +# Printable delivery PDFs + +Automatically print delivery-related PDFs documents and labels in Odoo, containing package recipient +details, contents, or handling instructions. + +The following PDFs can be configured to print upon validating an *Inventory* operation (e.g. +receipt, picking, delivery orders, quality checks): + +1. {ref}`Delivery slip ` +2. {ref}`Return slip ` +3. {ref}`Product labels of items in the order ` +4. {ref}`Lot and serial number labels ` +5. {ref}`Carrier labels ` +6. {ref}`Export documents ` +7. {ref}`Package content ` +8. {ref}`Package label ` + +(inventory-shipping-receiving-print-setup)= + +To automatically print these forms, navigate to {menuselection}`Inventory app --> Configuration --> +Operations Types`, and select the desired operation type. + +In the {guilabel}`Hardware` tab, tick each of the desired options available in the {guilabel}`Print +on Validation` section to download the PDF of those selected documents automatically after +validating the {guilabel}`Operation Type`. For details on what each of the checkbox options do, jump +to the related section. + +```{image} print_on_validation/print-on-validation.png +:align: center +:alt: Show the *Print on Validation* option in the "Pick" *Operation Type*. +``` + +(inventory-shipping-receiving-delivery-slip)= + +## Delivery slip + +A *delivery slip* contains recipient and package details, usually placed inside (or attached to) the +package. + +:::{seealso} +- {doc}`Tracking label <../setup_configuration/labels>` +::: + +After {ref}`enabling the Delivery Slip setting ` in the +{guilabel}`Hardware` tab configuration options, clicking {guilabel}`Validate` on the desired +operation type downloads a PDF of the delivery slip. + +The delivery slip shows products, quantities, the delivery order reference number, and the total +order weight. + +```{image} print_on_validation/delivery-slip.png +:align: center +:alt: Example delivery slip. +``` + +(inventory-shipping-receiving-return-slip)= + +## Return slip + +Print a *return slip* to include in a delivery for customer return packages. It identifies the +return, links to the sales order, and includes item details and customer information. It can also +include specific return instructions for the customer. + +After {ref}`enabling the Return Slip setting ` in the +{guilabel}`Hardware` tab configuration options, clicking {guilabel}`Validate` on the desired +operation type downloads a PDF of the return slip. + +The return slip displays the company's return address, along with barcodes for both the order and +the return operation. + +```{image} print_on_validation/return-slip.png +:align: center +:alt: Example return slip. +``` + +(inventory-shipping-receiving-product-labels)= + +## Product labels + +Print *product labels* to affix to items in an order, providing essential information, such as +product name, barcode, and price. + +After navigating to the intended operation type ({menuselection}`Inventory app --> Configuration --> +Operations Types`), in the {guilabel}`Hardware` tab, tick the {guilabel}`Product Labels` option. + +Doing so makes the {guilabel}`Print label as:` drop-down menu visible, where each product label can +be printed as: + +- {guilabel}`2 x 7 with price`: PDF displays product name, barcode, and price, fitting two rows and + seven columns of product labels per page. + + ```{eval-rst} + .. spoiler:: Example 2 x 7 + + .. image:: print_on_validation/two-seven.png + :align: center + :alt: Example 2 x 7 with price. + ``` + +- {guilabel}`4 x 7 with price`: displays product name, barcode, and price, fitting four rows and + seven columns of product labels per page. + + ```{eval-rst} + .. spoiler:: Example 4 x 7 + + .. image:: print_on_validation/four-seven.png + :align: center + :alt: Example 4 x 7 with price. + ``` + +- {guilabel}`4 x 12`: displays product name and barcode. Fits four rows and twelve columns of + product labels per page. + + ```{eval-rst} + .. spoiler:: Example 4 x 12 + + .. image:: print_on_validation/four-twelve.png + :align: center + :alt: Example 4 x 12. + ``` + +- {guilabel}`4 x 12 with price`: displays product name, barcode, and price. Fits four rows and + twelve columns of product labels per page. + +- {guilabel}`ZPL Labels`: prints labels in the Zebra Programming Language (ZPL) containing the + product name and barcode. Readable for Zebra printers to automatically print labels. + +- {guilabel}`ZPL Labels with price`: prints labels in the {abbr}`ZPL (Zebra Programming Language)` + containing the product name, barcode, and price. + +:::{note} +Product labels can be manually printed from any delivery order, by clicking the {guilabel}`Print +Labels` button. +::: + +(inventory-shipping-receiving-lot-sn-labels)= + +## Lot/SN Labels + +Print *lot/SN labels* to affix to items in an order, providing essential information, such as +product name, lot or serial number, and the barcode. + +To automatically print this PDF, navigate to the intended operation type's options page +({menuselection}`Inventory app --> Configuration --> Operations Types`). Then, in the +{guilabel}`Hardware` tab, tick the {guilabel}`Lot/SN Labels` option. + +Doing so makes the {guilabel}`Print label as:` drop-down menu visible, where each product label can +be printed as: + +- {guilabel}`4 x 12 - One per lot/SN`: PDF with labels for unique lot/serial numbers in the order, + including product name, lot/serial number, and barcode. Fits four rows and twelve columns per + page. + + ```{eval-rst} + .. spoiler:: Example 4 x 12 - One per lot/SN + + .. figure:: print_on_validation/four-twelve-lots.png + :align: center + :alt: Order with only one unique set of lot/serial numbers. + + Labels for an order with only one unique set of lot/serial numbers. + ``` + +- {guilabel}`4 x 12 - One per unit`: PDF with labels matching the quantity of items, displaying the + product name, lot/serial number, and barcode. Fits four rows and twelve columns per page. + +- {guilabel}`ZPL Labels - One per lot/SN`: prints labels in {abbr}`ZPL (Zebra Programming + Language)`, containing the product name, lot/serial number, and barcode. + +- {guilabel}`ZPL Labels - One per unit`: prints labels with the quantity of items in {abbr}`ZPL + (Zebra Programming Language)`, containing the product name, lot/serial number, and barcode. + +(inventory-shipping-receiving-carrier-labels)= + +## Carrier labels + +To automatically print a *carrier label* with the recipient address, tracking number, and carrier +details for specific third-party shipping carriers, complete the following setup: + +1. Tick the {guilabel}`Carrier Labels` checkbox in the {ref}`operation type settings + `. +2. {doc}`Connect a printer <../../../../general/iot/devices/printer>` to Odoo's *IoT* app. +3. {ref}`Assign the carrier label to the printer `. +4. Configure the shipping method's {ref}`label type `. + +(inventory-shipping-receiving-assign-printer)= + +### Assign printer + +Refer to the {doc}`Connect a printer <../../../../general/iot/devices/printer>` documentation for +details on connecting a printer to Odoo's *IoT* app. Upon completion, assign the carrier label to +the printer, by navigating to {menuselection}`IoT app --> Devices`, and selecting the desired +printer. + +```{image} print_on_validation/select-printer.png +:align: center +:alt: Show a list of IoT devices. +``` + +In the printer configuration form, go to the {guilabel}`Printer Reports` tab to configure the types +of documents the printer automatically prints. Click {guilabel}`Add a line` to open the +{guilabel}`Add: Reports` pop-up window. In the {guilabel}`Search...` bar, type `Shipping`, and +select {guilabel}`Shipping Labels`. + +:::{note} +The {guilabel}`Shipping Documents` report is for {ref}`export documents +`. +::: + +```{image} print_on_validation/printer-report.png +:align: center +:alt: Show carrier label report added to the *Printer Reports*. +``` + +After adding the {guilabel}`Shipping Labels` report in the {guilabel}`Printer Reports` tab, ensure +the {guilabel}`Report Type` matches the IoT-connected printer's type. + +- For laser printers, set the {guilabel}`Report Type` to {guilabel}`PDF`. +- For Zebra printers, set the {guilabel}`Report Type` to {guilabel}`Text`. + +(inventory-shipping-receiving-label-type)= + +### Shipping carrier label type + +Next, complete the setup for the {doc}`third-party shipping connector +<../setup_configuration/third_party_shipper>`. After that, go to {menuselection}`Inventory app --> +Configuration --> Shipping Methods`, and select the desired shipping method. + +On the shipping method configuration form, in the {guilabel}`[carrier name] Configuration` tab, +ensure the {guilabel}`Label Format` matches the {ref}`report type assigned earlier +`: + +- For laser printers, set the {guilabel}`Label Format` to {guilabel}`PDF`. +- For Zebra printers, set the {guilabel}`Label Format` to {guilabel}`ZPL2`. + +```{image} print_on_validation/label-type.png +:align: center +:alt: Show the *Label Type* field on FedEx's shipping method configuration page. +``` + +### Example carrier label + +After validating the operation, the carrier label is generated in the chatter, and printed using the +IoT-connected printer. + +```{eval-rst} +.. spoiler:: Example carrier label + + .. figure:: print_on_validation/fedex-carrier-label.png + :align: center + :alt: Show an example carrier label for FedEx. + + Carrier label for FedEx, containing the recipient address, tracking number, barcode, and + other shipping information. +``` + +:::{seealso} +{doc}`Print carrier labels <../setup_configuration/labels>` +::: + +(inventory-shipping-receiving-export-doc)= + +## Export document + +An *export document*, required by customs to ship packages from one country to another, can be +automatically printed in Odoo by following these steps: + +1. Tick the {guilabel}`Export Documents` checkbox in the {ref}`operation type settings + `. +2. {doc}`Connect a printer <../../../../general/iot/devices/printer>` to Odoo's *IoT* app. +3. Assign the export document to the printer. + +### Assign printer + +Similar to the {ref}`printer assignment instructions for carrier labels +`, after connecting a compatible printer to the Odoo +*IoT* app, go to {menuselection}`IoT app --> Devices`, and select the desired printer. + +In the printer configuration form, go to the {guilabel}`Printer Reports` tab, and click +{guilabel}`Add a line`. In the {guilabel}`Add: Reports` pop-up window that appears, add the +{guilabel}`Shipping Documents` report to assign the export document to the printer. + +```{eval-rst} +.. spoiler:: Example export document + + .. figure:: print_on_validation/export-doc.png + :align: center + :alt: Export document for a shipment from the USA to Belgium. + + Export document for a shipment from the USA to Belgium. +``` + +(inventory-shipping-receiving-package-content)= + +## Package content + +A *package content* PDF includes the package's barcode, packed date, along with a list of contained +products and quantities. + +To print this form automatically, go to {menuselection}`Inventory app --> Configuration --> +Operation Types`, and select the desired operation type. Then, go to the {guilabel}`Hardware` tab, +and tick the {guilabel}`Package Contents` checkbox. + +:::{important} +If the option is not available, enable the {doc}`Packages +<../../product_management/configure/package>` feature, by going to {menuselection}`Inventory app +--> Configuration --> Settings`, ticking the {guilabel}`Packages` checkbox, and clicking +{guilabel}`Save`. +::: + +After enabling the feature in the {guilabel}`Hardware` tab, validating the operation prints a PDF of +the package contents. + +```{eval-rst} +.. spoiler:: Example package content PDF + + .. figure:: print_on_validation/package-content.png + :align: center + :alt: Package contents form showing the package contents, barcode, and pack date. + + Package contents showing the package contents, barcode, and pack date. +``` + +(inventory-shipping-receiving-package-label)= + +## Package label + +A *package label* that shows the package's barcode and pack date can be configured to print upon +clicking the *Put in Pack* button. + +:::{important} +The {guilabel}`Put in Pack` button is available **only** when the {doc}`Packages +<../../product_management/configure/package>` feature is enabled in +{menuselection}`Inventory app --> Configuration --> Settings`. + +After it is enabled, the {guilabel}`Put in Pack` button is available on all inventory operations +(e.g. receipt, pickings, internal transfers, delivery orders, etc.). +::: + +To automatically print the package label when the {guilabel}`Put in Pack` button is clicked, go to +{menuselection}`Inventory app --> Configuration --> Operation Types`. Select the desired operation +type, and tick the {guilabel}`Package Label` checkbox in the {guilabel}`Hardware` tab. Labels can be +printed in {guilabel}`PDF` or {guilabel}`ZPL` file formats, as defined in the {guilabel}`Print label +as` field. + +```{eval-rst} +.. spoiler:: Example of package barcode + + .. image:: print_on_validation/package-barcode.png + :align: center + :alt: PDF of package barcode and package date. +``` + diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/sendcloud_shipping.md b/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/sendcloud_shipping.md new file mode 100644 index 000000000..24be8052a --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/sendcloud_shipping.md @@ -0,0 +1,321 @@ +# Sendcloud integration + +Sendcloud is a shipping service aggregator that facilitates the integration of European shipping +carriers with Odoo. Once integrated, users can select shipping carriers on inventory operations in +their Odoo database. + +:::{seealso} +[Sendcloud integration documentation](https://support.sendcloud.com/hc/en-us/articles/360059470491-Odoo-integration) +::: + +## Setup in Sendcloud + +### Create an account and activate carriers + +To get started, go to [Sendcloud's platform](https://www.sendcloud.com) to configure the account +and generate the connector credentials. Log in with the Sendcloud account, or create a new one if +needed. + +:::{note} +For new account creation, Sendcloud will ask for a {abbr}`VAT (Value-Added Tax Identification)` +number or {abbr}`EORI (Economic Operators' Registration and Identification)` number. After +completing the account setup, activate (or deactivate) the shipping carriers that will be used +in the Odoo database. +::: + +:::{important} +Odoo integration of Sendcloud works on free Sendcloud plans *only* if a bank account is linked, +since Sendcloud won't ship for free. To use shipping rules, or individual custom carrier +contacts, a paid plan of Sendcloud is **required**. +::: + +(inventory-shipping-receiving-sendcloud-warehouse-config)= + +### Warehouse configuration + +Once logged into the Sendcloud account, navigate to {menuselection}`Settings --> Shipping --> +Addresses`, and fill in the field for {guilabel}`Warehouse address`. + +```{image} sendcloud_shipping/settings-shipping.png +:align: center +:alt: Adding addresses in the Sendcloud settings. +``` + +To allow Sendcloud to process returns as well, a {guilabel}`Return Address` is required. Under the +{guilabel}`Miscellaneous section`, there is a field called {guilabel}`Address Name (optional)`. The +Odoo warehouse name should be entered here, and the characters should be exactly the same. + +```{eval-rst} +.. example:: + + | **SendClould configuration** + | :guilabel:`Miscellaneous` + | :guilabel:`Address Name (optional)`: `Warehouse #1` + | :guilabel:`Brand`: `Default` + + | **Odoo warehouse configuration** + | :guilabel:`Warehouse`: `Warehouse #1` + | :guilabel:`Short Name`: `WH` + | :guilabel:`Company`: `My company (San Francisco)` + | :guilabel:`Address`: `My Company (San Francisco)` + + Notice how the inputs for the :guilabel:`Warehouse` field, for both the Odoo configuration and + the Sendcloud configuration, are the exact same. +``` + +### Generate Sendcloud credentials + +In the Sendcloud account, navigate to {menuselection}`Settings --> Integrations` in the menu on the +right. Next, search for {guilabel}`Odoo Native`. Then, click on {guilabel}`Connect`. + +After clicking on {guilabel}`Connect`, the page redirects to the {guilabel}`Sendcloud API` settings +page, where the {guilabel}`Public and Secret Keys` are produced. The next step is to name the +{guilabel}`Integration`. The naming convention is as follows: `Odoo CompanyName`, with the user's +company name replacing `CompanyName` (e.g. `Odoo StealthyWood`). + +Then, check the box next to {guilabel}`Service Points` and select the shipping services for this +integration. After saving, the {guilabel}`Public and Secret Keys` are generated. + +```{image} sendcloud_shipping/public-secret-keys.png +:align: center +:alt: Configuring the Sendcloud integration and receiving the credentials. +``` + +## Setup in Odoo + +To ensure seamless Sendcloud integration with Odoo, {ref}`install +` and {ref}`link +` the Sendcloud shipping connector to the +Sendcloud account. Then, {ref}`configure Odoo fields +`, so Sendcloud can accurately pull shipping +data to generate labels. + +(inventory-shipping-receiving-sendcloud-module)= + +### Install Sendcloud shipping module + +After the Sendcloud account is set up and configured, it's time to configure the Odoo database. To +get started, go to Odoo's {guilabel}`Apps` module, search for the `Sendcloud Shipping` integration, +and install it. + +```{image} sendcloud_shipping/sendcloud-mod.png +:align: center +:alt: Sendcloud Shipping module in the Odoo Apps module. +``` + +(inventory-shipping-receiving-link-sendcloud-module)= + +### Sendcloud shipping connector configuration + +Once installed, activate the {guilabel}`Sendcloud Shipping` module in {menuselection}`Inventory --> +Configuration --> Settings`. The {guilabel}`Sendcloud Connector` setting is found under the +{guilabel}`Shipping Connectors` section. + +After activating the {guilabel}`Sendcloud Connector`, click on the {guilabel}`Sendcloud Shipping +Methods` link below the listed connector. Once on the {guilabel}`Shipping Methods` page, click +{guilabel}`Create`. + +:::{tip} +{guilabel}`Shipping Methods` can also be accessed by going to {menuselection}`Inventory --> +Configuration --> Delivery --> Shipping Methods`. +::: + +Fill out the following fields in the {guilabel}`New Shipping Method` form: + +- {guilabel}`Shipping Method`: type `Sendcloud DPD`. +- {guilabel}`Provider`: select {guilabel}`Sendcloud` from the drop-down menu. +- {guilabel}`Delivery Product`: set the product that was configured for this shipping method or + create a new product. +- In the {guilabel}`SendCloud Configuration` tab, enter the {guilabel}`Sendcloud Public Key`. +- In the {guilabel}`SendCloud Configuration` tab, enter the {guilabel}`Sendcloud Secret Key`. +- Manually {guilabel}`Save` the form by clicking the cloud icon next to the {guilabel}`Shipping + Methods / New` breadcrumbs. + +After configuring and saving the form, follow these steps to load the shipping products: + +- In the {guilabel}`SendCloud Configuration` tab of the {guilabel}`New Shipping Method` form, click + on the {guilabel}`Load your SendCloud shipping products` link. +- Select the shipping products the company would like to use for deliveries and returns. +- Click {guilabel}`Select`. + +```{eval-rst} +.. example:: + Sample Sendcloud shipping products configured in Odoo: + + | :guilabel:`DELIVERY` + | :guilabel:`Shipping Product`: `DPD Home 0-31.5kg` + | :guilabel:`Carrier`: `DPD` + | :guilabel:`Minimum Weight`: `0.00` + | :guilabel:`Maximum Weight`: `31.50` + + :guilabel:`Countries`: `Austria` `Belgium` `Bosnia` `Herzegovina` `Bulgaria` `Croatia` `Czech` + `Republic` `Denmark` `Estonia` `Finland` `France` `Germany` `Greece` `Hungary` `Iceland` + `Ireland` `Italy` `Latvia` `Liechtenstein` `Lithuania` `Luxembourg` `Monaco` `Netherlands` + `Norway` `Poland` `Portugal` `Romania` `Serbia` `Slovakia` `Slovenia` `Spain` `Sweden` + `Switzerland` + + | :guilabel:`RETURN` + | :guilabel:`Return Shipping Product`: `DPD Return 0-20kg` + | :guilabel:`Return Carrier`: `DPD` + | :guilabel:`Return Minimum Weight`: `0.00` + | :guilabel:`Return Maximum Weight`: `20.00` + | :guilabel:`Return Countries`: `Belgium` `Netherlands` +``` + +```{image} sendcloud_shipping/sendcloud-example.png +:align: center +:alt: Example of shipping products configured in Odoo. +``` + +:::{tip} +Sendcloud does not provide test keys when a company tests the sending of a package in Odoo. This +means if a package is created, the configured Sendcloud account will be charged, unless the +associated package is cancelled within 24 hours of creation. + +Odoo has a built-in layer of protection against unwanted charges when using test environments. +Within a test environment, if a shipping method is used to create labels, then those labels are +immediately cancelled after the creation — this occurs automatically. The test and production +environment settings can be toggled back and forth from their respective smart buttons. +::: + +(inventory-shipping-receiving-sendcloud-shipping-info)= + +### Shipping information + +To use Sendcloud to generate shipping labels, the following information **must** be filled out +accurately and completely in Odoo: + +1. **Customer information**: when creating a quotation, ensure the selected {guilabel}`Customer` has + a valid phone number, email address, and shipping address. + + To verify, select the {guilabel}`Customer` field to open their contact page. Here, add their + shipping address in the {guilabel}`Contact` field, along with their {guilabel}`Mobile` number and + {guilabel}`Email` address. + +2. **Product weight**: ensure all products in an order have a specified {guilabel}`Weight` in the + {guilabel}`Inventory` tab of their product form. Refer to the {ref}`Product weight section + ` of this article for detailed instructions. + +3. **Warehouse address**: ensure the warehouse name and address in Odoo match the {ref}`previously + defined warehouse ` in the Sendcloud + setup. For details on warehouse configuration in Odoo, refer to the {ref}`warehouse configuration + section ` of the third-party shipping + documentation. + +## Generate labels with Sendcloud + +When creating a quotation in Odoo, add shipping and a {guilabel}`Sendcloud shipping product`. Then, +{guilabel}`Validate` the delivery. Shipping label documents are automatically generated in the +chatter, which include the following: + +1. {guilabel}`Shipping label(s)` depending on the number of packages. +2. {guilabel}`Return label(s)` if the Sendcloud connector is configured for returns. +3. {guilabel}`Customs document(s)` should the destination country require them. + +Additionally, the tracking number is now available. + +:::{important} +When return labels are created, Sendcloud automatically charges the configured Sendcloud +account. +::: + +### Shipping rules + +Optionally, create shipping rules to automatically generate shipping labels tailored to different +product needs. For example, a shipping rule can be created for customers shipping expensive jewelry +items to purchase insurance. + +:::{note} +Shipping rules do **not** affect {ref}`shipping rate calculations +`, and are only used to improve the process of +{doc}`generating shipping labels `. +::: + +To use shipping rules, navigate to {menuselection}`Inventory app --> Configuration --> Delivery: +Shipping Methods`, and select the intended `Sendcloud` shipping method. + +Under the {guilabel}`Sendcloud Configuration` tab, in the {guilabel}`OPTIONS` section, choose the +kind of shipments the shipping rules apply to, via the {guilabel}`Use Sendcloud shipping rules` +field. + +From here, choose either: {guilabel}`Shipping` to customers, {guilabel}`Returns` from customers, or +{guilabel}`Both`. + +```{image} sendcloud_shipping/enable-shipping-rules.png +:align: center +:alt: Use Shipping Rules field. +``` + +Then, in the Sendcloud website, navigate to {menuselection}`Settings --> Shipping rules`. Create a +new shipping rule by clicking {guilabel}`Create New`. + +In the {guilabel}`Actions` section, set a {guilabel}`Condition` to determine when the rule applies. +Then, configure what to do when packages meet the condition. + +:::{seealso} +[Create shipping rules on Sendcloud](https://support.sendcloud.com/hc/en-us/articles/10274470454292-How-to-create-shipping-rules#examples-smart-shipping-rules) +::: + +## FAQ + +### Shipment is too heavy + +If the shipment is too heavy for the Sendcloud service that is configured, then the weight is split +to simulate multiple packages. Products will need to be put in different {guilabel}`Packages` to +{guilabel}`Validate` the transfer and generate labels. + +{guilabel}`Rules` can also be set up in Sendcloud to use other shipping methods when the weight is +too heavy. However, note that these rules will not apply to the shipping price calculation on the +calculation on the sales order. + +### Personal carrier contract + +Use custom prices from a direct carrier contract, via CSV upload, by first logging into Sendcloud, +navigating to {menuselection}`Settings --> Carriers --> My contracts`, and then selecting the +intended contract. + +```{image} sendcloud_shipping/contracts.png +:align: center +:alt: Navigate to the contracts section in Sendcloud. +``` + +Under the {guilabel}`Contract prices` section, click {guilabel}`Download CSV` and fill out the +contract prices in the {guilabel}`price` column of the CSV file template. + +:::{warning} +Ensure the CSV file includes the correct prices to avoid any inaccuracies. +::: + +```{image} sendcloud_shipping/price-csv.png +:align: center +:alt: Show sample contract CSV from Sendcloud, highlighting the price column. +``` + +{guilabel}`Upload` the completed CSV file to Sendcloud, then click {guilabel}`Save these prices`. + +:::{seealso} +[Sendcloud: How to upload contract prices with carriers](https://support.sendcloud.com/hc/en-us/articles/5163547066004) +::: + +### Measuring volumetric weight + +Many carriers have several measures for weight. There is the actual weight of the products in the +parcel, and there is the *volumetric weight* ({dfn}`Volumetric weight is the volume that a package +occupies when in transit. In other words it is the physical size of a package`). + +:::{tip} +Check to see if selected carrier(s) already have defined formulas to compute the volumetric +weight. +::: + +:::{seealso} +[Sendcloud: How to calculate & automate parcel volumetric weight](https://support.sendcloud.com/hc/en-us/articles/360059644051-How-to-calculate-automate-parcel-volumetric-weight) +::: + +### Unable to calculate shipping rate + +First, verify that the product being shipped has a weight that is supported by the selected shipping +method. If this is set, then verify that the destination country (from the customer address) is +supported by the carrier. The country of origin (warehouse address) should also be supported by the +carrier. + diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/starshipit_shipping.md b/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/starshipit_shipping.md new file mode 100644 index 000000000..03024dc1b --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/starshipit_shipping.md @@ -0,0 +1,248 @@ +# Starshipit shipping + +Starshipit is a shipping service operator that facilitates the integration of Australasian +shipping couriers with Odoo. Once integrated, users can create shipping methods that will +automatically get rates from specific couriers (such as Australia Post, NZ Post, DHL,...) +based on predefined conditions. + +:::{seealso} +- {doc}`Automatically calculate shipping <../setup_configuration>` +- {doc}`Integrate other third-party couriers ` +::: + +## Setup in Starshipit + +### Create an account and activate couriers + +To get started, go to [Starshipit's platform](https://starshipit.com/) to configure the account +and generate the connector credentials. Log in with the Starshipit account, or create a new one if +needed. + +### Pickup address configuration + +Once logged into the Starshipit account, navigate to {menuselection}`Settings --> Pickup address`, +and fill in the {guilabel}`Pickup address`. Ensure this field matches the warehouse address. + +```{image} starshipit_shipping/starshipit-settings-address.png +:align: center +:alt: Adding addresses in the Starshipit settings. +``` + +### Couriers configuration + +To integrate with third-party couriers, navigate to {menuselection}`Settings --> Couriers`, and +select {guilabel}`Couriers`. + +```{image} starshipit_shipping/starshipit-settings-couriers.png +:align: center +:alt: Adding addresses in the Starshipit settings. +``` + +:::{tip} +For details on integrating with different couriers, refer to [Starshipit's support center](https://support.starshipit.com/hc/en-us/). +::: + +### Checkout rates + +To configure shipping rate calculations, navigate to {menuselection}`Settings --> Checkout rates`. +The selected delivery costs are automatically applied in Odoo when calculating shipping costs. + +```{image} starshipit_shipping/starshipit-checkout-rate.png +:align: center +:alt: Checkout rates in the Starshipit settings. +``` + +### Starshipit API key + +Configure shipping rules to assign the correct shipping methods to orders based on specific +conditions. + +To create a rule, go to {menuselection}`Settings --> Rules` and click {guilabel}`Add a new rule`. + +While there are multiple ways to configure rules, it is recommended to set: + +1. {guilabel}`Condition` to {guilabel}`Contains` +2. {guilabel}`Value` to the {guilabel}`product code` +3. {guilabel}`Action` to {guilabel}`Set Courier & Product Code` + +```{image} starshipit_shipping/starshipit-rules.png +:align: center +:alt: Shipping rules in the Starshipit settings. +``` + +(inventory-shipping-receiving-star-api)= + +### Finding Starshipit API credentials + +In the Starshipit account, navigate to {menuselection}`Settings --> API` in the side menu. +This page contains the {abbr}`API (Application Programming Interface)` keys needed to connect to +Odoo. + +```{image} starshipit_shipping/starshipit-settings-api.png +:align: center +:alt: Finding the Starshipit API keys. +``` + +## Setup in Odoo + +### Install + +After the Starshipit account is set up, integrate it with the Odoo database. To do that, go to +Odoo's {guilabel}`Apps` module, search for the {guilabel}`Starshipit Shipping` module, and click +{guilabel}`Activate` to install it. + +```{image} starshipit_shipping/starshipit-app.png +:align: center +:alt: Starshipit Shipping module in the Odoo Apps module. +``` + +### Configuration + +Once installed, activate the feature by going to {menuselection}`Inventory --> Configuration --> +Settings`. Under the {guilabel}`Shipping Connectors` section, activate the {guilabel}`Starshipit +Connector` option. + +After activating {guilabel}`Starshipit Connector`, click the {guilabel}`Starshipit Shipping Methods` +link below the listed connector. Once on the {guilabel}`Shipping Methods` page, click +{guilabel}`Create`. + +:::{tip} +{guilabel}`Shipping Methods` can also be accessed by going to {menuselection}`Inventory --> +Configuration --> Delivery --> Shipping Methods`. +::: + +Configure Starshipit in Odoo by filling out the fields on the {guilabel}`Shipping Methods` form as +follows: + +- {guilabel}`Shipping Method`: type `Starshipit`. + +- {guilabel}`Provider`: select {guilabel}`Starshipit` from the drop-down menu. + +- {guilabel}`Delivery Product`: assign or create the delivery product that will appear on the sales + order line when the cost of shipping is computed. + + :::{note} + The fields discussed in this section are specific to configuring Starshipit. For more information + about the other fields, refer to {doc}`../setup_configuration`. + ::: + +In the {guilabel}`Starshipit Configuration` tab, fill out these fields: + +- {guilabel}`Starshipit API Key`: enter the {abbr}`API (Application Programming Interface)` key + {ref}`obtained from Starshipit `. +- {guilabel}`Starshipit Subscription Key`: enter the subscription key obtained from the same place + as the {ref}`API key `. +- {guilabel}`Origin Address`: Enter the address where products are shipped from. This field is + crucial for calculating shipping rates and {ref}`generating shipping labels + `. +- {guilabel}`Default Package Type`: Set a default package type to include the weight of the empty + package when automatically calculating shipping rates. + +:::{important} +To set a default package type, the *Packages* feature **must** be enabled in +{menuselection}`Inventory --> Configuration --> Settings`. +::: + +- Manually {guilabel}`Save` the form by clicking the cloud icon next to the {guilabel}`Shipping + Methods / New` breadcrumbs. + +To load the newly configured shipping products, click the {guilabel}`Select a service linked to the +Starshipit account` link at the bottom of the {guilabel}`Starshipit Configuration` tab. + +Doing so opens the {guilabel}`Choose Starshipit Shipping Service` pop-up window. In the +{guilabel}`Delivery Service` field, choose the desired shipping service for deliveries and returns +from the drop-down menu. Finally, click {guilabel}`Confirm`. + +The chosen delivery service will populate in the {guilabel}`Service Name` field. + +```{eval-rst} +.. example:: + Sample of a Starshipit shipping product configured in Odoo: + + | :guilabel:`Sendle: Sendle drop off` + | :guilabel:`Shipping Product`: `Sendle Delivery` + | :guilabel:`Starshipit Service Code`: `STANDARD-DROPOFF` +``` + +```{image} starshipit_shipping/starshipit-configuration.png +:align: center +:alt: Example of shipping products configured in Odoo. +``` + +:::{tip} +Starshipit does not provide test keys when a company tests the sending of a package in Odoo. This +means that if a package is created, the account may be charged. + +Odoo has a built-in layer of protection against unwanted charges when using test environments. +Within a test environment, if a shipping method is used to create labels, then those labels are +immediately cancelled after creation — this occurs automatically. Please note that depending on +the shipping provider being used, the account might be charged for printing label, unless the +order is cancelled manually on the couriers’s portal. + +Switch between the test and production environment by clicking the {guilabel}`Environment` smart +button at the top of the shipping method form. +::: + +(inventory-shipping-receiving-star-label)= + +### Generate a label with Starshipit + +When creating a quotation in Odoo, add the Starshipit shipping method by clicking the {guilabel}`Add +shipping` button. + +In the {guilabel}`Add a shipping method` pop-up window, select Starshipit in the {guilabel}`Shipping +Method` field. + +Calculate the shipping rate by clicking {guilabel}`Get rate`. +Finally, click {guilabel}`Add` to include the cost of shipping to the sales order line, labeled as +the *delivery product*. + +:::{note} +Automatically calculate shipping costs for Starshipit in **both** Odoo *Sales* and *eCommerce* +applications. +::: + +Then, {guilabel}`Validate` the delivery. Shipping label documents are automatically generated in the +chatter, which includes the following: + +1. {guilabel}`Shipping label(s)` depending on the number of packages. +2. {guilabel}`Tracking number(s)` if the selected courier supports it. +3. {guilabel}`Return label(s)` if the Starshipit connector is configured for returns. + +```{image} starshipit_shipping/starshipit-shipping.png +:align: center +:alt: Example of a shipped order in Odoo. +``` + +:::{important} +Package weight in Odoo is calculated by adding the weights of the products plus the empty package +saved in the database. Ensure the correct shipping option is selected, as the package weight is +not automatically verified. + +Verify the destination address, as Starshipit checks it when the order is created. + +Finally, some couriers may require other information, such as an email address or phone number. +Please ensure that all necessary information are set upon sending a shipping order. +::: + +### Returns + +Starshipit allows returns with the following couriers: +: - Australia Post eParcel + - TNT + - Couriers Please + - Aramex + - StarTrack + - DHL Express + - NZ Post Domestic + +This can be done by clicking the {guilabel}`Return` smart button on the intended delivery order. +If the selected courier supports returns, the {guilabel}`Print Return Label` button will be +available. + +### Cancellations + +If a delivery order is cancelled in Odoo, it will be automatically archived in Starshipit. +However, the cancellation will not be sent to the courier itself, so make sure to log onto the +courier's platform to handle the cancellation manually. + diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/third_party_shipper.md b/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/third_party_shipper.md new file mode 100644 index 000000000..8a69666e7 --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/third_party_shipper.md @@ -0,0 +1,372 @@ +--- +substitutions: + DO: '{abbr}`DO (Delivery Order)`' + SO: '{abbr}`SO (Sales Order)`' +--- + +# Third-party shipping carriers + +(inventory-shipping-third-party)= + +Users can link third-party shipping carriers to Odoo databases, in order to verify carriers' +delivery to specific addresses, {doc}`automatically calculate shipping costs +<../setup_configuration>`, and {doc}`generate shipping labels `. + +In Odoo, shipping carriers can be applied to a sales order (SO), invoice, or delivery order. For +tips on resolving common issues when configuring shipping connectors, skip to the +{ref}`Troubleshooting ` section. + +:::{seealso} +- {doc}`dhl_credentials` +- {doc}`sendcloud_shipping` +- {doc}`ups_credentials` +::: + +The following is a list of available shipping connectors in Odoo: + +```{eval-rst} +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - Carrier + - Region availability + * - :doc:`FedEx ` + - All + * - :doc:`DHL Express ` + - All + * - :doc:`UPS ` + - All + * - US Postal Service + - United States of America + * - :doc:`Sendcloud ` + - Some European countries (see details below) + * - :doc:`Bpost ` + - Belgium + * - Easypost + - North America + * - Shiprocket + - India + * - :doc:`Starshipit ` + - Australia and New Zealand +``` + +:::{important} +Other services from DHL are **not** supported. + +Sendcloud currently supports shipping **from** Austria, Belgium, France, Germany, Italy, the +Netherlands, Spain, and the United Kingdom, and **to** any European country. +::: + +## Configuration + +To ensure proper setup of a third-party shipping carrier with Odoo, follow these steps: + +1. {ref}`Install the shipping connector `. +2. {ref}`Set up delivery method `. +3. {ref}`Activate production environment `. +4. {ref}`Configure warehouse `. +5. {ref}`Specify weight of products `. + +(inventory-shipping-receiving-shipping-connector)= + +### Install shipping connector + +To install shipping connectors, go to {menuselection}`Inventory app --> Configuration --> Settings`. + +Under the {guilabel}`Shipping Connectors` section, tick the third-party shipping carrier's checkbox +to install it. Multiple third-party shipping connectors can be selected at once. Then, click +{guilabel}`Save`. + +:::{note} +{doc}`Delivery methods <../setup_configuration>` can also be integrated with operations in the +*Sales*, *eCommerce*, and *Website* apps. To install, refer to the {ref}`install apps and modules +` documentation. +::: + +```{image} third_party_shipper/shipping-connectors.png +:align: center +:alt: Options of available shipping connectors in Odoo. +``` + +(inventory-shipping-receiving-configure-delivery-method)= + +### Delivery method + +To configure the API credentials, and activate the shipping carrier, begin by going to +{menuselection}`Inventory app --> Configuration --> Shipping Methods`, and select the desired +delivery method. + +:::{note} +The list often includes **two** delivery methods from the same {guilabel}`Provider`: one for +international shipping and one for domestic shipping. + +Additional delivery methods can be created for specific purposes, such as {doc}`packaging +<../../product_management/configure/packaging>`. +::: + +:::{seealso} +{doc}`Configure delivery methods <../setup_configuration>` +::: + +:::{note} +Ensure the delivery method is published when it should be available on the *Website* app. To +publish a delivery method on the website, click the desired delivery method, then click the +{guilabel}`Unpublished` smart button. Doing so changes that smart button to read: +{guilabel}`Published`. +::: + +(inventory-shipping-receiving-shipping-methods-details)= + +The {guilabel}`Shipping Method` page contains details about the provider, including: + +- {guilabel}`Shipping Method` (*Required field*): the name of the delivery method (e.g. `FedEx US`, + `FedEx EU`, etc.). + +- {guilabel}`Website`: configure shipping methods for an *eCommerce* page that is connected to a + specific website in the database. Select the applicable website from the drop-down menu, or leave + it blank to apply the method to all web pages. + +- {guilabel}`Provider` (*Required field*): choose the third-party delivery service, like FedEx. Upon + choosing a provider, the {guilabel}`Integration Level`, {guilabel}`Invoicing Policy` and + {guilabel}`Insurance Percentage` fields become available. + +- {guilabel}`Integration Level`: choose {guilabel}`Get Rate` to simply get an {ref}`estimated + shipment cost ` on an {{ SO }} or invoice. + + :::{important} + Select {guilabel}`Get Rate and Create Shipment` to also {doc}`generate shipping labels + `. + ::: + +- {guilabel}`Company`: if the shipping method should apply to a specific company, select it from the + drop-down menu. Leave the field blank to apply the method to all companies. + +- {guilabel}`Delivery Product` (*Required field*): the delivery charge name that is added to the + {{ SO }} or invoice. + +- {guilabel}`Invoicing Policy`: select and calculate an {guilabel}`Estimated cost` of shipping + directly from the shipping carrier. If the {guilabel}`Real cost` of shipping is wanted instead, + refer to {doc}`Invoice real shipping costs ` document. + +- {guilabel}`Margin on Rate`: specify an additional percentage amount added to the base shipping + rate to cover extra costs, such as handling fees, packaging materials, exchange rates, etc. + +- {guilabel}`Free if order amount is above`: enables free shipping for orders surpassing a specified + amount entered in the corresponding {guilabel}`Amount` field. + +- {guilabel}`Insurance Percentage`: specify a percentage amount of the shipping costs reimbursed to + the senders if the package is lost or stolen in transit. + +:::{figure} third_party_shipper/fedex.png +:align: center +:alt: Screenshot of a FedEx shipping method. + +**Shipping Method** configuration page for `FedEx US`. +::: + +In the {guilabel}`Configuration` tab, fill out the API credential fields (e.g. API key, password, +account number, etc.). Depending on the third-party shipping carrier chosen in the +{guilabel}`Provider` field, the {guilabel}`Configuration` tab will contain different required +fields. For more details about configuring specific carriers' credentials, refer to the following +documents: + +:::{seealso} +- {doc}`DHL credentials ` +- {doc}`Sendcloud credentials ` +- {doc}`UPS credentials ` +::: + +(inventory-shipping-receiving-production-env)= + +### Production environment + +With the delivery method details configured, click the {guilabel}`Test Environment` smart button to +set it to {guilabel}`Production Environment`. + +:::{warning} +Setting the delivery method to {guilabel}`Production` creates **real** shipping labels, and users +are at risk of being charged through their carrier account (e.g. UPS, FedEx, etc.) **before** +users charge customers for shipping. Verify all configurations are correct before launching the +delivery method to {guilabel}`Production`. +::: + +```{image} third_party_shipper/production.png +:align: center +:alt: Show the "Test Environment" smart button. +``` + +(inventory-shipping-receiving-configure-source-address)= + +### Warehouse configuration + +Ensure the warehouse's {guilabel}`Address` (including ZIP code) and {guilabel}`Phone` number are +entered accurately. To do that, go to {menuselection}`Inventory app --> Configuration --> +Warehouses`, and select the desired warehouse. + +On the warehouse configuration page, open the warehouse contact page by clicking the +{guilabel}`Company` field. + +```{image} third_party_shipper/internal-link.png +:align: center +:alt: Highlight the "Company" field. +``` + +Verify that the {guilabel}`Address` and {guilabel}`Phone` number are correct, as they are required +for the shipping connector to work properly. + +```{image} third_party_shipper/company.png +:align: center +:alt: Show company address and phone number. +``` + +(inventory-shipping-receiving-configure-weight)= + +### Product weight + +For the carrier integration to work properly, specify the weight of products by going to +{menuselection}`Inventory app --> Products --> Products`, and selecting the desired product. + +Then, switch to the {guilabel}`Inventory` tab, and define the {guilabel}`Weight` of the product in +the {guilabel}`Logistics` section. + +```{image} third_party_shipper/product-weight.png +:align: center +:alt: Display the "Weight" field in the Inventory tab of the product form. +``` + +(inventory-shipping-receiving-apply-third-party-carrier)= + +## Apply third-party shipping carrier + +Shipping carriers can be applied on a {abbr}`SO (Sales Order)`, invoice, or delivery order. + +After configuring the third-party carrier's {ref}`delivery method +` in Odoo, create or navigate to a quotation +by going to {menuselection}`Sales app --> Orders --> Quotations`. + +(inventory-shipping-receiving-third-party-so)= + +### Sales order + +To assign a third-party shipping carrier, and get an estimated cost of shipping, begin by going to +{menuselection}`Sales app --> Orders --> Quotations`. Create or select an existing quotation, and +add the cost of shipping through a third-party carrier to a quotation, by clicking the +{guilabel}`Add Shipping` button in the bottom-right corner of the {guilabel}`Order Lines` tab. + +```{image} third_party_shipper/add-shipping.png +:align: center +:alt: Show the "Add shipping" button at the bottom of a quotation. +``` + +In the resulting {guilabel}`Add a shipping method` pop-up window, select the intended carrier from +the {guilabel}`Shipping Method` drop-down menu. The {guilabel}`Cost` field is automatically filled +based on: + +- the amount specified in the {guilabel}`Total Order Weight` field (if it is not provided, the sum + of {ref}`product weights ` in the order is used) +- the distance between the warehouse's {ref}`source address + ` and the customer's address. + +(inventory-shipping-receiving-third-party-rate)= + +After selecting a third-party provider in the {guilabel}`Shipping Method` field, click +{guilabel}`Get Rate` in the {guilabel}`Add a shipping method` pop-up window to get the estimated +cost through the shipping connector. Then, click the {guilabel}`Add` button to add the delivery +charge to the {{ SO }} or invoice. + +:::{seealso} +{doc}`Charge customers for shipping after product delivery ` +::: + +(inventory-shipping-receiving-third-party-do)= + +### Delivery order + +For users making shipments without installing the *Sales* app, assign the shipping carrier to the +delivery order, by first going to the {menuselection}`Inventory` app. Then, from the +{guilabel}`Inventory Overview` dashboard, select the {guilabel}`Delivery Orders` operation type, and +choose the desired delivery order that is not already marked as {guilabel}`Done` or +{guilabel}`Cancelled`. + +In the {guilabel}`Additional info` tab, set the {guilabel}`Carrier` field to the desired third-party +shipping carrier. When the delivery method is set to {ref}`production mode +`, a {guilabel}`Tracking Reference` is +provided. + +:::{seealso} +{doc}`Generate shipping labels ` +::: + +```{image} third_party_shipper/delivery-info.png +:align: center +:alt: Show the delivery order's "Additional info" tab. +``` + +(inventory-shipping-receiving-third-party-troubles)= + +## Troubleshooting + +Since shipping connectors can sometimes be complex to set up, here are some checks to try when +things are not working as expected: + +1. Ensure the {ref}`warehouse information ` + (e.g., address and phone number) in Odoo is correct **and** matches the records saved in the + shipping provider's website. + +2. Verify that the {ref}`package type ` and parameters + are valid for the shipping carrier. To check, ensure the shipment can be directly created on the + shipping carrier's website. + +3. When encountering a price mismatch between Odoo's estimated cost and the provider's charge, first + ensure the delivery method is set to {ref}`production environment + `. + + Then, create the shipment in both the carrier's website and Odoo, and verify the prices are the + same across Odoo, the shipping provider, and in the *debug logs*. + + ```{eval-rst} + .. example:: + When checking for a price mismatch in the debug logs, if the request says the package weighs + six kilograms, but the response from FedEx says the package weights seven kilograms, it + concludes that the issue is on FedEx's side. + ``` + +### Debug log + +Track shipping data inconsistencies by activating debug logging. To do that, go to the delivery +method's configuration page ({menuselection}`Inventory app --> Configuration --> Shipping +Method`), and select the desired shipping method. Click the {guilabel}`No Debugging` smart button to +activate {guilabel}`Debug Requests`. + +```{image} third_party_shipper/no-debug.png +:align: center +:alt: Show the "No Debug" smart button. +``` + +With {guilabel}`Debug Requests` activated, each time the shipping connector is used to estimate the +cost of shipping, records are saved in the {guilabel}`Logging` report. To access the report, turn on +{ref}`developer mode `, and go to {menuselection}`Settings app --> Technical --> +Database Structure section --> Logging`. + +:::{note} +Logs are created for a shipping method each time the {ref}`Get Rate +` button is clicked on {abbr}`SOs (Sales Orders)` +and invoices, **and** when a customer adds the shipping carrier to their order through the +*Website* app. +::: + +```{image} third_party_shipper/log.png +:align: center +:alt: Show how to find the "Logging" option from the "Technical" menu. +``` + +Click the *HTTP request* line item to open a detailed page, and verify the correct information is +sent from Odoo to the shipping carrier. In the *HTTP response*, verify that the same information is +received. + +```{image} third_party_shipper/logging.png +:align: center +:alt: Show debug request history in Settings > Technical > Logging. +``` + diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/ups_credentials.md b/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/ups_credentials.md new file mode 100644 index 000000000..bbd08a4f2 --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/ups_credentials.md @@ -0,0 +1,215 @@ +# UPS integration + +UPS is a shipping carrier service that integrates with Odoo to coordinate shipping to all regions. +Once integrated, users can create shipping methods that estimate shipping costs and {doc}`generate +labels `. + +:::{seealso} +{doc}`third_party_shipper` +::: + +To set up the UPS shipping connector in Odoo, complete these steps: + +1. Create a UPS account to get {ref}`account number + ` +2. Create UPS developer account to get {ref}`client credentials + ` +3. Set up shipping method in Odoo + +:::{warning} +When configuring a shipping method to use UPS, make sure the {guilabel}`Provider` is set to +{guilabel}`UPS`, **NOT** {guilabel}`UPS Legacy`. + +If shipping methods currently exist with the {guilabel}`Provider` set to {guilabel}`UPS Legacy`, +archive them, and create new shipping methods using {guilabel}`UPS`, instead. +::: + +## UPS account setup + +To get started, go to the [UPS website](https://www.ups.com) and click the {guilabel}`Log In` +button in the top-right corner to log in or create a UPS account. + +After logging in, click the profile icon in the top-right corner, and select {guilabel}`Accounts and +Payment` from the drop-down menu. + +```{image} ups_credentials/accounts-payment.png +:align: center +:alt: Show how to navigate to the "Accounts and Payment" page from the home screen. +``` + +On the {guilabel}`Accounts and Payment Options` page, two accounts must be configured: an Odoo +shipment account and a payment card. + +### Shipping account + +To add an Odoo shipment account, select {guilabel}`Add New Account` from the {guilabel}`Add a +Payment Method` drop-down menu, and click {guilabel}`Add`. + +```{image} ups_credentials/new-account.png +:align: center +:alt: Display "Add an account" option from the drop-down menu. +``` + +On the next screen, labeled {guilabel}`Open a Shipping Account`, complete the forms to configure the +shipping account type (e.g. {guilabel}`Business`) and if any regulated items will be shipped. Then +finish the remaining three steps in the wizard to {guilabel}`Add Addresses`, {guilabel}`Verify +Identity`, and {guilabel}`Explore Discounts`, with the last option being optional. + +When complete, submit the application on the last page of the wizard to finish setting up the +shipping account. + +```{image} ups_credentials/shipping-account.png +:align: center +:alt: Display UPS form to fill out company shipping information. +``` + +(inventory-shipping-receiving-ups-account-number)= + +### Get account number + +With the shipping account set up, the UPS {guilabel}`Account Number` becomes available. To access +it, navigate to {menuselection}`Profile --> Accounts and Payment` and refer to the shipping +account's {guilabel}`Number` field. + +```{image} ups_credentials/account-number.png +:align: center +:alt: Show Account "Number" field for the shipping account. +``` + +### Payment card + +Navigate back to the {guilabel}`Accounts and Payments` page and select the {guilabel}`Add Payment +Card` option from the {guilabel}`Add a Payment Method` drop-down menu. Then, complete the form to +add the credit card information. + +```{image} ups_credentials/payment-card.png +:align: center +:alt: Show "Add Payment Card" option from the drop-down. +``` + +## UPS developer account setup + +Next, log into the [UPS developer account](http://developer.ups.com/) to generate the developer +key. To begin, click the profile icon in the top-right corner, and choose the {guilabel}`Apps` +option from the drop-down menu. + +```{image} ups_credentials/apps.png +:align: center +:alt: Display the "Apps" drop-down option after clicking the profile picture icon. +``` + +### Add app + +Then, click the {guilabel}`Add Apps` button to begin filling out the form. In the {guilabel}`I need +API credentials because \*` field, select {guilabel}`I want to integrate UPS technology into my +business`. + +Under the next label, {guilabel}`Choose an account to associate with these credentials. \*`, select +{guilabel}`Add existing account` from the drop-down menu in the corresponding field, and then select +the {ref}`account number ` linked to the UPS +account created in the previous step. + +```{image} ups_credentials/developer-account-setup.png +:align: center +:alt: Show form to fill in the UPS account number. +``` + +Click {guilabel}`Next`, and proceed to the {guilabel}`Add App` form, and fill out the fields: + +- {guilabel}`App Name`: Type the name to identify the app by. +- {guilabel}`Callback URL`: Type the URL of the Odoo database, in the format: + `https://databaseName.odoo.com`. Do **not** include `www` in the URL. + +In the {guilabel}`Add Products` section on the right, search for and click the {guilabel}`+ (plus)` +icon to add the following products to the app: + +- {guilabel}`Authorization (O Auth)`: Used to generate the authorization token to request + information from the UPS API. +- {guilabel}`Address Validation`: Validates addresses at the street level in the United States and + Puerto Rico. +- {guilabel}`Locator`: Enables search for UPS shipping locations based on type and available + services. +- {guilabel}`Paperless Documents`: Enables the upload of document images to link to shipments. +- {guilabel}`Shipping`: Enables UPS shipping services, such as preparing packages for shipment, + managing returns, and cancelling scheduled shipments. +- {guilabel}`Rating`: Compare delivery services and shipping rates. + +Finally, click {guilabel}`Save` and accept UPS's terms and conditions. + +:::{seealso} +[UPS API Catalog](https://developer.ups.com/catalog?loc=en_US) +::: + +```{image} ups_credentials/add-app-development.png +:align: center +:alt: Show "Add Apps" form, where the app details are configured. +``` + +(inventory-shipping-receiving-ups-client-id)= + +### Client ID and Client Secret + +With the new app created, in the {menuselection}`Profile --> My Apps --> App` page, select the app +from the {guilabel}`Credentials` section to view the UPS credentials. + +```{image} ups_credentials/my-apps.png +:align: center +:alt: Show newly created app in the "My Apps" section. +``` + +In the {guilabel}`Credentials` section, copy the {guilabel}`Client ID` and {guilabel}`Client Secret` +key. + +```{image} ups_credentials/credentials.png +:align: center +:alt: Display the "Client ID" and "Client Secret" key. +``` + +## Setup in Odoo + +With the credentials obtained, configure the UPS shipping method in Odoo by going to +{menuselection}`Inventory app --> Configuration --> Shipping Methods`. + +On the {guilabel}`Shipping Methods` page, click the {guilabel}`New` button. + +:::{note} +For existing UPS shipping methods whose {guilabel}`Provider` is {guilabel}`UPS Legacy`, archive +it and create a new shipping method using {guilabel}`UPS`. +::: + +In the {guilabel}`Provider` field, select {guilabel}`UPS`. Doing so reveals the {guilabel}`UPS +Configuration` tab, where various fields must be entered. For details instructions on configuring +the other fields on the shipping method, refer to the {doc}`Configure third-party carrier +` documentation. + +In the {guilabel}`UPS Configuration` tab, complete the following fields: + +- {guilabel}`UPS Account Number`: (*required*) Get the {ref}`account number + ` from the UPS portal. +- {guilabel}`UPS Client ID`: (*required*) Get the {ref}`Client ID + ` from the UPS developer website. +- {guilabel}`UPS Client Secret`: (*required*) Get the {ref}`Client Secret + ` key from the UPS developer website. +- {guilabel}`UPS Service Type`: Select from the drop-down menu the type of shipping service. +- {guilabel}`UPS Package Type`: (*required*) Select from the drop-down menu the {doc}`package type + <../../product_management/configure/package>` that is supported for the shipping service. +- {guilabel}`Package Weight Unit`: The unit of measure for the package weight. +- {guilabel}`Package Size Unit`: The unit of measure for the package dimensions. +- {guilabel}`Label Format`: Choose the label format shipping labels: {guilabel}`PDF`, + {guilabel}`ZPL`, {guilabel}`EPL`, or {guilabel}`SPL`. + +```{image} ups_credentials/ups-configuration.png +:align: center +:alt: Show the "UPS Configuration" tab on the Shipping Methods form. +``` + +In the {guilabel}`Options` section, the following features are available: + +- {guilabel}`Bill My Account`: Charge the user's UPS account for shipping in the *eCommerce* app. +- {guilabel}`Collect on Delivery`: Collect payment from customers for shipping after the shipment is + delivered. +- {guilabel}`Generate Return Label`: Print the return label for the order after the delivery order + is validated. +- {guilabel}`Duties paid by`: Select whether duties or other fees are charged to the + {guilabel}`Sender` or {guilabel}`Recipient` of the order. + diff --git a/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/zebra.md b/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/zebra.md new file mode 100644 index 000000000..c07353301 --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/shipping_receiving/setup_configuration/zebra.md @@ -0,0 +1,251 @@ +--- +substitutions: + ZPL: '{abbr}`ZPL (Zebra Programming Language)`' +--- + +# Zebra label configuration + +In Odoo, labels printed in the Zebra Programming Language (ZPL) file format are designed to fit a +four-by-six inch label. To resize (or reformat) text to fit a variety of {{ ZPL }} label sizes, +{ref}`navigate to the ZPL label view `, and alter the {{ ZPL }} +code. + +:::{warning} +When customizing code in Odoo, please note that upgrading the database to newer versions may +break custom {{ ZPL }} code. **Customers are responsible for maintaining their custom code**. +::: + +Refer to the following sections for explanations, and example code, for frequently requested Zebra +label customizations. + +- {ref}`Adjust margins ` +- {ref}`Enlarge/minimize barcodes ` +- {ref}`Rotate elements ` + +(inventory-shipping-receiving-zpl-view)= + +## Navigate to ZPL label view + +To begin customizing a Zebra label in Odoo, turn on {ref}`developer mode `, and on +the main Odoo dashboard, type `Reports`. From the search results that appear in the resulting pop-up +window, choose {guilabel}`Settings / Technical / Reporting / Reports` to open the +{guilabel}`Reports` page. + +:::{note} +To manually navigate to the {guilabel}`Reports` page, go to {menuselection}`Settings app --> +Technical --> Reporting: Reports`. +::: + +```{image} zebra/search.png +:align: center +:alt: Show global search result for "Reports". +``` + +On the {guilabel}`Reports` page, in the {guilabel}`Search...` bar, type `ZPL`, and hit {kbd}`Enter`. +Upon doing so, Odoo presents a list of available Zebra labels in Odoo. Select the desired Zebra +label from the list to modify it on a separate page. + +:::{note} +Printable ZPL labels in Odoo: + +- {ref}`lot/serial number ` +- operation type +- package barcode +- {ref}`product label ` +- product packaging +- finished product (Odoo *Manufacturing* app required) +::: + +Next, click the {icon}`fa-code` {guilabel}`Qweb Views` smart button, and choose the desired label +{doc}`view <../../../../../developer/reference/user_interface/view_records>`. + +:::{figure} zebra/qweb-views.png +:align: center +:alt: Show Qweb smart button on the Lot and Serial Number (ZPL) report. + +**Lot and Serial Number (ZPL)** report, highlighting the Qweb smart button. +::: + +On the resulting view form, go to the {guilabel}`Architecture` tab to view the {{ ZPL }} code. + +:::{important} +To ensure the customization is **not** overwritten during an update, click the {icon}`fa-bug` +{guilabel}`(bug)` icon on the view page. Then, select the {guilabel}`View Metadata` option from +the resulting drop-down menu, in order to open the {guilabel}`View Metadata` pop-up window. Then, +ensure the {guilabel}`No Update` field is set to {guilabel}`true (change)`. Click {guilabel}`Ok` +to exit the {guilabel}`View Metadata` pop-up window. +::: + +```{image} zebra/architecture.png +:align: center +:alt: Architecture tab in the view. +``` + +(inventory-shipping-receiving-margin)= + +## Adjust margin + +Text gets cut off from standard {{ ZPL }} labels printed in Odoo when the line exceeds fifty-five +characters. To fit long product names, or lot numbers, on a single line, adjust the margin. + +To begin, navigate to the {ref}`ZPL code of the label ` in +the {guilabel}`Architecture` tab. In the {{ ZPL }} code for product labels, look for the `^FT` command, +which specifies where to start placing the text, or graphic element, on the label. The two numbers +immediately following `^FT` define the x-coordinate and y-coordinate in dots ({dfn}`similar to +pixels for printers`) from the left and top margins. + +:::{important} +When customizing lot/serial number labels, look for the `^FO` command, instead of `^FT`. +::: + +```{eval-rst} +.. example:: + + The following is an example where the product's name gets cut off with Odoo's default |ZPL| + formatting. In the **Fixed** tab, the x-coordinate of the starting position of the label is + changed from `^FT100,80` to `^FT0,80`, to fit the entire name. +``` + +```{eval-rst} +.. tabs:: + + .. tab:: Default + + .. image:: zebra/default-margin.png + :align: center + :alt: Example barcode label with the product name cut off. + + **Code**: + + .. code-block:: xml + + ^XA^CI28 + ^FT100,80^A0N,40,30^FD[E-COM11] Cabinet with Doors (wood: Cherry, handles: brass)^FS + ... + ^XZ + + .. tab:: Modified + + .. image:: zebra/fixed-margin.png + :align: center + :alt: Example barcode label with the product name margin adjusted to the left. + + **Code**: + + .. code-block:: xml + + ^XA^CI28 + ^FT0,80^A0N,40,30^FD[E-COM11] Cabinet with Doors (wood: Cherry, handles: brass)^FS + ... + ^XZ +``` + +(inventory-shipping-receiving-resize)= + +## Resize barcode + +To adjust the size of the barcode to scale, begin by navigating to the {ref}`ZPL code of the label +` in the {guilabel}`Architecture` tab. Look for the `^FO` +command (typically in the third line), which is the starting point of the margin for the barcode. + +The `^BY` command configures barcode size, and takes three numbers: bar width, width of wide bars +relative to narrow bars, and bar height. By default, {{ ZPL }} code in Odoo uses `^BY3`, setting the bar +width to three dots, a typical size that is easy for barcode scanners to read. + +```{eval-rst} +.. example:: + To shrink the barcode to scale, `^BY3` is reduced to `^BY2`. +``` + +```{eval-rst} +.. tabs:: + + .. tab:: Default + + .. image:: zebra/normal-barcode.png + :align: center + :alt: Example barcode label. + + **Code**: + + .. code-block:: xml + + ^XA^CI28 + ... + ^FO100,160^BY3 + ... + ^XZ + + .. tab:: Modified + + .. image:: zebra/shrink-barcode.png + :align: center + :alt: Example barcode label with the barcode size reduced. + + **Code**: + + .. code-block:: xml + + ^XA^CI28 + ... + ^FO100,160^BY2 + ... + ^XZ +``` + +(inventory-shipping-receiving-rotate)= + +## Rotate elements + +To rotate elements in {{ ZPL }}, begin by navigating to the {ref}`ZPL code of the label +` in the {guilabel}`Architecture` tab. + +The `^BC` command's first parameter ({dfn}`information that affects the behavior of the command`) +defines the rotation of an item, which can be: + +- `N`: display normally +- `R`: rotate 90 degrees +- `I`: rotate 180 degrees +- `B`: rotate 270 degrees + +```{eval-rst} +.. example:: + To rotate the barcode, `^BCN` is changed to `^BCB`. +``` + +```{eval-rst} +.. tabs:: + + .. tab:: Default + + .. image:: zebra/lot.png + :align: center + :alt: Example barcode label. + + **Code**: + + .. code-block:: xml + + ^XA^CI28 + ... + ^BCN,100,Y,N,N + ... + ^XZ + + .. tab:: Modified + + .. image:: zebra/rotate.png + :align: center + :alt: Example barcode label with the barcode rotated. + + **Code**: + + .. code-block:: xml + + ^XA^CI28 + ... + ^BCB,100,Y,N,N + ... + ^XZ +``` + diff --git a/content/applications/inventory_and_mrp/inventory/warehouses_storage.md b/content/applications/inventory_and_mrp/inventory/warehouses_storage.md new file mode 100644 index 000000000..0f3b6e1ee --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/warehouses_storage.md @@ -0,0 +1,14 @@ +--- +nosearch: true +--- + +# Warehouses and storage + +```{toctree} +:titlesonly: true + +warehouses_storage/inventory_management +warehouses_storage/replenishment +warehouses_storage/reporting +``` + diff --git a/content/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management.md b/content/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management.md new file mode 100644 index 000000000..3d05fab93 --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management.md @@ -0,0 +1,148 @@ +--- +hide-page-toc: true +show-content: true +--- + +# Inventory management + +In the Odoo *Inventory* app, {doc}`warehouses ` handle the broader +organization and distribution of stock across different physical sites, while {doc}`locations +` provide a more detailed breakdown within each warehouse for +efficient item management. + +This document serves as an introduction to the terminology and concepts necessary to master +*Inventory*. For specific instructions and examples of how things work, refer to individual +documentation pages. + +:::{seealso} +[Odoo Tutorials: Warehouses & Locations](https://www.youtube.com/watch?v=zMvudZVLuUo) +::: + +## Warehouses + +{doc}`Warehouses ` represent a physical place, with a physical +address, where a company's items are stored. + +Configure {doc}`routes <../shipping_receiving/daily_operations/use_routes>` in a warehouse to +control how products move to customers, from vendors, within the warehouse, or {doc}`between +warehouses `. + +## Locations + +{doc}`Locations ` refer to specific areas within a warehouse, +such as shelves, floors, or aisles. These are sub-divisions within a warehouse, and are unique to +that warehouse. Users can create and manage numerous locations within a single warehouse to organize +inventory more precisely. + +:::{seealso} +- {doc}`inventory_management/use_locations` +- {doc}`inventory_management/count_products` +- {doc}`inventory_management/cycle_counts` +- {doc}`inventory_management/scrap_inventory` +::: + +(inventory-warehouses-storage-location-type)= + +### Location types + +*Location types* in Odoo help categorize and manage where products are, and what actions need to be +taken with them. By default, on the {menuselection}`Inventory app --> Configuration --> Locations` +page, only internal locations are displayed. + +To view the seven location types in Odoo, select any location, and in the {guilabel}`Location Type` +field, there are: + +- {guilabel}`Vendor Location`: defines an area where products purchased from vendors originate. + Items here are **not** in stock. + +- {guilabel}`View`: used to organize and structure the warehouse hierarchy. For example, the view + location `WH` (short for warehouse) groups all internal locations, such as `Stock`, receiving + docks, quality checkpoints, and packing areas to show they all belong to the same warehouse. + + :::{important} + View locations should **not** contain products, but it is possible to move them there. + ::: + +- {guilabel}`Internal Location`: storage locations within the warehouse. Items stored in these + locations are accounted for in {doc}`inventory valuation + <../product_management/inventory_valuation/using_inventory_valuation>`. + +- {guilabel}`Customer Location`: where sold products are tracked; items here are no longer in stock. + +- {guilabel}`Inventory Loss`: counterpart location to consume missing items or create stock, + accounting for discrepancies. + + In Odoo, examples of inventory loss locations are *Inventory Adjustment*, used to account for + discrepancies during an inventory count, and *Scrap*, which is where damaged goods are sent to + account for inventory losses. + + > ```{eval-rst} + > .. example:: + > `Virtual Locations/Inventory Adjustment` is a location with the :guilabel:`Inventory Loss` + > type. The database shows `65` units in `WH/Stock`, but an inventory check reveals `60`. To + > correct the quantity, five units are moved from `WH/Stock` to `Virtual Locations/Inventory + > Adjustment`. + > + > .. image:: inventory_management/inventory-loss.png + > :align: center + > :alt: Product ends up in Virtual Locations/Inventory Adjustment. + > ``` + +- {guilabel}`Production`: where raw materials are consumed, and {doc}`manufactured products + <../../manufacturing>` are created. + +- {guilabel}`Transit Location`: used for inter-company or inter-warehouse operations to track + products shipped between different addresses, such as {ref}`Physical Locations/Inter-warehouse + transit `. + +```{image} inventory_management/locations.png +:align: center +:alt: List of locations in Odoo. +``` + +:::{note} +In Odoo, location types are color-coded: +: - **Red**: internal locations + - **Blue**: view locations + - **Black**: external locations (including inventory loss, vendor, and customer locations). +::: + +### View locations in Odoo + +Odoo databases include pre-configured view locations to organize the hierarchy of locations. These +provide helpful context, and distinguish between internal and external locations. + +- *Physical locations* serve as an umbrella for external locations, without changing a product's + inventory value. (Inventory valuation changes occur when products move from internal to external + locations). + +(inventory-warehouses-storage-interwarehouse-transit)= + +> ```{eval-rst} +> .. example:: +> When moving products in warehouses `WH` and `WH2`, the items are not in either warehouse, but +> still belong to the company. While in transit, they are placed in the `Inter-warehouse transit` +> location, a :guilabel:`Transit Location` type. +> +> This location is under the view location, `Physical Locations`, indicating that +> `Inter-warehouse transit` is outside of a warehouse, but still part of the company. Doing so +> does not affect the inventory valuation of the products. +> ``` + +- *Partner locations* group customer and vendor locations (external locations) together. Transfers + to these locations affect inventory valuation. +- *Virtual locations* are locations that do **not** exist physically, but it is where items that are + not in inventory can be placed. These can be items that are no longer in inventory due to loss, or + other factors. + +```{toctree} +:titlesonly: true + +inventory_management/warehouses +inventory_management/use_locations +inventory_management/count_products +inventory_management/cycle_counts +inventory_management/scrap_inventory +inventory_management/product_catalog +``` + diff --git a/content/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/count_products.md b/content/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/count_products.md new file mode 100644 index 000000000..276b707ef --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/count_products.md @@ -0,0 +1,364 @@ +--- +substitutions: + Ia: Inventory adjustments + ia: inventory adjustments +--- + +# Inventory adjustments + +In any warehouse management system, the recorded inventory counts in the database might not always +match the actual inventory counts in the warehouse. Discrepancy between counts can be due to +damage, human error, theft, or other factors. As such, inventory adjustments must be made to +reconcile the differences, and ensure that the recorded counts in the database match the actual +counts in the warehouse. + +## Inventory Adjustments page + +To view the {guilabel}`Inventory Adjustments` page, navigate to {menuselection}`Inventory app --> +Operations --> Physical Inventory`. + +```{image} count_products/inventory-adjustments-page.png +:alt: In stock products listed on the Inventory adjustments page. +``` + +The {guilabel}`Inventory Adjustments` page lists all products that are currently in stock. + +:::{note} +Only products with a quantity greater than zero are listed on the {guilabel}`Inventory +Adjustments` page. To view product lines with zero current quantity, go to +{menuselection}`Inventory app --> Reporting --> Stock`. +::: + +For each product line, the following information is listed: + +- {guilabel}`Location`: the specific location in the warehouse where a product is stored. This + column is **only** visible if {doc}`Storage Locations ` are enabled. +- {guilabel}`Favorite`: identifies products that have been favorited. +- {guilabel}`Product`: the product whose quantity is listed on the inventory adjustment line. +- {guilabel}`Lot/Serial Number`: the tracking identifier assigned to the specific product listed. It + can contain letters, numbers, or a combination of both. + +:::{note} +If a specific product has a quantity of more than `1.00` in stock, and more than one serial +number, or lot number, assigned to it, each uniquely-identified product is displayed on its own +product line with its own lot/serial number, displayed under the {guilabel}`Lot/Serial Number` +column. +::: + +- {guilabel}`Expiration Date`: the date on which the goods with this serial number are due to + expire. +- {guilabel}`Last Count Date`: the last time the quantity was updated. +- {guilabel}`Package`: the package containing the quantity listed. +- {guilabel}`On Hand Quantity`: the quantity of the product currently recorded in the database. +- {guilabel}`Unit`: the *unit of measure* in which the product is measured. Unless otherwise + specified (e.g., in {guilabel}`Pounds` or {guilabel}`Ounces`), the default {abbr}`UoM (Unit of + Measure)` is {guilabel}`Units`. +- {guilabel}`Counted Quantity`: the real quantity counted during an inventory count. This field is + left blank by default but can be changed, depending on if it matches the {guilabel}`On Hand + Quantity` or not. +- {guilabel}`Difference`: the difference between the {guilabel}`On Hand Quantity` and + {guilabel}`Counted Quantity`, once an inventory adjustment is made. The difference is + automatically calculated after every inventory adjustment. +- {guilabel}`Scheduled Date`: the date at which a count should be made. If not otherwise specified, + this date will default to the 31st of December of the current year. +- {guilabel}`User`: the person assigned to the count in the database. This can either be the person + physically counting the inventory, or applying the count in the database. + +:::{tip} +Additional columns are hidden by default. To reveal these columns, click the +{icon}`oi-settings-adjust` {guilabel}`(adjust)` icon to the far right of the form's top row, and +reveal any desired column by ticking the checkbox next to that option. +::: + +(inventory-create-adjustment)= + +### Create an inventory adjustment + +To create a new inventory adjustment from the {menuselection}`Inventory Adjustments` page, click +{guilabel}`New`. Doing so creates a new, blank inventory adjustment line at the bottom of the page. + +:::{tip} +{{ Ia }} can also be created from the {guilabel}`Forecasted Report` on an individual +product record. To open the report, navigate to a product record and click the +{guilabel}`Forecasted` smart button. Then, at the top of the page, click {guilabel}`Update +Quantity`, then {guilabel}`New`. + +```{image} count_products/forecast-report.png +:alt: The Update Quantities button on a Forecast report in the Inventory app. +``` +::: + +On this blank inventory adjustment line, click the drop-down menu under the {guilabel}`Product` +column, and select a product. If the selected product is tracked using either lots or serial +numbers, the desired lot or serial number needs to be chosen from the drop-down menu under the +{guilabel}`Lot/Serial Number` column. + +:::{tip} +The inventory adjustment line can also be used to create or record lots and serial numbers. +::: + +Next, set the value in the {guilabel}`Counted Quantity` column to the quantity counted for that +product during the inventory adjustment process. + +To the right of the {guilabel}`Counted Quantity` column, the {guilabel}`Scheduled Date` and +{guilabel}`User` can also be changed via their respective drop-down menus. Changing the +{guilabel}`Scheduled Date` changes the date that the inventory adjustment should be processed on, +and selecting a responsible {guilabel}`User` assigns a user to the specific inventory adjustment +for traceability purposes. + +Once all changes have been made to the new inventory adjustment line, click away from the line. +Doing so saves the adjustment, and moves the line to the top of the page. + +If the {guilabel}`Counted Quantity` is greater than the {guilabel}`On Hand Quantity`, the value in +the {guilabel}`Difference` column is **green**. If the {guilabel}`Counted Quantity` is less than the +{guilabel}`On Hand Quantity`, the value in the {guilabel}`Difference` column is **red**. If the +quantities match, and have not been changed at all, no value appears in the {guilabel}`Difference` +column. + +```{image} count_products/difference-column.png +:alt: Difference column on inventory adjustments page. +``` + +At this stage, the count ({dfn}`inventory adjustment`) is recorded, but not yet applied. This means +that the quantity on hand before the adjustment has not yet been updated to match the new, real +counted quantity. + +(inventory-apply-adjustment)= + +### Apply adjusted count + +{{ Ia }} can be completed in several ways. The first way is to click the +{guilabel}`Apply` button on the line at the far right of the page. The second way is to tick the +checkbox on the far left of the line. Doing so reveals new button options at the top of the page, +one of which is an {guilabel}`Apply` button. Clicking this button instead causes an +{guilabel}`Inventory Adjustment` pop-up window to appear. + +From this pop-up menu, a reference or reason can be assigned to the inventory adjustment. By +default, the {guilabel}`Inventory Reason` field is pre-populated with today's date, the date the +adjustment is being made on, but can be changed to reflect whatever reference or reason is desired. + +Once ready, click {guilabel}`Apply` to apply the inventory adjustment. + +:::{note} +Applying an inventory adjustment simultaneously creates a {doc}`stock move line (SML) +<../reporting/moves_history>` in the *Moves History* report for traceability. +::: + +```{image} count_products/apply-inventory-adjustment.png +:alt: Apply all option applies the inventory adjustment once a reason is specified. +``` + +## Relocate products + +{{ Ia }} can also be used to relocate products to different storage locations, or to +different packages. To relocate a product, tick the checkbox at the far left of the line for the +desired product. At the top of the page, click the {guilabel}`Relocate` button. Doing so opens a +pop-up. + +```{image} count_products/relocate-popup.png +:alt: The Relocate products pop-up on the Inventory Adjustments page. +``` + +On the resulting pop-up, enter the following information: + +- {guilabel}`To Location`: the new location for the products. +- {guilabel}`To Package`: the new package for the products. +- {guilabel}`Reason for relocation`: the reason for the move. + +:::{important} +Product relocations **only** work on internal locations. Products **cannot** be moved between +companies. + +Only users with *Administrator* rights can perform product relocations. +::: + +## Set to zero + +{{ Ia }} can also be used to clear inventory counts by setting the quantity to zero. To do this, tick +the checkbox at the far left of the line for the desired product. At the top of the page, click the +{icon}`fa-gear` {guilabel}`Actions` button to open a drop-down menu. Click {guilabel}`Set to 0`. +Once this is complete, {ref}`apply ` the adjusted count. + +## Count products + +Counting products is a recurring activity in a warehouse. Once a count is complete, go to +{menuselection}`Inventory app --> Operations --> Physical Inventory` to update the +{guilabel}`Counted Quantity` column for each product line. + +On each product line, identify whether the value in the {guilabel}`On Hand Quantity` column recorded +in the database matches the newly-counted value. If the recorded value and the counted value do +match, click the {icon}`fa-bullseye` {guilabel}`Set` icon at the far right of the product line. + +Doing so copies the value from the {guilabel}`On Hand Quantity` column over to the +{guilabel}`Counted Quantity` column, and sets the value of the {guilabel}`Difference` column to +`0.00`. Subsequently, once applied, an inventory move with `0.00` {guilabel}`Quantity Done` is +recorded in the product's inventory adjustment history. + +```{image} count_products/zero-move.png +:alt: Zero count inventory adjustment move. +``` + +If the newly-counted value for a given product does **not** match the value in the {guilabel}`On +Hand Quantity` recorded in the database, instead of clicking the {icon}`fa-bullseye` {guilabel}`Set` +icon, record the real value in the field in the {guilabel}`Counted Quantity` column. + +To do so, click the field in the {guilabel}`Counted Quantity` column on the specific inventory +adjustment line for the product whose count is being changed. This automatically assigns a +{guilabel}`Counted Quantity` of `0.00`. + +To change this value, type in a new value that matches the real, newly-counted value. Then, click +away from the line. Doing so saves the adjustment, and automatically adjusts the value in the +{guilabel}`Difference` column. + +If the {guilabel}`Counted Quantity` is greater than the {guilabel}`On Hand Quantity`, the value in +the {guilabel}`Difference` column is **green**. If the {guilabel}`Counted Quantity` is less than the +{guilabel}`On Hand Quantity`, the value in the {guilabel}`Difference` column is **red**. If the +quantities match, and have not been changed at all, no value appears in the {guilabel}`Difference` +column. + +Subsequently, once applied, a move with the difference between the {guilabel}`On Hand Quantity` and +the {guilabel}`Counted Quantity` is recorded in the product's inventory adjustment history. + +```{image} count_products/history-inventory-adjustments.png +:alt: Inventory Adjustments History dashboard detailing a list of prior product moves. +``` + +The {guilabel}`Actions` menu appears when one or more products' checkboxes are selected. The +{guilabel}`Actions` menu includes the option to {guilabel}`Set to quantity on hand`, which sets the +selected products' {guilabel}`Counted Quantity` to the {guilabel}`On Hand Quantity`, and +{guilabel}`Set to 0`, which sets the selected products' {guilabel}`Counted Quantity` to zero. + +```{image} count_products/inventory-adjustment-actions.png +:alt: Inventory Adjustments Actions menu. +``` + +:::{important} +Sometimes a count occurs, but cannot be applied in the database right away. In the time between +the actual count and applying the inventory adjustment, product moves can occur. In that case, +the on-hand quantity in the database can change and no longer be consistent with the counted +quantity. As an extra precaution, Odoo asks for confirmation before applying the inventory +adjustment. +::: + +## Revert an inventory adjustment + +To revert the changes made in an inventory adjustment, navigate to {menuselection}`Inventory --> +Reporting --> Moves History`. + +Tick the checkbox at the far left of the line for the desired product. At the top of the page, click +the {icon}`fa-gear` {guilabel}`Actions` button to open a drop-down menu, and click {guilabel}`Revert +Inventory Adjustment`. + +:::{note} +After an inventory adjustment is reverted, the line is not removed from the {guilabel}`Moves +History` report. Instead, an additional line is added, this time with the word `[reverted]` added +to the {guilabel}`Reference` column. + +```{image} count_products/reverted-adjustment.png +:alt: The reference fields on the Moves History report in the Inventory app. +``` +::: + +## Change inventory count frequency + +By default, the *scheduled date* for {{ ia }} are always scheduled for the 31st of December of the +current year. However, for some companies, it is crucial that they have an accurate inventory count +at all times. In such cases, the default scheduled date can be modified. + +To modify the default scheduled date, go to {menuselection}`Inventory app --> Configuration --> +Settings`. Then, in the {guilabel}`Operations` section, locate the {guilabel}`Annual Inventory Day +and Month` setting, which includes a drop-down menu that is set to `31 December` by default. + +```{image} count_products/annual-inventory.png +:alt: Adjust the next inventory count date with the Annual Inventory Day and Month +: setting. +``` + +To change the day, click the `31`, enter a number from `1-31`, depending on the desired month of the +year. + +Then, to change the month, click {guilabel}`December` to reveal the drop-down menu, and select the +desired month. + +Once all desired changes have been made, click {guilabel}`Save` to save all changes. + +### Plan big inventory counts + +To plan big inventory counts, such as a full count of everything currently in stock, first navigate +to {menuselection}`Inventory app --> Operations --> Physical Inventory`. + +Then, select the desired products to be counted by ticking the checkbox on the far left of each +product line. + +:::{tip} +To request a count of **all** products currently in stock, tick the checkbox at the top of the +table, in the header row next to the {guilabel}`Location` label. This selects **all** product +lines. +::: + +```{image} count_products/count-popup.png +:alt: Request a count pop-up on inventory adjustments page. +``` + +Once all desired products have been selected, click the {guilabel}`Request a Count` button at the +top of the page. Doing so opens the {guilabel}`Request a Count` pop-up window, where the following +information can be filled: + +- {guilabel}`Inventory Date`: the planned date of the count. +- {guilabel}`User`: the user responsible for the count. +- {guilabel}`Accounting Date`: the date at which the inventory adjustment will be accounted. +- {guilabel}`Count`: to leave the on-hand quantity of each product line blank, select + {guilabel}`Leave Empty`. To pre-fill the on-hand quantity of each product line with the current + value recorded in the database, select {guilabel}`Set Current Value`. + +:::{note} +The {guilabel}`Leave Empty` option forces the employee conducting the audit to manually type in +the number they counted, while the {guilabel}`Set Current Value` option only requires the +employee to *verify* the counted quantity and click {guilabel}`Apply`. +::: + +Finally, once ready, click {guilabel}`Confirm` to request the count. + +```{image} count_products/count-popup.png +:alt: Request a count popup on inventory adjustments page. +``` + +:::{important} +In the Odoo **Barcode** app, users can only view inventory counts that are assigned to *them*, +and are scheduled for *today* or *earlier*. + +Sometimes a count occurs, but cannot be applied in the database right away. In the time between +the actual count and applying the inventory adjustment, product moves can occur. In that case, +the on-hand quantity in the database can change and no longer be consistent with the counted +quantity. As an extra precaution, Odoo asks for confirmation before applying the inventory +adjustment. +::: + +## Adjustment history + +Details regarding inventory adjustment can be viewed by clicking the {icon}`fa-history` +{guilabel}`History` icon. + +The user who performed the count is listed in parenthesis in the {guilabel}`Reference` field, while +the user who applied the count is listed in the {guilabel}`Done By`. + +```{image} count_products/adjustment-history.png +:alt: The history record for an inventory adjustment. +``` + +### Inventory audit + +An inventory audit can be accessed from the {guilabel}`Inventory Adjustment` page. This audit +includes an inventory record both before and after a count is completed, to track what changed. + +On the {guilabel}`Inventory Adjustment` page, tick the checkbox at the top-left of the page to +select all of the lines. Then click the {guilabel}`Request a Count` button. On the pop-up, set +{guilabel}`Count` to {guilabel}`Set Current Value`, then click {guilabel}`Confirm`. + +After returning to the {guilabel}`Inventory Adjustment` page, select all of the lines again. Click +{menuselection}`Print --> Count Sheet`. The {guilabel}`Count Sheet` exports in PDF form. + +:::{seealso} +{doc}`cycle_counts` +::: + diff --git a/content/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/cycle_counts.md b/content/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/cycle_counts.md new file mode 100644 index 000000000..a27fc84b5 --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/cycle_counts.md @@ -0,0 +1,128 @@ +# Cycle counts + +For most companies, warehouse stock only needs to be counted once a year. This is why, by default, +after making an *inventory adjustment* in Odoo, the scheduled date for the next inventory count is +set for the 31st of December of the current year. + +However, for some businesses, it's crucial to have an accurate inventory count at all times. These +companies use *cycle counts* to keep critical stock levels accurate. Cycle counting is a method by +which companies count their inventory more often in certain *locations*, to ensure that their +physical inventory counts match their inventory records. + +## Configuration + +In Odoo, cycle counts are performed by location. Therefore, the *Storage Locations* feature needs to +be enabled before performing a cycle count. + +To enable this feature, navigate to {menuselection}`Inventory app --> Configuration --> Settings`, +and scroll down to the {guilabel}`Warehouse` section. Then, tick the checkbox next to +{guilabel}`Storage Locations`, and click {guilabel}`Save`. + +```{image} cycle_counts/cycle-counts-enabled-setting.png +:align: center +:alt: Enabled Storage Locations setting in inventory settings. +``` + +## Change inventory count frequency by location + +Once the *Storage Locations* feature is enabled, and there are multiple locations created in the +warehouse, the inventory count frequency can be changed for specific locations. + +To view and edit locations, navigate to {menuselection}`Inventory app --> Configuration --> +Locations`. This reveals a {guilabel}`Locations` page containing every location currently created +and listed in the warehouse. + +From this page, click into a location to reveal the settings and configuration page for that +location. + +Under the {guilabel}`Cyclic Counting` section, locate the {guilabel}`Inventory Frequency (Days)` +field, which should be set to `0` by default (if this location has not been edited previously). In +this field, change the value to any number of days desired for the frequency of counts. + +```{image} cycle_counts/cycle-counts-frequency-value.png +:align: center +:alt: Location frequency setting on location. +``` + +```{eval-rst} +.. example:: + A location that needs an inventory count every 30 days should have the :guilabel:`Inventory + Frequency (Days)` value set to `30`. +``` + +Now, once an inventory adjustment is applied to this location, the next scheduled count date is +automatically set, based on the value entered into the {guilabel}`Inventory Frequency (Days)` field. + +## Count inventory by location + +To perform a cycle count for a specific location in the warehouse, navigate to +{menuselection}`Inventory app --> Operations --> Physical Inventory`. This reveals an +{guilabel}`Inventory Adjustments` page containing all products currently in-stock, with each product +listed on its own line. + +From this page, the {guilabel}`Filters` and {guilabel}`Group By` options (accessible by clicking the +{guilabel}`⬇️ (down arrow)` icon, to the right of the {guilabel}`Search...` bar), can be used to +select specific locations and perform inventory counts. + +To select a specific location, and view all products within that location, click the {guilabel}`⬇️ +(down arrow)` icon, to the right of the {guilabel}`Search...` bar. Then, in the {guilabel}`Group By` +column, click {guilabel}`Add Custom Group` to reveal a new drop-down menu. + +```{image} cycle_counts/cycle-counts-filter-menu.png +:align: center +:alt: Filters and Group By menu on Inventory Adjustments page. +``` + +Click {guilabel}`Location` from the drop-down menu. Doing so sorts products into their storage +locations on the {guilabel}`Inventory Adjustments` page, and a cycle count can be performed for all +products in that location. + +:::{tip} +In large warehouses with multiple locations and a high volume of products, it might be easier to +search for the specific location desired. To do this, from the {guilabel}`Inventory Adjustments` +page, click the {guilabel}`⬇️ (down arrow)` icon to the right of the {guilabel}`Search...` bar. + +Then, in the {guilabel}`Filters` column, click {guilabel}`Add Custom Filter` to open an +{guilabel}`Add Custom Filter` pop-up window. + +In the first field, click the value and select {guilabel}`Location` from the list of options. +Select {guilabel}`contains` in the second field. In the third field, type in the name of the +location being searched for. + +Click {guilabel}`Add` for that location to appear on the page. + +```{image} cycle_counts/cycle-counts-add-custom-filter.png +:align: center +:alt: Add Custom Filter pop-up window with location values entered. +``` +::: + +## Change full inventory count frequency + +While cycle counts are typically performed per location, the scheduled date for full inventory +counts of all in-stock products in the warehouse can also be manually changed, to push the date up +sooner than the date listed. + +To modify the default scheduled date, go to {menuselection}`Inventory app --> Configuration --> +Settings`. Then, in the {guilabel}`Operations` section, locate the {guilabel}`Annual Inventory Day +and Month` setting field, which includes a drop-down field that is set to `31` {guilabel}`December`, +by default. + +```{image} cycle_counts/cycle-counts-frequency-calendar.png +:align: center +:alt: Frequency field in inventory app settings. +``` + +To change the day, click the `31`, and change it to a day within the range `1-31`, depending on the +desired month of the year. + +Then, to change the month, click {guilabel}`December` to reveal the drop-down menu, and select the +desired month. + +Once all necessary changes have been made, click {guilabel}`Save`. + +:::{seealso} +- {doc}`count_products` +- {doc}`use_locations` +::: + diff --git a/content/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/product_catalog.md b/content/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/product_catalog.md new file mode 100644 index 000000000..0842078d4 --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/product_catalog.md @@ -0,0 +1,112 @@ +--- +substitutions: + BoM: '{abbr}`BoM (bill of materials)`' + RfQ: '{abbr}`RfQ (request for quotation)`' + SO: '{abbr}`SO (sales order)`' + SOs: '{abbr}`SOs (sales orders)`' +--- + +# Product catalog + +The product *catalog* is a feature integrated with any Odoo app that allows users to add products or +components to an order. This includes the **Inventory**, **Manufacturing**, **Sales**, **Purchase**, +and **Repairs** apps, among others. + +The product catalog can be accessed from the first tab of a quotation, request for quotation (RfQ), +order, or bill of materials (BoM) form, and opens in a new page when selected. The catalog displays +products and components in a user-friendly, POS-style format, from which they can be selected and +added to forms. + +The product catalog simplifies the creation of new sales orders (SOs), purchase orders (POs), +manufacturing orders (MOs), bill of materials (BoMs), and more, by providing a visual interface +through which products and components can be quickly selected. + +## Use product catalog + +To use the product catalog, begin by creating or opening a quotation, {{ RfQ }}, order, or {{ BoM }} to +which products or components can be added. For example, create a new sales quotation by navigating +to {menuselection}`Sales app`, and clicking {guilabel}`New`. + +On the form (quotation, {{ RfQ }}, order, {{ BoM }}), make sure the first tab on the bottom is selected. +Depending on the form being configured, this tab may be titled *Order Lines*, *Components*, +*Products*, or *Parts*. + +On the first blank line of the tab, click the {guilabel}`Catalog` link to open the catalog in a new +page. + +```{image} product_catalog/catalog-button.png +:align: center +:alt: The "Catalog" button on the "Order Lines" tab of a sales quotation. +``` + +The product catalog displays a card for each product added to Odoo. Each card displays a few key +details about the corresponding product: + +- Product photo +- Product title +- Price or cost of the product, depending on whether it is bought, sold, or used as a + component +- Reference code (e.g. *DESK0005*) +- On-hand quantity +- Variant attributes (e.g. *Color: White*) + +```{image} product_catalog/product-card.png +:align: center +:alt: A product card in the product catalog. +``` + +Products can be filtered using the search bar at the top of the page, or the sidebar on the left +side of the page. + +To filter by product type, click the {icon}`fa-caret-down` {guilabel}`(down arrow)` button on the +right side of the search bar to open the search menu. In the {guilabel}`Filters` section, select the +{guilabel}`Services` filter to only show service products, or the {guilabel}`Products` filter to +only show physical products. + +When creating or configuring a quotation or {{ SO }}, specifically, an {guilabel}`In the Order` filter +appears in the {guilabel}`Filters` section of the search bar. Select this filter to only show +products that have already been added to the form. + +In the sidebar on the left side of the page, select an option in the {icon}`fa-th-list` +{guilabel}`PRODUCT CATEGORY` section to filter by product category, or an option in the +{icon}`fa-th-list` {guilabel}`ATTRIBUTES` section to filter by variant attribute. + +```{image} product_catalog/filter-sidebar.png +:align: center +:alt: The filter sidebar in the product catalog. +``` + +To add a product, click on the product's card, or click the {icon}`fa-shopping-cart` {guilabel}`Add` +button in the bottom-right corner of the card. Doing so adds one unit of the product, which is +displayed in a field in the bottom-left corner of the card. + +Once a product has been added, clicking the product card continues to add units of the product in +increments of one. + +To adjust the quantity of the product added, click the {icon}`fa-minus` {guilabel}`(minus)` button +to reduce the quantity by one, or the {icon}`fa-plus` {guilabel}`(plus)` button to increase it by +one. + +Alternatively, a specific quantity can be entered by selecting the field between the +{icon}`fa-minus` {guilabel}`(minus)` and {icon}`fa-plus` {guilabel}`(plus)` buttons, and typing in +the desired quantity. + +To remove a product from the order or {{ BoM }} entirely, either click the {icon}`fa-trash` +{guilabel}`Remove` button in the bottom-right corner of the product card, or click the +{icon}`fa-minus` {guilabel}`(minus)` button until the quantity has been reduced to zero. + +```{image} product_catalog/added-product.png +:align: center +:alt: A product card for a product that has been added. +``` + +Once the desired quantity of each product has been added, return to the form by clicking the +{guilabel}`Back to [X]` button at the top of the screen. This button differs depending on the type +of form being configured (quotation, {{ BoM }}, etc.). + +:::{important} +Products appear in the product catalog, and can be added to orders, even if there +are zero units of the product on hand. As a result, it is important to confirm the quantity of a +product being added to an order is actually available, or inventory inconsistencies may arise. +::: + diff --git a/content/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/scrap_inventory.md b/content/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/scrap_inventory.md new file mode 100644 index 000000000..4bcdd96d2 --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/scrap_inventory.md @@ -0,0 +1,124 @@ +--- +substitutions: + SP: '{abbr}`SP (Scrap Order)`' + SPs: '{abbr}`SPs (Scrap Orders)`' +--- + +# Scrap inventory + +Sometimes, products in a company's warehouse stock might be found to be damaged or defective, past +the point of being reparable. If it is not possible to repair the product, or return the product to +a vendor, it can be scrapped. + +Odoo *Inventory* allows users to scrap inventory, designating goods or materials that are no longer +usable or sellable for disposal (or recycling). + +Scrapping inventory in a database helps stock counts remain accurate, by removing scrapped products +from physical inventory, and placing it in a virtual scrap location (*Virtual Locations/Scrap*). + +:::{note} +*Virtual locations* in Odoo are **not** real, physical spaces in a warehouse. Rather, they are +designated locations in a database that provide tracking of items that shouldn't be counted in a +physical inventory. + +For more information about virtual locations, see the documentation about the different types of +{ref}`location types `. +::: + +## Scrap from stock + +To create a new scrap order (SP) for an in-stock product, navigate to {menuselection}`Inventory app +--> Operations --> Scrap`, and click {guilabel}`New`. This opens a new {{ SP }} form. + +Click the drop-down menu in the {guilabel}`Product` field, and select the product that should be +scrapped from inventory. In the {guilabel}`Quantity` field, change the value to the quantity of the +product that should be scrapped (by default, this value is set to `1.00`). + +```{image} scrap_inventory/scrap-inventory-new-scrap-order.png +:align: center +:alt: Filled out new scrap order form with product details. +``` + +The {guilabel}`Source Location` defaults to the location where the product is currently stored. The +{guilabel}`Scrap Location` defaults to the designated scrap location ({guilabel}`Virtual +Locations/Scrap`). Either of these locations can be changed by selecting a different location from +their respective drop-down menus. + +If the scrapping is tied to a specific existing operation, specify the operation in the +{guilabel}`Source Document` field. + +The {guilabel}`Company` field displays the company whose warehouse this product belongs to. If a +replenishment rule is set up for the product being scrapped, and if the product should be +replenished, tick the checkbox for {guilabel}`Replenish Quantities`. + +Once ready, click {guilabel}`Validate` to complete the new {{ SP }}. Once validated, a +{guilabel}`Product Moves` smart button appears at the top of the form. Click the smart button to +view the details of the scrap operation. + +```{image} scrap_inventory/scrap-inventory-product-moves-button.png +:align: center +:alt: Product Moves smart button on new scrap order form. +``` + +:::{tip} +To view the all-time total quantities of scrapped items, navigate to {menuselection}`Inventory +app --> Configuration --> Locations`. Click the {guilabel}`x (remove)` button on the +{guilabel}`Internal` filter in the {guilabel}`Search...` bar, to display virtual locations. + +Select the {guilabel}`Virtual Locations/Scrap` location. From the {guilabel}`Scrap` location's +form, click the {guilabel}`Current Stock` smart button, at the top of the form. + +A list of all scrapped products, and their quantities, is displayed. + +```{image} scrap_inventory/scrap-inventory-current-stock.png +:align: center +:alt: Current Stock list of all scrapped products in virtual scrap location. +``` +::: + +## Scrap from an existing operation + +Scrap orders (SPs) can *also* be created from existing operations, such as receipts, delivery +orders, and internal transfers, before they are entered into, or removed from, stock for an +operation. + +To scrap a product during an operation, navigate to the {menuselection}`Inventory app`. From the +{guilabel}`Inventory Overview`, click the {guilabel}`# To Process` button on an operation's task +card (i.e. the {guilabel}`Receipts` task card). + +```{image} scrap_inventory/scrap-inventory-receipts-task-card.png +:align: center +:alt: '# To Process button on Receipts task card on Inventory Overview page.' +``` + +Then, select an operation to process from the resulting list of existing orders. Doing so opens that +operation's form. + +Click the {icon}`fa-cog` {guilabel}`(cog)` icon, and select {guilabel}`Scrap` from the resulting +drop-down menu. This opens a {guilabel}`Scrap Products` pop-up window. + +```{image} scrap_inventory/scrap-inventory-popup-window.png +:align: center +:alt: Scrap Products pop-up window on operation form. +``` + +From this pop-up window, click the drop-down menu in the {guilabel}`Product` field, and select the +products from the operation that should be scrapped. Adjust the value in the {guilabel}`Quantity` +field, if necessary. + +If the {guilabel}`Product` selected is tracked using a lot or serial number, a +{guilabel}`Lot/Serial` field appears. Specify the tracking number in that field. + +The {guilabel}`Source Location` and {guilabel}`Scrap Location` can be changed, if needed. If a +replenishment rule is set up for the product being scrapped, and if the product should be +replenished, tick the checkbox for {guilabel}`Replenish Quantities`. + +Once ready, click {guilabel}`Scrap Products`. A {guilabel}`Scraps` smart button appears at the top +of the operation form. Click this smart button to view the details of all scrap orders created from +this specific operation. + +```{image} scrap_inventory/scrap-inventory-scraps-smart-button.png +:align: center +:alt: Scraps smart button showing all scrap orders from operation. +``` + diff --git a/content/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/use_locations.md b/content/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/use_locations.md new file mode 100644 index 000000000..8957ab676 --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/use_locations.md @@ -0,0 +1,155 @@ +# Locations + +A *location* is a specific space within a warehouse. This can be a shelf, room, aisle, etc. + +## Configuration + +To create specific storage locations, enable the *Storage Locations* feature by going to +{menuselection}`Inventory app --> Configuration --> Settings`. In the {guilabel}`Warehouses` +section, tick the {guilabel}`Storage Locations` checkbox. Then, click {guilabel}`Save`. + +:::{note} +Typically, the {guilabel}`Storage Locations` feature is used with {doc}`Multi-Step Routes +<../../shipping_receiving/daily_operations/use_routes>`, which controls how products move between +locations. +::: + +```{image} use_locations/enable-location.png +:align: center +:alt: Show Storage Locations feature. +``` + +## Create new location + +After enabling *Storage Locations*, go to {menuselection}`Inventory app --> Configuration --> +Locations`. + +```{image} use_locations/locations.png +:align: center +:alt: List of internal locations. +``` + +On this page, click {guilabel}`New`. The new location form can then be configured as follows: + +- {guilabel}`Location Name`: recognizable name of the location. + +- {guilabel}`Parent Location`: the location within which the new location exists. After the location + is created, it is listed on the {guilabel}`Locations` page using a *location hierarchy*, to + describe how a specific location fits within larger areas of the warehouse. + + ```{eval-rst} + .. example:: + In `WH/Stock/Zone A/Refrigerator 1`, "Refrigerator 1" is the location name, "Zone A" is the + parent location, and everything before it is the path showing where this spot is within the + warehouse. + ``` + +### Additional Information section + +In addition to the required fields above, configure the following location fields to ensure the +location serves its intended purpose in the database: + +- {guilabel}`Location Type`: from the drop-down menu, choose {guilabel}`Vendor Location`, + {guilabel}`View`, {guilabel}`Internal Location`, {guilabel}`Customer Location`, + {guilabel}`Inventory Loss`, {guilabel}`Production`, or {guilabel}`Transit Location` to categorize + the location. For details on each location type, refer to the {ref}`Location Types section + `. +- {guilabel}`Storage Category`: only available with the {doc}`Storage Categories + <../../shipping_receiving/daily_operations/storage_category>` feature enabled in + {menuselection}`Inventory app --> Configuration --> Settings`. +- {guilabel}`Company`: the company the location belongs to. +- {guilabel}`Is a Scrap Location?`: tick this checkbox to allow for scrapped/damaged goods to be + stored in this location. +- {guilabel}`Is a Return Location?`: tick this checkbox to allow products to be returned to this + location. +- {guilabel}`Barcode`: used with the *Barcode* app, enter the barcode to {ref}`identify actions + ` at this location when scanned. +- {guilabel}`Replenish Location`: used for {doc}`configuring routes + <../../shipping_receiving/daily_operations/use_routes>`, tick this checkbox to set the location as + a destination for receiving products from *Buy*, *Manufacture*, or other procurement routes, + ensuring products are correctly supplied to the warehouse. + +```{image} use_locations/new-location.png +:align: center +:alt: Additional Information section of new location creation form. +``` + +Configure the remaining fields in the {guilabel}`Additional Information` section as follows: + +- {guilabel}`Company`: the company whose warehouse the location is inside of. Leave this field blank + if this location is shared between companies. +- {guilabel}`Is a Scrap Location?`: tick this checkbox to allow for scrapped/damaged goods to be + stored in this location. +- {guilabel}`Is a Return Location?`: tick this checkbox to allow products to be returned to this + location. +- {guilabel}`Barcode`: the barcode assigned to the location. +- {guilabel}`Replenish Location`: tick this checkbox to get all quantities to replenish at this + location. + +In the {guilabel}`Cyclic Counting` section, change the value in the {guilabel}`Inventory Frequency +(Days)` field from the default `0`, if necessary. + +```{image} use_locations/use-locations-cyclic-counting.png +:align: center +:alt: Cyclic Counting section of new location creation form. +``` + +When different than `0`, the inventory count dates for products stored at this location are +automatically set at the defined frequency. + +In the {guilabel}`Logistics` section, in the {guilabel}`Removal Strategy` field, click the drop-down +menu and select the {doc}`removal strategy <../../shipping_receiving/removal_strategies>` for how +items should be removed from this location. + +(inventory-location-hierarchy)= + +### Cyclic Counting section + +To schedule regular inventory counts at this location, set the {guilabel}`Inventory Frequency +(Days)` field to the desired interval. By default, it is set to `0` (no scheduled counts). + +For example, setting this field to `30`, schedules a count every thirty days. For more specifics on +setting up and using this feature, refer to the {doc}`Cycle Counts documentation `. + +The {guilabel}`Last Effective Inventory` field displays the date the last inventory count at this +location occurred. When scheduled inventory counts are enabled, the {guilabel}`Next Expected +Inventory` field displays the date of the next inventory count. + +```{eval-rst} +.. example:: + With inventory counts scheduled to occur every `30` days, and the :guilabel:`Last Effective + Inventory` count occurring on July 16, the :guilabel:`Next Expected Inventory` is August 15. + + .. image:: use_locations/scheduled-count.png + :align: center + :alt: Show Cyclic Count section of the locations form. +``` + +### Logistics section + +In the {guilabel}`Logistics` section of the locations form, optionally select a {guilabel}`Removal +Strategy` to determine the order and priority of how products are picked from inventory. The options +are: {guilabel}`First In First Out (FIFO)`, {guilabel}`Last In First Out (LIFO)`, {guilabel}`Closest +Location`, and {guilabel}`First Expiry First Out (FEFO)`. + +:::{seealso} +{doc}`../../shipping_receiving/removal_strategies` +::: + +## Current stock at location + +To view the current stock at a single location, go to {menuselection}`Inventory app --> +Configuration --> Locations`, and select the desired location. + +Next, click the {guilabel}`Current Stock` smart button to get a list of all products at the +location. + +```{eval-rst} +.. example:: + A list of current stock at `Shelf 1` consists of `266` cabinets and `39` desks. + + .. image:: use_locations/current-stock.png + :align: center + :alt: Show stock at Shelf 1. +``` + diff --git a/content/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/warehouses.md b/content/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/warehouses.md new file mode 100644 index 000000000..b184673bc --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/warehouses_storage/inventory_management/warehouses.md @@ -0,0 +1,76 @@ +# Warehouses + +In the Odoo *Inventory* app, a *warehouse* is a physical space with an address for storing items, +such as a storage facility, distribution center, or physical store. + +Each database has a pre-configured warehouse with the company's address. Users can set up multiple +warehouses, and {doc}`create stock moves <../../shipping_receiving/daily_operations/use_routes>` +between them. + +## Configuration + +To create or manage warehouses, go to {menuselection}`Inventory app --> Configuration --> +Warehouses`. + +Then, select an existing warehouse, or create a new one by clicking {guilabel}`New`. Doing so opens +the warehouse form, which contains the following fields: + +- {guilabel}`Warehouse` (*required field*): the full name of the warehouse. + +- {guilabel}`Short Name` (*required field*): the abbreviated code for the warehouse (maximum five + 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 + 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 + address when creating two or more warehouses, hover over the field, and click the + {icon}`fa-arrow-right` {guilabel}`(right arrow)`. + +- {guilabel}`Company` (*required field*): the company that owns the warehouse; this can be set as + the company that owns the Odoo database, or the company of a customer or vendor. + +- {guilabel}`Intrastat region`: {doc}`region name + <../../../../finance/accounting/reporting/intrastat>` required for companies in the European + Union. + +:::{important} +The options below are available **only** when the *Multi-Step Routes* feature is enabled in +{menuselection}`Inventory app --> Configuration --> Settings`. +::: + +- {guilabel}`Incoming Shipments`: select the option to receive products from the warehouse in + {doc}`one <../../shipping_receiving/daily_operations/receipts_delivery_one_step>`, {doc}`two + <../../shipping_receiving/daily_operations/receipts_delivery_two_steps>`, or {doc}`three + <../../shipping_receiving/daily_operations/receipts_three_steps>` steps. +- {guilabel}`Outgoing Shipments`: select the option to deliver products from the warehouse in + {doc}`one <../../shipping_receiving/daily_operations/receipts_delivery_one_step>`, {doc}`two + <../../shipping_receiving/daily_operations/receipts_delivery_two_steps>`, or {doc}`three + <../../shipping_receiving/daily_operations/delivery_three_steps>` steps. +- {guilabel}`Dropship Subcontractors`: available with the *Subcontracting* feature enabled in + {menuselection}`Manufacturing app --> Configuration --> Settings`. Tick this checkbox to purchase + components from vendors, and dropship them to subcontractors. +- {guilabel}`Resupply Subcontractors`: available with the *Subcontracting* feature, tick this + checkbox to supply subcontractors with raw materials stored in *this* specific warehouse. +- {guilabel}`Manufacture to Resupply`: tick this checkbox to allow for items to be manufactured in + this warehouse. +- {guilabel}`Manufacture`: choose whether to manufacture products in {doc}`one + <../../../manufacturing/basic_setup/one_step_manufacturing>`, {doc}`two + <../../../manufacturing/basic_setup/two_step_manufacturing>`, or {doc}`three steps + <../../../manufacturing/basic_setup/three_step_manufacturing>`. +- {guilabel}`Buy to Resupply`: tick this checkbox to allow for purchased products to be delivered to + the warehouse. +- {guilabel}`Resupply From`: available with multiple warehouses in the database, select warehouses + to pull stock *from* to fulfill orders. + +:::{seealso} +{doc}`Use inventory adjustments to add stock to new warehouses ` +::: + +```{image} warehouses/warehouse-form.png +:align: center +:alt: Example warehouse form. +``` + diff --git a/content/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment.md b/content/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment.md new file mode 100644 index 000000000..c3ecac025 --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment.md @@ -0,0 +1,121 @@ +--- +hide-page-toc: true +show-content: true +substitutions: + MO: '{abbr}`MO (Manufacturing Order)`' + MOs: '{abbr}`MOs (Manufacturing Orders)`' + MTO: '{abbr}`MTO (Make to Oder)`' + PO: '{abbr}`PO (Purchase Order)`' + POs: '{abbr}`POs (Purchase Orders)`' + SO: '{abbr}`SO (Sales Order)`' +--- + +# Replenishment + +In Odoo, stock can be replenished one of three ways: *reordering rules*, the *make to order* (MTO) +route, or using the *master production schedule* (MPS). + +Each replenishment mechanism triggers the creation or suggestion of a purchase order (PO) or +manufacturing order (MO), with the best choice depending on the business process. + +```{eval-rst} +.. cards:: + + .. card:: Reordering rules + :target: replenishment/reordering_rules + :tag: Recommended + :large: + + Automatically suggest or generate POs or MOs when stock falls below a minimum level. + + .. card:: MTO + :target: replenishment/mto + :tag: Beginner-friendly + + Automatically generate POs or MOs when sales orders are confirmed. + + .. card:: MPS + :target: ../../manufacturing/workflows/use_mps + + Manage long-term replenishment based on inputted sales forecasts, via a dashboard. +``` + +## Replenishment strategies + +### Replenishment report and reordering rules + +Reordering rules are rules that can be set up to maintain a minimum stock level. They are often +configured to support manufacturing or sales requirements. When a product's stock falls at or below +the minimum level, Odoo generates (or suggests) a purchase or manufacturing order to replenish stock +to the maximum level. + +When using automatic reordering rules, Odoo generates a new order. When using manual, Odoo suggests +orders on the replenishment report. For detailed guidance, refer to the {doc}`replenishment report +` and {doc}`reordering rules `. + +Key points include: + +- {ref}`Automatic reordering rules `: Automatically create + {{ POs }} or {{ MOs }} when stock falls below the minimum level. While this is convenient, it is less + flexible. +- {ref}`Manual reordering rules `: Generate suggestions in + the replenishment report for user review, allowing adjustments and batch orders while meeting + deadlines. +- {ref}`Just-in-time logic `: A strategy to replenish + only what is needed to prevent overstocking. + +:::{seealso} +- {doc}`replenishment/reordering_rules` +- {doc}`replenishment/report` +::: + +(inventory-management-products-strategies)= + +### Make to order + +An {{ MTO }} strategy means that procurement or production is triggered only after a sales order has +been confirmed. This strategy is recommended when products are customizable, demand is +unpredictable, there is limited storage capacity, and when products are high in value and low in +demand. In such cases, it does not make sense to keep on-hand inventory. + +Unlike products replenished using reordering rules, Odoo automatically links the sales order to the +{{ PO }} or {{ MO }} generated by the {{ MTO }} route. + +Another difference between reordering rules and {{ MTO }} is, with {{ MTO }}, Odoo generates a draft {{ PO }} or +{{ MO }} immediately after the {{ SO }} is confirmed. With reordering rules, Odoo generates a draft {{ PO }} or +{{ MO }} when the product's forecasted stock falls below the set minimum quantity. + +In addition, Odoo automatically adds quantities to the {{ PO }} or {{ MO }} as the forecast changes, so long +as the {{ PO }} or {{ MO }} is not confirmed. + +The {{ MTO }} route is the best replenishment strategy for products that are customized, and/or for +products that have no stock kept on-hand. + +:::{seealso} +{doc}`replenishment/mto` +::: + +### Master production schedule + +The {abbr}`MPS (Master Production Schedule)` is a dashboard where products and their forecasted +quantities are entered. Based on confirmed manufacturing and purchase orders, the dashboard +recommends amounts to order or produce. + +This a useful **manual** tool for keeping track of quantities. The {abbr}`MPS (Master Production +Schedule)` **should absolutely not** be used alongside reordering rules, as the automated workflow +disrupts its manual replenishment method. + +:::{seealso} +{doc}`../../manufacturing/workflows/use_mps` +::: + +```{toctree} +:titlesonly: true + +replenishment/mto +replenishment/reordering_rules +replenishment/report +replenishment/lead_times +replenishment/resupply_warehouses +``` + diff --git a/content/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times.md b/content/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times.md new file mode 100644 index 000000000..a70cb0193 --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/lead_times.md @@ -0,0 +1,394 @@ +--- +substitutions: + BoM: '{abbr}`BoM (Bill of Materials)`' + BoMs: '{abbr}`BoMs (Bills of Materials)`' + MO: '{abbr}`MO (Manufacturing Order)`' + MOs: '{abbr}`MOs (Manufacturing Orders)`' + RFQ: '{abbr}`RFQ (Request for Quotation)`' +--- + +# Lead times + +Accurately forecasting delivery dates is vital for fulfilling customer expectations. In Odoo, the +**Inventory** app allows for comprehensive lead time configuration, allowing coordination and planning +of manufacturing orders, deliveries, and receipts. + +## Lead time types + +Different lead times for different operations can impact various stages of the order fulfillment +process. Here's a summary of the types of lead times in Odoo: + +```{image} lead_times/all-lead-times.png +:alt: Show graphic of all lead times working together. +``` + +- {ref}`Customer lead time `: default time frame for + fulfilling customer orders. The customer lead time is the number of days from the date the sales + order (SO) is confirmed to the date the products are shipped from the warehouse. This is also + known as *delivery lead time*. +- {ref}`Sales security lead time `: moves the + *scheduled delivery date* forward by a specified number of days. This serves as a buffer to allow + ample time to prepare the outgoing shipment earlier, considering the possibility of delays in the + fulfillment process. +- {ref}`Purchase lead time `: number of days from the + confirmation of a purchase order (PO) to the receipt of products. It provides insight on the time + it takes for products to arrive at the warehouse, facilitating effective scheduling and planning + of supplier deliveries. +- {ref}`Purchase security lead time `: advances + the order deadline on a {abbr}`PO (Purchase Order)` by a specified number of days. This proactive + approach of placing orders earlier mitigates the risk of vendor or shipping delays. Thus, for + products that are set to replenish to order, the need appears on the *Replenishment report* + earlier, according to the specified number of days. +- {ref}`Days to Purchase `: days needed for the + vendor to receive a request for quotation (RFQ) and confirm it. It advances the deadline to + schedule a {{ RFQ }} by a specified number of days. +- {ref}`Manufacturing lead time `: number of days needed to + complete a manufacturing order (MO) from the date of confirmation. This lead time includes + weekends (non-working hours in Odoo), and is used to forecast an approximate production date for a + finished good. +- {ref}`Days to prepare manufacturing order + `: number of days needed to replenish + components, or manufacture sub-assemblies of the product. Either set one directly on the bill of + materials (BoM), or click *Compute* to sum up purchase and manufacturing lead times of components + in the {{ BoM }}. +- {ref}`Manufacturing security lead time `: moves + the scheduled date of the {{ MO }} forward by a specified number of days. When used in conjunction + with {ref}`replenish to order `, the security lead time + makes the need appear earlier on the replenishment report. + +(inventory-warehouses-storage-customer-lt)= + +## Sales lead times + +Customer lead times and sales security lead times can be configured to automatically compute an +*expected delivery date* on a {abbr}`SO (Sales Order)`. The expected delivery date ensures a +realistic *delivery dates* setting for shipments from the warehouse. + +Odoo issues a warning message if the set delivery date is earlier than the expected date, as it may +not be feasible to fulfill the order by that time, which would impact other warehouse operations. + +```{eval-rst} +.. example:: + A :abbr:`SO (Sales Order)` containing a `Coconut-scented candle` is confirmed on July 11th. The + product has a customer lead time of 14 days, and the business uses a sales security lead time of + 1 day. Based on the lead time inputs, Odoo suggests a delivery date in 15 days, on July 26th. + + .. image:: lead_times/scheduled-date.png + :alt: Set *Delivery Date* in a sales order. Enables delivery lead times feature. +``` + +The following sections demonstrate how to automatically compute expected delivery dates. + +### Customer lead time + +Set the customer lead time on each product form, by navigating to the products page. To do so, go to +{menuselection}`Sales app --> Products --> Products`. From there, select the desired product, and +switch to the {guilabel}`Inventory` tab. Then, under the {guilabel}`Customer Lead Time` field, fill +in the number of calendar days required to fulfill the delivery order from start to finish. + +```{eval-rst} +.. example:: + Set a 14-day customer lead time for the `Coconut-scented candle` by navigating to its product + form. Then, in the :guilabel:`Inventory` tab, type `14.00` days into the :guilabel:`Customer Lead + Time` field. + + .. image:: lead_times/customer.png + :alt: Set *Customer Lead Time* on the product form. +``` + +(inventory-warehouses-storage-sales-security-lt)= + +### Sales security lead time + +*Sales security lead time* is set globally for the business in {menuselection}`Inventory app --> +Configuration --> Settings`. + +On the configuration page, under the {guilabel}`Advanced Scheduling` heading, locate the box for +{guilabel}`Security Lead Time for Sales`, and click the checkbox to enable the feature. + +Next, enter the desired number of calendar days. This security lead time is a buffer notifying the +team to prepare for outgoing shipments earlier than the scheduled date. + +```{eval-rst} +.. example:: + Setting the :guilabel:`Security Lead Time for Sales` to `1.00` day, pushes the + :guilabel:`Scheduled Date` of a delivery order (DO) forward by one day. In that case, if a + product is initially scheduled for delivery on April 6th, but with a one-day security lead time, + the new scheduled date for the delivery order would be April 5th. + + .. image:: lead_times/sales-security.png + :alt: View of the security lead time for sales configuration from the sales settings. +``` + +### Deliver several products + +For orders that include multiple products with different lead times, the lead times can be +configured directly from the quotation itself. On a quotation, click the {guilabel}`Other Info` tab, +and set the {guilabel}`Shipping Policy` to: + +1. {guilabel}`As soon as possible` to deliver products as soon as they are ready. The + {guilabel}`Scheduled Date` of the {abbr}`DO (Delivery Order)` is determined by adding today's + date to the shortest lead time among the products in the order. +2. {guilabel}`When all products are ready` to wait to fulfill the entire order at once. The + {guilabel}`Scheduled Date` of the {abbr}`DO (Delivery Order)` is determined by adding today's + date to the longest lead time among the products in the order. + +```{image} lead_times/shipping-policy.png +:alt: Show *Shipping Policy* field in the *Other Info* tab of a quotation. +``` + +```{eval-rst} +.. example:: + In a quotation containing 2 products, `Yoga mat` and `Resistance band,` the products have a lead + time of 8 days and 5 days, respectively. Today's date is April 2nd. + + When the :guilabel:`Shipping Policy` is set to :guilabel:`As soon as possible`, the scheduled + delivery date is 5 days from today: April 7th. On the other hand, selecting :guilabel:`When all + products are ready` configures the scheduled date to be 8 days from today: April 10th. +``` + +(inventory-warehouses-storage-purchase-lt)= + +## Purchase lead times + +Automatically determining the dates on which to place orders from suppliers can help simplify the +procurement process. + +Odoo calculates the supplier shipment *receipt date*, and {abbr}`PO (Purchase Order)` deadline, +based on the required date the product is needed in the warehouse. By working backwards from the +receipt date, vendor lead times and purchase security lead times are taken into account, in order to +determine the {abbr}`PO (Purchase Order)` deadline. + +This deadline is the date by which the order should be confirmed, in order to ensure timely arrival +by the expected receipt date. + +```{image} lead_times/vendor-lead-times.png +:alt: Visualization of PO deadline and receipt date used with vendor lead times. +``` + +:::{seealso} +{doc}`PO scheduling with reordering rules ` +::: + +### Vendor lead time + +To set a vendor lead time for orders arriving in the warehouse from a vendor location, begin by +navigating to a product form through {menuselection}`Purchase app --> Products --> Products`. + +Next, select the desired product, and switch to the {guilabel}`Purchase` tab. In the editable vendor +pricelist, click the {guilabel}`Add a line` button to add vendor details, such as the +{guilabel}`Vendor` name, {guilabel}`Price` offered for the product, and lastly, the +{guilabel}`Delivery Lead Time`. + +:::{note} +Multiple vendors and lead times can be added to the vendor pricelist. The default vendor and lead +time selected will be the entry at the top of the list. +::: + +```{eval-rst} +.. example:: + On the vendor pricelist of the product form, the :guilabel:`Delivery Lead Time` for the selected + vendor is set to `10 days.` + + .. image:: lead_times/set-vendor.png + :alt: Add delivery lead times to vendor pricelist on a product. +``` + +By setting the vendor lead time, the expected arrival date of the item is automatically determined +as the date of the {abbr}`PO (Purchase Order)` confirmation, plus the vendor lead time. This ensures +that warehouse employees are notified, if the products do **not** arrive within the expected +timeframe. + +```{eval-rst} +.. example:: + On a :abbr:`PO (Purchase Order)` confirmed on July 11th, for a product configured with a 10-day + vendor lead time, Odoo automatically sets the :guilabel:`Receipt Date` to July 21st. The receipt + date also appears as the :guilabel:`Scheduled Date` on the warehouse receipt form, accessible + from the :guilabel:`Receipt` smart button, located on the :guilabel:`PO (Purchase Order)`. + + .. image:: lead_times/receipt-date.png + :alt: Show expected *Receipt Date* of the product from the vendor. + + .. image:: lead_times/scheduled-date-receipt.png + :alt: Show expected *Scheduled Date* of arrival of the product from the vendor. +``` + +(inventory-warehouses-storage-purchase-security-lt)= + +### Purchase security lead time + +*Purchase security lead time* is set globally for the business in {menuselection}`Inventory app --> +Configuration --> Settings`. + +On the {guilabel}`Settings` page, under the {guilabel}`Advanced Scheduling` heading, tick the +checkbox for {guilabel}`Security Lead Time for Purchase`. + +Next, enter the desired number of calendar days. By configuring the security lead time, a buffer is +set to account for potential delays in supplier deliveries. Then, click {guilabel}`Save`. + +```{eval-rst} +.. example:: + Setting the :guilabel:`Security Lead Time for Purchase` to `2.00` days, pushes the + :guilabel:`Scheduled Date` of receipt back by two days. In that case, if a product is initially + scheduled to arrive on April 6th, with a two-day security lead time, the new scheduled date for + the receipt would be April 8th. + + .. image:: lead_times/vendor-security.png + :alt: Set security lead time for purchase from the Inventory > Configuration > Settings. +``` + +(inventory-warehouses-storage-days-to-purchase)= + +### Days to purchase lead time + +To set it up, go to {menuselection}`Inventory app --> Configuration --> Settings`. Under the +{guilabel}`Advanced Scheduling` section, in the {guilabel}`Days to Purchase` field, specify the +number of days required for the vendor to confirm a {{ RFQ }} after receiving it from the company. + +(inventory-warehouses-storage-manuf-lt)= + +## Manufacturing lead times + +Lead times can help simplify the procurement process for consumable materials and components used in +manufactured products with bills of materials (BoMs). + +The {{ MO }} deadline, which is the deadline to begin the manufacturing process to complete the product +by the scheduled delivery date, can be determined by configuring the manufacturing lead times and +manufacturing security lead times. + +```{image} lead_times/manuf-lead-times.png +:alt: Visualization of the determination of planned MO date manufacturing lead times. +``` + +### Manufacturing lead time + +Manufacturing lead times for products are configured from a product's bill of materials (BoM) form. + +To add a lead time to a {{ BoM }}, navigate to {menuselection}`Manufacturing app --> Products --> Bills +of Materials`, and select the desired {{ BoM }} to edit. + +On the {{ BoM }} form, click the {guilabel}`Miscellaneous` tab. Change the value (in days) in the +{guilabel}`Manuf. Lead Time` field to specify the calendar days needed to manufacture the product. + +```{image} lead_times/set-manufacturing.png +:alt: Manuf. Lead Time value specified on a product's Bill of Material form. +``` + +:::{note} +If the selected {{ BoM }} is a multi-level {{ BoM }}, the manufacturing lead times of the components are +added. + +If the {{ BoM }} product is subcontracted, the {guilabel}`Manuf. Lead Time` can be used to determine +the date at which components should be sent to the subcontractor. +::: + +Establish a {{ MO }} deadline, based on the *expected delivery date*, indicated in the +{guilabel}`Scheduled Date` field of the {abbr}`DO (Delivery Order)`. + +The {{ MO }} deadline, which is the {guilabel}`Scheduled Date` field on the {{ MO }}, is calculated as the +*expected delivery date* subtracted by the manufacturing lead time. + +This ensures the manufacturing process begins on time, in order to meet the delivery date. + +However, it is important to note that lead times are based on calendar days. Lead times do **not** +consider weekends, holidays, or *work center capacity* ({dfn}`the number of operations that can be +performed at the work center simultaneously`). + +:::{seealso} +- {doc}`Manufacturing planning <../../../manufacturing/workflows/use_mps>` +- {doc}`Schedule MOs with reordering rules ` +::: + +```{eval-rst} +.. example:: + A product's scheduled shipment date on the :abbr:`DO (Delivery Order)` is August 15th. The + product requires 14 days to manufacture. So, the latest date to start the :abbr:`MO + (Manufacturing Order)` to meet the commitment date is August 1st. +``` + +(inventory-warehouses-storage-prepare-manufacturing-order)= + +### Days to prepare manufacturing order + +Configure the days required to gather components to manufacture a product by going to its {{ BoM }}. To +do that, go to {menuselection}`Manufacturing app --> Products --> Bills of Materials`, and select +the desired {{ BoM }}. + +In the {guilabel}`Miscellaneous` tab of the {{ BoM }}, specify the calendar days needed to obtain +components of the product in the {guilabel}`Days to prepare Manufacturing Order` field. Doing so +creates {{ MOs }} in advance, and ensures there is enough time to either replenish components, or +manufacture semi-finished products. + +:::{tip} +Clicking {guilabel}`Compute`, located next to the {guilabel}`Days to prepare Manufacturing Order` +field, calculates the longest lead time among all the components listed on the {{ BoM }}. + +*Purchase security lead times* that impact this specific {{ BoM }} are also added to this value. +::: + +```{eval-rst} +.. example:: + + A |BoM| has two components, one has a manufacturing lead time of two days, and the other has a + purchase lead time of four days. The :guilabel:`Days to prepare Manufacturing Order` is four + days. +``` + +(inventory-warehouses-storage-manuf-security-lt)= + +### Manufacturing security lead time + +*Manufacturing security lead time* is set globally for the business in {menuselection}`Manufacturing +app --> Configuration --> Settings`. Under the {guilabel}`Planning` heading, tick the checkbox for +{guilabel}`Security Lead Time`. + +Next, enter the desired number of calendar days. By configuring the security lead time, a buffer is +set to account for potential delays in the manufacturing process. Then, click {guilabel}`Save`. + +```{image} lead_times/manuf-security.png +:alt: View of the security lead time for manufacturing from the manufacturing app settings. +``` + +```{eval-rst} +.. example:: + A product has a scheduled shipment date on the :abbr:`DO (Delivery Order)` set for August 15th. + The manufacturing lead time is 7 days, and manufacturing security lead time is 3 days. So, the + :guilabel:`Scheduled Date` on the |MO| reflects the latest date to begin the manufacturing order. + In this example, the planned date on the |MO| is August 5th. +``` + +## Global example + +See the following example to understand how all the lead times work together to ensure timely order +fulfillment: + +- **Sales security lead time**: 1 day +- **Manufacturing security lead time**: 2 days +- **Manufacturing lead time**: 3 days +- **Purchase security lead time**: 1 day +- **Vendor lead time**: 4 days + +The customer places an order for a manufactured product on September 1st, and the scheduled delivery +date from the warehouse is on September 20th. Odoo uses lead times and automated reordering rules to +schedule the necessary operations, based on the outgoing shipment delivery date, September 20th: + +```{image} lead_times/global-example.png +:alt: Show timeline of how lead times work together to schedule warehouse operations. +``` + +- **September 1st**: Sales order created, confirmed by salesperson. +- **September 9th**: Deadline to order components to ensure they arrive in time when manufacturing + begins (4-day supplier lead time). +- **September 13th**: Scheduled date of receipt for components. Initially, it was set to 9/14, but + the 1-day purchase security lead time pushed the date earlier by 1 day. +- **September 14th**: Deadline to begin manufacturing. Calculated by subtracting the manufacturing + lead time of 3 days, and the manufacturing security lead time of 2 days, from the expected + delivery date of September 19th. +- **September 19th**: {guilabel}`Scheduled Date` on the delivery order form indicates the updated + expected delivery date, which was originally set as September 20th. But the sales security lead + time pushed the date forward by a day. + +Odoo's replenishment planning maps a business' order fulfillment process, setting pre-determined +deadlines and raw material order dates, including buffer days for potential delays. This ensures +products are delivered on time. + diff --git a/content/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/mto.md b/content/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/mto.md new file mode 100644 index 000000000..5c11caa30 --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/mto.md @@ -0,0 +1,149 @@ +--- +substitutions: + BOM: '{abbr}`BOM (bill of materials)`' + MO: '{abbr}`MO (manufacturing order)`' + MTO: '{abbr}`MTO (make to order)`' + PO: '{abbr}`PO (purchase order)`' + RFQ: '{abbr}`RFQ (request for quotation)`' + SO: '{abbr}`SO (sales order)`' + SOs: '{abbr}`SOs (sales orders)`' +--- + +# Replenish on order (MTO) + +*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). + +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. + +:::{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. + +Finally, click {guilabel}`Save` to save the change. +::: + +(inventory-warehouses-storage-unarchive-mto)= + +## Unarchive MTO route + +By default, Odoo sets the {{ MTO }} route as *archived*. This is because {{ MTO }} is a somewhat niche +workflow that is only used by certain companies. However, it is easy to unarchive the route in just +a few simple steps. + +To do so, begin by navigating to {menuselection}`Inventory app --> Configuration --> Routes`. On the +{guilabel}`Routes` page, click the {icon}`fa-caret-down` {guilabel}`(down arrow)` icon on the right +side of the search bar, and click the {guilabel}`Archived` filter to enable it. + +```{image} mto/archived-filter.png +:align: center +:alt: The archived filter on the Routes page. +``` + +After enabling the {guilabel}`Archived` filter, the {guilabel}`Routes` page shows all routes which +are currently archived. Tick the checkbox next to {guilabel}`Replenish on Order (MTO)`, then click +the {icon}`fa-cog` {guilabel}`Actions` button to reveal a drop-down menu. From the drop-down menu, +select {guilabel}`Unarchive`. + +```{image} mto/unarchive-button.png +:align: center +:alt: The unarchive action on the Routes page. +``` + +Finally, remove the {guilabel}`Archived` filter from the search bar. The {guilabel}`Routes` page now +shows all unarchived routes, including {guilabel}`Replenish on Order (MTO)`, which is selectable on +the *Inventory* tab of each product page. + +## Configure product for MTO + +With the {{ MTO }} route unarchived, products can now be properly configured to use replenish on order. +To do so, begin by going to {menuselection}`Inventory app --> Products --> Products`, then select an +existing product, or click {guilabel}`New` to configure a new one. + +On the product page, select the {guilabel}`Inventory` tab and enable the {guilabel}`Replenish on +Order (MTO)` route in the {guilabel}`Routes` section, along with the {guilabel}`Buy` or +{guilabel}`Manufacture` route. + +:::{important} +The {guilabel}`Replenish on Order (MTO)` route **does not** work unless another route is selected +as well. This is because Odoo needs to know how to replenish the product when an order is placed +for it (buy or manufacture it). +::: + +```{image} mto/select-routes.png +:align: center +:alt: Select the MTO route and a second route on the Inventory tab. +``` + +If the product is purchased from a vendor to fulfill {{ SOs }}, enable the {guilabel}`Can be Purchased` +checkbox under the product name. Doing so makes the {guilabel}`Purchase` tab appear alongside the +other tabs below. + +Click the {guilabel}`Purchase` tab and specify a {guilabel}`Vendor` and the {guilabel}`Price` they +sell the product for. + +:::{important} +Specifying a vendor is essential for this workflow, because Odoo cannot generate an {{ RFQ }} without +knowing who the product is purchased from. +::: + +If the product is manufactured, make sure it has a bill of materials (BOM) configured for it. To do +so, click the {guilabel}`Bill of Materials` smart button at the top of the screen, then click +{guilabel}`New` on the {guilabel}`Bill of Materials` page to configure a new {{ BOM }} for the product. + +:::{seealso} +For a full overview of {{ BOM }} creation, see the documentation on {doc}`bills of materials +<../../../manufacturing/basic_setup/bill_configuration>`. +::: + +## Replenish using MTO + +After configuring a product to use the {{ MTO }} route, a replenishment order is created for it every +time an {{ SO }} or {{ MO }} including the product is confirmed. The type of order created depends on the +second route selected in addition to {{ MTO }}. + +For example, if *Buy* was the second route selected, then a {{ PO }} is created upon confirmation of an +{{ SO }}. + +:::{important} +When the {{ MTO }} route is enabled for a product, a replenishment order is always created upon +confirmation of an {{ SO }} or {{ MO }}. This is the case, even if there is enough stock of the product +on-hand to fulfill the {{ SO }}, without buying or manufacturing additional units of it. +::: + +While the {{ MTO }} route can be used in unison with the *Buy* or *Manufacture* routes, the *Buy* route +is used as the example for this workflow. Begin by navigating to the {menuselection}`Sales` app, +then click {guilabel}`New`, which opens a blank quotation form. + +On the blank quotation form, add a {guilabel}`Customer`. Then, click {guilabel}`Add a product` under +the {guilabel}`Order Lines` tab, and enter a product configured to use the *MTO* and *Buy* routes. +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. + +Return to the {{ SO }} by clicking the {guilabel}`SO` breadcrumb, or by navigating to +{menuselection}`Sales app --> Orders --> Orders`, and selecting the|SO|. + +Finally, click the {guilabel}`Delivery` smart button at the top of the order to open the delivery +order. Once the products have been shipped to the customer, click {guilabel}`Validate` to confirm +the delivery. + +:::{seealso} +For information on workflows that include the {{ MTO }} route, see the following documentation: + +- {doc}`resupply_warehouses` +- {doc}`../../../manufacturing/subcontracting/subcontracting_basic` +- {doc}`../../../manufacturing/advanced_configuration/sub_assemblies` +::: + diff --git a/content/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/reordering_rules.md b/content/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/reordering_rules.md new file mode 100644 index 000000000..7639bb699 --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/reordering_rules.md @@ -0,0 +1,578 @@ +--- +substitutions: + BoM: '{abbr}`BoM (Bill of Materials)`' + BoMs: '{abbr}`BoMs (Bills of Materials)`' + MO: '{abbr}`MO (Manufacturing Order)`' + MOs: '{abbr}`MOs (Manufacturing Orders)`' + PO: '{abbr}`PO (Purchase Order)`' + POs: '{abbr}`POs (Purchase Orders)`' + RFQ: '{abbr}`RFQ (Request for Quotation)`' + RFQs: '{abbr}`RFQs (Requests for Quotations)`' + SO: '{abbr}`SO (Sales Order)`' + SOs: '{abbr}`SOs (Sales Orders)`' + adjust: '{icon}`oi-settings-adjust` {guilabel}`(adjust)` icon' +--- + +# Reordering rules + +*Reordering rules* are used to keep forecasted stock levels above a certain threshold without +exceeding a specified upper limit. This is accomplished by specifying a minimum quantity that stock +should not fall below and a maximum quantity that stock should not exceed. + +Reordering rules can be configured for each product based on the route used to replenish it. If a +product uses the *Buy* route, then a *request for quotation* (RFQ) is created when the reordering +rule is triggered. If a product uses the *Manufacture* route, then a *manufacturing order* (MO) is +created instead. This is the case regardless of the selected replenishment route. + +:::{seealso} +- [Odoo Tutorials: Automatic Reordering Rules](https://www.youtube.com/watch?v=XEJZrCjoXaU) +- [Odoo Tutorials: Manual Reordering Rules](https://www.youtube.com/watch?v=deIREJ1FFj4) +::: + +To set up reordering rules for the first time, refer to: + +- {ref}`Reordering rules setup ` +- {ref}`Trigger ` +- {ref}`Preferred route ` + +To understand and optimize replenishment using advanced features, see: + +- {ref}`Just-in-time logic ` +- {ref}`Visibility days ` + +(inventory-warehouses-storage-configure-rr)= + +## Reordering rules setup + +To configure automatic and manual reordering rules, complete the following: + +1. {ref}`Product type configuration ` +2. {ref}`Replenishment method ` +3. {ref}`Create rule ` + +(inventory-warehouses-storage-set-product-type)= + +### Product type configuration + +A product must be configured correctly to use reordering rules. Begin by navigating to +{menuselection}`Inventory app --> Products --> Products`, then select an existing product, or create +a new one by clicking {guilabel}`New`. + +On the product form, under the {guilabel}`General Information` tab, set the {guilabel}`Product Type` +to {guilabel}`Goods`, and make sure the {guilabel}`Track Inventory` checkbox is ticked. This is +necessary for Odoo to track the product's stock levels and trigger reordering rules. + +```{image} reordering_rules/product-type.png +:alt: Product Type and Track Inventory configurations. +``` + +(inventory-warehouses-storage-set-method)= + +### Replenishment method + +Next, configure the replenishment method (e.g., buy or manufacture) by going to the +{guilabel}`Inventory` tab and select one or more routes from the {guilabel}`Routes` section. + +If the product is purchased, {ref}`install ` the **Purchase** app, and confirm that +the {guilabel}`Purchase` checkbox is enabled under the product name. In the {guilabel}`Purchase` +tab, add at least one vendor to the {doc}`vendor pricelist <../../../purchase/products/pricelist>`. +Odoo uses the vendor at the top of the list to generate {{ RFQs }} when reordering rules are triggered. + +In the {guilabel}`Inventory` tab's {guilabel}`Routes` field, tick the {guilabel}`Buy` checkbox. + +:::{seealso} +- {doc}`Buy route <../../../purchase/manage_deals/rfq>` +- {doc}`Vendor pricelist <../../../purchase/products/pricelist>` +::: + +If the product is manufactured, {ref}`install ` the **Manufacturing** app, and in +the {guilabel}`Inventory` tab's {guilabel}`Routes` field, tick the {guilabel}`Manufacture` checkbox. + +Next, ensure at least one {doc}`bill of materials +<../../../manufacturing/basic_setup/bill_configuration>` (BoM) is displayed in the {guilabel}`Bill +of Materials` smart button at the top of the product form. This is necessary because Odoo only +creates manufacturing orders for products with a {{ BoM }}. + +If a {{ BoM }} does not already exist for the product, click the {guilabel}`Bill of Materials` smart +button, then click {guilabel}`New` to configure a new {{ BoM }}. + +:::{seealso} +- {doc}`Manufacture route <../../../manufacturing/basic_setup/bill_configuration>` +::: + +(inventory-warehouses-storage-rr-fields)= + +### Create new reordering rules + +To create a new reordering rule, navigate to {menuselection}`Inventory app --> Operations --> +Replenishment`, then click {guilabel}`New`, and fill out the following fields for the new reordering +rule line item: + +- {guilabel}`Product`: The product that is replenished by the rule. +- {guilabel}`Location`: The location where the product is stored. +- {guilabel}`Min`: The minimum quantity that can be forecasted without the rule being + triggered. When forecasted stock falls below this number, a replenishment order for the product is + created. +- {guilabel}`Max`: The maximum quantity at which the stock is replenished. +- {guilabel}`Multiple Quantity`: If the product should be ordered in specific quantities, enter the + number that should be ordered. For example, if the {guilabel}`Multiple Quantity` is set to `5`, + and only 3 are needed, 5 products are replenished. + +:::{figure} reordering_rules/reordering-rule-form.png +:alt: The form for creating a new reordering rule. + +The form for creating a new reordering rule. +::: + +:::{tip} +Reordering rules can also be created from the {guilabel}`Reordering Rules` smart button on the +product form. +::: + +:::{note} +To learn how the {guilabel}`On Hand`, {guilabel}`Forecast`, and {guilabel}`To Order` fields are +calculated using on-hand quantities and future demand, see the {ref}`Just-in-time logic +` section. +::: + +For advanced usage of reordering rules, learn about the following reordering rule fields: + +- {ref}`Trigger ` +- {ref}`Preferred route ` +- {ref}`Vendor ` +- {ref}`Bill of materials ` +- {ref}`Procurement group ` +- {ref}`Visibility days ` + +:::{note} +The fields above are not available by default, and must be enabled by selecting the {{ adjust }} in +the far-right corner and selecting the desired column from the drop-down menu. +::: + +(inventory-warehouses-storage-zero-zero)= + +### 0/0/1 reordering rule + +The *0/0/1* reordering rule is a specialty rule used to replenish a product that is not kept +on-hand, each time a sales order (SO) is confirmed for that product. + +:::{important} +The 0/0/1 reordering rule is similar to the *Replenish on Order (MTO)* route, in that both +workflows are used to replenish a product upon confirmation of an {{ SO }}. + +The main difference between the two methods is that the *Replenish on Order* route automatically +reserves the product for the {{ SO }} that caused it to be replenished. This means the product +**cannot** be used for a different {{ SO }}. + +The 0/0/1 reordering rule does not have this limitation. A product replenished using the rule is +not reserved for any specific {{ SO }}, and can be used as needed. + +Another key difference is that replenishment orders created by the *Replenish on Order* route are +linked to the original {{ SO }} by a smart button at the top of the order. When using the 0/0/1 +reordering rule, a replenishment order is created, but is not linked to the original {{ SO }}. + +See the {doc}`Replenish on Order (MTO) ` documentation for a full overview of the MTO route. +::: + +To create a 0/0/1 reordering rule, navigate to {menuselection}`Inventory app --> Products --> +Products`, and select a product. + +At the top of the product's page, click the {icon}`fa-refresh` {guilabel}`Reordering Rules` smart +button to open the {guilabel}`Reordering Rules` page for the product. On the resulting page, click +{guilabel}`New` to begin configuring a new reordering rule. + +In the {guilabel}`Location` field of the new reordering rule, select the location in which +replenished products should be stored. By default, this location is set to {guilabel}`WH/Stock`. + +In the {guilabel}`Route` field, select the route the rule should use to replenish the item. For +example, if the product should be purchased from a vendor, select the {guilabel}`Buy` route. + +In the {guilabel}`Min Quantity` field and {guilabel}`Max Quantity` field, leave the values set to +`0.00`. In the {guilabel}`To Order` field, enter a value of `1.00`. + +```{image} reordering_rules/001-rule.png +:alt: A 0/0/1 reordering rule. +``` + +With the reordering rule configured using these values, each time an {{ SO }} causes the forecasted +quantity of the product to fall below the {guilabel}`Min Quantity` of `0.00`, the selected +{guilabel}`Route` is used to replenish the product in one-unit increments, back up to the +{guilabel}`Max Quantity` of `0.00`. + +```{eval-rst} +.. example:: + A picture frame is configured with a 0/0/1 reordering rule that uses the *Buy* route. Zero units + of the picture frame are kept on-hand at any given time. + + An |SO| is confirmed for one unit of the picture frame, which causes the forecasted quantity to + drop to `-1.00`. This triggers the reordering rule, which automatically creates a |PO| for one + unit of the picture frame. + + Once the product is received from the vendor, the forecasted quantity of the picture frame + returns to `0.00`. There is now one picture frame on-hand, but it is not reserved for the |SO| + which triggered its purchase. It can be used to fulfill that |SO|, or reserved for a different + order. +``` + +(inventory-product-management-trigger)= + +## Trigger + +A reordering rule's *trigger* can be set to *automatic* or *manual*. While both function the same +way, the difference between the two types of reordering rules is how the rule is launched: + +- {ref}`Auto `: A purchase or manufacturing order is + automatically created when the forecasted stock falls below the reordering rule's minimum + quantity. By default, the {guilabel}`Auto` trigger is selected. +- {ref}`Manual `: The {doc}`Replenishment report ` + lists products needing replenishment, showing current/forecasted stock, lead times, and arrival + dates. Users can review forecasts before clicking *Order*. + +To enable the {guilabel}`Trigger` field, go to {menuselection}`Inventory app --> Operations --> +Replenishment`. Then, click the {{ adjust }}, located to the far-right of the column titles, and tick +the {guilabel}`Trigger` checkbox. + +In the {guilabel}`Trigger` column, select {guilabel}`Auto` or {guilabel}`Manual`. Refer to the +sections below to learn about the different types of reordering rules. + +(inventory-warehouses-storage-auto-rr)= + +### Auto + +*Automatic reordering rules*, enabled by setting the reordering rule's {guilabel}`Trigger` field to +{guilabel}`Auto`, generate purchase or manufacturing orders when either: + +1. The scheduler runs, and the *Forecasted* quantity is below the minimum, or +2. A sales order is confirmed, and lowers the *Forecasted* quantity of the product below the + minimum. + +If the {guilabel}`Buy` route is selected, then an {{ RFQ }} is generated. To view and manage {{ RFQs }}, +navigate to {menuselection}`Purchase app --> Orders --> Requests for Quotation`. + +If the {guilabel}`Manufacture` route is selected, then an {{ MO }} is generated. To view and manage +{{ MOs }}, navigate to {menuselection}`Manufacturing app --> Operations --> Manufacturing Orders`. + +When no route is selected, Odoo selects the {guilabel}`Route` specified in the {guilabel}`Inventory` +tab of the product form. + +:::{tip} +The scheduler is set to run once a day, by default. + +To manually trigger a reordering rule before the scheduler runs, ensure {ref}`developer mode +` is enabled, and select {menuselection}`Inventory app --> Operations --> Run +Scheduler`. Then, click the purple {guilabel}`Run Scheduler` button on the pop-up window that +appears. + +Be aware that this also triggers any other scheduled actions. +::: + +```{eval-rst} +.. example:: + The product, `Office Lamp`, has an automatic reordering rule set to trigger when the forecasted + quantity falls below the :guilabel:`Min Quantity` of `5.00`. Since the current + :guilabel:`Forecast` is `55.00`, the reordering rule is **not** triggered. + + .. image:: reordering_rules/auto.png + :alt: Show automatic reordering rule from the Reordering Rule page. +``` + +(inventory-warehouses-storage-manual-rr)= + +### Manual + +*Manual reordering rules*, configured by setting the reordering rule's {guilabel}`Trigger` field to +{guilabel}`Manual`, list a product on the {doc}`replenishment dashboard ` when the +forecasted quantity falls below a specified minimum. Products on this dashboard are called *needs*, +because they are needed to fulfill upcoming sales orders, for which the forecasted quantity is not +enough. + +The replenishment dashboard, accessible by navigating to {menuselection}`Inventory app --> +Operations --> Replenishment`, considers sales order deadlines, forecasted stock levels, and vendor +lead times. It displays needs **only** when it is time to reorder items, thanks to the {guilabel}`To +Reorder` filter. + +When a product appears on the replenishment dashboard, clicking the {guilabel}`Order` button +generates the purchase or manufacturing order with the specified amounts {guilabel}`To Order`. + +```{image} reordering_rules/manual.png +:alt: Click the Order button on the replenishment dashboard to replenish stock. +``` + +(inventory-warehouses-storage-route)= + +## Route + +Odoo allows for multiple routes to be selected as replenishment methods under the +{guilabel}`Inventory` tab on each product form. For instance, it is possible to select both +{guilabel}`Buy` and {guilabel}`Manufacture`, indicating to Odoo that the product can be bought or +manufactured. + +Odoo also enables users to set a preferred route for a product's reordering rule. This is the +replenishment method (e.g., buying or manufacturing) that the rule defaults to, if multiple are +available. + +To specify a preferred route, begin by navigating to {menuselection}`Inventory app --> Operations +--> Replenishment`. + +By default, the {guilabel}`Route` column is hidden. To reveal it, select the {{ adjust }} to the +far-right of the column titles, and ticking {guilabel}`Route` from the drop-down menu that appears. + +Click inside of the column on the row of a reordering rule, and a drop-down menu shows all available +routes for that rule. Select one to set it as the preferred route. + +```{image} reordering_rules/select-preferred-route.png +:alt: Select a preferred route from the drop-down. +``` + +:::{important} +If multiple routes are enabled for a product but no preferred route is set for its reordering +rule, the product is reordered using the *Buy* route, then *Manufacture*. +::: + +### Advanced uses + +Pairing {guilabel}`Route` with one of the following fields on the replenishment report unlocks +advanced configurations of reordering rules. Consider the following: + +(inventory-warehouses-storage-set-vendor)= + +- {guilabel}`Vendor`: When the selected {guilabel}`Route` is {guilabel}`Buy`, setting the + {guilabel}`Vendor` field to one of the multiple vendors on the vendor pricelist indicates to Odoo + that the vendor is automatically populated on {{ RFQs }} when a reordering rule triggers the creation + of a purchase order. + +(inventory-warehouses-storage-set-bom-field)= + +- {guilabel}`Bill of Materials`: When the {guilabel}`Route` is set to {guilabel}`Manufacture`, and + there are multiple {{ BoMs }} in use, specifying the desired {{ BoM }} in the replenishment report, draft + manufacturing orders are created with this {{ BoM }} in use. + +(inventory-warehouses-storage-procurement-grp)= + +- {guilabel}`Procurement Group`: This is a way to group related {{ POs }} or {{ MOs }} that are tied to + fulfilling a specific demand, like an {{ SO }} or a project. It helps organize and track which orders + are linked to a particular demand. + + ::::{note} + Procurement groups link replenishment methods to demand, enabling smart buttons to appear when + using the {doc}`MTO route `. + + :::{figure} reordering_rules/po-smartbutton.png + :alt: Showing smart button to PO. + + Sales order (demand) with a linked purchase order (replenishment method). + ::: + :::: + + In the context of reordering rules: + + - Reordering rules do not automatically assign a procurement group, which is why there are no + smart buttons that link {{ SOs }} to {{ POs }}, unlike the {abbr}`MTO (Make to Order)` route. + - To enable smart buttons for products replenished by reordering rules (not {abbr}`MTO (Make to + Order)`), with specific quantities linked to specific demands (e.g. {{ SOs }}), assign a procurement + group. + - Without a procurement group, demands for the same product can be combined into a single {{ RFQ }}, + even if the reordering rule is executed multiple times for those demands. This allows for more + efficient procurement by consolidating demands into fewer orders. + + Selecting a procurement group in the {guilabel}`Procurement Group` field on the replenishment + report ensures that all linked orders are grouped under the same demand, based on the defined + route. + + ```{eval-rst} + .. exercise:: + How can you set the *Procurement Group*, *Vendor*, and *Route* fields on the replenishment + report to generate a single |RFQ| for five different products in sales order SO35, given they + share the same vendor, Azure Interior, and ensure other demands for these products are handled + separately? + + .. spoiler:: View the answer + + #. Set the :guilabel:`Procurement Group` to `SO35`, in the reordering rule for all five + products. This groups the demands for `SO35` in the same |RFQ| or |MO|. + #. Set the :guilabel:`Vendor` to `Azure Interior` to ensure the |RFQ| is created for the + same supplier. + #. Set the :guilabel:`Route` to :guilabel:`Buy` to generate an |RFQ|. + #. Click the :guilabel:`Order` button to generate a single |RFQ| for the five products tied + to `SO35`. + + | After placing the order, remove `SO35` from the :guilabel:`Procurement Group` field of the + five products' reordering rules. This ensures future demands for these products are + managed separately and assigned to different |RFQs| (the usual behavior). + ``` + +(inventory-warehouses-storage-just-in-time)= + +## Just-in-time logic + +*Just-in-time logic* in Odoo minimizes storage costs by placing orders precisely to meet deadlines. +This is achieved using the {ref}`forecasted date `, +which determines when replenishment is necessary to avoid overstocking. + +The forecasted date is the **earliest possible date** to receive a product if the replenishment +process starts immediately. It is calculated by summing the lead times linked to the replenishment +process, such as {ref}`vendor lead times ` and +{ref}`purchasing delays ` for purchases, or +{ref}`manufacturing lead times ` for production. Both +automatic and manual reordering rules work this way. + +```{eval-rst} +.. example:: + For a product with a 5-day total lead time and a sales order delivery date in 10 days, Odoo waits + 5 days to place the order, ensuring it arrives just in time for delivery. +``` + +Important considerations: + +- **If this feels risky**, consider adding buffer time or {doc}`adjusting lead times ` + for more flexibility. +- While lead times and just-in-time logic provide additional control, **reordering rules work + perfectly fine without them**. Keeping delivery dates on sales orders as their *creation date* + ensures purchases are immediately triggered when needed + +(inventory-warehouses-storage-forecasted-date)= + +### Forecasted date and To Order quantity + +To view the *forecasted date*, go to the replenishment report and click the {icon}`fa-info-circle` +{guilabel}`(info)` icon for the desired reordering rule. The {guilabel}`Replenishment Information` +pop-up window displays the {guilabel}`Forecasted Date` and various lead times. + +The *forecasted date* is the total time needed to procure a product in Odoo. It is calculated by +summing the lead times linked to the product's replenishment process. The total of these lead times, +added to the current date, determines when Odoo checks for demanded stock. + +:::{important} +The forecasted date is the **earliest possible date** the customer can receive the product if the +replenishment process began right **now**. It is calculated by adding all lead times related to +the product to the current date. +::: + +```{eval-rst} +.. example:: + A manual reordering rule is set up with no minimum or maximum quantities. + + - Vendor lead time is 4 days, the purchase security lead time is 1 day, and the days to purchase + is 2 days. + - Today's date is November 26. + - These add up to 7 days, making the forecasted date, December 3rd. + + A confirmed |SO| for 5 units has a delivery date of December 3rd (7 days from today). This demand + will appear on the replenishment report today, in the **To Order** field. + + However, if the delivery date were later than December 3rd, it would not yet appear on the + report. Odoo only displays quantities to replenish when they fall within the forecasted date + window, ensuring orders are placed precisely when needed. + + .. image:: reordering_rules/replenishment-info.png + :alt: Show forecasted date in Odoo. +``` + +The *just-in-time* logic ensures replenishment happens only when it's necessary for the forecasted +date's demand, helping avoid overstocking. + +For example: + +- If the forecasted quantity drops below the minimum **on** the forecasted date, replenishment must + begin immediately to avoid shortages. +- If the quantity drops below the minimum **after** the forecasted date, replenishment can wait. + +The **To Order** quantity is the total demand on the forecasted date. + +By timing purchase orders based on the combined lead times, Odoo optimizes stock levels, keeping +inventory minimal while ensuring future requirements are ordered at the last possible +moment—strategic procrastination without the stress! + +### Common confusion about forecasted quantities + +{{ SOs }} due **after** the {guilabel}`Forecasted Date` are not accounted for in the +{guilabel}`Forecast` quantities of the reordering rule. + +They are, however, accounted for on the forecasted report that is opened by clicking the +{icon}`fa-area-chart` {guilabel}`(graph)` icon on the replenishment report, as this one represents +the **long-term forecasted quantity**. + +```{eval-rst} +.. example:: + + .. figure:: reordering_rules/zero-forecast.png + :alt: Forecast and To Order quantities is zero. + + Continuing the above example, when the sales order's deadline is adjusted to December 4th, the + :guilabel:`Forecast` and :guilabel:`To Order` quantities are zero. + + .. figure:: reordering_rules/five-forecast.png + :alt: Show forecasted report. + + Opening the :guilabel:`Forecasted Report` shows the :guilabel:`Forecasted` units is `5.00`. +``` + +(inventory-product-management-visibility-days)= + +## Visibility days + +*Visibility days* enable the ability to determine if additional quantities should be added to the +planned replenishment. Odoo checks if forecasted stock on the forecasted date will drop below the +minimum in the reordering rule. **Only if** it is time to reorder, visibility days check additional +future demand by the specified number of days. + +This feature helps consolidate orders by grouping immediate and near-future needs, reducing +transport costs and enabling supplier discounts for larger orders. + +To set visibility days to incorporate orders for a specified number of days in the future, navigate +to {menuselection}`Inventory app --> Operations --> Replenishment`, or by clicking the *Reordering +Rules* smart button from the product form. + +Next, enable the {guilabel}`Visibility Days` field by clicking the {{ adjust }} to the far right and +choosing the feature from the drop-down menu. Then, enter the desired visibility days. + +:::{important} +The forecasted date is never pushed forward or extended; Odoo only checks the extra visibility +days if the stock falls below the minimum threshold on the forecasted date. +::: + +### Example where visibility days is triggered + +A product shipped from Asia has a combined vendor lead time of 30 days and a shipping cost of \$100 +(including {doc}`landed costs <../../product_management/inventory_valuation/landed_costs>` and +tariffs). + +- November 4: Current date. The forecasted date is December 4 (30 days later). +- {{ SO }} 1: Requires the product by Dec 4. Odoo places the order today, costing \$100. +- {{ SO }} 2: Requires the product by Dec 19. Normally, Odoo would order on Nov 19, costing an + additional \$100. +- {{ SO }} 3: Requires the product by Dec 25. Normally, Odoo would order on Nov 25, costing another + \$100. + +Ordering separately for these sales orders totals \$300 in shipping costs. + +```{image} reordering_rules/forecasted-date.png +:alt: Show forecasted date visualization. +``` + +Setting {guilabel}`Visibility Days` to `20.0` allows Odoo to "look ahead" 20 days from December 4 +({{ SO }} 1's forecasted date) to December 24. + +- It groups {{ SO }} 2's order with {{ SO }} 1, reducing shipping costs by consolidating orders. +- {{ SO }} 3, which is due on Dec 25, is one day late and is not grouped with the other two orders. + +```{image} reordering_rules/visibility-days.png +:alt: Visibility days visualization. +``` + +### Counterexample where visibility days is not triggered + +Considering the example above, if {{ SO }} 1 does not exist, then: + +- **November 4**: Current date. The forecasted date is December 4 (30 days later). +- **November 5**: The forecasted date shifts to December 5. +- {{ SO }} 2: Requires the product by December 19. Odoo will only trigger the order on November 19, + meaning the user will not see a replenishment notification until then. + +This shows that visibility days complement just-in-time logic by optimizing it to balance +replenishment costs more effectively. + +```{image} reordering_rules/counterexample.png +:alt: Example where the visibility days does not trigger. +``` + diff --git a/content/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/report.md b/content/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/report.md new file mode 100644 index 000000000..d9ebd12bc --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/report.md @@ -0,0 +1,55 @@ +--- +substitutions: + SO: '{abbr}`SO (Sales Order)`' + SOs: '{abbr}`SOs (Sales Orders)`' +--- + +# Replenishment report + +The *replenishment report* is an interactive dashboard that uses {doc}`manual reordering rules +`, lead times, and upcoming demands to forecast quantities of products that need +restocking. + +Reordering rules used on this dashboard are normal reordering rules, but the user benefits from a +monitoring menu with extra options to manage suggestions for replenishment. + +This enables users to anticipate future needs, keep less products on hand without the risk of +running out, plan and consolidate orders. + +To access the replenishment report, go to {menuselection}`Inventory app --> Operations --> +Replenishment.` + +The fields and features unique to the replenishment dashboard are displayed below. For definitions +of the other fields, go to the {ref}`Create reordering rules section +`. + +By default, the quantity in the {guilabel}`To Order` field is the quantity required to reach the set +{guilabel}`Max Quantity`. However, the {guilabel}`To Order` quantity can be adjusted by clicking on +the field and changing the value. To replenish a product manually, click {icon}`fa-truck` +{guilabel}`Order Once`. + +Clicking {icon}`fa-bell-slash` {guilabel}`Snooze` temporarily deactivates the reordering rule for +the set period, hiding the entry from the replenishment dashboard, when it is supposed to appear. + +:::{tip} +Defining a {guilabel}`Vendor` allows filtering or grouping demands by the vendor. This simplifies +the process of identifying products to order and can reduce shipment costs. +::: + +```{image} report/replenishment-dashboard.png +:alt: Replenishment report that displays recommended quantities to order. +``` + +:::{note} +Automatic reordering rules appear on this menu, too but are hidden by default. +::: + +## Replenishment information + +In each line of the replenishment report, clicking the {icon}`fa-info-circle` {guilabel}`(info)` +icon opens the {guilabel}`Replenishment Information` pop-up window, which displays the *lead times* +and *forecasted date*. + +For detailed information on how to use this feature for replenishment, go to the {ref}`Just in time +logic ` section. + diff --git a/content/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/resupply_warehouses.md b/content/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/resupply_warehouses.md new file mode 100644 index 000000000..5aef7cc0e --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/warehouses_storage/replenishment/resupply_warehouses.md @@ -0,0 +1,183 @@ +--- +substitutions: + MTO: '{abbr}`MTO (Make to Order)`' +--- + +# Inter-warehouse replenishment + +When a business operates multiple locations, such as warehouses, retail shops, or manufacturing +facilities, resupplying stock from a central warehouse is sometimes necessary. Odoo uses a *Route* +configuration that enables locations to replenish from a central distribution center, automatically +generating *inter-warehouse transfers*. Odoo {guilabel}`Inventory` manages these transfers to keep +stores in stock. + +This guide explains how to conduct inter-warehouse transfers using two replenishment strategies: + +1. {ref}`Make to order (MTO) ` +2. {ref}`Reordering rule ` + +:::{seealso} +{doc}`Difference between MTO and reordering rules <../replenishment>` +::: + +## Configuration + +The initial configuration for both replenishment strategies is the same. First go to +{menuselection}`Inventory app --> Configuration --> Settings`. In the {guilabel}`Warehouse` section, +activate {guilabel}`Storage Locations`. Then, click {guilabel}`Save` to apply the setting. + +```{image} resupply_warehouses/storage-locations.png +:align: center +:alt: Enable Storage Locations in Inventory settings. +``` + +### Warehouses + +Configure the settings for the central warehouse and connecting storage locations by going to +{menuselection}`Inventory app --> Configuration --> Warehouses`. + +:::{important} +Each central warehouse and other locations *must* have its own warehouse. For example, each shop +is considered a local warehouse. +::: + +Select an existing warehouse, or create a new one to be resupplied from the central warehouse, by +clicking {guilabel}`New`. Then, give the warehouse a name and a {guilabel}`Short Name`, which will +appear on that warehouse's transfers. + +In the {guilabel}`Warehouse Configuration` tab, locate the {guilabel}`Resupply From` field. Check +the box next to the central warehouse's name. If the warehouse can be resupplied by more than one +warehouse, make sure to check those warehouses' boxes too. Now, Odoo knows which warehouses can +resupply this warehouse. + +```{eval-rst} +.. example:: + The central warehouse that will supply the shops is called `Central warehouse`. The + :guilabel:`Resupply From` field is set to this warehouse on the shop's warehouse configuration + page. +``` + +:::{seealso} +{doc}`../inventory_management/warehouses` +::: + +```{image} resupply_warehouses/warehouse.png +:align: center +:alt: Supply one warehouse with another in the Warehouse Configuration tab. +``` + +### Set route on a product + +Products must also be configured properly in order for them to be transferred between warehouses. + +Go to {menuselection}`Inventory app --> Products --> Products` and select the desired product. + +In the {guilabel}`Inventory` tab, the new route appears as {guilabel}`X: Supply Product from Y` in +the {guilabel}`Routes` section, where 'X' is the store's warehouse that receives products, and 'Y' +is the warehouse that sends products. + +Tick the {guilabel}`X: Supply Product from Y` checkbox, which is intended to be used with the {{ MTO }} +route or a reordering rule to replenish stock by moving the product from one warehouse to another. +Proceed to the dedicated sections below to continue the process. + +(inventory-warehouses-storage-mto)= + +#### MTO + +To replenish products using the make-to-order method, go to the product form and ensure the +{ref}`MTO route is unarchived `, so it appears in the +{guilabel}`Routes` section of the {guilabel}`Inventory` tab. + +With the resupply and {{ MTO }} routes ticked, jump to the section titled: {ref}`Replenish from another +warehouse `. + +```{eval-rst} +.. example:: + The product, sold at the warehouse, `Store`, is resupplied from the central warehouse, named + `YourCompany`. To replenish the product using |MTO|, the following routes are selected: + + - :guilabel:`Store: Supply Product from YourCompany` + - :guilabel:`Replenish on Order (MTO)` + + .. image:: resupply_warehouses/resupply-route.png + :align: center + :alt: Route setting which enables a product to resupplied from a second warehouse. +``` + +(inventory-warehouses-storage-reordering-rule)= + +#### Reordering rule + +To replenish products using reordering rules, first ensure the {guilabel}`X: Supply Product from Y` +route is selected in the {guilabel}`Inventory` tab of the product form. + +Then, create a reordering rule to automate replenishment by clicking the {guilabel}`Reordering +Rules` smart button. + +Click {guilabel}`New`, and set: + +- {guilabel}`Location`: the stock location of the retail store. For example, `SHOP/Stock`. +- {guilabel}`Route`: {guilabel}`X: Supply Product from Y`. +- {guilabel}`Min Quantity` and {guilabel}`Max Quantity` to trigger automatic stock transfers when + inventory falls below the set threshold. + +:::{seealso} +{doc}`reordering_rules` +::: + +```{eval-rst} +.. example:: + A :ref:`0/0 reordering rule ` to replenish the shop's + warehouse is created, with the :guilabel:`Location` set to `SHOP/Stock`, and the + :guilabel:`Route` set to :guilabel:`Store: Resupply from YourCompany`. + + .. image:: resupply_warehouses/reordering-rule.png + :align: center + :alt: Show reordering rule configurations. +``` + +(inventory-warehouses-storage-resupply-workflow)= + +## Replenish one warehouse from another + +After completing the setup, trigger replenishment using one of several methods, such as: + +- Navigate to the product form of the product that is resupplied from another warehouse. + + Click the {guilabel}`Replenish` button on the top-left of the product page. In the pop-up window, + set the warehouse to the retail shop, (e.g. `Store`), and click {guilabel}`Confirm`. + + ```{image} resupply_warehouses/replenish.png + :align: center + :alt: Replenish pop-up window on the product form. + ``` + +- Create a quotation, and in the {guilabel}`Other Info` tab, set the {guilabel}`Warehouse` to the + retail shop (e.g. `Store`), when selling the product makes the on-hand quantity of the product go + below the minimum set on the reordering rule. + + ```{image} resupply_warehouses/warehouse-field.png + :align: center + :alt: Create a quote at the store. + ``` + +Once triggered, Odoo creates two transfers: One is a *delivery order* from the central, supplying +warehouse, which contains all the necessary products to the store, and the second is a *receipt* at +the shop, from the main warehouse. + +While in transit, the product is located at `Physical Locations/Inter-warehouse transit`. + +```{eval-rst} +.. example:: + A sales order for the product at the shop is created. To replenish the product at the shop and + ship it from there, Odoo generates a delivery order from the central warehouse's stock, + `WH/Stock` to the shop's warehouse `SHOP/Stock`. While the products are traveling between + warehouses, they are in `Physical Locations/Inter-warehouse transit`. + + The final delivery order is from the shop to the customer's delivery address, and is not + pertinent to the workflow in this guide. + + .. image:: resupply_warehouses/transfers.png + :alt: Show shipments from warehouse to store. +``` + diff --git a/content/applications/inventory_and_mrp/inventory/warehouses_storage/reporting.md b/content/applications/inventory_and_mrp/inventory/warehouses_storage/reporting.md new file mode 100644 index 000000000..d530f126d --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/warehouses_storage/reporting.md @@ -0,0 +1,15 @@ +--- +nosearch: true +--- + +# Reporting + +```{toctree} +:titlesonly: true + +reporting/stock +reporting/locations +reporting/moves_history +reporting/aging +``` + diff --git a/content/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/aging.md b/content/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/aging.md new file mode 100644 index 000000000..8b2f15bfb --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/aging.md @@ -0,0 +1,234 @@ +--- +substitutions: + SVLs: '{abbr}`SVLs (stock valuation layers)`' +--- + +# Stock valuation dashboard + +When a company has physical assets, such as inventory, they often want to know approximately how +much has been spent on these goods, or how much they are worth at the moment. This process of +assigning a monetary value to account for inventory is known as *stock valuation*. + +This value is often reported for accounting purposes. For instance, an insurance company may want to +know the value of goods stored in a warehouse, in the event of a flood or fire. + +{doc}`Stock valuation <../../product_management/inventory_valuation/using_inventory_valuation>` +typically utilizes one of two accounting systems: + +- **Perpetual**: The inventory is constantly (perpetually) being updated, and the value is + constantly changing. +- **Periodic**: The inventory value is checked on an occasional (periodic) basis, and the value is + set at this occasional time. + +Using {ref}`tracked inventory ` in Odoo +necessitates a *perpetual* inventory accounting system because of the need to know when and where +inventory exists, and how much of it is available or forecasted. There are a few common {ref}`stock +valuation methods ` used in Odoo: *standard price*, +*average cost* (AVCO), and *first in, first out* (FIFO) accounting. It is important to know that the +valuation method chosen for a product impacts the calculation of several fields in the stock +valuation reports. + +## Open the dashboard + +Odoo's *Stock Valuation* dashboard displays the financial value of all tracked inventory, according +to each product's stock valuation method. This report can provide insights into potential issues in +the supply chain, such as sunken purchase costs or delays in profitability. To access the dashboard, +go to {menuselection}`Inventory app --> Reporting --> Valuation`. + +:::{important} +The {menuselection}`Reporting`` menu in **Inventory** is only accessible to users with +{doc}`admin access <../../../../general/users/access_rights>`. +::: + +This dashboard has three different views, or inventory reports — {ref}`list view +` (i.e. the default stock valuation report), +{ref}`pivot view ` (i.e. the stock aging report), and +{ref}`graph view `. Each view can be customized with +different fields to break down inventory valuation by product, operation type, date, or company. + +All three views can be filtered by various fields. To apply filters, click into the search bar at +the top of the report, or click the drop-down arrow next to it. For example, selecting the filter +{guilabel}`Has Remaining Qty` will show only products that are currently in stock. + +(inventory-warehouses-storage-valuation-report)= + +## List view: stock valuation + +By default, the {guilabel}`Stock Valuation` dashboard displays in *list view*, represented by the +{icon}`oi-view-list` {guilabel}`(list)` icon. This report shows a detailed record of stock movements +and their valuations. + +### Configure + +The following columns are displayed by default: + +- {guilabel}`Date`: the date and time when the {ref}`stock move ` + was created. The valuation report is sorted by this field by default, emphasizing the importance + of time when valuing inventory. To sort the report by a different column, simply click on the + column title. +- {guilabel}`Reference`: the reference document associated with this stock move (e.g., a warehouse + receipt, a delivery order, or a manual inventory adjustment). +- {guilabel}`Product`: the product that is being moved and valued. +- {guilabel}`Quantity`: the number of units by which this product's stock has increased or + decreased in this particular stock move. +- {guilabel}`Total Value`: the value of the product's stock in this particular stock move, + calculated by multiplying the {guilabel}`Quantity` and {guilabel}`Unit Value`. + +:::{note} +If a {guilabel}`Reference` document includes several goods, there will be a separate line item +generated on the report for each good. +::: + +There are additional fields that can be added to this view to provide more insight into the stock's +valuation. To add fields, click the {icon}`oi-settings-adjust` {guilabel}`(adjust)` icon, and select +the desired fields: + +- {guilabel}`Lot/Serial Number`: the uniquely identifying lot or serial number for this product. +- {guilabel}`Company`: for businesses that operate with multiple companies, this field displays the + company by which this stock move took place. +- {guilabel}`Remaining Quantity`: the number of units remaining for this valuation of the product, + after demand has been accounted for (even from other stock moves). This field can be especially + helpful for {abbr}`FIFO (First In, First Out)` and {abbr}`AVCO (Average Cost)` accounting, as it + conveys which units of stock came into a warehouse first and the value of said stock. +- {guilabel}`Unit Value`: the cost of one unit of the product for the company (**not** the price to + consumers). +- {guilabel}`Description`: a description of the reason for this stock valuation (typically, a stock + move has occurred). By default, this field is set as the concatenation of the + {guilabel}`Reference` and {guilabel}`Product` fields. However, the field may also display other + important messages for this line item, such as a note stating that the line item is an adjustment + due to a change in the product's inventory valuation method. +- {guilabel}`Remaining Value`: the value of this product's current stock levels for this particular + stock move, after demand has been accounted for. Along with {guilabel}`Remaining Quantity`, this + field can be especially helpful for {abbr}`FIFO (First In, First Out)` and + {abbr}`AVCO (Average Cost)` accounting, as they convey which stock came into a warehouse first and + the value of said stock. + +:::{tip} +Some of these settings may not appear unless first enabled in Odoo's **:doc:\`Settings +\<../../../general>\`** application. +::: + +```{image} aging/stock-valuation-report.png +:alt: Stock valuation report. +``` + +(inventory-warehouses-storage-svl)= + +### Stock valuation layers (SVLs) + +Each line item in the {guilabel}`Stock Valuation` report represents a record in Odoo's system known +as a *stock valuation layer (SVL)*. {abbr}`SVLs (stock move layers)` are generated when products +move in a way that impacts their stock valuation. Specifically, the stock moves that generate +{abbr}`SVLs (stock move layers)` are warehouse receipts, deliveries, dropshipping orders, and +dropshipping returns. These stock moves must first be validated (by clicking the +{guilabel}`Validate` button) for the {abbr}`SVL (stock move layer)` to be created. + +If a product's inventory valuation method changes on the product form, new line items are generated +on the {guilabel}`Stock Valuation` report to reflect the resulting {abbr}`SVLs (stock move layers)`. +For example, if the valuation method changes from *standard price* to either {abbr}`AVCO (Average +Cost)` or {abbr}`FIFO (First In, First Out)` accounting, *revaluation entries* will be +automatically posted to reflect the change in pricing for goods that remain in stock. One entry will +be negative to "remove" the old pricing, and the second entry will be positive to record the new +pricing. These entries are connected to journal entries in Odoo's **Accounting** app. + +Below is an example of what the {guilabel}`Stock Valuation` table shows when a few stock moves have +occurred for a product using standard price accounting. + +```{image} aging/before-val-method-change.png +:alt: Stock valuation table in standard price accounting. +``` + +Conversely, the following image depicts what the *Stock Valuation* Report table might look like +after a product has switched from standard price to {abbr}`FIFO (First In, First Out)` accounting. + +```{image} aging/after-val-method-change.png +:alt: Stock valuation table after switching from standard price to FIFO accounting. +``` + +```{eval-rst} +.. example:: + The :guilabel:`Remaining Value` and :guilabel:`Remaining Quantity` fields are derived from what + occurs at the :abbr:`SVL (stock move layer)` level in Odoo and, as such, are better understood + with an example. + + Frankie's Consignment Shop buys sweaters at the cost, or :guilabel:`Unit Value`, of `5.00` + dollars. For the first time, Frankie's purchases and receives a :guilabel:`Quantity` of `100.00` + sweaters in one stock move, then re-sells and delivers `-10.00` sweaters in a second stock move. + + In the first stock move line item, the :guilabel:`Remaining Quantity` will change from `100.00` + to `90.00`, once the second stock move is recorded. This change reflects that, although 100 + sweaters were originally purchased, only 90 of those sweaters remain in stock and should be + counted in the valuation. Similarly, the :guilabel:`Remaining Value` will drop from `$500.00` to + `$450.00`. The :guilabel:`Total Value` will remain at `$500.00`, regardless of subsequent + transactions. + + On the other hand, the :guilabel:`Remaining Quantity` of the second stock move line item will be + recorded and remain at `0.00` because the quantity of `-10.00` was sold. In the system, because + the :abbr:`SVL (stock move layer)` was a sale, there is no stock left that needs to be valued + from that transaction. + + .. image:: aging/remaining-val-quant.png + :alt: Remaining value and quantity are calculated based on :abbr:`SVLs (stock move layers)`. +``` + +### Change the valuation date + +To see the valuation of stock moves at a specific date and time, click the {guilabel}`Valuation At +Date` button, located in the top-left corner of the {guilabel}`Stock Valuation` page. The report +will show the {guilabel}`Quantity` and {guilabel}`Total Value` of each stock move. + +:::{note} +The {guilabel}`Remaining Quantity` and {guilabel}`Remaining Value` of the stock moves will *not* +be point-in-time for any dates chosen in the past. The stock moves shown when selecting a past +date will still display the *current on-hand quantity and value* of the products. +::: + +```{eval-rst} +.. example:: + A business has 100 sofas in stock on January 1st and sells 20 of those sofas on February 1st. The + :guilabel:`Remaining Quantity` of the :abbr:`SVL (stock move layer)` will drop from `100.00` to + `70.00` on February 1st. If no other stock moves take place, and on February 1st, the + :guilabel:`Valuation at Date` is selected as January 1st, the :guilabel:`Remaining Quantity` + will still show as `70.00`. +``` + +(inventory-warehouses-storage-aging-report)= + +## Pivot view: stock aging + +From the {guilabel}`Stock Valuation` dashboard, access pivot view by clicking the +{icon}`oi-view-pivot` {guilabel}`(pivot)` icon. This view is essentially a *stock aging report*, and +it shows the on-hand quantity and value of inventory by purchase date, which can help monitor +products with expiration dates. + +### Configure + +By default, the pivot view shows the value of all *product categories* by *day and month*. Clicking +the {icon}`fa-plus-square` {guilabel}`(plus)` icon in each column or row will reveal a drop-down +list of options to create a more granular breakdown of the inventory valuation. The drop-down +options include: {guilabel}`Product`, {guilabel}`Lot/Serial Number`, {guilabel}`Product Category`, +{guilabel}`Date`, {guilabel}`Company`, or {guilabel}`Add Custom Group` Clicking the +{icon}`fa-minus-square-o` {guilabel}`(minus)` icon collapses the field back to an empty state. + +In the table, the {guilabel}`Remaining Qty` column displays the number of on-hand items, and +{guilabel}`Remaining Value` displays the total cost of purchasing these items. + +```{image} aging/stock-aging-report.png +:alt: Stock aging report, showing product row items and day columns. +``` + +(inventory-warehouses-storage-graph-view)= + +## Graph view + +The stock value can be depicted graphically by clicking the {icon}`fa-area-chart` +{guilabel}`(graph)` icon. By default, the graph is displayed in {icon}`fa-line-chart` line chart +view and filtered to show the cumulative total of all inventory value over time in Odoo. + +At the top of the report, a {icon}`fa-bar-chart` bar chart or {icon}`fa-pie-chart` pie chart view +can be selected instead. + +:::{seealso} +{doc}`Odoo reporting essentials <../../../../essentials/reporting>` +::: + diff --git a/content/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/locations.md b/content/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/locations.md new file mode 100644 index 000000000..dc05c7e8c --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/locations.md @@ -0,0 +1,170 @@ +# Locations dashboard + +The *Locations* dashboard in the **Inventory** application provides an overview of on-hand storage +locations for company products. Use this report to see where stock is stored, identify +{ref}`misplaced items `, or view past inventory to see product +locations on specific dates. + +To access the locations report, the *Storage Locations* feature must be enabled. To do that, go to +{menuselection}`Inventory app --> Configuration --> Settings`. In the {guilabel}`Warehouse` section, +tick the checkbox for {guilabel}`Storage Locations`, and click {guilabel}`Save`. Then, access the +locations dashboard by navigating to {menuselection}`Inventory app --> Reporting --> Locations`. + +:::{note} +The *Reporting* menu in **Inventory** is only accessible to users with {doc}`admin access +<../../../../general/users/access_rights>`. +::: + +(inventory-warehouses-storage-locations-report)= + +## Navigate the locations dashboard + +By default, the {guilabel}`Locations` dashboard lists all on-hand products in stock (in the +{guilabel}`Product` column), along with the following information: + +- {guilabel}`Location`: current storage location. If a product is stored at `Shelf 1` and `Shelf 2`, + the product is listed twice, showing quantities at each location. +- {guilabel}`Package`: the package that the product is stored in, if any. +- {guilabel}`Lot/Serial Number`: if the product has a lot or serial number, it is specified here. +- {guilabel}`On Hand Quantity`: current quantity of products. Click the {icon}`fa-pencil` + {guilabel}`(edit)` icon to {doc}`modify the on-hand quantity + <../inventory_management/count_products>`. +- {guilabel}`Reserved Quantity`: on-hand quantity reserved for operations, such as pickings, + delivery orders, or manufacturings. +- {guilabel}`Unit`: the unit of measure of the product. + +Click the buttons to the right of each row item to access additional information: + +- {icon}`fa-history` {guilabel}`History`: access the stock move history of the product, displaying + information about the quantity and description of why the product was moved from one location to + another. + + :::{tip} + View what the product is reserved for, by clicking the {icon}`fa-history` {guilabel}`History` + button on the far-right of the product line. + + On the {guilabel}`Moves History` page, remove the {icon}`fa-filter` {guilabel}`Done` filter + from the search bar to reveal filter options, and select the {guilabel}`To Do` filter. + + ```{image} locations/reserved-products.png + :alt: Display *Moves History* page of to-do deliveries that reserved the product. + ``` + ::: + +- {icon}`fa-refresh` {guilabel}`Replenishment`: access the {doc}`reordering rules + <../replenishment/reordering_rules>` page to replenish products at the specific location. + +In the upper-left corner of the page, click the {guilabel}`New` button to make an {doc}`inventory +adjustment <../inventory_management/count_products>` to record quantities of a certain product at a +specific {guilabel}`Location`. + +To view products, quantities, and their locations for a specified date, click the +{guilabel}`Inventory At Date` button (also located in the upper-left corner of the page). Select a +date and time in the {guilabel}`Inventory at Date` field, then click {guilabel}`Confirm`. + +### View empty locations + +To view which locations are currently empty, navigate to {menuselection}`Inventory --> Configuration +--> Locations`. + +Empty locations are designated by the checkbox in the {guilabel}`Is Empty` column. To show only +empty locations, click into the search bar and select the {guilabel}`Empty Locations` filter. + +```{image} locations/empty-locations.png +:alt: A list of the empty locations in the Inventory app. +``` + +## Generate reports + +After learning how to {ref}`navigate the locations dashboard +`, it can be used to create and share different +reports. + +A few common reports that can be created using the {guilabel}`Locations` dashboard are detailed +below. + +### Dead stock report + +To get list of expired items, also referred to as *dead stock*, follow these steps: + +1. Go to {menuselection}`Inventory app --> Reporting --> Locations`. +2. Then, click into the search bar to reveal a drop-down list of {guilabel}`Filters`, + {guilabel}`Group By`, and {guilabel}`Favorite` options. +3. Enable the {guilabel}`Internal Locations` and {guilabel}`Expiration Alerts` option under the + {guilabel}`Filters` section. + +The report now displays a list of expired products. + +:::{note} +This report can also be generated from the {ref}`Lot and Serials Numbers +` page, accessed by going to +{menuselection}`Inventory app --> Products --> Lots/Serial Numbers`. +::: + +```{image} locations/dead-stock.png +:alt: Show a list of products whose expiration dates have exceeded today. +``` + +(inventory-warehouse-storage-stranded)= + +### Stranded inventory report + +Businesses using multi-step flows in the **Inventory** or **Manufacturing** apps, may have +*stranded* items, which are products not in their proper storage locations, due to human error. Use +this report to periodically check transfer locations (e.g. *WH/Input*, *WH/Pre-Processing*) to +ensure items are moved to their intended storage locations, and accurately recorded in the database. + +To get a list of items that might be sitting idly in storage, follow these steps: + +1. Go to {menuselection}`Inventory app --> Reporting --> Locations`. + +2. In the search bar, begin typing the name of the location where products are intended to be moved + to, such as `WH/Input`, or `WH/Packing`. + +3. Select the {guilabel}`Search Location for:` [location name] option from the resulting drop-down + menu that appears beneath the search bar. + + ```{image} locations/search-input-location.png + :alt: Show search result for the location. + ``` + +The report now displays a list of products at the transit location. + +```{eval-rst} +.. example:: + Searching `Input` in :guilabel:`Location` shows a list of products at a *WH/Input* location. + + The list shows `500` quantities of `Chicken`, which is alarming if not refrigerated soon after + reception. The stranded inventory report helps identify items that have been idling in + non-storage locations. + + .. image:: locations/stranded-inventory.png + :alt: Show items stored at a specific location. +``` + +### Inventory discrepancy report + +To generate a report of items that have been moved since the last {doc}`inventory audit +<../inventory_management/cycle_counts>`, follow these steps: + +1. Go to {menuselection}`Inventory app --> Reporting --> Locations`. + +2. Then, click into the search bar to reveal a drop-down list of {guilabel}`Filters`, + {guilabel}`Group By`, and {guilabel}`Favorite` options. + +3. Enable the {guilabel}`Internal Locations` and {guilabel}`Conflicts` option from the + {guilabel}`Filters` section. + +4. The report now displays items whose quantities have changed since the last cycle count. + + ```{image} locations/discrepancy.png + :alt: Show items from the *Conflicts* filter in the report. + ``` + +5. Click the {icon}`fa-history` {guilabel}`History` button to view inventory transfers, including + receipts and deliveries, that have occurred since the inventory adjustment. + + ```{image} locations/history.png + :alt: Show *Moves History*, showing a delivery that occurred after an inventory adjustment. + ``` + diff --git a/content/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/moves_history.md b/content/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/moves_history.md new file mode 100644 index 000000000..030476f4e --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/moves_history.md @@ -0,0 +1,101 @@ +# Moves history dashboard + +The *Moves History* report in Odoo *Inventory* provides a detailed record of product movements +(containing past and current locations), lot numbers, and reasons for movement. Reports can be +generated for any time frame, making this report essential for analyzing stock levels, monitoring +inventory turnover, and identifying any discrepancies in inventory. + +:::{note} +The reporting feature is only accessible to users with {doc}`admin access +<../../../../general/users/access_rights>`. +::: + +To access the stock report, go to {menuselection}`Inventory app --> Reporting --> Moves History`. + +```{image} moves_history/moves-history.png +:align: center +:alt: Display Moves History report. +``` + +(inventory-warehouses-storage-moves-history-report)= + +## Navigate the moves history report + +In the report, the columns represent: + +- {guilabel}`Date`: calendar date and time of the stock move. +- {guilabel}`Reference`: description of the reason for the stock move or quantity change, such as a + receipt number (e.g. `WH/IN/00012`). +- {guilabel}`Product`: name of the product involved in the move. +- {guilabel}`Lot/Serial Number`: specifies the lot or serial number of the tracked product being + moved. +- {guilabel}`From`: source location of the moved product. +- {guilabel}`To`: destination location of the moved product. +- {guilabel}`Quantity`: number of products moved. +- {guilabel}`Unit`: unit of measure of the products moved. +- {guilabel}`Status`: indicates the move status, which can be {guilabel}`Done`, + {guilabel}`Available` (ready for action), or {guilabel}`Partially Available` (insufficient + quantities to complete the operation). + +### Search options + +Use the following search options to customize the {guilabel}`Moves History` report to display +relevant information + +```{eval-rst} +.. tabs:: + + .. tab:: Filters + + The :guilabel:`Filters` section allows users to search among pre-made and custom filters to + find specific stock records. + + - :guilabel:`To Do`: show stock move records that are in progress. This includes lines with a + :guilabel:`Status` column value of :guilabel:`Available` or :guilabel:`Partially Available`. + - :guilabel:`Done`: completed stock moves, with a :guilabel:`Status` of :guilabel:`Done`. + - :guilabel:`Incoming`: displays move records from vendor locations. + - :guilabel:`Outgoing`: displays move records to customer locations, including customer + returns. + - :guilabel:`Internal`: displays move records from one internal location to another. + - :guilabel:`Manufacturing`: shows records where products were produced from the virtual, + production :doc:`location <../inventory_management/use_locations>`. + - :guilabel:`Date`: select this drop-down menu to access various date filter options and view + stock moves from a specific month, quarter, or year. + - :guilabel:`Last 30 Days`: show records that occurred in the last thirty days. + - :guilabel:`Last 3 Months`: show records from the last three months. + + .. tab:: Group By + + The :guilabel:`Group By` section allows users to add pre-made and custom groupings to the + search. + + - :guilabel:`Product`: group records by product. + - :guilabel:`Status`: group records by the three status types: :guilabel:`Done`, + :guilabel:`Available`, and :guilabel:`Partially Available`. + - :guilabel:`Date`: group records by :guilabel:`Year`, :guilabel:`Quarter`, :guilabel:`Month`, + :guilabel:`Week`, or :guilabel:`Day`. + - :guilabel:`Transfers`: group records by operation number, e.g. `WH/OUT/00012`, + `WH/MO/00211`. + - :guilabel:`Location`: group records by source location (the :guilabel:`From` column in this + report). + - :guilabel:`Category`: group records by product category. To configure these, go to + :menuselection:`Inventory app --> Configuration --> Products: Product Categories`. + - :guilabel:`Batch Transfer`: group records by :doc:`batch + <../../shipping_receiving/picking_methods/batch>`. + + .. tab:: Favorites + + To save the current applied filters and groups, so the same information can be easily accessed + after closing this page, click :guilabel:`Save current search`. + + Optionally, tick the :guilabel:`Default filter` checkbox to make this current view the default + filter when opening the :guilabel:`Moves History` report. Or tick the :guilabel:`Shared` + checkbox to make the search option available to other users. + + Lastly, click the :guilabel:`Save` button. +``` + +:::{seealso} +{doc}`../../../../essentials/search` +::: + diff --git a/content/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/stock.md b/content/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/stock.md new file mode 100644 index 000000000..4ca841213 --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/warehouses_storage/reporting/stock.md @@ -0,0 +1,144 @@ +# Stock report + +Use the stock report in Odoo *Inventory* for a detailed list of all stored products, including those +reserved, purchased and in transit, as well as those delivered to customers. + +:::{note} +The reporting feature is only accessible to users with {doc}`admin access +<../../../../general/users/access_rights>`. +::: + +To access the stock report, go to {menuselection}`Inventory app --> Reporting --> Stock`. + +```{image} stock/stock-report.png +:align: center +:alt: Show the stock report, accessible by going to Inventory > Reporting > Stock. +``` + +## Navigate the stock report + +On the stock report, the left sidebar includes several groupings to narrow down what is being shown. +The default groupings are {guilabel}`Warehouses`, which filters products by specific warehouses, +and {guilabel}`Category`, which shows products within a selected product category. + +:::{note} +The {guilabel}`Warehouse` grouping is only available when there are multiple warehouses in the +database. Refer to the {doc}`../inventory_management/warehouses` documentation for more details. +::: + +In the report itself, the columns represent: + +- {guilabel}`Product`: name of the product. + +- {guilabel}`Unit Cost`: average inventory valuation per unit, adjusted based on the cost to + purchase and/or manufacture the product. + +- {guilabel}`Total Value`: Total inventory valuation of the product, calculated by multiplying unit + cost by on-hand quantity. + + :::{seealso} + - {ref}`Compute average cost inventory valuation per unit ` + - {doc}`Inventory valuation methods + <../../product_management/inventory_valuation/inventory_valuation_config>` + ::: + +- {guilabel}`On Hand`: current quantity of products. Click the {icon}`fa-pencil` + {guilabel}`(pencil)` icon to {doc}`modify the on-hand quantity + <../inventory_management/count_products>`. + +- {guilabel}`Free to Use`: on-hand quantity that are **not** reserved for delivery or manufacturing + orders, and are available to sell or use. + +- {guilabel}`Incoming`: items expected to arrive at the warehouse. Number of products is based on + quantities in confirmed purchase orders. + +- {guilabel}`Outgoing`: items expected to leave the warehouse or be consumed in manufacturing + orders. Number of products is based on quantities in confirmed sales or manufacturing orders. + +Click the buttons to the right of each row item to access additional information: + +- {guilabel}`History`: access the stock move history of the product, displaying information about + the quantity and description of why the product was moved from one location to another. +- {guilabel}`Replenishment`: access the {doc}`reordering rules + <../replenishment/reordering_rules>` page for the product to create or manage methods of procuring + the product. +- {guilabel}`Locations`: break down of on-hand quantity at multiple storage locations. Only + available when the product is stored in multiple locations. +- {guilabel}`Forecast`: access the forecasted report to view on-hand, incoming, and outgoing + quantities. Report also contains links to confirmed purchase, sales, or manufacturing orders. Only + available when there are confirmed sales, purchase, or manufacturing orders for the product. + +### Search options + +```{eval-rst} +.. tabs:: + + .. tab:: Filters + + The :guilabel:`Filters` section allows users to search among pre-made and custom filters to + find specific stock records. + + - :guilabel:`Published`: display products published on the website. Only available with the + *Website* app installed. + - :guilabel:`Available in POS`: display products available through the *Point of Sale* app. + - :guilabel:`Available in Self`: display products available in self order through the *Point + of Sale* app. Appears in the search because the :guilabel:`Available in Self Order` checkbox + was ticked in the :guilabel:`Point of Sale` section of a product form's :guilabel:`Sales` + tab. The option is only available when the :guilabel:`Available in POS` checkbox is ticked. + + .. image:: stock/available-in-self-order.png + :align: center + :alt: In the Sales tab of a product form, showing *Available in Self Order* setting. + + - :guilabel:`Not available in Self`: display products available in *PoS*, but not available in + self order. + + .. seealso:: + `Configure PoS products `_ + + - :guilabel:`Can be Sold`: display products that can be sold to customers. Appears in the + search because the :guilabel:`Can be Sold` checkbox is ticked on the product form. + - :guilabel:`Can be Purchased`: display products that can be bought from vendors. Appears in + the search because the :guilabel:`Can be Purchased` checkbox is ticked on the product form. + - :guilabel:`Can be Recurring`: show subscription products, indicated by ticking the + :guilabel:`Recurring` checkbox on the product form. Only available with the *Subscription* + app activated. + - :guilabel:`Can be Rented`: show products that can be loaned to customers for a certain time. + Appears in the search because the :guilabel:`Can be Rented` checkbox was ticked on the + product form. Only available with the *Rental* app installed. + - :guilabel:`Can be Subcontracted`: display products that can be produced by a + third-party manufacturer. Available only with the *Manufacturing* app installed. + - :guilabel:`Can be Expensed`: show items that can be expensed. Only available with the + *Expenses* app installed. + + .. seealso:: + :doc:`../../product_management/configure/type` + + .. tab:: Group By + + The :guilabel:`Group By` section allows users to add pre-made and custom groupings to the + search results. + + - :guilabel:`Product Type`: group items by :doc:`product type + <../../product_management/configure/type>`. + - :guilabel:`Product Category`: group items by product category. To configure these, go to + :menuselection:`Inventory app --> Configuration --> Products: Product Categories`. + - :guilabel:`POS Product Category`: group items by :doc:`point of sale product categories + <../../../../sales/point_of_sale/configuration>`. + + .. tab:: Favorites + + To save the current applied filters and groupbys, so the same information can be easily + accessed after closing this page, click :guilabel:`Save current search`. + + Optionally, tick the :guilabel:`Default filter` checkbox to make this current view the default + filter when opening the stock report. Or tick the :guilabel:`Shared` checkbox to make the + search option available to other users. + + Lastly, click the :guilabel:`Save` button. +``` + +:::{seealso} +{doc}`../../../../essentials/search` +::: + diff --git a/content/applications/inventory_and_mrp/maintenance.md b/content/applications/inventory_and_mrp/maintenance.md new file mode 100644 index 000000000..7fcfddc59 --- /dev/null +++ b/content/applications/inventory_and_mrp/maintenance.md @@ -0,0 +1,25 @@ +--- +hide-page-toc: true +nosearch: true +show-content: true +show-toc: true +--- + +# Maintenance + +**Odoo Maintenance** helps extend the effectiveness of equipment by keeping track of maintenance +requirements. + +:::{seealso} +- [Odoo Tutorials: Managing Equipment Maintenance](https://www.odoo.com/slides/slide/managing-equipment-maintenance-709) +::: + +```{toctree} +:titlesonly: true + +maintenance/add_new_equipment +maintenance/maintenance_calendar +maintenance/maintenance_requests +maintenance/maintenance_setup +``` + diff --git a/content/applications/inventory_and_mrp/maintenance/add_new_equipment.md b/content/applications/inventory_and_mrp/maintenance/add_new_equipment.md new file mode 100644 index 000000000..39bbf56ed --- /dev/null +++ b/content/applications/inventory_and_mrp/maintenance/add_new_equipment.md @@ -0,0 +1,93 @@ +# Add new equipment + +(maintenance-equipment-management-add-new-equipment)= + +In Odoo, *equipment* refers to any item that is used in everyday operations, including the +manufacturing of products. This can mean a piece of machinery on a production line, a tool that is +used in different locations, or a computer in an office space. Equipment registered in Odoo can be +owned by the company that uses the Odoo database, or by a third party, such as a vendor in the case +of equipment rentals. + +Using Odoo *Maintenance*, it is possible to track individual pieces of equipment, along with +information about their maintenance requirements. To add a new piece of equipment, navigate to the +{guilabel}`Maintenance` module, select {menuselection}`Equipments --> Machines & Tools --> Create`, +and configure the equipment as follows: + +- {guilabel}`Equipment Name`: the product name of the piece of equipment +- {guilabel}`Equipment Category`: the category that the equipment belongs to; for example, + computers, machinery, tools, etc.; new categories can be created by navigating to + {menuselection}`Configuration --> Equipment Categories` and clicking {guilabel}`Create` +- {guilabel}`Company`: the company that owns the equipment; again, this can be the company that uses + the Odoo database, or a third-party company +- {guilabel}`Used By`: specify if the equipment is used by a specific employee, department, or both; + select {guilabel}`Other` to specify both an employee and a department +- {guilabel}`Maintenance Team`: the team responsible for servicing the equipment; new teams can be + created by navigating to {menuselection}`Configuration --> Maintenance Teams` and + selecting {guilabel}`Create`; the members of each team can also be assigned from this page +- {guilabel}`Technician`: the person responsible for servicing the equipment; this can be used to + assign a specific individual in the event that no maintenance team is assigned or when a specific + member of the assigned team should always be responsible for the equipment; any person added to + Odoo as a user can be assigned as a technician +- {guilabel}`Used in location`: the location where the equipment is used; this is a simple text + field that can be used to specify locations that are not work centers, like an office, for + example +- {guilabel}`Work Center`: if the equipment is used at a work center, specify it here; equipment can + also be assigned to a work center by navigating to {menuselection}`Maintenance --> Equipments --> + Work Centers`, selecting a work center or creating a new one using the {guilabel}`Create` button, + and clicking the {guilabel}`Equipment` tab on the work center form + +```{image} add_new_equipment/new-equipment-form.png +:align: center +:alt: An example of a fully configured new equipment form. +``` + +## Include additional product information + +The {guilabel}`Product Information` tab at the bottom of the page can be used to provide further +details about the piece of equipment: + +- {guilabel}`Vendor`: the vendor that the equipment was purchased from +- {guilabel}`Vendor Reference`: the reference code assigned to the vendor +- {guilabel}`Model`: the specific model of the piece of equipment +- {guilabel}`Serial Number`: the unique serial number of the equipment +- {guilabel}`Effective Date`: the date that the equipment became available for use; this is used to + calculate the {abbr}`MTBF (Mean Time Between Failures)` +- {guilabel}`Cost`: the amount the equipment was purchased for +- {guilabel}`Warranty Expiration Date`: the date on which the equipment's warranty will expire + +```{image} add_new_equipment/new-equipment-product-information.png +:align: center +:alt: The product information tab for the new piece of equipment. +``` + +## Add maintenance details + +The {guilabel}`Maintenance` tab at the bottom of the page provides information about the failure +frequency of the piece of equipment: + +- {guilabel}`Expected Mean Time Between Failure`: the average number of days the equipment is + expected to operate between failures. This number can be configured manually. +- {guilabel}`Mean Time Between Failure`: the average number of days the equipment operates between + failures. This number is calculated automatically based on previous failures, and cannot + be configured manually. +- {guilabel}`Estimated Next Failure`: the estimated date the equipment may experience its next + failure. + This date is calculated automatically based on the data in the {guilabel}`Mean Time Between + Failure` and {guilabel}`Latest Failure` fields, and cannot be configured manually. +- {guilabel}`Latest Failure`: the most recent date on which the equipment failed. This date is based + on the creation date of the equipment's most recent maintenance request, and cannot be configured + manually. +- {guilabel}`Mean Time To Repair`: the average number of days needed to repair the equipment. This + number is calculated automatically based on the duration of previous maintenance requests, and + cannot be configured manually. + +```{image} add_new_equipment/new-equipment-maintenance.png +:align: center +:alt: The maintenance tab for a piece of equipment. +``` + +:::{tip} +To see any open maintenance requests for a piece of equipment, go to the page for the equipment, +and click the {guilabel}`Maintenance` smart button at the top of the page. +::: + diff --git a/content/applications/inventory_and_mrp/maintenance/maintenance_calendar.md b/content/applications/inventory_and_mrp/maintenance/maintenance_calendar.md new file mode 100644 index 000000000..2bb71cfb9 --- /dev/null +++ b/content/applications/inventory_and_mrp/maintenance/maintenance_calendar.md @@ -0,0 +1,389 @@ +--- +substitutions: + MO: '{abbr}`MO (Manufacturing Order)`' +--- + +# Maintenance calendar + +Avoiding equipment breakdowns, and blocks in warehouse work centers, requires constant equipment +maintenance. Timely corrective maintenance for machines and tools that break unexpectedly, as well +as preventive maintenance to ensure that such issues are avoided, are key to keeping warehouse +operations running smoothly. + +In Odoo *Maintenance*, users can access the *Maintenance Calendar* to create, schedule, and edit +both corrective and preventive maintenance requests, to stay on top of equipment and work centers. + +## Create maintenance request + +Maintenance requests can be created directly from the *Maintenance Calendar*. To access the +calendar, navigate to {menuselection}`Maintenance app --> Maintenance --> Maintenance Calendar`. + +To create a new request, click anywhere on the calendar. Doing so opens a {guilabel}`New Event` +pop-up window. In the {guilabel}`Name:` field, assign a title to the new request. + +```{image} maintenance_calendar/maintenance-calendar-new-event-popup.png +:align: center +:alt: New event creation pop-up window. +``` + +Clicking {guilabel}`Create` on the pop-up window saves the new request with no additional details. +If the request's creation should be cancelled, click {guilabel}`Cancel`. + +To add more details and schedule the request for a specific date and time, click {guilabel}`Edit`. + +Clicking {guilabel}`Edit` opens a blank maintenance request form, where various details about the +request can be filled out. + +### Edit maintenance request + +In the {guilabel}`Request` field, assign a title to the new request. In the {guilabel}`Created By` +field, from the drop-down menu, select which user the request was created by. By default, this field +populates with the user actually creating the request. + +```{image} maintenance_calendar/maintenance-calendar-new-request-form.png +:align: center +:alt: New maintenance request form creation. +``` + +In the {guilabel}`For` field, from the drop-down menu, select if this request is being created for a +piece of {guilabel}`Equipment`, or a {guilabel}`Work Center`. + +:::{note} +If {guilabel}`Work Center` is selected in the {guilabel}`For` field's drop-down menu, two +additional fields appear on the form: {guilabel}`Work Center` and {guilabel}`Block Workcenter`. + +In the {guilabel}`Work Center` field, select which work center in the warehouse this maintenance +request applies to. + +If the {guilabel}`Block Workcenter` option's checkbox is ticked, it is not possible to plan work +orders, or other maintenance requests, in this work center during the time that this request is +being performed. +::: + +If {guilabel}`Equipment` is selected in the {guilabel}`For` field, which it is by default, select +which machine or tool requires maintenance from the {guilabel}`Equipment` field. Once a specific +piece of equipment is selected, a greyed-out {guilabel}`Category` field appears, listing the +*Equipment Category* to which the equipment belongs. + +In the {guilabel}`Worksheet Template` field, if necessary, click the drop-down menu to select a +worksheet template. These templates are custom templates that can be filled out by the employee +performing the maintenance. + +Under the {guilabel}`Category` field, the {guilabel}`Request Date` field displays the date requested +for the maintenance to happen. + +The {guilabel}`Maintenance Type` field provides two selectable radio button options: +{guilabel}`Corrective` and {guilabel}`Preventive`. + +{guilabel}`Corrective` maintenance is for requests that arise for immediate needs, such as broken +equipment, while {guilabel}`Preventive` maintenance is for planned requests, to avoid breakdowns in +the future. + +If this request is tied to a specific {{ MO }}, select that {{ MO }} from the {guilabel}`Manufacturing +Order` field. + +From the drop-down menu for the {guilabel}`Team` field, select the desired maintenance team who will +perform the maintenance. In the {guilabel}`Responsible` field, select the technician responsible for +the request. + +```{image} maintenance_calendar/maintenance-calendar-filled-out-form.png +:align: center +:alt: Filled-out details of maintenance request form. +``` + +In the {guilabel}`Scheduled Date` field, click the date to open a calendar popover. From this +popover, select the planned date of the maintenance, and click {guilabel}`Apply` to save the date. + +In the {guilabel}`Duration` field, enter the the amount of hours (in a `00:00` format) that the +maintenance is planned to take. + +In the {guilabel}`Priority` field, choose a priority between one and three {guilabel}`⭐⭐⭐ (stars)`. +This indicates the importance of the maintenance request. + +If working in a multi-company environment, from the drop-down menu in the {guilabel}`Company` field, +select the company to which this maintenance request belongs. + +At the bottom of the form, there are two tabs: {guilabel}`Notes` and {guilabel}`Instructions`. + +In the {guilabel}`Notes` tab, type out any internal notes for the team or technician assigned to the +request, if necessary. + +In the {guilabel}`Instructions` tab, if necessary, select one of the three radio button options to +provide maintenance instructions to the assigned team or technician. The available methods for +providing instructions are via {guilabel}`PDF`, {guilabel}`Google Slide`, or {guilabel}`Text`. + +```{image} maintenance_calendar/maintenance-calendar-instructions-tab.png +:align: center +:alt: Instructions tab options on maintenance request form. +``` + +## Calendar elements + +The *Maintenance Calendar* provides various views, search functions, and filters to help keep track +of the progress of ongoing and planned maintenance requests. + +The following sections describe elements found across various views of the calendar. + +### Filters and Favorites + +To access the maintenance calendar, navigate to {menuselection}`Maintenance app --> Maintenance --> +Maintenance Calendar`. + +To add and remove filters for sorting data on the *Maintenance Calendar*, click the {guilabel}`🔻 +(triangle pointed down)` icon, to the right of the search bar at the top of the page. + +The left-hand side of the resulting drop-down menu lists all the different {guilabel}`Filters` users +can select. By default, {guilabel}`To Do` and {guilabel}`Active` are selected, so all open requests +are displayed. + +:::{tip} +To add a custom filter to the {guilabel}`Maintenance Calendar`, click {guilabel}`Add Custom +Filter`, under the {guilabel}`Filters` section of the drop-down menu. This opens an +{guilabel}`Add Custom Filter` pop-up window. + +From this pop-up window, configure the properties of the new rule for the filter. Once ready, +click {guilabel}`Add`. +::: + +The right-hand side of the drop-down menu lists the {guilabel}`Favorites`, or any searches that have +been saved as a favorite to be revisited at a later date. + +```{image} maintenance_calendar/maintenance-calendar-favorites-popover.png +:align: center +:alt: Favorites section of filters drop-down menu. +``` + +To save a new {guilabel}`Favorite` search, select the desired {guilabel}`Filters`. Then, click +{guilabel}`Save current search`. In the field directly below {guilabel}`Save current search`, assign +a name to the search. + +Under the assigned name, there are two options, to save the current search either as the +{guilabel}`Default filter`, or as a {guilabel}`Shared` filter. + +Selecting {guilabel}`Default filter` sets this filter as the default when opening this calendar +view. + +Selecting the {guilabel}`Shared` filter makes this filter available to other users. + +Once ready, click {guilabel}`Save`. When clicked, the new {guilabel}`Favorite` filter appears in the +{guilabel}`Favorites` column, and a {guilabel}`⭐ (gold star)` icon appears with the filter's name in +the search bar. + +### Views + +The {guilabel}`Maintenance Calendar` is available in six different views: {guilabel}`Calendar` +(default), {guilabel}`Kanban`, {guilabel}`List`, {guilabel}`Pivot`, {guilabel}`Graph`, and +{guilabel}`Activity`. + +```{image} maintenance_calendar/maintenance-calendar-view-type-icons.png +:align: center +:alt: Different view type icons for maintenance calendar. +``` + +#### Calendar view + +{guilabel}`Calendar` is the default view displayed when the {guilabel}`Maintenance Calendar` is +opened. There are a number of options in this view type for sorting and grouping information about +maintenance requests. + +In the top-left corner of the page, there is a drop-down menu set to {guilabel}`Week`, by default. +Clicking that drop-down menu reveals the different periods of time, in which the calendar can be +viewed: {guilabel}`Day`, {guilabel}`Month`, and {guilabel}`Year`. There is also an option to +{guilabel}`Show weekends`, selected by default. If unselected, weekends are not shown on the +calendar. + +```{image} maintenance_calendar/maintenance-calendar-period-dropdown.png +:align: center +:alt: Calendar period drop-down menu options. +``` + +To the left of this menu, there is a {guilabel}`⬅️ (left arrow)` icon and a {guilabel}`➡️ (right +arrow)` icon. Clicking these arrows moves the calendar backward or forward in time, respectively. + +To the right of the drop-down menu set to {guilabel}`Week`, by default, is a {guilabel}`Today` +button. Clicking this button resets the calendar to view today's date, no matter which point in time +is being viewed before clicking it. + +At the far-right side of the page is a sidebar column, containing a minimized calendar set to +today's date, and a {guilabel}`Technician` list, displaying all the *Technicians* with requests +currently open. Click the {guilabel}`(panel)` icon at the top of this sidebar to open or close the +sidebar. + +:::{note} +The {guilabel}`Technician` list only displays if technicians are assigned to open requests, and +individual technicians are only listed, if they are listed as {guilabel}`Responsible` on at least +**one** maintenance request form. +::: + +#### Kanban view + +With the {guilabel}`Kanban` view, all open maintenance requests are displayed in Kanban-style +columns, in their respective stages of the maintenance process. + +Each maintenance request appears on its own task card, and each task card can be dragged-and-dropped +to a different stage of the Kanban pipeline. + +Each column has a name (i.e. {guilabel}`In Progress`). Hovering at the top of a column reveals a +{guilabel}`⚙️ (gear)` icon. Clicking the {guilabel}`⚙️ (gear)` icon reveals a list of options for +that column: {guilabel}`Fold`, {guilabel}`Edit`, {guilabel}`Automations`, and {guilabel}`Delete`. + +```{image} maintenance_calendar/maintenance-calendar-kanban-column.png +:align: center +:alt: Column options for stage in Kanban view. +``` + +Clicking {guilabel}`Fold` folds the column to hide its contents. + +Clicking {guilabel}`Edit` opens an {guilabel}`Edit: (stage name)` pop-up window, with the +corresponding stage name, wherein the column's details can be edited. The following are the column +options that can be edited: + +```{image} maintenance_calendar/maintenance-calendar-edit-stage-popup.png +:align: center +:alt: Edit In Progress pop-up window. +``` + +- {guilabel}`Name`: the name of the stage in the Kanban pipeline. +- {guilabel}`Folded in Maintenance Pipe`: when checked, this stage's column is folded by default in + the {guilabel}`Kanban` view type. +- {guilabel}`Request Confirmed`: when this box is not ticked, and the maintenance request type is + set to *Work Center*, no leave is created for the respective work center when a maintenance + request is created. If the box *is* ticked, the work center is automatically blocked for the + listed duration, either at the specified date, or as soon as possible, if the work center is + unavailable. +- {guilabel}`Sequence`: the order in the maintenance process, in which this stage appears. +- {guilabel}`Request Done`: if ticked, this box indicates this stage is the final step of the + maintenance process. Requests moved to this stage are closed. + +Once ready, click {guilabel}`Save & Close`. If no changes have been made, click {guilabel}`Discard`, +or click the {guilabel}`X` icon to close the pop-up window. + +#### List view + +With the {guilabel}`List` view selected, all open maintenance requests are displayed in a list, with +information about each request listed in its respective row. + +The columns of information displayed in this view type are the following: + +- {guilabel}`Subjects`: the name assigned to the maintenance request. +- {guilabel}`Employee`: the employee who originally created the maintenance request. +- {guilabel}`Technician`: the technician responsible for the maintenance request. +- {guilabel}`Category`: the category the equipment being repaired belongs to. +- {guilabel}`Stage`: the stage of the maintenance process the request is currently in. +- {guilabel}`Company`: if in a multi-company environment, the company in the database the request is + assigned to. + +#### Pivot view + +With the {guilabel}`Pivot` view selected, maintenance requests are displayed in a pivot table, and +can be customized to show different data metrics. + +To add more data to the pivot table, click the {guilabel}`Measures` button to reveal a drop-down +menu. By default, {guilabel}`Count` is selected. Additional options to add to the table are +{guilabel}`Additional Leaves to Plan Ahead`, {guilabel}`Duration`, and {guilabel}`Repeat Every`. + +```{image} maintenance_calendar/maintenance-calendar-measures-menu.png +:align: center +:alt: Measures options on Pivot view page. +``` + +To the right of the {guilabel}`Measures` button is the {guilabel}`Insert in Spreadsheet` button. +Clicking this button opens a pop-up window titled {guilabel}`Select a spreadsheet to insert your +pivot.`. + +There are two tabs in this pop-up window: {guilabel}`Spreadsheets` and {guilabel}`Dashboards`. Click +into one of these tabs, and select a spreadsheet or dashboard in the database to add this pivot +table to. Once ready, click {guilabel}`Confirm`. If this table shouldn't be added to a spreadsheet +or dashboard, click {guilabel}`Cancel`, or click the {guilabel}`X` icon to close the pop-up window. + +To the right of the {guilabel}`Insert in Spreadsheet` button are three buttons: + +- {guilabel}`Flip axis`: the x and y axis of the pivot data table flip. +- {guilabel}`Expand all`: all the available rows and columns of the pivot data table expand fully. +- {guilabel}`Download xlsx`: the pivot data table is downloaded as an .xlsx file. + +#### Graph view + +With the graph view selected, the following options appear between the search bar and visual +representation of the data. These graph-specific options are located to the right of the +{guilabel}`Measures` and {guilabel}`Insert in Spreadsheet` buttons. + +```{image} maintenance_calendar/maintenance-calendar-graph-view-icons.png +:align: center +:alt: Graph type icons on Graph view page. +``` + +There are three different types of graphs available to users to view the data: + +- {guilabel}`Bar Chart`: the data is displayed in a bar chart. +- {guilabel}`Line Chart`: the data is displayed in a line chart. +- {guilabel}`Pie Chart`: the data is displayed in a pie chart. + +When viewing the data as a {guilabel}`Bar Chart` graph, the data can be formatted in the following +ways: + +- {guilabel}`Stacked`: the data is stacked on the graph. +- {guilabel}`Descending`: the data is displayed in descending order. +- {guilabel}`Ascending`: the data is displayed in ascending order. + +When viewing the data as a {guilabel}`Line Chart` graph, the data can be formatted in the following +ways: + +- {guilabel}`Stacked`: the data is stacked on the graph. +- {guilabel}`Cumulative`: the data is increasingly accumulated. +- {guilabel}`Descending`: the data is displayed in descending order. +- {guilabel}`Ascending`: the data is displayed in ascending order. + +When viewing the data as a {guilabel}`Pie Chart` graph, all relevant data is displayed by default, +and no additional formatting options are available. + +#### Activity view + +With the {guilabel}`Activity` view selected, all open maintenance requests are listed in their own +row, with the ability to schedule activities related to those requests. + +```{image} maintenance_calendar/maintenance-calendar-activity-view-type.png +:align: center +:alt: Maintenance requests on Activity view. +``` + +Maintenance requests are listed in the {guilabel}`Maintenance Request` column as activities. +Clicking a request opens a {guilabel}`Maintenance Request` popover that indicates the status of the +request, and the responsible technician. To schedule an activity directly from the popover, click +{guilabel}`➕ Schedule an activity`. This opens a {guilabel}`Schedule Activity` pop-up window. + +From the pop-up window, choose the {guilabel}`Activity Type`, provide a {guilabel}`Summary`, +schedule a {guilabel}`Due Date`, and choose the responsible user in the {guilabel}`Assigned to` +field. + +```{image} maintenance_calendar/maintenance-calendar-schedule-activity-popover.png +:align: center +:alt: Schedule Activity pop-up window. +``` + +Type any additional notes for the new activity in the blank space under the greyed-out +{guilabel}`Log a note...` field. When clicked, this changes to {guilabel}`Type "/" for commands`. + +Once ready, click {guilabel}`Schedule` to schedule the activity. Alternatively, click +{guilabel}`Schedule & Mark as Done` to close the activity, click {guilabel}`Done & Schedule Next` to +close the activity and open a new one, or click {guilabel}`Cancel` to cancel the activity. + +With the {guilabel}`Activity` view selected, each activity type available when scheduling an +activity is listed as its own column. These columns are {guilabel}`Email`, {guilabel}`Call`, +{guilabel}`Meeting`, {guilabel}`Maintenance Request`, {guilabel}`To-Do`, {guilabel}`Upload +Document`, {guilabel}`Request Signature`, and {guilabel}`Grant Approval`. + +To schedule an activity with that specific activity type, click into any blank box on the +corresponding row for the desired maintenance request, and click the {guilabel}`➕ (plus)` icon. This +opens an {guilabel}`Odoo` pop-up window, wherein the activity can be scheduled. + +```{image} maintenance_calendar/maintenance-calendar-odoo-activity-popup.png +:align: center +:alt: Odoo pop-up schedule activity window. +``` + +:::{seealso} +- {doc}`maintenance_requests` +- {doc}`add_new_equipment` +::: + diff --git a/content/applications/inventory_and_mrp/maintenance/maintenance_requests.md b/content/applications/inventory_and_mrp/maintenance/maintenance_requests.md new file mode 100644 index 000000000..be93727fd --- /dev/null +++ b/content/applications/inventory_and_mrp/maintenance/maintenance_requests.md @@ -0,0 +1,107 @@ +--- +substitutions: + MO: '{abbr}`MO (Manufacturing Order)`' +--- + +# Maintenance requests + +In order to keep equipment and work centers functioning properly, it is often necessary to perform +maintenance on them. This can include preventive maintenance, intended to prevent equipment from +breaking down, or corrective maintenance, which is used to fix equipment that is broken or otherwise +unusable. + +In Odoo *Maintenance*, users can create *maintenance requests* to schedule and track the progress of +equipment and work center maintenance. + +## Create maintenance request + +To create a new maintenance request, navigate to {menuselection}`Maintenance app --> Maintenance --> +Maintenance Requests`, and click {guilabel}`New`. + +Begin filling out the form by entering a descriptive title in the {guilabel}`Request` field (e.g., +`Drill not working`). + +The {guilabel}`Created By` field auto-populates with the user creating the request, but a different +user can be selected by clicking on the drop-down menu. + +In the {guilabel}`For` drop-down menu, select {guilabel}`Equipment` if the maintenance request is +being created for a piece of equipment, or {guilabel}`Work Center` if it is being created for a work +center. + +Depending on the option selected in the {guilabel}`For` field, the next field is titled either +{guilabel}`Equipment` or {guilabel}`Work Center`. Using the drop-down menu for either field, select +a piece of equipment or a work center. + +If the *Custom Maintenance Worksheets* setting is enabled in the *Maintenance* app's settings, a +{guilabel}`Worksheet Template` field appears below the {guilabel}`Equipment` or {guilabel}`Work +Center` field. If necessary, use this field to select a worksheet to be filled out by the employee +performing the maintenance. + +The next field is titled {guilabel}`Request Date`, and is set by default to the date on which the +maintenance request is created. This date cannot be changed by the user. + +In the {guilabel}`Maintenance Type` field, select the {guilabel}`Corrective` option if the request +is intended to fix an existing issue, or the {guilabel}`Preventive` option if the request is +intended to prevent issues from occurring in the future. + +If the request is being created to address an issue that arose during a specific manufacturing order +(MO), select it in the {guilabel}`Manufacturing Order` field. + +If an {{ MO }} was selected in the {guilabel}`Manufacturing Order` field, a {guilabel}`Work Order` field +appears below it. If the issue arose during a specific work order, specify it in this field. + +In the {guilabel}`Team` field, select the maintenance team that is responsible for managing the +request. If a specific team member is responsible, select them in the {guilabel}`Responsible` field. + +The {guilabel}`Scheduled Date` field is used to specify the date on which maintenance should take +place, and the time it should begin. Choose a date by clicking on the field to open a calendar in a +pop-up window, and then select a day on the calendar. Enter an hour and minute in the two fields +below the calendar, and click {guilabel}`Apply` to save the date and time. + +The {guilabel}`Duration` field is used to specify the time it takes to complete the maintenance +request. Use the text-entry field to enter the time in a `00:00` format. + +If {guilabel}`Work Center` was selected in the {guilabel}`For` field, a {guilabel}`Block Workcenter` +checkbox appears below the {guilabel}`Duration` field. Enable the checkbox to prevent work orders or +other maintenance from being scheduled at the specified work center while the maintenance request is +being processed. + +The {guilabel}`Priority` field is used to communicate the importance (or urgency) of the maintenance +request. Assign the request a priority between zero and three {guilabel}`⭐⭐⭐ (stars)`, by clicking +on the desired star number. Requests assigned a higher priority appear above those with a lower +priority, on the Kanban board used to track the progression of maintenance requests. + +In the {guilabel}`Notes` tab at the bottom of the form, enter any relevant details about the +maintenance request (why the maintenance issue arose, when it occurred, etc.). + +The {guilabel}`Instructions` tab is used to include instructions for how maintenance should be +performed. Select one of the three options, and then include the instructions as detailed below: + +- {guilabel}`PDF`: click the {guilabel}`Upload your file` button to open the device's file manager, + and then select a file to upload. +- {guilabel}`Google Slide`: enter a {guilabel}`Google Slide link` in the text-entry field that + appears after the option is selected. +- {guilabel}`Text`: enter the instructions in the text-entry field that appears after the option is + selected. + +```{image} maintenance_requests/request-form.png +:align: center +:alt: A maintenance request form filled out for a piece of equipment. +``` + +## Process maintenance request + +Once a maintenance request has been created, it appears in the *New Request* stage of the +*Maintenance Requests* page, which can be accessed by navigating to {menuselection}`Maintenance app +--> Maintenance --> Maintenance Requests`. + +Maintenance requests can be moved to different stages by dragging and dropping them. They can also +be moved by clicking on a request to open it in a new page, and then selecting the desired stage +from the stage indicator bar, located above the top-right corner of the request's form. + +Successful maintenance requests should be moved to the {guilabel}`Repaired` stage, indicating that +the specified piece of equipment or work center is repaired. + +Failed maintenance requests should be moved to the {guilabel}`Scrap` stage, indicating the specified +piece of equipment, or work center, could not be repaired, and must instead be scrapped. + diff --git a/content/applications/inventory_and_mrp/maintenance/maintenance_setup.md b/content/applications/inventory_and_mrp/maintenance/maintenance_setup.md new file mode 100644 index 000000000..458dd59d3 --- /dev/null +++ b/content/applications/inventory_and_mrp/maintenance/maintenance_setup.md @@ -0,0 +1,252 @@ +--- +substitutions: + MTBF: '{abbr}`MTBF (Mean Time Between Failure)`' + MTTR: '{abbr}`MTTR (Mean Time To Repair)`' +--- + +# Maintenance setup + +Odoo *Maintenance* helps companies schedule corrective and preventive maintenance on equipment used +in their warehouse. This helps companies avoid equipment breakdowns, blocks in warehouse work +centers, and emergency repair costs. + +## Maintenance teams + +When creating maintenance requests, a *maintenance team* can be assigned to the request as the team +responsible for handling the request. + +To view existing maintenance teams, navigate to {menuselection}`Maintenance app --> Configuration +--> Maintenance Teams`. + +From the resulting {guilabel}`Teams` page, a list of all existing teams (if any) is displayed, with +the {guilabel}`Team Name`, {guilabel}`Team Members`, and {guilabel}`Company` listed in the columns, +by default. + +```{image} maintenance_setup/maintenance-setup-teams-list.png +:align: center +:alt: List of Teams on Maintenance Teams page. +``` + +To add a new team, click {guilabel}`New`. This adds a blank line at the bottom of the list of teams. +In the blank field that appears below the {guilabel}`Team Name` column, assign a name to the new +maintenance team. + +In the {guilabel}`Team Members` column, click the field to reveal a drop-down menu with existing +users in the database. Choose which users should be members of the new maintenance team. + +Click {guilabel}`Search More...` to open a {guilabel}`Search: Team Members` pop-up window to search +for users **not** shown on the initial drop-down menu. + +```{image} maintenance_setup/maintenance-setup-search-team-members.png +:align: center +:alt: 'Search: Team Members pop-up window.' +``` + +In the {guilabel}`Company` column, if in a multi-company environment, click the drop-down menu to +select the company in the database to which this new maintenance team belongs. + +Once ready, click {guilabel}`Save` to save changes. + +:::{tip} +The team members assigned to maintenance teams are also referred to as *Technicians*, when +viewing the *Maintenance Calendar*. + +Navigate to {menuselection}`Maintenance app --> Maintenance --> Maintenance Calendar`, and click +on an existing maintenance request. From the resulting popover, locate the {guilabel}`Technician` +field. The name listed in the field is the team member, and is the user responsible for that +particular request. + +```{image} maintenance_setup/maintenance-setup-popover-technician.png +:align: center +:alt: Maintenance request popover with Technician field shown. +``` + +At the far-right side of the page is a sidebar column, containing a minimized calendar set to +today's date, and a {guilabel}`Technician` list, displaying all the technicians (or team members) +with requests currently open. +::: + +## Equipment + +In Odoo *Maintenance*, *equipment* refers to machines and tools used internally in warehouse work +centers. Equipment can include technology such as computers or tablets, power tools, machines used +for manufacturing, and more. + +### Equipment categories + +Each piece of equipment belongs to an *equipment category*. Before adding new equipment, make sure +that a fitting equipment category is created. + +To create a new equipment category, navigate to {menuselection}`Maintenance app --> Configuration +--> Equipment Categories`, and click {guilabel}`New`. Doing so opens a blank equipment category +form. + +```{image} maintenance_setup/maintenance-setup-category-form.png +:align: center +:alt: Equipment category form with various information filled out. +``` + +On the blank form, assign a name in the {guilabel}`Category Name` field. + +In the {guilabel}`Responsible` field, assign a user to be responsible for the equipment in this +category, if necessary. By default, the user who creates the category is selected as +{guilabel}`Responsible`, by default. + +If in a multi-company environment, click the drop-down menu in the {guilabel}`Company` field, and +select the company in the database to whom the equipment in this category belongs. + +In the {guilabel}`Email Alias` field, assign an email alias to this category, if necessary. + +In the {guilabel}`Comments` field, type any comments or notes for internal users to reference in +relation to this category, if necessary. + +:::{note} +Once a new equipment category is created, all equipment belonging to that category, as well as +any past or currently open maintenance requests, are available from the equipment category form. + +Navigate to {menuselection}`Maintenance app --> Configuration --> Equipment Categories`, and +select a category to view. Locate the {guilabel}`Equipment` and {guilabel}`Maintenance` smart +buttons at the top of the form. + +```{image} maintenance_setup/maintenance-setup-smart-buttons.png +:align: center +:alt: Equipment and Maintenance smart buttons on equipment category form. +``` + +Click the {guilabel}`Equipment` smart button to view all equipment belonging to this category. +Click the {guilabel}`Maintenance` smart button to view any past, or currently open, maintenance +requests. +::: + +### Machines & tools + +To add new equipment, navigate to {menuselection}`Maintenance app --> Equipment --> Machines & +Tools`, and click {guilabel}`New`. This opens a blank equipment form. + +In the {guilabel}`Name` field, assign a name for the new equipment. In the {guilabel}`Equipment +Category` field, click the drop-down menu and select which category this new equipment should belong +to. + +If in a multi-company environment, click the drop-down menu in the {guilabel}`Company` field, and +select the company in the database to whom the new equipment belongs. + +In the {guilabel}`Used By` field, select from one of three radio button options: +{guilabel}`Department`, {guilabel}`Employee`, or {guilabel}`Other`. + +```{image} maintenance_setup/maintenance-setup-new-equipment-left-side.png +:align: center +:alt: Left-hand side of information fields on new equipment form. +``` + +If {guilabel}`Department` is selected, a {guilabel}`Department` field appears below the +{guilabel}`Used By` field. Click the drop-down menu and select the department that uses this +equipment. + +If {guilabel}`Employee` is selected, an {guilabel}`Employee` field appears below the {guilabel}`Used +By` field. Click the drop-down menu, and select the employee who uses this equipment. + +If the {guilabel}`Other` option is selected, both the {guilabel}`Department` and +{guilabel}`Employee` fields appear below the {guilabel}`Used By` field. Click the drop-down menus +for the respective fields, and choose which department and employee uses this equipment. + +In the {guilabel}`Maintenance Team` field, select the team responsible for this equipment. In the +{guilabel}`Technician` field, select the team member/user responsible for this equipment. + +```{image} maintenance_setup/maintenance-setup-new-equipment-right-side.png +:align: center +:alt: Right-hand side of information fields on new equipment form. +``` + +In the {guilabel}`Used in location` field, enter the location wherein this equipment will be used, +if not in an internal work center (e.g. in an office). + +In the {guilabel}`Work Center` field, click the drop-down menu, and select which work center this +equipment will be used in. + +In the blank space under the {guilabel}`Description` tab at the bottom of the form, add any relevant +information describing the equipment for users to reference. + +#### Product Information tab + +To add any relevant information while creating a new piece of equipment, from the equipment form, +click the {guilabel}`Product Information` tab. + +```{image} maintenance_setup/maintenance-setup-product-information.png +:align: center +:alt: Product Information tab with available fields below it. +``` + +In the {guilabel}`Vendor` field, add the vendor from which the equipment was purchased. In the +{guilabel}`Vendor Reference` field, add the product reference number obtained from the vendor, if +applicable. + +In the {guilabel}`Model` field, specify which model this equipment is, if applicable. If the +equipment is serialized, add a serial number in the {guilabel}`Serial Number` field. + +In the {guilabel}`Effective Date` field, click the date to reveal a calendar popover, and select a +date. This date indicates when this equipment was first put in use, and will be used to compute the +Mean Time Between Failure (MTBF) in the equipment's {guilabel}`Maintenance` tab. + +In the {guilabel}`Cost` field, specify how much the equipment cost to acquire, if applicable. + +If the equipment is covered under a warranty, specify the {guilabel}`Warranty Expiration Date` by +selecting a date from the calendar popover in that field. + +#### Maintenance tab + +Various maintenance metrics are available for each piece of equipment, and are automatically +computed, based on corrective maintenance, and planned preventive maintenance. + +To view the maintenance metrics for a specific piece of equipment, from the equipment form, click +the {guilabel}`Maintenance` tab. + +```{image} maintenance_setup/maintenance-setup-metrics.png +:align: center +:alt: Maintenance tab on equipment form showing computed metrics fields. +``` + +Doing so reveals the following fields: + +- {guilabel}`Expected Mean Time Between Failure`: the amount of time (in days) before the next + failure is expected. This is the **only** field not greyed-out, and the **only** field users can + edit. +- {guilabel}`Mean Time Between Failure`: the amount of time (in days) between reported failures. + This value is computed based on completed corrective maintenances. +- {guilabel}`Estimated Next Failure`: the date on which the next failure is expected. This date is + computed as the Latest Failure Date + {{ MTBF }}. +- {guilabel}`Latest Failure`: The date of the latest failure. The value in this field updates once a + failure is reported for this equipment. +- {guilabel}`Mean Time To Repair`: the amount of time (in days) it takes to repair this equipment + upon failure. This value updates once a maintenance request is completed for this equipment. + +## Work centers + +To view the work centers where equipment is being used, and how the equipment is being used in them, +navigate to {menuselection}`Maintenance app --> Equipment --> Work Centers`, and click into a work +center. + +From the resulting work center form, click the {guilabel}`Equipment` tab to view all machines and +tools being used in that specific work center. + +Each piece of equipment is listed with certain relevant information: the {guilabel}`Equipment Name`, +the responsible {guilabel}`Technician`, the {guilabel}`Equipment Category` it belongs to, and a few +important maintenance metrics: its {{ MTBF }}, {{ MTTR }}, and {guilabel}`Est. Next Failure` date. + +```{image} maintenance_setup/maintenance-setup-work-center.png +:align: center +:alt: List of equipment included in a work center. +``` + +:::{tip} +To add new equipment to a work center directly from the work center form, click {guilabel}`Add a +line` under the {guilabel}`Equipment` tab. This opens an {guilabel}`Add: Maintenance Equipment` +pop-up window. + +From the pop-up window, select the equipment that should be added to the work center, and click +{guilabel}`Select`. +::: + +:::{seealso} +{doc}`add_new_equipment` +::: + diff --git a/content/applications/inventory_and_mrp/manufacturing.md b/content/applications/inventory_and_mrp/manufacturing.md new file mode 100644 index 000000000..41f3a3704 --- /dev/null +++ b/content/applications/inventory_and_mrp/manufacturing.md @@ -0,0 +1,29 @@ +--- +hide-page-toc: true +show-content: true +show-toc: true +--- + +# Manufacturing + +**Odoo Manufacturing** helps manufacturers schedule, plan, and process manufacturing orders. With +the work center control panel, put tablets on the shop floor to control work orders in real-time and +allow workers to trigger maintenance operations, feedback loops, quality issues, etc. + +:::{seealso} +- [Odoo Tutorials: MRP](https://www.odoo.com/slides/mrp-29) +- [Odoo Tutorials: Barcode Scanner](https://www.odoo.com/slides/barcode-30) +- {doc}`IoT Boxes (MES) ` +::: + +```{toctree} +:titlesonly: true + +manufacturing/basic_setup +manufacturing/advanced_configuration +manufacturing/workflows +manufacturing/shop_floor +manufacturing/subcontracting +manufacturing/reporting +``` + diff --git a/content/applications/inventory_and_mrp/manufacturing/advanced_configuration.md b/content/applications/inventory_and_mrp/manufacturing/advanced_configuration.md new file mode 100644 index 000000000..b3c4339a8 --- /dev/null +++ b/content/applications/inventory_and_mrp/manufacturing/advanced_configuration.md @@ -0,0 +1,16 @@ +--- +nosearch: true +--- + +# Advanced configuration + +```{toctree} +:titlesonly: true + +advanced_configuration/product_variants +advanced_configuration/kit_shipping +advanced_configuration/sub_assemblies +advanced_configuration/using_work_centers +advanced_configuration/work_order_dependencies +``` + diff --git a/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/kit_shipping.md b/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/kit_shipping.md new file mode 100644 index 000000000..161ab6acd --- /dev/null +++ b/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/kit_shipping.md @@ -0,0 +1,115 @@ +# Use kits + +In Odoo, a *kit* is a type of bill of materials (BoM) that can be manufactured and sold. Kits are +sets of unassembled components sold to customers. They may be sold as standalone products, but are +also useful tools for managing more complex bills of materials (BoMs). + +:::{note} +To use, manufacture, and sell kits, both the {guilabel}`Manufacturing` and {guilabel}`Inventory` +apps need to be installed. +::: + +## Create the kit as a product + +To use a kit as a sellable product, or simply as a component organization tool, the kit should first +be created as a product. + +To create a kit product, go to {menuselection}`Inventory app --> Products --> Products`, and click +{guilabel}`Create`. + +Then, assign a name to the new kit product. Next, under the {guilabel}`General Information` tab, set +the {guilabel}`Product Type` to {guilabel}`Consumable`. Kit products work best as consumables, +because the stock on-hand for kits is typically not tracked. + +:::{note} +Although kits should almost always be set to {guilabel}`Consumable`, companies using +**Anglo-Saxon** accounting might need to create kits as a {guilabel}`Storable Product`. This is +because when processing invoices for kits, the Cost of Goods Sold (COGS) will be posted in +accounting journals. +::: + +Unlike storable products, the {guilabel}`Routes` designation under the {guilabel}`Inventory` tab +does not matter for kits, since Odoo uses the routes of the kit's individual components for +replenishment purposes. All other parameters for the kit product may be modified according to +preference. Once ready, click {guilabel}`Save` to save the new product. + +The kit's components must also be configured as products via {menuselection}`Inventory app --> +Products --> Products`. These components require no specific configuration. + +## Set up the kit BoM + +After fully configuring the kit product and its components, a new {abbr}`BoM (bill of materials)` +can be created for the kit product. + +To do so, go to {menuselection}`Manufacturing app --> Products --> Bills of Materials`, and click +{guilabel}`Create`. Next to the {guilabel}`Product` field, click the drop-down menu to reveal a list +of products, and select the previously configured kit product. + +Then, for the {guilabel}`BoM Type` field, select the {guilabel}`Kit` option. Finally, under the +{guilabel}`Components` tab, click {guilabel}`Add a line`, and add each desired component, and +specify their quantities under the {guilabel}`Quantity` column. + +Once ready, click {guilabel}`Save` to save the newly-created {abbr}`BoM (bill of materials)`. + +```{image} kit_shipping/bom-kit-selection.png +:align: center +:alt: Kit selection on the bill of materials. +``` + +If the kit is solely being used as a sellable product, then only components need to be added under +the {guilabel}`Components` tab, and configuring manufacturing operations is not necessary. + +:::{note} +When a kit is sold as a product, it appears as a single line item on the quotation and sales +order. However, on delivery orders, each component of the kit is listed. +::: + +## Use kits to manage complex BoMs + +Kits are also used to manage multi-level {abbr}`BoMs (bills of materials)`. These are products that +contain **other** {abbr}`BoM (bill of materials)` products as components, and therefore require +*nested* {abbr}`BoMs (bills of materials)`. Incorporating pre-configured kits into multi-level +{abbr}`BoMs (bills of materials)` allows for cleaner organization of bundled products. + +To configure this type of {abbr}`BoM (bill of materials)` with a kit as a component, go to +{menuselection}`Manufacturing app --> Products --> Bills of Materials`, and click +{guilabel}`Create`. + +Next to the {guilabel}`Product` field, click the drop-down menu to reveal a list of products, and +select the desired {abbr}`BoM (bill of materials)` product. Then, for the {guilabel}`BoM Type` +field, select the {guilabel}`Manufacture this product` option. + +Under the {guilabel}`Components` tab, click {guilabel}`Add a line`, and select a kit as the +component. Adding the kit as a component eliminates the need to add the kit's components +individually. Any {guilabel}`BoM Type` can be used for the higher-level product's {abbr}`BoM (bill +of materials)`. + +Once ready, click {guilabel}`Save` to save changes. + +```{image} kit_shipping/multilevel-bom-kit.png +:align: center +:alt: Kit as a component in a multilevel bill of materials. +``` + +### Structure & cost + +To access a comprehensive overview of the multi-level {abbr}`BoM's (bill of material's)` components, +click on the {guilabel}`Structure & Cost` smart button. Sublevel {abbr}`BoMs (bills of materials)` +can be expanded and viewed from this report. + +```{image} kit_shipping/structure-and-cost-kit.png +:align: center +:alt: Expanded kit in the Structure and Cost report. +``` + +When creating a manufacturing order for a product with a multi-level {abbr}`BoM (bill of +materials)`, the kit product automatically expands to show all components. Any operations in the +kit's {abbr}`BoM (bill of materials)` are also added to the list of work orders on the +manufacturing order. + +:::{tip} +Kits are primarily used to bundle components together for organization or sale. To manage +multi-level products that require manufactured sub-components, refer to {doc}`this documentation +` on sub-assemblies. +::: + diff --git a/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/product_variants.md b/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/product_variants.md new file mode 100644 index 000000000..3e53148c8 --- /dev/null +++ b/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/product_variants.md @@ -0,0 +1,196 @@ +# Managing BoMs for product variants + +Odoo allows one bill of materials (BoM) to be used for multiple variants of the same product. Having +a consolidated {abbr}`BoM (bill of materials)` for a product with variants saves time by preventing +the need to manage multiple {abbr}`BoMs (bills of materials)`. + +## Activate product variants + +To activate the product variants feature, navigate to {menuselection}`Inventory app --> +Configuration --> Settings`, and scroll down to the {guilabel}`Products` section. Then, click the +checkbox to enable the {guilabel}`Variants` option. After that, click {guilabel}`Save` to apply the +setting. + +For more information on configuring product variants, refer to the {doc}`product variants +<../../../sales/sales/products_prices/products/variants>` documentation. + +```{image} product_variants/product-variants-variants-settings.png +:align: center +:alt: Selecting "Variants" from Inventory app settings. +``` + +## Create custom product attributes + +Once the product variants feature is activated, create and edit product attributes on the +{guilabel}`Attributes` page. + +The {guilabel}`Attributes` page is accessible either from {menuselection}`Inventory app --> +Configuration --> Settings` by clicking the {guilabel}`Attributes` button, or by clicking +{menuselection}`Inventory app --> Configuration --> Attributes`. + +Once on the {guilabel}`Attributes` page, either click into an existing attribute, or click +{guilabel}`Create` to create a new one. Clicking {guilabel}`Create` reveals a new, blank form for +customizing an attribute. For an existing attribute, click {guilabel}`Edit` on its form to make +changes. + +Assign an {guilabel}`Attribute Name`, and choose a category from the {guilabel}`Category` field's +drop-down menu. Then, select the desired options next to the {guilabel}`Display Type` and +{guilabel}`Variants Creation Mode` fields. Once the desired options are selected, click +{guilabel}`Add a line` under the {guilabel}`Attribute Values` tab to add a new value. + +:::{tip} +Included on the {guilabel}`Value` row is a {guilabel}`Is custom value` checkbox. If selected, +this value will be recognized as a custom value, which allows customers to type special +customization requests upon ordering a custom variant of a product. +::: + +```{eval-rst} +.. example:: + .. image:: product_variants/product-variants-attribute.png + :align: center + :alt: Product variant attribute configuration screen. +``` + +Once all desired {guilabel}`Values` have been added, click {guilabel}`Save` to save the new +attribute. + +## Add product variants on the product form + +Created attributes can be applied on specific variants for particular products. To add product +variants to a product, navigate to the product form by going to {menuselection}`Inventory app --> +Products --> Products`. To make changes to the product, click {guilabel}`Edit`. Then, click the +{guilabel}`Variants` tab. + +Under the {guilabel}`Attribute` header, click {guilabel}`Add a line` to add a new attribute, and +select one to add from the drop-down menu. + +Then, under the {guilabel}`Values` header, click the drop-down menu to choose from the list of +existing values. Click on each desired value to add them, and repeat this process for any additional +attributes that should be added to the product. + +Once finished, click {guilabel}`Save` to save changes. + +```{image} product_variants/product-variants-product-form.png +:align: center +:alt: Product form variants tab with values and attributes. +``` + +:::{tip} +{abbr}`BoM (bill of materials)` products with multiple variants that are manufactured in-house +should either have a **0,0 reordering rule** set up, or have their replenishment routes set to +*Replenish on Order (MTO)*. +::: + +## Apply BoM components to product variants + +Next, create a new {abbr}`BoM (bill of materials)`. Or, edit an existing one, by going to +{menuselection}`Manufacturing app --> Products --> Bills of Materials`. Then, click +{guilabel}`Create` to open a new {guilabel}`Bills of Materials` form to configure from scratch. + +Add a product to the {abbr}`BoM (bill of materials)` by clicking the drop-down menu in the +{guilabel}`Product` field and selecting the desired product. + +Then, add components by clicking {guilabel}`Add a line` under the {guilabel}`Component` section of +the {guilabel}`Components` tab, and choosing the desired components from the drop-down menu. + +Choose the desired values in the {guilabel}`Quantity` and {guilabel}`Product Unit of Measure` +columns. Then, choose the desired values in the {guilabel}`Apply on Variants` column. + +:::{note} +The {guilabel}`Apply on Variants` option to assign components to specific product variants on the +{abbr}`BoM (bill of materials)` is available once the {guilabel}`Variants` setting is activated +from the {menuselection}`Inventory` application. If the {guilabel}`Apply on Variants` field is +not immediately visible, activate it from the additional options menu (three-dots icon, to the +right of the header row). +::: + +```{image} product_variants/product-variants-apply-on-variants.png +:align: center +:alt: '"Apply on Variants" option on the additional options menu.' +``` + +Each component can be assigned to multiple variants. Components with no variants specified are used +in every variant of the product. The same principle applies when configuring operations and +by-products. + +When defining variant {abbr}`BoMs (bills of material)` by component assignment, the +{guilabel}`Product Variant` field in the main section of the {abbr}`BoM (bill of materials)` should +be left blank. This field is *only* used when creating a {abbr}`BoM (bill of materials)` +specifically for one product variant. + +When all desired configurations have been made to the {abbr}`BoM (bill of materials)`, click +{guilabel}`Save` at the top of the form to save changes. + +:::{tip} +For components that only apply for specific variants, choose which operations the components +should be consumed in. If the {guilabel}`Consumed in Operation` column is *not* immediately +visible, activate it from the additional options menu (three-dots icon, to the right of the +header row). +::: + +## Sell and manufacture variants of BoM products + +To sell and manufacture variants of {abbr}`BoM (bill of materials)` products to order, navigate to +{menuselection}`Sales app --> Create` to create a new quotation. + +### Sell variant of BoM product + +Once on the blank {guilabel}`Quotation` form, click the drop-down next to the {guilabel}`Customer` +field to add a customer. + +Then, under the {guilabel}`Order Lines` tab, click {guilabel}`Add a product`, and select the +previously-created {abbr}`BoM (bill of materials)` product with variants from the drop-down menu. +Doing so reveals a {guilabel}`Configure a product` pop-up. + +From the pop-up window, click the desired attribute options to configure the correct variant of the +product to manufacture. Then, click the green {guilabel}`+` or {guilabel}`-` icons next to the `1` +to change the quantity to sell and manufacture, if desired. + +```{image} product_variants/product-variants-variant-popup.png +:align: center +:alt: Configure a product pop-up for choosing variant attributes. +``` + +Once all the specifications have been chosen, click {guilabel}`Add`. This will change the pop-up to +a second {guilabel}`Configure` pop-up, where available optional products will appear, if they have +been created previously. + +Once ready, click {guilabel}`Confirm` to close the pop-up. + +Then, click {guilabel}`Save` to save all changes, and click {guilabel}`Confirm` at the top of the +{guilabel}`Quotation` form to create and confirm a new sales order (SO). + +### Manufacture variant of BoM product + +Once the {abbr}`SO (sales order)` is confirmed, a {guilabel}`Manufacturing` smart button appears at +the top of the {abbr}`SO (sales order)` form. Click the {guilabel}`Manufacturing` smart button to +open the {guilabel}`Manufacturing Order` form. + +On this form, under the {guilabel}`Components` tab, the appropriate components for the chosen +variant are listed. And, depending on the variant, different components will be listed. To see any +mandatory or optional {guilabel}`Operation` steps, click the {guilabel}`Work Orders` tab. + +To enter the tablet view work order screen, click the {guilabel}`tablet icon` to the right of the +row for the desired operation to be completed. + +From the tablet view, click {guilabel}`Mark as Done` as the operation progresses to complete the +operation steps. + +Alternatively, click the {guilabel}`Mark as Done` button at the top of the manufacturing order form +to complete the order. + +```{image} product_variants/product-variants-manufacturing-order.png +:align: center +:alt: Manufacturing order for variant of BoM product. +``` + +Then, navigate back to the {abbr}`SO (sales order)` via the breadcrumbs at the top of the page. + +Now that the product has been manufactured, click the {guilabel}`Delivery` smart button to deliver +the product to the customer. From the {guilabel}`Delivery Order` form, click {guilabel}`Validate`, +then click {guilabel}`Apply` to deliver the product. + +To finish the sale, click back to the {abbr}`SO (sales order)` via the {guilabel}`breadcrumbs` at +the top of the page again. Then, click {guilabel}`Create Invoice` followed by {guilabel}`Create +Invoice` again to invoice the customer for the order. + diff --git a/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/sub_assemblies.md b/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/sub_assemblies.md new file mode 100644 index 000000000..3cc9bd6a3 --- /dev/null +++ b/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/sub_assemblies.md @@ -0,0 +1,77 @@ +# Manage semi-finished products + +A *semi-finished product*, also known as a *subassembly*, is a manufactured product that is used as +a component in another product's bill of materials (BoM). Semi-finished products are used to +simplify complex {abbr}`BoMs (Bills of Materials)` or to more accurately represent a manufacturing +flow. A {abbr}`BoM (Bill of Materials)` that contains semi-finished products is referred to as a +*multilevel BoM*, where the main *top-level product* and its subassemblies are distinguished. + +## Configure semi-finished products + +To set up a multilevel {abbr}`BoM (Bill of Materials)`, the top-level product and semi-finished +products must be configured. Therefore, the first step is to create the semi-finished products and +their {abbr}`BoMs (Bills of Materials)`. + +:::{seealso} +{doc}`../basic_setup/bill_configuration` +::: + +```{image} sub_assemblies/semifinished-product-bom.png +:align: center +:alt: A bill of materials for a semi-finished product. +``` + +## Create the top-level bill of materials (BoM) + +After the semi-finished products are fully configured, navigate to {menuselection}`Manufacturing +--> Products --> Products`. Then, {guilabel}`Create` the top-level product. Configure the product's +specifications as desired, and be sure to {guilabel}`Save`. + +Once the top-level product is configured, click the {guilabel}`Bill of Materials` smart button on +the product form, then click {guilabel}`Create` to make a {abbr}`BoM (Bill of Materials)` for the +top-level product. Then, simply add the semi-finished products to this {abbr}`BoM (Bill of +Materials)`, along with any other necessary components. + +```{image} sub_assemblies/custom-computer-bom.png +:align: center +:alt: A bill of materials for a top-level product, containing a subassembly component. +``` + +## Manage production planning + +There are several methods to manage manufacturing order automation for products with multilevel +{abbr}`BoMs (Bills of Materials)`. + +:::{note} +Semi-finished products are specifically used to manage manufacturable products with multilevel +BoMs. If a BoM is being created simply to organize components or bundle sellable products, +using {doc}`Kits ` is the more appropriate option. +::: + +To automatically trigger manufacturing orders for semi-finished products after confirming a +manufacturing order for the main product, there are two options: + +- **Option 1 (recommended):** Create *Reordering Rules* for the semi-finished products and set both + the minimum and maximum desired stock quantities to `0`. + +:::{seealso} +{doc}`../../purchase/products/reordering` +::: + +- **Option 2:** Activate the {guilabel}`Replenish on Order (MTO)` and {guilabel}`Manufacture` + routes under the {guilabel}`Inventory` tab of the semi-finished product's product form. + +Option 1 is more flexible than Option 2 and is therefore recommended. Reordering rules do not +directly link demand to replenishment, and therefore allow stocks to be unreserved and redirected +to other orders, if necessary. The Replenish on Order (MTO) route creates a unique link between the +semi-finished and top-level products, exclusively reserving quantities for the confirmed top-level +manufacturing order. + +Regardless of the method chosen, semi-finished products must be fully manufactured before +manufacturing can begin on the top-level product. + +```{image} sub_assemblies/semifinished-on-mo.png +:align: center +:alt: A manufacturing order for a top-level product. +``` + diff --git a/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers.md b/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers.md new file mode 100644 index 000000000..dffe78226 --- /dev/null +++ b/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/using_work_centers.md @@ -0,0 +1,136 @@ +# Manage work orders using work centers + +Odoo Manufacturing allows for work orders to be carried out at specific work centers. When a +manufacturing order is created for a product, any work orders listed in the {guilabel}`Operations` +tab of the product bill of materials (BoM) will be automatically created as well and assigned to the +specified work center. Work orders can be managed in the {guilabel}`Manufacturing` module by +selecting {menuselection}`Operations --> Work Orders`. + +In order to use work centers, the {guilabel}`Work Orders` feature must first be enabled. To do so, +go to the {guilabel}`Manufacturing` module, select {menuselection}`Configuration --> Settings`, and +activate the checkbox next to {guilabel}`Work Orders`. Work centers can then be created and managed +by selecting {menuselection}`Configuration --> Work Centers`. + +## Create a work center + +Within the {guilabel}`Manufacturing` module, select {menuselection}`Configuration --> Work Centers +--> Create`. The work center form can then be filled out as follows: + +- {guilabel}`Work Center Name`: give the work center a concise name that describes the type of + operations it will be used for +- {guilabel}`Alternative Workcenters`: specify an alternative work center for operations to be + carried out at if the main work center is not available +- {guilabel}`Code`: assign the work center a reference code +- {guilabel}`Working Hours`: define the number of hours that the work center can be in use each week +- {guilabel}`Company`: select the company that the work center belongs to + +```{image} using_work_centers/work-center-form.png +:align: center +:alt: An example of a fully configured work center form. +``` + +(manufacturing-management-using-work-centers-wc-setup)= + +### Set standards for work center productivity + +The {guilabel}`General Information` tab on the work center form allows for productivity goals to be +assigned to a work center: + +- {guilabel}`Time Efficiency`: used to calculate the expected duration of a work order at the work + center; for example, if a work order normally takes one hour and the efficiency is set to 200%, + the work order will take 30 minutes +- {guilabel}`Capacity`: the number of products that can be processed at the work center + simultaneously +- {guilabel}`OEE Target`: the target for efficiency at the work center +- {guilabel}`Time before prod.`: setup time required before work can commence +- {guilabel}`Time after prod.`: breakdown or cleanup time required after work is finished +- {guilabel}`Cost per hour`: the cost of operating the work center for one hour +- {guilabel}`Analytic Account`: the account where the cost of the work center should be recorded + +```{image} using_work_centers/work-center-general-information.png +:align: center +:alt: The general information tab of the work center form. +``` + +### Assign equipment to a work center + +Using the {guilabel}`Equipment` tab, it is possible for specific pieces of equipment to be assigned +to a work center. The following information will be displayed for each piece of equipment added: + +- {guilabel}`Equipment Name`: the name of the piece of equipment +- {guilabel}`Technician`: the technician responsible for servicing the equipment +- {guilabel}`Equipment Category`: the category the equipment belongs to +- {guilabel}`MTBF`: mean time between failures; the average time that the piece of equipment will + operate before failing +- {guilabel}`MTTR`: mean time to recovery; the average time it takes for the equipment to become + fully operational again +- {guilabel}`Est. Next Failure`: an estimate of when the next equipment failure will occur + +```{image} using_work_centers/work-center-equipment.png +:align: center +:alt: The equipment tab of the work center form. +``` + +:::{note} +{guilabel}`MTBF`, {guilabel}`MTTR`, and {guilabel}`Est. Next Failure` are all calculated +automatically based on past failure data, if any exists. +::: + +(workcenter-iot)= + +### Integrate IoT devices + +The {guilabel}`IoT Triggers` tab enables the integration of {abbr}`IoT (Internet of Things)` devices +with a work center: + +- {guilabel}`Device`: specifies the IoT device to be triggered +- {guilabel}`Key`: the security key for the device +- {guilabel}`Action`: the IoT device action triggered + +```{image} using_work_centers/work-center-iot.png +:align: center +:alt: The IoT Triggers tab of the work center form. +``` + +## Use case: configure an alternative work center + +When a work center is at capacity, it cannot accept any new work orders. Instead of waiting for the +work center to become available, it is possible to specify an alternative work center where surplus +work orders should be carried out. + +Begin by creating a new work center. Configure the {guilabel}`Equipment` tab so that it has all of +the same equipment as the main work center. This will ensure that the same tasks can be carried out +at both work centers. Navigate to the main work center and include the new work center in the +{guilabel}`Alternative Workcenters` selection field. + +Now, create a new manufacturing order that uses the main work center for one of its operations. The +main work center will automatically be selected for the operation in the {guilabel}`Work Orders` +tab. After confirming the manufacturing order, click the {guilabel}`Plan` button that appears at the +top left of the form. + +```{image} using_work_centers/manufacturing-order-plan-button.png +:align: center +:alt: Click the plan button to automatically select an available work center. +``` + +If the main work center is at capacity, the work center selected for the operation will be +automatically changed to the alternative work center. + +```{image} using_work_centers/automatic-work-center-selection.png +:align: center +:alt: The alternative work center is automatically selected. +``` + +## Monitor work center performance + +Performance for an individual work center can be viewed by selecting +{menuselection}`Configuration --> Work Centers`, and clicking on a work center. A variety of metrics +showing work center performance can be viewed at the top right of the form: + +- {guilabel}`OEE`: overall effective efficiency, the percentage of time that the work center has + been fully productive +- {guilabel}`Lost`: the amount of time lost due to work stoppages +- {guilabel}`Load`: the amount of time it will take to complete the current workload +- {guilabel}`Performance`: the real duration of work time, shown as a percentage of the expected + duration + diff --git a/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/work_order_dependencies.md b/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/work_order_dependencies.md new file mode 100644 index 000000000..098088aad --- /dev/null +++ b/content/applications/inventory_and_mrp/manufacturing/advanced_configuration/work_order_dependencies.md @@ -0,0 +1,124 @@ +--- +substitutions: + BOM: '{abbr}`BoM (Bill of Materials)`' +--- + +# Work order dependencies + +When manufacturing certain products, specific operations may need to be completed before others can +begin. In order to ensure operations are carried out in the correct order, Odoo *Manufacturing* +features a *work order dependencies* setting. Enabling this setting allows for operations on a Bill +of Materials (BoM) to be *blocked* by other operations that should occur first. + +## Configuration + +The *work order dependencies* setting is not enabled by default. To enable it, begin by navigating +to {menuselection}`Manufacturing --> Configuration --> Settings`. Then, enable the {guilabel}`Work +Orders` setting, if it is not already active. + +After enabling the {guilabel}`Work Orders` setting, the {guilabel}`Work Order Dependencies` setting +appears below it. Enable {guilabel}`Work Order Dependencies`, then click {guilabel}`Save` to confirm +the changes. + +## Add dependencies to BoM + +Work order dependencies are configured on a product's {{ BOM }}. To do so, navigate to +{menuselection}`Manufacturing --> Products --> Bills of Materials`, then select a {{ BOM }}, or create a +new one by clicking {guilabel}`New`. + +:::{admonition} Learn more +For a complete guide on how to properly configure a new {{ BOM }}, see the documentation on +{doc}`creating a bill of materials <../basic_setup/bill_configuration>`. +::: + +On the {{ BOM }}, click on the {guilabel}`Miscellaneous` tab, then enable the {guilabel}`Operation +Dependencies` checkbox. This makes a new {guilabel}`Blocked By` option available in the settings of +the {guilabel}`Operations` tab. + +```{image} work_order_dependencies/operation-dependencies.png +:align: center +:alt: The Operation Dependencies checkbox on the Miscellaneous tab of a BoM. +``` + +Next, click on the {guilabel}`Operations` tab. On the top-right of the tab, click on the tab's +{guilabel}`settings` button, then enable the {guilabel}`Blocked By` checkbox. This makes a +{guilabel}`Blocked By` field appear for each operation on the {guilabel}`Operations` tab. + +```{image} work_order_dependencies/operations-settings.png +:align: center +:alt: The settings for the Operations tab on a BoM. +``` + +In the line of the operation that should be blocked by another operation, click the +{guilabel}`Blocked By` field, and an {guilabel}`Open: Operations` pop-up window appears. In the +{guilabel}`Blocked By` drop-down field on the pop-up window, select the blocking operation that must +be completed *before* the operation that is blocked. + +```{image} work_order_dependencies/blocked-by.png +:align: center +:alt: The Blocked By drop-down field for an operation on a BoM. +``` + +Finally, save the {{ BOM }} by clicking {guilabel}`Save`. + +## Plan work orders using dependencies + +Once work order dependencies have been configured on a {{ BOM }}, Odoo *Manufacturing* is able to plan +when work orders are scheduled, based on their dependencies. To plan the work orders for a +manufacturing order, begin by navigating to {menuselection}`Manufacturing --> Operations --> +Manufacturing Orders`. + +Next, select a manufacturing order for a product with work order dependencies set on its {{ BOM }}, or +create a new manufacturing order by clicking {guilabel}`New`. If a new manufacturing order is +created, select a {{ BOM }} configured with work order dependencies from the {guilabel}`Bill of +Material` drop-down field, then click {guilabel}`Confirm`. + +After confirming the manufacturing order, select the {guilabel}`Work Orders` tab to view the work +orders required to complete it. Any work orders that are *not* blocked by a different work order +display a `Ready` tag in the {guilabel}`Status` section. + +Work orders that are blocked by one or more work orders display a `Waiting for another WO` tag +instead. Once the blocking work order(s) are completed, the tag updates to `Ready`. + +```{image} work_order_dependencies/work-order-status.png +:align: center +:alt: The status tags for work orders on a manufacturing order. +``` + +To schedule the manufacturing order's work orders, click the {guilabel}`Plan` button at the top of +the page. After doing so, the {guilabel}`Scheduled Start Date` field for each work order on the +{guilabel}`Work Orders` tab auto-fills with the scheduled start date and time. A blocked work order +is scheduled at the end of the time period specified in the {guilabel}`Expected Duration` field of +the work order that precedes it. + +```{image} work_order_dependencies/scheduled-start-date.png +:align: center +:alt: The Scheduled Start Date field for work orders on a manufacturing order. +``` + +```{eval-rst} +.. example:: + A manufacturing order is created for Product A. The manufacturing order has two operations: Cut + and Assemble. Each operation has an expected duration of 60 minutes, and the Assemble operation + is blocked by the Cut operation. + + The :guilabel:`Plan` button for the manufacturing order is clicked at 1:30 pm, and the Cut + operation is scheduled to begin immediately. Since the Cut operation has an expected duration of + 60 minutes, the Assemble operation is scheduled to begin at 2:30 pm. +``` + +### Planning by workcenter + +To see a visual representation of how work orders are planned, navigate to the {guilabel}`Work +Orders Planning` page by going to {menuselection}`Manufacturing --> Planning --> Planning by +Workcenter`. This page shows a timeline of all the work orders scheduled for each operation. + +If one work order is blocked by the completion of another, the work order that is blocked is shown +as scheduled to start after the work order blocking it. In addition, an arrow connects the two work +orders, leading from the blocking operation to the blocked operation. + +```{image} work_order_dependencies/planning-arrow.png +:align: center +:alt: The arrow connecting a blocked work order to the work order blocking it. +``` + diff --git a/content/applications/inventory_and_mrp/manufacturing/basic_setup.md b/content/applications/inventory_and_mrp/manufacturing/basic_setup.md new file mode 100644 index 000000000..97203857d --- /dev/null +++ b/content/applications/inventory_and_mrp/manufacturing/basic_setup.md @@ -0,0 +1,17 @@ +--- +nosearch: true +--- + +# Basic setup + +```{toctree} +:titlesonly: true + +basic_setup/configure_manufacturing_product +basic_setup/bill_configuration +basic_setup/one_step_manufacturing +basic_setup/two_step_manufacturing +basic_setup/three_step_manufacturing +basic_setup/mo_costs +``` + diff --git a/content/applications/inventory_and_mrp/manufacturing/basic_setup/bill_configuration.md b/content/applications/inventory_and_mrp/manufacturing/basic_setup/bill_configuration.md new file mode 100644 index 000000000..d9fde07ee --- /dev/null +++ b/content/applications/inventory_and_mrp/manufacturing/basic_setup/bill_configuration.md @@ -0,0 +1,291 @@ +--- +substitutions: + BOM: '{abbr}`BoM (Bill of Materials)`' + BOMs: '{abbr}`BoMs (Bills of Materials)`' + MO: '{abbr}`MO (Manufacturing Order)`' +--- + +# Bill of materials + +A *bill of materials* (or *BoM* for short) documents specific components, along with their +respective quantities, that are needed to produce or repair a product. In Odoo, {{ BoMs }} as blueprints +for manufactured goods and kits, and often include production operations and step-by-step +guidelines, as well. + +## BoM setup + +To create a {{ BOM }}, go to {menuselection}`Manufacturing app --> Products --> Bills of Materials` and +click {guilabel}`New`. + +Next, set the {guilabel}`BoM Type` to {guilabel}`Manufacture this Product`. + +Then, specify {ref}`required components ` and, if +necessary, define any {ref}`manufacturing operations `. + +:::{tip} +Individual {{ BOMs }} can also be quickly accessed or created by clicking the {guilabel}`Bill of +Materials` smart button on any product form, as accessible through the *Sales*, *Inventory*, and +*Manufacturing* apps, as well as through any internal links where a product is referenced (such +as in a field or a line item). +::: + +:::{figure} bill_configuration/bom-example.png +:align: center +:alt: Show BoM for a product, with components listed. + +BoM for `Drawer`, displaying the **Components** tab. +::: + +:::{seealso} +- {doc}`../advanced_configuration/kit_shipping` +- {doc}`../subcontracting/subcontracting_basic` +::: + +(manufacturing-basic-setup-setup-components)= + +### Components + +In the {guilabel}`Components` tab of a {{ BOM }}, specify components used to manufacture the product by +clicking {guilabel}`Add a line`. From the {guilabel}`Components` drop-down menu, select from +existing products or create a new product by typing the name and selecting either the +{guilabel}`Create " "` option to quickly add the line item, or the {guilabel}`Create and edit...` +option to add the component and continue to its configuration form. + +```{image} bill_configuration/component.png +:align: center +:alt: Add a component by selecting it from the drop-down menu. +``` + +Optionally, access additional fields by clicking the {icon}`oi-settings-adjust` {guilabel}`(settings +adjust)` icon to the far-right of the {guilabel}`Components` tab. Tick the checkboxes for the +following features to enable these columns: + +- {guilabel}`Apply on Variants`: specify which {doc}`product variant + <../advanced_configuration/product_variants>` each component is used in. When the field is left + blank, the component is used in all product variants. + +(manufacturing-basic-setup-consumed-in-operation)= + +- {guilabel}`Consumed in Operation`: specify the operation using the component. Useful for + determining {ref}`manufacturing readiness `. + +- {guilabel}`Manual Consumption`: tick the checkbox to force operators to check the + {guilabel}`Consumed` checkbox on a manufacturing order (MO). + + ```{image} bill_configuration/consumed-field.png + :align: center + :alt: Show a manufacturing order, highlighting the *Consumed* field. + ``` + + Not doing so triggers the {guilabel}`Consumption Warning` error message, where the consumed + component quantity must be manually inputted. Otherwise, the operation cannot be completed. + + ```{image} bill_configuration/consumption-warning.png + :align: center + :alt: Show the consumption warning error message. + ``` + +(manufacturing-basic-setup-setup-operations)= + +### Operations + +Add an *operation* to a {{ BOM }} to specify instructions for production and register time spent on an +operation. To use this feature, first enable the *Work Orders* feature by going to +{menuselection}`Manufacturing app --> Configuration --> Settings`. In the {guilabel}`Operations` +section, tick the {guilabel}`Work Orders` checkbox to enable the feature. + +:::{seealso} +{doc}`../advanced_configuration/work_order_dependencies` +::: + +```{image} bill_configuration/enable-work-orders.png +:align: center +:alt: '"Work Orders" feature in the Settings page.' +``` + +Next, navigate to the {{ BOM }} by going to {menuselection}`Manufacturing app --> Products --> Bill of +Materials` and selecting the desired {{ BOM }}. To add a new operation, go to the {guilabel}`Operations` +tab, and click {guilabel}`Add a line`. + +Doing so opens the {guilabel}`Create Operations` pop-up window, where the various fields of the +operation are configured: + +- {guilabel}`Operation`: name of the operation. + +- {guilabel}`Work Center`: select existing locations to perform the operation, or create a new work + center by typing the name and selecting the {guilabel}`Create " "` option. + +- {guilabel}`Apply on Variants`: specify if this operation is only available for certain product + variants. If the operation applies to all product variants, leave this field blank. + + :::{seealso} + {doc}`Configuring BoMs for product variants <../advanced_configuration/product_variants>` + ::: + +- {guilabel}`Duration Computation`: choose how time spent on the operation is tracked. Opt for + {guilabel}`Compute based on tracked time` to use the operation's time tracker or {guilabel}`Set + duration manually` if operators can record and modify time themselves. + + Choosing the {guilabel}`Compute based on tracked time` option enables the {guilabel}`Based on last + __ work orders` option, which automatically estimates the time to complete this operation based on + the last few operations. Choosing {guilabel}`Set duration manually` enables the {guilabel}`Default + Duration` field instead. + +- {guilabel}`Default Duration`: estimated amount of time to complete the operation; used for + [planning manufacturing orders](https://www.youtube.com/watch?v=TK55jIq00pc) and determining + [work center availability](https://www.youtube.com/watch?v=3YwFlD97Bio). + +- {guilabel}`Company`: specify the company the {{ BOM }} is available in. + +Include operation details in the {guilabel}`Work Sheet` tab. Choose {guilabel}`PDF` to attach a file +or {guilabel}`Google Slide` with *public* access to share a link. Select {guilabel}`Text` to type +instructions in the {guilabel}`Description` text field. + +:::{tip} +Type `/` for a list of formatting options and features, including ChatGPT. + +```{image} bill_configuration/description.png +:align: center +:alt: Show ChatGPT feature to generate instructions for a work order. +``` +::: + +```{image} bill_configuration/create-operations.png +:align: center +:alt: Fill out the Create Operations pop-up window. +``` + +Finally, click {guilabel}`Save \& Close` to close the pop-up window. To add more operations, click +{guilabel}`Save & New` and repeat the same steps above to configure another operation. + +:::{note} +Each operation is unique, as it is always exclusively linked to one {{ BOM }}. +::: + +:::{tip} +After creating an operation, click the {guilabel}`Copy Existing Operations` button to choose an +operation to duplicate. + +```{image} bill_configuration/copy-existing-operations.png +:align: center +:alt: Show Operation tab, highlighting the "Copy Existing Operations" field. +``` +::: + +#### Instructions + +:::{important} +To add detailed instructions to operations, the *Quality* app must be installed. +::: + +Add specific instructions to an existing operation by clicking the operation's {icon}`fa-list-ul` +{guilabel}`(list)` icon in the {guilabel}`Instructions` column. The number in the +{guilabel}`Instructions` column shows the number of existing detailed instructions there are for the +operation. + +```{image} bill_configuration/add-instructions.png +:align: center +:alt: Show the Instructions column, and list icon. +``` + +On the {guilabel}`Steps` dashboard, click {guilabel}`New` to open a blank quality control point form +where the new manufacturing step can be created. Here, give the specific instruction a +{guilabel}`Title` and set the {guilabel}`Type` to {guilabel}`Instructions`. In the +{guilabel}`Instructions` tab of the form, write out the directions for the step in the operation. + +:::{note} +Further customizations can be made here on this form, beyond ordinary instructions, to also +include specific types of quality control points that carry specific (or complex) conditions. For +more details about quality control points refer the {doc}`Instruction check +<../../quality/quality_check_types/instructions_check>` documentation. +::: + +```{image} bill_configuration/steps.png +:align: center +:alt: Show the page to add a quality check. +``` + +### Miscellaneous + +The {guilabel}`Miscellaneous` tab contains more {{ BoM }} configurations to customize procurement, +calculate costs, and define how components are consumed. + +(manufacturing-basic-setup-manufacturing-readiness)= + +- {guilabel}`Manufacturing Readiness`: choosing {guilabel}`When components for the 1st operation are + available` shows the {guilabel}`Component Status` as a **green** {guilabel}`Not Available`, when + only the components that are consumed in the first operation are in stock. This indicates that + although not all components are available, operators can at least begin with the first operation. + Choosing {guilabel}`When all components are available` displays a **red** {guilabel}`Not + Available` component status unless all components are in available. + + :::{tip} + Specify which operation consumes each component on the {{ BoM }} in the {ref}`Manual Consumption + field `. + ::: + + ```{image} bill_configuration/component-status.png + :align: center + :alt: Show the *Component Status* field on the manufacturing order dashboard. + ``` + +- {guilabel}`Version`: displays the current {{ BoM }} version, visible with the Odoo *PLM* app installed + for managing {{ BoM }} changes. + +- {guilabel}`Flexible Consumption`: specifies if components used can deviate from the quantity + defined on the {{ BoM }}. Choose {guilabel}`Blocked` if operators **must** adhere strictly to the + {{ BoM }} quantity. Otherwise, choose {guilabel}`Allowed` or {guilabel}`Allowed with Warning`. + +- {guilabel}`Routing`: select the preferred warehouse's manufacturing operation type for products + produced in multiple warehouses. If left blank, this warehouse's `Manufacturing` operation type is + used by default. + +- {guilabel}`Analytic Distribution`: select pre-created {doc}`analytic distribution models + <../../../finance/accounting/reporting/analytic_accounting>` from the list to automatically record + the cost of manufacturing products in the chosen journal. + +- {guilabel}`Manuf Lead Time`: define the number of days needed to complete a {{ MO }} from the date of + confirmation. + +- {guilabel}`Days to prepare Manufacturing Order`: number of days needed to replenish components, or + manufacture sub-assemblies of the product. + +:::{seealso} +- {doc}`Analytic distribution <../../../finance/accounting/reporting/analytic_accounting>` +- {doc}`Lead times + <../../inventory/warehouses_storage/replenishment/lead_times>` +::: + +```{image} bill_configuration/misc-tab.png +:align: center +:alt: Show the *Miscellaneous* tab of the BoM. +``` + +## Add by-products to BoMs + +A *by-product* is a residual product that is created during production in addition to the main +product of a {{ BOM }}. Unlike the primary product, there can be more than one by-product on a {{ BOM }}. + +To add by-products to a {{ BOM }}, first enable the *By-Products* feature in +{menuselection}`Manufacturing app --> Configuration --> Settings`. In the {guilabel}`Operations` +section, tick the checkbox for {guilabel}`By-Products` to enable the feature. + +```{image} bill_configuration/by-products.png +:align: center +:alt: '"By Products" feature in the settings page.' +``` + +Once the feature is enabled, add by-products to a {{ BOM }} by clicking the {guilabel}`By-products` tab. +Click {guilabel}`Add a line`, and fill in the {guilabel}`By-product`, {guilabel}`Quantity`, and +{guilabel}`Unit of Measure`. Optionally, specify a {guilabel}`Produced in Operation` for the +by-product. + +```{eval-rst} +.. example:: + The by-product, `Mush`, is created in the `Grind grapes` operation when producing `Red Wine`. + + .. image:: bill_configuration/add-by-product.png + :align: center + :alt: Show sample by-product in the BoM. +``` + diff --git a/content/applications/inventory_and_mrp/manufacturing/basic_setup/configure_manufacturing_product.md b/content/applications/inventory_and_mrp/manufacturing/basic_setup/configure_manufacturing_product.md new file mode 100644 index 000000000..05e39debe --- /dev/null +++ b/content/applications/inventory_and_mrp/manufacturing/basic_setup/configure_manufacturing_product.md @@ -0,0 +1,107 @@ +--- +substitutions: + BOM: '{abbr}`BoM (Bill of Materials)`' +--- + +# Manufacturing product configuration + +(manufacturing/management/configure-manufacturing-product)= + +In order to manufacture a product in Odoo *Manufacturing*, the product must be properly configured. +Doing so consists of enabling the *Manufacturing* route and configuring a bill of materials (BoM) +for the product. Once these steps are completed, the product is selectable when creating a new +manufacturing order. + +## Activate the Manufacture route + +The Manufacture route is activated for each product on its own product page. To do so, begin by +navigating to {menuselection}`Manufacturing --> Products --> Products`. Then, select an existing +product, or create a new one by clicking {guilabel}`New`. + +On the product page, select the {guilabel}`Inventory` tab, then enable the {guilabel}`Manufacture` +checkbox in the {guilabel}`Routes` section. This tells Odoo the product can be manufactured. + +```{image} configure_manufacturing_product/manufacturing-route.png +:align: center +:alt: The Manufacturing route on the Inventory tab of a product page. +``` + +(manufacturing-basic-setup-lot-serial-tracking)= + +### Lot/serial number tracking + +The assignment of lots or serial numbers to newly manufactured products is optional. To optionally +{doc}`assign lots or serial numbers <../../inventory/product_management/product_tracking>` +to newly manufactured products, go to the {guilabel}`Traceability` section in the +{guilabel}`Inventory` tab. In the {guilabel}`Tracking` field, select {guilabel}`By Unique Serial +Number` or {guilabel}`By Lots`. + +Doing so enables the *Lot/Serial Number* field on a manufacturing order, or the *Register +Production* instruction on a work order card in the *Shop Floor* app. + +:::{figure} configure_manufacturing_product/lot-number-field.png +:align: center +:alt: '"Lot/Serial Number" field on the MO.' + +**Lot/Serial Number** field on the MO. +::: + +:::{figure} configure_manufacturing_product/register-production.png +:align: center +:alt: '**Register Production** option to generate lot/serial number on a work order +: card.' + +**Register Production** option to generate lot/serial number on a work order card. +::: + +## Configure a bill of materials (BoM) + +Next, a {{ BOM }} must be configured for the product so Odoo knows how it is manufactured. A {{ BOM }} is a +list of the components and operations required to manufacture a product. + +To create a {{ BOM }} for a specific product, navigate to {menuselection}`Manufacturing --> Products --> +Products`, then select the product. On the product page, click the {guilabel}`Bill of Materials` +smart button at the top of the page, then select {guilabel}`New` to configure a new {{ BOM }}. + +```{image} configure_manufacturing_product/bom-smart-button.png +:align: center +:alt: The Bill of Materials smart button on a product page. +``` + +On the {{ BOM }}, the {guilabel}`Product` field auto-populates with the product. In the +{guilabel}`Quantity` field, specify the number of units that the BoM produces. + +Add a component to the {{ BOM }} by selecting the {guilabel}`Components` tab and clicking {guilabel}`Add +a line`. Select a component from the {guilabel}`Component` drop-down menu, then enter the quantity +in the {guilabel}`Quantity` field. Continue adding components on new lines until all components have +been added. + +```{image} configure_manufacturing_product/components-tab.png +:align: center +:alt: The Components tab on a bill of materials. +``` + +Next, select the {guilabel}`Operations` tab. Click {guilabel}`Add a line` and a {guilabel}`Create +Operations` pop-up window appears. In the {guilabel}`Operation` field, specify the name of the +operation being added (e.g. Assemble, Cut, etc.). Select the work center where the operation will be +carried out from the {guilabel}`Work Center` drop-down menu. Finally, click {guilabel}`Save & Close` +to finish adding operations, or {guilabel}`Save & New` to add more. + +:::{important} +The {guilabel}`Operations` tab only appears if the {guilabel}`Work Orders` setting is enabled. To +do so, navigate to {menuselection}`Manufacturing --> Configuration --> Settings`, then enable the +{guilabel}`Work Orders` checkbox. +::: + +```{image} configure_manufacturing_product/operations-tab.png +:align: center +:alt: The Operations tab on a bill of materials. +``` + +:::{admonition} Learn more +The section above provides instructions for creating a basic {{ BOM }} that allows a product to be +manufactured in Odoo. However, it is by no means an exhaustive summary of all the options +available when configuring a {{ BOM }}. For more information about bills of materials, see the +documentation on how to {doc}`create a bill of materials `. +::: + diff --git a/content/applications/inventory_and_mrp/manufacturing/basic_setup/mo_costs.md b/content/applications/inventory_and_mrp/manufacturing/basic_setup/mo_costs.md new file mode 100644 index 000000000..4a1547b2f --- /dev/null +++ b/content/applications/inventory_and_mrp/manufacturing/basic_setup/mo_costs.md @@ -0,0 +1,238 @@ +--- +substitutions: + BoM: '{abbr}`BoM (Bill of Materials)`' + BoMs: '{abbr}`BoMs (Bills of Materials)`' + MO: '{abbr}`MO (Manufacturing Order)`' + MOs: '{abbr}`MOs (Manufacturing Orders)`' + POs: '{abbr}`POs (Purchase Orders)`' +--- + +# Manufacturing order costs + +The ability to accurately calculate the cost of manufacturing a product is critical when determining +product profitability. Odoo's **Manufacturing** app simplifies this calculation by automatically +calculating the cost to complete each manufacturing order (MO), as well as the average production +cost of a product, based on all completed {{ MOs }}. + +:::{important} +Odoo's Manufacturing app distinguishes between the *MO cost* and the *real cost* of an {{ MO }}. + +The {{ MO }} cost represents how much it *should* cost to complete an {{ MO }}, based on the +configuration of the product's bill of materials (BoM). This takes into account the cost and +quantity of components, as well as the cost of completing the necessary operations. + +The real cost represents how much it *actually* costs to complete the {{ MO }}. A few factors can +cause the real cost to differ from the {{ MO }} cost. For example, an operation may take longer to +complete than estimated, a greater component quantity might be needed than was specified on the +{{ BoM }}, or the price of components may change during manufacturing. +::: + +## Cost configuration + +Odoo computes {{ MO }} costs based on the configuration of the {{ BoM }} used to manufacture a product. This +calculation includes the cost and quantity of components and operations listed on the {{ BoM }}, in +addition to the operating costs of the work centers where those operations are carried out, and the +amount paid to each employee who works on an operation. + +### Component cost + +Component cost is calculated automatically, based on the average purchase cost of a component across +all purchase orders (POs). To view a component's cost, navigate to {guilabel}`Inventory app --> +Products --> Products`, and select a component product. The cost is displayed in the +{guilabel}`Cost` field of the {guilabel}`General Information` tab, on the component's product form. + +It is possible to set the cost of a component manually, by clicking the {guilabel}`Cost` field on +the component's product form and entering a value. However, any future {{ POs }} for the component +override a manually entered value, resetting the {guilabel}`Cost` field back to an automatically +computed value. + +(manufacturing-mo-costs-work-center-cost)= + +### Work center cost + +To set the operating cost for a specific work center, navigate to {menuselection}`Manufacturing app +--> Configuration --> Work Centers`, and select a work center. + +To set the cost of operating the work center for one hour, enter a value in the {guilabel}`per +workcenter` field, located beside the {guilabel}`Cost per hour` section on the work center's +{guilabel}`General Information` tab. + +To set the hourly cost of each employee that operates the work center, enter a value in the +{guilabel}`per employee` field, located beside the {guilabel}`Cost per hour` section on the work +center's {guilabel}`General Information` tab. For example, if `25.00` is entered in the +{guilabel}`per employee` field, it costs \$25.00 per hour for *each* employee working at the work +center. + +:::{important} +The value entered in the {guilabel}`per employee` field is only used to calculate the {{ MO }} cost, +which is the estimated cost of completing the {{ MO }}. + +The actual cost of completing the {{ MO }} is represented by the real cost. Instead of using the +value entered in the {guilabel}`per employee` field, the real cost is calculated using the hourly +cost specific to each employee. + +For example, if the {guilabel}`per employee` cost of a work center is '\$50.00', and an employee +with an hourly cost of '\$60.00' completes a work order there, the {{ MO }} cost (estimated) is +calculated using the \$50/hr cost, while the real cost is calculated using the \$60/hr cost. + +See the {ref}`employee cost section ` below for information +on how to set the cost for specific employees. +::: + +(manufacturing-mo-costs-employee-cost)= + +### Employee cost + +To set the hourly cost for a specific employee, navigate to the {menuselection}`Employees` app, and +select an employee. On the employee's form, select the {guilabel}`Settings` tab, and enter the +employee's rate in the {guilabel}`Hourly Cost` field of the {guilabel}`Application Settings` +section. + +:::{important} +As detailed in the {ref}`work center cost section ` +above, the value entered in the {guilabel}`Hourly Cost` field on the employee's form is used to +calculate the real cost of an {{ MO }}. The estimated cost of an {{ MO }}, referred to as the {{ MO }} cost, +uses the per employee cost set on each work center's form. +::: + +### {{ BoM }} configuration + +Configuring a {{ BoM }} so Odoo can accurately calculate the cost of {{ MOs }} that use it requires two +steps. First, components **must** be added, and the required quantity specified. Second, operations +**must** be added, along with the work centers where they are carried out. + +Begin by navigating to {menuselection}`Manufacturing app --> Products --> Bills of Materials`. +Select a {{ BoM }}, or create a new one by clicking {guilabel}`New`. + +In the {guilabel}`Components` tab of the {{ BoM }} form, add each component by clicking {guilabel}`Add a +line`, selecting the component from the drop-down menu in the {guilabel}`Component` column, and +entering the quantity in the {guilabel}`Quantity` column. + +In the {guilabel}`Operations` tab, add an operation by clicking {guilabel}`Add a line` to open the +{guilabel}`Create Operations` pop-up window. Enter a title for the operation in the +{guilabel}`Operation` field. + +Select the {guilabel}`Work Center` where the operation is carried out. Then, add a +{guilabel}`Default Duration`, which is the estimated amount of time the operation takes to complete. + +By default, the {guilabel}`Duration Computation` field is set to {guilabel}`Set duration manually`, +which means that the number entered in {guilabel}`Default Duration` field is always used as the +expected duration of the operation. + +Selecting {guilabel}`Compute based on tracked time` causes Odoo to automatically compute the +{guilabel}`Default Duration` based on a certain number of work orders, which is set in the +{guilabel}`Based on` field. Before there are work orders to compute this duration, the value in the +{guilabel}`Default Duration` field is used instead. + +The hourly cost of operating the work center, and the duration of the operation, are used to +calculate the operation's cost. + +Finally, click {guilabel}`Save & Close` to add the operation to the {{ BoM }}, and close the +{guilabel}`Create Operations` pop-up window. Alternatively, click {guilabel}`Save & New` to add the +operation to the {{ BoM }}, and open a blank {guilabel}`Create Operations` pop-up window to add another +operation. + +:::{seealso} +For a full overview of {{ BoM }} configuration, see the documentation on {doc}`bills of materials +`. +::: + +## {{ MO }} overview + +Each {{ MO }} has an *overview* page, which lists a variety of information about the {{ MO }}, including +{{ MO }} cost and real cost. To view the overview for an {{ MO }}, navigate to {menuselection}`Manufacturing +app --> Operations --> Manufacturing Orders`, and select an {{ MO }}. Then, click the {icon}`fa-bars` +{guilabel}`Overview` smart button at the top of the {{ MO }}. + +Both the {{ MO }} cost and real cost take into account the cost and quantity of components, as well as +the cost of completing each work order. The overview page lists a row for each of these values, with +the sum of them listed at the bottom of the {guilabel}`MO Cost` and {guilabel}`Real Cost` columns. + +Before work begins on an {{ MO }}, the {guilabel}`MO Cost` and {guilabel}`Real Cost` columns display the +same costs. This is the *estimated* cost of completing the {{ MO }}. + +However, once work commences, the values in the {guilabel}`Real Cost` column may begin to diverge +from the values in the {guilabel}`MO Cost` column. This happens if a different component quantity is +used than was listed on the {{ MO }}, the duration of a work order is different than expected, or the +hourly cost of the employee performing a work order differs from the employee cost set on the work +center. + +Once the {{ MO }} has been completed by clicking {guilabel}`Produce All`, the values in the +{guilabel}`MO Cost` column update to match those displayed in the {guilabel}`Real Cost` column. + +```{image} mo_costs/overview.png +:align: center +:alt: The MO Overview page. +``` + +## Average manufacturing cost + +In addition to the cost of each individual {{ MO }} for a product, Odoo also tracks the average cost of +manufacturing the product, taking into account the cost of every completed {{ MO }}. To view this, +navigate to {menuselection}`Inventory app --> Products --> Products`, and select a product. + +The manufacturing cost of the product is displayed per unit of measure in the {guilabel}`Cost` +field, located in the {guilabel}`General Information` tab. The value continues to update as the +costs of additional {{ MOs }} are factored into the average cost. + +To the right of the {guilabel}`Cost` field is a {guilabel}`Compute Price from BoM` button, which +only appears for products with at least one {{ BoM }}. Click this button to reset the cost of the +product to the expected cost, which only takes into account the components and operations listed on +the {{ BoM }}. + +:::{important} +Be aware that clicking {guilabel}`Compute Price from BoM` does not set the price permanently. The +cost continues to update based on the average of the {{ BoM }} price and the real cost of any future +{{ MOs }}. +::: + +:::{admonition} Example workflow: manufacturing cost +:class: alert alert-success + +Golf product manufacturer *Fairway Fields* produces a variety of golf products, including an +indoor *putting green*. They have configured a {{ BoM }} for the putting green, so Odoo automatically +calculates the manufacturing cost of each putting green {{ MO }}. + +The {{ BoM }} lists two components: + +- One unit of *green felt*, which costs \$20.00. +- One unit of a *rubber pad*, which costs \$30.00. + +The {{ BoM }} also lists four operations, all of which are carried out at *Assembly Station 1*, which +has an hourly operating cost of \$30.00. Those operations are as follows: + +- *Cut felt*: default duration of seven minutes, for a total cost of \$3.50. +- *Cut rubber pad*: default duration of five minutes, for a total cost of \$2.50. +- *Attach pad to felt*: default duration of 15 minutes, for a total cost of \$7.50. +- *Cut holes*: default duration of three minutes, for a total cost of \$1.50. + +Altogether, the components required to produce one putting green cost \$50.00, and the operations +required cost \$15.00, for a total manufacturing cost of \$65.00. This cost is reflected in the +{guilabel}`Cost` field on the putting green's product form. + +Fairway Fields confirms an {{ MO }} for one putting green. Before manufacturing starts, the {{ MO }} +overview lists a cost of `$65.00` in both the {guilabel}`MO Cost` and {guilabel}`Real Cost` +fields. + +```{image} mo_costs/overview-before.png +:align: center +:alt: The MO Overview page for one putting green, before production starts. +``` + +Manufacturing begins, and the operations take ten minutes longer than expected, for a total +manufacturing time of 40 minutes. This deviation from the {{ BoM }} is reflected on the {{ MO }} +overview, which now lists a {guilabel}`Real Cost` of `$70.00`. + +```{image} mo_costs/overview-during.png +:align: center +:alt: The MO Overview page for one putting green, during production. +``` + +Once manufacturing is finished, and the {{ MO }} is marked as *Done*, the {{ MO }} overview updates +again, so the values in the {guilabel}`MO Cost` and {guilabel}`Real Cost` columns match, each +displaying a value of `$70.00`. + +On the putting green's product page, the {guilabel}`Cost` field now displays a cost of `$67.50`, +the average of the original cost of \$65.00 and the real cost of \$70.00 from the {{ MO }}. +::: + diff --git a/content/applications/inventory_and_mrp/manufacturing/basic_setup/one_step_manufacturing.md b/content/applications/inventory_and_mrp/manufacturing/basic_setup/one_step_manufacturing.md new file mode 100644 index 000000000..8b49599d0 --- /dev/null +++ b/content/applications/inventory_and_mrp/manufacturing/basic_setup/one_step_manufacturing.md @@ -0,0 +1,165 @@ +--- +substitutions: + BOM: '{abbr}`BoM (Bill of Materials)`' + MO: '{abbr}`MO (Manufacturing Order)`' +--- + +# One-step manufacturing + +(manufacturing/management/one_step_manufacturing)= + +Odoo *Manufacturing* allows users to manufacture products using one, two, or three steps. When using +one-step manufacturing, Odoo creates a manufacturing order (MO), but does not generate transfers for +the movement of components out of inventory or finished products into stock. Inventory counts still +update based on the number of components used and products manufactured, but the act of transferring +them to and from inventory is not tracked. + +:::{tip} +The number of steps used in manufacturing is set at the warehouse level, allowing for each +warehouse to use a different number of steps. To change the number of steps used for a specific +warehouse, begin by navigating to {menuselection}`Inventory --> Configuration --> Warehouses`, +and then select a warehouse from the {guilabel}`Warehouses` screen. + +On the {guilabel}`Warehouse Configuration` tab, find the {guilabel}`Manufacture` radio input +field, and select one of the three options: {guilabel}`Manufacture (1 step)`, {guilabel}`Pick +components and then manufacture (2 steps)`, or {guilabel}`Pick components, manufacture and then +store products (3 steps)`. + +```{image} one_step_manufacturing/manufacturing-type.png +:align: center +:alt: The Manufacture radio input field on a warehouse configuration page. +``` +::: + +:::{important} +Products must be properly configured before they can be manufactured in Odoo. For details on how +to do so, see the documentation on how to {ref}`configure a product for manufacturing +`. +::: + +## Create manufacturing order + +To manufacture a product in Odoo *Manufacturing*, begin by navigating to +{menuselection}`Manufacturing --> Operations --> Manufacturing Orders`, and then click +{guilabel}`New` to create a new {{ MO }}. + +On the new {{ MO }}, select the product to be produced from the {guilabel}`Product` drop-down menu. The +{guilabel}`Bill of Material` field auto-populates with the associated bill of materials (BoM). + +If a product has more than one {{ BOM }} configured for it, the specific {{ BOM }} can be selected in the +{guilabel}`Bill of Material` field, and the {guilabel}`Product` field auto-populates with the +associated product. + +After a {{ BOM }} has been selected, the {guilabel}`Components` and {guilabel}`Work Orders` tabs +auto-populate with the components and operations specified on the {{ BOM }}. If additional components or +operations are required for the {{ MO }} being configured, add them to the {guilabel}`Components` and +{guilabel}`Work Orders` tabs by clicking {guilabel}`Add a line`. + +Finally, click {guilabel}`Confirm` to confirm the {{ MO }}. + +## Process manufacturing order + +An {{ MO }} is processed by completing all of the work orders listed under its {guilabel}`Work Orders` +tab. This can be done on the {{ MO }} itself, or from the work order tablet view. + +### Basic workflow + +To complete work orders from the {{ MO }} itself, begin by navigating to {menuselection}`Manufacturing +--> Operations --> Manufacturing Orders`, and then select an {{ MO }}. + +On the {{ MO }} page, select the {guilabel}`Work Orders` tab. Once work begins on the first work order +that needs to be completed, click the {guilabel}`Start` button for that work order. Odoo +*Manufacturing* then starts a timer that keeps track of how long the work order takes to complete. + +```{image} one_step_manufacturing/start-button.png +:align: center +:alt: The Start button for an operation on a manufacturing order. +``` + +When the work order is completed, click the {guilabel}`Done` button for that work order. Repeat the +same process for each work order listed on the {guilabel}`Work Orders` tab. + +```{image} one_step_manufacturing/done-button.png +:align: center +:alt: The Done button for an operation on a manufacturing order. +``` + +After completing all of the work orders, click {guilabel}`Produce All` at the top of the screen to +mark the {{ MO }} as {guilabel}`Done`, and register the manufactured product(s) into inventory. + +### Shop Floor workflow + +To complete the work orders for an {{ MO }} using the *Shop Floor* module, begin by navigating to +{menuselection}`Manufacturing --> Operations --> Manufacturing Orders`, and then select an {{ MO }}. + +On the {{ MO }}, click on the {guilabel}`Work Orders` tab, and then select the {guilabel}`↗️ (square +with arrow coming out of it)` button on the line of the first work order to be processed. Doing so +opens a {guilabel}`Work Orders` pop-up window, with details and processing options for the work +order. + +On the pop-up window, select the {guilabel}`Open Shop Floor` button at the top-left of the window to +open the *Shop Floor* module. + +```{image} one_step_manufacturing/shop-floor-button.png +:align: center +:alt: The Open Shop Floor button for a work order on a manufacturing order. +``` + +When accessed directly from a specific work order within an {{ MO }}, *Shop Floor* defaults to the page +for the work center where the work order is configured to be carried out. The page shows a card for +the work order that displays the {{ MO }} number, the product and number of units to be produced, and +the steps required to complete the work order. + +```{image} one_step_manufacturing/work-order-card.png +:align: center +:alt: A work order card on a work center page in the Shop Floor module. +``` + +A work order is processed by completing each step listed on its card. This can be done by clicking +on a step and following the instructions listed on the pop-up window that appears. Once the step is +completed, click {guilabel}`Next` to move on to the next step, if any are required. + +Alternatively, work order steps can be completed by clicking the checkbox that appears on the right +side of the step's line on the work order card. When using this method, the step is automatically +marked as completed, without a pop-up window appearing. + +The final step on a work order card is titled *Register Production*. This step is used to register +the number of product units that were produced. If the number produced is equal to the number that +the {{ MO }} was created for, click the {guilabel}`# Units` button on the right side of the line to +automatically register that number as the quantity produced. + +If a different number must be entered, click the {guilabel}`Register Production` step to open a +pop-up window. Enter the number of units produced in the {guilabel}`Units` field, and then click +{guilabel}`Validate` to register that number. + +:::{note} +The *Register Production* step appears on every work order card. It must be completed for the +first work order that is processed. After doing so, the step appears as already completed for +each remaining work order in the {{ MO }}. +::: + +After completing all of the steps for a work order, a button appears on the footer of the work order +card. If any other work orders must be completed before the {{ MO }} can be closed, the button is titled +{guilabel}`Mark as Done`. If there are no additional work orders to complete, the button is titled +{guilabel}`Close Production`. + +Clicking {guilabel}`Mark as Done` causes the work order card to fade away. Once it disappears +completely, the work order's status is marked as *Finished* on the {{ MO }}, and the next work order +appears in the *Shop Floor* module, on the page of the work center where it is configured to be +carried out. Any additional work orders can be processed using the instructions detailed in this +section. + +Clicking {guilabel}`Close Production` causes the work order card to fade away. Once it disappears, +the {{ MO }} is marked as *Done*, and the units of the product that were produced are entered into +inventory. + +After clicking {guilabel}`Mark as Done` or {guilabel}`Close Production`, each button is replaced by +an {guilabel}`Undo` button. Click the {guilabel}`Undo` button before the work order card fades away +to keep the work order open. + +:::{tip} +This section details the basic workflow for processing an {{ MO }} in the *Shop Floor* module. For a +more in-depth explanation of the module and all of its features, please see the {ref}`Shop Floor +overview ` documentation. +::: + diff --git a/content/applications/inventory_and_mrp/manufacturing/basic_setup/three_step_manufacturing.md b/content/applications/inventory_and_mrp/manufacturing/basic_setup/three_step_manufacturing.md new file mode 100644 index 000000000..a0fead8e6 --- /dev/null +++ b/content/applications/inventory_and_mrp/manufacturing/basic_setup/three_step_manufacturing.md @@ -0,0 +1,200 @@ +--- +substitutions: + BOM: '{abbr}`BoM (Bill of Materials)`' + MO: '{abbr}`MO (Manufacturing Order)`' +--- + +# Three-step manufacturing + +(manufacturing/management/two_step_manufacturing)= + +Odoo *Manufacturing* allows users to manufacture products using one, two, or three steps. When using +three-step manufacturing, Odoo creates a pick components transfer, a manufacturing order (MO), and a +store finished products transfer, and updates inventory counts based on the number of components +removed, and finished products created. + +:::{tip} +The number of steps used in manufacturing is set at the warehouse level, allowing for each +warehouse to use a different number of steps. To change the number of steps used for a specific +warehouse, begin by navigating to {menuselection}`Inventory --> Configuration --> Warehouses`, +and then select a warehouse from the {guilabel}`Warehouses` screen. + +On the {guilabel}`Warehouse Configuration` tab, find the {guilabel}`Manufacture` radio input +field, and select one of the three options: {guilabel}`Manufacture (1 step)`, {guilabel}`Pick +components and then manufacture (2 steps)`, or {guilabel}`Pick components, manufacture and then +store products (3 steps)`. + +```{image} three_step_manufacturing/manufacturing-type.png +:align: center +:alt: The Manufacture radio input field on a warehouse configuration page. +``` +::: + +:::{important} +Products must be properly configured before they can be manufactured in Odoo. For details on how +to do so, see the documentation on how to {ref}`configure a product for manufacturing +`. +::: + +## Create manufacturing order + +To manufacture a product in Odoo *Manufacturing*, begin by navigating to +{menuselection}`Manufacturing --> Operations --> Manufacturing Orders`, and then click +{guilabel}`New` to create a new {{ MO }}. + +On the new {{ MO }}, select the product to be produced from the {guilabel}`Product` drop-down menu. The +{guilabel}`Bill of Material` field auto-populates with the associated Bill of Materials (BoM). + +If a product has more than one {{ BOM }} configured for it, the specific {{ BOM }} can be selected in the +{guilabel}`Bill of Material` field, and the {guilabel}`Product` field auto-populates with the +associated product. + +After a {{ BOM }} has been selected, the {guilabel}`Components` and {guilabel}`Work Orders` tabs +auto-populate with the components and operations specified on the {{ BOM }}. If additional components or +operations are required for the {{ MO }} being configured, add them to the {guilabel}`Components` and +{guilabel}`Work Orders` tabs by clicking {guilabel}`Add a line`. + +Finally, click {guilabel}`Confirm` to confirm the {{ MO }}. + +## Process pick components transfer + +After confirming a three-step {{ MO }}, a {guilabel}`Transfers` smart button appears at the top of the +page. Click it to be taken to the {guilabel}`Transfers` page for the {{ MO }}. The page lists two +transfers: *WH/PC/XXXXX* (the pick components transfer), and *WH/SFP/XXXXX* (the store finished +products transfer). + +Select {guilabel}`WH/PC/XXXXX` to open the pick components transfer for the {{ MO }}. This transfer is +used to track the movement of components from the locations where they are stored to the location +where they are used to manufacture the product. + +After transferring the components out of their storage location, click {guilabel}`Validate` at the +top of the transfer, followed by {guilabel}`Apply` on the {guilabel}`Immediate Transfer?` pop-up +window that appears. Doing so marks the transfer as {guilabel}`Done`, and updates inventory counts +to reflect the quantity of components transferred. + +Finally, return to the {{ MO }} by clicking the {guilabel}`WH/MO/XXXXX` breadcrumb at the top of the +page. + +```{image} three_step_manufacturing/mo-bread-crumb.png +:align: center +:alt: The manufacturing order bread crumb on a pick components transfer. +``` + +## Process manufacturing order + +An {{ MO }} is processed by completing all of the work orders listed under its {guilabel}`Work Orders` +tab. This can be done on the {{ MO }} itself, or from the work order tablet view. + +### Basic workflow + +To complete work orders from the {{ MO }} itself, begin by navigating to {menuselection}`Manufacturing +--> Operations --> Manufacturing Orders`, and then select a manufacturing order. + +On the {{ MO }} page, select the {guilabel}`Work Orders` tab. Once work begins on the first work order +that needs to be completed, click the {guilabel}`Start` button for that work order. Odoo +*Manufacturing* then starts a timer that keeps track of how long the work order takes to complete. + +```{image} three_step_manufacturing/start-button-2.png +:align: center +:alt: The Start button for a work order on a manufacturing order. +``` + +When the work order is completed, click the {guilabel}`Done` button for that work order. Repeat the +same process for each work order listed on the {guilabel}`Work Orders` tab. + +```{image} three_step_manufacturing/done-button.png +:align: center +:alt: The Done button for an work order on a manufacturing order. +``` + +After completing all of the work orders, click {guilabel}`Produce All` at the top of the screen to +mark the {{ MO }} as {guilabel}`Done`, and register the manufactured product(s) into inventory. + +### Shop Floor workflow + +To complete the work orders for an {{ MO }} using the *Shop Floor* module, begin by navigating to +{menuselection}`Manufacturing --> Operations --> Manufacturing Orders`, and then select an {{ MO }}. + +On the {{ MO }}, click on the {guilabel}`Work Orders` tab, and then select the {guilabel}`↗️ (square +with arrow coming out of it)` button on the line of the first work order to be processed. Doing so +opens a {guilabel}`Work Orders` pop-up window, with details and processing options for the work +order. + +On the pop-up window, select the {guilabel}`Open Shop Floor` button at the top-left of the window to +open the *Shop Floor* module. + +```{image} three_step_manufacturing/shop-floor-button.png +:align: center +:alt: The Open Shop Floor button for a work order on a manufacturing order. +``` + +When accessed directly from a specific work order within an {{ MO }}, *Shop Floor* defaults to the page +for the work center where the work order is configured to be carried out. The page shows a card for +the work order that displays the {{ MO }} number, the product and number of units to be produced, and +the steps required to complete the work order. + +```{image} three_step_manufacturing/work-order-card.png +:align: center +:alt: A work order card on a work center page in the Shop Floor module. +``` + +A work order is processed by completing each step listed on its card. This can be done by clicking +on a step, and following the instructions listed on the pop-up window that appears. Once the step is +completed, click {guilabel}`Next` to move on to the next step, if any are required. + +Alternatively, work order steps can be completed by clicking the checkbox that appears on the right +side of the step's line on the work order card. When using this method, the step is automatically +marked as completed, without a pop-up window appearing. + +The final step on a work order card is titled *Register Production*. This step is used to register +the number of product units that were produced. If the number produced is equal to the number that +the {{ MO }} was created for, click the {guilabel}`# Units` button on the right side of the line to +automatically register that number as the quantity produced. + +If a different number must be entered, click the {guilabel}`Register Production` step to open a +pop-up window. Enter the number of units produced in the {guilabel}`Units` field, and then click +{guilabel}`Validate` to register that number. + +:::{note} +The *Register Production* step appears on every work order card. It must be completed for the +first work order that is processed. After doing so, the step appears as already completed for +each remaining work order in the {{ MO }}. +::: + +After completing all of the steps for a work order, a button appears on the footer of the work order +card. If any other work orders must be completed before the {{ MO }} can be closed, the button is titled +{guilabel}`Mark as Done`. If there are no additional work orders to complete, the button is titled +{guilabel}`Close Production`. + +Clicking {guilabel}`Mark as Done` causes the work order card to fade away. Once it disappears +completely, the work order's status is marked as *Finished* on the {{ MO }}, and the next work order +appears in the *Shop Floor* module, on the page of the work center where it is configured to be +carried out. Any additional work orders can be processed using the instructions detailed in this +section. + +Clicking {guilabel}`Close Production` causes the work order card to fade away. Once it disappears, +the {{ MO }} is marked as *Done*, and the units of the product that were produced are entered into +inventory. + +After clicking {guilabel}`Mark as Done` or {guilabel}`Close Production`, each button is replaced by +an {guilabel}`Undo` button. Click the {guilabel}`Undo` button before the work order card fades away +to keep the work order open. + +:::{tip} +This section details the basic workflow for processing an {{ MO }} in the *Shop Floor* module. For a +more in-depth explanation of the module and all of its features, please see the {ref}`Shop Floor +overview ` documentation. +::: + +## Process finished product transfer + +After completing the {{ MO }}, return to the order's {guilabel}`Transfers` page by clicking the +{guilabel}`Transfers` button at the top of the order. This time, select {guilabel}`WH/SFP/XXXXX` to +open the store finished products transfer. This transfer is used to track the movement of finished +products from the location where they were manufactured to the location where they are stored. + +After transferring the finished products to their storage location, click {guilabel}`Validate` at +the top of the transfer, followed by {guilabel}`Apply` on the {guilabel}`Immediate Transfer?` pop-up +window that appears. Doing so marks the transfer as {guilabel}`Done`, and updates inventory counts +to reflect the quantity of finished products transferred. + diff --git a/content/applications/inventory_and_mrp/manufacturing/basic_setup/two_step_manufacturing.md b/content/applications/inventory_and_mrp/manufacturing/basic_setup/two_step_manufacturing.md new file mode 100644 index 000000000..e2975091d --- /dev/null +++ b/content/applications/inventory_and_mrp/manufacturing/basic_setup/two_step_manufacturing.md @@ -0,0 +1,185 @@ +--- +substitutions: + BOM: '{abbr}`BoM (Bill of Materials)`' + MO: '{abbr}`MO (Manufacturing Order)`' +--- + +# Two-step manufacturing + +(manufacturing/management/one_step_manufacturing)= + +Odoo *Manufacturing* allows users to manufacture products using one, two, or three steps. When using +two-step manufacturing, Odoo creates a manufacturing order (MO) and a pick components transfer, but +does not generate a transfer for the movement of finished products into stock. Inventory counts +still update based on the number of products manufactured, but the act of transferring them to and +from inventory is not tracked. + +:::{tip} +The number of steps used in manufacturing is set at the warehouse level, allowing for each +warehouse to use a different number of steps. To change the number of steps used for a specific +warehouse, begin by navigating to {menuselection}`Inventory --> Configuration --> Warehouses`, +and then select a warehouse from the {guilabel}`Warehouses` screen. + +On the {guilabel}`Warehouse Configuration` tab, find the {guilabel}`Manufacture` radio input +field, and select one of the three options: {guilabel}`Manufacture (1 step)`, {guilabel}`Pick +components and then manufacture (2 steps)`, or {guilabel}`Pick components, manufacture and then +store products (3 steps)`. + +```{image} two_step_manufacturing/manufacturing-type.png +:align: center +:alt: The Manufacture radio input field on a warehouse configuration page. +``` +::: + +:::{important} +Products must be properly configured before they can be manufactured in Odoo. For details on how +to do so, see the documentation on how to {ref}`configure a product for manufacturing +`. +::: + +## Create manufacturing order + +To manufacture a product in Odoo *Manufacturing*, begin by navigating to +{menuselection}`Manufacturing --> Operations --> Manufacturing Orders`, and then click +{guilabel}`New` to create a new {{ MO }}. + +On the new {{ MO }}, select the product to be produced from the {guilabel}`Product` drop-down menu. The +{guilabel}`Bill of Material` field auto-populates with the associated Bill of Materials (BoM). + +If a product has more than one {{ BOM }} configured for it, the specific {{ BOM }} can be selected in the +{guilabel}`Bill of Material` field, and the {guilabel}`Product` field auto-populates with the +associated product. + +After a {{ BOM }} has been selected, the {guilabel}`Components` and {guilabel}`Work Orders` tabs +auto-populate with the components and operations specified on the {{ BOM }}. If additional components or +operations are required for the {{ MO }} being configured, add them to the {guilabel}`Components` and +{guilabel}`Work Orders` tabs by clicking {guilabel}`Add a line`. + +Finally, click {guilabel}`Confirm` to confirm the {{ MO }}. + +## Process pick components transfer + +After confirming a two-step {{ MO }}, a {guilabel}`Transfers` smart button appears at the top of the +page. Click it to open the pick components transfer for the {{ MO }}. This transfer is used to track the +movement of components from the locations where they are stored to the location where they are used +to manufacture the product. + +After transferring the components out of their storage location, click {guilabel}`Validate` at the +top of the transfer, followed by {guilabel}`Apply` on the {guilabel}`Immediate Transfer?` pop-up +window that appears. Doing so marks the transfer as {guilabel}`Done`, and updates inventory counts +to reflect the quantity of components transferred. + +Finally, return to the {{ MO }} by clicking the {guilabel}`WH/MO/XXXXX` breadcrumb at the top of the +page. + +```{image} two_step_manufacturing/mo-bread-crumb.png +:align: center +:alt: The manufacturing order bread crumb on a pick components transfer. +``` + +## Process manufacturing order + +An {{ MO }} is processed by completing all of the work orders listed under its {guilabel}`Work Orders` +tab. This can be done on the {{ MO }} itself, or from the work order tablet view. + +### Basic workflow + +To complete work orders from the {{ MO }} itself, begin by navigating to {menuselection}`Manufacturing +--> Operations --> Manufacturing Orders`, and then select an {{ MO }}. + +On the {{ MO }} page, select the {guilabel}`Work Orders` tab. Once work begins on the first work order +that needs to be completed, click the {guilabel}`Start` button for that operation. Odoo +*Manufacturing* then starts a timer that keeps track of how long the work order takes to complete. + +```{image} two_step_manufacturing/start-button.png +:align: center +:alt: The Start button for an work order on a manufacturing order. +``` + +When the work order is completed, click the {guilabel}`Done` button for that work order. Repeat the +same process for each work order listed on the {guilabel}`Work Orders` tab. + +```{image} two_step_manufacturing/done-button.png +:align: center +:alt: The Done button for a work order on a manufacturing order. +``` + +After completing all of the work orders, click {guilabel}`Produce All` at the top of the screen to +mark the {{ MO }} as {guilabel}`Done`, and register the manufactured product(s) into inventory. + +### Shop Floor workflow + +To complete the work orders for an {{ MO }} using the *Shop Floor* module, begin by navigating to +{menuselection}`Manufacturing --> Operations --> Manufacturing Orders`, and then select an {{ MO }}. + +On the {{ MO }}, click on the {guilabel}`Work Orders` tab, and then select the {guilabel}`↗️ (square +with arrow coming out of it)` button on the line of the first work order to be processed. Doing so +opens a {guilabel}`Work Orders` pop-up window, with details and processing options for the work +order. + +On the pop-up window, select the {guilabel}`Open Shop Floor` button at the top-left of the window to +open the *Shop Floor* module. + +```{image} two_step_manufacturing/shop-floor-button.png +:align: center +:alt: The Open Shop Floor button for a work order on a manufacturing order. +``` + +When accessed directly from a specific work order within an {{ MO }}, *Shop Floor* defaults to the page +for the work center where the work order is configured to be carried out. The page shows a card for +the work order that displays the {{ MO }} number, the product and number of units to be produced, and +the steps required to complete the work order. + +```{image} two_step_manufacturing/work-order-card.png +:align: center +:alt: A work order card on a work center page in the Shop Floor module. +``` + +A work order is processed by completing each step listed on its card. This can be done by clicking +on a step and following the instructions listed on the pop-up window that appears. Once the step is +completed, click {guilabel}`Next` to move on to the next step, if any are required. + +Alternatively, work order steps can be completed by clicking the checkbox that appears on the right +side of the step's line on the work order card. When using this method, the step is automatically +marked as completed, without a pop-up window appearing. + +The final step on a work order card is titled *Register Production*. This step is used to register +the number of product units that were produced. If the number produced is equal to the number that +the {{ MO }} was created for, click the {guilabel}`# Units` button on the right side of the line to +automatically register that number as the quantity produced. + +If a different number must be entered, click the {guilabel}`Register Production` step to open a +pop-up window. Enter the number of units produced in the {guilabel}`Units` field, and then click +{guilabel}`Validate` to register that number. + +:::{note} +The *Register Production* step appears on every work order card. It must be completed for the +first work order that is processed. After doing so, the step appears as already completed for +each remaining work order in the {{ MO }}. +::: + +After completing all of the steps for a work order, a button appears on the footer of the work order +card. If any other work orders must be completed before the {{ MO }} can be closed, the button is titled +{guilabel}`Mark as Done`. If there are no additional work orders to complete, the button is titled +{guilabel}`Close Production`. + +Clicking {guilabel}`Mark as Done` causes the work order card to fade away. Once it disappears +completely, the work order's status is marked as *Finished* on the {{ MO }}, and the next work order +appears in the *Shop Floor* module, on the page of the work center where it is configured to be +carried out. Any additional work orders can be processed using the instructions detailed in this +section. + +Clicking {guilabel}`Close Production` causes the work order card to fade away. Once it disappears, +the {{ MO }} is marked as *Done*, and the units of the product that were produced are entered into +inventory. + +After clicking {guilabel}`Mark as Done` or {guilabel}`Close Production`, each button is replaced by +an {guilabel}`Undo` button. Click the {guilabel}`Undo` button before the work order card fades away +to keep the work order open. + +:::{tip} +This section details the basic workflow for processing an {{ MO }} in the *Shop Floor* module. For a +more in-depth explanation of the module and all of its features, please see the {ref}`Shop Floor +overview ` documentation. +::: + diff --git a/content/applications/inventory_and_mrp/manufacturing/reporting.md b/content/applications/inventory_and_mrp/manufacturing/reporting.md new file mode 100644 index 000000000..bc1d6be00 --- /dev/null +++ b/content/applications/inventory_and_mrp/manufacturing/reporting.md @@ -0,0 +1,10 @@ +# Reporting + +```{toctree} +:titlesonly: true + +reporting/allocation +reporting/oee +reporting/production_analysis +``` + diff --git a/content/applications/inventory_and_mrp/manufacturing/reporting/allocation.md b/content/applications/inventory_and_mrp/manufacturing/reporting/allocation.md new file mode 100644 index 000000000..b8ce1f722 --- /dev/null +++ b/content/applications/inventory_and_mrp/manufacturing/reporting/allocation.md @@ -0,0 +1,143 @@ +--- +substitutions: + MO: '{abbr}`MO (manufacturing order)`' + MOs: '{abbr}`MOs (manufacturing orders)`' + RfQ: '{abbr}`RfQ (request for quotation)`' + SO: '{abbr}`SO (sales order)`' + SOs: '{abbr}`SOs (sales orders)`' +--- + +# Allocation reports + +When fulfilling sales orders (SOs), or sourcing components for manufacturing orders (MOs), it is +sometimes necessary to prioritize one {{ SO }} or {{ MO }} over another. In situations where there is +insufficient stock on-hand to fulfill every {{ SO }} or {{ MO }}, ensuring that products and components are +reserved for priority orders is essential. + +In Odoo *Manufacturing*, allocation reports are used on {{ MOs }} to assign products to specific sales +orders {{ SOs }}, or components to specific {{ MOs }}. This ensures the products or components are available +for those orders, and are not used by mistake. + +## Configuration + +To use allocation reports, the *Allocation Report for Manufacturing Orders* feature **must** be +enabled. To do so, navigate to {menuselection}`Manufacturing app --> Configuration --> Settings`, +and tick the checkbox next to {guilabel}`Allocation Report for Manufacturing Orders`. Then, click +{guilabel}`Save`. + +For products that are sold, it is also necessary to configure them so they can be included in {{ SOs }}. +To do so, begin by navigating to {menuselection}`Inventory --> Products --> Products`, and select a +product. Under the {guilabel}`Product Name` field on the product form, make sure that the +{guilabel}`Can Be Sold` checkbox is ticked. + +## Allocate products + +To allocate products or components from an {{ MO }} to an {{ SO }}, or to a different {{ MO }}, begin by +navigating to {menuselection}`Manufacturing app --> Operations --> Manufacturing Orders`. Click +{guilabel}`New` to create a new {{ MO }}. + +On the {{ MO }} form, select a product in the {guilabel}`Product` field, and specify the quantity to be +produced in the {guilabel}`Quantity` field. Finally, click {guilabel}`Confirm` to confirm the {{ MO }}. + +The rest of the allocation workflow depends on the current on-hand quantity of the product being +manufactured, and whether or not there are any {{ SOs }} or {{ MOs }} which require the product, but have +not already been allocated units. + +If there **are** existing {{ SOs }} and {{ MOs }} that require the product, **and** there are too few units +of the product on-hand to fulfill those orders, then an {icon}`fa-list` {guilabel}`Allocation` smart +button appears at the top of the page as soon as the {{ MO }} is confirmed. + +If there **are** existing {{ SOs }} and {{ MOs }} that require the product, **and** there are enough units +of the product on-hand to fulfill those orders, then the {icon}`fa-list` {guilabel}`Allocation` +smart button only appears at the top of the page once the {{ MO }} has been marked as done, by clicking +{guilabel}`Produce All`. + +```{image} allocation/allocation-button.png +:align: center +:alt: The Allocation smart button at the top of an MO. +``` + +:::{note} +If there **are not** any existing {{ SOs }} and {{ MOs }} that require the product, the {icon}`fa-list` +{guilabel}`Allocation` smart button does not appear, even when the {{ MO }} has been marked as done. +::: + +Click the {icon}`fa-list` {guilabel}`Allocation` smart button to open the {guilabel}`MRP Reception +Report` for the {{ MO }}. This report lists open delivery orders or {{ MOs }}, depending on the type of +product produced in the original {{ MO }}. + +### Allocate to delivery order + +If the {{ MO }} contains a finished product, the report lists any open delivery orders for which +quantities of the product have yet to be reserved. + +```{eval-rst} +.. example:: + An |MO| is created to produce three units of a *rocking chair*. Clicking the + :guilabel:`Allocation` smart button on the |MO| opens an allocation report that lists open + delivery orders that require one or more rocking chairs. +``` + +Click the {guilabel}`Assign All` button to the right of a specific order to assign products for each +quantity required to fulfill that order. + +```{eval-rst} +.. example:: + If an order requires one quantity of four units of the product, and one quantity of one unit of + the product, clicking :guilabel:`Assign All` assigns five units of the product to fulfill both + quantities. +``` + +Alternatively, click {guilabel}`Assign` next to a specific quantity to only assign products to that +quantity, and not any others in the order. + +```{eval-rst} +.. example:: + If an order requires one quantity of four units of the product, and one quantity of one unit of + the product, clicking :guilabel:`Assign` next to the quantity of one unit assigns a product to + that quantity, but leaves the quantity of four units without any products assigned. +``` + +```{image} allocation/product-reception-report.png +:align: center +:alt: The MRP Reception Report for an MO containing finished products. +``` + +### Allocate to MO + +If the {{ MO }} contains a component, the report lists any open {{ MOs }} for which quantities of the +component have yet to be reserved. + +```{eval-rst} +.. example:: + An |MO| is created to produce three units of *wood*, which is used as a component for the + *rocking chair* product. Clicking the :guilabel:`Allocation` smart button on the |MO| opens an + allocation report that lists open rocking chair |MOs| that require one or more pieces of wood. +``` + +Click the {guilabel}`Assign All` or {guilabel}`Assign` button to the right of a specific {{ MO }} to +assign components to that {{ MO }}. + +```{image} allocation/component-reception-report.png +:align: center +:alt: The MRP Reception Report for an MO containing components. +``` + +### Unassign products + +After assigning products to a quantity within a delivery order, or components to an {{ MO }}, +the {guilabel}`Assign` button turns into an {guilabel}`Unassign` button. Click {guilabel}`Unassign` +to unreserve the assigned products from that quantity, making them available for other quantities. + +### Print labels + +After clicking {guilabel}`Assign All` or {guilabel}`Assign`, the {guilabel}`Print Labels` or +{guilabel}`Print Label` button to the right of either button becomes selectable. Selecting either +button generates and downloads a PDF document with one label for each product that was assigned. +These labels are used to designate each product as being reserved for that specific order. + +```{image} allocation/assigned-labels.png +:align: center +:alt: The assignment labels generated by clicking Print Labels or Print Label. +``` + diff --git a/content/applications/inventory_and_mrp/manufacturing/reporting/oee.md b/content/applications/inventory_and_mrp/manufacturing/reporting/oee.md new file mode 100644 index 000000000..e5435cf6c --- /dev/null +++ b/content/applications/inventory_and_mrp/manufacturing/reporting/oee.md @@ -0,0 +1,175 @@ +--- +substitutions: + BoM: '{abbr}`BoM (Bill of Materials)`' + MO: '{abbr}`MO (manufacturing order)`' + OEE: '{abbr}`OEE (overall equipment effectiveness)`' +--- + +# Overall equipment effectiveness + +In Odoo's *Manufacturing* app, *overall equipment effectiveness* (OEE) represents the amount of time +a work center is fully productive. {{ OEE }} is displayed as a percentage of the total time a work +center is active. + +Fully productive time is considered to be time when the work center is operational **and** +processing work orders that have not exceeded their *expected duration*. + +{{ OEE }} helps manufacturing teams understand the efficiency of work centers, and the causes of +manufacturing downtime. + +:::{important} +Since {{ OEE }} tracks work center productivity, using it requires enabling the work centers feature +in the settings of the Manufacturing app. + +To do so, navigate to {menuselection}`Manufacturing app --> Configuration --> Settings`, and tick +the checkbox next to {guilabel}`Work Orders`, under the {guilabel}`Operations` heading. Then, +click {guilabel}`Save`. +::: + +## Efficiency standards + +For {{ OEE }} to accurately reflect the percentage of fully productive time for a work center, the work +center **must** be properly configured with the correct productivity metrics. These include the work +center's *time efficiency*, *capacity*, and *OEE target*. + +### Time efficiency + +Time efficiency represents the efficiency of a work center when processing work orders, and is +represented as a percentage. A time efficiency value of 100% signifies that the work center +processes work orders at the speed of the expected duration, as listed on a product's {{ BoM }}. A value +less than or greater than 100% signifies that the work center processes work orders slower or faster +than an operation's expected duration, respectively. + +To set the time efficiency for a work center, navigate to {menuselection}`Manufacturing app --> +Configuration --> Work Centers`, and select a work center. On the {guilabel}`General Information` +tab, enter a numerical value in the {guilabel}`Time Efficiency` field. + +```{eval-rst} +.. example:: + Manufacturing a *chair* product requires two operations: *cut* and *assemble*. The product's + |BoM| lists an expected duration of 30 minutes for each operation. + + The cut operation is carried out at the *cut station* work center, which has a time efficiency + value of 50%. This means it takes twice as long to complete the operation, for a total time of + one hour. + + The assemble operation is carried out at the *assembly line* work center, which has a time + efficiency value of 200%. This means it takes half as long to complete the operation, for a total + time of 15 minutes. +``` + +### Capacity + +Capacity represents how many units of a product can be produced in parallel at a work center. The +duration of work orders for multiple units increases or decreases, based on how many units the work +center can handle. + +To set the capacity for a work center, navigate to {menuselection}`Manufacturing app --> +Configuration --> Work Centers`, and select a work center. On the {guilabel}`General Information` +tab, enter a numerical value in the {guilabel}`Capacity` field. + +```{eval-rst} +.. example:: + A *drill station* work center has a capacity of one unit. An |MO| is confirmed for 10 units of a + *chair*, a product manufactured using the drill station. + + Since there are ten times as many units to produce than the work center can handle at once, the + operation time is ten times the duration listed on the product's |BoM|. +``` + +### {{ OEE }} target + +The {{ OEE }} target is the goal for how much of a work center's operating time should be fully +productive time. It is displayed as a percentage, and should only be set as high as `100%`. + +To set the {{ OEE }} target for a work center, navigate to {menuselection}`Manufacturing app --> +Configuration --> Settings --> Work Centers`, and select a work center. On the {guilabel}`General +Information` tab, enter a numerical value of `100.00` or less in the {guilabel}`OEE Target` field. + +## Calculating {{ OEE }} + +{{ OEE }} is represented as a percentage value between zero and 100. The value signifies the amount of +time that a work center was fully productive. The remainder signifies the amount of time that the +work center was operating at less than full efficiency. This can occur for a number of reasons, +including *reduced speed*, *material availability*, and *equipment failure*. + +### Fully productive time + +For a work center to be considered fully productive, it must be able to receive work orders, have +the components necessary to process work orders, and be operating within the expected duration of +the work order it is processing. + +```{eval-rst} +.. example:: + An *assembly line* work center is not blocked, and receives a work order to assemble a *bicycle*. + The required components are available, so production begins as soon as they are picked and + delivered to the work center. The work order has an expected duration of 30 minutes, and is + completed in 27 minutes. All of this time is considered fully productive time. +``` + +### Reduced speed + +When a work center is operating at reduced speed, it means that it is processing a work order that +has exceeded its expected duration. While the work center may be operational, this is not considered +fully productive time. + +```{eval-rst} +.. example:: + A *cutting station* work center receives a work order to cut boards for a *table*. The expected + duration of the work order is 15 minutes. The work order ends up taking 18 minutes to complete. + The work center is considered to have been operating at reduced speed during the three minutes + that exceeded the expected duration. +``` + +### Material availability + +Material availability refers to situations where a work center is able to accept a work order, but +the required components are not available. This can occur because the components are not in stock, +or are reserved for a different order. + +```{eval-rst} +.. example:: + Manufacturing of a *bench* requires 20 units of *wood*. A manufacturing order (MO) is confirmed + for 10 units of the bench, but there is not enough wood in stock to begin manufacturing. The time + it takes to acquire the wood is recorded as material availability downtime. +``` + +### Equipment failure + +Equipment failure signifies any period of time when a work center is unusable due to maintenance +issues with its equipment. This can be due to equipment breaking down, or when a work center is shut +down for scheduled maintenance. In these cases, a work center can be blocked using a +{doc}`maintenance request <../../maintenance/maintenance_requests>`. + +```{eval-rst} +.. example:: + The drill at a *drill station* work center breaks down, causing the work center to be unusable. A + maintenance request is created to fix the drill, and the work center is blocked from receiving + work orders. It takes two hours to fix the drill, and make the work center available again. This + two-hour period is recorded as equipment failure downtime. +``` + +## {{ OEE }} reporting + +To view {{ OEE }} reporting metrics for every work center, navigate to {menuselection}`Manufacturing app +--> Reporting --> Overall Equipment Effectiveness`. This page shows the metrics for each work center +with {{ OEE }} data. + +Alternatively, to see {{ OEE }} reporting metrics for a single work center, navigate to +{menuselection}`Manufacturing app --> Configuration --> Work Centers`, and select a work center. At +the top of the work center's form, click the {icon}`fa-pie-chart` {guilabel}`OEE` smart button. + +By default, the main {{ OEE }} reporting page shows data in a bar chart, while the page for a specific +work center shows it in a pie chart. To select a different chart type on either page, click the +{icon}`fa-bar-chart` {guilabel}`(bar chart)`, {icon}`fa-line-chart` {guilabel}`(line chart)`, or +{icon}`fa-pie-chart` {guilabel}`(pie chart)` button above the displayed chart. + +It is also possible to see {{ OEE }} data in a pivot view, or a list displaying each time entry, by +clicking the {icon}`oi-view-pivot` {guilabel}`(pivot view)` or {icon}`oi-view-list` {guilabel}`(list +view)` buttons at the top-right corner of the page. + +```{image} oee/oee-report.png +:align: center +:alt: The dashboard of the OEE report. +``` + diff --git a/content/applications/inventory_and_mrp/manufacturing/reporting/production_analysis.md b/content/applications/inventory_and_mrp/manufacturing/reporting/production_analysis.md new file mode 100644 index 000000000..1f86e5888 --- /dev/null +++ b/content/applications/inventory_and_mrp/manufacturing/reporting/production_analysis.md @@ -0,0 +1,168 @@ +--- +substitutions: + MO: '{abbr}`MO (manufacturing order)`' + MOs: '{abbr}`MOs (manufacturing orders)`' +--- + +# Production analysis + +The *Production Analysis* report provides statistics about products manufactured using Odoo's +*Manufacturing* app. The report is useful when trying to understand production costs, manufacturing +durations, and other important statistics about manufactured products. + +To open the Production Analysis report, navigate to {menuselection}`Manufacturing app --> Reporting +--> Production Analysis`. + +:::{important} +The {guilabel}`Production Analysis` report is one of many reports available across the Odoo app +suite. This documentation only covers the measures specific to the {guilabel}`Production +Analysis` report, along with a few use case examples. + +For a full overview of the basic features available in most Odoo reports, see the documentation +on {doc}`reporting essentials <../../../essentials/reporting>`. +::: + +## Measures + +*Measures* are the datasets that can be selected in the {guilabel}`Production Analysis` report. Each +dataset represents a specific statistic about {{ MOs }} in the database. Choose a measure by clicking +the {guilabel}`Measures` {icon}`fa-caret-down` button, and selecting one of the options from the +drop-down menu: + +The options displayed in the {guilabel}`Measures` {icon}`fa-caret-down` drop-down menu, and the +order they appear in, differ depending on the filters, groupings, and comparisons enabled in the +{guilabel}`Search...` bar. By default, the available measures appear as follows: + +- {guilabel}`Average Employee Cost/Unit`: the average cost paid to employees to produce one unit of + the product. +- {guilabel}`By-Products Total Cost`: the total value of all by-products created by manufacturing + the product. +- {guilabel}`Component Cost/Unit`: the average cost of the components required to produce one unit + of the product. +- {guilabel}`Cost/Unit`: the average cost of producing one unit of the product, including component, + employee, operation, and subcontracting costs. +- {guilabel}`Duration of Operations/Unit`: the average total duration of operations required to + produce one unit of the product. +- {guilabel}`Quantity Demanded`: the total number of units of the product included in {{ MOs }}. +- {guilabel}`Quantity Produced`: the total number of units of the product that have actually been + produced. +- {guilabel}`Total Component Cost`: the total amount spent on the product's components, across every + {{ MO }} for the product. +- {guilabel}`Total Cost`: the total amount spent manufacturing every unit of the product produced so + far. +- {guilabel}`Total Duration of Operations`: the cumulative duration of every operation completed + while manufacturing the product. +- {guilabel}`Total Employee Cost`: the cumulative amount paid to employees to manufacture the + product. +- {guilabel}`Total Operation Cost`: the cumulative amount spent on operations required to produce + the product. +- {guilabel}`Total Operation Cost/Unit`: the average cost of the operations required to produce one + unit of the product. +- {guilabel}`Total Subcontracting Cost`: the cumulative amount paid to subcontractors to produce the + product. +- {guilabel}`Total Subcontracting Cost/Unit`: the average cost of engaging a subcontractor to + produce one unit of the product. +- {guilabel}`Yield Percentage (%)`: the total quantity of the product produced versus the total + quantity demanded, represented as a percentage. +- {guilabel}`Count`: the total count of {{ MOs }} created for the product. + +:::{tip} +Only one measure can be selected at a time when one of the {icon}`fa-area-chart` +{guilabel}`(graph view)` options is enabled. However, multiple measures, and varying group-by +criteria (on the x and y axes), can be selected when using the {icon}`oi-view-pivot` +{guilabel}`(pivot table)`. +::: + +## Use case: compare products + +One of the best uses for the {guilabel}`Production Analysis` report is comparing statistics about +two or more products. This is accomplished by entering the products into the {guilabel}`Search...` +bar, then selecting the necessary measure, filter, and grouping, to see the desired data. + +```{eval-rst} +.. example:: + Toy manufacturer *Tommy's Toys* is trying to reduce their manufacturing operation costs. To + accomplish this, they have decided to identify redundant products and cease manufacturing the + ones with higher operational costs. + + Two of the toys that have been singled out for analysis are the *pogo stick* and *moon shoes*. + Tommy's Toys believes these two toys are so similar that they can stop manufacturing one, without + significantly impacting their product offering. + + To compare operation costs for the toys, business analyst Mike opens the + :menuselection:`Manufacturing` app, and navigates to the :guilabel:`Production Analysis` page. In + the :guilabel:`Search...` bar, he enters the names of both products. Then, he opens the + :guilabel:`Search...` bar drop-down menu, and clicks :guilabel:`Product` in the :guilabel:`Group + By` section. + + Below the :guilabel:`Search...` bar, Mike clicks on the :guilabel:`Measures` + :icon:`fa-caret-down` drop-down menu, and selects the :guilabel:`Total Operation Cost/Unit` + option. Finally, he selects the :icon:`fa-bar-chart` :guilabel:`(bar chart)` graph type. + + With these options selected, the :guilabel:`Production Analysis` report shows a bar chart for the + current year, with one bar for each product, signifying the average operation cost for one unit + of the product. + + With this data, Mike is able to see that the average operation cost for the moon shoes is almost + twice the cost of the pogo stick. Using this insight, Tommy's Toys decides to cease production of + moon shoes, thus lowering their average cost of manufacturing operations. + + .. image:: production_analysis/use-case.png + :align: center + :alt: The bar chart comparing the operation costs of the pogo stick and moon shoes. +``` + +## Use case: compare time periods + +The {guilabel}`Production Analysis` report can also be used to compare data for two different time +periods. This is accomplished using the options in the {guilabel}`Comparison` section of the +{guilabel}`Search...` bar. + +```{eval-rst} +.. example:: + Furniture company *Fanny's Furnishings* wants to compare their production costs for the first and + second quarters of 2024, to see which products they spent the most money producing in each + quarter. + + To compare the two time periods, shop floor supervisor Adam opens the + :menuselection:`Manufacturing` app, and navigates to the :guilabel:`Production Analysis` page. He + begins by selecting the :icon:`fa-pie-chart` :guilabel:`(pie chart)` graph type option at the top + of the page. + + .. important:: + The :guilabel:`Comparison` feature is meant to be used with the :icon:`fa-pie-chart` + :guilabel:`(pie chart)` graph type, or the :icon:`oi-view-pivot` :guilabel:`(pivot)` view. + + A :guilabel:`Comparison` option can still be selected with the other view types enabled, but + doing so does not change the way data is displayed on the report. + + Next, Adam selects the :guilabel:`Total Cost` option from the :guilabel:`Measures` + :icon:`fa-caret-down` drop-down menu. This option displays the total amount spent producing each + product. + + In the :guilabel:`Search...` bar drop-down menu, he leaves the :guilabel:`2024` filter enabled in + the :guilabel:`End Date` section, and enables the :guilabel:`Q2` filter as well. With both of + these time periods selected, the pie chart shows data for the second quarter of 2024. + + Finally, Adam selects the :guilabel:`End Date: Previous Period` option in the + :guilabel:`Comparison` section of the :guilabel:`Search...` bar. Doing so causes the pie chart to + be split into an inner circle, and an outer ring. + + The outer ring shows data for the selected time period, quarter two of 2024. The inner circle + shows data for the previous time period, quarter one of 2024. + + .. note:: + If :guilabel:`End Date: Previous Year` is selected instead of :guilabel:`End Date: Previous + Period`, the inner circle shows data for the selected time period, one *year* previous. + + In the case of this example, it would show data for quarter two of 2023. + + Using this report, Adam can see that the products with the highest total cost for quarter two are + the *bicycle* and *tricycle*. On the other hand, in quarter one, the *roller skates* had the + highest total cost. + + .. image:: production_analysis/comparison.png + :align: center + :alt: The pie chart view of the Production Analysis report, with a comparison filter enabled. +``` + diff --git a/content/applications/inventory_and_mrp/manufacturing/shop_floor.md b/content/applications/inventory_and_mrp/manufacturing/shop_floor.md new file mode 100644 index 000000000..633b5d1a3 --- /dev/null +++ b/content/applications/inventory_and_mrp/manufacturing/shop_floor.md @@ -0,0 +1,13 @@ +--- +nosearch: true +--- + +# Shop Floor + +```{toctree} +:titlesonly: true + +shop_floor/shop_floor_overview +shop_floor/shop_floor_tracking +``` + diff --git a/content/applications/inventory_and_mrp/manufacturing/shop_floor/shop_floor_overview.md b/content/applications/inventory_and_mrp/manufacturing/shop_floor/shop_floor_overview.md new file mode 100644 index 000000000..345e53f74 --- /dev/null +++ b/content/applications/inventory_and_mrp/manufacturing/shop_floor/shop_floor_overview.md @@ -0,0 +1,263 @@ +--- +substitutions: + MO: '{abbr}`MO (Manufacturing Order)`' + MOs: '{abbr}`MOs (Manufacturing Orders)`' +--- + +# Shop Floor overview + +(manufacturing/shop_floor/shop_floor_overview)= + +The *Shop Floor* module is a companion module to the *Manufacturing* app. *Shop Floor* provides a +visual interface for processing manufacturing orders (MOs) and work orders. It also allows +manufacturing employees to track the amount of time spent working on manufacturing and work orders. + +The *Shop Floor* module is installed alongside the *Manufacturing* app. It cannot be installed by +itself. To install the *Manufacturing* app, navigate to {menuselection}`Apps`, search for +`manufacturing` in the {guilabel}`Search...` bar, and then click {guilabel}`Install` on the +{guilabel}`Manufacturing` app card. + +:::{important} +The *Shop Floor* module replaces the tablet view functionality of the *Manufacturing* app, and is +only available in Odoo versions 16.4 and later. + +To check the version number of an Odoo database, navigate to {menuselection}`Settings` and scroll +down to the {guilabel}`About` section at the bottom of the page. The version number is displayed +there. + +To switch to a newer version of Odoo, see the documentation on {doc}`upgrading a database +<../../../../administration/upgrade>`. +::: + +## Navigation + +*Shop Floor* is broken down into three main views, which can be selected from the navigation bar at +the top of the module: + +- The {guilabel}`All` page serves as the main dashboard for the module, and displays information + cards for {{ MOs }}. +- Each work center also has a dedicated page, which shows information cards for work orders assigned + to that work center. Work center pages can be toggled on or off by clicking the {guilabel}`+ + (plus)` button in the navigation bar, selecting or deselecting them on the pop-up window that + appears, and then clicking {guilabel}`Confirm`. +- The {guilabel}`My` page shows information cards for all work orders assigned to the employee whose + profile is currently active in the operator panel on the left side of the module. Other than only + showing work orders assigned to the active employee, this page functions the same as the pages for + each work center. + +:::{tip} +To isolate an {{ MO }} or work order, so that no other orders appear, simply search the reference +number of the {{ MO }} in the {guilabel}`Search...` bar at the top of the module. This search filter +remains active while switching between the different module views. +::: + +On the left side of the module is the operator panel, which shows all of the employees currently +signed in to *Shop Floor*, and allows new employees to sign in. The operator panel is always +available in the module, regardless of which view is selected. It can be toggled on or off by +clicking the {guilabel}`sidebar` button at the extreme left of the navigation bar. + +```{image} shop_floor_overview/sidebar-button.png +:align: center +:alt: The "sidebar" button, which is used to toggle the operator panel on or off. +``` + +### All page + +By default, the {guilabel}`All` page shows an information card for every {{ MO }} that is *ready to +start*. An {{ MO }} is considered ready to start once it has been confirmed, and all required components +are available. + +To view every confirmed {{ MO }} regardless of readiness, click the {guilabel}`x` button on the +{guilabel}`Ready to Start` filter to remove it from the {guilabel}`Search...` bar. + +#### MO information card + +An {{ MO }} information card on the {guilabel}`All` page shows all of the relevant details of the +associated {{ MO }}, and also provides employees with options for processing the {{ MO }}. + +The header for an {{ MO }} card shows the {{ MO }} number, the product and number of units being produced, +and the status of the {{ MO }}. If work has not yet begun on the {{ MO }}, the status appears as +{guilabel}`Confirmed`. Once work has begun, the status updates to {guilabel}`In Progress`. If all +work orders for an {{ MO }} have been completed and the {{ MO }} is ready to close, the status updates to +{guilabel}`To Close`. + +The main body of an {{ MO }} card shows a line for each completed work order, if any, followed by the +current work order that needs to be completed. Completed work orders are indicated by a green check +mark to the right of title of the work order. The current work order is indicated by a button that +opens the page for the work center to which the order is assigned. + +Below the current work order is a line titled {guilabel}`Register Production`, which is used to +record the number of product units produced. To manually enter the number of units produced, click +on the {guilabel}`Register Production` line, enter a value in the {guilabel}`Units` field of the +resulting pop-up window, then click {guilabel}`Validate`. + +Alternatively, click the {guilabel}`# Units` button on the right side of the line, which +automatically records the number of units the {{ MO }} was created for as the number of units produced. +For example, if an {{ MO }} is created for 10 units of a dining table, clicking the {guilabel}`10 units` +button records that 10 units were produced. + +The footer of the {{ MO }} card displays a {guilabel}`Close Production` button. This is used to close +the {{ MO }} once production is completed. However, if there are any quality checks required for the +{{ MO }} as a whole (not the work orders within it), a {guilabel}`Quality Checks` button appears +instead. Clicking {guilabel}`Quality Checks` opens a pop-up window, from which any required quality +checks can be completed. + +After clicking {guilabel}`Close Production`, the {{ MO }} card begins to fade away, and an +{guilabel}`Undo` button appears on the footer. Clicking {guilabel}`Undo` causes the {{ MO }} to remain +open. Once the {{ MO }} card disappears completely, the work order is closed. + +On the right side of the footer is an {guilabel}`⋮ (options)` button, which opens a pop-up window +with additional options for the {{ MO }}: + +- {guilabel}`Scrap` is used to send components to a scrap location when they are found to be + defective. +- {guilabel}`Add Work Order` is used to add an additional work order to the {{ MO }}. +- {guilabel}`Add Component` is used to add an additional component to the {{ MO }}. +- {guilabel}`Open Backend MO` opens the {{ MO }} in the Manufacturing app. + +```{image} shop_floor_overview/mo-card.png +:align: center +:alt: An information card for an MO on the "All" page of the Shop Floor module. +``` + +### Work center pages + +By default, the page for each work center shows an information card for every work order assigned to +it that is *ready to start*. A work order is considered ready to start once the {{ MO }} it is a part of +is ready to start, and any preceding work orders have been completed. + +To view every confirmed work order assigned to a work center regardless of readiness, click the +{guilabel}`x` button on the {guilabel}`Ready to Start` filter to remove it from the +{guilabel}`Search...` bar. + +#### Work order information card + +A work order information card on a work center's page shows all of the relevant details of the +associated work order, and also provides employees with options for processing the work order. + +The header for a work order card shows the reference number of the {{ MO }} that the work order is a +part of, the product and number of units being produced, and the status of the work order. If work +has not yet begun on the work order, the status appears as {guilabel}`To Do`. Once work has begun, +the status updates to display a timer showing the total time the work order has been worked on. + +The main body of a work order card shows a line for each step required to complete the work order. +Work order steps can be completed by clicking on the line, then following the instructions on the +pop-up window that appears. Alternatively, clicking the checkbox on the right side of each line +automatically marks the step as completed. + +Below the final step of the work order is a line titled {guilabel}`Register Production`, which +functions the same as the {guilabel}`Register Production` line on an {{ MO }} card. Registering the +number of units produced using the {guilabel}`Register Production` line on a work order card also +completes the step for the associated {{ MO }} card. + +If the work order being processed is the final work order for the {{ MO }}, a {guilabel}`Close +Production` button appears on the footer of the work order card. Clicking {guilabel}`Close +Production` closes both the work order and the {{ MO }}, unless a quality check is required for the +{{ MO }}. In this case, the quality check must be completed from the {{ MO }} card before the {{ MO }} can be +closed. + +Alternatively, if the {{ MO }} requires the completion of additional work orders, a {guilabel}`Mark as +Done` button appears instead. Clicking {guilabel}`Mark as Done` marks the current work order as +completed, and causes the next work order to appear on the page for the work center it is assigned +to. + +After clicking {guilabel}`Close Production` or {guilabel}`Mark as Done`, the work order card begins +to fade away, and an {guilabel}`Undo` button appears on the footer. Clicking {guilabel}`Undo` causes +the work order to remain open. Once the work order card disappears completely, the work order is +marked as {guilabel}`Finished` on the {{ MO }}. + +On the right side of the footer is an {guilabel}`⋮ (options)` button, which opens a pop-up window +with additional options for the work order: + +- {guilabel}`Scrap` is used to send components to a scrap location when they are found to be + defective. +- {guilabel}`Add Component` is used to add an additional component to the {{ MO }}. +- {guilabel}`Move to work center` is used to transfer the work order to a different work center. +- {guilabel}`Suggest a Worksheet improvement` allows the user to propose a change to the work + order's instructions or steps. +- {guilabel}`Create a Quality Alert` opens a quality alert form that can be filled out to alert a + quality team about a potential issue. + +```{image} shop_floor_overview/wo-card.png +:align: center +:alt: An information card for a work order in the Shop Floor module. +``` + +### Operator panel + +The operator panel is used to manage the employees that are signed in to the *Shop Floor* module. +The panel shows the name and profile picture of every employee that is currently signed in across +all instances of the database. + +To interact with *Shop Floor* as a specific employee, click the employee's name to activate their +profile. Profiles that are not active appear with their names and profile pictures greyed-out. + +When an employee is selected in the operator panel, they can begin working on a work order by +clicking the work order's heading. If an employee is working on one or more work orders, the work +order title(s) appear under their name, along with a timer showing how long they've been working on +each order. + +To add a new employee to the operator panel, click the {guilabel}`+ Add Operator` button at the +bottom of the panel. Then, select an employee from the {guilabel}`Select Employee` pop-up window. + +To remove an employee from the operator panel, simply click the {guilabel}`x` button next to their +name in the panel. + +```{image} shop_floor_overview/operator-panel.png +:align: center +:alt: The operator panel of the Shop Floor module, showing three employees signed in. +``` + +## MO/WO prioritization + +The **Shop Floor** module uses the *scheduled date* entered on {{ MOs }} to prioritize the {{ MOs }} and +work orders that appear on the module's dashboard and work center pages. {{ MOs }} and work orders +scheduled sooner are more highly prioritized, and appear before orders which are scheduled further +out. + +To specify the scheduled date on an {{ MO }}, begin by navigating to {menuselection}`Manufacturing app +--> Operations --> Manufacturing Orders`, and click {guilabel}`New` to create a new {{ MO }}. + +Click on the {guilabel}`Scheduled Date` field to open a calendar popover window. By default, the +{guilabel}`Scheduled Date` field, and its corresponding pop-up window, show the current date and +time. + +Use the calendar to select the date on which processing should begin for the {{ MO }}. In the two fields +at the bottom of the popover window, enter the hour and minute at which processing should begin, +using the 24-hour clock format. + +Finally, click {guilabel}`Apply` at the bottom of the popover window to set the date and time for +the {guilabel}`Scheduled Date` field. Then, click the {guilabel}`Confirm` button at the top of the +{{ MO }} to confirm it. + +Once the {{ MO }} is confirmed, it appears in the **Shop Floor** module, as long is it has the +{guilabel}`Ready` status, which means all components are available. + +On the Odoo dashboard, click on the {menuselection}`Shop Floor` module to open it. The +{guilabel}`All MO #` page of the dashboard displays *Ready* {{ MOs }}, organized in order of their +scheduled dates. + +At the top of the module, select a work center to see the work orders assigned to it. The page for +each work center organizes work orders, based on the scheduled dates of their corresponding {{ MOs }}. + +```{eval-rst} +.. example:: + Three |MOs| are confirmed for a *Bookcase* product: + + - WH/MO/00411 has a :guilabel:`Scheduled Date` of August 16th. + - WH/MO/00412 has a :guilabel:`Scheduled Date` of August 20th. + - WH/MO/00413 has a :guilabel:`Scheduled Date` of August 18th. + + On the :guilabel:`All MO #` page of the **Shop Floor** module, the cards for each |MO| appear in + this order: WH/MO/00411, WH/MO/00413, WH/MO/00412. + + .. image:: shop_floor_overview/mo-order.png + :align: center + :alt: MOs in the Shop Floor module, ordered by their scheduled date. + + Each |MO| requires one work order, carried out at :guilabel:`Assembly Station 1`. Clicking on the + :guilabel:`Assembly Station 1` button at the top of the screen opens the page for the work + center, which displays one card for each work order, appearing in the same order as their + corresponding |MOs|. +``` + diff --git a/content/applications/inventory_and_mrp/manufacturing/shop_floor/shop_floor_tracking.md b/content/applications/inventory_and_mrp/manufacturing/shop_floor/shop_floor_tracking.md new file mode 100644 index 000000000..d4137e214 --- /dev/null +++ b/content/applications/inventory_and_mrp/manufacturing/shop_floor/shop_floor_tracking.md @@ -0,0 +1,124 @@ +--- +substitutions: + MO: '{abbr}`MO (Manufacturing Order)`' + MOs: '{abbr}`MOs (Manufacturing Orders)`' +--- + +# Shop Floor time tracking + +By signing in to the Odoo *Shop Floor* module as *operators*, employees are able to track the amount +of time they spend working on each work order. + +Odoo tracks the time it takes to complete each work order, as well as the time each operator spends +on each work order. + +## Operator sign in + +To sign in to the *Shop Floor* module as an operator, sign in to the Odoo database, and open the +{menuselection}`Shop Floor` module. The employee profile that is signed in to the database is +automatically signed in as an operator. + +All active operators are listed in the operator panel on the left side of the module. The panel can +be opened or collapsed by clicking the {guilabel}`show/hide panel (white square with black column on +left side)` button, located in the top-left corner of the module. + +```{image} shop_floor_tracking/operator-panel.png +:align: center +:alt: The operator panel in the Shop Floor module, with the show/hide panel button +: above it. +``` + +To sign in to *Shop Floor* as a different employee, click the {guilabel}`+ Add Operator` button at +the bottom of the panel. Doing so opens the {guilabel}`Select Employee` pop-up window, which lists +every employee that is able to sign in to the module. + +Click on a specific employee to sign in using their profile. If no PIN code is required to sign in +as that employee, the profile will be signed in automatically. + +If a PIN code is required, a {guilabel}`Password?` pop-up window appears, showing a number pad, from +which the code can be entered. Enter the code using the number pad, and click {guilabel}`Confirm` to +sign in to the *Shop Floor* module. + +```{image} shop_floor_tracking/pin-code.png +:align: center +:alt: The "Password?" pop-up window, which is used to enter an operator PIN code. +``` + +:::{note} +A PIN code can be set for each employee, which must be entered each time they sign in to the +*Shop Floor* module, check in or out in the *Kiosk Mode* of the *Attendances* application, or +sign in as a cashier in the *Point of Sale* application. + +To set an employee PIN, navigate to the {menuselection}`Employees` app, and select a specific +employee. At the bottom of the employee's form, click on the {guilabel}`HR Settings` tab, and +enter a numerical code in the {guilabel}`PIN Code` field. +::: + +Once an employee is signed in to the module, their name appears in the operator panel, along with +every other employee that has signed in. While the panel can list multiple employees, only one +employee can be active at any given time, on a single instance of the *Shop Floor* module. + +Click on an employee's name to make their profile active. The active employee appears highlighted +in blue, while employees that are signed in, but not active, have their names faded out. + +To sign out a specific employee from the module, click the {guilabel}`X (remove)` button next to +their name, in the operator panel. + +## Track work order duration + +To track time spent working on a work order, begin by selecting the employee working on it from the +operator panel. + +Next, navigate to the page for the work center where the work order is scheduled to be carried out. +This can be done by selecting the work center from the top navigation in the *Shop Floor* module, or +by clicking the name of the work center on the card for the manufacturing order (MO) that the work +order is a part of. + +On the page for the work center, find the card for the work order. Once work begins, click the +header of the work order card to start timing the duration it takes to complete. This duration is +displayed by a timer on the header of the work order card, which tracks the collective time spent +working on the work order, by all employees. + +```{image} shop_floor_tracking/work-order-timer.png +:align: center +:alt: A work order card with an active timer. +``` + +In addition, the reference number of the work order appears in the operator panel, under the name of +the employee working on it, along with a second timer, which tracks the amount of time the employee +has spent on the work order individually. This timer only reflects work done during the current +session, even if the employee has previously worked on the work order. + +Employees are able to work on multiple work orders simultaneously, and track their time for each. +The reference number for each work order being worked on appears below the employee's name, along +with a timer. + +```{image} shop_floor_tracking/employee-timer.png +:align: center +:alt: An employee card in the operator panel, showing two work order timers. +``` + +To pause the timer on the work order card, and remove the work order from below the employee's name +on the operator panel, click the header a second time. + +Once the work order is completed, click the {guilabel}`Mark as Done` button at the bottom of the +work order card, which causes the card to fade away. If the timer is still active, it stops once the +card disappears completely. + +## View work order duration + +To view the duration of a work order, navigate to {menuselection}`Manufacturing app --> Operations +--> Manufacturing Orders`, and select an {{ MO }}. + +To view and select {{ MOs }} that have been completed and marked as *Done*, remove the {guilabel}`To Do` +filter from the {guilabel}`Search...` bar, by clicking on the {guilabel}`X (close)` button on the +right side of the filter. + +On the page for the {{ MO }}, click on the {guilabel}`Work Orders` tab to see a list of all work orders +included in the {{ MO }}. The time it took to complete each work order is displayed in the +{guilabel}`Real Duration` column of the tab. + +The *Real Duration* represents the total time spent working on the work order by all workers who +worked on it. It includes time tracked in the *Shop Floor* module, as well as time tracked on the +{guilabel}`Work Orders` tab of the {{ MO }} itself. + diff --git a/content/applications/inventory_and_mrp/manufacturing/subcontracting.md b/content/applications/inventory_and_mrp/manufacturing/subcontracting.md new file mode 100644 index 000000000..1a5604bf5 --- /dev/null +++ b/content/applications/inventory_and_mrp/manufacturing/subcontracting.md @@ -0,0 +1,138 @@ +--- +show-content: true +substitutions: + BoM: '{abbr}`BoM (Bill of Materials)`' +--- + +# Subcontracting + +In manufacturing, *subcontracting* is the process of a company engaging a third-party manufacturer, +or subcontractor, to manufacture products that are then sold by the contracting company. + +Subcontracting provides a variety of benefits for both the contracting company and the +subcontractor. + +For the contracting company, subcontracting allows them to sell a wide variety of manufactured +products, without having to worry about investing in and maintaining the equipment and labor +required to handle the manufacturing themselves. + +This helps contracting companies stay flexible throughout economic cycles, as they can easily +increase or decrease their engagements with subcontractors, as necessitated by the current moment. +It also means they are able to focus on tasks they excel at, while delegating more specialized work +to subcontractors. + +On the other side of the relationship, subcontracting allows subcontractors to specialize in more +niche areas of production, which might not be as profitable outside the bounds of a subcontracting +engagement. In certain arrangements, it also provides them with the flexibility to choose which +projects they accept or decline, and how many they work on at any given time. + +In Odoo, companies can configure their subcontracting workflows based on a variety of different +factors, including how components are sourced, and what happens to finished products once they are +manufactured. + +```{eval-rst} +.. cards:: + + .. card:: Basic subcontracting + :target: subcontracting/subcontracting_basic + + Subcontract products without supplying the subcontractor with components. + + .. card:: Resupply subcontractor + :target: subcontracting/subcontracting_resupply + + Ship components to a subcontractor each time a PO for a subcontracted product is confirmed. + + .. card:: Dropship to subcontractor + :target: subcontracting/subcontracting_dropship + + Dropship components to a subcontractor each time a PO for a subcontracted product is + confirmed. +``` + +## Configuration + +To enable subcontracting in Odoo, navigate to {menuselection}`Manufacturing app --> Configuration +--> Settings`, and tick the checkbox next to the {guilabel}`Subcontracting` setting, under the +{guilabel}`Operations` heading. Then, click {guilabel}`Save`. + +```{image} subcontracting/subcontracting-setting.png +:align: center +:alt: The Subcontracting setting in the manufacturing app. +``` + +With subcontracting enabled, a few different features become available in Odoo: + +- On bills of materials (BoMs), the *BoM Type* field now includes a *Subcontracting* option. + Enabling the *Subcontracting* {{ BoM }} type designates the {{ BoM }}'s product as a subcontracted + product, which means Odoo knows that it is produced by a subcontractor, and not by the company + that owns the Odoo database. + +- Two subcontracting routes become available in the *Inventory* app, and can be assigned to specific + products, on the *Inventory* tab of their product pages: + + - *Resupply Subcontractor on Order* + - *Dropship Subcontractor on Order* + +## Subcontracting workflows + +In Odoo, there are three subcontracting workflows, the main difference between them being *how* the +subcontractor obtains the necessary components: + +- In the *basic* subcontracting workflow, the subcontractor is fully responsible for obtaining the + components. This workflow is outlined in the {doc}`subcontracting/subcontracting_basic` + documentation. +- In the *Resupply Subcontractor on Order* workflow, the contracting company sends the components + from their warehouse to the subcontractor. This workflow is outlined in the + {doc}`subcontracting/subcontracting_resupply` documentation. +- In the *Dropship Subcontractor on Order* workflow, the contracting company purchases the + components from a vendor, and has them delivered directly to the subcontractor. This workflow is + outlined in the {doc}`subcontracting/subcontracting_dropship` documentation. + +In addition to how a subcontractor obtains components, it is also necessary to consider why a +product is being subcontracted, as well as what happens to products once they are manufactured by +the subcontractor. + +In terms of why a product is being subcontracted, the two main reasons are to fulfill a customer +order, or to replenish the quantity of stock on-hand. + +In terms of what happens to products once they are manufactured, they can either be shipped to the +contracting company, or dropshipped directly to an end customer. + +Each of the three subcontracting workflows described above can be configured to facilitate any of +these possibilities, and the methods for doing so are outlined in their respective documentation. + +## Subcontracted product valuation + +The valuation of a subcontracted product depends upon a few different variables: + +- The cost of the required components, if provided by the contracting company; from here on referred + to as `C`. +- The price paid to the subcontractor for the service of manufacturing the subcontracted product; + from here on referred to as `M`. +- The cost of shipping components to the subcontractor, and having them shipped back to the + contracting company; from here on referred to as `S`. +- The cost of dropshipping, if the components are shipped by the subcontractor to the end customer; + from here on referred to as `D`. +- Any other associated costs, like import taxes, etc.; from here on referred to as `x`. + +Therefore, the total valuation of a subcontracted product (`P`) can be represented by the following +equation: + +$$ +P = C + M + S + D + x +$$ + +It is important to note that not every subcontracted product valuation will include all of these +variables. For example, if the product is not dropshipped to the end customer, then there is no need +to factor in the cost of dropshipping. + +```{toctree} +subcontracting/subcontracting_basic +subcontracting/basic_subcontracting_lead_times +subcontracting/subcontracting_resupply +subcontracting/resupply_subcontracting_lead_times +subcontracting/subcontracting_dropship +subcontracting/dropship_subcontracting_lead_times +``` + diff --git a/content/applications/inventory_and_mrp/manufacturing/subcontracting/basic_subcontracting_lead_times.md b/content/applications/inventory_and_mrp/manufacturing/subcontracting/basic_subcontracting_lead_times.md new file mode 100644 index 000000000..b08b4857d --- /dev/null +++ b/content/applications/inventory_and_mrp/manufacturing/subcontracting/basic_subcontracting_lead_times.md @@ -0,0 +1,106 @@ +--- +substitutions: + PO: '{abbr}`PO (Purchase Order)`' + RfQ: '{abbr}`RfQ (Request for Quotation)`' +--- + +# Basic subcontracting lead times + +In Odoo, lead times are used to predict how long it takes to complete a certain action. For example, +a *delivery lead time* can be set for a purchased product, which specifies the number of days it +usually takes for the product's vendor to delivery the product to the purchasing company. + +For subcontracted products specifically, delivery lead times can be configured to take into account +the amount of time required for the subcontractor to manufacture a product. Doing so allows the +contracting company to better predict the delivery dates of subcontracted products. + +:::{important} +Like all lead times in Odoo, lead times for subcontracted products are only an estimate, and are +based on how long actions are *expected* to take. + +Unforeseen circumstances can impact the completion of these actions, which means that lead times +should not be viewed as guarantees. +::: + +## Configuration + +When using the {doc}`basic subcontracting ` workflow to manufacture a product, +a company is not responsible for supplying the subcontractor with the necessary components. This +means that the only factors affecting the delivery date of a product are the amount of time it takes +the subcontractor to manufacture and deliver it. + +By assigning a product's subcontractor a delivery lead time that considers both of these factors, +the *Expected Arrival* date displayed on purchase orders (POs) for the product more accurately +reflects the amount of time required for both manufacturing and delivery. + +### Product delivery lead time + +To set a delivery lead time for a product's subcontractor, navigate to {menuselection}`Inventory app +--> Products --> Products`, and select a subcontracted product. + +Then, select the {guilabel}`Purchase` tab on the product's page. If the subcontractor has not +already been added as a vendor, do so now by clicking {guilabel}`Add a line`, and selecting the +subcontractor in the {guilabel}`Vendor` column. + +Once the subcontractor has been added, enter the number of days it takes them to manufacture and +deliver the product, in the {guilabel}`Delivery Lead Time` column. + +```{image} basic_subcontracting_lead_times/delivery-lead-time.png +:align: center +:alt: The Delivery Lead Time field for a subcontractor, on the Purchase tab of a product +: page. +``` + +:::{note} +Multiple subcontractors can be added to the {guilabel}`Purchase` tab on a product's page, and a +different {guilabel}`Delivery Lead Time` can be set for each. +::: + +## Lead time workflow + +After setting a delivery lead time for a product's vendor, create an {{ RfQ }} by navigating to +{menuselection}`Purchase app --> Orders --> Purchase Orders`, and clicking {guilabel}`New`. + +Specify the subcontractor in the {guilabel}`Vendor` field. Then, add the product in the +{guilabel}`Products` tab by clicking {guilabel}`Add a product`, selecting the product in the +{guilabel}`Product` column, and adding a quantity in the {guilabel}`Quantity` column. + +Once a product has been added, the {guilabel}`Expected Arrival` field on the {{ RfQ }} auto-populates +with a date that reflects the vendor's delivery lead time, as specified on the product's page. + +If the date needs to be adjusted, click on the {guilabel}`Expected Arrival` field to open a calendar +popover, and select the desired date. Make sure not to choose a date sooner than the one that was +auto-populated, unless the subcontractor has confirmed that they are able to deliver the product by +that date. + +Finally, click {guilabel}`Confirm Order` on the {{ RfQ }} to turn it into a {{ PO }}. At this point, the +subcontractor should begin manufacturing the subcontracted product, before delivering it to the +contracting company. + +```{eval-rst} +.. example:: + Bike retailer *Mike's Bikes* works with a subcontractor — *Bike Friends* — to produce units of + their *Tricycle* product. + + On average, Bike Friends requires three days to manufacture a tricycle, plus an additional two + days to deliver it to Mike's Bikes. + + As a result, Mike's Bikes sets a delivery lead time of five days for tricycles manufactured by + Bike Friends: three days for manufacturing, plus two days for delivery. + + On May 3rd, Mike's Bikes confirms a |PO| to purchase one tricycle from Bike Friends. + + The :guilabel:`Expected Arrival` date listed on the |PO| is May 8th, five days after the + :guilabel:`Confirmation Date`. + + .. image:: basic_subcontracting_lead_times/expected-arrival.png + :align: center + :alt: The Expected Arrival date on a PO for a subcontracted product. + + Bike Friends begins manufacturing the tricycle on May 3rd — the day that the |PO| is confirmed — + and finishes on May 6th, three days later. + + The tricycle is then shipped to Mike's Bikes the same day, and they receive it on May 8th, two + days later. +``` + diff --git a/content/applications/inventory_and_mrp/manufacturing/subcontracting/dropship_subcontracting_lead_times.md b/content/applications/inventory_and_mrp/manufacturing/subcontracting/dropship_subcontracting_lead_times.md new file mode 100644 index 000000000..c64bc1c61 --- /dev/null +++ b/content/applications/inventory_and_mrp/manufacturing/subcontracting/dropship_subcontracting_lead_times.md @@ -0,0 +1,196 @@ +--- +substitutions: + BoM: '{abbr}`BoM (Bill of Materials)`' + PO: '{abbr}`PO (Purchase Order)`' + RfQ: '{abbr}`RfQ (Request for Quotation)`' +--- + +# Dropship subcontracting lead times + +In Odoo, lead times are used to predict how long it takes to complete a certain action. For example, +a *delivery lead time* can be set for a purchased product, which specifies the number of days it +usually takes for the product's vendor to deliver the product to the purchasing company. + +For subcontracted products specifically, delivery lead times can be configured to take into account +the amount of time required for the subcontractor to manufacture a product. Doing so allows the +contracting company to better predict the delivery dates of subcontracted products. + +Certain subcontracted products require the contracting company to supply the subcontractor with +manufacturing components. In this case, a *manufacturing lead time* can be used, in addition to the +delivery lead time, to generate the date on which the subcontractor must receive the required +components, in order to manufacture the product and deliver it on time. + +In cases where components are dropshipped to the subcontractor, an additional delivery lead time +can be set for each component. This should be set to the amount of time it takes the vendor to +deliver components to the subcontractor. + +Once a delivery lead time has been set on a component, dropship orders for the component display the +date by which the order must be confirmed, so that it can be dropshipped to the subcontractor by the +date on which manufacturing must begin. + +:::{important} +Like all lead times in Odoo, lead times for subcontracted products are only an estimate, and are +based on how long actions are *expected* to take. + +Unforeseen circumstances can impact the completion of these actions, which means that lead times +should not be viewed as guarantees. +::: + +## Configuration + +When using the {doc}`Dropship Subcontractor on Order ` route, a company is +responsible for purchasing the necessary components from a vendor, and having them dropshipped +directly to the subcontractor. + +This means that, in addition to the amount of time it takes the subcontractor to manufacture and +deliver the product, it is also necessary to consider how long it takes the component vendor to +dropship the components to the subcontractor. + +By assigning a product's subcontractor a *delivery lead time*, specifying a *manufacturing lead +time* on the product's BoM, and assigning the vendor of the components an additional *delivery lead +time*, *Dropship Subcontractor* orders for the product's components display the deadline for +confirming a dropship order to send the components to the subcontractor. + +### Product delivery lead time + +To set a delivery lead time for a product's subcontractor, navigate to {guilabel}`Inventory app --> +Products --> Products`, and select a subcontracted product. + +Then, select the {guilabel}`Purchase` tab on the product's page. If the subcontractor has not +already been added as a vendor, do so now by clicking {guilabel}`Add a line`, and selecting the +subcontractor in the {guilabel}`Vendor` column. + +Once the subcontractor has been added, enter the number of days it takes them to manufacture and +deliver the product, in the {guilabel}`Delivery Lead Time` column. + +```{image} dropship_subcontracting_lead_times/delivery-lead-time.png +:align: center +:alt: The Delivery Lead Time field for a subcontractor, on the Purchase tab of a product +: page. +``` + +### Product manufacturing lead time + +Next, navigate to the product's {{ BoM }} by clicking the {guilabel}`Bill of Materials` smart button at +the top of the product's page. Then, select a BoM from the list. + +On the {{ BoM }}, select the {guilabel}`Miscellaneous` tab. In the {guilabel}`Manuf. Lead Time` field, +enter the same number of days that was entered in the {guilabel}`Delivery Lead Time` field of the +{{ BoM }}'s product. + +```{image} dropship_subcontracting_lead_times/manufacturing-lead-time.png +:align: center +:alt: The Manuf. Lead Time field on a product's BoM. +``` + +While not all of these days are actually used for manufacturing by the subcontractor, setting the +same number of days in each field tells Odoo that the subcontractor must receive the components and +begin production by the start of the product's delivery lead time. This gives the subcontractor +enough time to both manufacture and deliver the product. + +### Component delivery lead time + +From the product's BoM, navigate to each component by clicking on the component in the +{guilabel}`Components` tab, and then clicking the {icon}`oi-arrow-right` {guilabel}`(right arrow)` +button to the right of the component. + +On the product page for each component, select the {guilabel}`Purchase` tab. If the vendor has not +already been added, do so now by clicking {guilabel}`Add a line`, and selecting the subcontractor in +the {guilabel}`Vendor` column. + +Once the vendor has been added, enter the number of days it takes them to dropship the product to +the subcontractor, in the {guilabel}`Delivery Lead Time` column. + +## Dropship subcontracting workflow + +Create a request for quotation (RfQ) for the product by navigating to {menuselection}`Purchase app +--> Orders --> Requests for Quotation`, and clicking {guilabel}`New`. + +Specify the subcontractor in {guilabel}`Vendor` field. Then, add the product in the +{guilabel}`Products` tab by clicking {guilabel}`Add a product`, selecting the product in the +{guilabel}`Product` column, and specifying a quantity in the {guilabel}`Quantity` column. + +In the {guilabel}`Expected Arrival` field, enter a date that provides enough time for the component +vendor to dropship the components, and the subcontractor to manufacture and deliver the product. + +:::{important} +When a product is added to an {{ RfQ }}, the {guilabel}`Expected Arrival` field auto-populates with a +date that is today's date plus the delivery lead time of the product. However, this does not +consider the time it takes to dropship the components to the subcontractor. + +When purchasing a product subcontracted using the *Dropship Subcontractor on Order* route, it is +necessary to adjust this date to take into account the extra time needed for the components to be +delivered to the subcontractor. + +Since production does not begin until they receive the components, leaving the date as is results +in the finished product arriving *after* the date listed on the {{ RfQ }}. +::: + +Next, click {guilabel}`Confirm Order` to turn the {{ RfQ }} into a {{ PO }}. Doing so creates a second {{ RfQ }} +to purchase the components from the dropshipper, and have them sent to the subcontractor. + +Navigate to {menuselection}`Purchase app --> Orders --> Requests for Quotation`, and select the +{{ RfQ }} that lists the dropshipper in the {guilabel}`Vendor` column. + +On the {{ RfQ }}, the {guilabel}`Expected Arrival` field lists the date on which the subcontractor must +receive the components, in order to deliver the finished product by the *Expected Arrival* date +listed on the subcontractor {{ PO }}. + +The {guilabel}`Order Deadline` field lists the latest date on which the {{ RfQ }} can be confirmed, in +order for the dropshipper to deliver the components to the subcontractor by the {guilabel}`Expected +Arrival` date. + +Click {guilabel}`Confirm Order` to turn the {{ RfQ }} into a {{ PO }}, and confirm the purchase of the +components from the dropshipper. Doing so causes a {guilabel}`Dropship` smart button to appear at +the top of the page. + +Click the {guilabel}`Dropship` smart button to open the dropship order. This order can also be +accessed from the {guilabel}`Resupply` smart button that now appears on the subcontractor {{ PO }}. + +After the dropshipper has delivered the components to the subcontractor, click the +{guilabel}`Validate` button at the top of the dropship order to confirm that the subcontractor has +received the components. + +Once the subcontractor receives the components, they begin manufacturing the component, before +delivering it to the contracting company. + +```{eval-rst} +.. example:: + + Bike retailer *Mike's Bikes* works with a subcontractor — *Bike Friends* — to produce units of + their *Bicycle* product. + + Mike's Bikes must purchase the required components from vendor Bike World, and have them + dropshipped to Bike Friends. + + On average, Bike Friends takes three days to manufacture each bicycle, plus an addition two days + to deliver it to Mike's Bikes. + + As a result, Mike's Bikes sets a delivery lead time of five days for bicycle manufactured by Bike + Friends: three days for manufacturing, plus two days for delivery. + + On the bicycle's BoM, they enter a manufacturing lead time of five days as well, to remind + themselves of the date that components must be delivered to the subcontractor. + + On the product pages for each of the bicycle's components, they assign Bike World a delivery lead + time of two days. This is the amount of time it takes Bike World to dropship each component + directly to the subcontractor. + + On May 10th, Mike's Bikes confirms a |PO| for one bicycle, with an expected delivery date of May + 17th. + + The |RfQ| for purchasing the components from Bike World and having them dropshipped to Bike + Friends has an Expected Arrival date of May 12th, and a Deadline of May 10th. The |RfQ| must be + confirmed by the deadline in order for Bike Friends to receive the components by the Expected + Arrival date, giving them enough time to deliver the finished bicycle to Mike's Bikes by May + 17th. + + .. image:: dropship_subcontracting_lead_times/deadline-arrival.png + :align: center + :alt: The Order Deadline and Expected Arrival dates on a dropship order. + + Mike's Bikes confirms the |RfQ| on May 10th, and Bike World delivers the components to Bike + Friends on May 12th. Bike Friends manufactures the bicycle, and delivers it to Mike's Bikes on + May 17th. +``` + diff --git a/content/applications/inventory_and_mrp/manufacturing/subcontracting/resupply_subcontracting_lead_times.md b/content/applications/inventory_and_mrp/manufacturing/subcontracting/resupply_subcontracting_lead_times.md new file mode 100644 index 000000000..c8ef14ab4 --- /dev/null +++ b/content/applications/inventory_and_mrp/manufacturing/subcontracting/resupply_subcontracting_lead_times.md @@ -0,0 +1,166 @@ +--- +substitutions: + BoM: '{abbr}`BoM (Bill of Materials)`' + PO: '{abbr}`PO (Purchase Order)`' + RfQ: '{abbr}`RfQ (Request for Quotation)`' +--- + +# Resupply subcontracting lead times + +In Odoo, lead times are used to predict how long it takes to complete a certain action. For example, +a *delivery lead time* can be set for a purchased product, which specifies the number of days it +usually takes for the product's vendor to deliver the product to the purchasing company. + +For subcontracted products specifically, delivery lead times can be configured to take into account +the amount of time required for the subcontractor to manufacture a product. Doing so allows the +contracting company to better predict the delivery dates of subcontracted products. + +Certain subcontracted products require the contracting company to supply the subcontractor with +manufacturing components. In this case, a *manufacturing lead time* can be used, in addition to the +delivery lead time, to generate the date on which the subcontractor must receive the required +components, in order to manufacture the product and deliver it on time. + +:::{important} +Like all lead times in Odoo, lead times for subcontracted products are only an estimate, and are +based on how long actions are *expected* to take. + +Unforeseen circumstances can impact the completion of these actions, which means that lead times +should **not** be viewed as guarantees. +::: + +## Configuration + +When using the {doc}`Resupply Subcontractor on Order ` route, a company is +responsible for supplying the subcontractor with the necessary components. As a result, the +subcontractor cannot begin manufacturing until the components have been received. + +This means that, in addition to the amount of time it takes the subcontractor to manufacture and +deliver the product, the date they receive the components must also be considered. + +By assigning a product's subcontractor a delivery lead time, and specifying a manufacturing lead +time on the product's bill of materials (BoM), *Resupply Subcontractor* orders for the product's +components display the deadline by which the subcontractor must receive the components. + +### Product delivery lead time + +To set a delivery lead time for a product's subcontractor, navigate to {menuselection}`Inventory app +--> Products --> Products`, and select a subcontracted product. + +Then, select the {guilabel}`Purchase` tab on the product's page. If the subcontractor has not +already been added as a vendor, do so now by clicking {guilabel}`Add a line`, and selecting the +subcontractor in the {guilabel}`Vendor` field. + +Once the subcontractor has been added, enter the number of days it takes them to manufacture and +deliver the product, in the {guilabel}`Delivery Lead Time` column. + +```{image} resupply_subcontracting_lead_times/delivery-lead-time.png +:align: center +:alt: The Delivery Lead Time field for a subcontractor, on the Purchase tab of a product +: page. +``` + +### Product manufacturing lead time + +Next, navigate to the product's {{ BoM }} by clicking the {guilabel}`Bill of Materials` smart button at +the top of the product's page. Then, select a {{ BoM }} from the list. + +On the {{ BoM }}, select the {guilabel}`Miscellaneous` tab. In the {guilabel}`Manuf. Lead Time` field, +enter the same number of days that was entered in the {guilabel}`Delivery Lead Time` field of the +{{ BoM }}'s product. + +```{image} resupply_subcontracting_lead_times/manufacturing-lead-time.png +:align: center +:alt: The Manuf. Lead Time field on a product's BoM. +``` + +While not all of these days are actually used for manufacturing by the subcontractor, setting the +same number of days in each field tells Odoo that the subcontractor must receive the components and +begin production by the start of the product's delivery lead time. This gives the subcontractor +enough time to both manufacture and deliver the product. + +### Resupply subcontracting workflow + +Create a request for quotation (RfQ) for the product by navigating to {menuselection}`Purchase app +--> Orders --> Requests for Quotation`, and clicking {guilabel}`New`. + +Specify the subcontractor in {guilabel}`Vendor` field. Then, add the product in the +{guilabel}`Products` tab by clicking {guilabel}`Add a product`, selecting the product in the +{guilabel}`Product` column, and specifying a quantity in the {guilabel}`Quantity` column. + +In the {guilabel}`Expected Arrival` field, enter a date that provides enough time for the +subcontractor to receive the components, manufacture the product, and deliver it back to the +subcontracting company. + +:::{important} +When a product is added to an {{ RfQ }}, the {guilabel}`Expected Arrival` field auto-populates with a +date that is today's date plus the delivery lead time of the product. However, this does **not** +consider the time it takes to ship the components to the subcontractor. + +When purchasing a product subcontracted using the Resupply Subcontractor on Order route, it is +necessary to adjust this date to take into account the extra time needed for the components to be +shipped to the subcontractor. + +Since production does not begin until they receive the components, leaving the date as is results +in the finished product arriving *after* the date listed on the {{ RfQ }}. +::: + +Next, click {guilabel}`Confirm Order` to turn the {{ RfQ }} into a {{ PO }}. Doing so causes a +{guilabel}`Resupply` smart button to appear at the top of the page. + +Click the {guilabel}`Resupply` smart button to open the resupply subcontractor order, which is the +order created to send components to the subcontractor. + +The {guilabel}`Deadline` field on the resupply subcontractor order shows the deadline for the +subcontractor to receive the components, in order for them to have enough time to manufacture and +deliver the finished product by the Expected Arrival date. + +The {guilabel}`Scheduled Date` field should display the latest date on which components can be +shipped, while still arriving to the subcontractor by the {guilabel}`Deadline`. However, by default, +the date displayed is the same as the date in the {guilabel}`Deadline` field, and must be updated to +take into account the time required for shipping. + +Click on the {guilabel}`Scheduled Date` field to open a calendar popover from which a date can be +selected. Select a date that allows for the components to be delivered by the {guilabel}`Deadline` +on the resupply subcontractor order. + +After the components are shipped, click the {guilabel}`Validate` button at the top of the order to +confirm they have been sent to the subcontractor. + +Once the subcontractor receives the components, they begin manufacturing the component, before +delivering it to the contracting company. + +```{eval-rst} +.. example:: + Bike retailer *Mike's Bikes* works with a subcontractor — *Bike Friends* — to produce units of + their *Unicycle* product. + + Mike's Bikes must supply Bike Friends with the necessary components for manufacturing the + unicycles. + + On average, Bike Friends takes three days to manufacture each unicycle, plus an additional two + days to deliver it to Mike's Bikes. + + As a result, Mike's Bikes sets a delivery lead time of five days for unicycles manufactured by + Bike Friends: three days for manufacturing, plus two days for delivery. + + On the unicycle's |BoM|, they enter a manufacturing lead time of five days, as well, to remind + themselves of the date that components must be delivered to the subcontractor. + + They confirm a |PO| for one unicycle, with an expected arrival date of May 30th. + + The resupply subcontractor order for shipping the components to the subcontractor shows a + *Deadline* of May 25th. The subcontractor must receive the components by this date, in order to + have enough time to manufacture the unicycle, and deliver it by May 30th. + + It takes Mike's Bikes two days to deliver the components, so they update the *Scheduled Date* + field on the resupply subcontractor order to May 23rd, two days before the Deadline. + + .. image:: resupply_subcontracting_lead_times/scheduled-deadline.png + :align: center + :alt: The Scheduled Date and Deadline fields on a resupply subcontractor order. + + Mike's Bikes ships the components to Bike Friends on the scheduled date of May 23rd, and they + arrive on the deadline of May 25th. This gives Bike Friends enough time to manufacture the + unicycle, and ship it back to Mike's Bikes by the expected arrival date of May 30th. +``` + diff --git a/content/applications/inventory_and_mrp/manufacturing/subcontracting/subcontracting_basic.md b/content/applications/inventory_and_mrp/manufacturing/subcontracting/subcontracting_basic.md new file mode 100644 index 000000000..b0c83365a --- /dev/null +++ b/content/applications/inventory_and_mrp/manufacturing/subcontracting/subcontracting_basic.md @@ -0,0 +1,199 @@ +--- +substitutions: + BoM: '{abbr}`BoM (Bill of Materials)`' + PO: '{abbr}`PO (Purchase Order)`' + POs: '{abbr}`POs (Purchase Orders)`' + SO: '{abbr}`SO (Sales Order)`' +--- + +# Basic subcontracting + +In manufacturing, subcontracting is the process of a company engaging a third-party manufacturer, or +subcontractor, to manufacture products that are then sold by the contracting company. + +In basic subcontracting, the subcontractor is responsible for acquiring the necessary components. +This means that the contracting company only has to worry about what happens to subcontracted +products once they are produced. + +The workflow for purchasing a product manufactured using basic subcontracting is similar to the one +used when purchasing a non-subcontracted product from a vendor. The main differences are the way +that subcontracted products are configured, and the fact that subcontracted products take longer to +be sent from the vendor, since they must first be manufactured by them. + +## Configuration + +To use subcontracting in Odoo, navigate to {menuselection}`Manufacturing app --> Configuration --> +Settings`, and tick the checkbox next to the {guilabel}`Subcontracting` setting, under the +{guilabel}`Operations` heading. Then, click {guilabel}`Save`. + +Once the {guilabel}`Subcontracting` setting is enabled, it is also necessary to properly configure +the subcontracted product, and the product's {{ BoM }}. + +(manufacturing-workflows-subcontracting-basic-product-config)= + +### Configure product + +To configure a product for basic subcontracting, navigate to {menuselection}`Inventory app --> +Products --> Products`, and select a product, or create a new one by clicking {guilabel}`New`. + +On the product form, select the {guilabel}`Purchase` tab, and add the product's subcontractor as a +vendor by clicking {guilabel}`Add a line`, selecting the subcontractor in the {guilabel}`Vendor` +drop-down menu, and entering a price in the {guilabel}`Price` field. + +Then, click on the {guilabel}`Inventory` tab, and use the {guilabel}`Routes` field to configure a +route that determines what happens to the finished product once it has been manufactured by the +subcontractor. + +If the finished product is shipped back to the contracting company, make sure the {guilabel}`Buy` +route is selected. In addition, select the {guilabel}`Replenish on Order (MTO)` route to +automatically create a {{ PO }} for the product upon confirmation of a sales order (SO), unless there is +enough stock on-hand to fulfill the {{ SO }}. + +If the finished product is shipped directly to the customer by the subcontractor, make sure that +**only** the {guilabel}`Dropship` route is selected. + +### Configure BoM + +To configure a {{ BoM }} for basic subcontracting, click the {guilabel}`Bill of Materials` smart button +on the product form, and select the desired {{ BoM }}. + +Alternatively, navigate to {menuselection}`Manufacturing app --> Products --> Bills of Materials`, +and select the {{ BoM }} for the subcontracted product. + +:::{seealso} +For a full overview of {{ BoM }} configuration, see the {doc}`Bill of materials +<../basic_setup/bill_configuration>` documentation. +::: + +In the {guilabel}`BoM Type` field, select the {guilabel}`Subcontracting` option. Then, add one or +more subcontractors in the {guilabel}`Subcontractors` field that appears below. + +```{image} subcontracting_basic/bom-type.png +:align: center +:alt: The "BoM Type" field on a BoM, configured to manufacture the product using subcontracting. +``` + +Finally, click on the {guilabel}`Miscellaneous` tab. In the {guilabel}`Manuf. Lead Time` field, +enter the number of days it takes the subcontractor to manufacture the product. This number is +factored in when calculating the product's expected arrival date. + +:::{note} +When using basic subcontracting, there is no need to list components in the +{guilabel}`Components` tab of the {{ BoM }}, since the components required for manufacturing, and the +means by which they are acquired, are handled by the subcontractor. +::: + +## Basic subcontracting workflow + +The basic subcontracting workflow consists of up to four steps: + +1. Create a sales order (SO) for the subcontracted product; doing so creates a {{ PO }} to purchase the + product from the subcontractor. +2. Confirm the {{ PO }} created in the previous step, or create a new {{ PO }}; doing so creates a receipt + order or a dropship order. +3. Process the receipt once the subcontractor has finished manufacturing the subcontracted product, + and shipped it back to the contracting company, **OR** process the dropship order to ship the + product directly to the customer. +4. If the workflow was started by creating an {{ SO }}, and the finished product is not dropshipped to + the end customer, process the delivery order once the product is shipped to the customer. + +The specific number of steps depends on the reason that the subcontracted product is being purchased +from the subcontractor. + +If the reason is to fulfill a specific customer order, the process starts with creating an {{ SO }}, and +ends with delivering the product to the customer, or having the subcontractor dropship it to them. + +If the reason is to increase the quantity of stock on-hand, the process starts with creating a {{ PO }}, +and ends with receiving the product into inventory. + +### Create SO + +It is only necessary to complete this step if the product is being purchased from the subcontractor +to fulfill a customer need. If the product is being purchased to increase the quantity of stock +on-hand, move on to the next step. + +To create a new {{ SO }}, navigate to {menuselection}`Sales app --> Orders --> Orders`, and click +{guilabel}`New`. + +Select the customer in the {guilabel}`Customer` drop-down menu. Then, click {guilabel}`Add a +product` on the {guilabel}`Order Lines` tab, select a subcontracted product in the +{guilabel}`Product` drop-down menu, and enter a quantity in the {guilabel}`Quantity` field. + +Click {guilabel}`Confirm` to confirm the {{ SO }}, at which point a {guilabel}`Purchase` smart button +appears at the top of the page. This opens the {{ PO }} created to purchase the subcontracted product +from the subcontractor. + +:::{note} +An {{ SO }} for the product only creates a {{ PO }} if the *Replenish on Order (MTO)* route is enabled on +the product's form, **and** there is not enough stock of the product on-hand to fulfill the {{ SO }}. + +If there is enough stock on-hand, confirming an {{ SO }} for the product creates a delivery order +instead, because Odoo assumes that the {{ SO }} is fulfilled using the stock in the warehouse. + +This is not the case for subcontracted products that are dropshipped to the end customer. In that +case, a {{ PO }} is **always** created, even if there is enough stock on-hand. +::: + +### Process PO + +If a {{ PO }} was created in the previous step, navigate to it by clicking the {guilabel}`Purchase` +smart button at the top of the {{ SO }}, or by going to {guilabel}`Purchase app --> Orders --> Purchase +Orders`, and selecting the {{ PO }}. Then, click {guilabel}`Confirm Order` to confirm it, and move on to +the next step. + +If a {{ PO }} was not created in the previous step, do so now by navigating to {menuselection}`Purchase +app --> Orders --> Purchase Orders`, and clicking {guilabel}`New`. + +Begin filling out the {{ PO }} by selecting a subcontractor from the {guilabel}`Vendor` drop-down menu. +In the {guilabel}`Products` tab, click {guilabel}`Add a product` to create a new product line. +Select a subcontracted product in the {guilabel}`Product` field, and enter the quantity in the +{guilabel}`Quantity` field. Finally, click {guilabel}`Confirm Order` to confirm the {{ PO }}. + +When a {{ PO }} is confirmed for a product manufactured using basic subcontracting, a receipt or +dropship order is automatically created, and can be accessed from the corresponding +{guilabel}`Receipt` or {guilabel}`Dropship` smart button that appears at the top of the {{ PO }}. + +:::{figure} subcontracting_basic/subcontractor-po.png +:align: center +:alt: A PO for a basic subcontracting product, with a Receipt smart button at the top +: of the page. + +PO for a basic subcontracting product, with a Receipt smart button at the top of the page. +::: + +### Process receipt or dropship order + +Once the subcontractor has finished manufacturing the product, they either ship it to the +contracting company, or dropship it to the end customer, depending on how the product was +{ref}`configured `. + +#### Process receipt + +If the subcontractor ships the finished product to the contracting company, once it has been +received, navigate to {menuselection}`Purchase app --> Orders --> Purchase Orders`, and select the +{{ PO }}. + +Click the {guilabel}`Receive Products` button at the top of the {{ PO }}, or the {guilabel}`Receipt` +smart button at the top of the page, to open the receipt. Then, click {guilabel}`Validate` at the +top of the receipt to enter the product into inventory. + +#### Process dropship order + +If the subcontractor dropships the product, once they have sent it, navigate to +{menuselection}`Purchase app --> Orders --> Purchase Orders`, and select the {{ PO }}. + +Select the {guilabel}`Dropship` smart button at the top of the page to open the dropship order, and +click {guilabel}`Validate` at the top of the order to confirm that the product has been sent to the +customer. + +### Process delivery order + +If the subcontracting workflow was started by a customer {{ SO }}, and the finished product was **not** +dropshipped to the customer, but rather delivered to the contracting company, it is necessary to +ship the product to the customer, and process the delivery order. + +Once the product has been shipped to the customer, navigate to the {menuselection}`Sales` app, and +select the {{ SO }}. Select the {guilabel}`Delivery` smart button at the top of the page to open the +delivery order, and click {guilabel}`Validate` on the order to confirm that the product has been +shipped. + diff --git a/content/applications/inventory_and_mrp/manufacturing/subcontracting/subcontracting_dropship.md b/content/applications/inventory_and_mrp/manufacturing/subcontracting/subcontracting_dropship.md new file mode 100644 index 000000000..f19ce495a --- /dev/null +++ b/content/applications/inventory_and_mrp/manufacturing/subcontracting/subcontracting_dropship.md @@ -0,0 +1,262 @@ +--- +substitutions: + BoM: '{abbr}`BoM (Bill of Materials)`' + PO: '{abbr}`PO (Purchase Order)`' + POs: '{abbr}`POs (Purchase Orders)`' + RfQ: '{abbr}`RfQ (Request for Quotation)`' + SO: '{abbr}`SO (Sales Order)`' + SOs: '{abbr}`SOs (Sales Orders)`' +--- + +# Dropship to subcontractor + +In manufacturing, subcontracting is the process of a company engaging a third-party manufacturer, or +subcontractor, to manufacture products that are then sold by the contracting company. + +In Odoo, the *Dropship Subcontractor on Order* route is used to purchase the necessary components +for a subcontracted product from the vendor, and have them delivered directly to the subcontractor, +each time a purchase order (PO) for that product is confirmed. + +The subcontractor then uses the components to manufacture the desired product, before shipping it +back to the contracting company. + +:::{important} +It is necessary to understand the differences between the *Dropship* and *Dropship Subcontractor +on Order* routes. While both routes involve dropshipping, they are used for different purposes. + +The *Dropship* route is used to purchase products from a vendor, and have them shipped directly +to the end customer. + +The *Dropship Subcontractor on Order* route is used to purchase components from a vendor, and +have them shipped directly to a subcontractor. By default, finished products are then sent from +the subcontractor back to the contracting company. + +However, it is possible to combine both the *Dropship* and *Dropship Subcontractor on Order* +routes so they are used for the same product. In this workflow, components are dropshipped to the +subcontractor, who then ships the finished product directly to the end customer. + +This can be achieved by following steps one through five in the {ref}`workflow section +` of this doc. +::: + +## Configuration + +To use the *Dropship Subcontractor on Order* route, navigate to {menuselection}`Manufacturing app +--> Configuration --> Settings`, and enable the checkbox next to {guilabel}`Subcontracting`, under +the {guilabel}`Operations` heading. + +Once the *Subcontracting* setting is enabled, it is also necessary to properly configure the +subcontracted product, the product's {{ BoM }}, and the components listed on the {{ BoM }}. + +### Configure product + +To configure a product for the *Dropship Subcontractor on Order* route, navigate to +{menuselection}`Inventory app --> Products --> Products`, and select a product, or create a new one +by clicking {guilabel}`New`. + +Select the {guilabel}`Purchase` tab, and add the product's subcontractor as a vendor by clicking +{guilabel}`Add a line`, selecting the subcontractor in the {guilabel}`Vendor` drop-down menu, and +entering a price in the {guilabel}`Price` field. + +Then, click on the {guilabel}`Inventory` tab to configure a route that determines what happens to +the finished product, once it has been manufactured by the subcontractor. + +If the finished product is shipped back to the contracting company, make sure that the +{guilabel}`Buy` route is selected. In addition, select the {guilabel}`Replenish on Order (MTO)` +route to automatically create a {{ PO }} for the product upon confirmation of a {{ SO }}, unless there is +enough stock on-hand to fulfill the {{ SO }}. + +If the finished product is shipped directly to the customer by the subcontractor, make sure that +only the {guilabel}`Dropship` route is selected. + +### Configure bill of materials + +To configure a {{ BoM }} for the *Dropship Subcontractor on Order* route, click the {guilabel}`Bill of +Materials` smart button on the product's page, and select the {{ BoM }}. + +Alternatively, navigate to {menuselection}`Manufacturing app --> Products --> Bills of Materials`, +and select the {{ BoM }} for the subcontracted product. + +:::{seealso} +For a full overview of {{ BoM }} configuration, see the {doc}`Bill of materials +<../basic_setup/bill_configuration>` documentation. +::: + +In the {guilabel}`BoM Type` field, select the {guilabel}`Subcontracting` option. Then, add one or +more subcontractors in the {guilabel}`Subcontractors` field that appears below. + +```{image} subcontracting_dropship/bom-type.png +:align: center +:alt: The "BoM Type" field on a BoM, configured to manufacture the product using subcontracting. +``` + +Finally, make sure that all necessary components are specified on the {guilabel}`Components` tab. To +add a new component, click {guilabel}`Add a line`, select the component in the {guilabel}`Component` +drop-down menu, and specify the required quantity in the {guilabel}`Quantity` field. + +### Configure Components + +To configure components for the *Dropship Subcontractor on Order* route, navigate to each component +from the {{ BoM }} by selecting the component's name in the {guilabel}`Components` tab, and clicking the +{guilabel}`➡️ (right arrow)` button to the right of the name. + +Alternatively, navigate to each component by going to {menuselection}`Inventory app --> Products --> +Products`, and selecting the component. + +On the component product form, select the {guilabel}`Purchase` tab, and add a vendor by clicking +{guilabel}`Add a line`, selecting the vendor in the {guilabel}`Vendor` field, and adding the price +they sell the product for in the {guilabel}`Price` field. This is the vendor that sends components +to the subcontractor, once they are purchased. + +Then, click on the {guilabel}`Inventory` tab and select the {guilabel}`Dropship Subcontractor on +Order` route in the {guilabel}`Routes` section. + +Repeat the process for every component that must be dropshipped to the subcontractor. + +(manufacturing-workflows-subcontracting-dropship)= + +## Dropship subcontractor on order workflow + +The dropship subcontractor on order workflow consists of up to six steps: + +1. Create a sales order (SO) for the subcontracted product; doing so creates a *subcontractor* {{ PO }} + to purchase the product from the subcontractor. +2. Confirm the {{ PO }} created in the previous step, or create a new {{ PO }}; doing so creates a request + for quotation (RfQ) to purchase the components from the vendor, as well as a receipt order or a + dropship order. +3. Confirm the {{ RfQ }} to turn it into a second {{ PO }} (*vendor* {{ PO }}); doing so creates a *Dropship + Subcontractor* order. +4. Process the *Dropship Subcontractor* order once the vendor has sent the components to the + subcontractor. +5. Process the receipt once the subcontractor has finished manufacturing the subcontracted product, + and shipped it back to the contracting company **OR** process the dropship order to ship the + product directly to the end customer. +6. If the workflow was started by creating an {{ SO }}, and the finished product is not dropshipped to + the end customer, process the delivery order once the product has been shipped to the customer. + +The specific number of steps depends on the reason that the subcontracted product is being purchased +from the subcontractor. + +If the reason is to fulfill a specific customer order, the process starts with creating an SO, and +ends with delivering the product to the customer, or having the subcontractor dropship it to them. + +If the reason is to increase quantity of stock on-hand, the process starts with creating a PO, and +ends with receiving the product into inventory. + +### Create an SO + +It is only necessary to complete this step if the product is being purchased from the subcontractor +to fulfill a customer need. If the product is being purchased to increase the quantity of stock +on-hand, move on to the next step. + +To create a new {{ SO }}, navigate to {menuselection}`Sales app --> Orders --> Orders`, and click +{guilabel}`New`. + +Select the customer in the {guilabel}`Customer` drop-down menu. Then, click {guilabel}`Add a +product` on the {guilabel}`Order Lines` tab, select the product in the {guilabel}`Product` drop-down +menu, and enter a quantity in the {guilabel}`Quantity` field. + +Click {guilabel}`Confirm` to confirm the {{ SO }}, at which point a {guilabel}`Purchase` smart button +appears at the top of the page. This is the *subcontractor* {{ PO }}, or the {{ PO }} created to purchase +the subcontracted product from the subcontractor. + +:::{note} +An {{ SO }} for the product only creates a *subcontractor* {{ PO }} if the *Replenish on Order (MTO)* +route is enabled on the product's page, **and** there is no stock of the product on-hand. + +If there is stock on-hand, confirming an {{ SO }} for the product will instead create a delivery +order, because Odoo assumes that the {{ SO }} is fulfilled using the stock in the warehouse. + +This is not the case for subcontracted products that are dropshipped to the end customer. In that +case, a *subcontractor* {{ PO }} is **always** created, even if there is stock on-hand. +::: + +### Process subcontractor PO + +If a *subcontractor* {{ PO }} was not created in the previous step, do so now by navigating to +{menuselection}`Purchase app --> Orders --> Purchase Orders`, and clicking {guilabel}`New`. + +Begin filling out the {{ PO }} by selecting a subcontractor from the {guilabel}`Vendor` drop-down menu. + +In the {guilabel}`Products` tab, click {guilabel}`Add a product` to create a new product line. +Select a product produced by the subcontractor in the {guilabel}`Product` field, and enter the +quantity in the {guilabel}`Quantity` field. + +Finally, click {guilabel}`Confirm Order` to confirm the *subcontractor* {{ PO }}. + +When a {{ PO }} is confirmed for a product that requires dropshipping components to a subcontractor, a +receipt or dropship order is automatically created, and can be accessed from the corresponding +{guilabel}`Receipt` or {guilabel}`Dropship` smart button that appears at the top of the {{ PO }}. + +```{image} subcontracting_dropship/subcontractor-po.png +:align: center +:alt: |- +: A subcontractor PO for a *Dropship Subcontractor on Order* product, with a Receipt smart +: button at the top of the page. +``` + +In addition, an {{ RfQ }} is created for the components that are purchased from the vendor and sent to +the subcontractor. However, the {{ RfQ }} **IS NOT** automatically linked to the *subcontractor* {{ PO }}. + +Once the {{ RfQ }} is confirmed and becomes a *vendor* {{ PO }}, a *Dropship Subcontractor* order is +created. This order is linked to both the *vendor* {{ PO }} and the *subcontractor* {{ PO }}. + +### Confirm vendor RfQ + +To access the {{ RfQ }} created by confirming the *subcontractor* {{ PO }}, navigate to +{menuselection}`Purchase app --> Orders --> Requests for Quotation`. Select the {{ RfQ }} that lists the +correct vendor in the {guilabel}`Vendor` field, and the reference number of the receipt that was +created after confirming *subcontractor* {{ PO }}, in the {guilabel}`Source Document` field. + +On the {{ RfQ }}, the {guilabel}`Deliver To` field reads {guilabel}`Dropship Subcontractor`, and the +{guilabel}`Dropship Address` field shows the name of the subcontractor to whom components are being +dropshipped. + +Click {guilabel}`Confirm Order` to turn the {{ RfQ }} into a *vendor* {{ PO }}, and confirm the purchase of +components from the vendor. After doing so, a {guilabel}`Dropship` smart button appears at the top +of the *vendor* {{ PO }}, and a {guilabel}`Resupply` smart button appears at the top of the +*subcontractor* {{ PO }}. + +```{image} subcontracting_dropship/vendor-po.png +:align: center +:alt: |- +: A vendor PO for the components of a *Dropship Subcontractor on Order* product, with a +: Dropship smart button at the top of the page. +``` + +### Process Dropship Subcontractor order + +Once the components have been delivered to the subcontractor, navigate to {menuselection}`Purchase +app --> Orders --> Purchase Orders`, and select the *vendor* {{ PO }} or the *subcontractor* {{ PO }}. Then, +click the {guilabel}`Dropship` smart button or the {guilabel}`Resupply` smart button, respectively. + +Clicking either button opens the *Dropship Subcontractor* order. Click the {guilabel}`Validate` +button at the top of the order to confirm that the subcontractor has received the components. + +### Process receipt or dropship order + +Once the subcontractor has manufactured the finished product, navigate to {menuselection}`Purchase +app --> Orders --> Purchase Orders`, and select the *subcontractor* {{ PO }}. + +If the subcontracted product should be received into inventory, once the product arrives, click the +{guilabel}`Receive Products` button at the top of the *subcontractor* {{ PO }} to open the receipt. +Then, click {guilabel}`Validate` at the top of the receipt to register the product into inventory. + +Alternatively, select the {guilabel}`Receipt` smart button at the top of the *subcontractor* {{ PO }}, +and click {guilabel}`Validate` at the top of the receipt. + +If the subcontracted product should be dropshipped, select the {guilabel}`Dropship` button at the +top of the page to open the dropship order, and click {guilabel}`Validate` once the subcontractor +has sent the product to the customer. + +### Process delivery order + +If the subcontracting workflow was started by a customer {{ SO }}, and the finished product was **not** +dropshipped to the customer, but rather delivered to the contracting company, it is necessary to +ship the product to the customer, and process the delivery order. + +Once the product has been shipped to the customer, navigate to the {menuselection}`Sales` app, and +select the {{ SO }}. Select the {guilabel}`Delivery` smart button at the top of the page to open the +delivery order, and click {guilabel}`Validate` to confirm that the product has been shipped to the +customer. + diff --git a/content/applications/inventory_and_mrp/manufacturing/subcontracting/subcontracting_resupply.md b/content/applications/inventory_and_mrp/manufacturing/subcontracting/subcontracting_resupply.md new file mode 100644 index 000000000..14788d137 --- /dev/null +++ b/content/applications/inventory_and_mrp/manufacturing/subcontracting/subcontracting_resupply.md @@ -0,0 +1,276 @@ +--- +substitutions: + BoM: '{abbr}`BoM (Bill of Materials)`' + PO: '{abbr}`PO (Purchase Order)`' + POs: '{abbr}`PO (Purchase Orders)`' + SO: '{abbr}`SO (Sales Order)`' +--- + +# Resupply subcontractor + +In manufacturing, subcontracting is the process of a company engaging a third-party manufacturer, or +subcontractor, to manufacture products that are then sold by the contracting company. + +In Odoo, the *Resupply Subcontractor on Order* route is used to deliver the necessary components for +a subcontracted product to the subcontractor, each time a purchase order (PO) for that product is +confirmed. + +The subcontractor then uses the components to manufacture the desired product, before shipping it +back to the contracting company, or dropshipping it to the end customer. + +:::{important} +It is necessary to understand the differences between the *Resupply Subcontractor on Order* and +the *Dropship Subcontractor on Order* routes. + +While both routes are used to supply a subcontractor with the components required for +manufacturing a product, they differ in how the components are sourced. + +When using *Resupply Subcontractor on Order*, components are shipped from the warehouse of the +contracting company. + +When using *Dropship Subcontractor on Order*, components are purchased from a vendor and shipped +directly to the subcontractor. + +The choice of which route to use depends upon the specific requirements of the subcontracting +company and their subcontractors. + +See the {doc}`subcontracting_dropship` documentation for a full overview of the *Dropship +Subcontractor on Order* route. +::: + +## Configuration + +To use the *Resupply Subcontractor on Order* route, navigate to {menuselection}`Manufacturing app +--> Configuration --> Settings`, and enable the checkbox next to {guilabel}`Subcontracting`, under +the {guilabel}`Operations` heading. + +Once the *Subcontracting* setting is enabled, it is also necessary to properly configure the +subcontracted product, the product's bill of materials (BoM), and the components listed on the +{{ BoM }}. + +(manufacturing-workflows-subcontracting-resupply-product-config)= + +### Configure product + +To configure a product for the *Resupply Subcontractor on Order* route, navigate to +{menuselection}`Inventory app --> Products --> Products`, and select a product, or create a new one +by clicking {guilabel}`New`. + +Select the {guilabel}`Purchase` tab, and add the product's subcontractor as a vendor by clicking +{guilabel}`Add a line`, selecting the subcontractor in the {guilabel}`Vendor` drop-down menu, and +entering a price in the {guilabel}`Price` field. + +:::{note} +The value entered in the {guilabel}`Price` field on the {guilabel}`Purchase` tab of the of the +subcontracted product's page is the amount paid to the subcontractor for the manufacturing of the +product. + +This does not represent the total cost of the product, which includes other elements, like the +cost of the product's components. +::: + +Then, click on the {guilabel}`Inventory` tab to configure a route that determines what happens to +the finished product, once it has been manufactured by the subcontractor. + +If the finished product is shipped back to the contracting company, make sure that the +{guilabel}`Buy` route is selected. In addition, select the {guilabel}`Replenish on Order (MTO)` +route to automatically create a {{ PO }} for the product upon confirmation of a sales order (SO), unless +there is enough stock on-hand to fulfill the {{ SO }}. + +If the finished product is shipped directly to the customer by the subcontractor, make sure that +only the {guilabel}`Dropship` route is selected. + +### Configure BoM + +To configure a {{ BoM }} for the *Resupply Subcontractor on Order* route, click the {guilabel}`Bill of +Materials` smart button on the product's page, and select the {{ BoM }}. + +Alternatively, navigate to {menuselection}`Manufacturing app --> Products --> Bills of Materials`, +and select the {{ BoM }} for the subcontracted product. + +:::{seealso} +For a full overview of {{ BoM }} configuration, see the {doc}`Bill of materials +<../basic_setup/bill_configuration>` documentation. +::: + +In the {guilabel}`BoM Type` field, select the {guilabel}`Subcontracting` option. Then, add one or +more subcontractors in the {guilabel}`Subcontractors` field that appears below. + +```{image} subcontracting_resupply/bom-type.png +:align: center +:alt: The "BoM Type" field on a BoM, configured to manufacture the product using subcontracting. +``` + +Finally, make sure that all necessary components are specified on the {guilabel}`Components` tab. To +add a new component, click {guilabel}`Add a line`, select the component in the {guilabel}`Component` +drop-down menu, and specify the required quantity in the {guilabel}`Quantity` field. + +### Configure components + +To configure components for the *Resupply Subcontractor on Order* route, navigate to each component +from the {{ BoM }} by selecting the component's name in the {guilabel}`Components` tab, and clicking the +{guilabel}`➡️ (right arrow)` button to the right of the name. + +Alternatively, navigate to each component by going to {menuselection}`Inventory app --> Products --> +Products`, and selecting the component. + +On the component product form, click on the {guilabel}`Inventory` tab and select the +{guilabel}`Resupply Subcontractor on Order` route in the {guilabel}`Routes` section. + +Repeat the process for every component that must be sent to the subcontractor. + +## Resupply subcontractor on order workflow + +The resupply subcontractor on order workflow consists of up to five steps: + +1. Create an {{ SO }} for the subcontracted product; doing so creates a {{ PO }} to purchase the product + from the subcontractor. +2. Confirm the {{ PO }} created in the previous step, or create a new {{ PO }}; doing so creates a *Resupply + Subcontractor* order, as well as a receipt order or a dropship order. +3. Process the *Resupply Subcontractor* order once components for the subcontracted product have + been sent to the subcontractor. +4. Process the receipt once the subcontractor has finished manufacturing the subcontracted product, + and shipped it back to the contracting company **OR** process the dropship order to ship the + product directly to the customer. +5. If the workflow was started by creating an {{ SO }}, and the finished product is not dropshipped to + the end customer, process the delivery order once the product is shipped to the customer. + +The specific number of steps depends on the reason that the subcontracted product is being purchased +from the subcontractor. + +If the reason is to fulfill a specific customer order, the process starts with creating an {{ SO }}, and +ends with delivering the product to the customer, or having the subcontractor dropship it to them. + +If the reason is to increase the quantity of stock on-hand, the process starts with creating a {{ PO }}, +and ends with receiving the product into inventory. + +:::{important} +While the *Resupply Subcontractor on Order* route can be used to automatically resupply a +subcontractor upon confirmation of a {{ PO }}, it is also possible to create a resupply order +manually. This workflow is useful when it is necessary to resupply the subcontractor without +creating a {{ PO }}. + +To resupply a subcontractor manually, navigate to the {menuselection}`Inventory` app, and click +on the {guilabel}`Resupply Subcontractor` card. Create a new *Resupply Subcontractor* order by +clicking {guilabel}`New`. + +In the {guilabel}`Delivery Address` field, select the subcontractor to whom the components should +be sent. + +Then, add each component to the {guilabel}`Operations` tab by clicking {guilabel}`Add a line`, +selecting the component in the {guilabel}`Product` drop-down field, and specifying a quantity in +the {guilabel}`Demand` field. + +Finally, click {guilabel}`Mark as Todo` to register the order. Once the components have been sent +to the subcontractor, click {guilabel}`Validate` to confirm that the order has been sent. +::: + +### Create SO + +It is only necessary to complete this step if the product is being purchased from the subcontractor +to fulfill a customer need. If the product is being purchased to increase the quantity of stock +on-hand, move on to the next step. + +To create a new {{ SO }}, navigate to {menuselection}`Sales app --> Orders --> Orders`, and click +{guilabel}`New`. + +Select the customer in the {guilabel}`Customer` drop-down menu. Then, click {guilabel}`Add a +product` on the {guilabel}`Order Lines` tab, select a subcontracted product in the +{guilabel}`Product` drop-down menu, and enter a quantity in the {guilabel}`Quantity` field. + +Click {guilabel}`Confirm` to confirm the {{ SO }}, at which point a {guilabel}`Purchase` smart button +appears at the top of the page. This opens the {{ PO }} created to purchase the subcontracted product +from the subcontractor. + +:::{note} +An {{ SO }} for the product only creates a {{ PO }} if the *Replenish on Order (MTO)* route is enabled on +the product's page, **and** there is not enough stock of the product on-hand to fulfill the {{ SO }}. + +If there is enough stock on-hand, confirming an {{ SO }} for the product instead creates a delivery +order, because Odoo assumes that the {{ SO }} is fulfilled using the stock in the warehouse. + +This is not the case for subcontracted products that are dropshipped to the end customer. In that +case, a {{ PO }} is **always** created, even if there is enough stock on-hand. +::: + +### Process PO + +If a {{ PO }} was created in the previous step, navigate to {guilabel}`Purchase app --> Orders --> +Purchase Orders`, and select the {{ PO }}. Then, click {guilabel}`Confirm Order` to confirm it. + +If a {{ PO }} was not created in the previous step, do so now by navigating to {menuselection}`Purchase +app --> Orders --> Purchase Orders`, and clicking {guilabel}`New`. + +Begin filling out the {{ PO }} by selecting a subcontractor from the {guilabel}`Vendor` drop-down menu. +In the {guilabel}`Products` tab, click {guilabel}`Add a product` to create a new product line. +Select a subcontracted product in the {guilabel}`Product` field, and enter the quantity in the +{guilabel}`Quantity` field. Finally, click {guilabel}`Confirm Order` to confirm the {{ PO }}. + +When a {{ PO }} is confirmed for a product that requires resupplying a subcontractor with components, a +receipt or dropship order is automatically created, and can be accessed from the corresponding +{guilabel}`Receipt` or {guilabel}`Dropship` smart button that appears at the top of the {{ PO }}. + +In addition, a *Resupply Subcontractor* order is created to ship the required components to the +subcontractor. This order can also be accessed from the {{ PO }}, by clicking the {guilabel}`Resupply` +smart button at the top of the page. + +:::{figure} subcontracting_resupply/subcontractor-po.png +:align: center +:alt: |- +: A PO for a *Resupply Subcontractor on Order* product, with Resupply and Receipt smart +: buttons at the top of the page. + +A PO for a *Resupply Subcontractor on Order* product, with Resupply and Receipt smart buttons at +the top of the page. +::: + +### Process Resupply Subcontractor order + +Once the subcontracted product's components have been sent to the subcontractor, navigate to +{menuselection}`Purchase app --> Orders --> Purchase Orders`, and select the {{ PO }}. + +Click the {guilabel}`Resupply` smart button at the top of the screen to open the *Resupply +Subcontractor* order, and click {guilabel}`Validate` to confirm that the components have been sent +to the subcontractor. + +Alternatively, navigate to the {menuselection}`Inventory` app, click the {guilabel}`# To Process` +button on the {guilabel}`Resupply Subcontractor` card, and select the *Resupply Subcontractor* +order. Then, click {guilabel}`Validate` to confirm that the components have been sent to the +subcontractor. + +### Process receipt or dropship order + +Once the subcontractor has finished manufacturing the product, they either ship it to the +contracting company, or dropship it to the end customer, depending on how the product was +{ref}`configured `. + +#### Process receipt + +If the subcontractor ships the finished product to the contracting company, once it has been +received, navigate to {menuselection}`Purchase app --> Orders --> Purchase Orders`, and select the +{{ PO }}. + +Click the {guilabel}`Receive Products` button at the top of the {{ PO }}, or the {guilabel}`Receipt` +smart button at the top of the page, to open the receipt. Then, click {guilabel}`Validate` at the +top of the receipt to enter the product into inventory. + +#### Process dropship order + +If the subcontractor dropships the product, once they have sent it, navigate to +{menuselection}`Purchase app --> Orders --> Purchase Orders`, and select the {{ PO }}. + +Select the {guilabel}`Dropship` smart button at the top of the page to open the dropship order, and +click {guilabel}`Validate` at the top of the order to confirm that the product has been sent to the +customer. + +### Process delivery order + +If the subcontracting workflow was started by a customer {{ SO }}, and the finished product was **NOT** +dropshipped to the customer, but rather delivered to the contracting company, it is necessary to +ship the product to the customer, and process the delivery order. + +Once the product has been shipped to the customer, navigate to the {menuselection}`Sales` app, and +select the {{ SO }}. Select the {guilabel}`Delivery` smart button at the top of the page to open the +delivery order, and click {guilabel}`Validate` on the order to confirm that the product has been +shipped to the customer. + diff --git a/content/applications/inventory_and_mrp/manufacturing/workflows.md b/content/applications/inventory_and_mrp/manufacturing/workflows.md new file mode 100644 index 000000000..13394edfc --- /dev/null +++ b/content/applications/inventory_and_mrp/manufacturing/workflows.md @@ -0,0 +1,20 @@ +--- +nosearch: true +--- + +# Workflows + +```{toctree} +:titlesonly: true + +workflows/use_mps +workflows/work_center_time_off +workflows/scrap_manufacturing +workflows/manufacturing_backorders +workflows/split_merge +workflows/unbuild_orders +workflows/byproducts +workflows/continuous_improvement +workflows/manufacture_lots_serials +``` + diff --git a/content/applications/inventory_and_mrp/manufacturing/workflows/byproducts.md b/content/applications/inventory_and_mrp/manufacturing/workflows/byproducts.md new file mode 100644 index 000000000..e68fb8f9e --- /dev/null +++ b/content/applications/inventory_and_mrp/manufacturing/workflows/byproducts.md @@ -0,0 +1,80 @@ +--- +substitutions: + BoM: '{abbr}`BoM (bill of materials)`' + BoMs: '{abbr}`BoMs (bills of materials)`' + MO: '{abbr}`MO (manufacturing order)`' +--- + +# By-Products + +When manufacturing certain products, it is common to be left with residual materials, in addition to +the finished product. These materials are known as *by-products*. By specifying the by-products +created during manufacturing on a product's bill of materials (BoM), the quantity of by-products +on-hand is tracked by Odoo. + +```{eval-rst} +.. example:: + Manufacturing a *rocking chair* requires ten pieces of wood. During production, five pieces of + *scrap wood* are created, in addition to the rocking chair. By designating the scrap wood as a + by-product on the rocking chair's |BoM|, Odoo tracks the on-hand count of scrap wood, as well as + the quantity of rocking chairs produced. +``` + +## Configuration + +To specify by-products on a product's {{ BoM }}, the *By-Products* setting **must** be enabled. To do +so, navigate to {menuselection}`Manufacturing app --> Configuration --> Settings`, and tick the +{guilabel}`By-Products` checkbox, located under the {guilabel}`Operations` heading. Then, click +{guilabel}`Save` to apply the change. + +```{image} byproducts/byproducts-setting.png +:align: center +:alt: The By-Products setting on the Manufacturing app settings page. +``` + +With the {guilabel}`By-Products` setting enabled, a {guilabel}`By-products` tab appears on product +{{ BoMs }}. + +## Add byproduct to BoM + +To add by-products to a {{ BoM }}, navigate to {menuselection}`Manufacturing app --> Products --> Bills +of Materials`, and select a {{ BoM }}. + +On the {{ BoM }}, select the {guilabel}`By-products` tab. Click {guilabel}`Add a line`, and select the +by-product in the {guilabel}`By-product` drop-down field. In the {guilabel}`Quantity` field, enter +the quantity of the by-product produced during manufacturing. + +If the by-product is produced during a specific operation of a manufacturing order (MO), select the +operation in the {guilabel}`Produced in Operation` field. For example, if a scrap wood by-product is +produced during an *Assemble* operation, select that operation in the {guilabel}`Produced in +Operation` field. + +```{image} byproducts/byproducts-tab.png +:align: center +:alt: The By-Products tab on a BoM, configured with a "Scrap Wood" by-product. +``` + +## Manufacture by-product + +When an {{ MO }} is completed and marked as *Done*, Odoo registers the quantity of by-products created +during the manufacturing process. To create a new {{ MO }}, navigate to {menuselection}`Manufacturing +app --> Operations --> Manufacturing Orders`, and click {guilabel}`New`. + +In the {guilabel}`Bill of Material` field, select a {{ BoM }} on which by-products have been specified. +After doing so, the {guilabel}`Product` field auto-populates with the corresponding product. Click +{guilabel}`Confirm` to confirm the {{ MO }}. + +When manufacturing is completed, click the {guilabel}`Produce All` button at the top of the {{ MO }}. +After doing so, inventory counts update to reflect the quantity of by-product(s) produced, as well +as the quantity of the product. + +Click the {guilabel}`Product Moves` smart button at the top of the {{ MO }} page to see the movements of +components and products. Each by-product is listed on the resulting {guilabel}`Inventory Moves` +page, with the {guilabel}`From` column displaying the virtual production location, and the +{guilabel}`To` column displaying the location where the by-product is stored. + +```{image} byproducts/product-moves.png +:align: center +:alt: The Product Moves page for an MO with by-products. +``` + diff --git a/content/applications/inventory_and_mrp/manufacturing/workflows/continuous_improvement.md b/content/applications/inventory_and_mrp/manufacturing/workflows/continuous_improvement.md new file mode 100644 index 000000000..3f9c06199 --- /dev/null +++ b/content/applications/inventory_and_mrp/manufacturing/workflows/continuous_improvement.md @@ -0,0 +1,245 @@ +--- +substitutions: + BoM: '{abbr}`BoM (Bill of Materials)`' + BoMs: '{abbr}`BoMs (Bills of Materials)`' + ECO: '{abbr}`ECO (Engineering Change Order)`' + MO: '{abbr}`MO (Manufacturing Order)`' + MOs: '{abbr}`MOs (Manufacturing Orders)`' + PLM: '{abbr}`PLM (Product Lifecycle Management)`' + QCP: '{abbr}`QCP (Quality Control Point)`' +--- + +# Continuous product improvement + +*Continuous improvement* is a general philosophy intended to help individuals and organizations +constantly improve themselves and the work they produce. + +There are a variety of different methodologies that fall under the umbrella of continuous +improvement. These include kaizen, six sigma, and lean, among others. While the specific steps of +each method differ, their goal remains the same: implement a process by which improvement is a +perpetual goal, rather than a one-time accomplishment. + +The sections below contain details about how Odoo can be used to implement four general steps common +to many of the most popular continuous improvement strategies, with links to documentation about +configuring the necessary features. The final section details how a specific company might configure +these Odoo implementations within their organization. + +1. {ref}`manufacturing/workflows/ci-identify` +2. {ref}`manufacturing/workflows/ci-suggest` +3. {ref}`manufacturing/workflows/ci-implement` +4. {ref}`manufacturing/workflows/ci-review` + +:::{important} +Continuous improvement is not a one-size-fits-all methodology. While most strategies include +between four and six steps, proper implementation requires developing a system tailored to the +specific needs of each company. + +This is not a limitation, but rather a benefit, as it makes the methodology flexible enough to +adapt to almost any use case. Odoo, in particular, adapts well to this flexibility, as it can be +configured to meet the needs of almost any workflow. + +As such, it is important to remember the content below only provides *examples* of how Odoo +*might* be used. They should be viewed as more of a starting point, rather than a concrete +outline that every organization must follow. +::: + +(manufacturing-workflows-ci-identify)= + +## Identify problems + +Before improvement can begin, it is necessary to determine where improvement is necessary. This is +where identifying problems comes into play. Two of the best Odoo apps for identifying problems with +products or processes are *Helpdesk* and *Quality*. + +### Helpdesk + +The *Helpdesk* app is useful for receiving feedback from outside of the organization, like from +clients or customers. This is accomplished by implementing one (or more) of the methods for +{doc}`receiving tickets <../../../services/helpdesk/overview/receiving_tickets>`, including email +aliases, live chat conversations, and website forms. + +Using these methods, customers can submit feedback about problems, which is then reviewed by a +member of a {doc}`helpdesk team <../../../services/helpdesk>`. Depending on the outcome of the +review, the team member may decide to take further action to ensure the issue is addressed. This can +include creating a {doc}`quality alert <../../quality/quality_management/quality_alerts>`. + +### Quality + +The *Quality* app is useful for receiving feedback from *within* the organization, like from +employees. + +One method for accomplishing this is to set up a {doc}`quality control point +<../../quality/quality_management/quality_control_points>` (QCP). A {{ QCP }} is used to automatically +create quality checks at regular intervals, prompting employees to inspect, and confirm, the quality +of a product. + +If an issue is found, an employee can then create a {doc}`quality alert +<../../quality/quality_management/quality_alerts>` to notify a quality team. Quality alerts can also +be created independent of a {{ QCP }}, in the event that an employee discovers an issue without being +prompted to check for one. This is a great way for customer support employees to notify a quality +team of an issue brought to their attention by a customer ticket. + +(manufacturing-workflows-ci-suggest)= + +## Suggest improvements + +Once a problem is identified, the next step is to put forward ideas for how to address the problem. +As with identifying problems, the *Quality app* is also useful for suggesting improvements. In +addition, the *PLM* (*Product Lifecycle Management*) app can be used for this purpose, as well. + +### Quality + +When creating a {doc}`quality alert <../../quality/quality_management/quality_alerts>` to bring an +issue to the attention of a quality team, the {guilabel}`Corrective Actions` and +{guilabel}`Preventive Actions` tabs can be used to provide feedback about how the issue can be +addressed. + +The {guilabel}`Corrective Actions` tab is used to suggest a method for fixing items affected by the +issue. For example, `Screw the bolts on tighter, so the seat stays in place`. + +The {guilabel}`Preventive Actions` tab is used to suggest a method for preventing the issue from +occurring in the future. For example, `Do not tighten the screws too much, or they will be +stripped`. + +The quality team that reviews the alert sees these suggested actions, and can take them into account +when deciding how to address the issue. + +### PLM + +The {{ PLM }} app is used to manage the lifecycle of a product from its introduction through each +successive version. As such, it is useful for testing ideas for product improvements. + +Using {doc}`engineering change orders <../../plm/manage_changes/engineering_change_orders>`, product +management teams can create new iterations of product {{ BoMs }}, adding or removing specific components +or operations, as needed. The products created using these {{ BoMs }} are put through a review process +to confirm the effectiveness of the changes. + +(manufacturing-workflows-ci-implement)= + +## Implement strategies + +Implementing strategies involves putting the proposed solutions from the suggest improvements step +into action. The {{ PLM }} app continues to be useful during this step, as it can be configured to make +{{ BoM }} updates. The *Field Service* app can also be used by certain companies to make improvements to +products that have already been sold to customers. + +### PLM + +Once {{ BoM }} changes have gone through the proper review process, they can be approved, and the +updated {{ BoM }} put into use. This is accomplished by configuring one of the {{ ECO }} review stages to +{ref}`apply the changes ` made to the {{ BoM }}, at which point the updated {{ BoM }} +becomes available for new {{ MOs }}. + +Product {{ BoMs }} can continue to be updated, as needed. The {doc}`version control +<../../plm/manage_changes/version_control>` features of the {{ PLM }} app allow for easy management of +all versions of a given {{ BoM }}. + +### Field Service + +The {{ PLM }} app is a great way to make changes to product {{ BoMs }}. However, these changes only affect +products produced using the new {{ BoM }}. If a defective product has already been sold to a customer, +it may be necessary to repair (or update) that product. + +In such a case, the *Field Service* app can be used to schedule {doc}`onsite interventions +<../../../services/field_service/creating_tasks>`. These interventions allow service +technicians (or other employees) to be sent to a customer's location to address an issue with a +product. + +(manufacturing-workflows-ci-review)= + +## Review actions + +Reviewing actions is where the "continuous" part of continuous improvement comes into play, as it +allows an organization to evaluate the decisions made in the previous steps. As such, this step is, +essentially, returning to the beginning of the process, so that additional problems can be +identified and addressed. + +This means that the *Helpdesk* and *Quality* apps should be used again to receive customer and +employee feedback. Another app that may be useful at this stage is the *Surveys* app. + +### Surveys + +After implementing changes to a product or process, it may be wise to solicit customers for their +feedback directly, rather than waiting to hear from them of their own volition. This may bring to +light feedback that customers may have otherwise neglected to share. + +One of the best ways to accomplish this is through the {doc}`Surveys <../../../marketing/surveys>` +app. Creating a survey, and sending it to customers who receive an updated product, increases the +likelihood of receiving relevant feedback about the product. + +:::{admonition} Example workflow: coat rack product improvement +:class: alert alert-success + +*Wood Hut* is a manufacturer of fine wood products. They are committed to manufacturing products +of the highest-possible quality, and are always looking for ways to improve the products they +sell, along with the processes used to create them. + +Wood Hut uses the Odoo platform to manage every element of their production, fulfillment, and +customer satisfaction processes. They have developed a custom product improvement workflow that +incorporates the Helpdesk, Quality, PLM, and Manufacturing apps. + +One of Wood Hut's most popular products is their *coat rack*. It's made entirely of oak, and +customers describe it as "sleek and elegant." However, recent customer feedback about the coat +rack has brought attention to quality issues that necessitate revising the current manufacturing +process. + +The product revision workflow begins when the customer service team receives a ticket in the +Helpdesk app from a customer having problems with the coat rack she purchased. The customer, +Abigail Peterson, has found that her coat rack falls over when more than five coats are hanging +from it. This is a major issue, as the coat rack has enough dowels for six coats. + +```{image} continuous_improvement/helpdesk-ticket.png +:align: center +:alt: A Helpdesk ticket about an issue with the coat rack product. +``` + +Marc, the customer service employee assigned to the helpdesk ticket, opens the Quality app, and +creates a new quality alert. He tags the *Production Quality Team* and assigns Julie Andreson as +the quality employee responsible for the alert. + +Julie reviews the alert, and consults with her team about the best course of action. They decide +that it is necessary to revise the product's {{ BoM }} to prevent the issue from occurring in the +future, which Julie notes in the {guilabel}`Corrective Actions` tab of the quality alert. + +```{image} continuous_improvement/quality-alert.png +:align: center +:alt: A quality alert created about the issue with the coat rack product. +``` + +Then, Julie messages product engineer, Joe Kazan in the chatter of the quality alert to bring it +to his attention. Joe opens the {{ PLM }} app and creates a new {{ ECO }}, noting the problem with the +coat rack, and suggesting that a change to the product's {{ BoM }} may be necessary. + +```{image} continuous_improvement/eco.png +:align: center +:alt: An ECO created to update the coat rack product's BoM. +``` + +Joe clicks {guilabel}`Start Revision`, and then the {guilabel}`Revision` smart button to open +version two of the coat rack's {{ BoM }}. This {{ BoM }} was created alongside the {{ ECO }}, and remains +archived until it is approved. + +After some testing, Joe discovers that adding a metal *support rod* to the coat rack strengthens +it, allowing the rack to hold six or more coats without falling over. He updates the {{ BoM }} to +include the support rod as one of the components, and adds an extra operation to make sure it is +installed during the manufacturing process. Finally, he leaves a message in the chatter of the +{{ ECO }}, letting his manager, Jose, know that it is ready for review. + +```{image} continuous_improvement/bom.png +:align: center +:alt: The coat rack BoM, updated to add an extra component and operation. +``` + +Jose reviews the changes, and confirms they are an effective method for addressing the problem +with the coat rack. He moves the {{ ECO }} to the *Approved* stage, which makes version two of the +coat rack {{ BoM }} the current version. + +Now, each time an {{ MO }} is created to produce a coat rack, the updated {{ BoM }} is automatically +selected. Wood Hut begins producing the improved coat rack, and customer feedback confirms that +the new version has addressed the problem with its predecessor. + +Using the Odoo platform, Wood Hut has implemented an end-to-end product improvement process. +Since the essential elements of this process (customer feedback, quality control, etc.) are +always functioning, it can be reused to continuously update products and processes. +::: + diff --git a/content/applications/inventory_and_mrp/manufacturing/workflows/manufacture_lots_serials.md b/content/applications/inventory_and_mrp/manufacturing/workflows/manufacture_lots_serials.md new file mode 100644 index 000000000..5a2834ce5 --- /dev/null +++ b/content/applications/inventory_and_mrp/manufacturing/workflows/manufacture_lots_serials.md @@ -0,0 +1,141 @@ +--- +substitutions: + MO: '{abbr}`MO (Manufacturing Order)`' + MOs: '{abbr}`MOs (Manufacturing Orders)`' +--- + +# Manufacture with lots and serial numbers + +In Odoo, *lot numbers* and *serial numbers* are used to identify and track products in Odoo. Serial +numbers are used to assign unique numbers to individual products, while lot numbers are used to +assign a single number to multiple units of a specific product. + +When manufacturing products tracked using lots or serial numbers, Odoo requires the lot or serial +number to be assigned to each product before manufacturing can be completed. This ensures that each +product is properly tracked from the moment it enters inventory. + +## Configure products for tracking + +By default, Odoo tracks the quantity of each product on hand, but does not track individual units of +a product. Lot or serial number tracking must be enabled for each product individually. + +To track a product using lots or serial numbers, begin by navigating to {menuselection}`Inventory +--> Configuration --> Settings`, then scroll down to the {guilabel}`Traceability` section, and tick +the {guilabel}`Lots & Serial Numbers` checkbox. Finally, click {guilabel}`Save` to save the change. + +Next, click on {menuselection}`Products --> Products`, and select a product to track. Make sure the +{guilabel}`Track Inventory` checkbox is ticked in the {guilabel}`General Information` tab. Since lot +and serial number functionality is enabled, a drop-down menu appears next to the ticked checkbox. + +Click on the {guilabel}`Track Inventory` drop-down menu. By default, {guilabel}`By Quantity` is +selected, which only tracks the quantity on hand. Select {guilabel}`By Lots` to track the product +using lot numbers, or {guilabel}`By Unique Serial Number` to track the product using serial numbers. + +:::{seealso} +{doc}`Lots <../../inventory/product_management/product_tracking/lots>` +{doc}`Serial numbers <../../inventory/product_management/product_tracking/serial_numbers>` +::: + +## Lot number manufacturing + +To manufacture a product tracked with lots, begin by navigating to {menuselection}`Manufacturing --> +Operations --> Manufacturing Orders`. Click {guilabel}`New` to create a new manufacturing order +(MO). + +In the {guilabel}`Product` field, select a product tracked using lots, and enter the desired +{guilabel}`Quantity`. Click {guilabel}`Confirm` to confirm the {{ MO }}. + +Once the {{ MO }} is confirmed, a {guilabel}`Lot/Serial Number` field appears in the top section of the +{{ MO }} form. By default, this field is empty. + +To populate the {guilabel}`Lot/Serial Number` field with a lot number, click the +{icon}`fa-plus-square-o` {guilabel}`(plus)` icon to the right of the field. Doing so automatically +generates a lot, using the next available number, and enters it in the field. + +Alternatively, click on the {guilabel}`Lot/Serial Number` field and select an existing lot number, +or manually enter a new lot number and click {guilabel}`Create "#"` in the drop-down menu. + +```{image} manufacture_lots_serials/lot-sn-field.png +:alt: The "Lot/Serial Number" field on an MO. +``` + +Either of these methods assign the product(s) in the {{ MO }} a lot number before production is +finished. It is also possible to complete production and close the {{ MO }} by clicking +{guilabel}`Produce All`, without assigning a lot number. Doing so automatically generates and +assigns a lot, using the next available number. + +## Serial number manufacturing + +To manufacture a product tracked with serial numbers, begin by navigating to +{menuselection}`Manufacturing --> Operations --> Manufacturing Orders`. Click {guilabel}`New` to +create a new {{ MO }}. + +In the {guilabel}`Product` field, select a product tracked using serial numbers, and enter the +desired {guilabel}`Quantity`. Click {guilabel}`Confirm` to confirm the {{ MO }}. + +Once the {{ MO }} is confirmed, a {guilabel}`Lot/Serial Number` field appears in the top section of the +{{ MO }} form. By default, this field is empty. + +The rest of the manufacturing process depends on how many units the {{ MO }} contains. + +### Manufacture single unit + +If a single unit of the product is being manufactured, clicking {guilabel}`Produce All` closes the +{{ MO }}, and automatically generates and assigns the next available serial number, which appears in the +{guilabel}`Lot/Serial Number` field. + +To assign a serial number without closing the {{ MO }}, enter a number manually in the +{guilabel}`Lot/Serial Number` field, and click {guilabel}`Create "#"`, or click the +{icon}`fa-plus-square-o` {guilabel}`(plus)` icon to the right of the field to auto-fill it with the +next available number. + +```{image} manufacture_lots_serials/lot-sn-field.png +:alt: The "Lot/Serial Number" field on an MO. +``` + +### Manufacture multiple units + +:::{important} +When manufacturing a product tracked using serial numbers, an {{ MO }} can be created for multiple +units. However, when serial numbers are assigned to each unit, either at the end of production or +before, the {{ MO }} is split into multiple {{ MOs }}, each containing one unit of the product. + +Each of the split {{ MOs }} is identified by a numerical tag added to the end of the original {{ MO }} +number. + +```{eval-rst} +.. example:: + |MO| `WH/MO/00109` contains two units of a `Chair`, a product tracked using serial numbers. A + serial number is assigned to each unit of the chair. This causes the |MO| to be split into two + |MOs|, each containing one unit of the chair. The |MOs| are titled `WH/MO/00109-001` and + `WH/MO/00109-002`. +``` +::: + +To assign serial numbers to each unit of an {{ MO }}, click {guilabel}`Produce All` to open the +{guilabel}`Batch Production` pop-up window. + +The {guilabel}`First Lot/SN` field of the pop-up window is auto-filled with the next available +serial number. The {guilabel}`Number of SN` field defaults to the number of units being +manufactured. The values of either field can be changed manually. + +Click {guilabel}`Generate` to generate the specified number of serial numbers, beginning with the +number entered in the {guilabel}`First Lot/SN` field. The serial numbers are displayed in the text +box at the bottom of the pop-up window, and can be manually changed after generation. + +To assign serial numbers without completing production, click the {guilabel}`Prepare MO` button. +Doing so splits the {{ MO }} into individual {{ MOs }}, one for each unit in the original {{ MO }}. Each {{ MO }} is +left open, and can be closed individually. + +To assign serial numbers and complete production, click the {guilabel}`Produce` button. Doing so +splits the {{ MO }} into individual {{ MOs }}, one for each unit in the original {{ MO }}. All of the {{ MOs }} are +closed, since production is complete. + +```{image} manufacture_lots_serials/batch-production.png +:alt: The "Batch Production" pop-up window, from which serial numbers can be assigned. +``` + +After clicking {guilabel}`Prepare MO` or {guilabel}`Produce`, the {menuselection}`Manufacturing` app +automatically shows the first of the split {{ MOs }} (ex. `WH/MO/00109-001`). To view and access the +rest the split {{ MOs }}, click the {guilabel}`Backorders` smart button at the top of the screen. + diff --git a/content/applications/inventory_and_mrp/manufacturing/workflows/manufacturing_backorders.md b/content/applications/inventory_and_mrp/manufacturing/workflows/manufacturing_backorders.md new file mode 100644 index 000000000..9dcc4737a --- /dev/null +++ b/content/applications/inventory_and_mrp/manufacturing/workflows/manufacturing_backorders.md @@ -0,0 +1,139 @@ +--- +substitutions: + MO: '{abbr}`MO (Manufacturing Order)`' +--- + +# Manufacturing backorders + +In some cases, the full quantity of a manufacturing order cannot be produced immediately. When this +happens, Odoo *Manufacturing* allows for the manufacturing of partial quantities of the order and +creates a *backorder* for the remaining amount. + +In the *Manufacturing* app, creating a backorder splits the original manufacturing order into two +orders. The reference tag for each order is the tag used for the original order, followed by a +hyphen and then an additional number to indicate that it's a backorder. + +```{eval-rst} +.. example:: + A company creates a manufacturing order with the reference tag *WH/MO/00175*, for 10 units of + *Product X*. After starting work on the manufacturing order, the employee working the production + line realizes there are only enough components in stock to produce five units of the product. + + Instead of waiting for additional stock of the components, they manufacture five units and create + a backorder for the remaining five. This splits the manufacturing order into two separate orders: + *WH/MO/00175-001* and *WH/MO/00175-002*. + + Order *001* contains the five units that have been manufactured, and is immediately marked as + :guilabel:`Done`. Order *002* contains the five units that still need to be manufactured and is + marked as :guilabel:`In Progress`. Once the remaining components are available, the employee + returns to order *002* and manufactures the remaining units before closing the order. +``` + +## Create a manufacturing backorder + +To create a backorder for part of a manufacturing order, begin by navigating to +{menuselection}`Manufacturing --> Operations --> Manufacturing Orders`. Select a manufacturing order +with a quantity of two or more or create one by clicking {guilabel}`Create`. + +If a new manufacturing order is created, select a product from the {guilabel}`Product` drop-down +menu and enter a quantity of two or more in the {guilabel}`Quantity` field, then click +{guilabel}`Confirm` to confirm the order. + +After manufacturing the quantity that is being produced immediately, enter that number in the +{guilabel}`Quantity` field at the top of the manufacturing order. + +```{image} manufacturing_backorders/quantity-field.png +:align: center +:alt: The quantity field on a manufacturing order. +``` + +Next, click {guilabel}`Validate`, and a {guilabel}`You produced less than initial demand` pop-up +window appears, from which a backorder can be created. Click {guilabel}`Create Backorder` to split +the manufacturing order into two separate orders, with the reference tags *WH/MO/XXXXX-001* and +*WH/MO/XXXXX-002*. + +```{image} manufacturing_backorders/create-backorder-button.png +:align: center +:alt: The Create Backorder button on the "You produced less than initial demand" pop-up +: window. +``` + +Order *001* contains the items that have been manufactured, and is closed immediately. Order *002* +is the backorder that contains the items that have yet to be manufactured, and remains open, to be +completed at a later date. + +Once the remaining units can be manufactured, navigate to {menuselection}`Manufacturing --> +Operations --> Manufacturing Orders`, and then select the backorder manufacturing order. If all of +the remaining units are manufactured immediately, simply click {guilabel}`Validate` to close the +order. + +If only some of the remaining units are manufactured immediately, create another backorder for the +remainder by following the steps detailed in this section. + +## Create a backorder in Shop Floor + +Backorders for manufacturing orders can also be created from the *Shop Floor* module. + +:::{note} +In order to use the *Shop Floor* module, the *Work Orders* setting must be enabled. To do so, +navigate to {menuselection}`Manufacturing --> Configuration --> Settings`, enable the +{guilabel}`Work Orders` checkbox, and then click {guilabel}`Save`. +::: + +To create a backorder from the *Shop Floor* module, begin by navigating to +{menuselection}`Manufacturing --> Operations --> Manufacturing Orders`. Select an {{ MO }} for multiple +units of a product, for which a backorder needs to be created. + +On the {{ MO }}, select the {guilabel}`Work Orders` tab, and then click the {guilabel}`Open Work Order +(external link icon)` button on the line of the work order to be processed. On the resulting +{guilabel}`Work Orders` pop-up window, click the {guilabel}`Open Shop Floor` button to open the +*Shop Floor* module. + +When accessed from a specific work order, the *Shop Floor* module opens to the page for the work +center where the order is configured to be processed, and isolates the work order's card so that no +other cards are shown. + +Complete the steps on the work order's card until the {guilabel}`Register Production` step is +reached, and then click on it to open the {guilabel}`Register Production` pop-up window. + +:::{important} +Do **not** click the {guilabel}`# Units` button on the right side of the step. Doing so +automatically registers the full amount of units as having been produced. +::: + +On the {guilabel}`Register Production` pop-up window, enter the number of units produced in the +{guilabel}`Quantity` field. Make sure the number entered is *less* than the number of units listed +to the right of the field. Then, click {guilabel}`Validate`. + +```{image} manufacturing_backorders/register-production.png +:align: center +:alt: The Register Production pop-up window in the Shop Floor module. +``` + +The pop-up window disappears and the {guilabel}`# Units` button on the work order's card updates to +reflect the number of units produced, as a fraction of the number of units for which the {{ MO }} was +originally created. + +Next, click the {guilabel}`Mark as Done` button at the bottom-right of the work order's card. The +work order card begins to fade away. Once it disappears completely, a new work order card appears, +titled with the original {{ MO }}'s reference number with a `-002` tag added to the end of it. + +This new reference number represents the backorder {{ MO }}. The original {{ MO }}'s reference number now +appears with a `-001` tag added to the end of it to distinguish it from the backorder {{ MO }}. + +If the original {{ MO }} has no remaining work orders, it can be closed by selecting the {guilabel}`All` +filter in the top navigation of the *Shop Floor* module, and then clicking {guilabel}`Close +Production` at the bottom of the {{ MO }}'s card. + +If the original {{ MO }} has remaining work orders that must be completed before it can be closed, cards +for these work orders appear on the *Shop Floor* pages for the work centers where they are +configured to be carried out. They can be processed as normal, and additional backorders can be +created from their work order cards using the instructions detailed in this section. + +Once the current work order for the backorder {{ MO }} is ready to be processed, this can also be +completed as normal, and an additional backorder can be created from its work order card by +following the instructions detailed in this section. + +After the final work order for the backorder {{ MO }} has been completed, the {{ MO }} can be closed by +clicking the {guilabel}`Close Production` button at the bottom of the work order's card. + diff --git a/content/applications/inventory_and_mrp/manufacturing/workflows/scrap_manufacturing.md b/content/applications/inventory_and_mrp/manufacturing/workflows/scrap_manufacturing.md new file mode 100644 index 000000000..077943cf1 --- /dev/null +++ b/content/applications/inventory_and_mrp/manufacturing/workflows/scrap_manufacturing.md @@ -0,0 +1,105 @@ +--- +substitutions: + MO: '{abbr}`MO (Manufacturing Order)`' +--- + +# Scrap during manufacturing + +During the manufacturing process, the need to scrap manufacturing components or finished products +may arise. This can be necessary if a component or product is damaged, or unusable for any other +reason. + +By default, scrapping a component or finished product removes it from physical inventory and places +it in a virtual location titled *Virtual Locations/Scrap*. A virtual location is **not** a physical +space, but rather a designation in Odoo that is used to track items that are no longer in physical +inventory. + +:::{seealso} +For more information, see the documentation about the different types of {doc}`locations +<../../inventory/warehouses_storage/inventory_management>`. +::: + +Components can be scrapped from both the *Manufacturing* app and the *Shop Floor* module, before the +associated manufacturing order (MO) is closed. Finished products can only be scrapped from the +*Manufacturing* app, and only after closing the associated {{ MO }}. + +:::{tip} +Scrap orders can be viewed by navigating to {menuselection}`Inventory --> Operations --> Scrap`. +Each scrap order shows the date and time the order was created, along with the product and +quantity that was scrapped. + +To view the total quantity of each item scrapped, navigate to {menuselection}`Inventory --> +Configuration --> Locations`, then remove the {guilabel}`Internal` filter from the +{guilabel}`Search...` bar to display all virtual locations. From the list, select the +{guilabel}`Virtual Locations/Scrap` location. +::: + +(manufacturing-management-scrap-window)= + +## Scrap pop-up window + +Scrapping components and finished products is done through the {guilabel}`Scrap` pop-up window. The +pop-up window can be accessed from an {{ MO }} in the backend, or the *Shop Floor* module. + +### Scrap component from Manufacturing + +To scrap a component from an {{ MO }}, begin by navigating to {menuselection}`Manufacturing --> +Operations --> Manufacturing Orders`, and then select an {{ MO }}. At the top of the {{ MO }}, click the +{guilabel}`Scrap` button to open the {guilabel}`Scrap` pop-up window. + +### Scrap finished product from Manufacturing + +To scrap a finished product from an {{ MO }}, begin by navigating to {menuselection}`Manufacturing --> +Operations --> Manufacturing Orders`. Select an open {{ MO }}, and then click the {guilabel}`Produce +All` button to close it. + +To select an {{ MO }} that has already been closed, navigate to {menuselection}`Manufacturing --> +Operations --> Manufacturing Orders`, remove the {guilabel}`To Do` filter from the +{guilabel}`Search...` bar, and then select the desired {{ MO }}. + +Once closed, click the {guilabel}`Scrap` button at the top of the {{ MO }} to open the {guilabel}`Scrap` +pop-up window. + +### Scrap component from Shop Floor + +To scrap a component from the *Shop Floor* module, begin by navigating to {menuselection}`Shop +Floor`. Then, either click the {guilabel}`⋮ (three vertical dots)` button on an {{ MO }} card, or select +a work center from the top navigation, and click the {guilabel}`⋮ (three vertical dots)` button on a +work order card. + +Either method opens the {guilabel}`What do you want to do?` pop-up window. Click the +{guilabel}`Scrap` button on the window to open the {guilabel}`Scrap` pop-up window. + +## Scrap pop-up window + +After opening the scrap pop-up window using one of the methods {ref}`detailed above +`, select the component or finished product being scrapped, +from the {guilabel}`Product` drop-down menu. + +In the {guilabel}`Quantity` field, enter the quantity being scrapped. + +By default, the {guilabel}`Source Location` field is set to the warehouse's pre-production location, +while the {guilabel}`Scrap Location` field is set to the {guilabel}`Virtual Locations/Scrap` +location. If either the source or scrap location should be changed, select a different location from +their respective drop-down menus. + +Enable the {guilabel}`Replenish Scrapped Quantities` checkbox if a picking order should be created +to replace the scrapped component(s) upon confirmation of the scrap order. This option should only +be enabled for warehouses with {doc}`two-step <../basic_setup/two_step_manufacturing>` or +{doc}`three-step <../basic_setup/three_step_manufacturing>` manufacturing enabled, since components +are not picked as part of the {doc}`one-step <../basic_setup/one_step_manufacturing>` manufacturing +process. + +```{image} scrap_manufacturing/scrap-window.png +:align: center +:alt: The Scrap pop-up window. +``` + +Click the {guilabel}`Scrap` button to scrap the selected component. After one or more scrap orders +have been created, a {guilabel}`Scraps` smart button appears at the top of the screen. Click it to +view a list of all scrap orders for the {{ MO }}. + +If a picking order was automatically created to replenish the scrapped components, it can be +accessed by opening the {menuselection}`Inventory` app, clicking the {guilabel}`# To Process` button +on the {guilabel}`Pick Components` card, and selecting the order. + diff --git a/content/applications/inventory_and_mrp/manufacturing/workflows/split_merge.md b/content/applications/inventory_and_mrp/manufacturing/workflows/split_merge.md new file mode 100644 index 000000000..74614d679 --- /dev/null +++ b/content/applications/inventory_and_mrp/manufacturing/workflows/split_merge.md @@ -0,0 +1,91 @@ +# Split and merge manufacturing orders + +In Odoo *Manufacturing*, it is possible to create manufacturing orders for a single unit of an item, +or multiple units of the same item. In some cases, it may be necessary to split a manufacturing +order that contains multiple units into two or more orders, or to merge two or more orders into a +single order. + +:::{important} +A manufacturing order can only contain one unit of a product, or multiple units of a single +product that all use the same Bill of Materials (BoM). As a result, it is only possible to merge +manufacturing orders when every order contains the same product being manufactured with the same +BoM. +::: + +## Split manufacturing orders + +To split a manufacturing order into multiple orders, begin by navigating to +{menuselection}`Manufacturing --> Operations --> Manufacturing Orders`, then select a manufacturing +order. At the top of the page, next to the {guilabel}`New` button, the manufacturing order's +reference number appears with a {guilabel}`⚙️ (settings)` button next to it. + +Click the {guilabel}`⚙️ (settings)` button to open the general settings for the manufacturing order, +then select {guilabel}`Split`. + +```{image} split_merge/settings-split.png +:align: center +:alt: The Settings and Split buttons on a manufacturing order. +``` + +After selecting {guilabel}`Split`, a {guilabel}`Split production` pop-up window appears. In the +{guilabel}`Split #` field, enter the number of manufacturing orders that the original order should +be split into, then click outside of the field. A table appears below, with a line for each new +manufacturing order that will be created by the split. In the {guilabel}`Quantity To Produce` +column, enter the number of units that will be assigned to each new manufacturing order. Finally, +click {guilabel}`Split` to split the manufacturing order. + +```{image} split_merge/split-production-window.png +:align: center +:alt: The Split production pop-up window for a manufacturing order. +``` + +After clicking {guilabel}`Split`, the original manufacturing order is split into the number of +orders that was specified in the {guilabel}`Split #` field. The reference numbers for the new +manufacturing orders are the reference number for the original order with *-###* tags added to the +end. + +```{eval-rst} +.. example:: + Manufacturing order *WH/MO/00012* is split into three separate orders. The reference numbers for + the new orders are *WH/MO/00012-001*, *WH/MO/00012-002*, and *WH/MO/00012-003*. +``` + +## Merge manufacturing orders + +To merge two or more manufacturing orders into a single order, begin by navigating to +{menuselection}`Manufacturing --> Operations --> Manufacturing Orders`. Select the manufacturing +orders that will be merged by activating the checkbox to the left of the name of each order. + +```{image} split_merge/select-orders.png +:align: center +:alt: Select manufacturing orders that will be merged by clicking the checkbox for +: each. +``` + +Once all manufacturing orders have been selected, click the {guilabel}`Actions` button at the top of +the page, then select {guilabel}`Merge` from the drop-down menu. + +```{image} split_merge/actions-merge.png +:align: center +:alt: The Actions and Merge buttons on the Manufacturing Orders page. +``` + +The selected manufacturing orders are merged into a single order. The reference number for the new +manufacturing order is the next sequential number that has *not* already been assigned to an order. + +```{eval-rst} +.. example:: + The last reference number used for a manufacturing order was *WH/MO/00012*. Two manufacturing + orders, *WH/MO/00008* and *WH/MO/00009*, are merged into a single order. The reference number for + the manufacturing order created by the merger is *WH/MO/00013*. +``` + +In the {guilabel}`Source` field for the manufacturing order created by the merger, the reference +numbers of the manufacturing orders that were merged are listed. + +```{eval-rst} +.. example:: + Manufacturing orders *WH/MO/00009* and *WH/MO/00010* are merged to create *WH/MO/00011*. The + source field for *WH/MO/00011* lists both *WH/MO/00009* and *WH/MO/00010*. +``` + diff --git a/content/applications/inventory_and_mrp/manufacturing/workflows/unbuild_orders.md b/content/applications/inventory_and_mrp/manufacturing/workflows/unbuild_orders.md new file mode 100644 index 000000000..b2cee9d07 --- /dev/null +++ b/content/applications/inventory_and_mrp/manufacturing/workflows/unbuild_orders.md @@ -0,0 +1,96 @@ +--- +substitutions: + BoM: '{abbr}`BoM (Bill of Materials)`' +--- + +# Unbuild orders + +In some cases, it is necessary to dismantle manufactured products into their individual components. +This may be required if too many units of a product were built, or if the components of one product +must be reclaimed to use in the manufacturing of another. + +In Odoo *Manufacturing*, products can be dismantled, and their components returned to inventory, +using *unbuild orders*. By using unbuild orders to accomplish this task, inventory counts for the +finished product and its components remain accurate, based on the quantity of products dismantled, +and the quantity of components reclaimed. + +## Create unbuild order + +A new unbuild order can be created by navigating to {menuselection}`Manufacturing app --> Operations +--> Unbuild Orders`, and clicking {guilabel}`New`. + +Begin filling out the new unbuild order by selecting a {guilabel}`Product` to unbuild. After doing +so, the {guilabel}`Bill of Material` field auto-populates with the corresponding bill of materials +(BoM). If a different {{ BoM }} should be used, click on the {guilabel}`Bill of Material` field, and +select it from the drop-down menu. + +Alternatively, a specific {{ BoM }} can be selected in the {guilabel}`Bill of Material` field before +selecting a product, which causes the corresponding product to auto-populate in the +{guilabel}`Product` field. + +Next, specify the {guilabel}`Quantity` of the product that is being unbuilt. + +If the product being unbuilt was originally manufactured in a specific manufacturing order (MO), +select it in the {guilabel}`Manufacturing Order` field. + +In the {guilabel}`Source Location` field, select the location where the product being unbuilt is +currently stored. + +In the {guilabel}`Destination Location` field, select the location where the reclaimed components +are stored after the unbuild order is completed. + +If the *Lots & Serial Numbers* feature is enabled in the settings of the *Inventory* app, a +{guilabel}`Lot/Serial Number` field appears on the unbuild order, which can be used to specify the +lot(s) or serial number(s) of the product being unbuilt, if any are assigned. + +If the Odoo database has been configured with multiple companies, a {guilabel}`Company` field +appears on the unbuild order, which can be used to specify the company that owns the product being +unbuilt. + +Finally, once the product has been unbuilt, click the {guilabel}`Unbuild` button at the top of the +order to confirm that it has been completed. + +```{image} unbuild_orders/unbuild-order.png +:align: center +:alt: A filled-out unbuild order. +``` + +:::{warning} +While it is possible to create unbuild orders for products that have zero (or fewer) units +on-hand, this is not advised, since it can lead to inventory inconsistencies. + +If an unbuild order is created for a product with zero (or fewer) units on-hand, a pop-up window +appears, warning the user that there is an insufficient quantity to unbuild. + +To ignore the warning, and proceed with the unbuild order, click {guilabel}`Confirm` at the +bottom of the pop-up window. To return to the unconfirmed unbuild order, click +{guilabel}`Discard`, instead. + +```{image} unbuild_orders/insufficient-quantity.png +:align: center +:alt: |- +: The insufficient quantity pop-up that appears after trying to confirm an unbuild order +: for a product with zero or fewer units on hand. +``` +::: + +After completing an unbuild order, inventory counts automatically update, based on the quantity of +products unbuilt, and the quantity of components reclaimed. + +```{eval-rst} +.. example:: + A `Coat Rack` product is comprised of one `Wooden Pole` component and six `Wooden Dowel` + components. + + An unbuild order is created for one unit of the `Coat Rack`. Once the order is completed, the + on-hand quantity of `Coat Racks` decreases by one, while the on-hand quantities of `Wooden Poles` + and `Wooden Dowels` increase by one and six, respectively. +``` + +## Scrap unusable components + +In some cases, components may be unusable after the unbuilding process is completed. To ensure that +inventory counts accurately reflect the quantity of usable components on-hand, any component that +can no longer be used should be removed from inventory using a {doc}`scrap order +<../../inventory/warehouses_storage/inventory_management/scrap_inventory>`. + diff --git a/content/applications/inventory_and_mrp/manufacturing/workflows/use_mps.md b/content/applications/inventory_and_mrp/manufacturing/workflows/use_mps.md new file mode 100644 index 000000000..e9f115d29 --- /dev/null +++ b/content/applications/inventory_and_mrp/manufacturing/workflows/use_mps.md @@ -0,0 +1,282 @@ +--- +substitutions: + BoM: '{abbr}`BoM (Bill of Materials)`' + MO: '{abbr}`MO (manufacturing order)`' + MOs: '{abbr}`MOs (manufacturing orders)`' + MPS: '{abbr}`MPS (Master Production Schedules)`' + PO: '{abbr}`PO (purchase order)`' + POs: '{abbr}`POs (purchase orders)`' + RfQ: '{abbr}`RfQ (Request for Quotation)`' + RfQs: '{abbr}`RfQs (Requests for Quotation)`' + SO: '{abbr}`SO (sales order)`' + SOs: '{abbr}`SOs (sales orders)`' +--- + +# Master production schedule + +In Odoo's *Manufacturing* app, the *master production schedule* (MPS) is used to manually plan +manufacturing orders (MOs) and purchase orders (POs), based on forecasted quantities of products and +components. + +By considering the impact of confirmed {{ MOs }} and {{ POs }}, along with manually adjusted demand +forecasts, the {{ MPS }} can be used to manage long-term product replenishment. This ensures the +continued availability of the necessary products and components. + +Since the {{ MPS }} allows for manual intervention, it is useful for replenishing products where the +demand of existing sales orders (SOs) does **not** reflect probable future demand. + +```{eval-rst} +.. example:: + A retail store sells artificial *Christmas trees* during the holiday season. It is currently + September, and the store has less than ten Christmas tree |MOs| confirmed for the month of + December. + + Despite the number of confirmed |MOs|, the procurement manager knows that the demand for + Christmas trees in December is going to be much higher, once the holiday season starts. As a + result, they manually enter a greater demand in the |MPS|, so they can properly replenish the + product in time for the increase in customer demand. +``` + +:::{important} +It is essential to remember that the {{ MPS }} is a **MANUAL** tool. Adding a product to the {{ MPS }} +does not cause it to be manufactured or purchased automatically. The {{ MPS }} simply suggests the +amount of the product that should be replenished, but requires user input to create the {{ MOs }} or +{{ POs }} that are used to replenish it. + +For this reason, it is recommended that the {{ MPS }} **NOT** be used alongside reordering rules for +the same product. Because reordering rules are an automated workflow, they conflict with the +manual replenishment method of {{ MPS }}. Using both, in unison, can lead to inaccurate forecasts and +the creation of unnecessary replenishment orders. +::: + +## Enable and configure {{ MPS }} + +To use the {{ MPS }} feature, navigate to {menuselection}`Manufacturing app --> Configuration --> +Settings`, and tick the {guilabel}`Master Production Schedule` checkbox in the {guilabel}`Planning` +section. Finally, click {guilabel}`Save`. + +After enabling the {guilabel}`Master Production Schedule` feature, two new fields appear under it on +the {guilabel}`Settings` page: {guilabel}`Time Range` and {guilabel}`Number of Columns`. + +The {guilabel}`Time Range` field is used to select the period of time over which planning takes +place, and offers three options: {guilabel}`Monthly`, {guilabel}`Weekly`, and {guilabel}`Daily`. For +example, if {guilabel}`Monthly` is selected, the {{ MPS }} plans the production requirements of products +and components on a monthly basis. + +The {guilabel}`Number of Columns` field is used to specify the quantity of the selected +{guilabel}`Time Range` units shown on the {{ MPS }} page. For example, if the {guilabel}`Time Range` +field is set to {guilabel}`Monthly`, and `12` is entered in the {guilabel}`Number of Columns` field, +the {{ MPS }} shows one column for the next 12 months, starting with the current month. + +If the values of the {guilabel}`Time Range` or {guilabel}`Number of Columns` fields are altered, +click {guilabel}`Save` again to save the changes. + +```{image} use_mps/mps-setting.png +:align: center +:alt: The MPS setting in the Manufacturing app's settings. +``` + +## {{ MPS }} dashboard + +To open the {{ MPS }}, navigate to {menuselection}`Manufacturing app --> Planning --> Master Production +Schedule`. The {{ MPS }} view appears as follows: + +```{image} use_mps/mps.png +:align: center +:alt: The Master Production Schedule in the Manufacturing app. +``` + +The grey column on the left side of the screen shows a section for every product added to the {{ MPS }}, +with each product section being broken down into smaller rows. The information shown in the rows +depends on the filters selected in the {guilabel}`Search...` bar drop-down menu at the top of the +page. The default categories that appear in the rows are: + +- {guilabel}`[Product] by [unit]` {icon}`fa-area-chart`: the forecasted stock quantity at the + beginning of each time period. {guilabel}`[Product]` and {icon}`fa-area-chart` are selectable + buttons which open the product's page, or the forecast report for the product, respectively. + +- {guilabel}`- Forecasted Demand`: the demand forecast, which is entered manually. This represents + an estimate of the demand for the product during each time period. + +- {guilabel}`- Indirect Demand Forecast`: while this is a default category, it **only** appears for + products that are components of other products. It represents the demand for the component from + existing MOs. + +- {guilabel}`+ Suggested Replenishment`: the quantity of the product that is suggested to be + replenished through {{ MOs }} or {{ POs }}. To the right of the category title is a + {guilabel}`Replenish` button, which is used to manually replenish the product, based on the + quantity suggested to be replenished. + + :::{figure} use_mps/replenish-button.png + :align: center + :alt: The Replenish button on the "+ Suggested Replenishment" row. + + The "Replenish" button on the "+ Suggested Replenishment" row. + ::: + +- {guilabel}`= Forecasted Stock`: the quantity of the product forecasted to be in stock at the end + of each time period, assuming that suggested replenishment numbers are fulfilled. + +Altogether, these default categories form an equation: + +$$ +\text{Forecasted Demand} + \text{Suggested Replenishment} = \text{Forecasted Stock} +$$ + +In the case of components, the {guilabel}`Indirect Demand Forecast` is taken into account as well. + +The {guilabel}`- Forecasted Demand` and {guilabel}`+ Suggested Replenishment` fields can be edited +for any of the time periods to the right of the product column. Doing so changes the equation, and +updates the value displayed in the {guilabel}`Forecasted Stock` field. + +Changing the value in the {guilabel}`+ Suggested Replenishment` field also makes an {icon}`fa-times` +{guilabel}`(reset)` button appear to the left of the field. Click the {icon}`fa-times` +{guilabel}`(reset)` button next to the field to reset its value back to the one calculated by the +{{ MPS }}. + +:::{important} +While the {{ MPS }} can be used with only the default categories enabled, it is advisable to also +enable the {guilabel}`Actual Demand` category. This is done by clicking the {icon}`fa-caret-down` +{guilabel}`(down arrow)` on the right side of the {guilabel}`Search...` bar, and enabling the +{guilabel}`Actual Demand` option under the {guilabel}`Rows` header. + +With the {guilabel}`Actual Demand` option enabled, the {guilabel}`- Forecasted Demand` category +changes to the {guilabel}`- Actual / Forecasted Demand` category. In addition to the manually +entered forecasted demand, this category also displays the confirmed demand for the product, +which is based on confirmed {{ SOs }}. +::: + +Each column to the right of the products column lists one unit of the time period selected in the +*Time Range* field on the *Manufacturing* app *Settings* page (ex. months). The number of time +period columns corresponds to the value entered in the *Number of Columns* field. + +The first time period column represents the current time period. For example, if the {{ MPS }} is +configured to use months, the first column displays data for the current month. On this first +column, the {guilabel}`+ Suggested Replenishment` field appears in one of five colors: + +- {guilabel}`Green`: a replenishment order must be generated to keep stock at the {guilabel}`Safety + Stock Target`. +- {guilabel}`Gray`: a replenishment order has already been generated to keep stock at the + {guilabel}`Safety Stock Target`. +- {guilabel}`Yellow`: a replenishment order has already been generated, but the quantity it was + created for is not enough to keep stock at the {guilabel}`Safety Stock Target`. +- {guilabel}`Red`: a replenishment order has already been generated, but the quantity it was created + for puts the amount of stock above the {guilabel}`Safety Stock Target`. + +The {guilabel}`+ Suggested Replenishment` field appears white, if no replenishment order has been +generated, and it is not necessary to generate one at the current moment. + +## Add a product + +To use {{ MPS }} to manage the replenishment of a product, navigate to {menuselection}`Manufacturing app +--> Planning --> Master Production Schedule`. At the top of the {{ MPS }} page, click {guilabel}`Add a +Product` to open the {guilabel}`Add a Product` pop-up window. + +:::{important} +Products **must** be properly configured to be replenished through the {{ MPS }}. + +In the case of manufactured products, the *Manufacture* route must be selected in the *Routes* +section of the *Inventory* tab, on the product's form. + +In the case of products that are purchased, the *Buy* route must be selected in the *Routes* +section of the *Inventory* tab, on the product's form. Additionally, a vendor and the price they +sell the product for must also be specified on the *Purchase* tab. +::: + +On the pop-up window, select the product to add in the {guilabel}`Product` drop-down menu. If the +product is replenished through manufacturing, select the product's {{ BoM }} in the {guilabel}`Bill of +Materials` field. + +:::{note} +Selecting a BoM when adding a product to the {{ MPS }} also adds any components listed on the BoM. If +it is not necessary to manage the replenishment of components through the {{ MPS }}, simply leave the +{guilabel}`Bill of Materials` field blank. +::: + +If the database is configured with multiple warehouses, a {guilabel}`Production Warehouse` field +appears on the {guilabel}`Add a Product` pop-up window. Use this field to specify which warehouse +the product is replenished to. + +In the {guilabel}`Safety Stock Target` field, specify the minimum quantity of the product that +should be kept available for orders at all times. For example, if there should always be 20 units of +the product available for order fulfillment, enter `20` in the {guilabel}`Safety Stock Target` +field. + +In the {guilabel}`Minimum to Replenish` field, enter the minimum product quantity for orders created +to replenish the product. For example, if `5` is entered in this field, replenishment orders for the +product include a minimum of five units. + +In the {guilabel}`Maximum to Replenish` field, enter the maximum product quantity for orders created +to replenish the product. For example, if `100` is entered in this field, replenishment orders for +the product include a maximum of 100 units. + +Finally, click {guilabel}`Save` to add the product to the {{ MPS }}. The product now appears on the +{{ MPS }} page each time it is opened. If a {{ BoM }} was selected in the {guilabel}`Bill of Materials` +field of the {guilabel}`Add a Product` pop-up window, any components listed on the {{ BoM }} appear on +the page, as well. + +```{image} use_mps/add-a-product.png +:align: center +:alt: The Add a Product pop-up window in the MPS. +``` + +### Edit a product + +After adding a product to the {{ MPS }}, it may be necessary to change the replenishment values entered +on the {guilabel}`Add a Product` pop-up window. To do so, click the {guilabel}`# ≤…≤ #` button to +the immediate right of the {guilabel}`Replenish` button, on the {guilabel}`+ Suggested +Replenishment` row, below the product's name. + +:::{note} +The first and second number displayed on the {guilabel}`# ≤…≤ #` button correspond to the values +entered in the {guilabel}`Minimum to Replenish` and {guilabel}`Maximum to Replenish` fields when +adding the product to the {{ MPS }}. + +For example, if `5` was entered in the {guilabel}`Minimum to Replenish` field, and `100` was +entered in the {guilabel}`Maximum to Replenish` field, the button appears as {guilabel}`5 ≤…≤ +100`. +::: + +Clicking the {guilabel}`# ≤…≤ #` button opens the {guilabel}`Edit Production Schedule` pop-up +window. This pop-up window is the same as the {guilabel}`Add a Product` pop-up window, except that +the {guilabel}`Product` and {guilabel}`Bill of Materials` fields cannot be edited. + +On the {guilabel}`Edit Production Schedule` pop-up window, enter the desired values in the +{guilabel}`Safety Stock Target`, {guilabel}`Minimum to Replenish`, and {guilabel}`Maximum to +Replenish` fields. Then, click {guilabel}`Save` to save the changes. + +### Remove a product + +To remove a product from the {{ MPS }}, tick the checkbox to the left of its name. Then, click the +{icon}`fa-cog` {guilabel}`Actions` button at the top of the screen, and select {guilabel}`Delete` +from the resulting drop-down menu. Finally, click {guilabel}`Ok` on the {guilabel}`Confirmation` +pop-up window. + +Deleting a product from the {{ MPS }} removes it, along with all of its data. If the product is +re-added, its replenishment values must be reconfigured. + +## {{ MPS }} replenishment + +Products in the {{ MPS }} can be replenished in one of three ways: + +- Click the {guilabel}`Replenish` button at the top of the screen to generate replenishment orders + for every product below its {guilabel}`Safety Stock Target` for the current month. +- Click the {guilabel}`Replenish` button on the right side of the {guilabel}`+ Suggested + Replenishment` row of a specific product, to generate a replenishment order for that specific + product. +- Tick the checkbox to the left of the product name of one or more products. Then, click the + {icon}`fa-cog` {guilabel}`Actions` button at the top of the screen, and select + {guilabel}`Replenish` from the resulting drop-down menu. Doing so generates a replenishment order + for each selected product. + +The type of replenishment order generated corresponds to the route selected on the *Inventory* tab +of the product's form: + +- If the *Buy* route is selected, an {{ RfQ }} is generated to replenish the product. {{ RfQs }} can be + selected by navigating to the {menuselection}`Purchase` app. Any {{ RfQ }} generated by the {{ MPS }} + lists {guilabel}`MPS` in its {guilabel}`Source Document` field. +- If the *Manufacture* route is selected, an {{ MO }} is generated to replenish the product. {{ MOs }} can + be selected by navigating to {menuselection}`Manufacturing app --> Operations --> Manufacturing + Orders`. Any {{ MO }} generated by the {{ MPS }} lists {guilabel}`MPS` in its {guilabel}`Source Document` + field. + diff --git a/content/applications/inventory_and_mrp/manufacturing/workflows/work_center_time_off.md b/content/applications/inventory_and_mrp/manufacturing/workflows/work_center_time_off.md new file mode 100644 index 000000000..1ae5d917c --- /dev/null +++ b/content/applications/inventory_and_mrp/manufacturing/workflows/work_center_time_off.md @@ -0,0 +1,117 @@ +--- +substitutions: + MO: '{abbr}`MO (manufacturing order)`' +--- + +# Work center time off + +In Odoo, *work centers* are used to carry out manufacturing operations at specific locations. +However, if a work center cannot be used for some reason, work orders begin to pile up at the work +center until it is operational again. + +As a result, it is necessary to make the work center unavailable in Odoo so new work orders are +routed to alternative work centers that are operational. Using Odoo's **Time Off** app, it is +possible to designate a work center as being unavailable for a set period of time. Doing so ensures +manufacturing operations can continue until the impacted work center is available again. + +## Configuration + +Before a work center can be designated as unavailable, the Odoo platform must be properly +configured. First, it is necessary to enable {ref}`developer mode `. This allows the +*Time Off* smart button to appear on each work center's *Working Hours* page. + +Next, install the **Time Off** app. This is the app used for managing time off for all resources +within Odoo, including employees and work centers. + +To do so, navigate to the {menuselection}`Apps` app, then search `Time Off` in the search bar. The +card for the {guilabel}`Time Off` app should be the only one that appears on the page. Click the +{guilabel}`Install` button on the card to install the app. + +The last step is to properly configure work centers. For this workflow, it is necessary to have at +least two work centers: one that is made unavailable, and a second that receives the work orders +that the other cannot accept. If no second work center is configured, Odoo cannot route work orders +away from the unavailable work center, and they pile up in its queue. + +To create a work center, navigate to {menuselection}`Manufacturing app --> Configuration --> Work +Centers --> New`. + +:::{seealso} +For a full guide to work center creation, refer to the documentation on {doc}`work centers +<../advanced_configuration/using_work_centers>`. +::: + +Make sure both work centers have the same equipment listed under the {guilabel}`Equipment` tab. This +ensures operations carried out at one work center can also be performed at the other. + +On the work center that is made unavailable, select the second work center from the +{guilabel}`Alternative Workcenters` drop-down menu. Now, Odoo knows to send work orders to the +second work center when the first is unavailable for any reason. + +```{image} work_center_time_off/alternative-work-center-selection.png +:align: center +:alt: A work center form configured with an alternative work center. +``` + +## Add time off for a work center + +With configuration completed, time off can now be assigned to a work center. Begin by navigating to +{menuselection}`Manufacturing app --> Configuration --> Work Centers`, and selecting the affected +work center. Click the {icon}`oi-arrow-right` {guilabel}`(Internal link)` button on the right side +of the {guilabel}`Working Hours` drop-down menu, to open the working hours page for the work center. + +```{image} work_center_time_off/working-hours-button.png +:align: center +:alt: The Working Hours "External link" button on the work center form. +``` + +The working hours page displays the standard working hours for the work center. With developer mode +activated, a {icon}`fa-plane` {guilabel}`Time Off` smart button appears at the top of the page. +Click it to open the {guilabel}`Resource Time Off` page. + +On this page, click {guilabel}`New` to configure a new time-off entry. On the time-off form, note +the {guilabel}`Reason` for the work center closure (e.g. broken equipment, maintenance, etc.), +select the affected work center as the {guilabel}`Resource`, and choose a {guilabel}`Start Date` and +{guilabel}`End Date` to specify the period during which the work center is unavailable. + +```{image} work_center_time_off/time-off-form.png +:align: center +:alt: The "Resource Time Off" form. +``` + +## Alternative work center planning + +Once a work center is within its specified time-off period, work orders sent to it can be +automatically routed to an alternative work center using the *Plan* button. + +Begin by creating a new manufacturing order (MO), by navigating to {menuselection}`Manufacturing app +--> Operations --> Manufacturing Orders --> New`. On the {{ MO }} form, specify a {guilabel}`Product` +that uses the unavailable work center for one of its operations. Click {guilabel}`Confirm` to +confirm the {{ MO }}. + +On the confirmed {{ MO }}, select the {guilabel}`Work Orders` tab. By default, the unavailable work +center is specified in the {guilabel}`Work Center` column. There is also a {guilabel}`Plan` button +at the top left of the page. + +Click {guilabel}`Plan`, and the work center listed in the {guilabel}`Work Center` column of the +{guilabel}`Work Orders` tab is automatically changed to the alternative work center. + +:::{figure} work_center_time_off/before-planning.png +:align: center +:alt: Before clicking "Plan", the work order is scheduled at "Main Assembly Line". + +Before clicking {guilabel}`Plan`, the work order is scheduled at {guilabel}`Main Assembly Line`. +::: + +:::{figure} work_center_time_off/after-planning.png +:align: center +:alt: After clicking "Plan", the work order is rescheduled at "Alternative Assembly +: Line". + +After clicking {guilabel}`Plan`, the work order is rescheduled at {guilabel}`Alternative Assembly +Line`. +::: + +Once the time-off period for the unavailable work center ends, Odoo recognizes the work center is +available again. At this point, clicking the {guilabel}`Plan` button does not route work orders to +an alternative work center unless the first one is at capacity. + diff --git a/content/applications/inventory_and_mrp/plm.md b/content/applications/inventory_and_mrp/plm.md new file mode 100644 index 000000000..e39aba4fe --- /dev/null +++ b/content/applications/inventory_and_mrp/plm.md @@ -0,0 +1,22 @@ +--- +hide-page-toc: true +nosearch: true +show-content: true +show-toc: true +--- + +# Product lifecycle management + +Odoo *Product Lifecycle Management* (*PLM*) offers a systematic approach for testing, collaboration, +and iteration of products across concept development, design, manufacturing, marketing, and +post-launch support stages. + +With approvals, key stakeholders can review changes before implementation. + +```{toctree} +:titlesonly: true + +plm/manage_changes +plm/management +``` + diff --git a/content/applications/inventory_and_mrp/plm/manage_changes.md b/content/applications/inventory_and_mrp/plm/manage_changes.md new file mode 100644 index 000000000..6a6ad248b --- /dev/null +++ b/content/applications/inventory_and_mrp/plm/manage_changes.md @@ -0,0 +1,10 @@ +# Change management + +```{toctree} +:titlesonly: true + +manage_changes/engineering_change_orders +manage_changes/eco_type +manage_changes/version_control +``` + diff --git a/content/applications/inventory_and_mrp/plm/manage_changes/eco_type.md b/content/applications/inventory_and_mrp/plm/manage_changes/eco_type.md new file mode 100644 index 000000000..c1c9275a4 --- /dev/null +++ b/content/applications/inventory_and_mrp/plm/manage_changes/eco_type.md @@ -0,0 +1,147 @@ +--- +substitutions: + BOM: '{abbr}`BoM (Bill of Materials)`' + BOMs: '{abbr}`BoMs (Bills of Materials)`' + ECO: '{abbr}`ECO (Engineering Change Order)`' + ECOs: '{abbr}`ECOs (Engineering Change Orders)`' +--- + +(plm/eco/eco-type)= + +# ECO type + +An *ECO type* is assigned to *engineering change orders* (ECOs) to organize and track changes to +products and bills of materials (BoMs). Each {{ ECO }} type separates {{ ECOs }} into a project in Gantt +view, ensuring collaborators and stakeholders **only** view and assist with relevant {{ BOM }} +improvements. + +For example, an electronic chip manufacturer might use 'New Product Introduction', 'Product +Improvement', 'Component Change', and 'Firmware Update' {{ ECO }} types. Then, designers and engineers +can focus on {{ ECOs }} in the 'New Product Introduction' and 'Product Improvement' projects, avoiding +unrelated supplier change or firmware update {{ ECOs }}. + +## Create ECO type + +To access and manage ECO types, navigate to {menuselection}`PLM app --> Configuration --> ECO +Types`. + +Create a new ECO type by clicking {guilabel}`New`. On the new {guilabel}`ECO Types` form, fill in +the following information: + +- {guilabel}`Name`: the name of the {{ ECO }} type, which will organize all of the {{ ECOs }} of this *type* + in a project. +- {guilabel}`Email Alias`: if this optional field is filled, emails submitted to this email address + automatically generate {{ ECOs }} in the left-most stage of this {{ ECO }} type. + +```{eval-rst} +.. example:: + The `Formulation change` |ECO| type is used to organize and track related |ECOs| in a single + project. Configuring the :guilabel:`Email Alias` field generates |ECOs| in the `Formulation + change` project sent to the email address, `pawlish-change@pawlished-glam.odoo.com`. + + .. image:: eco_type/create-eco-type.png + :align: center + :alt: Example of an ECO type. +``` + +## Edit ECO type + +Modify existing {{ ECO }} type names and email aliases by navigating to the {menuselection}`PLM app --> +Configuration --> ECO Types` page. There, click on the desired {{ ECO }} type from the list. + +On the form for each {{ ECO }} type, proceed to edit the {guilabel}`Name` and {guilabel}`Email Alias` +fields. + +(plm-eco-stage-config)= + +## Stages + +Within an {{ ECO }} type project, *stages* are like milestones and are used to identify the progress of +the {{ ECO }} before the changes are ready to be applied. (e.g. 'Feedback', 'In Progress', 'Approved', +'Complete') + +Additionally, required approvers can be added to each stage, ensuring that changes to the production +{{ BOM }} cannot proceed until the approver reviews and approves the {{ ECO }}. Doing so prevents errors on +the production {{ BOM }} by enforcing at least one review of suggested changes before they're applied on +a production {{ BOM }}. + +For best practice, there should be at least one *verification* stage, which is a stage with a +required approver, and one *closing* stage, which stores {{ ECOs }} that have been either cancelled or +approved for use as the next production {{ BOM }}. + +### Create stage + +To add a stage, go to the {menuselection}`PLM` app and select the intended project for an {{ ECO }} type +from the {guilabel}`PLM Overview` dashboard. + +Then, on the {guilabel}`Engineering Change Orders` project pipeline for the {{ ECO }} type, click the +{guilabel}`+ Stage` button. Doing so reveals a text box to fill in the name of the stage. After +filling it in, click the {guilabel}`Add` button to finish adding the stage. + +```{eval-rst} +.. example:: + A new `Assigned` stage separates assigned |ECOs| from the unassigned ones in the `New` stage. + Adding another stage helps the product manager track unassigned tasks. + + .. image:: eco_type/create-stage.png + :align: center + :alt: Create a new stage in a project for an ECO type. +``` + +### Verification stage + +Click an ECO type from {menuselection}`PLM app --> Overview` to open a kanban view of {{ ECOs }} of this +type. + +To configure a verification stage, hover over the intended stage, and select the {guilabel}`⚙️ +(gear)` icon. Then, click {guilabel}`Edit` to open a pop-up window. + +Configure the verification stage in the edit stage pop-up window, by checking the box for +{guilabel}`Allow to apply changes`. + +Then, add an approver in the {guilabel}`Approvers` section, by clicking {guilabel}`Add a line`, and +specifying the {guilabel}`Role` of the reviewer, their {guilabel}`User`, and {guilabel}`Approval +Type`. + +Make sure at least one approver is configured with the {guilabel}`Approval Type`: {guilabel}`Is +required to approve`. + +The approver listed is automatically notified when {{ ECOs }} are dropped in the stage specified in the +pop-up window. Once finished, click {guilabel}`Save & Close`. + +```{eval-rst} +.. example:: + In the |ECO| type `New Product Introduction`, the verification stage `Validated` is configured by + clicking the :guilabel:`⚙️ (gear)` icon, and selecting :guilabel:`Edit`. Doing so opens the + :guilabel:`Edit: Validated` pop-up window. + + By adding the `Engineering manager` as an approver, only |ECOs| approved by this user can proceed + to the next stage, and have the changes applied on the production |BOM|. + + Additionally, check the :guilabel:`Allow to apply changes` option to ensure proper behavior. + + .. image:: eco_type/verification-stage.png + :align: center + :alt: Show "Allow to apply changes" option is checked. +``` + +### Closing stage + +Configure a closing stage by opening the {guilabel}`Edit: [stage]` pop-up window. To do so, hover +over the intended stage and click the {guilabel}`⚙️ (gear)` icon that appears in the top-right +corner. Then, click {guilabel}`Edit` from the drop-down menu. + +On the {guilabel}`Edit: [stage]` pop-up window, select the check boxes for {guilabel}`Folded in +kanban view`, {guilabel}`Allow to apply changes` and {guilabel}`Final Stage`. + +```{eval-rst} +.. example:: + The closing stage, `Effective` is configured by checking the :guilabel:`Folded in kanban view`, + :guilabel:`Allow to apply changes`, and :guilabel:`Final Stage` options +``` + +```{image} eco_type/closing-stage.png +:align: center +:alt: Show configurations of the closing stage. +``` + diff --git a/content/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders.md b/content/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders.md new file mode 100644 index 000000000..893bedfad --- /dev/null +++ b/content/applications/inventory_and_mrp/plm/manage_changes/engineering_change_orders.md @@ -0,0 +1,408 @@ +--- +substitutions: + BOM: '{abbr}`BoM (Bill of Materials)`' + BOMs: '{abbr}`BoMs (Bills of Materials)`' + ECO: '{abbr}`ECO (Engineering Change Order)`' + ECOs: '{abbr}`ECOs (Engineering Change Orders)`' +--- + +# Engineering change orders + +(plm-eco)= + +Utilize *engineering change orders* (*ECOs*) to track, implement, and revert change versions made to +products, and {doc}`bills of materials <../../manufacturing/basic_setup/bill_configuration>`. + +Engineering change orders can be created: + +1. {ref}`directly in the ECO type `. +2. by an operator in the {ref}`tablet view ` of an operation. +3. automatically from feedback submitted to the {ref}`ECO type's email alias `. + +(plm-eco-create-eco)= + +## Create ECO + +To create a new {{ ECO }}, begin by navigating to the *PLM* app. Then, select the {{ ECO }} type card that +will be used to track the progress of the change. On the {guilabel}`Engineering Change Orders` page, +click the {guilabel}`New` button in the top-left corner. + +:::{note} +Learn how to create new {ref}`ECO types ` to categorize and organize change +orders. Doing so ensures employees only view the {{ ECOs }} related to their responsibilities, +whether it involves new product introductions, targeted product line updates, or regulatory +compliance fulfillment. +::: + +On the {{ ECO }} form, fill in the following fields accordingly: + +- {guilabel}`Description` is a brief summary of the improvement. + +- {guilabel}`Type`: specifies the {{ ECO }} type project for organizing the {{ ECOs }}. + +- {guilabel}`Apply on` determines if the {{ ECO }} changes the {guilabel}`Bill of Materials` or the + {guilabel}`Product Only`. + +- {guilabel}`Product` indicates the product being improved. + +- {guilabel}`Bill of Materials` specifies the changed {{ BOM }}. It auto-populates if the product in + {guilabel}`Product` field has an existing {{ BOM }}. If multiple {{ BOMs }} exist, select the intended + radio options from the drop-down menu. + +- {guilabel}`Company` field is used in multi-company databases. Specify if the change applies to + products in a specific company, or leave blank if the change applies to all companies. + +- {guilabel}`Responsible` represents the assignee in charge of this {{ ECO }}. (Optional) + +- {guilabel}`Effective` specifies when the {{ ECO }} becomes live. Choosing {guilabel}`As soon as + possible` means the {{ ECO }} applies to the production {{ BOM }} as soon as an authorized user + {ref}`applies the changes `. + + On the other hand, choosing {guilabel}`At Date`, and setting a specific date, leaves a date that + makes it easier to track the version history of the {{ BOM }}, and the specific date {{ BOMs }}, used for + production. + +- {guilabel}`Tags` are assigned to {{ ECOs }} for prioritization and organization. Create a new tag by + typing the name in the field and selecting {guilabel}`Create` from the drop-down menu. (Optional) + +After filling out the {{ ECO }} form, click the {guilabel}`Start Revision` button to begin implementing +the changes. + +By pressing {guilabel}`Start Revision`, three actions occur: + +1. The {guilabel}`Documents` smart button appears, storing relevant files of the {{ BOM }}. +2. A copy of the production {{ BOM }} is stored in the newly-appeared {guilabel}`Revision` smart button + of the {{ ECO }}. The next available version number (e.g., `V2`, `V3`, ...) is also assigned to keep + track of all {{ BOM }} versions. +3. The stages of the {{ ECO }} {guilabel}`Type` are displayed in the top-right corner of the {{ ECO }}. + +:::{note} +The {guilabel}`Revision` smart button is available **only** when the {guilabel}`Bill of +Materials` radio button is selected in the {guilabel}`Apply on` field, and the {guilabel}`Start +Revision` button has been pressed. +::: + +```{image} engineering_change_orders/eco-form.png +:align: center +:alt: ECO with overview of stages in the top-right corner, and *Revision* smart button. +``` + +## Change components + +To modify the components in a {{ BOM }}, click the {guilabel}`Revision` smart button on an {{ ECO }} to +access the new version of the {{ BOM }}. Odoo distinguishes the non-production version of the {{ BOM }} from +the current version, by flagging the test {{ BOM }} with a large {guilabel}`Archived` tag. + +```{eval-rst} +.. example:: + After clicking the :guilabel:`Start Revision` button for an |ECO| for the product, `[D_0045 + Stool]`, make changes to the product's |BOM| by clicking the :guilabel:`Revision` smart button. + Doing so opens the archived |BOM|, marked with a large red :guilabel:`Archived` flag. + + .. image:: engineering_change_orders/archived-bom.png + :align: center + :alt: Show the archived Bill of Materials. +``` + +On the new {{ BOM }}, in the {guilabel}`Components` tab, proceed to modify the components list, by +changing the {guilabel}`Quantity` of existing components, adding new components using the +{guilabel}`Add a line` button, and removing components with the {guilabel}`🗑️ (trash)` icon. + +(plm-eco-example-keyboard)= + +```{eval-rst} +.. example:: + In version two of the |BOM| for a keyboard, the component quantities are reduced, and an + additional component, `Stabilizers`, is added. + + .. image:: engineering_change_orders/version-2-bom.png + :align: center + :alt: Make changes to components by going to the new BoM with the *Revision* smart button. +``` + +### Compare changes + +Once the changes are complete, navigate back to the {{ ECO }}, by clicking `ECO00X` in the breadcrumbs +located in the top-left corner. On the {{ ECO }} form, a new {guilabel}`BoM Changes` tab displays the +differences between the current {{ BOM }} and the new version. + +Blue text indicates new components added to the revised {{ BOM }} that are not in the production {{ BOM }}. +Black text represents updates shared by both {{ BOMs }}, while red text indicates components removed in +the revised {{ BOM }}. + +Changes and tests are encapsulated in the revised {{ BOM }}, and do **not** affect the {{ BOM }} currently +used in production. That is, until the {ref}`changes are applied `. + +```{eval-rst} +.. example:: + View the summary of the differences between the current and revised keyboard |BOMs| in the + :guilabel:`BoM Changes` tab of the |ECO|. + + .. image:: engineering_change_orders/bom-changes.png + :align: center + :alt: View summary of component changes in the *BoM Changes* tab. +``` + +## Change operations + +To modify the operations in a {{ BOM }}, click the {guilabel}`Revision` smart button on an {{ ECO }} to +access the archived, new version of the {{ BOM }}. + +In the new {{ BOM }} version, switch to the {guilabel}`Operations` tab to view and edit {{ BOM }} +operations. To make changes, select each operation, which opens the corresponding {guilabel}`Open: +Operations` pop-up window. + +:::{note} +The {guilabel}`Operations` tab is *not* available by default. To enable it, navigate to +{menuselection}`Manufacturing app --> Configuration --> Settings`, and check the {guilabel}`Work +Orders` box. +::: + +Make changes to any of the fields in the {guilabel}`Open: Operations` pop-up window, then click +{guilabel}`Save` once completed. + +Create new operations by clicking the {guilabel}`Add a line` button, and remove new operations by +clicking the {guilabel}`Archive Operation` button. + +### Compare changes + +Once the changes are complete, navigate back to the {{ ECO }}, by clicking `ECO00X` in the breadcrumbs +located in the top-left corner. + +On the {{ ECO }} form, a new {guilabel}`Operation Changes` tab displays the differences between the +current production {{ BOM }} and the new version. + +Blue text indicates new operations added to the revised {{ BOM }} that do not yet exist in the +production {{ BOM }}. Black text represents updates shared by both {{ BOMs }}, while red text indicates +operations removed in the revised {{ BOM }}. + +Modifications to the {{ BOM }} in an {{ ECO }} will **not** affect the {{ BOM }} used in production. That is, +until the {ref}`changes are applied `. + +In the {guilabel}`Operation Changes` tab, each row of details, beneath the columns in the table, +reflect the following information: + +- {guilabel}`Operation`: Name of the operation that was modified. +- {guilabel}`Step`: specifies the quality control point, visible when the operation includes + detailed instructions. + +:::{note} +To check for instructions, click the operation line item in the {guilabel}`Operations` tab of a +{{ BOM }}. Then, in the {guilabel}`Open: Operations` pop-up window, look for the +{guilabel}`Instructions` smart button displayed at the top. +::: + +```{eval-rst} +.. example:: + The `Assembly` :guilabel:`Operation` includes `10` detailed :guilabel:`Instructions` to complete + it. + + .. image:: engineering_change_orders/instructions-smart-button.png + :align: center + :alt: Show *Instructions* smart button to check whether an operation has additional + instructions. +``` + +- {guilabel}`Step Type` details the type of quality control for further instructions in the + operation. +- {guilabel}`Type` corresponds with the colored text to specify how the revised {{ BOM }} differs from + the production {{ BOM }}. Operation change types can be {guilabel}`Add`, {guilabel}`Remove`, or + {guilabel}`Update`. +- {guilabel}`Work Center` specifies the work center at which the operation is performed. +- {guilabel}`Manual Duration Change` refers to the change in the {guilabel}`Default Duration` field + in the {guilabel}`Open: Operations` pop-up window, which specifies the expected time for + completing the operation. + +```{eval-rst} +.. example:: + The :guilabel:`Operation Changes` tab compares the production |BOM| with the revised |BOM| in the + |ECO|. + + In the revised |BOM|, a new `Assembly` :guilabel:`Operation` at the :guilabel:`Work Center` + `Assembly Line 1` is added. In addition, the expected duration of the operation is `20.00` + minutes, as specified by the :guilabel:`Manual Duration Change`. + + To supplement the `Assembly` operation, two quality control point instructions are added: + + #. The first is the :guilabel:`Step` `QCP00039`, a :guilabel:`Step Type` to :guilabel:`Register + Production` of components. + #. The second :guilabel:`Step` is `QCP00034`, an `Instructions` :guilabel:`Step Type` that + provides additional assembly details. + + .. image:: engineering_change_orders/operation-changes.png + :align: center + :alt: Show *Operation Changes* tab in an |ECO|. +``` + +(plm-eco-apply-changes)= + +## Apply changes + +After verifying the changes, move the {{ ECO }} to a {ref}`verification stage `, +which are stages that require approval before the revised changes can be applied to the production +{{ BOM }}. + +Once the approvers accept the changes, the {guilabel}`Apply Changes` button becomes available. Click +this button, and the {{ ECO }} is automatically moved to a closing stage. The changes are applied, which +archives the original production {{ BOM }}, and the revised {{ BOM }} becomes the new production {{ BOM }}. + +### Verify changes + +To ensure the changes are live, from the {{ ECO }} where the {guilabel}`Apply Changes` button was just +pressed, return to the revised {{ BOM }} by clicking the {guilabel}`Revision` smart button. + +On the revised {{ BOM }}, the large red {guilabel}`Archived` flag is removed. + +To further verify the changes, check the production {{ BOM }} by going to {menuselection}`Manufacturing +app --> Products --> Products` and select the product. + +Then, on the product form, click the {guilabel}`Bill of Materials` smart button, and select the +{{ BOM }} from the list. In the {guilabel}`Miscellaneous` tab of the {{ BOM }}, the {guilabel}`Version` +field is updated to match the version number shown on the {guilabel}`Revision` smart button of the +latest {{ ECO }}. + +```{eval-rst} +.. example:: + After applying the changes of the |ECO| for the :ref:`keyboard `, view + the version of the current keyboard |BOM| in the :guilabel:`Miscellaneous` tab. Here, the + :guilabel:`Version` number has been updated to `2`, matching the `V2` that appears in the + :guilabel:`Revision` smart button of the |ECO|. + + .. image:: engineering_change_orders/bom-version.png + :align: center + :alt: View current *BOM* version in the Miscellaneous tab. +``` + +(plm-eco-tablet-view)= + +## Create ECO from tablet view + +Operators can directly suggest clearer operation instructions, while performing manufacturing orders +(MOs) in the *Manufacturing* app. + +To create {{ ECOs }} in this manner, begin by navigating to {menuselection}`Manufacturing app --> +Operations --> Manufacturing Orders`. Then, select the desired {abbr}`MO (Manufacturing Order)` and +switch to the {guilabel}`Work Orders` tab. Then, click the {guilabel}`📱 (mobile phone)` icon for +the desired work order to open the *tablet view* of the operation. + +:::{important} +The {guilabel}`📱 (mobile phone)` icon is **only** available for {abbr}`MOs (Manufacturing +Orders)` with a {guilabel}`Confirmed` or {guilabel}`In Progress` status. +::: + +```{image} engineering_change_orders/tablet-icon.png +:align: center +:alt: Find the tablet icon for each operation, second from the far right. +``` + +Next, add an instructional step, by clicking the {guilabel}`☰ (three horizontal lines)` icon in the +tablet view of an operation. Doing so opens the {guilabel}`Menu` of action items for a {abbr}`MO +(Manufacturing Order)`. Then, click the {guilabel}`Add a step` button. + +```{image} engineering_change_orders/additional-options-menu.png +:align: center +:alt: Open the *Add a Step* pop-up by clicking the three horizontal lines icon in tablet +: view. +``` + +Clicking the button reveals an {guilabel}`Add a step` pop-up window, where the proposed changes are +submitted. + +In the {guilabel}`Title` field, enter a short step description. Next, in the {guilabel}`Instruction` +text field, type the instructions of the step in greater detail. Optionally, add an image to the +{guilabel}`Document` field. Once completed, finish by clicking the {guilabel}`Propose Change` +button. + +```{eval-rst} +.. example:: + To propose an additional check for broken components, enter the details in the :guilabel:`Add a + Step` pop-up window. Doing so creates an instructional quality control point that will be + reviewed in the following section. + + .. image:: engineering_change_orders/add-a-step.png + :align: center + :alt: Fill out the *Add a Step* form to suggest an additional quality control point. +``` + +Based on the inputs from the {guilabel}`Add a Step` pop-up window, an {{ ECO }} is created with the +following information: + +1. {guilabel}`Description` is the name of the operation, followed by the {abbr}`MO (Manufacturing + Order)` number for reference. +2. The {{ ECO }} {guilabel}`Type` is automatically assigned to `BOM Changes`. +3. {guilabel}`Product` and {guilabel}`Bill of Materials` fields are automatically populated, based + on the {{ BOM }} used in the {abbr}`MO (Manufacturing Order)`. +4. {guilabel}`Responsible` is the operator who submitted the feedback. + +### View ECO + +To review the proposed changes, navigate to the {menuselection}`PLM app --> Overview`. In the `BOM +Updates` {{ ECO }} type card, the {guilabel}`X Engineering Changes` button represents the amount of +operational changes created from the tablet view. + +Click on the {guilabel}`X Engineering Changes` button to open the kanban view of the {{ ECO }} type. To +view the suggestion, select an {{ ECO }} in the `New` stage. + +On the {{ ECO }}, view a summary of the proposed changes in the {guilabel}`Operation Changes` tab. Click +the {guilabel}`Revision` smart button to navigate to the revised {{ BOM }} and look into the proposed +changes in greater detail. + +```{eval-rst} +.. example:: + An operator suggested another check for broken components by adding a step from the tablet view, + while performing the `Assemble switches` operation for the :abbr:`MO (Manufacturing Order)` + `WH/MO/00010` for the product, `Keyboard`. + + Then, this created |ECO| can be viewed by navigating to the `BOM Changes` ECO type found in + :menuselection:`PLM app --> Overview`. By default, |ECOs| created from tablet view are set to + spawn in the `New` stage. + + The :guilabel:`Responsible` field is assigned to the operator who made the suggestion, allowing + the employee revising the |BOM| to seek further clarification from the person who proposed the + changes. + + .. image:: engineering_change_orders/view-bom-change.png + :align: center + :alt: Find the new ECO in the "BOM Changes" ECO type, in the *New* stage. +``` + +On the revised {{ BOM }}, switch to the {guilabel}`Operations` tab, and select the {guilabel}`☰ (three +horizontal lines)` icon. Doing so opens a list of {guilabel}`Steps` to perform the operation, with +the newest instruction titled `New Step Suggestion:`, followed by the user-entered title. Click the +line item to view the suggested changes. + +```{image} engineering_change_orders/show-instructions.png +:align: center +:alt: '"Show Instructions" icon in the *Operations* tab of a BoM.' +``` + +On the {ref}`quality control point ` form, ensure +the following form fields are accurately filled out to give detailed instructions for operators: + +- {guilabel}`Title`: rename to give a concise description of the new instruction. +- {guilabel}`Control per`: using the drop-down menu, determine whether this instruction applies + broadly for the {guilabel}`Product`, specifically for this {guilabel}`Operation` *only*, or a + particular {guilabel}`Quantity` of the product. +- {guilabel}`Type`: categorizes the control point type. From the drop-down menu, select + {guilabel}`Instructions` to detail an instruction for the worker. To receive input from the + workers, select the {guilabel}`Take a Picture`, {guilabel}`Register Consumed Materials`, + {guilabel}`Print Label`, or other {ref}`quality check options + `. + +:::{seealso} +{ref}`Configure quality control points ` +::: + +Once the quality control point is configured, return to the {guilabel}`Steps` list using the +breadcrumbs. Finally, drag the last quality control line item to its intended order of instructions. + +```{eval-rst} +.. example:: + Drag and reorder the `Check for broken switches` instruction, by clicking and dragging its "6 + dots" icon to move it from the bottom to the second position. + + .. image:: engineering_change_orders/reorder.png + :align: center + :alt: Drag and reorder instructions by selecting the "6 dots" icon on the far left. +``` + diff --git a/content/applications/inventory_and_mrp/plm/manage_changes/version_control.md b/content/applications/inventory_and_mrp/plm/manage_changes/version_control.md new file mode 100644 index 000000000..80f228227 --- /dev/null +++ b/content/applications/inventory_and_mrp/plm/manage_changes/version_control.md @@ -0,0 +1,180 @@ +--- +substitutions: + BOM: '{abbr}`BoM (Bill of Materials)`' + BOMs: '{abbr}`BoMs (Bills of Materials)`' + ECO: '{abbr}`ECO (Engineering Change Order)`' + ECOs: '{abbr}`ECOs (Engineering Change Orders)`' +--- + +# Version control + +Use Odoo's *Product Lifecycle Management (PLM)* to manage previous versions of bills of materials +(BoMs). Store former assembly instructions, component details, and past product design files while +keeping the past details out of the production {{ BOM }}. + +Easily revert to previous {{ BOM }} versions, when needed. Additionally, use *PLM* to trace which {{ BOM }} +version was active on specific dates for recalls or customer complaints. + +Every {{ BOM }} version is stored in an *engineering change order* (ECO) for organized testing and +improvements without disrupting normal manufacturing operations. + +:::{seealso} +{ref}`Engineering change order ` +::: + +## Current BoM version + +To see the current version of the {{ BOM }} used in production, go to {menuselection}`PLM app --> Master +Data --> Bill of Materials`, and select the desired {{ BOM }} from the list. Then, switch to the +{guilabel}`Miscellaneous` tab, where the currently live {guilabel}`Version` of the {{ BOM }} is +displayed. + +:::{note} +{{ BOMs }} can also be accessed from {menuselection}`Manufacturing app --> Products --> Bill of +Materials`. +::: + +```{image} version_control/current-version.png +:align: center +:alt: Show the current version BOM in the Misc tab. +``` + +## Version history + +To manage all former, current, and future versions of a {{ BOM }}, begin by navigating to +{menuselection}`Manufacturing app --> Products --> Bills of Materials` and click the desired {{ BOM }}. + +From the {{ BOM }} page, click the {guilabel}`ECO` smart button, and switch to list view by selecting +the {guilabel}`≣ (four horizontal lines)` icon on the top right corner. + +:::{note} +The {guilabel}`ECO` smart button is visible on the {{ BOM }} **only** if the *PLM* app is installed. +::: + +```{image} version_control/eco-smart-button.png +:align: center +:alt: Show ECO smart button on a BoM. +``` + +In the list of {{ ECOs }} for the product, navigate to the search bar at the top, and click the +{guilabel}`▼ (down arrow)` icon on the right to access a drop-down menu of {guilabel}`Filters`. + +Next, filter by {guilabel}`Done` {{ ECOs }} to view: the revision history of the {{ BOM }}, the +{guilabel}`Responsible` user who applied the change, and the {guilabel}`Effective Date` of the +{{ BOM }}. + +Click each {{ ECO }} to view the past components, operations, and design files associated with the +{{ BOM }}. + +```{image} version_control/eco-list.png +:align: center +:alt: Display ECO revision history for a BoM for a product. +``` + +:::{note} +If the {guilabel}`Effective Date` field is empty, the {guilabel}`Effective` date of the {{ ECO }} is +automatically set to {guilabel}`As soon as possible` and no dates are recorded in the revision +history of the {{ BOM }}. + +```{image} version_control/no-effective-date.png +:align: center +:alt: List of BOM effective dates. +``` +::: + +:::{tip} +A workaround for checking when the {{ BOM }} went live is by navigating to the chatter, and hovering +over the time the {{ ECO }} was moved to the {ref}`closing stage `. +::: + +## Design files + +Attach computer-aided design (CAD) files, PDFs, images, or other design material to the {{ BOM }} +itself. + +To do so, navigate to {menuselection}`PLM app --> Master Data --> Bill of Materials`, and select the +desired {{ BOM }}. On the {{ BOM }}, navigate to the *chatter*, and click the {guilabel}`📎 (paperclip)` +icon. + +The files associated with the {{ BOM }} are displayed in the {guilabel}`Files` section. To add more +design files, select the {guilabel}`Attach files` button. + +```{image} version_control/attach-files.png +:align: center +:alt: Show paperclip icon in the chatter to attach files to a BoM. +``` + +### Manage design files in an ECO + +Add, modify, and remove files in an {{ ECO }}. Once the {{ ECO }} is approved and applied, the new files are +automatically linked to the production {{ BOM }}. Archived files are removed from the {{ BOM }}, but are +still accessible in the {{ ECO }}. + +To manage the design files in the {{ ECO }}, begin by navigating to {menuselection}`PLM app --> Changes` +and choose the desired {{ ECO }}. Next, open the {guilabel}`Attachments` page by clicking the +{guilabel}`Documents` smart button. + +Hover over each attachment to reveal the {guilabel}`︙ (three vertical dots)` icon. From there, +choose whether to {guilabel}`Edit`, {guilabel}`Remove`, or {guilabel}`Download` the file. Any +changes made to these files are contained within the {{ ECO }}, and will only apply to the production +{{ BOM }} once the {ref}`changes are applied `. + +```{eval-rst} +.. example:: + In the `Create 60% keyboard` |ECO|, the design files are from the original `100% keyboard` |BOM|. + To replace the keyboard PDF, begin by selecting the :guilabel:`Documents` smart button. + + .. image:: version_control/documents-smart-button.png + :align: center + :alt: Show *Documents* smart button from an active ECO. + + On the :guilabel:`Attachments` page, hover over the `100% keyboard manual.pdf` design file, and + click the :guilabel:`︙ (three vertical dots)` icon. Then, click the :guilabel:`Remove` option to + archive the file. + + Next, on the same :guilabel:`Attachments` page, click the :guilabel:`Upload` button to upload the + new design file, named `60% keyboard manual`. + + .. image:: version_control/attachments.png + :align: center + :alt: View of *Attachments* page from the *Documents* smart button. Displays one archived and + one newly added attachment. +``` + +:::{note} +Archived files are **not** permanently deleted — they can still be accessed in the previous +{{ ECO }}, or as an archived file in the latest {{ ECO }}, where the archival occurred. +::: + +## Apply rebase + +Odoo simplifies merge conflict resolution for concurrent {{ ECOs }} on the same product. + +Conflicts can occur when the production {{ BOM }} is updated while other {{ ECOs }} are modifying the +previous version. Differences between the new and previous production {{ BOMs }} are displayed in the +{guilabel}`Previous Eco Bom Changes` tab, visible only in this scenario. + +To resolve conflicts and retain {{ ECO }} changes, click the {guilabel}`Apply Rebase` button. + +```{eval-rst} +.. example:: + Two |ECOs|, `ECO0011` and `ECO0012`, are created when the current |BOM| version is `5`. In + `ECO0011`, a new component, `Space stabilizer`, is added, and the changes are applied. This means + the current |BOM| version has become `6`. + + .. image:: version_control/branch-change.png + :align: center + :alt: Apply changes to an ECO to update the production BOM. + + This means `ECO0012` is modifying an outdated |BOM|. As shown in the :guilabel:`Previous Eco Bom + Changes` tab, the |BOM| is missing the `Space stabilizer`. + + To ensure the changes applied by `ECO0011` are kept when the changes occur in `ECO0012`, click + the :guilabel:`Apply Rebase` button to apply the previous |ECO| changes, without affecting the + changes already made to `ECO0012`. + + .. image:: version_control/merge-change.png + :align: center + :alt: Click the *Apply Rebase* button to update the BOM to match the production BOM. +``` + diff --git a/content/applications/inventory_and_mrp/plm/management.md b/content/applications/inventory_and_mrp/plm/management.md new file mode 100644 index 000000000..de103d59e --- /dev/null +++ b/content/applications/inventory_and_mrp/plm/management.md @@ -0,0 +1,8 @@ +# Project management + +```{toctree} +:titlesonly: true + +management/approvals +``` + diff --git a/content/applications/inventory_and_mrp/plm/management/approvals.md b/content/applications/inventory_and_mrp/plm/management/approvals.md new file mode 100644 index 000000000..e62214b3d --- /dev/null +++ b/content/applications/inventory_and_mrp/plm/management/approvals.md @@ -0,0 +1,173 @@ +--- +substitutions: + ECO: '{abbr}`ECO (Engineering Change Order)`' + ECOs: '{abbr}`ECOs (Engineering Change Orders)`' +--- + +# Approvals + +(plm-approvals)= + +Notify stakeholders and managers automatically by assigning approvers to stages of {ref}`engineering +change orders ` (ECOs) under review. Changes can only be applied after the assigned +approver accepts them. Approvals ensure reviews by team members, which prevents mistakes and +premature actions. + +:::{seealso} +{ref}`Stage configuration ` +::: + +## Add approver + +To add an approver, first go to the {menuselection}`PLM app`, and click on the project card of an +ECO type to open the Gantt view of the {{ ECOs }}. + +On the {guilabel}`Engineering Change Orders` page, hover over the intended stage, and select the +{guilabel}`⚙️ (gear)` icon. Then, click {guilabel}`Edit` to open a pop-up window. + +:::{note} +Approvers can be added to any stage, but it's strongly recommended to assign them to the +*verification* stage, which comes before the *closing* stage, where {{ ECOs }} are applied, and the +{abbr}`BoM (Bill of Materials)` version is updated. + +See the documentation about {ref}`stage types ` for more information. +::: + +(plm-approvals-approval-type)= + +In the {guilabel}`Edit` stage pop-up window, click the {guilabel}`Add a line` button, located under +{guilabel}`Approvals`. Then, type in the approver's position (or title) under {guilabel}`Role` (e.g. +`Engineering Manager`, `Quality Team`, etc.), and select the relevant {guilabel}`User` from the +drop-down menu. + +Next, set the {guilabel}`Approval Type` to {guilabel}`Is required to approve`, {guilabel}`Approves, +but the approval is optional`, or {guilabel}`Comments only`. + +```{eval-rst} +.. example:: + Assign the `CTO`, "Mitchell Admin," as a required approver for |ECOs| in the `Validated` stage in + the `New Product Introduction` ECO type. + + Approvals from the quality and marketing teams are **not** required to apply changes to the |ECO| + because their :guilabel:`Approval Type` is set to :guilabel:`Approves, but the approval is + optional` and :guilabel:`Comments only`, respectively. + + .. image:: approvals/approvers.png + :align: center + :alt: Set an approver that "Is required to approve" ECOs in the "Validated" stage. +``` + +## Manage approvals + +Approvers can easily track their to-do approvals by navigating to the {menuselection}`PLM app`, and +looking at the card for an ECO type, which shows the count of open tasks assigned to them. + +Here's what each button on an ECO project card does: + +1. The {guilabel}`# Engineering Changes` button displays a count of in-progress {{ ECOs }} of this ECO + type. Clicking the button opens the Gantt view of the {guilabel}`Engineering Change Orders` page. + +2. {guilabel}`My Validations` displays a count of {{ ECOs }} the approver must accept or reject. + Clicking on this button displays {{ ECOs }} pending approval or rejected (marked with the red + {guilabel}`Blocked` state). + +3. The {guilabel}`All Validations` button shows the count of {{ ECOs }} awaiting approval or rejected by + any approver. Clicking it reveals these pending {{ ECOs }}. + +4. {guilabel}`To Apply` displays a count of {{ ECOs }} to which the user needs to apply changes. + Clicking on the button displays all the {{ ECOs }} to approve, and apply changes to, in the + verification stage. + + {{ ECOs }} marked with the green {guilabel}`Done` stage have already been approved, and the user just + needs to click on the {{ ECO }} to enter the form view, and click the {guilabel}`Apply Changes` + button. + +```{image} approvals/validation-overview.png +:align: center +:alt: Display count of validations to-do and buttons to open filtered list of ECOs. +``` + +### Approve ECOs + +Navigate to an {{ ECO }} in a verification stage, while logged in as the assigned approver, to see the +{guilabel}`Approve`, {guilabel}`Reject`, and {guilabel}`Apply Changes` buttons. + +To approve the {{ ECO }}, and apply the changes onto the production {abbr}`BoM (Bill of Materials)`, +click {guilabel}`Approve`, and then {guilabel}`Apply Changes`. + +Note that the {guilabel}`Apply Changes` button will **not** work unless the {guilabel}`Approve` +button was clicked first. Additionally, the chatter logs the history of the clicked buttons. + +:::{warning} +When the {guilabel}`Approval Type` is **not** set to {guilabel}`Is required to approve`, approval +from the associated user is not needed before applying changes with the {guilabel}`Apply Changes` +button. Thus, the {guilabel}`Apply Changes` button **will work** without requiring the +{guilabel}`Approve` button to be clicked first. +::: + +### Automated activities + +When an {{ ECO }} is moved to a verification stage, a planned activity is automatically created for +assigned approvers to review the {{ ECO }}. Approvers receive a notification in their activities inbox, +accessible through the {guilabel}`🕘 (clock)` icon at the top of the page. + +In the to-do task list, the {guilabel}`Engineering Change Order (ECO)` notification displays the +number of activities marked {guilabel}`Late`, {guilabel}`Today`, and {guilabel}`Future`. Clicking on +each of these buttons shows a filtered Gantt view of the respective {{ ECOs }}. + +```{eval-rst} +.. example:: + Scheduled activities are shown as a number on the :guilabel:`🕘 (clock)` icon, with `5` |ECOs| + pending approval :guilabel:`Today`. Currently, there are `0` :guilabel:`Late` or + :guilabel:`Future` |ECOs|. + + .. image:: approvals/todo-list.png + :align: center + :alt: Show scheduled approvals notifications for the user. +``` + +By clicking a pending {{ ECO }}, a *planned activity* for {guilabel}`ECO Approval` is recorded in the +chatter. Click on the {guilabel}`i (Info)` icon to view additional information, including the +approval's {guilabel}`Created` date, the approver {guilabel}`Assigned to` it, and the due date. + +```{image} approvals/planned-activity.png +:align: center +:alt: Show additional details of the planned ECO approval. +``` + +#### Follow-up activities + +When {{ ECOs }} are rejected, tasks need to be assigned to project members for required modifications +before {{ ECO }} approval. To create tasks with deadlines, navigate to the rejected {{ ECO }} form, and go +to the chatter. + +Select the {guilabel}`Mark Done` button in the {guilabel}`Planned Activities` section of the chatter +to close the activity, and open a pop-up window for creating tasks. + +```{image} approvals/mark-as-done.png +:align: center +:alt: |- +: Show *Mark Done* window to show *Done & Schedule Next*, *Done*, and *Discard* buttons to +: close the planned activity. +``` + +In the {guilabel}`Mark Done` window, click {guilabel}`Done & Schedule Next` to open a new +{guilabel}`Schedule an Activity` window. Next, set the {guilabel}`Assigned to` team member and the +{guilabel}`Due Date` for completing the changes. Provide task details in the {guilabel}`Summary` +field and the text box. Click the {guilabel}`Schedule` button to close the window. + +After closing the window, on the {{ ECO }} form, move the {{ ECO }} back one stage. Doing so ensures that +when the team member completes the changes, and returns the {{ ECO }} to the verification stage, a new +{guilabel}`ECO Approval` task is created for the approver. + +```{eval-rst} +.. example:: + The approver creates an activity for the :guilabel:`Responsible` of the |ECO|, `Laurie Poiret`, + that details the changes required for the approver to :guilabel:`Accept` the |ECO|. Clicking the + :guilabel:`Schedule` button creates a planned activity for Laurie due on `08/15/2023`. + + .. image:: approvals/schedule-an-activity.png + :align: center + :alt: Create a scheduled activity for follow-up changes to a rejected ECO. +``` + diff --git a/content/applications/inventory_and_mrp/purchase.md b/content/applications/inventory_and_mrp/purchase.md new file mode 100644 index 000000000..07c198366 --- /dev/null +++ b/content/applications/inventory_and_mrp/purchase.md @@ -0,0 +1,24 @@ +--- +hide-page-toc: true +nosearch: true +show-content: true +show-toc: true +--- + +# Purchase + +**Odoo Purchase** helps keep track of purchase agreements, quotations, and purchase orders. Learn +how to monitor purchase tender, automate replenishment, and follow up on your orders. + +:::{seealso} +- [Odoo Tutorials: Purchase](https://www.odoo.com/slides/purchase-23) +::: + +```{toctree} +:titlesonly: true + +purchase/products +purchase/manage_deals +purchase/advanced +``` + diff --git a/content/applications/inventory_and_mrp/purchase/advanced.md b/content/applications/inventory_and_mrp/purchase/advanced.md new file mode 100644 index 000000000..f4b72af77 --- /dev/null +++ b/content/applications/inventory_and_mrp/purchase/advanced.md @@ -0,0 +1,14 @@ +--- +nosearch: true +--- + +# Advanced + +```{toctree} +:titlesonly: true + +advanced/analyze +advanced/vendor_costs_report +advanced/procurement_expenses_report +``` + diff --git a/content/applications/inventory_and_mrp/purchase/advanced/analyze.md b/content/applications/inventory_and_mrp/purchase/advanced/analyze.md new file mode 100644 index 000000000..662a9708e --- /dev/null +++ b/content/applications/inventory_and_mrp/purchase/advanced/analyze.md @@ -0,0 +1,151 @@ +--- +substitutions: + PO: '{abbr}`PO (purchase order)`' + POs: '{abbr}`POs (purchase orders)`' +--- + +# Purchase Analysis report + +The *Purchase Analysis* report provides statistics about products purchased using Odoo's +**Purchase** app. This data is useful for gaining a deeper understanding of key metrics related to +purchase orders (POs), including the quantity of products ordered and received, the amount of time +it takes to receive purchased products, and more. + +To open the Purchase Analysis report, navigate to {menuselection}`Purchase app --> Reporting --> +Purchase`. + +:::{important} +The {guilabel}`Purchase Analysis` report is one of many reports available across the Odoo app +suite. This documentation only covers the measures specific to the {guilabel}`Purchase Analysis` +report, along with a few use case examples. + +For a full overview of the basic features available in most Odoo reports, see the documentation +on {doc}`reporting essentials <../../../essentials/reporting>`. +::: + +## Measures + +*Measures* refer to the various datasets that can be displayed on the {guilabel}`Purchase Analysis` +report, with each dataset representing a key statistic about {{ POs }} or products. To choose a measure, +click the {guilabel}`Measures` {icon}`fa-caret-down` button, and select one of the options from the +drop-down menu: + +- {guilabel}`# of Lines`: The number of {{ PO }} order lines, across all {{ POs }}. +- {guilabel}`Average Cost`: The average cost of {{ POs }}. +- {guilabel}`Days to Confirm`: The number of days it takes to confirm a {{ PO }}. +- {guilabel}`Days to Receive`: The number of days it takes to receive the products in a {{ PO }}. +- {guilabel}`Gross Weight`: The total weight of purchased products. +- {guilabel}`Qty Billed`: The quantity of a product (or products) for which the vendor has already + been billed. +- {guilabel}`Qty Ordered`: The quantity of a product (or products) ordered. +- {guilabel}`Qty Received`: The quantity of an ordered product (or products) received. +- {guilabel}`Qty to be Billed`: The quantity of an ordered product (or products) for which the + vendor has yet to be billed. +- {guilabel}`Total`: The total amount spent, including tax. +- {guilabel}`Untaxed Total`: The total amount spent, excluding tax. This measure is selected by + default. +- {guilabel}`Volume`: The total volume of ordered products, for products which are measured by + volume. +- {guilabel}`Count`: The total count of {{ POs }}. + +:::{tip} +Only one measure can be selected at a time when one of the {icon}`fa-area-chart` +{guilabel}`(graph view)` options is enabled. However, multiple measures, and varying group-by +criteria (on the x and y axes), can be selected when using the {icon}`oi-view-pivot` +{guilabel}`(pivot table)`. +::: + +(purchase-purchase-analysis-example)= + +## Use case: determine days to receive products from each vendor + +One possible use case for the {guilabel}`Purchase Analysis` report is determining how long each +vendor takes to deliver purchased items. This allows companies to make better informed decisions +about which vendors they want to purchase from. + +```{eval-rst} +.. example:: + A local bike shop, *Bike Haus*, sells high-quality unicycles, bicycles, tricycles, and all the + accessories needed to ride and maintain them. They purchase their inventory from a few different + vendors, and then sell those products on to customers through their storefront. + + Recently, Bike Haus has decided to have their purchasing manager, David, look into how long it + has taken each of their vendors to deliver the items they've purchased during the current year, + 2024. + + David starts by navigating to :menuselection:`Purchase app --> Reporting --> Purchase`, and + selecting the :icon:`fa-bar-chart` (bar chart) graph type at the top of the report. + + Next, he clicks the :icon:`fa-caret-down` :guilabel:`(toggle)` button on the right of the search + bar to open its drop-down menu. In the :guilabel:`Confirmation Date` filter section, he makes + sure that **only** the :guilabel:`2024` filter is enabled. Then, he selects the + :guilabel:`Vendor` option in the :guilabel:`Group By` section, before clicking away from the + drop-down menu to close it. + + Finally, David clicks on the :guilabel:`Measures` :icon:`fa-caret-down` drop-down menu, and + selects the :guilabel:`Days to Receive` option. + + With all of these options enabled, the :guilabel:`Purchase Analysis` report shows a bar chart, + with one bar for each vendor, representing the average number of days it takes to receive + products purchased from the vendor. + + Using this data, David can see that it takes Bike Friends over 4.5 days, on average, to deliver + purchased products. This is more than four times the amount of time it takes any other vendor. + + Based on these findings, David makes the decision to reduce the quantity of products purchased + from Bike Friends. + + .. image:: analyze/dtr.png + :align: center + :alt: The Purchase report, showing the average days to receive products from vendors. +``` + +## Use case: compare vendor POs for two time periods + +Another use for the {guilabel}`Purchase Analysis` report is to compare key statistics about {{ POs }} +for two different time periods, for a specific vendor. By doing so, it is easy to understand how +purchases from the vendor have increased or decreased. + +```{eval-rst} +.. example:: + Following the :ref:`previous example `, it has been one month + since Bike Haus decided to reduce the quantity of products purchased from Bike Friends, one of + their retailers. Bike Haus' purchasing manager, David, wants to understand the impact this + decision has had on the amount of money they have spent on Bike Friends products. + + David starts by navigating to :menuselection:`Purchase app --> Reporting --> Purchase`. Then, he + selects the :icon:`oi-view-pivot` :guilabel:`(pivot table)` option at the top of the screen. + + In the search bar, he types `Bike Friends`, and clicks :guilabel:`Enter`, so the report only + shows data for purchases from Bike Friends. + + Then, David clicks the :icon:`fa-caret-down` :guilabel:`(toggle)` button on the right of the + search bar to open its drop-down menu. In the :guilabel:`Confirmation Date` field, he leaves the + :guilabel:`June` and :guilabel:`2024` filters enabled. He also selects :guilabel:`Confirmation + Date: Previous Period` in the :guilabel:`Comparison` section, before clicking away from the + drop-down menu to close it. + + Next, David clicks on the :guilabel:`Measures` :icon:`fa-caret-down` drop-down menu. He leaves + the :guilabel:`Total` and :guilabel:`Untaxed Total` datasets enabled, and disables the + :guilabel:`Order` and :guilabel:`Count` datasets. + + Finally, David clicks the :icon:`fa-minus-square-o` :guilabel:`Total` button above the rows on + the pivot table, and selects the :guilabel:`Product` option. + + With all of these options configured, the :guilabel:`Purchase Analysis` report shows a pivot + table comparing purchase data for the current month, June, with the previous month, May. + + The pivot table is broken down into two main columns: one for the untaxed total spent, and one + for the taxed total spent. These columns are further broken down into three smaller columns: the + amount spent in May, the amount spent in June, and the variation between the two months, + represented as a percentage. + + On the left side of the pivot table, one row is shown for each product purchased from Bike + Friends during June. Using this report, David is able to see that Bike Haus has spent much less + money on products purchased from Bike Friends, compared to the previous month. + + .. image:: analyze/comparison.png + :align: center + :alt: The Purchase report, comparing the amount spent at a vendor. +``` + diff --git a/content/applications/inventory_and_mrp/purchase/advanced/procurement_expenses_report.md b/content/applications/inventory_and_mrp/purchase/advanced/procurement_expenses_report.md new file mode 100644 index 000000000..378f2825c --- /dev/null +++ b/content/applications/inventory_and_mrp/purchase/advanced/procurement_expenses_report.md @@ -0,0 +1,137 @@ +--- +substitutions: + PO: '{abbr}`PO (Purchase Order)`' + POs: '{abbr}`POs (Purchase Orders)`' + RFQ: '{abbr}`RfQ (Request for Quotation)`' + RFQs: '{abbr}`RfQs (Requests for Quotation)`' + caret: '{icon}`fa-caret-down` {guilabel}`(down)` icon' + per: procurement expenses report +--- + +# Procurement expenses report + +With the *Purchase* application, users can monitor procurement expenses over time. This report helps +companies track and analyze spending, identify cost-saving opportunities, and ensure efficient +budget management. + +## Create procurement expenses report + +To create a {{ per }}, first navigate to {menuselection}`Purchase app --> Reporting --> Purchase` to +open the {guilabel}`Purchase Analysis` dashboard. + +By default, the dashboard displays a line chart overview of the {guilabel}`Untaxed Total` of +{guilabel}`Purchase Orders` (POs) with a {guilabel}`Confirmation Date` for the current month, or of +Requests for Quotation (RFQs) with a status of *Draft*, *Sent*, or *Cancelled*. + +### Add filters and groups + +On the top-right, click the {icon}`oi-view-pivot` {guilabel}`(pivot)` icon to switch to pivot view. + +:::{tip} +While the {{ per }} can also be {ref}`viewed ` as a {icon}`fa-bar-chart` +{guilabel}`(bar chart)`, {icon}`fa-line-chart` {guilabel}`(line chart)`, or {icon}`fa-pie-chart` +{guilabel}`(pie chart)`, the pivot view provides the most detailed view of the data, and is the +recommended starting point. +::: + +Remove any default filters from the {guilabel}`Search...` bar. Then, click the {{ caret }} to open the +drop-down menu that contains the {guilabel}`Filters`, {guilabel}`Group By`, and +{guilabel}`Favorites` columns. + +:::{note} +Unless otherwise specified, the report displays data from both {{ RFQs }} and {{ POs }}. This can be +changed by selecting either {guilabel}`Requests for Quotation` or {guilabel}`Purchase Orders` +under the {guilabel}`Filters` column. +::: + +Under the {guilabel}`Filters` column, select a time frame to use for comparison. The report can be +filtered by either {guilabel}`Order Date` or {guilabel}`Confirmation Date`. Choose one from the +list, and click the {{ caret }} to specify the date range, either by month, quarter, or year. + +Next, under the {guilabel}`Group by` column, select {guilabel}`Vendor`. Then, select +{guilabel}`Product Category`, which is also located in the {guilabel}`Group By` column. + +:::{note} +The selections under the {guilabel}`Group By` heading can be altered, depending on the needs of +the individual company. For example, selecting {guilabel}`Product`, instead of {guilabel}`Product +Category`, provides a more in depth look at the performance of specific items, in place of an +entire category. +::: + +Next, make a selection under the {guilabel}`Comparison` heading that appears. These options are only +available after the date range is selected under the {guilabel}`Filters` column, and vary based on +that range. {guilabel}`Previous Period` adds a comparison to the previous period, such as the last +month or quarter. {guilabel}`Previous Year` compares the same time period from the previous year. + +:::{note} +While multiple time-based filters can be added at once, only one comparison can be selected at a +time. +::: + +:::{figure} procurement_expenses_report/filters-groups.png +:align: center +:alt: |- +: The drop-down menu of filters, group by and comparison options for the procurement expenses +: report. + +The filter for Q2, comparison for **Previous Period**, and group-by for **Vendor** and **Product +Category** were selected. +::: + +### Add measures + +After selecting the {guilabel}`Filters`, {guilabel}`Group by`, and {guilabel}`Comparison` settings, +click out of the drop-down menu. + +By default, the report displays data with the following measures: {guilabel}`Order`, +{guilabel}`Total`, {guilabel}`Untaxed Total`, and {guilabel}`Count`. Click {guilabel}`Measures` at +the top-left to open the drop-down list of available measures. + +Click the following specific measures to include additional columns for the procurement expenses +report: + +- {guilabel}`Total` and {guilabel}`Untaxed Total`: can include one or both measures. These are + included for overall spending analysis. +- {guilabel}`Average Cost`: included to evaluate cost efficiency. +- {guilabel}`Days to Confirm` and {guilabel}`Days to Receive`: used to assess supplier performance. +- {guilabel}`Qty Ordered` and {guilabel}`Qty Received`: used to understand order efficiency. +- {guilabel}`Qty Billed` and {guilabel}`Qty to be Billed`: used to track order accuracy. + +:::{tip} +Additional measures can be included in the report, if desired, to provide additional insights. +For example, {guilabel}`Gross Weight` and {guilabel}`Volume` may be included for further +logistics and management analysis. +::: + +After selecting all necessary measures, click out of the drop-down menu. + +(purchase-view-results)= + +## View results + +After all of the filters and measures have been selected, the report generates in the selected view. + +```{image} procurement_expenses_report/sample-per-report.png +:align: center +:alt: A sample version of the procurement expenses report. +``` + +Click {guilabel}`Insert in Spreadsheet` to add the pivot view into an editable spreadsheet format +within the *Documents* app. + +:::{important} +The {guilabel}`Insert in Spreadsheet` option is **only** available if the *Documents Spreadsheet* +module is installed. +::: + +:::{note} +The {{ per }} is also available in graph view. Click the {icon}`fa-area-chart` {guilabel}`(area +chart)` icon to change to graph view. Click the corresponding icon at the top of the report to +switch to a {icon}`fa-bar-chart` {guilabel}`(bar chart)`, {icon}`fa-line-chart` {guilabel}`(line +chart)`, or {icon}`fa-pie-chart` {guilabel}`(pie chart)`. +::: + +:::{seealso} +To save this report as a *favorite*, see {ref}`search/favorites`. +::: + diff --git a/content/applications/inventory_and_mrp/purchase/advanced/vendor_costs_report.md b/content/applications/inventory_and_mrp/purchase/advanced/vendor_costs_report.md new file mode 100644 index 000000000..d865fa4b1 --- /dev/null +++ b/content/applications/inventory_and_mrp/purchase/advanced/vendor_costs_report.md @@ -0,0 +1,116 @@ +--- +substitutions: + POs: '{abbr}`POs (Purchase Orders)`' + RFQ: '{abbr}`RfQ (Request for Quotation)`' + RFQs: '{abbr}`RfQs (Requests for Quotation)`' + caret: '{icon}`fa-caret-down` {guilabel}`(down)` icon' +--- + +# Vendor costs report + +With the *Purchase* application, users can track the fluctuation of vendor costs over time. This +allows users to identify the most expensive vendors, and track seasonal changes. + +## Create vendor costs reports + +To create a vendor costs report, first navigate to {menuselection}`Purchase app --> Reporting --> +Purchase` to open the {guilabel}`Purchase Analysis` dashboard. By default, the dashboard displays a +line chart overview of the {guilabel}`Untaxed Total` of POs (Purchase Orders) with a +{guilabel}`Confirmation Date` for the current month, or of RFQs (Requests for Quotation) with a +status of *Draft*, *Sent, or \*Cancelled*. + +(purchase-vender-cost-report-filters)= + +### Add filters and groups + +On the top-right, click the {icon}`oi-view-pivot` {guilabel}`(pivot)` icon to switch to pivot view. + +Remove any default filters from the {guilabel}`Search...` bar. Then, click the {{ caret }} to open the +drop-down menu that contains the {guilabel}`Filters`, {guilabel}`Group By`, and +{guilabel}`Favorites` columns. + +:::{note} +Unless otherwise specified, the report displays data from both {{ RFQs }} and {{ POs }}. This can be +changed by selecting either {guilabel}`Requests for Quotation` or {guilabel}`Purchase Orders` +under the {guilabel}`Filters` column. +::: + +Under the {guilabel}`Filters` column, select a date range to use for comparison. The report can be +filtered by either {guilabel}`Order Date` or {guilabel}`Confirmation Date`. Choose one from the +list, and click the {{ caret }} to specify the date range, either by month, quarter, or year. + +Next, under the {guilabel}`Group by` column, select {guilabel}`Vendor`. Then, select +{guilabel}`Product`, which is also located in the {guilabel}`Group By` column. + +:::{note} +Selecting {guilabel}`Product` is **not** required for this report. However, it is recommended, as +it provides additional insight into the performance of individual vendors. Additional selections +can be made under the {guilabel}`Group by` heading as well, including {guilabel}`Product +Category`, {guilabel}`Status`, and {guilabel}`Purchase Representative`. + +To ensure the report is generated correctly, make sure that {guilabel}`Vendor` is the **first** +selection made under the {guilabel}`Group By` column. +::: + +Next, make a selection under the {guilabel}`Comparison` heading. These options are only available +after the date range is selected under the {guilabel}`Filters` column, and vary based on that range. +{guilabel}`Previous Period` adds a comparison to the previous period, such as the last month or +quarter. {guilabel}`Previous Year` compares the same time period from the previous year. + +:::{note} +While multiple time-based filters can be added at once, only one comparison can be selected at a +time. +::: + +```{image} vendor_costs_report/filters-groups.png +:align: center +:alt: The drop-down menu of filters, group by and comparison options for the vendor +: costs report. +``` + +### Add measures + +After selecting the {guilabel}`Filters`, {guilabel}`Group by`, and {guilabel}`Comparison` settings, +click out of the drop-down menu. + +By default, the report displays with the following measures: {guilabel}`Order`, {guilabel}`Total`, +{guilabel}`Untaxed Total`, and {guilabel}`Count`. Click {guilabel}`Measures` at the top-left to open +the drop-down list of available measures. Click {guilabel}`Average Cost` to add it to the report. +Select any additional measures to add to the report, or click on any of the already selected +measures to remove them, if desired. + +:::{tip} +It is recommended to run the report with at least {guilabel}`Average Cost`, {guilabel}`Total`, or +{guilabel}`Untaxed Total` selected from the {guilabel}`Measures` list. Additional measures, such +as {guilabel}`Days to Receive`, can be added to provide additional insights. +::: + +## View results + +After all of the {ref}`filters and measures have been selected +`, the report generates in the pivot view. Click +{guilabel}`Insert in Spreadsheet` to add the pivot view into an editable spreadsheet format within +the *Documents* app. + +:::{important} +The {guilabel}`Insert in Spreadsheet` option is only available if the *Documents Spreadsheet* +module is installed. +::: + +```{image} vendor_costs_report/sample-vendor-report.png +:align: center +:alt: A sample of a vendor costs report with the measures set as total and average +: costs. +``` + +:::{note} +The vendor costs report is also available in *graph* view. Click the {icon}`fa-area-chart` +{guilabel}`(area chart)` icon to change to graph view. Click the corresponding icon at the top of +the report to switch to a {icon}`fa-bar-chart` {guilabel}`(bar chart)`, {icon}`fa-line-chart` +{guilabel}`(line chart)`, or {icon}`fa-pie-chart` {guilabel}`(pie chart)`. +::: + +:::{seealso} +To save this report as a *favorite*, see {ref}`search/favorites`. +::: + diff --git a/content/applications/inventory_and_mrp/purchase/manage_deals.md b/content/applications/inventory_and_mrp/purchase/manage_deals.md new file mode 100644 index 000000000..c5bb0d646 --- /dev/null +++ b/content/applications/inventory_and_mrp/purchase/manage_deals.md @@ -0,0 +1,17 @@ +--- +nosearch: true +--- + +# Manage deals + +```{toctree} +:titlesonly: true + +manage_deals/rfq +manage_deals/blanket_orders +manage_deals/calls_for_tenders +manage_deals/purchase_templates +manage_deals/control_bills +manage_deals/manage +``` + diff --git a/content/applications/inventory_and_mrp/purchase/manage_deals/blanket_orders.md b/content/applications/inventory_and_mrp/purchase/manage_deals/blanket_orders.md new file mode 100644 index 000000000..5114fa546 --- /dev/null +++ b/content/applications/inventory_and_mrp/purchase/manage_deals/blanket_orders.md @@ -0,0 +1,194 @@ +--- +substitutions: + PO: '{abbr}`PO (Purchase Order)`' + RfQ: '{abbr}`RfQ (Request for Quotation)`' + RfQs: '{abbr}`RfQs (Requests for Quotation)`' + SO: '{abbr}`SO (Sales Order)`' + UoM: '{abbr}`UoM (Unit of Measure)`' +--- + +# Blanket orders + +(purchase/manage_deals/blanket-orders)= + +Blanket orders are long-term purchase agreements between a company and a vendor to deliver products +on a recurring basis with predetermined pricing. + +Blanket orders are helpful when products are consistently purchased from the same vendor, but in +different quantities, and at different times. + +By simplifying the ordering process, blanket orders not only save time, they also save money, since +they can be advantageous when negotiating bulk pricing with vendors. + +## Create a new blanket order + +To create blanket orders, enable the *Purchase Agreements* feature from the *Purchase* app settings. +Navigate to {menuselection}`Purchase app --> Configuration --> Settings`, and under the +{guilabel}`Orders` section, click the checkbox for {guilabel}`Purchase Agreements`. Then click +{guilabel}`Save` to implement the changes. + +:::{note} +In addition to creating blanket orders, the *Purchase Agreements* setting also allows users to +create alternative requests for quotation (RfQs). +::: + +```{image} blanket_orders/blanket-orders-enabled-setting.png +:align: center +:alt: Purchase Agreements enabled in the Purchase app settings. +``` + +To create a blanket order, go to {menuselection}`Purchase app --> Orders --> Blanket Orders`, and +click {guilabel}`New`. This opens a new blanket order form. + +Configure the following fields in the new blanket order form to establish predetermined rules for +the recurring long-term agreement: + +- {guilabel}`Purchase Representative`: the user assigned to this specific blanket order. By default, + this is the user who created the agreement; the user can be changed directly from the drop-down + menu next to this field. +- {guilabel}`Agreement Type`: the type of purchase agreement this blanket order is classified as. In + Odoo, blanket orders are the only official purchase agreement. +- {guilabel}`Vendor`: the supplier to whom this agreement is tied, either once or on a recurring + basis. The vendor can be selected directly from the drop-down menu next to this field. +- {guilabel}`Currency`: the agreed-upon currency to be used for this exchange. If multiple + currencies have been activated in the database, the currency can be changed from the drop-down + menu next to this field. +- {guilabel}`Agreement Deadline`: the date that this purchase agreement will be set to expire on. If + this blanket order should not expire, leave this field blank. +- {guilabel}`Ordering Date`: the date that this blanket order should be placed on if a new quotation + is created directly from the blanket order form. If a new quotation is created, this value + automatically populates the *Order Deadline* field on the {{ RfQ }}. +- {guilabel}`Delivery Date`: the expected delivery date that the products included in an {{ RfQ }} are + expected, if created directly from a blanket order form. If a new quotation is created, this value + automatically populates the *Expected Arrival* field on the {{ RfQ }}. +- {guilabel}`Source Document`: the source purchase order (PO) that this blanket order is tied to. If + this blanket order should not be tied to any existing {{ PO }}, leave this field blank. +- {guilabel}`Company`: the company assigned to this specific blanket order. By default, this is the + company that the user creating the blanket order is listed under. If the database is not a + multi-company database, this field **cannot** be changed, and defaults to the only company listed + in the database. + +```{image} blanket_orders/blanket-orders-new-agreement.png +:align: center +:alt: New blanket order purchase agreement with added products. +``` + +Once all relevant fields have been filled out, click {guilabel}`Add a line` to add products under +the {guilabel}`Product` column. Then, in the {guilabel}`Quantity` column, change the quantity of +each product, and set a price in the {guilabel}`Unit Price` column. + +:::{important} +When adding products to a new blanket order, the pre-existing prices of products are not +automatically added to the product lines. Instead, the prices **must** be manually assigned, by +changing the value in the {guilabel}`Unit Price` column to an agreed-upon price with the listed +vendor. Otherwise, the price will remain `0`. +::: + +To view and change the default purchase agreement settings for blanket orders directly from the +blanket order form, click the {guilabel}`➡️ (right arrow)` icon that becomes visible when hovering +over the {guilabel}`Agreement Type` field, where {guilabel}`Blanket Order` is listed. This navigates +to the blanket order settings. + +```{image} blanket_orders/blanket-orders-internal-link-arrow.png +:align: center +:alt: Internal link arrow next to Agreement Type field on blanket order form. +``` + +From here, the settings for blanket orders can be edited. Under the {guilabel}`Agreement Type` +section, the name of the {guilabel}`Agreement Type` can be changed, and the {guilabel}`Agreement +Selection Type` can be changed, as well. There are two options that can be activated for the type of +selection: + +- {guilabel}`Select only one RfQ (exclusive)`: when a purchase order is confirmed, the remaining + purchase orders are cancelled. +- {guilabel}`Select multiple RfQ (non-exclusive)`: when a purchase order is confirmed, remaining + purchase orders are **not** cancelled. Instead, multiple purchase orders are allowed. + +Under the {guilabel}`Data For New Quotations` section, the {guilabel}`Lines` and +{guilabel}`Quantities` fields can be edited. Doing so sets how new quotations should be populated +when using this purchase agreement. + +```{image} blanket_orders/blanket-orders-edit-agreement-type.png +:align: center +:alt: Purchase Agreement type edit screen for blanket orders. +``` + +There are two options that can be activated for {guilabel}`Lines`: + +- {guilabel}`Use lines of agreement`: when creating a new quotation, the product lines pre-populate + with the same products listed on the blanket order, if said blanket order is chosen for the new + quotation. +- {guilabel}`Do not create RfQ lines automatically`: when creating a new quotation, **and** + selecting an existing blanket order, the settings carry over to the new quotation, but the product + lines do **not** populate. + +And, there are two options that can be activated for {guilabel}`Quantities`: + +- {guilabel}`Use quantities of agreement`: when creating a new quotation, the product quantities + listed on the blanket order pre-populate on the product lines, if said blanket order is chosen for + the new quotation. +- {guilabel}`Set quantities manually`: when creating a new quotation, **and** selecting an existing + blanket order, the product lines pre-populate, but all quantities are set to `0`. The quantities + **must** be manually set by the user. + +Once any desired changes have been made, click {guilabel}`New` (via the breadcrumbs, at the top of +the page) to navigate back to the blanket order form. Then, click {guilabel}`Confirm` to save this +new purchase agreement. + +Once confirmed, the blanket order's stage (in the upper-right corner) changes from {guilabel}`Draft` +to {guilabel}`Ongoing`, meaning this agreement can be selected and used when creating new {{ RfQs }}. + +:::{tip} +After creating and confirming a blanket order, products, quantities, and prices can still be +edited, added, and removed from the purchase agreement. +::: + +## Create a new {{ RfQ }} from the blanket order + +After confirming a blanket order, new quotations can be created directly from the blanket order +form. {{ RfQs }} using this form are pre-populated with information based on the rules set in the form. +Additionally, new quotations are automatically linked to this blanket order form, via the +{guilabel}`RFQs/Orders` smart button at the top-right of the form. + +To create a new quotation from the blanket order form, click the {guilabel}`New Quotation` button. +This opens a new {{ RfQ }}, that is pre-populated with the correct information, depending on the +settings configured on the blanket order form. + +From the new {{ RfQ }} form, click {guilabel}`Send by Email` to compose and send an email to the listed +vendor. Click {guilabel}`Print RFQ` to generate a printable PDF of the quotation; or, once ready, +click {guilabel}`Confirm Order` to confirm the {{ PO }}. + +```{image} blanket_orders/blanket-orders-new-quotation.png +:align: center +:alt: New quotation with copied products and rules from blanket order. +``` + +Once the {{ PO }} has been confirmed, click back to the blanket order form (via the breadcrumbs, at the +top of the page). From the blanket order form, there is now one {{ RfQ }} listed in the +{guilabel}`RFQs/Orders` smart button at the top-right of the form. Click the {guilabel}`RFQs/Orders` +smart button to see the {{ PO }} that was just created. + +```{image} blanket_orders/blanket-orders-rfq-smart-button.png +:align: center +:alt: RFQs and Orders smart button from blanket order form. +``` + +## Replenishment + +Once a blanket order is confirmed, a new vendor line is added under the {guilabel}`Purchase` tab of +the products included in the order. + +This makes blanket orders useful with {doc}`automated replenishment +<../../purchase/products/reordering>`, because information about the {guilabel}`Vendor`, +{guilabel}`Price`, and the {guilabel}`Agreement` are referenced on the vendor line. This information +dictates when, where, and at what price the product should be replenished. + +```{image} blanket_orders/blanket-orders-product-form.png +:align: center +:alt: Product form with replenishment agreement linked to blanket order. +``` + +:::{seealso} +{doc}`calls_for_tenders` +::: + diff --git a/content/applications/inventory_and_mrp/purchase/manage_deals/calls_for_tenders.md b/content/applications/inventory_and_mrp/purchase/manage_deals/calls_for_tenders.md new file mode 100644 index 000000000..475219b50 --- /dev/null +++ b/content/applications/inventory_and_mrp/purchase/manage_deals/calls_for_tenders.md @@ -0,0 +1,259 @@ +--- +substitutions: + PO: '{abbr}`PO (Purchase Order)`' + POs: '{abbr}`POs (Purchase Orders)`' + RfQ: '{abbr}`RfQ (Request for Quotation)`' + RfQs: '{abbr}`RfQs (Requests for Quotation)`' +--- + +# Call for tenders + +(purchase/manage_deals/alternative-rfqs)= + +Sometimes, companies might want to invite vendors to submit offers for similar goods or services all +at once. This helps companies select the cheapest, fastest vendors for their specific business +needs. + +In Odoo, this can be done by creating alternative requests for quotation (RfQs) for different +vendors. Once a response is received from each vendor, the product lines from each {{ RfQ }} can be +compared, and a decision can be made for which products to purchase from which vendors. + +:::{note} +Sometimes referred to as a *call for tender*, this process is primarily used by organizations in +the public sector, who are legally bound to use it when making a purchase. However, private +companies can also use alternative {{ RfQs }} to spend money efficiently. +::: + +## Configuration + +To create alternative {{ RfQs }}, the *Purchase Agreements* feature **must** be enabled in the +*Purchase* app settings. To enable the feature, navigate to {menuselection}`Purchase app --> +Configuration --> Settings`. Under the {guilabel}`Orders` section, click the checkbox for +{guilabel}`Purchase Agreements`. + +Then, click {guilabel}`Save` to apply the change. + +```{image} calls_for_tenders/calls-for-tenders-enabled-setting.png +:align: center +:alt: Purchase Agreements enabled in the Purchase app settings. +``` + +(purchase-manage-deals-create-rfq)= + +## Create an {{ RfQ }} + +To create a new {{ RfQ }}, follow the instructions in the {doc}`rfq` documentation. + +:::{seealso} +[Odoo Tutorial: Purchase Basics and Your First Request for Quotation](https://www.youtube.com/watch?v=o_uI718P1Dc) +::: + +(purchase-manage-deals-create-alternatives)= + +## Create alternative {{ RfQs }} + +Once a {{ PO }} is created and sent to a vendor, alternative {{ RfQs }} can be created for additional +vendors to compare prices, delivery times, and other factors, to help make a decision for the order. + +To create alternative {{ RfQs }} from the original, click the {guilabel}`Alternatives` tab. Then, click +{guilabel}`Create Alternative`. When clicked, a {guilabel}`Create alternative` pop-up window +appears. + +```{image} calls_for_tenders/calls-for-tenders-create-alternative.png +:align: center +:alt: Calls for tenders pop-up to create alternative quotation. +``` + +From this window, select an alternative vendor from the drop-down menu next to the +{guilabel}`Vendor` field, to whom the alternative quotation is assigned. + +Next to this, there is a {guilabel}`Copy Products` checkbox that is selected by default. When +selected, the product quantities of the original {{ RfQ }} are copied over to the alternative. For this +first alternative quotation, leave the checkbox checked. Once finished, click {guilabel}`Create +Alternative`. This opens a new {{ RfQ }} form. + +Since the {guilabel}`Create Alternative` checkbox was left checked, the new form is already +pre-populated with the same products, quantities, and other details as the previous, original {{ RfQ }}. + +:::{note} +When the {guilabel}`Copy Products` checkbox is selected while creating an alternative quotation, +additional products do **not** need to be added, unless desired. + +However, if a chosen vendor is listed in the {guilabel}`Vendor` column under a specific product +form included in the order, the values set on the product form carry over to the {{ RfQ }}, and +**must** be changed manually, if necessary. +::: + +Once ready, create a second alternative quotation by clicking the {guilabel}`Alternatives` tab, +followed by {guilabel}`Create Alternative`. + +This opens the {guilabel}`Create alternative` pop-up window. Once again, choose a different vendor +from the drop-down menu next to {guilabel}`Vendor`. For this particular {{ RfQ }}, however, *uncheck* +the {guilabel}`Copy Products` checkbox. Doing so removes all products on the new alternative {{ RfQ }}, +leaving it blank. The specific products which should be ordered from this particular vendor can be +added in as needed. + +Once ready, click {guilabel}`Create Alternative`. + +:::{tip} +If an alternative quotation should be removed from the {guilabel}`Alternatives` tab, they can be +individually removed by clicking on the {guilabel}`X (remove)` icon at the end of their row. +::: + +This creates a third, new {{ RfQ }}. But, since the product quantities of the original {{ RfQ }} were +**not** copied over, the product lines are empty, and new products can be added as needed by +clicking {guilabel}`Add a product`, and selecting the desired products from the drop-down menu. + +Once the desired number of specific products are added, click {guilabel}`Send by Email`. + +```{image} calls_for_tenders/calls-for-tenders-blank-quotation.png +:align: center +:alt: Blank alternative quotation with alternatives in breadcrumbs. +``` + +This opens a {guilabel}`Compose Email` pop-up window, wherein the message to the vendor can be +customized, and attachments can be added, if necessary. Once ready, click {guilabel}`Send`. + +From this newest form, click the {guilabel}`Alternatives` tab. Under this tab, all three {{ RfQs }} can +be seen in the {guilabel}`Reference` column. Additionally, the vendors are listed under the +{guilabel}`Vendor` column, and the order {guilabel}`Total` (and {guilabel}`Status`) of the orders +are in the rows, as well. + +The date in the {guilabel}`Expected Arrival` column is calculated for each vendor, based on any +pre-configured lead times in the vendor and product forms. + +(purchase-manage-deals-link-rfq)= + +## Link new {{ RfQ }} to existing quotations + +Even if a quotation is not created directly from the {guilabel}`Alternatives` tab of another {{ RfQ }}, +it can still be linked to existing {{ RfQs }}. + +To do that, begin by creating a new {{ RfQ }}. Navigate to {menuselection}`Purchase app --> New`. Fill +out the {{ RfQ }}, according to the {ref}`previous instructions `. + +Then, once ready, click the {guilabel}`Alternatives` tab. Since this new {{ RfQ }} was created +separately, there are no other orders linked yet. + +However, to link this {{ RfQ }} with existing alternatives, click {guilabel}`Link to Existing RfQ` on +the first line in the {guilabel}`Vendor` column. + +```{image} calls_for_tenders/calls-for-tenders-link-rfq-popup.png +:align: center +:alt: Pop-up to link new quotation to existing RFQs. +``` + +This opens an {guilabel}`Add: Alternative POs` pop-up window. Select the desired previously-created +{{ RfQs }}, and click {guilabel}`Select`. All of these orders are now copied to this {{ RfQ }}, and can be +found under the {guilabel}`Alternatives` tab. + +:::{tip} +If a large number of {{ POs }} are being processed, and the previous {{ POs }} can't be located, click +the {icon}`fa-chevron-down` {guilabel}`(chevron)` icon to the right of the search bar, at the top +of the pop-up window. + +Then, under the {guilabel}`Group By` section, click {guilabel}`Vendor`. Vendors are displayed in +their own nested drop-down lists, and each vendor's list can be expanded to view open {{ POs }} for +that vendor. +::: + +(purchase-manage-deals-compare-product-lines)= + +## Compare product lines + +Alternative {{ RfQs }} can be compared side-by-side, in order to determine which vendors offer the best +deals on the products included in the orders. + +To compare alternative {{ RfQs }}, navigate to the {menuselection}`Purchase` app, and select one of the +previously-created {{ RfQs }}. + +Then, click the {guilabel}`Alternatives` tab to see all linked {{ RfQs }}. Next, under the +{guilabel}`Create Alternative` option, click {guilabel}`Compare Product Lines`. This navigates to +the {guilabel}`Compare Order Lines` page. + +```{image} calls_for_tenders/calls-for-tenders-compare-products.png +:align: center +:alt: Compare Product Lines page for alternative RFQs. +``` + +The {guilabel}`Compare Order Lines` page, by default, groups by {guilabel}`Product`. Each product +included in any of the {{ RfQs }} is displayed in its own nested drop-down list, and features all of the +{{ PO }} numbers in the {guilabel}`Reference` column. + +:::{note} +To remove product lines from the {guilabel}`Compare Order Lines` page, click {guilabel}`Clear` at +the far-right end of that product line's row. + +Doing so removes this specific product as a selectable option from the page, and changes the +{guilabel}`Total` price of that product on the page to `0`. + +Additionally, on the {{ RfQ }} form, in which that product was included, its ordered quantity is also +changed to `0`. +::: + +Once the best offers have been identified, individual products can be selected by clicking the +{guilabel}`Choose` button at the end of each corresponding row. + +Once all desired products have been chosen, click {guilabel}`Requests for Quotation` (in the +breadcrumbs, at the top of the page) to navigate back to an overview of all {{ RfQs }}. + +(purchase-manage-deals-cancel-keep-alternatives)= + +## Cancel (or keep) alternatives + +Once the desired products have been chosen from the {guilabel}`Compare Order Lines` page, the +remaining {{ RfQs }}, from which no products were chosen, can be cancelled. + +The cost in the {guilabel}`Total` column for each product that wasn't chosen is automatically set to +`0`, indicated at the far-right of each corresponding row. + +Although they haven't been cancelled yet, this indicates that each of those orders can be cancelled +without having an effect on the other live orders, once those orders have been confirmed. + +```{image} calls_for_tenders/calls-for-tenders-zero-total.png +:align: center +:alt: Cancelled quotations in the Purchase app overview. +``` + +To confirm an {{ RfQ }} for which products were selected, click into an {{ RfQ }}, and click +{guilabel}`Confirm Order`. + +This causes a {guilabel}`What about the alternative Requests for Quotations?` pop-up window +to appear. + +To view a detailed form of one of the {{ RfQs }} listed, click the line item for that quotation. This +opens an {guilabel}`Open: Alternative POs` pop-up window, from which all details of that particular +{{ RfQ }} can be viewed. + +Once ready, click {guilabel}`Close` to close the pop-up window. + +In the {guilabel}`What about the alternative Requests for Quotations?` pop-up window, two options +are presented: {guilabel}`Cancel Alternatives` and {guilabel}`Keep Alternatives`. + +If this {{ PO }} should **not** be confirmed, click {guilabel}`Discard`. + +Selecting {guilabel}`Cancel Alternatives` automatically cancels the alternative {{ RfQs }}. Selecting +{guilabel}`Keep Alternatives` keeps the alternative {{ RfQs }} open, so they can still be accessed, if +any additional product quantities need to be ordered later. + +Once all products are ordered, select {guilabel}`Cancel Alternatives` from whichever {{ PO }} +is open at that time. + +```{image} calls_for_tenders/calls-for-tenders-keep-or-cancel.png +:align: center +:alt: Keep or cancel pop-up for alternative RFQs. +``` + +Finally, using the breadcrumbs at the top of the page, click {guilabel}`Requests for Quotation` to +navigate back to an overview of all {{ RfQs }}. + +The cancelled orders can be seen, greyed out and listed with a {guilabel}`Cancelled` status, under +the {guilabel}`Status` column at the far-right of their respective rows. + +Now that all product quantities have been ordered, the purchase process can be completed, and the +products can be received into the warehouse. + +:::{seealso} +{doc}`blanket_orders` +::: + diff --git a/content/applications/inventory_and_mrp/purchase/manage_deals/control_bills.md b/content/applications/inventory_and_mrp/purchase/manage_deals/control_bills.md new file mode 100644 index 000000000..d9eb64696 --- /dev/null +++ b/content/applications/inventory_and_mrp/purchase/manage_deals/control_bills.md @@ -0,0 +1,171 @@ +--- +substitutions: + PO: '{abbr}`PO (Purchase Order)`' + POs: '{abbr}`POs (Purchase Orders)`' +--- + +# Bill control policies + +(purchase/manage_deals/control-bills)= + +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. + +The policy selected in the *Purchase* app settings acts as the default value, and is applied to any +new product created. + +## 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`. + +```{image} control_bills/control-bills-selected-policy.png +:align: center +:alt: Selected bill control policy in Purchase app settings. +``` + +- {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. + + ```{image} control_bills/control-bills-error-message-popup.png + :align: center + :alt: Bill control policy draft bill error message. + ``` + +:::{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 + +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 --> +Settings`, and scroll down to the {guilabel}`Invoicing` section. Then, tick the checkbox for +{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 +received. + +To create a vendor bill from a {{ PO }}, navigate to {menuselection}`Purchase app --> Orders --> +Purchase Orders`. From the {guilabel}`Purchase Orders` page, select the desired {{ PO }} from the list. +Then, click {guilabel}`Create Bill`. Doing so opens a new draft {guilabel}`Vendor Bill` form, in the +{guilabel}`Draft` stage. Click the {guilabel}`Other Info` tab, and locate the {guilabel}`Should Be +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`. + +```{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} +If the total quantity of products from a {{ PO }} has not been received, Odoo only includes the +products that *have* been received in the draft vendor bill. +::: + +Draft vendor bills can be edited to increase the billed quantity, change the price of the products +in the bill, and add additional products to the bill. + +If the draft bill's information is changed, the {guilabel}`Should Be Paid` field status is set to +{guilabel}`Exception`. This means that Odoo notices the discrepancy, but does not block the changes +or display an error message, since there might be a valid reason for making changes to the draft +bill. + +To process the vendor bill, select a date in the {guilabel}`Bill Date` field, and click +{guilabel}`Confirm`, followed by {guilabel}`Register Payment`. + +This opens a {guilabel}`Register Payment` pop-up window. From this window, accounting information is +pre-populated based on the database's accounting settings. Click {guilabel}`Create Payment` to +process the vendor bill. + +Once payment has been registered for a vendor bill, and the bill displays the green {guilabel}`Paid` +banner, the {guilabel}`Should Be Paid` field status is set to {guilabel}`No`. + +:::{tip} +The {guilabel}`Should Be Paid` status on bills is automatically set by Odoo. However, the status +can be manually changed by clicking the field's drop-down menu inside the {guilabel}`Other Info` +tab. +::: + +## View a purchase order's billing status + +Once a {{ PO }} is confirmed, its {guilabel}`Billing Status` can be viewed under the {guilabel}`Other +Information` tab on the {{ PO }} form. + +To view the {guilabel}`Billing Status` of a {{ PO }}, navigate to {menuselection}`Purchase app --> +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 +when they are displayed, depending on the *Bill Control* policy used. + +```{eval-rst} +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - Billing Status + - On received quantities + - On ordered quantities + * - Nothing to Bill + - PO confirmed; no products received + - *Not applicable* + * - Waiting Bills + - All/some products received; bill not created + - PO confirmed + * - Fully Billed + - All/some products received; draft bill created + - Draft bill created +``` + +:::{seealso} +{doc}`manage` +::: + diff --git a/content/applications/inventory_and_mrp/purchase/manage_deals/manage.md b/content/applications/inventory_and_mrp/purchase/manage_deals/manage.md new file mode 100644 index 000000000..9839a581a --- /dev/null +++ b/content/applications/inventory_and_mrp/purchase/manage_deals/manage.md @@ -0,0 +1,248 @@ +--- +substitutions: + PO: '{abbr}`PO (Purchase Order)`' + POs: '{abbr}`POs (Purchase Orders)`' + RfQ: '{abbr}`RfQ (Request for Quotation)`' + RfQs: '{abbr}`RfQs (Requests for Quotation)`' +--- + +# Manage vendor bills + +(inventory/purchase/manage_deals/manage)= + +A *vendor bill* is an invoice received for products and/or services purchased by a company from a +vendor. Vendor bills record payables as they arrive from vendors, and can include amounts owed for +the goods and/or services purchased, sales taxes, freight and delivery charges, and more. + +In Odoo, a vendor bill can be created at different points in the purchasing process, depending on +the *bill control* policy chosen in the *Purchase* app's settings. + +## Bill control policies + +To configure the default bill control policy, navigate to {menuselection}`Purchase app --> +Configuration --> Settings`, and scroll to the {guilabel}`Invoicing` section. + +The {guilabel}`Bill Control` feature lists two policy options: {guilabel}`Ordered quantities` and +{guilabel}`Received quantities`. + +The policy selected acts as the default for any new product created. Each policy acts as follows: + +- {guilabel}`Ordered quantities`: creates a vendor bill as soon as a purchase order is confirmed. + The products and quantities in the purchase order are used to generate a draft bill. +- {guilabel}`Received quantities`: a bill is only created **after** all (or part) of the total order + has been received. The products and quantities received are used to generate a draft bill. + +```{image} manage/manage-configuration-settings.png +:align: center +:alt: Bill control policies in purchase app settings. +``` + +Once a policy is selected, click {guilabel}`Save` to save the changes. + +:::{tip} +If a product needs a different control policy than the one set in the *Purchase* app settings, +that product's control policy can be overridden by going to the {guilabel}`Purchase` tab on a +product form, and selecting the desired policy in the {guilabel}`Control Policy` field. + +```{image} manage/manage-product-form.png +:align: center +:alt: Control policy field on product form. +``` +::: + +### 3-way matching + +The *3-way matching* policy ensures vendor bills are only paid once all (or some) products in a +purchase order (PO) have been received. + +To activate 3-way matching, navigate to {menuselection}`Purchase app --> Configuration --> +Settings`, and scroll to the {guilabel}`Invoicing` section. + +Tick the checkbox next to {guilabel}`3-way matching`, and click {guilabel}`Save`. + +:::{important} +The {guilabel}`3-way matching` feature is **only** intended to work with the {guilabel}`Bill +Control` policy set to {guilabel}`Received quantities`. +::: + +## Create and manage vendor bills on receipts + +When products are received into a company's warehouse, receipts are created. Once the company +processes the received quantities, they can choose to create a vendor bill directly from the +warehouse receipt form. + +Depending on the bill control policy chosen in the settings, vendor bill creation is completed at +different steps of the procurement process. + +### Ordered quantities + +To create and manage vendor bills for receipts with the *Bill Control* policy set to *Ordered +Quantities*, first navigate to the {menuselection}`Purchase app`, and click {guilabel}`New` from the +{guilabel}`Requests for Quotation` dashboard. + +Doing so opens a new {guilabel}`Request for Quotation` (RfQ) form. On the blank {{ RfQ }} form, add a +{guilabel}`Vendor`, and click {guilabel}`Add a line` under the {guilabel}`Product` tab to add +products to the order. + +On the product line, select a product from the drop-down menu in the {guilabel}`Product` field, and +enter the quantity to order in the {guilabel}`Quantity` field. + +Once ready, click {guilabel}`Confirm Order` to confirm the {{ RfQ }} into a {{ PO }}. + +Then, click {guilabel}`Create Bill` to create a vendor bill. This opens a {guilabel}`Vendor Bill` +form in the {guilabel}`Draft` state. From here, add a billing date in the {guilabel}`Bill Date` +field. + +Once ready, confirm the bill by clicking {guilabel}`Confirm` on the {guilabel}`Vendor Bill` page. + +:::{tip} +Since the bill control policy is set to *Ordered quantities*, the draft bill can be confirmed as +soon as it is created, before any products have been received. +::: + +Once a payment has been received, click {guilabel}`Register Payment` at the top of the bill to +record it. + +Doing so causes a {guilabel}`Register Payment` pop-up window to appear, wherein a payment +{guilabel}`Journal` can be chosen, and a {guilabel}`Payment Method` selected. + +Additionally, the bill {guilabel}`Amount`, {guilabel}`Payment Date`, and {guilabel}`Memo` +({dfn}`Reference Number`) can be edited from this pop-up window, if necessary. + +Once ready, click {guilabel}`Create Payment` to finish creating the {guilabel}`Vendor Bill`. Doing +so displays a green {guilabel}`Paid` banner on the {{ RfQ }} form. + +```{image} manage/manage-draft-vendor-bill.png +:align: center +:alt: Vendor bill form for ordered quantities control policy. +``` + +### Received quantities + +To create and manage vendor bills for receipts with the bill control policy set to *Received +quantities*, first navigate to the {menuselection}`Purchase` app, and click {guilabel}`New`. + +Doing so opens a new {{ RfQ }} form. On the blank {{ RfQ }} form, add a {guilabel}`Vendor`, and click +{guilabel}`Add a line` under the {guilabel}`Product` tab to add products to the order. + +On the product line, select a product from the drop-down menu in the {guilabel}`Product` field, and +enter the quantity to order in the {guilabel}`Quantity` field. + +Once ready, click {guilabel}`Confirm Order` to confirm the {{ RfQ }} into a {{ PO }}. + +:::{important} +When using the *Received quantities* control policy, clicking {guilabel}`Create Bill` before any +products are received causes an {guilabel}`Invalid Operation` pop-up window to appear. + +Odoo requires at least partial quantities of the items included in the {{ PO }} to be received in +order to create a vendor bill. + +```{image} manage/manage-user-error-popup.png +:align: center +:alt: User error pop-up for received quantities control policy. +``` +::: + +On the {{ PO }}, click the {guilabel}`Receipt` smart button to view the warehouse receipt form. + +From here, click {guilabel}`Validate` to register the {guilabel}`Done` (received) quantities. + +Then, navigate back to the {{ PO }}, via the breadcrumb, and click {guilabel}`Create Bill`. + +This opens a {guilabel}`Vendor Bill` form in the {guilabel}`Draft` state. From here, add a billing +date in the {guilabel}`Bill Date` field. Once ready, confirm the bill by clicking +{guilabel}`Confirm` at the top of the draft. + +Once a payment has been received, click {guilabel}`Register Payment` at the top of the bill to +record it. + +Doing so causes a {guilabel}`Register Payment` pop-up window to appear, wherein a payment +{guilabel}`Journal` can be chosen, and a {guilabel}`Payment Method` selected. + +Additionally, the bill {guilabel}`Amount`, {guilabel}`Payment Date`, and {guilabel}`Memo` +({dfn}`Reference Number`) can be edited from this pop-up window, if necessary. + +Once ready, click {guilabel}`Create Payment` to finish creating the {guilabel}`Vendor Bill`. Doing +so displays a green {guilabel}`Paid` banner on the {{ RfQ }} form. + +## Manage vendor bills in Accounting + +Vendor bills can also be created directly from the *Accounting* app, without having to create a +purchase order first. + +Navigate to {menuselection}`Accounting app --> Vendors --> Bills`, and click {guilabel}`New`. Doing +so reveals a blank {guilabel}`Vendor Bill` form. + +Add a vendor in the {guilabel}`Vendor` field. Then, in the {guilabel}`Invoice Lines` tab, click +{guilabel}`Add a line` to add products. + +Select a product from the drop-down menu in the {guilabel}`Product` field, and enter the quantity to +order in the {guilabel}`Quantity` field. + +Select a {guilabel}`Bill Date`, and configure any other necessary information. Finally, click +{guilabel}`Confirm` to confirm the bill. + +Once confirmed, click the {guilabel}`Journal Items` tab to view the {guilabel}`Account` journals. +These journals are populated based on the configuration on the corresponding {guilabel}`Vendor` and +{guilabel}`Product` forms. + +If necessary, click {guilabel}`Credit Note` to add a credit note to the bill. Additionally, a +{guilabel}`Bill Reference` number can be added. + +Once ready, click {guilabel}`Register Payment`, followed by {guilabel}`Create Payment`, to complete +the {guilabel}`Vendor Bill`. + +:::{tip} +To link a draft bill to an existing purchase order, click the drop-down menu next to +{guilabel}`Auto-Complete` *before* clicking {guilabel}`Confirm`, and select a {{ PO }} from the menu. + +The bill auto-populates with the information from the chosen {{ PO }}. + +```{image} manage/manage-auto-complete.png +:align: center +:alt: Auto-complete drop-down list on draft vendor bill. +``` +::: + +## Batch billing + +Vendor bills can be processed and managed in batches in the *Accounting* app. + +Navigate to {menuselection}`Accounting app --> Vendors --> Bills`. Then, click the +{guilabel}`checkbox` in the top-left corner, beside the {guilabel}`Number` column, under the +{guilabel}`New` button. + +This selects all existing vendor bills with a {guilabel}`Status` of {guilabel}`Posted` or +{guilabel}`Draft`. + +Click the {icon}`fa-print` {guilabel}`Print` button to print the selected invoices or bills. + +Click {guilabel}`Register Payment` to create and process payments for multiple vendor bills at once. + +:::{note} +Only payments with their {guilabel}`Status` listed as {guilabel}`Posted` can be billed in +batches. Payments in the {guilabel}`Draft` stage **must** be posted before they can be included +in a batch billing. +::: + +Clicking {guilabel}`Register Payment` opens a {guilabel}`Register Payment` pop-up window. From the +pop-up window, select the {guilabel}`Journal` the bills should post to, choose a {guilabel}`Payment +Date`, and select a {guilabel}`Payment Method`. + +There is also the option to {guilabel}`Group Payments` together from this pop-up window, as well. If +this checkbox is ticked, only one payment is created, instead of one per bill. This option only +appears if the *Batch Payments* feature is enabled in the settings of the +{menuselection}`Accounting` app. + +Once ready, click the {guilabel}`Create Payment` button. This creates a list of journal entries on a +separate page. The journal entries on this list are all tied to their corresponding vendor bills. + +```{image} manage/manage-batch-billing.png +:align: center +:alt: Batch billing register payment pop-up window. +``` + +:::{seealso} +{doc}`control_bills` +::: + diff --git a/content/applications/inventory_and_mrp/purchase/manage_deals/purchase_templates.md b/content/applications/inventory_and_mrp/purchase/manage_deals/purchase_templates.md new file mode 100644 index 000000000..66e7956ea --- /dev/null +++ b/content/applications/inventory_and_mrp/purchase/manage_deals/purchase_templates.md @@ -0,0 +1,83 @@ +--- +substitutions: + Pts: Purchase templates + RFQ: '{abbr}`RFQ (request for quotation)`' + RFQs: '{abbr}`RFQs (requests for quotation)`' + pt: purchase template +--- + +# Purchase templates + +*Purchase templates* are an agreement type that allow for the repeated creation of requests for +quotations (RFQs) for recurring purchases. Products can then be added and quantities can be changed, +as needed. {{ Pts }} can be used for multiple vendors, saving time and simplifying the {{ RFQ }} process. + +{{ Pts }} differ from *blanket orders* in that a {doc}`blanket order ` is a large order +split into several deliveries, therefore all {{ RFQs }} must be for the same vendor. {{ PTs }} can be +replicated for multiple vendors, and can copy over quantities, which is useful when placing frequent +orders. + +## Configuration + +First, navigate to {menuselection}`Purchase app --> Configuration --> Settings`. Under the +{guilabel}`Orders` section, tick the {guilabel}`Purchase Agreements` checkbox. Click +{guilabel}`Save` to save the changes. + +```{image} purchase_templates/purchase-agreements-setting.png +:alt: The Purchase agreements setting in the Purchase app. +``` + +## Create a new template + +Navigate {menuselection}`Purchase app --> Orders --> Purchase Agreements` and click {guilabel}`New`. + +Select a {guilabel}`Vendor` from the drop-down list. + +:::{tip} +To make this template available to use with multiple vendors, leave the {guilabel}`Vendor` field +blank. +::: + +In the {guilabel}`Agreement Type` field, select {guilabel}`Purchase Template` from the drop-down. + +Confirm the information in the remaining fields is correct, or update as needed. + +On the {guilabel}`Products` tab, click {guilabel}`Add a line`, and select the desired product. +Update the {guilabel}`Quantity`, and set the {guilabel}`Unit Price`. + +:::{important} +When adding products to a new blanket order, the pre-existing prices of products are not +automatically added to the product lines. Instead, the prices **must** be manually assigned, by +changing the value in the {guilabel}`Unit Price` column to an agreed-upon price with the listed +vendor. Otherwise, the price will remain `0`. +::: + +After adding all necessary products, click {guilabel}`Confirm`. + +### Create a new RFQ from a purchase template + +After confirming a {{ pt }}, new quotations can be created directly from the {{ pt }} form. {{ RFQs }} using +this form are pre-populated with information based on the rules set in the form. Additionally, new +quotations are automatically linked to this {{ pt }} form, via the {icon}`fa-list-alt` +{guilabel}`RFQs/Orders` smart button at the top of the form. + +To {ref}`create a new quotation `, click {guilabel}`New +Quotation`. This opens a new {{ RFQ }}, that is pre-populated with the correct information, depending on +the settings configured on the {{ pt }} form. + +If there was no vendor identified on the {{ pt }}, choose a {guilabel}`Vendor` from the drop-down list. +Products can be added to the {{ RFQ }} by clicking {guilabel}`Add a product` in the {guilabel}`Products` +tab. To remove a product, click the {icon}`fa-trash-o` {guilabel}`(trash)` icon at the far-right of +the product line. + +From the new {{ RFQ }} form, click {guilabel}`Send by Email` to compose and send an email to the listed +vendor. Click {guilabel}`Print RFQ` to generate a printable PDF of the quotation; or, once ready, +click {guilabel}`Confirm Order` to confirm the purchase order. + +After confirming the order, return to the {{ pt }} via the breadcrumbs. The {icon}`fa-list-alt` +{guilabel}`RFQs/Orders` smart button has been updated to list the confirmed order. + +```{image} purchase_templates/rfq-smart-button.png +:alt: The RFQ smart button on a purchase template. +``` + diff --git a/content/applications/inventory_and_mrp/purchase/manage_deals/rfq.md b/content/applications/inventory_and_mrp/purchase/manage_deals/rfq.md new file mode 100644 index 000000000..86d4b2710 --- /dev/null +++ b/content/applications/inventory_and_mrp/purchase/manage_deals/rfq.md @@ -0,0 +1,197 @@ +--- +substitutions: + PO: '{abbr}`PO (Purchase Order)`' + POs: '{abbr}`POs (Purchase Orders)`' + RFQ: '{abbr}`RFQ (Request for Quotation)`' + RFQs: '{abbr}`RFQs (Requests for Quotation)`' +--- + +# Requests for quotation + +(purchase/manage_deals/rfq)= + +Odoo's requests for quotation (RFQs) feature in the **Purchase** app standardizes ordering products +from multiple vendors with varying prices and delivery times. + +{{ RFQs }} are documents companies send to vendors requesting product pricing. In Odoo, once the vendor +approves the {{ RFQ }}, the purchase order (PO) is confirmed to align on lead times and pricing. + +## Configuration + +### Product + +To auto-populate product information and prices on an {{ RFQ }}, configure products by going to +{menuselection}`Purchase app --> Products --> Products`. Select an existing product, or create a +new one by selecting {guilabel}`New`. Doing so opens the product form, where various sales and +purchasing data can be configured. + +To configure purchasable products, tick the {guilabel}`Can be purchased` checkbox, under the product +name. Then, go to the {guilabel}`Inventory` tab, and enable the {guilabel}`Buy` route. + +```{image} rfq/product-vendor-pricelist-config.png +:align: center +:alt: Required configuration for purchasable products. +``` + +(purchase-manage-deals-vendor-pricelist)= + +### Vendor pricelist + +In the {guilabel}`Purchase` tab of the product form, input the vendor and their price, to have this +information auto-populate on an {{ RFQ }} each time the product is listed. + +:::{seealso} +{doc}`../products/pricelist` +::: + +Default columns include {guilabel}`Quantity`, {guilabel}`Price`, and {guilabel}`Delivery Lead Time`, +but other columns like, {guilabel}`Product Variant` or {guilabel}`Discounts`, can also be enabled. + +To enable or disable columns, click the {icon}`oi-settings-adjust` {guilabel}`(additional options)` +icon on the right side of the header row to reveal a drop-down menu of additional columns that can +be added (or removed) from the {guilabel}`Purchase` tab. + +:::{note} +Alternatively, prices and delivery lead times for existing products can be added in bulk by +going to {menuselection}`Purchase app --> Configuration --> Vendor Pricelists`. Click +{guilabel}`New` in the top-left corner. In the {guilabel}`Vendor` section of the pricelist form +that appears, add the product information as it pertains to the vendor. +::: + +## Order products + +With products and prices configured, follow these steps to create and send {{ RFQs }} to make purchases +for the company. + +### {{ RFQ }} dashboard + +To get started, navigate to {menuselection}`Purchase app --> Orders --> Requests for Quotation`. + +The {guilabel}`Requests for Quotation` dashboard displays an overview of the company's {{ RFQs }}, +{{ POs }}, and their status. The top of the screen breaks down all {{ RFQs }} in the company, as well as +individual ones (where the user is the buyer) with a summary of their status. + +The top-right corner also provides a quick report of the company's recent purchases by total value, +lead times, and number of {{ RFQs }} sent. + +Additionally, the dashboard includes buttons for: + +- {guilabel}`To Send`: orders in the {{ RFQ }} stage that have not been sent to the vendor. +- {guilabel}`Waiting`: {{ RFQs }} that have been sent by email, and are waiting on vendor confirmation. +- {guilabel}`Late`: {{ RFQs }} or {{ POs }} where the {guilabel}`Order Deadline` has passed. + +```{image} rfq/rfq-dashboard.png +:align: center +:alt: RFQ dashboard with orders and order statuses. +``` + +In addition to various view options, the {guilabel}`Requests for Quotation` dashboard provides +{guilabel}`Filters` and {guilabel}`Group By` options, accessible via the search bar drop-down menu. + +:::{seealso} +{doc}`../../../essentials/search` +::: + +(purchase-manage-deals-create-new-rfq)= + +### Create new {{ RFQ }} + +To create a new {{ RFQ }}, click the {guilabel}`New` button on the top-left corner of the +{guilabel}`Requests for Quotation` dashboard to reveal a new {{ PO }} form. + +Start by assigning a {guilabel}`Vendor`. + +The {guilabel}`Vendor Reference` field points to the sales and delivery order numbers sent by the +vendor. This comes in handy once products are received, and the {{ PO }} needs to be matched to the +delivery order. + +The {guilabel}`Blanket Order` field refers to long-term purchase agreements on recurring orders with +set pricing. To view and configure blanket orders, head to {menuselection}`Purchase app --> Orders +--> Purchase agreements`. + +The {guilabel}`Currency` can be changed, if purchasing products from a vendor in another country. + +Next, configure an {guilabel}`Order Deadline`, which is the date by which the vendor must confirm +their agreement to supply the products. + +:::{note} +After the {guilabel}`Order Deadline` is exceeded, the {{ RFQ }} is marked as late, but the products +can still be ordered. +::: + +{guilabel}`Expected Arrival` is automatically calculated based on the {guilabel}`Order Deadline` +and vendor lead time. Tick the checkbox for {guilabel}`Ask confirmation` to ask for signage at +delivery. + +With the {doc}`Storage Locations feature +<../../inventory/warehouses_storage/inventory_management/use_locations>` activated, +the {guilabel}`Deliver to` field appears, with options for the order shipment. + +Select the receiving warehouse address here, or select {guilabel}`Dropship` to indicate that this +order is to be shipped directly to the end customer. When {guilabel}`Dropship` is selected, the +{guilabel}`Dropship address` field is enabled. Contact names auto-populate here from the +**Contacts** app. + +#### Products tab + +In the {guilabel}`Products` tab, add the products to be ordered. Click {guilabel}`Add a product`, +and type in the product name, or select the item from the drop-down menu. + +To create a new product and add it, type the new product name in the {guilabel}`Product` column, +select {guilabel}`Create [product name]` from the resulting drop-down menu, and manually add the +unit price. Or, select {guilabel}`Create and edit...` to be taken to the product form for that new +item. + +{guilabel}`Catalog` can also be selected to navigate to a product menu from the chosen vendor. From +here, products can be added to the cart. + +:::{note} +To make adjustments to products and prices, access the product form by clicking the +{icon}`oi-arrow-right` {guilabel}`(right arrow)` icon that becomes available upon hovering over +the {guilabel}`Product` name. +::: + +### Send {{ RFQ }} + +Clicking {guilabel}`Send by Email` reveals a {guilabel}`Compose Email` pop-up window, with a +{guilabel}`Purchase: Request for Quotation` template loaded, ready to send to the vendor's email +address (configured in the **Contacts** app). + +After crafting the desired message, click {guilabel}`Send`. Once sent, the {{ RFQ }} moves to the +{guilabel}`RFQ Sent` stage. + +Clicking {guilabel}`Print RFQ` downloads a PDF of the {{ RFQ }}. + +### Confirm order + +Clicking {guilabel}`Confirm Order` directly transforms the {{ RFQ }} into an active {{ PO }}. + +:::{tip} +Odoo tracks communications on each order through the chatter of the {{ PO }} form. This shows the +emails sent between the user and the contact, as well as any internal notes and activities. +Messages, notes, and activities can also be logged on the chatter. +::: + +Once an {{ RFQ }} is confirmed, it creates a {{ PO }}. + +On the new {{ PO }}, the {guilabel}`Order Deadline` field changes to {guilabel}`Confirmation Date`, +which displays the date and time the user confirmed the order. + +Depending on the user's chosen configuration in the **Purchase** app settings, a *vendor bill* is +created once products have been ordered or received. For more information, refer to the +documentation on {doc}`managing vendor bills `. + +:::{note} +After an order is placed, clicking {guilabel}`Receive Products` records the reception of new +products into the database. +::: + +:::{note} +With the **Inventory** app installed, confirming a {{ PO }} automatically creates a receipt document, +with the product information and expected arrival dates automatically populated. +::: + +:::{seealso} +{doc}`manage` +::: + diff --git a/content/applications/inventory_and_mrp/purchase/products.md b/content/applications/inventory_and_mrp/purchase/products.md new file mode 100644 index 000000000..c30bccc16 --- /dev/null +++ b/content/applications/inventory_and_mrp/purchase/products.md @@ -0,0 +1,15 @@ +--- +nosearch: true +--- + +# Products + +```{toctree} +:titlesonly: true + +products/pricelist +products/reordering +products/temporary_reordering +products/uom +``` + diff --git a/content/applications/inventory_and_mrp/purchase/products/pricelist.md b/content/applications/inventory_and_mrp/purchase/products/pricelist.md new file mode 100644 index 000000000..305da97ec --- /dev/null +++ b/content/applications/inventory_and_mrp/purchase/products/pricelist.md @@ -0,0 +1,267 @@ +# Import vendor pricelist + +Set vendor prices to auto-populate requests for quotations (RFQs) or purchase orders (POs) with the +unit price, once the product is added, which reduces errors and saves time. + +In Odoo, vendor pricelists can be {ref}`added individually ` on the +product form, or {ref}`imported in bulk `, via an XLSX or CSV +file. + +:::{important} +Please review this {doc}`import guide <../../../essentials/export_import_data>` before uploading +vendor pricelists. +::: + +(purchase-products-pricelist)= + +## On product form + +To manually add the vendor price on the product form, go to the {menuselection}`Purchase app --> +Products --> Products`, and click the desired product. + +:::{note} +Product forms are accessible from multiple apps, such as **Sales**, **Inventory**, and +**Manufacturing**. +::: + +In the {guilabel}`Purchase` tab of the product form, input the vendor and their price, to have this +information auto-populate on a request for quotation each time the product is listed. + +:::{seealso} +{ref}`Vendor pricelist on product form ` +::: + +```{image} pricelist/product-form-pricelist.png +:alt: Vendor pricelist on product form. +``` + +(purchase-products-import-pricelist)= + +## Import vendor pricelist + +To import vendor pricelists, ensure the XLSX or CSV file is accurately completed. The best way to +obtain a correctly formatted template, including product names, references, and vendor details, is +to first {ref}`export a pricelist ` from the database. + +Modify the exported file, as needed, then import it back into the Odoo database. + +(purchase-products-export-price)= + +### Export pricelist + +To export a pricelist, go to {menuselection}`Purchase app --> Configuration --> Vendor Pricelists`. + +On the page, tick the checkbox(es) for the desired vendor pricelists. + +Then, click the {icon}`fa-cog` {guilabel}`Actions` button that appears, and choose {icon}`fa-upload` +{guilabel}`Export` from the drop-down menu. + +```{image} pricelist/export.png +:alt: Show selected exported fields, with the Export button visible. +``` + +In the resulting pop-up window, fields listed under the {guilabel}`Fields to export` section are +included in the exported file. To add more fields, find the desired field in the +{guilabel}`Available fields` section, and click the {icon}`fa-plus` {guilabel}`(plus)` icon to the +right of the field. + +:::{note} +To update to existing records, tick the {guilabel}`I want to update data (import-compatible +export)` checkbox, and refer to the section on the {ref}`External ID +` field. + +For details on commonly-used fields for importing vendor pricelists, see the {ref}`Common fields +` section. +::: + +Select the desired {guilabel}`Export Format`: {guilabel}`XLSX` or {guilabel}`CSV`. + +To save the selected fields as a template, click the {guilabel}`Template` field, and select +{guilabel}`New template` from the drop-down menu. Type the name of the new template, and click the +{icon}`fa-floppy-o` {guilabel}`(save)` icon. After that, the template is a selectable option when +clicking the {guilabel}`Template` field. + +Finally, click {guilabel}`Export`. + +:::{note} +With {ref}`developer mode ` turned on, the column names of the exported file +display the *field name* with the *technical name* in parenthesis. +::: + +```{eval-rst} +.. example:: + .. figure:: pricelist/export-data.png + :alt: Exporting vendor pricelist. + + Export vendor pricelist in XLSX format. It includes :guilabel:`Product Template` and other + fields in the :guilabel:`Fields to export` section. +``` + +(purchase-products-external-id)= + +#### External ID + +*External ID* is a unique identifier used to update existing vendor pricelists. Without it, imported +records create new entries, instead of updating existing ones. Including this field in the XLSX or +CSV, indicates the line replaces an existing vendor pricelist in the Odoo database. + +```{eval-rst} +.. example:: + .. figure:: pricelist/duplicate-values.png + :alt: Show 'Ready Mat' appear twice. + + `Ready Mat` appears twice because the external ID was omitted during the price update from + `$790` to `$780`. +``` + +To look-up the {guilabel}`External ID` for a vendor pricelist, tick the {guilabel}`I want to update +data (import-compatible export)` checkbox at the top of the {guilabel}`Export Data` pop-up window. + +:::{note} +Selecting {guilabel}`External ID` from the {guilabel}`Available fields` section with the +{guilabel}`I want to update data (import-compatible export)` checkbox ticked results in an export +file with two columns containing the external ID. +::: + +(purchase-products-common-fields)= + +#### Common fields + +Below is a list of commonly-used fields when importing vendor pricelists: + +```{eval-rst} +.. list-table:: Field name definitions + :header-rows: 1 + + * - Field name + - Used for + - Field in Odoo database + - Technical name of field + * - Vendor + - The only required field for creating a vendor pricelist record. This field specifies the + vendor associated with the product. + - :guilabel:`Vendor` field in the :ref:`vendor pricelist of the product form + `. + - `partner_id` + * - Product Template + - The Odoo product the vendor pricelist entry is related to. + - :guilabel:`Product` field in the vendor pricelist. + - `product_tmpl_id` + * - Quantity + - The minimum quantity required to receive the product at the specified price. + - :guilabel:`Quantity` field in the vendor pricelist. (If not visible, enable it by clicking + the :icon:`oi-settings-adjust` :guilabel:`(adjust)` icon, and tick the :guilabel:`Quantity` + checkbox) + - `min_qty` + * - Unit Price + - The purchase price for the product from the vendor. + - :guilabel:`Price` field in the vendor pricelist. + - `price` + * - Delivery Lead Time + - :ref:`Number of days ` before receiving the product + after confirming a purchase order. + - :guilabel:`Delivery Lead Time` field on the vendor pricelist. + - `delay` + * - Sequence + - Defines the order of vendors in the pricelist when multiple vendors are available. For + example, if `Azure Interior` is listed first and Wood Corner second, their sequences would be + `1` and `2`. + - N/A + - `sequence` + * - Company + - Name of company the product belongs to. + - :guilabel:`Company` field in the vendor pricelist. + - `company_id` + * - :ref:`External ID ` + - Unique ID of a record used to update existing vendor pricelists. + - N/A + - `id` +``` + +### Import records + +With a template downloaded, fill out the XLSX or CSV file with the necessary information. After +inputting everything, import the file back into the Odoo database, by going to +{menuselection}`Purchase app --> Configuration --> Vendor Pricelists`. + +On the page, click the {icon}`fa-cog` {guilabel}`(gear)` icon in the top-left corner. In the +drop-down menu that appears, click {guilabel}`Import records`. + +Then, click {guilabel}`Upload File` in the upper-left corner, and after selecting the XLSX or CSV +file, confirm the correct fields, and click {guilabel}`Import`. + +:::{seealso} +- {doc}`../../../essentials/export_import_data` +- {ref}`Common fields ` +::: + +```{image} pricelist/supplier-pricelist-example.png +:alt: Upload file screen. +``` + +#### Formatting import file + +To understand how to format import files for vendor pricelists, consider the following example. + +- `Storage Box` ({guilabel}`Reference`: `E-COM08`) is sold by `Wood Corner` for `$10`. +- `Large Desk` ({guilabel}`Reference`: `E-COM09`) has no records in the vendor pricelist. + +An import file is created to do the following: + +- Update the price for `Wood Corner` from `$10` to `$13`. +- Add pricelist for `Storage Box`: the vendor, `Ready Mat` intends to sell the product for `$14`. +- Add pricelist for `Large Desk`: vendor is `Wood Corner`, price is `$1299`. +- Add pricelist for `Large Desk`: vendor is `Azure Interior`, price is `$1399`. + +```{eval-rst} +.. list-table:: Vendor pricelist data + :header-rows: 1 + + * - id + - company_id + - delay + - price + - product_tmpl_id + - sequence + - partner_id + * - product.product_supplierinfo_3 + - My Company (San Francisco) + - 3 + - 13.00 + - [E-COM08] Storage Box + - 4 + - Wood Corner + * - + - My Company (San Francisco) + - 3 + - 14.00 + - [E-COM08] Storage Box + - 5 + - Ready Mat + * - + - My Company (San Francisco) + - 2 + - 1299.00 + - [E-COM09] Large Desk + - 6 + - Wood Corner + * - + - My Company (San Francisco) + - 4 + - 1399.00 + - [E-COM09] Large Desk + - 7 + - Azure Interior +``` + +:::{note} +The *technical field name* was used to create this information. +::: + +:::{note} +Download the sample files for reference: + +- {download}`Sample XLSX import file ` +- {download}`Sample CSV import file ` +::: + diff --git a/content/applications/inventory_and_mrp/purchase/products/reordering.md b/content/applications/inventory_and_mrp/purchase/products/reordering.md new file mode 100644 index 000000000..2647ab0fb --- /dev/null +++ b/content/applications/inventory_and_mrp/purchase/products/reordering.md @@ -0,0 +1,111 @@ +# Configure reordering rules + +For certain products, it is necessary to ensure that there is always a minimum amount available on +hand at any given time. Maintaining a minimum stock level ensures that businesses can meet customer +demand without delays, and keep operations running smoothly. It also helps buffer against supply +chain disruptions and unexpected spikes in demand. Inefficiencies may arise from inaccurate demand +forecasting, supply chain delays, and warehouse mismanagement, all of which can lead to increased +operational costs and wasted resources. + +Keep highly demanded products in-stock at all times using reordering rules, that trigger a RFQ +(Request for Quotation) each time the forecasted stock quantities fall below the minimum. +{abbr}`RFQs (Requests for Quotation)` generated from reordering rules have the vendor, price, +quantity needed to reorder, which makes things faster and more convenient. + +:::{important} +The **Inventory** app must be installed to use reordering rules, as it keeps track of stock +quantity. +::: + +## Configure products for reordering + +Products must be configured in a specific way before a reordering rule can be added to them. + +Starting from the {menuselection}`Inventory`, {menuselection}`Manufacturing`, +{menuselection}`Purchase`, or {menuselection}`Sales` app, navigate to {menuselection}`Products --> +Products` and then click {guilabel}`New` to make a new product. Alternatively, find a product that +already exists in the database and click into it's product form. + +Next, on the product form, enable reordering by ticking the {guilabel}`Purchase` checkbox +underneath the {guilabel}`Product` name field. Then, under the {guilabel}`General Information` tab, +set the {guilabel}`Product Type` to {guilabel}`Goods`. Finally, tick the checkbox labeled +{guilabel}`Track Inventory`, and select an {doc}`option +<../../inventory/product_management/product_tracking>` from the drop-down. + +```{image} reordering/product-configured-for-reordering.png +:alt: Configure a product for reordering in Odoo. +``` + +## Add a reordering rule to a product + +After properly configuring a product, a reordering rule can be added to it by selecting the now +visible {icon}`fa-refresh` {guilabel}`Reordering Rules` smart button at the top of that product's +form, then clicking {guilabel}`Create` on the {guilabel}`Reordering Rules` dashboard. + +:::{tip} +If the {icon}`fa-refresh` {guilabel}`Reordering Rules` smart button is not visible, click +{guilabel}`More`. +::: + +Once created, the reordering rule can be configured to generate purchase orders automatically by +defining the following fields: + +- {guilabel}`Location` specifies where the ordered quantities should be stored once they are + received and entered into stock. + +- {guilabel}`Min Quantity` sets the lower threshold for the reordering rule while {guilabel}`Max + Quantity` sets the upper threshold. If the stock on hand falls below the minimum quantity, a new + purchase order is then created to replenish it up to the maximum quantity. + + > ```{eval-rst} + > .. example:: + > If :guilabel:`Min Quantity` is set to `5` and :guilabel:`Max Quantity` is set to `25` and the + > stock on hand falls to four, a purchase order is then created for 21 units of the product. + > ``` + +- {guilabel}`Multiple Quantity` can be configured so that products are only ordered in batches of a + certain quantity. Depending on the number entered, this can result in the creation of a purchase + order that would put the resulting stock on hand above what is specified in the {guilabel}`Max + Quantity` field. + + > ```{eval-rst} + > .. example:: + > If :guilabel:`Max Quantity` is set to `100` but :guilabel:`Multiple Quantity` is set to order + > the product in batches of `200`, a purchase order is then created for 200 units of the + > product. + > ``` + +- {guilabel}`Unit` specifies the unit of measurement by which the quantity is to be ordered. For + discrete products, this should be set to `Units`. However, it can also be set to units of + measurement like `Volume` or `Weight` for non-discrete products like water or bricks. + +```{image} reordering/reordering-rule-configuration.png +:alt: Configure the reordering rule in Odoo. +``` + +:::{seealso} +{doc}`../../inventory/warehouses_storage/replenishment/reordering_rules` +::: + +## Manually trigger reordering rules using the scheduler + +Reordering rules are automatically triggered by the scheduler, which runs once a day by default. To +trigger reordering rules manually, turn on developer mode, navigate to {menuselection}`Inventory app +--> Operations --> Procurement: Run Scheduler`. On the pop-up window, confirm the manual action by +clicking {guilabel}`Run Scheduler`. + +:::{note} +Manually triggering reordering rules will also trigger any other scheduled actions. +::: + +## Manage reordering rules + +To manage the reordering rules for a single product, navigate to that product page's form and select +the {guilabel}`Reordering Rules` smart button at the top of the form. + +To manage all reordering rules for every product, go to {menuselection}`Inventory app --> Operations +--> Replenishment`. From this dashboard, typical bulk actions in Odoo can be performed such as +exporting data or archiving rules that are no longer needed. As well, the {guilabel}`Filters`, +{guilabel}`Group By` or triple-dotted menu on the form are available to search for and/or organize +the reordering rules as desired. + diff --git a/content/applications/inventory_and_mrp/purchase/products/temporary_reordering.md b/content/applications/inventory_and_mrp/purchase/products/temporary_reordering.md new file mode 100644 index 000000000..f1c6cb41c --- /dev/null +++ b/content/applications/inventory_and_mrp/purchase/products/temporary_reordering.md @@ -0,0 +1,135 @@ +# Temporary reordering rules + +Some businesses require certain products to always have a minimum quantity of stock on-hand at any +given time. To avoid stock falling below a certain threshold, companies can create *reordering +rules* in Odoo to automate purchase orders for specific products. + +Reordering rules keep the forecasted stock levels above a certain threshold, without exceeding a +specified upper limit, or maximum amount. When a product with a reordering rule falls below a +specified quantity, Odoo generates an order using the specified *route* (e.g. *Buy* or +*Manufacture*) to replenish the stock. + +In certain cases, businesses might opt for *temporary reordering rules* when they do not want +specific products to be replenished automatically. + +In Odoo, a "temporary" reordering rule is created in the replenishment dashboard when a product: + +1. is configured with a *Buy* route +2. has no reordering rule configured +3. has `0` quantity in stock +4. is included in a sales order (SO). + +This rule is deleted upon confirmation of the purchase order (PO) generated for the product. + +:::{seealso} +- {doc}`../../inventory/warehouses_storage/replenishment/reordering_rules` +- {doc}`../../purchase/products/reordering` +::: + +## Configuration + +To configure a product that triggers temporary reordering rules when its stock reaches `0`, begin by +going to {menuselection}`Inventory app --> Products --> Products`, and click {guilabel}`New`. + +:::{note} +The same configurations can also be made on an existing product, by going to +{menuselection}`Inventory app --> Products --> Products`, and selecting an existing product. +::: + +On the product form, enter the product name, and ensure the {guilabel}`Can be Sold` and +{guilabel}`Can be Purchased` options are enabled, located beneath the {guilabel}`Product Name` +field. + +Then, set the {guilabel}`Product Type` to `Storable Product`, under the {guilabel}`General +Information` tab. + +Next, click the {guilabel}`Purchase` tab, and under {guilabel}`Vendor`, click {guilabel}`Add a line` +to select a vendor from the drop-down menu. Then, set a purchase price under {guilabel}`Price`. + +:::{important} +A vendor **must** be set for temporary reordering rules to work. While a {abbr}`PO (purchase +order)` can still be created automatically, attempting to replenish the product from the +{guilabel}`Replenishment` dashboard in the *Inventory* app triggers a warning to add a vendor on +the product form. + +```{image} temporary_reordering/temporary-reordering-warning-popup.png +:align: center +:alt: Warning pop-up upon clicking to replenish product with no set vendor. +``` +::: + +Before creating a {abbr}`SO (sales order)` for the product, ensure the {guilabel}`On Hand` smart +button on the product form reads `0.00 Units`. Then, ensure that the {guilabel}`Reordering Rules` +smart button reads `0`, indicating there are no rules applied to this product. + +```{image} temporary_reordering/temporary-reordering-smart-buttons.png +:align: center +:alt: Product form smart button row displaying reordering rules and on hand buttons. +``` + +## Trigger temporary reordering rule + +To trigger a temporary reordering rule, create a new sales order for a product by navigating to +{menuselection}`Sales app --> New`. + +Then, add a customer in the {guilabel}`Customer` field, and click {guilabel}`Add a product` under +the {guilabel}`Product` column in the {guilabel}`Order Lines` tab. Next, select the desired product +from the drop-down menu. Lastly, {guilabel}`Confirm` the {abbr}`SO (sales order)`. + +```{image} temporary_reordering/temporary-reordering-sales-order.png +:align: center +:alt: Sales order for product with no set reordering rules. +``` + +## Check replenishment report + +To see the temporary reordering rule created for the out-of-stock product included in the sales +order, navigate to {menuselection}`Inventory app --> Operations --> Replenishment`. Doing so opens +the {guilabel}`Replenishment` dashboard. + +On this dashboard, locate the product for which the temporary reordering rule was created. On its +product line, its {guilabel}`On Hand` quantity, negative {guilabel}`Forecast` quantity, *Buy* +{guilabel}`Route`, and {guilabel}`To Order` quantity to replenish can be seen. + +Additionally, two replenishment options are located to the far-right of the row: {guilabel}`Order +Once` and {guilabel}`Automate`. + +```{image} temporary_reordering/temporary-reordering-replenishment-dashboard.png +:align: center +:alt: Replenishment report displaying temporary reordering rule and options. +``` + +To use the one-time, temporary reordering rule, click {guilabel}`Order Once`. This action triggers a +confirmation pop-up window in the top-right corner, reading {guilabel}`The following replenishment +order has been generated`, along with a new purchase order number. + +:::{tip} +Once the purchase order has been generated after clicking {guilabel}`Order Once`, refresh the +page. The temporary reordering rule for the product no longer appears in the +{guilabel}`Replenishment` dashboard. +::: + +## Complete purchase order + +To view the purchase order created from the {guilabel}`Replenishment` dashboard, navigate to the +{menuselection}`Purchase app`, and select the generated {abbr}`PO (purchase order)` from the +{guilabel}`Requests for Quotation` overview. + +From here, click {guilabel}`Confirm Order`, then click {guilabel}`Receive Products`. Finally, click +{guilabel}`Validate` to complete the purchase order. + +```{image} temporary_reordering/temporary-reordering-purchase-order.png +:align: center +:alt: Purchase order for product ordered with temporary reordering rule. +``` + +Now, the original sales order can be delivered and invoiced. + +:::{note} +Once the {abbr}`SO (sales order)` is delivered and invoiced, ensure there are no reordering rules +on the product form. + +Go to {menuselection}`Inventory app --> Products --> Products`, select the product, and confirm +that the {guilabel}`Reordering Rules` smart button displays `0`. +::: + diff --git a/content/applications/inventory_and_mrp/purchase/products/uom.md b/content/applications/inventory_and_mrp/purchase/products/uom.md new file mode 100644 index 000000000..c7a564d0e --- /dev/null +++ b/content/applications/inventory_and_mrp/purchase/products/uom.md @@ -0,0 +1,115 @@ +# Purchase units of measure + +When you purchase a product, it may happen that your vendor uses a different unit of measure than +when it is sold. This can cause confusion between sales and purchase representatives. It is also +time-consuming to convert measures manually every time. With Odoo, you can configure your product +once and let Odoo handle the conversion. + +Consider the following examples: + +1. You purchase orange juice from an American vendor, and they use **gallons**. However, your + customers are European and use **liters**. +2. You buy curtains from a vendor in the form of **rolls** and you sell pieces of the rolls to your + customers using **square meters**. + +## Enable units of measure + +Open your Sales app and go to {menuselection}`Configuration --> Settings`. Under Product Catalog, +enable *Units of Measure*. + +```{image} uom/uom-enable-option.png +:align: center +:alt: Enable the units of measure option in Odoo Sales +``` + +## Specify sales and purchase units of measure + +### Standard units of measure + +A variety of units of measure are available by default in your database. Each belongs to one of the +five pre-configured units of measure categories: *Length / Distance*, *Unit*, *Volume*, *Weight* and +*Working Time*. + +:::{tip} +You can create your new units of measure and units of measure categories (see next section). +::: + +To specify different units of measures for sales and purchases, open the Purchase app and go to +{menuselection}`Products --> Products`. Create a product or select an existing one. Under the +product's *General Information* tab, first select the *Unit of Measure* to be used for sales (as +well as for other apps such as inventory). Then, select the *Purchase Unit of Measure* to be used +for purchases. + +Back to the first example, if you purchase orange juice from your vendor in **gallons** and sell it +to your customers in **liters**, first select *L* (liters) as the *Unit of Measure*, and *gal (US)* +(gallons) as the *Purchase Unit of Measure*, then click on *Save*. + +```{image} uom/uom-product-configuration.png +:align: center +:alt: Configure a product's units of measure in Odoo +``` + +### Create new units of measure and units of measure categories + +Sometimes you need to create your own units and categories, either because the measure is not +pre-configured in Odoo or because the units do not relate with each other (e.g. kilos and +centimeters). + +If you take the second example where you buy curtains from a vendor in the form of **rolls** and you +sell pieces of the rolls using **square meters**, you need to create a new *Units of Measure +Category* in order to relate both units of measure. + +To do so, go to {menuselection}`Configuration --> Units of Measure Categories`. Click on *Create* +and name the category. + +```{image} uom/uom-new-category.png +:align: center +:alt: Create a new units of measure category in Odoo Purchase +``` + +The next step is to create the two units of measures. To do so, click into the {guilabel}`Unit of +Measure Category` field and enter a name for the category. Then, under the {guilabel}`Units of +Measure` tab, click {guilabel}`Add a line`. + +First, create the unit of measure used as the reference point for converting to other units of +measure inside the category. Name the unit, and select the units of measure category you just +created. For the *Type*, select *Reference Unit of Measure for this category type*. Enter the +*Rounding Precision* you would like to use. The quantity computed by Odoo is always a multiple of +this value. + +In the example, as you cannot purchase less than 1 roll and won't use fractions of a roll as a unit +of measure, you can enter 1. + +```{image} uom/uom-new-reference-unit.png +:align: center +:alt: Create a new reference unit of measure in Odoo Purchase +``` + +:::{note} +If you use a *Rounding Precision* inferior to 0.01, a warning message might appear stating +that it is higher than the *Decimal Accuracy* and that it might cause inconsistencies. If you +wish to use a *Rounding Precision* lower than 0.01, first activate the {ref}`developer mode +`, then go to {menuselection}`Settings --> Technical --> Database Structure --> +Decimal Accuracy`, select *Product Unit of Measure* and edit *Digits* accordingly. For example, +if you want to use a rounding precision of 0.00001, set *Digits* to 5. +::: + +Next, create a second unit of measure, name it, and select the same units of measure category as +your reference unit. As *Type*, select *Smaller* or *Bigger than the reference Unit of Measure*, +depending on your situation. + +As the curtain roll equals to 100 square meters, you should select *Smaller*. + +Next, you need to enter the *Ratio* between your reference unit and the second one. If the second +unit is smaller, the *Ratio* should be greater than 1. If the second unit is larger, the ratio +should be smaller than 1. + +For your curtain roll, the ratio should be set to 100. + +You can now configure your product just as you would using Odoo's standard units of measure. + +```{image} uom/uom-product-configuration-new-units.png +:align: center +:alt: Set a product's units of measure using your own units in Odoo Purchase +``` + diff --git a/content/applications/inventory_and_mrp/quality.md b/content/applications/inventory_and_mrp/quality.md new file mode 100644 index 000000000..909971e59 --- /dev/null +++ b/content/applications/inventory_and_mrp/quality.md @@ -0,0 +1,23 @@ +--- +hide-page-toc: true +show-content: true +show-toc: true +--- + +# Quality + +**Odoo Quality** helps ensure product quality throughout manufacturing processes and inventory +movements. Conduct quality checks, automate quality inspection frequency, and create quality alerts +when issues arise. + +:::{seealso} +- [Odoo Tutorials: Quality Overview](https://www.odoo.com/slides/slide/quality-overview-5590) +::: + +```{toctree} +:titlesonly: true + +quality/quality_management +quality/quality_check_types +``` + diff --git a/content/applications/inventory_and_mrp/quality/quality_check_types.md b/content/applications/inventory_and_mrp/quality/quality_check_types.md new file mode 100644 index 000000000..4259be23c --- /dev/null +++ b/content/applications/inventory_and_mrp/quality/quality_check_types.md @@ -0,0 +1,15 @@ +--- +nosearch: true +--- + +# Quality check types + +```{toctree} +:titlesonly: true + +quality_check_types/instructions_check +quality_check_types/pass_fail_check +quality_check_types/measure_check +quality_check_types/picture_check +``` + diff --git a/content/applications/inventory_and_mrp/quality/quality_check_types/instructions_check.md b/content/applications/inventory_and_mrp/quality/quality_check_types/instructions_check.md new file mode 100644 index 000000000..2f560a7ba --- /dev/null +++ b/content/applications/inventory_and_mrp/quality/quality_check_types/instructions_check.md @@ -0,0 +1,99 @@ +--- +substitutions: + MO: '{abbr}`MO (Manufacturing Order)`' + QCP: '{abbr}`QCP (Quality Control Point)`' +--- + +# Instructions quality check + +In Odoo *Quality*, an *Instructions* check is one of the quality check types that can be selected +when creating a new quality check or quality control point (QCP). *Instructions* checks consist of a +text entry field that allows the creator to provide instructions for how to complete the check. + +For a full overview of how to configure a quality check or a {{ QCP }}, see the documentation on +{ref}`quality checks ` and {ref}`quality control points +`. + +## Process an Instructions quality check + +There are multiple ways that *Instructions* quality checks can be processed. If a quality check is +assigned to a specific manufacturing, inventory, or work order, the check can be processed on the +order itself. Alternatively, a check can be processed from the check's page. + +### Process from the quality check's page + +To process an *Instructions* quality check from the check's page, begin by navigating to +{menuselection}`Quality --> Quality Control --> Quality Checks`, and select a quality check. Follow +the {guilabel}`Instructions` for how to complete the check. + +If the product passes the check, click the {guilabel}`Pass` button above the quality check form. If +the product does not pass the check, click the {guilabel}`Fail` button, instead. + +### Process quality check on an order + +To process an *Instructions* quality check on an order, select a manufacturing order or inventory +order (receipt, delivery, return, etc.) for which a check is required. Manufacturing orders can be +selected by navigating to {menuselection}`Manufacturing --> Operations --> Manufacturing Orders`, +and clicking on an order. Inventory orders can be selected by navigating to +{menuselection}`Inventory`, clicking the {guilabel}`# To Process` button on an operation card, and +selecting an order. + +On the selected manufacturing or inventory order, a purple {guilabel}`Quality Checks` button appears +above the order. Click the button to open the {guilabel}`Quality Check` pop-up window, from which +any quality checks created for the order can be processed. + +```{image} instructions_check/quality-check-pop-up.png +:align: center +:alt: The Quality Check pop-up window on a manufacturing or inventory order. +``` + +To complete an *Instructions* quality check, follow the instructions detailed in the +{guilabel}`Quality Check` pop-up window. Finally, click {guilabel}`Validate` to confirm that the +check has been completed. + +If an issue or defect is found during the quality check, a quality alert may need to be created to +notify a quality team. To do so, click the {guilabel}`Quality Alert` button that appears at the top +of the manufacturing or inventory order after the check is validated. + +Clicking {guilabel}`Quality Alert` opens a quality alert form on a new page. For a complete guide on +how to fill out quality alert forms, view the documentation on {ref}`quality alerts +`. + +### Process work order quality check + +When configuring a {{ QCP }} that is triggered by a manufacturing order, a specific work order can also +be specified in the {guilabel}`Work Order Operation` field on the {{ QCP }} form. If a work order is +specified, an *Instructions* quality check is created for that specific work order, rather than the +{{ MO }} as a whole. + +Quality checks configured for work orders **must** be completed from the *Shop Floor* module. To do +so, begin by navigating to {menuselection}`Manufacturing --> Operations --> Manufacturing Orders`. +Select an {{ MO }} that includes a work order for which an *Instructions* quality check is required. + +On the {{ MO }}, select the {guilabel}`Work Orders` tab, and click the {guilabel}`Open Work Order +(square with arrow coming out of it)` button on the line of the work order to be processed. On the +resulting {guilabel}`Work Orders` pop-up window, click the {guilabel}`Open Shop Floor` button to +open the *Shop Floor* module. + +When accessed from a specific work order, the *Shop Floor* module opens to the page for the work +center where the order is configured to be processed, and isolates the work order's card so that no +other cards are shown. + +Begin processing the work order's steps until the *Instructions* quality check step is reached. +Click on the step to open a pop-up window that details how to complete the quality check. Once +completed, click the {guilabel}`Next` button to complete the check, and move on to the next step. + +```{image} instructions_check/instructions-check-shop-floor.png +:align: center +:alt: An Instruction check as it appears in the Shop Floor module. +``` + +Alternatively, an *Instructions* quality check can be completed by clicking the checkbox that +appears on the right side of the step's line on the work order card. When using this method, the +quality check automatically passes, without a pop-up window appearing. + +:::{note} +For a full guide to the *Shop Floor* module, see the {ref}`Shop Floor overview +` documentation. +::: + diff --git a/content/applications/inventory_and_mrp/quality/quality_check_types/measure_check.md b/content/applications/inventory_and_mrp/quality/quality_check_types/measure_check.md new file mode 100644 index 000000000..90a4a014d --- /dev/null +++ b/content/applications/inventory_and_mrp/quality/quality_check_types/measure_check.md @@ -0,0 +1,216 @@ +--- +substitutions: + MO: '{abbr}`MO (Manufacturing Order)`' + QCP: '{abbr}`QCP (Quality Control Point)`' + QCPs: '{abbr}`QCPs (Quality Control Points)`' +--- + +# Measure quality check + +In Odoo *Quality*, a *Measure* check is one of the quality check types that can be selected when +creating a new quality check or quality control point (QCP). *Measure* checks prompt users to +measure a certain aspect of a product and record the measurement in Odoo. For the quality check to +pass, the recorded measurement must be within a certain *tolerance* of a *norm* value. + +## Create a Measure quality check + +There are two distinct ways that *Measure* quality checks can be created. A single check can be +manually created. Alternatively, a {{ QCP }} can be configured that automatically creates checks at a +predetermined interval. + +This documentation only details the configuration options that are unique to *Measure* quality +checks and {{ QCPs }}. For a full overview of all the configuration options available when creating a +single check or a {{ QCP }}, see the documentation on {ref}`quality checks +` and {ref}`quality control points +`. + +### Quality check + +To create a single *Measure* quality check, navigate to {menuselection}`Quality --> Quality Control +--> Quality Checks`, and click {guilabel}`New`. Fill out the new quality check form as follows: + +- In the {guilabel}`Type` drop-down field, select the {guilabel}`Measure` quality check type. +- In the {guilabel}`Team` drop-down field, select the quality team responsible for managing the + check. +- In the {guilabel}`Instructions` text field of the {guilabel}`Notes` tab, enter instructions for + how the picture should be taken. + +```{image} measure_check/measure-check-form-1.png +:align: center +:alt: A quality check form configured for a Measure quality check. +``` + +### Quality control point (QCP) + +To create a {{ QCP }} that generates *Measure* quality checks automatically, navigate to +{menuselection}`Quality --> Quality Control --> Control Points`, and click {guilabel}`New`. Fill out +the new {{ QCP }} form as follows: + +- In the {guilabel}`Type` drop-down field, select the {guilabel}`Measure` quality check type. Doing + so causes two new fields to appear: {guilabel}`Norm` and {guilabel}`Tolerance`. + + - Use the first text-entry field of the {guilabel}`Norm` field to record the ideal measurement + that the product should conform to. Use the second text-entry field to specify the unit of + measurement that should be used. + - The {guilabel}`Tolerance` field features two sub-fields: {guilabel}`from` and {guilabel}`to`. + Use the {guilabel}`from` field to specify the minimum acceptable measurement, and the + {guilabel}`to` field to specify the maximum acceptable measurement. + +- In the {guilabel}`Team` drop-down field, select the quality team responsible for managing the + checks created by the {{ QCP }}. + +- In the {guilabel}`Instructions` text field, enter instructions for how the measurement should be + taken. + +```{image} measure_check/measure-check-qcp-form.png +:align: center +:alt: A QCP form configured to create Measure quality checks. +``` + +## Process a Measure quality check + +Once created, there are multiple ways that *Measure* quality checks can be processed. If a quality +check is assigned to a specific inventory, manufacturing, or work order, the check can be processed +on the order itself. Alternatively, a check can be processed from the check's page. + +### From the check's page + +To process a *Measure* quality check from the check's page, begin by navigating to +{menuselection}`Quality --> Quality Control --> Quality Checks`, and select a quality check. Follow +the {guilabel}`Instructions` for how to take the measurement. + +After taking the measurement, record the value in the {guilabel}`Measure` field on the quality check +form. To manually pass or fail the check, click {guilabel}`Pass` or {guilabel}`Fail` at the top-left +corner of the check. + +Alternatively, if the quality check is assigned to a {{ QCP }} for which *norm* and *tolerance* values +have been specified, click {guilabel}`Measure` at the top-left corner of the check instead. Doing so +automatically marks the check as *Passed* if the recorded value is within the specified *tolerance*, +or *Failed* if the value is outside of it. + +### On an order + +To process a *Measure* quality check on an order, select a manufacturing order or inventory order +(receipt, delivery, return, etc.), for which a check is required. Manufacturing orders can be +selected by navigating to {menuselection}`Manufacturing --> Operations --> Manufacturing Orders`, +and clicking on an order. Inventory orders can be selected by navigating to +{menuselection}`Inventory`, clicking the {guilabel}`# To Process` button on an operation card, and +selecting an order. + +On the selected manufacturing or inventory order, a purple {guilabel}`Quality Checks` button appears +at the top of the page. Click the button to open the {guilabel}`Quality Check` pop-up window, which +shows all of the quality checks required for that order. + +To process a *Measure* quality check, measure the product as instructed, then enter the value in the +{guilabel}`Measure` field on the pop-up window. Finally, click {guilabel}`Validate` to register the +recorded value. + +```{image} measure_check/measure-check-pop-up.png +:align: center +:alt: A Measure quality check pop-up window on a manufacturing or inventory order. +``` + +If the value entered is within the range specified in the {guilabel}`Tolerance` section of the +{{ QCP }}, the quality check passes and the pop-up window closes. The rest of the manufacturing or +inventory order can then be processed as usual. + +However, if the value entered is outside of the specified range, a new pop-up window appears, titled +{guilabel}`Quality Check Failed`. The body of the pop-up shows a warning message that states, +{guilabel}`You measured # units and it should be between # units and # units.`, as well as the +instructions entered in the {guilabel}`Message If Failure` tab of the {{ QCP }}. At the bottom of the +pop-up, two buttons appear: {guilabel}`Correct Measure` and {guilabel}`Confirm Measure`. + +```{image} measure_check/measure-check-failed.png +:align: center +:alt: The "Quality Check Failed" pop-up window. +``` + +If the measurement was not entered correctly and should be changed, select {guilabel}`Correct +Measure`. Doing so re-opens the {guilabel}`Quality Check` pop-up window. Enter the corrected +measurement in the {guilabel}`Measure` field, and then click {guilabel}`Validate` to complete the +check. + +If the measurement was entered correctly, click {guilabel}`Confirm Measure` instead, and the quality +check fails. Follow any instructions that were listed on the {guilabel}`Quality Check Failed` pop-up +window. + +If a quality alert must be created, click the {guilabel}`Quality Alert` button that appears at the +top of the manufacturing or inventory order after the check fails. Clicking {guilabel}`Quality +Alert` opens a quality alert form on a new page. + +:::{seealso} +For a complete guide on how to fill out the quality alert form, view the documentation on +{doc}`quality alerts <../quality_management/quality_alerts>`. +::: + +### On a work order + +When configuring a {{ QCP }} that is triggered during manufacturing, a specific work order can also be +specified in the {guilabel}`Work Order Operation` field on the {{ QCP }} form. If a work order is +specified, a *Measure* quality check is created for that specific work order, rather than the +manufacturing order as a whole. + +*Measure* quality checks configured for work orders **must** be completed from the *Shop Floor* +module. To do so, begin by navigating to {menuselection}`Manufacturing --> Operations --> +Manufacturing Orders`. Select an {{ MO }} that includes a work order for which a *Measure* quality check +is required. + +On the {{ MO }}, select the {guilabel}`Work Orders` tab, and click the {guilabel}`Open Work Order +(external link icon)` button on the line of the work order to be processed. On the resulting +{guilabel}`Work Orders` pop-up window, click the {guilabel}`Open Shop Floor` button to open the +*Shop Floor* module. + +When accessed from a specific work order, the *Shop Floor* module opens to the page for the work +center where the order is configured to be processed, and isolates the work order's card, so no +other cards are shown. + +Process the work order's steps until the *Measure* quality check step is reached. Click on the step +to open a pop-up window that includes instructions for how the measurement should be taken. After +taking the measurement, enter it in the {guilabel}`Measure` field of the pop-up window, and then +click {guilabel}`Validate`. + +```{image} measure_check/measure-check-shop-floor.png +:align: center +:alt: A Measure check in the Shop Floor module. +``` + +If the measurement entered is within the range specified in the {guilabel}`Tolerance` section of the +{{ QCP }}, the quality check passes, and the pop-up window moves on to the next step of the work order. +However, if the measurement entered is outside of the specified range, a new pop-up window appears, +titled {guilabel}`Quality Check Failed`. + +The body of the {guilabel}`Quality Check Failed` pop-up window shows a message that states, +{guilabel}`You measured # units and it should be between # units and # units`, as well as the +instructions entered in the {guilabel}`Message If Failure` tab of the {{ QCP }}. At the bottom of the +pop-up window, two buttons appear: {guilabel}`Correct Measure` and {guilabel}`Confirm Measure`. + +```{image} measure_check/shop-floor-measure-check-failed.png +:align: center +:alt: The Quality Check Failed pop-up window for a Measure check in the Shop Floor +: module. +``` + +If the measurement was not entered correctly, and should be changed, select {guilabel}`Correct +Measure`. Doing so opens a new pop-up window, titled {guilabel}`Quality Check`. Enter the corrected +measure in the {guilabel}`Measure` field, and then click {guilabel}`Validate` to complete the check +and close the pop-up window. + +If the measurement was entered correctly, click {guilabel}`Confirm Measure` instead, and the quality +check fails. Follow any instructions that were listed on the {guilabel}`Quality Check Failed` pop-up +window. + +If a quality alert must be created, exit the pop-up window by clicking the {guilabel}`X (close)` +button in the top-right corner. + +Then, click the {guilabel}`⋮ (three vertical dots)` button on the bottom-right corner of the work +order card to open the {guilabel}`What do you want to do?` pop-up window. + +On the {guilabel}`What do you want to do?` pop-up window, select the {guilabel}`Create a Quality +Alert` button. Doing so opens a blank quality alert form in a new {guilabel}`Quality Alerts` pop-up +window. + +:::{seealso} +For a complete guide on how to fill out quality alert forms, view the documentation on +{doc}`quality alerts <../quality_management/quality_alerts>`. +::: + diff --git a/content/applications/inventory_and_mrp/quality/quality_check_types/pass_fail_check.md b/content/applications/inventory_and_mrp/quality/quality_check_types/pass_fail_check.md new file mode 100644 index 000000000..e77a251e1 --- /dev/null +++ b/content/applications/inventory_and_mrp/quality/quality_check_types/pass_fail_check.md @@ -0,0 +1,149 @@ +--- +substitutions: + MO: '{abbr}`MO (Manufacturing Order)`' + QCP: '{abbr}`QCP (Quality Control Point)`' + QCPs: '{abbr}`QCP (Quality Control Points)`' +--- + +# Pass - Fail quality check + +In Odoo *Quality*, a *Pass - Fail* check is one of the quality check types that can be selected when +creating a new quality check or quality control point (QCP). *Pass - Fail* checks consist of a text +field that allows the creator to specify a certain criteria that a product must meet to pass the +check. + +## Create a Pass - Fail quality check + +There are two distinct ways that *Pass - Fail* quality checks can be created. A single check can be +manually created. Alternatively, a {{ QCP }} can be configured that automatically creates checks at a +predetermined interval. + +This documentation only details the configuration options that are unique to *Pass - Fail* quality +checks and {{ QCPs }}. For a full overview of all the configuration options available when creating a +single check or a {{ QCP }}, see the documentation on {ref}`quality checks +` and {ref}`quality control points +`. + +### Quality check + +To create a single *Pass - Fail* quality check, navigate to {menuselection}`Quality --> Quality +Control --> Quality Checks`, and click {guilabel}`New`. Fill out the new quality check form as +follows: + +- In the {guilabel}`Type` drop-down field, select the {guilabel}`Pass - Fail` quality check type. +- In the {guilabel}`Team` drop-down field, select the quality team responsible for managing the + check. +- In the {guilabel}`Instructions` text field of the {guilabel}`Notes` tab, enter instructions for + how to complete the quality check and the criteria that must be met for the check to pass. + +```{image} pass_fail_check/quality-check-form.png +:align: center +:alt: A quality check form configured for a Pass - Fail quality check. +``` + +### Quality Control Point (QCP) + +To create a {{ QCP }} that generates *Pass - Fail* quality checks automatically, begin by navigating to +{menuselection}`Quality --> Quality Control --> Control Points`, and click {guilabel}`New`. Fill out +the new {{ QCP }} form as follows: + +- In the {guilabel}`Type` drop-down field, select the {guilabel}`Pass - Fail` quality check type. +- In the {guilabel}`Team` drop-down field, select the quality team responsible for managing the + checks created by the {{ QCP }}. +- In the {guilabel}`Instructions` text field, enter instructions for how to complete the quality + check and the criteria that must be met for the check to pass. + +```{image} pass_fail_check/qcp-form.png +:align: center +:alt: A Quality Control Point (QCP) form configured to create a Pass - Fail quality +: check. +``` + +## Process a Pass - Fail quality check + +Once created, there are multiple ways that *Measure* quality checks can be processed. If a quality +check is assigned to a specific inventory, manufacturing, or work order, the check can be processed +on the order itself. Alternatively, a check can be processed from the check's page. + +### From the check's page + +To process a *Measure* quality check from the check's page, begin by navigating to +{menuselection}`Quality --> Quality Control --> Quality Checks`, and select a quality check. Follow +the {guilabel}`Instructions` for how to complete the check. + +If the criteria for the check is met, click the {guilabel}`Pass` button at the top-left corner of +the page. If the criteria is not met, click the {guilabel}`Fail` button. + +### On an order + +To process a *Pass - Fail* quality check on an order, select a manufacturing order or inventory +order (receipt, delivery, return, etc.), for which a check is required. Manufacturing orders can be +selected by navigating to {menuselection}`Manufacturing --> Operations --> Manufacturing Orders`, +and clicking on an order. Inventory orders can be selected by navigating to +{menuselection}`Inventory`, clicking the {guilabel}`# To Process` button on an operation card, and +selecting an order. + +On the selected manufacturing or inventory order, a purple {guilabel}`Quality Checks` button appears +at the top of the order. Click the button to open the {guilabel}`Quality Check` pop-up window, which +shows all of the quality checks required for that order. + +To process a *Pass - Fail* quality check, follow the instructions shown on the {guilabel}`Quality +Check` pop-up window. If the criteria for the check is met, click the {guilabel}`Pass` button at the +bottom of the window. If the criteria is not met, click the {guilabel}`Fail` button. + +```{image} pass_fail_check/pass-fail-check-pop-up.png +:align: center +:alt: A Pass - Fail quality check pop-up window on a manufacturing or inventory order. +``` + +If a quality alert must be created, click the {guilabel}`Quality Alert` button that appears at the +top of the manufacturing or inventory order after the check fails. Clicking {guilabel}`Quality +Alert` opens a quality alert form on a new page. + +:::{seealso} +For a complete guide on how to fill out quality alert forms, view the documentation on +{ref}`quality alerts `. +::: + +### On a work order + +When configuring a {{ QCP }} that is triggered during manufacturing, a specific work order can also be +specified in the {guilabel}`Work Order Operation` field on the {{ QCP }} form. If a work order is +specified, a *Pass - Fail* quality check is created for that specific work order, rather than the +manufacturing order as a whole. + +*Pass - Fail* quality checks configured for work orders **must** be completed from the *Shop Floor* +module. To do so, begin by navigating to {menuselection}`Manufacturing --> Operations --> +Manufacturing Orders`. Select an {{ MO }} that includes a work order for which a *Pass - Fail* quality +check is required. + +On the {{ MO }}, select the {guilabel}`Work Orders` tab, and then click the {guilabel}`Open Work Order +(external link icon)` button on the line of the work order to be processed. On the resulting +{guilabel}`Work Orders` pop-up window, click the {guilabel}`Open Shop Floor` button to open the +*Shop Floor* module. + +When accessed from a specific work order, the *Shop Floor* module opens to the page for the work +center where the order is configured to be processed, and isolates the work order's card so that no +other cards are shown. + +Begin processing the work order's steps until the *Pass - Fail* quality check step is reached. Click +on the step to open a pop-up window that details the criteria for whether the check passes or fails. +Click the {guilabel}`Pass` button at the bottom of the pop-up window if the check passes, or the +{guilabel}`Fail` button if it fails. + +If the {guilabel}`Pass` button is clicked, the pop-up window moves to the next step for the work +order. If the {guilabel}`Fail` button is clicked, a {guilabel}`Quality Check Failed` pop-up window +appears, detailing what should be done next. + +```{image} pass_fail_check/pass-fail-check-shop-floor.png +:align: center +:alt: A Pass - Fail check as it appears in the Shop Floor module. +``` + +:::{tip} +Alternatively, instead of clicking on the step to open the pop-up window, a *Pass - Fail* quality +check can be completed by clicking the checkbox that appears on the right side of the step's line +on the work order card. When using this method, the quality check passes automatically, without a +pop-up window appearing. +::: + diff --git a/content/applications/inventory_and_mrp/quality/quality_check_types/picture_check.md b/content/applications/inventory_and_mrp/quality/quality_check_types/picture_check.md new file mode 100644 index 000000000..917fb3383 --- /dev/null +++ b/content/applications/inventory_and_mrp/quality/quality_check_types/picture_check.md @@ -0,0 +1,188 @@ +--- +substitutions: + MO: '{abbr}`MO (Manufacturing Order)`' + QCP: '{abbr}`QCP (Quality Control Point)`' + QCPs: '{abbr}`QCP (Quality Control Points)`' +--- + +# Take a Picture quality check + +In Odoo *Quality*, a *Take a Picture* check is one of the quality check types that can be selected +when creating a new quality check or quality control point (QCP). *Take a Picture* checks require a +picture to be attached to the check, which can then be reviewed by a quality team. + +## Create a Take a Picture quality check + +There are two distinct ways that *Take a Picture* quality checks can be created. A single check can +be manually created. Alternatively, a {{ QCP }} can be configured that automatically creates checks at a +predetermined interval. + +This documentation only details the configuration options that are unique to *Take a Picture* +quality checks and {{ QCPs }}. For a full overview of all the configuration options available when +creating a single check or a {{ QCP }}, see the documentation on {ref}`quality checks +` and {ref}`quality control points +`. + +### Quality check + +To create a single *Take a Picture* quality check, navigate to {menuselection}`Quality --> Quality +Control --> Quality Checks`, and click {guilabel}`New`. Fill out the new quality check form as +follows: + +- In the {guilabel}`Type` drop-down field, select the {guilabel}`Take a Picture` quality check type. +- In the {guilabel}`Team` drop-down field, select the quality team responsible for managing the + check. +- In the {guilabel}`Instructions` text field of the {guilabel}`Notes` tab, enter instructions for + how the picture should be taken. + +```{image} picture_check/picture-check-form.png +:align: center +:alt: A quality check form configured for a Take a Picture quality check. +``` + +### Quality control point + +To create a {{ QCP }} that generates *Take a Picture* quality checks automatically, navigate to +{menuselection}`Quality --> Quality Control --> Control Points`, and click {guilabel}`New`. Fill out +the new {{ QCP }} form as follows: + +- In the {guilabel}`Type` drop-down field, select the {guilabel}`Take a Picture` quality check type. +- If the *Maintenance* app is installed, a {guilabel}`Device` field appears after selecting the + *Take a Picture* check type. Use this field to specify a device that should be used to take + quality check pictures. For information about managing devices in the *Maintenance* app, see the + documentation on {ref}`adding new equipment `. +- In the {guilabel}`Team` drop-down field, select the quality team responsible for managing the + checks created by the {{ QCP }}. +- In the {guilabel}`Instructions` text field, enter instructions for how the picture should be + taken. + +```{image} picture_check/picture-qcp-form.png +:align: center +:alt: A Quality Control Point (QCP) form configured to create a Take a Picture quality +: check. +``` + +## Process a Take a Picture quality check + +Once created, there are multiple ways that *Take a Picture* quality checks can be processed. If a +quality check is assigned to a specific inventory, manufacturing, or work order, the check can be +processed on the order itself. Alternatively, a check can be processed from the check's page. + +### From the check's page + +To process a *Take a Picture* quality check from the check's page, begin by navigating to +{menuselection}`Quality --> Quality Control --> Quality Checks`, and then select a quality check. +Follow the {guilabel}`Instructions` for how to take the picture. + +After taking the picture, make sure it is stored on the device being used to process the quality +check (computer, tablet, etc.). Then, click the {guilabel}`✏️ (pencil)` button in the +{guilabel}`Picture` section to open the device's file manager. In the file manager, navigate to the +picture, select it, and click {guilabel}`Open` to attach it. + +```{image} picture_check/picture-edit-button.png +:align: center +:alt: The edit button (pencil) on a Take a Picture quality check. +``` + +### On an order + +To process a *Take a Picture* quality check on an order, select a manufacturing order or inventory +order (receipt, delivery, return, etc.), for which a check is required. Manufacturing orders can be +selected by navigating to {menuselection}`Manufacturing --> Operations --> Manufacturing Orders`, +and clicking on an order. Inventory orders can be selected by navigating to +{menuselection}`Inventory`, clicking the {guilabel}`# To Process` button on an operation card, and +selecting an order. + +On the selected manufacturing or inventory order, a purple {guilabel}`Quality Checks` button appears +at the top of the page. Click the button to open the {guilabel}`Quality Check` pop-up window, which +shows all of the quality checks required for that order. + +Follow the instructions detailing how to take the picture, which are shown on the {guilabel}`Quality +Check` pop-up window. After taking the picture, make sure it is stored on the device being used to +process the quality check (computer, tablet, etc.). + +Then, click the {guilabel}`Take a Picture` button in the {guilabel}`Picture` section to open the +device's file manager. In the file manager, navigate to the picture, select it, and click +{guilabel}`Open` to attach it. Finally, click {guilabel}`Validate` on the {guilabel}`Quality Check` +pop-up window to complete the quality check. + +```{image} picture_check/picture-check-pop-up.png +:align: center +:alt: A Take a Picture quality check pop-up window on a manufacturing or inventory +: order. +``` + +If a quality alert must be created, click the {guilabel}`Quality Alert` button that appears at the +top of the manufacturing or inventory order after the check is validated. Clicking +{guilabel}`Quality Alert` opens a quality alert form on a new page. For a complete guide on how to +fill out quality alert forms, view the documentation on {ref}`quality alerts +`. + +### On a work order + +When configuring a {{ QCP }} that is triggered during manufacturing, a specific work order can also be +specified in the {guilabel}`Work Order Operation` field on the {{ QCP }} form. If a work order is +specified, a *Take a Picture* quality check is created for that specific work order, rather than the +manufacturing order as a whole. + +*Take a Picture* quality checks configured for work orders **must** be completed from the *Shop +Floor* module. To do so, begin by navigating to {menuselection}`Manufacturing --> Operations --> +Manufacturing Orders`. Then, select an {{ MO }} that includes a work order for which a *Take a Picture* +quality check is required. + +On the {{ MO }}, select the {guilabel}`Work Orders` tab, and then click the {guilabel}`Open Work Order +(external link icon)` button on the line of the work order to be processed. On the resulting +{guilabel}`Work Orders` pop-up window, click the {guilabel}`Open Shop Floor` button to open the +*Shop Floor* module. + +When accessed from a specific work order, the *Shop Floor* module opens to the page for the work +center where the order is configured to be processed, and isolates the work order's card, so no +other cards are shown. + +Process the work order's steps until the *Take a Picture* quality check step is reached. Click on +the step to open a pop-up window that includes instructions for how the picture should be taken. +After taking the picture, make sure it is stored on the device being used to process the quality +check (computer, tablet, etc.). + +Then, click the {guilabel}`Take a Picture` button on the pop-up window to open the device's file +manager. In the file manager, navigate to the picture, select it, and click {guilabel}`Open` to +attach it. + +Finally, click {guilabel}`Validate` at the bottom of the pop-up window to complete the quality +check. The pop-up window then moves on to the next step of the work order. + +```{image} picture_check/picture-check-shop-floor.png +:align: center +:alt: A Take a Picture check in the Shop Floor module. +``` + +If a quality alert must be created, exit the pop-up window by clicking the {guilabel}`X (close)` +button in the top-right corner. + +Then, click the {guilabel}`⋮ (three vertical dots)` button on the bottom-right corner of the work +order card to open the {guilabel}`What do you want to do?` pop-up window. + +On the {guilabel}`What do you want to do?` pop-up window, select the {guilabel}`Create a Quality +Alert` button. Doing so opens a blank quality alert form in a new {guilabel}`Quality Alerts` pop-up +window. + +:::{seealso} +For a complete guide on how to fill out quality alert forms, view the documentation on +{doc}`quality alerts <../quality_management/quality_alerts>`. +::: + +## Review picture attached to quality check + +After a picture has been attached to a check, it can then be reviewed by quality team members or +other users. To do so, navigate to {menuselection}`Quality --> Quality Control --> Quality Checks`, +and select a quality check to review. + +The attached picture appears in the {guilabel}`Picture` section of the quality check form. After +reviewing the picture, click the {guilabel}`Pass` button if the check passes, or the +{guilabel}`Fail` button if the check fails. + +```{image} picture_check/review-picture-check.png +:align: center +:alt: A Take a Picture check with a picture attached. +``` + diff --git a/content/applications/inventory_and_mrp/quality/quality_management.md b/content/applications/inventory_and_mrp/quality/quality_management.md new file mode 100644 index 000000000..c01935365 --- /dev/null +++ b/content/applications/inventory_and_mrp/quality/quality_management.md @@ -0,0 +1,15 @@ +--- +nosearch: true +--- + +# Quality control basics + +```{toctree} +:titlesonly: true + +quality_management/quality_control_points +quality_management/quality_alerts +quality_management/quality_checks +quality_management/failure_locations +``` + diff --git a/content/applications/inventory_and_mrp/quality/quality_management/failure_locations.md b/content/applications/inventory_and_mrp/quality/quality_management/failure_locations.md new file mode 100644 index 000000000..140d9ce67 --- /dev/null +++ b/content/applications/inventory_and_mrp/quality/quality_management/failure_locations.md @@ -0,0 +1,112 @@ +--- +substitutions: + QCP: '{abbr}`QCP (Quality Control Point)`' + QCPs: '{abbr}`QCP (Quality Control Points)`' +--- + +# Failure locations + +In Odoo, *quality control points* (QCPs) are used to create *quality checks*, which prompt employees +to confirm the quality of products, when they are included in certain operations. By setting one or +more *failure locations* on a {{ QCP }}, products that fail the quality checks it creates can be sent to +one of the specified locations. + +:::{important} +The *Failure Location* feature was added in version 17.0 of Odoo, and does **not** appear in any +previous version. To upgrade an Odoo database to a more recent version, see the documentation on +{doc}`database upgrades <../../../../administration/upgrade>`. +::: + +## Configuration + +To use failure locations, the *Storage Locations* setting **must** be enabled in the settings of the +*Inventory* app. This setting allows for the creation of sub-locations within a warehouse, including +failure locations. + +To enable the *Storage Locations* setting, navigate to {menuselection}`Inventory app --> +Configuration --> Settings`, and tick the checkbox next to {guilabel}`Storage Locations`, under the +{guilabel}`Warehouses` heading. Then, click {guilabel}`Save`. + +```{image} failure_locations/storage-locations-setting.png +:align: center +:alt: The Storage Locations setting on the Inventory app settings page. +``` + +:::{important} +Failure locations are most effective when used for products configured as *storable products*. +This is because inventory counts are only tracked for storable products, versus *consumable* +products, for which exact counts are not tracked. + +Quality checks can still be created for consumable products, and those products can be sent to a +failure location if they fail a check. However, Odoo does not track the exact quantity of a +consumable product stored at a failure location. + +To configure a product as storable, navigate to {menuselection}`Inventory app --> Products --> +Products`, and select a product. In the {guilabel}`Product Type` field on the {guilabel}`General +Information` tab, make sure that {guilabel}`Storable Product` is selected from the drop-down +menu. +::: + +## Add failure location to QCP + +To add a failure location to a {{ QCP }}, navigate to {menuselection}`Quality app --> Quality Control +--> Control Points`. Select an existing {{ QCP }} from the list, or create a new one by clicking +{guilabel}`New`. + +:::{note} +The following instructions only detail the configuration settings necessary for adding a failure +location to a {{ QCP }}. For a full overview of {{ QCPs }} and all of the options available when +configuring them, see the documentation on {doc}`quality control points +`. +::: + +In the {guilabel}`Control Per` field on the {{ QCP }} form, select the {guilabel}`Quantity` option. +Doing so causes a {guilabel}`Failure Locations` field to appear on the form. This field is only +available when the {guilabel}`Quantity` option is selected. + +In the {guilabel}`Failure Locations` field, select one or more locations from the drop-down menu. To +create a new location, type the desired location name into the field, and then select +{guilabel}`Create "[name]"` from the drop-down menu. + +```{image} failure_locations/qcp-form.png +:align: center +:alt: A QCP form in the Quality app, configured with a failure location. +``` + +## Send products to failure location + +Once a {{ QCP }} has been configured with one or more failure locations, products that fail a check +created by the {{ QCP }} can be routed to one of the locations. + +To do so, open an order that requires a quality check created by a {{ QCP }} configured with a failure +location. For example, navigate to {menuselection}`Inventory app --> Operations --> Receipts`, and +select a receipt. + +At the top of the selected order, click the {guilabel}`Quality Checks` button to open a pop-up +window, from which the quality check can be processed. At the bottom of the pop-up window, click the +{guilabel}`Fail` button to fail the quality check, which opens a second pop-up window, titled +{guilabel}`Quality Check Failed for [Product]`. + +In the {guilabel}`Quantity Failed` field, enter the quantity of the product that failed to pass the +quality check. In the {guilabel}`Failure Location` field, select a location to which the failed +quantity should be sent. Then, click {guilabel}`Confirm` at the bottom of the pop-up window to close +it. + +```{image} failure_locations/failed-pop-up.png +:align: center +:alt: The pop-up window that appears after a quality check fails. +``` + +Finally, on the order, click the {guilabel}`Validate` button at the top of the page. Doing so +confirms the products that failed the quality check were sent to the failure location, while +products that passed it were sent to their normal storage locations. + +## View failure location inventory + +To view the product quantities stored in a failure location, navigate to {menuselection}`Inventory +app --> Configuration --> Locations`. Select a failure location from the list. Then, click the +{guilabel}`Current Stock` smart button on the location's page. + +A failure location's page lists all of the products stored within the location, along with the +quantity of each. + diff --git a/content/applications/inventory_and_mrp/quality/quality_management/quality_alerts.md b/content/applications/inventory_and_mrp/quality/quality_management/quality_alerts.md new file mode 100644 index 000000000..443d93117 --- /dev/null +++ b/content/applications/inventory_and_mrp/quality/quality_management/quality_alerts.md @@ -0,0 +1,116 @@ +--- +substitutions: + MO: '{abbr}`MO (Manufacturing Order)`' +--- + +# Quality alerts + +(quality/quality_management/quality-alerts)= + +In the Odoo *Quality* app, *quality alerts* are used to notify quality teams of product defects or +other issues. Quality alerts can be created from a manufacturing or inventory order, from a work +order in the *Shop Floor* module, or directly within the *Quality* app. + +## Create quality alerts + +There are multiple ways to create a new quality alert: + +- **From the Quality app itself**, by to {menuselection}`Quality --> Quality Control --> Quality + Alerts`, and then click {guilabel}`New` to open a quality alert form. + +- Navigate to {menuselection}`Manufacturing --> Operations --> Manufacturing Orders`, and then + select an {{ MO }}. Click the {guilabel}`Quality Alert` button at the top of the {{ MO }} to open a + quality alert form in a new page. + + :::{important} + This method can only be used if a quality check has been requested for the {{ MO }}. The + {guilabel}`Quality Alert` button will not appear otherwise. + ::: + +- Open the {menuselection}`Inventory` app, click the {guilabel}`# To Process` button on an inventory + order type card (Receipts, Delivery Orders, etc.), and then select an order. Click the + {guilabel}`Quality Alert` button at the top of the order to open a quality alert form in a new + page. + + :::{important} + This method can only be used if a quality check has been requested for the inventory order. The + {guilabel}`Quality Alert` button will not appear otherwise. If the button does not appear, a + quality alert can also be created by clicking the {guilabel}`⚙️ (gear)` icon at the top of the + page and selecting the {guilabel}`Quality Alert` option from the resulting menu. + ::: + +- Open the {menuselection}`Shop Floor` module, and then select a work center from the navigation bar + at the top of the page. Then, click the {guilabel}`⋮ (three vertical dots)` button at the + bottom-right of a work order card to open the {guilabel}`What do you want to do?` menu. Select the + {guilabel}`Create a Quality Alert` option from this menu to open a quality alert in a pop-up + window. + +:::{note} +Depending on how a new quality alert form is opened, certain fields on the form may already be +filled in. For example, if a quality alert is created from a work order card in the *Shop Floor* +module, the {guilabel}`Product` and {guilabel}`Work Center` are pre-filled. +::: + +### Quality alerts form + +After opening a new quality alert form, begin by giving it a short {guilabel}`Title` that summarizes +the issue with the product. + +Then, if the quality alert is referencing: + +- **A specific product or product variant**, select it from the {guilabel}`Product` or + {guilabel}`Product Variant` drop-down menus. +- **A specific work center**, select it from the {guilabel}`Work Center` drop-down menu. +- **A specific picking order**, select it from the {guilabel}`Picking` drop-down menu. + +Next in the {guilabel}`Team` field, select the quality team that is responsible for managing the +quality alert. If a specific employee should be responsible for the quality alert, select them from +the {guilabel}`Responsible` drop-down menu. + +In the {guilabel}`Tags` field, select any tags relevant to the quality alert from the drop-down +menu. + +Use the {guilabel}`Root Cause` field to select the cause of the quality issue, if known. + +Lastly, choose a {guilabel}`Priority` level by selecting a {guilabel}`⭐ (star)` number between one +and three. Quality alerts with higher priorities appear at the top of the {guilabel}`Quality Alerts` +Kanban board in the *Quality* app. + +At the bottom of the quality alert form are four tabs which aid in adding supplemental information +or actions to be taken for the quality alert. They can be filled out as follows: + +- In the {guilabel}`Description` tab, enter a description of the quality issue. +- Use the {guilabel}`Corrective Actions` tab to detail the steps that should be taken to fix the + issue. +- Use the {guilabel}`Preventive Actions` tab to detail what should be done to prevent the issue from + occurring in the future. +- In the {guilabel}`Miscellaneous` tab, select the {guilabel}`Vendor` of the product. If using an + Odoo database which manages multiple companies, select the relevant company in the + {guilabel}`Company` field. Finally, specify when the alert was assigned to a quality team in the + {guilabel}`Date Assigned` field. + +```{image} quality_alerts/alert-form.png +:align: center +:alt: A quality alert form that has been filled out. +``` + +## Manage quality alerts + +To view all existing quality alerts, navigate to {menuselection}`Quality --> Quality Control --> +Quality Alerts`. By default, alerts are displayed in a Kanban board view, which organizes them into +different stages based on where they are in the review process. + +To move an alert to a different stage, simply drag and drop it on the desired stage. Alternatively, +select a quality alert to open it, and then click the desired stage above the top-right corner of +the quality alert form. + +To create a new alert within a specific stage, click the {guilabel}`+ (plus)` button to the right of +the stage name. In the new alert card that appears below the stage title, enter the +{guilabel}`Title` of the alert, and then click {guilabel}`Add`. To configure the rest of the alert, +select the alert card to open its form. + +```{image} quality_alerts/alert-kanban.png +:align: center +:alt: The Quality Alerts page, displaying alerts in a Kanban view. +``` + diff --git a/content/applications/inventory_and_mrp/quality/quality_management/quality_checks.md b/content/applications/inventory_and_mrp/quality/quality_management/quality_checks.md new file mode 100644 index 000000000..c09231947 --- /dev/null +++ b/content/applications/inventory_and_mrp/quality/quality_management/quality_checks.md @@ -0,0 +1,160 @@ +--- +substitutions: + MO: '{abbr}`MO (Manufacturing Order)`' + QCP: '{abbr}`QCP (Quality Control Point)`' +--- + +# Quality checks + +(quality/quality_management/quality-checks)= + +Quality checks are manual inspections conducted by employees, and are used to ensure the quality of +products. In Odoo, a quality check can be conducted for a single product, or multiple products +within the same inventory operation or manufacturing order. + +Using a Quality Control Point (QCP), it is possible to create quality checks automatically at +regular intervals. When quality checks are created by a {{ QCP }}, they appear on a manufacturing or +inventory order, where the employee processing the order will be prompted to complete them. For a +full explanation of how to create and configure a {{ QCP }}, see the documentation on {ref}`quality +control points `. + +While quality checks are most commonly created automatically by a {{ QCP }}, it is also possible to +manually create a single quality check. Creating a check manually is useful when an employee wants +to schedule a quality check that will only occur once, or register a quality check that they conduct +unprompted. + +## Manual quality check + +To manually create a single quality check, navigate to {menuselection}`Quality --> Quality Control +--> Quality Checks`, and click {guilabel}`New`. On the quality check form, begin by selecting an +option from the {guilabel}`Control per` drop-down menu: + +- {guilabel}`Operation` requests a check for an entire operation (ex. delivery order) and all + products within it. +- {guilabel}`Product` requests a check for every unit of a product that is part of an operation (ex. + every unit of a product within a delivery order). +- {guilabel}`Quantity` requests a check for every quantity of a product that is part of an operation + (ex. one check for five units of a product within a delivery order). Selecting + {guilabel}`Quantity` also causes a {guilabel}`Lot/Serial` drop-down field to appear, from which + can be selected a specific lot or serial number that the quality check should be conducted for. + +Next, select an inventory operation from the {guilabel}`Picking` drop-down menu or a manufacturing +order from the {guilabel}`Production Order` drop-down menu. This is necessary because Odoo needs to +know for which operation the quality check is being conducted. + +If the quality check should be assigned to a specific {{ QCP }}, select it from the {guilabel}`Control +Point` drop-down menu. This is useful if the quality check is being created manually, but should +still be recognized as belonging to a specific {{ QCP }}. + +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}`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 + measurement must be entered before the check can be completed. +- Selecting {guilabel}`Worksheet` causes a {guilabel}`Quality Template` drop-down field to appear. + Use it to select a quality worksheet that must be filled out to complete the check. + +In the {guilabel}`Team` field, select the quality team that is responsible for the quality check. In +the {guilabel}`Company` field, select the company that owns the product being inspected. + +On the {guilabel}`Notes` tab at the bottom of the form, enter any relevant instructions in the +{guilabel}`Instructions` text entry box (ex. 'Attach a picture of the product'). In the +{guilabel}`Notes` text entry box, enter any relevant information about the quality check (who +created it, why it was created, etc.). + +Finally, if the check is being processed immediately, click the {guilabel}`Pass` button at the top +left of the screen if the check passes, or the {guilabel}`Fail` button if the check fails. + +```{image} quality_checks/quality-check-form.png +:align: center +:alt: A quality check form filled out for a Pass - Fail check. +``` + +## Process quality check + +Quality checks can be processed directly on the quality check's page, or from a manufacturing or +inventory order for which a check is required. Alternatively, if a quality check is created for a +specific work order operation, the check is processed in the *Shop Floor* module. + +:::{note} +It is not possible to manually create a single quality check that is assigned to a specific work +order operation. Quality checks for work order operations can only be created by a {{ QCP }}. See the +documentation on {ref}`Quality Control Points +` for information about how to configure a +{{ QCP }} that will create quality checks for a specific work order operation. +::: + +### Quality check page + +To process a quality check from the check's page, begin by navigating to {menuselection}`Quality --> +Quality Control --> Quality Checks`, then select the check to process. Follow the instructions for +how to complete the check, listed in the {guilabel}`Instructions` field of the {guilabel}`Notes` tab +at the bottom of the page. + +If the quality check passes, click the {guilabel}`Pass` button at the top of the page. If the check +fails, click the {guilabel}`Fail` button, instead. + +### Quality check on order + +To process a quality check on an order, select a manufacturing or inventory order (receipt, +delivery, return, etc.), for which a check is required. Manufacturing orders can be selected by +navigating to {menuselection}`Manufacturing --> Operations --> Manufacturing Orders`, and clicking +on an order. Inventory orders can be selected by navigating to {menuselection}`Inventory`, clicking +the {guilabel}`# To Process` button on an operation card, and selecting an order. + +On the selected inventory or manufacturing order, a purple {guilabel}`Quality Checks` button appears +at the top of the order. Click the button to open the {guilabel}`Quality Check` pop-up window, which +shows all of the quality checks required for that order. + +Follow the instructions that appear on the {guilabel}`Quality Check` pop-up window. If a Pass - Fail +check is being processed, complete the check by clicking {guilabel}`Pass` or {guilabel}`Fail` at the +bottom of the pop-up window. For all other quality check types, a {guilabel}`Validate` button +appears instead. Click it to complete the check. + +```{image} quality_checks/quality-check-pop-up.png +:align: center +:alt: The "Quality Check" pop-up window on a manufacturing order. +``` + +### Quality check on work order + +To process a quality check for a work order, begin by navigating to {menuselection}`Manufacturing +--> Operations --> Manufacturing Orders`. Select an {{ MO }} that includes a work order for which a +quality check is required. + +On the {{ MO }}, select the {guilabel}`Work Orders` tab, and then click the {guilabel}`Open Work Order +(external link icon)` button on the line of the work order to be processed. On the resulting +{guilabel}`Work Orders` pop-up window, click the {guilabel}`Open Shop Floor` button to open the +*Shop Floor* module. + +:::{seealso} +For a full guide to the Shop Floor module, see the {doc}`Shop Floor overview +<../../manufacturing/shop_floor/shop_floor_overview>` documentation. +::: + +When accessed from a specific work order, the *Shop Floor* module opens to the page for the work +center where the order is configured to be processed, and isolates the work order's card so that no +other cards are shown. + +Process the work order's steps until the quality check step is reached. Click on the step to open a +pop-up window that details how the check should be completed. After following the instructions, +click {guilabel}`Validate` to complete the check. Alternatively, if a *Pass - Fail* check is being +processed, click either the {guilabel}`Pass` or {guilabel}`Fail` button. + +It is also possible to complete a quality check by clicking the checkbox on the right side of the +step. Doing so automatically marks the check as *Passed*. + +:::{note} +The specific steps for processing a quality check depend upon the type of check being conducted. +For information about processing each type of quality check, see the associated documentation: + +- {doc}`../quality_check_types/instructions_check` +- {doc}`../quality_check_types/pass_fail_check` +- {doc}`../quality_check_types/measure_check` +- {doc}`../quality_check_types/picture_check` +::: + diff --git a/content/applications/inventory_and_mrp/quality/quality_management/quality_control_points.md b/content/applications/inventory_and_mrp/quality/quality_management/quality_control_points.md new file mode 100644 index 000000000..7f98f4cde --- /dev/null +++ b/content/applications/inventory_and_mrp/quality/quality_management/quality_control_points.md @@ -0,0 +1,154 @@ +--- +substitutions: + MO: '{abbr}`MO (Manufacturing Order)`' + MOs: '{abbr}`MOs (Manufacturing Orders)`' + QCP: '{abbr}`QCP (Quality Control Point)`' + QCPs: '{abbr}`QCPs (Quality Control Points)`' +--- + +# Quality control points + +(quality/quality_management/quality-control-points)= + +In Odoo, *quality control points* (QCPs), are used to automatically create {doc}`quality checks +` at predetermined intervals. {{ QCPs }} can be configured to create quality checks for +specific operations (manufacturing, delivery, etc.), as well as specific products within those +operations. + +Using {{ QCPs }} allows quality teams to ensure products are being regularly inspected for defects and +other issues. + +## Configure quality control points + +To create a new {{ QCP }}, navigate to {menuselection}`Quality --> Quality Control --> Control Points`, +and then click {guilabel}`New`. + +Begin filling out the new {{ QCP }} by entering a unique {guilabel}`Title` that makes the {{ QCP }} easily +identifiable. + +In the {guilabel}`Products` field, select one or more products the {{ QCP }} should apply to. If the +{{ QCP }} should apply to an entire product category, select it in the {guilabel}`Product Categories` +field. + +In the {guilabel}`Operations` field, select the operation(s) that should trigger the {{ QCP }}. For +example, selecting the {guilabel}`Manufacturing` option in the {guilabel}`Operations` field causes a +quality check to be created for new manufacturing orders (MOs). + +:::{note} +When creating a new {{ QCP }}, at least one operation must be listed in the {guilabel}`Operations` +field. However, the {guilabel}`Products` and {guilabel}`Product Categories` fields can be left +blank. If they are left blank, the {{ QCP }} generates quality checks for every instance of the +specified operation(s). +::: + +If the {guilabel}`Manufacturing` operation is selected in the {guilabel}`Operations` field, a new +field appears below it, titled {guilabel}`Work Order Operation`. From this field, select a specific +work order to generate quality checks for that operation, rather than the manufacturing operation, +in general. + +```{eval-rst} +.. example:: + A |QCP| could be configured to create quality checks for the `Assembly` work order of the `Coffee + Table` product. Then, if a new |MO| is confirmed for a `Coffee Table`, the |QCP| creates a + quality check specifically for the `Assembly` operation. +``` + +The {guilabel}`Control Per` field is set to one of three options that determine *when* a new quality +check is created: + +- {guilabel}`Operation`: One check is requested for the specified operation, as a whole. +- {guilabel}`Product`: One check is requested for each *unique* product included in the specified + operation. For example, a delivery operation for one table and four chairs would generate two + checks, since two *unique* products are included in the operation. +- {guilabel}`Quantity`: A check is requested for a certain percentage of items within the specified + operation. This percentage is set by enabling the {guilabel}`Partial Transfer Test` checkbox, and + then entering a numerical value in the {guilabel}`Percentage` field that appears below. If the + checkbox is not enabled, one quality check is created for the full quantity. + +The {guilabel}`Control Frequency` field is set to one of three options that determine *how often* a +new quality check is created: + +- {guilabel}`All`: A quality check is requested every time the conditions of the {{ QCP }} are met. +- {guilabel}`Randomly`: A quality check is randomly requested for a certain percentage of + operations, which can be specified in the {guilabel}`Every #% of Operations` field that appears + below. +- {guilabel}`Periodically`: A quality check is requested once every set period of time, which is + specified by entering a numerical value in the field below, and choosing either {guilabel}`Days`, + {guilabel}`Weeks`, or {guilabel}`Months` as the desired time interval. + +In the {guilabel}`Type` field, specify the type of quality check that should be performed. The +method for processing quality checks created by the {{ QCP }} depends upon the type of quality check +selected: + +- {guilabel}`Instructions` checks provide specific instructions for how to complete the quality + check. +- {guilabel}`Take a Picture` checks require a picture of the product be uploaded for later review by + the assigned quality team. +- {guilabel}`Register Production` checks prompt manufacturing employees to confirm the quantity of + the product that was produced during the manufacturing operation. +- {guilabel}`Pass - Fail` checks specify a criterion that products must meet for the check to pass. +- {guilabel}`Measure` checks prompt employees to record a measurement of the product that must be + within a tolerance of a norm value for the check to pass. +- {guilabel}`Worksheet` checks require the employee processing the check to fill out an interactive + worksheet. +- {guilabel}`Spreadsheet` checks require the employee processing the check to fill out an + interactive spreadsheet. + +:::{important} +An *Instructions* check is the same as a step on a work order for an MO. + +When a step is added to a work order, Odoo stores it in the Quality app as a {{ QCP }}. It is +possible to manually create a {{ QCP }} with the *Instructions* check type, and even assign it to an +operation other than manufacturing, like receipts. + +However, when creating a control point specifically for quality control purposes, using a +different check type is probably more effective. +::: + +:::{note} +When creating a {{ QCP }} with the {guilabel}`Worksheet` or {guilabel}`Spreadsheet` check types, it +is necessary to specify a *Quality Worksheet Template* or *Quality Spreadsheet Template* in the +{guilabel}`Template` field that appears below the {guilabel}`Type` field. + +The selected template is duplicated for each quality check created by the {{ QCP }}, and **must** be +filled out to complete the quality check. + +To create a new template, navigate to {menuselection}`Quality app --> Configuration --> Quality +Worksheet/Spreadsheet Templates`, and click {guilabel}`New`. +::: + +In the {guilabel}`Team` field, specify the quality team that is responsible for managing the {{ QCP }}, +and the quality checks it creates. If a specific quality team member is responsible for the {{ QCP }}, +select them in the {guilabel}`Responsible` field. + +The {guilabel}`Step Document` field has two options that specify the location of an instructional +document detailing how to complete the quality checks created by the {{ QCP }}. + +Select {guilabel}`Specific Page of Operation Worksheet` if the document is included with the +instructional worksheet for the work order, then enter the page number in the {guilabel}`Worksheet +Page` field that appears below. + +Select {guilabel}`Custom` if the document should be included in the {guilabel}`Instructions` tab at +the bottom of the {{ QCP }}. + +In the {guilabel}`Instructions` tab at the bottom of the form, enter instructions for how to +complete the quality checks created by the {{ QCP }}. + +If the {guilabel}`Custom` option was selected in the {guilabel}`Step Document` field above, a +document can be attached in this tab. To do so, either select the {guilabel}`Upload your file` +button to open the device's file manager, and then select a file, or add a link to a Google Slides +document in the {guilabel}`Google Slide Link` field. + +In the {guilabel}`Message If Failure` tab, include instructions for what to do if the quality check +fails. For example, instruct the employee processing the quality check to create a {doc}`quality +alert `. + +The {guilabel}`Notes` tab is used to provide additional information about the {{ QCP }}, like the reason +it was created. The information entered in this tab is **not** shown to employees processing the +quality checks created by the {{ QCP }}. + +```{image} quality_control_points/qcp-form.png +:align: center +:alt: A QCP configured to create Pass - Fail checks for a work order operation. +``` + diff --git a/content/applications/inventory_and_mrp/repairs.md b/content/applications/inventory_and_mrp/repairs.md new file mode 100644 index 000000000..d1d165ecb --- /dev/null +++ b/content/applications/inventory_and_mrp/repairs.md @@ -0,0 +1,18 @@ +--- +hide-page-toc: true +nosearch: true +show-content: true +show-toc: true +--- + +# Repairs + +Odoo *Repairs* assists companies in creating and processing repairs for damaged products returned by +customers. + +```{toctree} +:titlesonly: true + +repairs/repair_orders +``` + diff --git a/content/applications/inventory_and_mrp/repairs/repair_orders.md b/content/applications/inventory_and_mrp/repairs/repair_orders.md new file mode 100644 index 000000000..f5269327a --- /dev/null +++ b/content/applications/inventory_and_mrp/repairs/repair_orders.md @@ -0,0 +1,278 @@ +--- +substitutions: + DO: '{abbr}`DO (Delivery Order)`' + RO: '{abbr}`RO (Repair Order)`' + SO: '{abbr}`SO (Sales Order)`' + UoM: '{abbr}`UoM (Unit of Measure)`' +--- + +# Process repair orders + +Sometimes, products delivered to customers can break or be damaged in transit, and need to be +returned for a refund, delivery of a replacement product, or repairs. + +In Odoo, repairs for products returned by customers can be tracked in the *Repairs* app. Once +repaired, products can be redelivered to the customer. + +The return and repair process for damaged products typically follows the below steps: + +1. {ref}`Process return order for damaged product ` +2. {ref}`Create repair order for returned product ` +3. {ref}`Return repaired product to customer ` + +(repairs-repair-orders-return-order)= + +## Return order + +Returns can be processed in Odoo via *reverse transfers*, created directly from a sales order (SO) +once products have been delivered to a customer. + +To create a return, navigate to the {menuselection}`Sales app`, and click into an {{ SO }} from which a +product should be returned. Then, from the {{ SO }} form, click the {guilabel}`Delivery` smart button. +Doing so opens the delivery order (DO) form. + +From this form, click {guilabel}`Return`. This opens a {guilabel}`Reverse Transfer` pop-up window. + +```{image} repair_orders/repair-orders-reverse-transfer.png +:align: center +:alt: Reverse transfer pop-up window on delivery order form. +``` + +This pop-up lists the {guilabel}`Product` included in the order, the {guilabel}`Quantity` delivered +to the customer, and the {guilabel}`Unit of Measure` the product was in. + +Click the value in the {guilabel}`Quantity` field to change the quantity of the product to be +returned, if necessary. + +Click the {guilabel}`🗑️ (trash)` icon at the far-right of the product line to remove it from the +return, if necessary. + +Once ready, click {guilabel}`Return` to confirm the return. This creates a new receipt for the +returned products. + +Once the product has been returned to the warehouse, receipt of the return can be registered in the +database by clicking {guilabel}`Validate` from the reverse transfer form. + +:::{tip} +Once a reverse transfer for a return is validated, the value in the {guilabel}`Delivered` column +on the original {{ SO }} updates to reflect the difference between the original {guilabel}`Quantity` +ordered, and the {guilabel}`Quantity` returned by the customer. + +```{image} repair_orders/repair-orders-quantity-delivered.png +:align: center +:alt: Delivered and Quantity columns on sales order after return. +``` +::: + +(repairs-repair-orders-repair)= + +## Create repair order + +Once products have been returned, their repairs can be tracked by creating a repair order (RO). + +To create a new {{ RO }}, navigate to {menuselection}`Repairs app`, and click {guilabel}`New`. This +opens a blank {{ RO }} form. + +```{image} repair_orders/repair-orders-left-hand-form.png +:align: center +:alt: Left-hand side of blank repair order form. +``` + +On this form, begin by selecting a {guilabel}`Customer`. The customer selected should be for whom +the order will be invoiced and delivered. + +In the {guilabel}`Product to Repair` field, click the drop-down menu to select the product that +needs repair. If necessary, click {guilabel}`Search More...` to open a {guilabel}`Search: Product to +Repair` pop-up window, and browse all products in the database. + +Once a {guilabel}`Product to Repair` is selected, a new {guilabel}`Product Quantity` field appears +below it. In that field, enter the quantity (in a `0.00` format) of the product that requires +repair. + +To the right of that value, click the drop-down list to select the unit of measure (UoM) for the +product. + +In the {guilabel}`Return` field, click the drop-down menu and select the return order from which the +product to be repaired comes from. + +Tick the {guilabel}`Under Warranty` checkbox, if the product being repaired is covered by a +warranty. If ticked, the {guilabel}`Customer` is not charged for all the parts used in the repair +order. + +In the {guilabel}`Scheduled Date` field, click the date to reveal a calendar popover window. From +this calendar, select a date for the repair, and click {guilabel}`Apply`. + +```{image} repair_orders/repair-orders-completed-repair-form.png +:align: center +:alt: Right-hand side of blank repair order form. +``` + +In the {guilabel}`Responsible` field, click the drop-down menu and select the user who should be +responsible for the repair. + +In the {guilabel}`Company` field, if in a multi-company environment, select which company this {{ RO }} +belongs to. + +In the {guilabel}`Tags` field, click the drop-down menu and select which tags should be applied to +this {{ RO }}. + +### Parts tab + +Add, remove, or recycle parts in the {guilabel}`Parts` tab. To do so, click {guilabel}`Add a line` +at the bottom of the form. + +In the {guilabel}`Type` column, click the box to reveal three options to choose from: +{guilabel}`Add` (selected by default), {guilabel}`Remove`, and {guilabel}`Recycle`. + +```{image} repair_orders/repair-orders-type-column.png +:align: center +:alt: Type column options or new part under Parts tab. +``` + +Choosing {guilabel}`Add` adds this part to the {{ RO }}. Adding parts lists components for use in the +repair. If the components are used, the user completing the repair can record they were used. If +they were not used, the user can indicate that, too, and the components can be saved for another +use. + +Choosing {guilabel}`Remove` removes this part from the {{ RO }}. Removing parts lists components that +should be removed from the product being repaired during the repair process. If the parts are +removed, the user completing the repair can indicate they were removed. + +Choosing {guilabel}`Recycle` recycles this part from the {{ RO }}, designating it for later use or to be +repurposed for another use in the warehouse. + +In the {guilabel}`Product` column, select which product (part) should be added, removed, or +recycled. In the {guilabel}`Demand` column, change the quantity, if necessary, to indicate what +quantity of this part should be used in the repair process. + +In the {guilabel}`Done` column, change the value (in a `0.00` format) once the part has been +successfully added, removed, or recycled. + +In the {guilabel}`Unit of Measure` column, select the {{ UoM }} for the part. + +Finally, in the {guilabel}`Used` column, tick the checkbox once the part has been used in the repair +process. + +To add additional columns to the line, click the {guilabel}`(optional columns drop-down)` icon, at +the far-right of the header row. Select the desired options to add to the line. + +```{image} repair_orders/repair-orders-additional-options.png +:align: center +:alt: Optional additional options to add to new part line. +``` + +### Repair Notes and Miscellaneous tabs + +Click the {guilabel}`Repair Notes` tab to add internal notes about this specific {{ RO }}, and anything +the user performing the repair might need to know. + +Click the blank text field to begin writing notes. + +Click the {guilabel}`Miscellaneous` tab to see the {guilabel}`Operation Type` for this repair. By +default, this is set to {guilabel}`YourCompany: Repairs`, indicating this is a repair type +operation. + +Once all desired configurations have been made on the {{ RO }} form, click {guilabel}`Confirm Repair`. +This moves the {{ RO }} to the {guilabel}`Confirmed` stage, and reserves the necessary components needed +for the repair. + +A new {guilabel}`Forecasted` column appears on the product lines under the {guilabel}`Parts` tab, +displaying the availability of all components needed for the repair. + +Once ready, click {guilabel}`Start Repair`. This moves the {{ RO }} to the {guilabel}`Under Repair` +stage (in the upper-right corner). If the {{ RO }} should be cancelled, click {guilabel}`Cancel Repair`. + +Once all products have been successfully repaired, the {{ RO }} is completed. To register this in the +database, click {guilabel}`End Repair`. + +:::{note} +If all parts added to the {{ RO }} were not used, clicking {guilabel}`End Repair` causes an +{guilabel}`Uncomplete Move(s)` pop-up window to appear. + +```{image} repair_orders/repair-orders-uncomplete-moves.png +:align: center +:alt: Uncomplete Moves pop-up window for unused parts. +``` + +The pop-up window informs the user that there is a difference between the initial demand and the +actual quantity used for the order. + +If the {guilabel}`Used` quantity should be changed, click {guilabel}`Discard` or close the pop-up +window. If the order should be confirmed, click {guilabel}`Validate`. +::: + +This moves the {{ RO }} to the {guilabel}`Repaired` stage. A {guilabel}`Product Moves` smart button also +appears above the form. + +Click the {guilabel}`Product Moves` smart button to view the product's moves history during and +after the repair process. + +```{image} repair_orders/repair-orders-product-moves.png +:align: center +:alt: Moves history of product included in the repair order. +``` + +(repairs-repair-orders-return-customer)= + +### Return product to customer + +#### Product is under warranty + +Once the product has been successfully repaired, it can be returned to the customer. + +#### Product is not under warranty + +If the product is not under warranty, or should the customer bear the repair costs, click +{guilabel}`Create Quotation`. This opens a new {{ SO }} form, pre-populated with the parts used in the +{{ RO }}, with the total cost of the repair calculated. + +```{image} repair_orders/repair-orders-new-quotation.png +:align: center +:alt: Pre-populated new quotation for parts included in repair order. +``` + +If this {{ SO }} should be sent to the customer, click {guilabel}`Confirm`, and proceed to invoice the +customer for the repair. + +:::{tip} +If the customer should be charged for a repair service, a service type product can be created and +added to the {{ SO }} for a repaired product. +::: + +To return the product to the customer, navigate to the {menuselection}`Sales app`, and select the +original {{ SO }} from which the initial return was processed. Then, click the {guilabel}`Delivery` +smart button. + +From the resulting list of operations, click the reverse transfer, indicated by the +{guilabel}`Source Document`, which should read `Return of WH/OUT/XXXXX`. + +This opens the return form. At the top of this form, a {guilabel}`Repair Orders` smart button now +appears, linking this return to the completed {{ RO }}. + +Click {guilabel}`Return` at the top of the form. This opens a {guilabel}`Reverse Transfer` pop-up +window. + +```{image} repair_orders/repair-orders-reverse-transfer.png +:align: center +:alt: Reverse transfer pop-up window on delivery order form. +``` + +This pop-up lists the {guilabel}`Product` included in the order, the {guilabel}`Quantity` delivered +to the customer, and the {guilabel}`Unit of Measure` the product was in. + +Click the value in the {guilabel}`Quantity` field to change the quantity of the product to be +returned, if necessary. + +Click the {guilabel}`🗑️ (trash)` icon at the far-right of the product line to remove it from the +return, if necessary. + +Once ready, click {guilabel}`Return` to confirm the return. This creates a new delivery for the +returned products. + +When the delivery has been processed and the product has been returned to the customer, click +{guilabel}`Validate` to validate the delivery. + +:::{seealso} +{doc}`../../sales/sales/products_prices/returns` +::: + diff --git a/content/applications/marketing.md b/content/applications/marketing.md new file mode 100644 index 000000000..3067f62ae --- /dev/null +++ b/content/applications/marketing.md @@ -0,0 +1,15 @@ +--- +nosearch: true +--- + +# Marketing + +```{toctree} +marketing/email_marketing +marketing/marketing_automation +marketing/sms_marketing +marketing/events +marketing/surveys +marketing/social_marketing +``` + diff --git a/content/applications/marketing/email_marketing.md b/content/applications/marketing/email_marketing.md new file mode 100644 index 000000000..e095d5d92 --- /dev/null +++ b/content/applications/marketing/email_marketing.md @@ -0,0 +1,866 @@ +--- +show-content: true +--- + +# Email Marketing + +The Odoo *Email Marketing* app provides drag-and-drop design tools, pre-built templates, and other +interactive features to create engaging email campaigns. The *Email Marketing* app also provides +detailed reporting metrics to track the campaigns' overall effectiveness. + +:::{seealso} +[Odoo Tutorial: Email Marketing](https://www.odoo.com/slides/slide/email-marketing-essentials-989?fullscreen=1) +::: + +```{eval-rst} +.. cards:: + + .. card:: Mailing lists + :target: email_marketing/mailing_lists + + Silo contacts into specific mailing lists. + + .. card:: Manage unsubscriptions (Blacklist) + :target: email_marketing/unsubscriptions + + Allow recipients to unsubscribe and blacklist from future mailings. + + .. card:: Lost leads reactivation email + :target: email_marketing/lost_leads_email + + Target lost leads with Email Marketing. + + .. card:: Analyze Metrics + :target: email_marketing/analyze_metrics + + Analyzing campaign metrics. +``` + +## Email marketing dashboard + +After installing the application, click the {menuselection}`Email Marketing` app icon from the main +Odoo dashboard. Doing so reveals the main {guilabel}`Mailings` dashboard in the default list view. + +```{image} email_marketing/mailings-dashboard.png +:align: center +:alt: View of the main dashboard of the Odoo Email Marketing application. +``` + +In the search bar, the default filter of {guilabel}`My Mailings` is present to show all the mailings +related to the current user. To remove that filter, click the {guilabel}`✖️ (remove)` icon next to +the filter in the search bar. Doing so reveals all the mailings in the database. + +The information on the {guilabel}`Mailings` dashboard has four different view options, located in +the upper-right corner as individual icons. + +The view options, from left-to-right, are: + +- {ref}`List ` (default view) +- {ref}`Kanban ` +- {ref}`Calendar ` +- {ref}`Graph ` + +(email-marketing-list-view)= + +### List view + +The list view, represented by the {guilabel}`☰ (horizontal lines)` icon in the upper-right corner, +is the default view of the {guilabel}`Mailings` dashboard in the {guilabel}`Email Marketing` app. + +While in list view, there are columns dedicated to different aspects of information related to the +listed emails. Those columns are as follows: + +- {guilabel}`Date`: the date the email was sent. +- {guilabel}`Subject`: the subject of the email. +- {guilabel}`Responsible`: the user who created the email, or the user who has been assigned to the + email. +- {guilabel}`Sent`: how many times the email has been sent. +- {guilabel}`Delivered (%)`: percentage of sent emails that have been successfully delivered. +- {guilabel}`Opened (%)`: percentage of sent emails that have been opened by the recipients. +- {guilabel}`Clicked (%)`: percentage of sent emails that have been clicked by the recipients. +- {guilabel}`Replied (%)`: percentage of sent emails that have been replied to by the recipients. +- {guilabel}`Status`: the status of the email ({guilabel}`Draft`, {guilabel}`In Queue`, or + {guilabel}`Sent`). + +To add or remove columns, click the {guilabel}`Additional Options (two horizontal lines with dots)` +icon, located to the far-right of the column titles in list view. Doing so reveals a drop-down menu +of additional column options. + +(email-marketing-kanban-view)= + +### Kanban view + +The Kanban view, represented by the {guilabel}`(inverted bar graph)` icon, can be accessed in the +upper-right corner of the {guilabel}`Mailings` dashboard in the {guilabel}`Email Marketing` app. + +```{image} email_marketing/kanban-view.png +:align: center +:alt: Kanban view of the main dashboard of the Odoo Email Marketing application. +``` + +While in Kanban view, the email information is displayed in the various stages. + +The stages are: {guilabel}`Draft`, {guilabel}`In Queue`, {guilabel}`Sending`, and {guilabel}`Sent`. + +- {guilabel}`Draft`: the email is still being written/created. +- {guilabel}`In Queue`: the email is scheduled to be sent at a later date. +- {guilabel}`Sending`: the email is currently being sent to its recipients. +- {guilabel}`Sent`: the email has already been sent to its recipients. + +In each stage, there are drag-and-drop cards representing the emails that have been created/sent, +and the stage they are in represents the current status of that mailing. + +Each card on the {guilabel}`Mailings` dashboard provides key information related to that specific +email. + +When the cursor hovers over the upper-right corner of an email campaign card, a {guilabel}`⋮ (three +vertical dots)` icon appears. When clicked, a mini drop-down menu reveals the option to color-code +the email, {guilabel}`Delete` the email, or {guilabel}`Archive` the message for potential future +use. + +```{image} email_marketing/three-dot-dropdown.png +:align: center +:alt: View of the three-dot drop-down menu on the Odoo Email Marketing dashboard. +``` + +(email-marketing-calendar-view)= + +### Calendar view + +The calendar view, represented by a {guilabel}`📆 (calendar)` icon, can be accessed in the +upper-right corner of the {guilabel}`Mailings` dashboard in the {guilabel}`Email Marketing` app. + +While in calendar view, a monthly calendar (by default), shows when the mailings have been sent or +are scheduled to be sent. + +```{image} email_marketing/calendar-view.png +:align: center +:alt: Calendar view of the mailings dashboard in the Email Marketing application. +``` + +The current date is represented by a {guilabel}`🔴 (red circle)` icon over the date on the calendar. + +To the right of the calendar, the options to filter the results by {guilabel}`Responsible` and/or +{guilabel}`Status` are available, via checkboxes. + +:::{tip} +To hide the right sidebar, click the {guilabel}`(panel-right)` icon, located above the sidebar. +::: + +In the top-left corner, above the calendar, the option to change the time period being displayed is +available via a drop-down menu, which shows {guilabel}`Month`, by default. When clicked, the +drop-down menu that appears reveals the options: {guilabel}`Day`, {guilabel}`Week`, +{guilabel}`Month` (default), {guilabel}`Year`, and {guilabel}`Show weekends` (selected by default). + +Clicking any of those options changes the calendar display to reflect that desired amount of time. + +Clicking either {guilabel}`⬅️ (left arrow)` icon or {guilabel}`➡️ (right arrow)` icon changes the +calendar to a previous or future time, depending on what is clicked, based on the chosen amount of +time being represented. + +To jump back to the current date, click the {guilabel}`Today` button. + +(email-marketing-graph-view)= + +### Graph view + +The graph view, represented by a {guilabel}`(line graph)` icon, can be accessed in the upper-right +corner of the {guilabel}`Mailings` dashboard in the {guilabel}`Email Marketing` app. + +While in graph view, the status of the emails on the {guilabel}`Mailings` page is represented in a +bar graph, but other graph view options can be implemented, if needed. + +```{image} email_marketing/graph-view.png +:align: center +:alt: How the Graph view appears in the Odoo Email Marketing application. +``` + +In the upper-left corner, above the graph, there is a {guilabel}`Measures` drop-down menu. When +clicked, different filter options become available to further customize the graph views. + +Those {guilabel}`Measures` options are: {guilabel}`A/B Testing percentage` and {guilabel}`Count` +(default). + +To the right of the {guilabel}`Measures` drop-down menu is an {guilabel}`Insert in Spreadsheet` +button, if the *Documents* application is installed. When clicked, a pop-up window appears, in which +the ability to add the graph to a spreadsheet or dashboard becomes available. + +Beside the {guilabel}`Measures` drop-down menu and {guilabel}`Insert in Spreadsheet` button are +different graph view options. From left-to-right, those graph view options are: {guilabel}`(bar +chart)` (default), {guilabel}`(line chart)`, and {guilabel}`(pie chart)`. + +:::{note} +Each graph view option provides its own series of additional view options, which appear to the +right of the selected graph view option. +::: + +### Search options + +Regardless of the view chosen for the {guilabel}`Mailings` dashboard in the {guilabel}`Email +Marketing` app, the {guilabel}`Filters`, {guilabel}`Group by`, and {guilabel}`Favorites` options are +always available to further customize the information being displayed. + +To access those options, click the {guilabel}`(downward arrow)` icon, located to the right of the +search bar. Doing so reveals a drop-down mega menu featuring those filtering and grouping options. + +```{image} email_marketing/search-mega-menu.png +:align: center +:alt: The drop-down mega menu of search options the Odoo Email Marketing application. +``` + +These options provide various ways to specify and organize the information seen on the +{guilabel}`Mailings` dashboard. + +```{eval-rst} +.. tabs:: + + .. tab:: Filters + + This section of the drop-down mega menu provides different ways to filter email results being + shown on the :guilabel:`Mailings` dashboard in the :guilabel:`Email Marketing` app. + + .. image:: email_marketing/filters-dropdown.png + :align: center + :alt: View of filters drop-down menu options on the Odoo Email Marketing dashboard. + + The options are: :guilabel:`My Mailings`, :guilabel:`Sent Date`, :guilabel:`A/B Tests`, + :guilabel:`A/B Tests to review`, :guilabel:`Archived`, and :guilabel:`Add Custom Filter`. + + If :guilabel:`Add Custom Filter` is selected, Odoo reveals a pop-up window, with three + customizable fields to fill in, in order to create custom filter rules for Odoo to use to + retrieve results that fit more specific criteria. + + .. image:: email_marketing/add-custom-filter-popup.png + :align: center + :alt: Add custom filter pop-up window that appears in Odoo Email Marketing app. + + .. tab:: Group By + + This section of the drop-down mega menu provides different ways to group email results being + shown on the :guilabel:`Mailings` dashboard in the :guilabel:`Email Marketing` app. + + .. image:: email_marketing/group-by-dropdown.png + :align: center + :alt: View of the Group By drop-down menu on the Odoo Email Marketing application. + + Using this section, the data can be grouped by the messages' :guilabel:`Status`, or who it was + :guilabel:`Sent By`. + + There is also the option to group the data by :guilabel:`Sent Period`, which has its own + sub-menu of options to choose from. The :guilabel:`Sent Period` options are :guilabel:`Year`, + :guilabel:`Quarter`, :guilabel:`Month`, :guilabel:`Week`, and :guilabel:`Day`. + + If none of the above :guilabel:`Group By` options deliver the desired results, click + :guilabel:`Add Custom Group` at the bottom of the :guilabel:`Group By` section. Doing so + reveals a drop-down menu, wherein custom criteria can be selected and applied, thus delivering + any grouping of data that may be desired. + + .. tab:: Favorites + + This section provides the opportunity to save custom filters and/or groupings for future use. + To utilize this section, click the :guilabel:`Save current search` field, which reveals + additional fields. + + .. image:: email_marketing/favorites-dropdown.png + :align: center + :alt: View of the Favorites drop-down menu on the Odoo Email Marketing application. + + Give the favorited filter/grouping a title on the blank line above the checkboxes for + :guilabel:`Default filter` and :guilabel:`Shared`. + + Ticking the box for :guilabel:`Default filter` makes this favorited filter/grouping the + default option. Ticking the box for :guilabel:`Shared` allows other users to see and use this + favorited filter/grouping. + + When all desired options are configured, click :guilabel:`Save` to save the filter/grouping in + the :guilabel:`Favorites` section of the mega drop-down menu. +``` + +## Settings + +To view and modify the *Email Marketing* settings, navigate to {menuselection}`Email Marketing app +--> Configuration --> Settings`. + +```{image} email_marketing/configuration-settings.png +:align: center +:alt: View of the Configuration menu with Settings page in the Odoo Email Marketing +: application. +``` + +On the {guilabel}`Settings` page, there are four features available. + +```{image} email_marketing/settings.png +:align: center +:alt: View of the Settings page in the Odoo Email Marketing application. +``` + +The features are: + +- {guilabel}`Mailing Campaigns`: enables the option to manage mass mailing campaigns. +- {guilabel}`Blacklist Option when Unsubscribing`: allows recipients to blacklist themselves from + future mailings during the unsubscribing process. +- {guilabel}`Dedicated Server`: provides the option to utilize a separate, dedicated server for + mailings. When enabled, Odoo reveals a new field (and link), in which the specific server + configurations must be entered, in order for it to connect properly to Odoo. +- {guilabel}`24H Stat Mailing Reports`: allows users to check how well mailings have performed a day + after it has been sent. + +(email-marketing-create-email)= + +## Create an email + +To create an email, open the {menuselection}`Email Marketing` application, and click the +{guilabel}`New` button in the upper-left corner of the {guilabel}`Mailings` dashboard page. + +Clicking {guilabel}`New` reveals a blank email form. + +```{image} email_marketing/blank-email-detail-form.png +:align: center +:alt: View of a blank email detail form in Odoo Email Marketing application. +``` + +On the email form, there are fields for the {ref}`Subject ` and +{ref}`Recipients ` of the email. + +Beneath that, there are three tabs: {ref}`Mail Body `, {ref}`A/B Tests +`, and {ref}`Settings `. + +(email-marketing-subject)= + +### Subject + +First, enter a {guilabel}`Subject` to the email. The {guilabel}`Subject` is visible in the +recipients' inbox, allowing them to quickly see what the message is about. + +:::{note} +The {guilabel}`Subject` field is mandatory. An email can **not** be sent without a +{guilabel}`Subject`. +::: + +The {guilabel}`(smiley face with a plus sign)` icon at the end of the {guilabel}`Subject` field +represents emojis that can be added to the {guilabel}`Subject` field. Clicking that icon reveals a +pop-up menu of emojis that can be used. + +Beside the {guilabel}`(smiley face with a plus sign)` icon at the end of the {guilabel}`Subject` +field is an empty {guilabel}`(star)` icon. When clicked, the {guilabel}`(star)` icon turns gold, and +the email is saved as a template in the {guilabel}`Mail Body` tab, which can be used again in the +future. + +(email-marketing-recipients)= + +### Recipients + +Beneath the {guilabel}`Subject` field on the email form is the {guilabel}`Recipients` field. In this +field, select the recipients of the email. By default, the {guilabel}`Mailing List` option is +selected, but clicking the field reveals a drop-down menu of other recipient options. + +With the default {guilabel}`Mailing List` option selected, a specific mailing list **must** be +chosen from the adjacent {guilabel}`Select mailing lists` field drop-down menu. + +:::{tip} +More than one mailing list can be chosen from the {guilabel}`Select mailing lists` field. +::: + +Odoo then sends the email to contacts on that specific mailing list(s). + +:::{seealso} +{doc}`email_marketing/mailing_lists` +::: + +When the {guilabel}`Recipients` field is clicked, a drop-down menu of other options is revealed. +Each option provides different ways Odoo can create a target audience for the email. + +```{image} email_marketing/recipients-dropdown.png +:align: center +:alt: View of recipients drop-down menu in the Odoo Email Marketing application. +``` + +Those options (excluding the default {guilabel}`Mailing List`) provide the option to create a more +specified recipient filter, in an equation-like format, which appears beneath the +{guilabel}`Recipients` field. + +The {guilabel}`Recipients` field options, other than the default {guilabel}`Mailing List` option, +are as follows: + +- {guilabel}`Contact`: ties specifically to the *Contacts* app, and includes all the contacts + entered in the database. +- {guilabel}`Event Registration`: ties specifically to the *Events* app, and provides opportunities + to interact with event registrants, in order to communicate important information about the + event(s), or nurture other valuable actions, such as post-event surveys, purchases, etc. +- {guilabel}`Lead/Opportunity`: ties specifically to records in the *CRM* application, which opens + up a number of opportunities to influence sales or purchase decisions. +- {guilabel}`Mailing Contact`: ties specifically to the *Email Marketing* app, and focuses on + specific mailing contacts that have been entered in that specific application, and are related to + a specific mailing list. These contacts are also unique because they do *not* have their own + contact card in the *Contacts* application. This list can be accessed by navigating to + {menuselection}`Email Marketing app --> Mailing Lists --> Mailing List Contacts`. +- {guilabel}`Sales Order`: ties specifically to the *Sales* app, and focuses on a specific sales + orders in the database. + +#### Add recipient filter + +To add a more specific recipient filter to any {guilabel}`Recipient` option, select any recipient +option (other than {guilabel}`Mailing List`), and click the {guilabel}`Modify filter (right-facing +arrow)` icon beneath the {guilabel}`Recipient` field to reveal three subsequent filter rule fields, +formatted like an equation. + +It is highly recommended that users implement detailed targeting criteria for the +{guilabel}`Recipients` field. Typically, a single line of targeting logic is not sufficient enough +for an email campaign. + +While the {guilabel}`Mailing List` option is adequate for the {guilabel}`Recipients` field, the +{guilabel}`Lead/Opportunity` and {guilabel}`Event Registration` options provide far more detailed +targeting criteria, which can be added on top of those seed sources. + +```{eval-rst} +.. example:: + For example, with the :guilabel:`Lead/Opportunity` option chosen in the :guilabel:`Recipients` + field, users can add various custom criteria related to :guilabel:`Created on` dates, + :guilabel:`Stages`, :guilabel:`Tags`, :guilabel:`Lost Reasons`, :guilabel:`Sales Teams`, + :guilabel:`Active` statuses, :guilabel:`Country`, and so much more. + + .. image:: email_marketing/detailed-filter-records.png + :align: center + :alt: View of how recipient filters can be customized in Odoo Email Marketing. +``` + +To reveal the sub-menu options within the filter rule fields, click each field, and make the desired +selections, until the preferred configuration has been achieved. + +The number of {guilabel}`records` in the database that match the configured rule(s) are indicated +beneath the configured filter rule(s), in green. + +```{image} email_marketing/filter-records.png +:align: center +:alt: View of how recipient filters can be customized in Odoo Email Marketing. +``` + +:::{note} +Some sub-menu options in the first rule field allow for a second choice to provide even more +specificity. +::: + +To the right of each rule, there are three additional options, represented by {guilabel}`➕ (plus +sign)`, {guilabel}`(sitemap)`, and {guilabel}`🗑️ (trash)` icons. + +- The {guilabel}`➕ (plus sign)` icon adds a new node (line) to the overall targeting logic. +- The {guilabel}`(sitemap)` icon adds a branch to the node. A branch contains two additional, + indented sub-nodes that are related to that specific rule, providing even more specificity to the + parent line above it. +- The {guilabel}`🗑️ (trash)` icon deletes a specific node (line) in the array of logic. + +(email-marketing-mail-body)= + +### Mail Body tab + +In the {guilabel}`Mail Body` tab, there are a number of pre-configured message templates to choose +from. + +```{image} email_marketing/mail-body-templates.png +:align: center +:alt: View of the templates in the Mail Body tab in Odoo Email Marketing application. +``` + +Select the desired template, and proceed to modify every element of its design details with Odoo's +drag-and-drop building blocks, which appear on the right sidebar when a template is chosen. + +```{image} email_marketing/template-building-blocks.png +:align: center +:alt: View of the building blocks in the Mail Body tab in Odoo Email Marketing application. +``` + +The features on the sidebar used to create and customize emails are separated into three sections: +{guilabel}`Blocks`, {guilabel}`Customize`, and {guilabel}`Design`. + +Each building block provides unique features and professional design elements. To use a building +block, drag-and-drop the desired block element onto the body of the email being built. Once dropped, +various aspects of the building block can be customized. + +:::{tip} +To build an email from the ground up, without any building block elements, select the +{guilabel}`Plain Text` template. When selected, Odoo provides a completely blank email canvas, +which can be customized in a number of way using the front-end rich text editor that accepts +forward slash `/` commands. + +When `/` is typed into the blank body of the email, while using a {guilabel}`Plain Text` +template, a drop-down menu of various design elements appears, which can be used to create the +desired email design. + +```{image} email_marketing/template-blank-slash.png +:align: center +:alt: View of the rich text editor drop-down in the Odoo Email Marketing application. +``` +::: + +(email-marketing-ab-tests)= + +### A/B Tests tab + +Initially, when the {guilabel}`A/B Tests` tab is opened on an email form, the only option available +is {guilabel}`Allow A/B Testing`. This is **not** a required option. + +If this option is enabled, recipients are only mailed *once* for the entirety of the campaign. + +This allows the user to send different versions of the same mailing to randomly selected recipients +to gauge the effectiveness of various designs, formats, layouts, content, and so on -- without any +duplicate messages being sent. + +When the checkbox beside {guilabel}`Allow A/B Testing` is ticked, an {guilabel}`on (%)` field +appears, in which the user determines the percentage of the pre-configured recipients that are going +to be sent this current version of the mailing as part of the test. + +:::{note} +The default figure in the {guilabel}`on (%)` field is `10`, but that figure can be changed at any +time. +::: + +Beneath that, two additional fields appear: + +The {guilabel}`Winner Selection` field provides a drop-down menu of options, wherein the user +decides what criteria should be used to determine the "winning" version of the email tests that are +sent. + +The options in the {guilabel}`Winner Selection` field are as follows: + +- {guilabel}`Manual`: allows the user to determine the "winning" version of the mailing. This option + removes the {guilabel}`Send Final On` field. +- {guilabel}`Highest Open Rate` (default): the mailing with the highest open rate is determined to + be the "winning" version. +- {guilabel}`Highest Click Rate`: the mailing with the highest click rate is determined to be the + "winning" version. +- {guilabel}`Highest Reply Rate`: the mailing with the highest reply rate is determined to be the + "winning" version. +- {guilabel}`Leads`: the mailing with the most leads generated is determined to be the "winning" + version. +- {guilabel}`Quotations`: the mailing with the most quotations generated is determined to be the + "winning" version. +- {guilabel}`Revenues`: the mailing with the most revenue generated is determined to be the + "winning" version. + +The {guilabel}`Send Final On` field allows users to choose a date that is used to know *when* Odoo +should determine the "winning" email, and subsequently, send that version of the email to the +remaining recipients. + +```{image} email_marketing/ab-test-tab.png +:align: center +:alt: View of the A/B Tests tab in Odoo Email Marketing application. +``` + +To the right of those fields is a {guilabel}`Create an Alternative Version` button. When clicked, +Odoo presents a new {guilabel}`Mail Body` tab for the user to create an alternate version of the +email to test. + +(email-marketing-settings-tab)= + +### Settings tab + +The options present in the {guilabel}`Settings` tab of the mail form are divided into two sections: +{guilabel}`Email Content` and {guilabel}`Tracking`. + +:::{note} +The options available in the {guilabel}`Settings` tab vary depending on if the *Mailing +Campaigns* feature is activated in {menuselection}`Email Marketing --> Configuration --> +Settings`. See {ref}`email_marketing/mailing-campaigns` for more information. +::: + +Without the *Mailing Campaigns* feature activated, the {guilabel}`Settings` tab on the email form +only contains the {guilabel}`Preview Text`, {guilabel}`Send From`, {guilabel}`Reply To`, +{guilabel}`Attachments`, and {guilabel}`Responsible` fields. + +```{image} email_marketing/settings-without-features.png +:align: center +:alt: View of settings tab in Odoo Email Marketing app, without campaign setting activated. +``` + +#### Email content + +- {guilabel}`Preview Text`: allows the user to enter a preview sentence to encourage recipients to + open the email. In most inboxes, this is displayed next to the subject. If left empty, the first + characters of the email content appear, instead. The ability to add an emoji in this field is + available, as well, via the {guilabel}`(smiley face with a plus sign)` icon. +- {guilabel}`Send From`: designate an email alias that displays as the sender of this particular + email. +- {guilabel}`Reply To`: designate an email alias to whom all the replies of this particular email + are sent. +- {guilabel}`Attach a file`: if any specific files are required (or helpful) for this email, click + the {guilabel}`Attachments` button, and upload the desired file(s) to the email. + +#### Tracking + +- {guilabel}`Responsible`: designate a user in the database to be responsible for this particular + email. + +:::{note} +If the *Mailing Campaign* feature *is* activated, an additional {guilabel}`Campaign` field +appears in the {guilabel}`Tracking` section of the {guilabel}`Settings` tab. + +```{image} email_marketing/settings-tab-with-campaign.png +:align: center +:alt: View of settings tab in Odoo Email Marketing when campaign setting is activated. +``` + +The additional {guilabel}`Campaign` field allows users to attach this particular email to a +mailing campaign, if desired. + +If the desired campaign is not available in the initial drop-down menu, select {guilabel}`Search +More` to reveal a complete list of all mailing campaigns in the database. + +Or, type the name of the desired mailing campaign in the {guilabel}`Campaign` field, until Odoo +reveals the desired campaign in the drop-down menu. Then, select the desired campaign. +::: + +## Send, schedule, test + +Once the mailing is finalized, the following options can be utilized, via buttons located in the +upper-left corner of the email form: {ref}`Send `, {ref}`Schedule +`, and {ref}`Test `. + +(email-marketing-send)= + +### Send + +The {guilabel}`Send` button reveals a {guilabel}`Ready to unleash emails?` pop-up window. + +```{image} email_marketing/send-popup.png +:align: center +:alt: View of pop-up window that appears when the send button on an email form is clicked. +``` + +When the {guilabel}`Send to all` button is clicked, Odoo sends the email to the desired recipients. +Once Odoo has sent the mailing, the status changes to {guilabel}`Sent`. + +(email-marketing-schedule)= + +### Schedule + +The {guilabel}`Schedule` button reveals a {guilabel}`When do you want to send your mailing?` pop-up +window. + +```{image} email_marketing/schedule-popup.png +:align: center +:alt: View of pop-up window that appears when the schedule button on an email form +: is clicked. +``` + +In this pop-up window, click the {guilabel}`Send on` field to reveal a calendar pop-up window. + +```{image} email_marketing/schedule-popup-calendar.png +:align: center +:alt: View of pop-up window that appears when the schedule button on an email form +: is clicked. +``` + +From the calendar pop-up window, select the future date and time for Odoo to send this email. Then, +click {guilabel}`✔️ Apply`. When a date and time are chosen, click the {guilabel}`Schedule` button, +and the status of the mailing changes to {guilabel}`In Queue`. + +(email-marketing-test)= + +### Test + +The {guilabel}`Test` button reveals a {guilabel}`Test Mailing` pop-up window. + +```{image} email_marketing/test-popup.png +:align: center +:alt: View of pop-up window that appears when the test button on an email form is clicked. +``` + +From this pop-up window, enter the email addresses of the contacts to whom Odoo should send this +test email in the {guilabel}`Recipients` field. Multiple contacts can be added in this field, if +desired. + +Once all the desired email addresses have been entered in the {guilabel}`Recipients` field, click +the {guilabel}`Send Test` button. + +:::{warning} +By default, there's a daily limit applied for **all emails** sent throughout **all +applications**. So, if there are remaining emails to be sent after a limit has been reached, +those mailings are **not** sent automatically the next day. The sending needs to be forced, by +opening the email and clicking {guilabel}`Retry`. +::: + +(email-marketing-mailing-campaigns)= + +## Mailing campaigns + +The *Email Marketing* application provides users with the ability to build mailing campaigns. + +In order to create and customize mailing campaigns, the *Mailing Campaigns* feature **must** be +activated in the *Settings* page of the *Email Marketing* application. To do that, navigate to +{menuselection}`Email Marketing app --> Configuration --> Settings`, tick the box beside +{guilabel}`Mailing Campaigns`, and click the {guilabel}`Save` button. + +```{image} email_marketing/campaigns-feature.png +:align: center +:alt: View of the campaign feature setting in Odoo Email Marketing. +``` + +Once the {guilabel}`Mailing Campaigns` feature is activated, a new {guilabel}`Campaigns` menu option +appears in the header. + +When that is clicked, Odoo reveals a separate {guilabel}`Campaigns` page, displaying all the mailing +campaigns in the database, and the current stage they are in, showcased in a default Kanban view. + +```{image} email_marketing/campaigns-page.png +:align: center +:alt: View of the campaign page in Odoo Email Marketing. +``` + +:::{note} +This information can also be viewed in a list, by clicking the {guilabel}`☰ (horizontal lines)` +icon in the upper-right corner. +::: + +Clicking any campaign from the {guilabel}`Campaigns` page reveals that campaign's form. + +There are two different ways to create and customize campaigns in the *Email Marketing* application, +either directly from the {ref}`Campaigns page ` or through the +{ref}`Settings tab ` on an email form. + +(email-marketing-campaign-page)= + +### Create mailing campaign (from campaigns page) + +When the *Mailing Campaigns* feature is activated, a new *Campaigns* option appears in the header of +the *Email Marketing* application. Campaigns can be created directly on the *Campaigns* page in the +*Email Marketing* app. + +To do that, navigate to {menuselection}`Email Marketing app --> Campaigns --> New`. + +#### Kanban view + +When the {guilabel}`New` button is clicked in the default Kanban view on the {guilabel}`Campaigns` +page, a Kanban card appears in the {guilabel}`New` stage. + +```{image} email_marketing/campaigns-kanban-popup.png +:align: center +:alt: View of the campaign pop-up kanban in Odoo Email Marketing. +``` + +New campaign cards can also be made by clicking the {guilabel}`➕ (plus sign)` at the top of any +Kanban stage on the {guilabel}`Campaigns` page. + +When the new campaign Kanban card appears, the options to enter a {guilabel}`Campaign Name`, a +{guilabel}`Responsible`, and {guilabel}`Tags` become readily available. + +To add the campaign to the Kanban stage, click the {guilabel}`Add` button. + +To delete the campaign, click the {guilabel}`🗑️ (trash can)` icon. + +To further customize the campaign, click the {guilabel}`Edit` button, which reveals the campaign +form for additional modifications. + +:::{note} +A {guilabel}`Campaign Name` **must** be entered in the Kanban card, in order for the +{guilabel}`Edit` button to reveal the campaign form for further modifications. +::: + +#### List view + +To enter the list view on the {guilabel}`Campaigns` page, click the {guilabel}`☰ (horizontal lines)` +icon in the upper-right corner. Doing so reveals all campaign information in a list format. + +```{image} email_marketing/campaign-page-list-view.png +:align: center +:alt: View of the campaign page in list view in Odoo Email Marketing. +``` + +To create a campaign from the {guilabel}`Campaigns` page while in list view, click the +{guilabel}`New` button. Doing so reveals a blank campaign form. + +```{image} email_marketing/blank-campaign-form.png +:align: center +:alt: View of the blank campaign form in Odoo Email Marketing. +``` + +From this campaign form, a {guilabel}`Campaign Name`, a {guilabel}`Responsible`, and +{guilabel}`Tags` can be added. + +At the top of the form, various metric-related smart buttons can be seen that showcase specific +analytics related to the campaign. Those smart buttons are: {guilabel}`Revenues`, +{guilabel}`Quotations`, {guilabel}`Opportunities`, and {guilabel}`Clicks`. + +:::{note} +Once a {guilabel}`Campaign Name` is entered and saved, additional buttons appear at the top of +the campaign form. + +Those additional buttons are: {guilabel}`Send Mailing` and {guilabel}`Send SMS`. +::: + +### Campaign form + +On the campaign form (after clicking {guilabel}`Edit` from the Kanban card, or selecting an existing +campaign from the {guilabel}`Campaigns` page) there are additional options and metrics available. + +```{image} email_marketing/campaign-form.png +:align: center +:alt: View of the campaign form in Odoo Email Marketing. +``` + +At the top of the form, various smart buttons can be seen that showcase specific analytics related +to the campaign. Those smart buttons are: {guilabel}`Revenues`, {guilabel}`Quotations`, +{guilabel}`Opportunities`, and {guilabel}`Clicks`. + +There are also buttons to {guilabel}`Send Mailing`, {guilabel}`Send SMS`, {guilabel}`Add Post`, and +{guilabel}`Add Push` (push notification). + +:::{note} +If the {guilabel}`Send Mailing` and {guilabel}`Send SMS` buttons are not readily available, enter +a {guilabel}`Campaign Name`, then save (either manually or automatically). Doing so reveals those +buttons. +::: + +The status of the campaign can be viewed in the upper-right corner of the campaign form, as well. + +(email-marketing-campaign-settings)= + +### Create mailing campaign (from settings tab) + +To create a new campaign from the {guilabel}`Settings` tab of a mailing form, click the +{guilabel}`Campaign` field, and start typing the name of the new campaign. Then, select either +{guilabel}`Create "[Campaign Name]"` or {guilabel}`Create and edit...` from the drop-down menu that +appears. + +```{image} email_marketing/mailing-campaign-settings.png +:align: center +:alt: View of the mailing campaign creation in the Settings tab of an email form. +``` + +Select {guilabel}`Create` to add this new mailing campaign to the database, and modify its settings +in the future. + +Select {guilabel}`Create and Edit...` to add this new mailing campaign to the database, and reveal a +{guilabel}`Create Campaign` pop-up window. + +```{image} email_marketing/mailing-campaign-popup.png +:align: center +:alt: View of the email mailing campaign pop-up window in Odoo Email Marketing application. +``` + +Here, the new mailing campaign can be further customized. Users can adjust the {guilabel}`Campaign +Name`, assign a {guilabel}`Responsible`, and add {guilabel}`Tags`. + +Buttons to {guilabel}`Add Post` or {guilabel}`Send Push` (push notifications) are also available. + +There is also a status located in the upper-right corner of the {guilabel}`Create Campaign` pop-up +window. + +When all modifications are ready to be finalized, click {guilabel}`Save & Close`. To delete the +entire campaign, click {guilabel}`Discard`. + +:::{seealso} +- {doc}`email_marketing/mailing_lists` +- {doc}`email_marketing/unsubscriptions` +- {doc}`email_marketing/lost_leads_email` +- {doc}`email_marketing/analyze_metrics` +::: + +```{toctree} +:titlesonly: true + +email_marketing/mailing_lists +email_marketing/unsubscriptions +email_marketing/lost_leads_email +email_marketing/analyze_metrics +``` + diff --git a/content/applications/marketing/email_marketing/analyze_metrics.md b/content/applications/marketing/email_marketing/analyze_metrics.md new file mode 100644 index 000000000..37b3dcf25 --- /dev/null +++ b/content/applications/marketing/email_marketing/analyze_metrics.md @@ -0,0 +1,217 @@ +--- +substitutions: + CTR: '{abbr}`CTR (Click through rate)`' +--- + +# Analyze metrics + +In order to properly understand the success or failure of an email marketing campaign, it is +necessary to monitor several key metrics. The insights gained from these metrics can then be used to +optimize future campaigns. Odoo's **Email Marketing** application tracks several {ref}`key metrics +`, that can be interpreted through {ref}`reports +` to improve future campaigns. + +(email-marketing-view-metrics)= + +## View metrics + +After a mass mail has been sent, the results for that particular mailing are displayed in multiple +locations. + +To access the metrics for an individual mailing, navigate to {menuselection}`Email Marketing app +--> Mailings`. Locate the specific mailing in the list view, and use the column headings to view the +results for that mailing. Click on one of the mailings in the list to open the record. + +At the top of the record, detailed metrics are displayed as smart buttons. + +```{image} analyze_metrics/metric-smart-buttons.png +:align: center +:alt: The smart buttons on a mass mailing, displaying the results of the message. +``` + +### Opened rate + +The percentage of emails opened by recipients, against the total number of sent emails. + +In cases where a reply is expected, such as cold outreach emails, high open rate may indicate the +subject line was timely, compelling, and successfully prompted the recipients to view the message. + +In cases where a reply is not expected, such as promotional emails, it may indicate an issue with +the email, such as incorrect product links or coupon codes. + +In cases where a reply is expected, a low open rate may indicate the subject +line failed to capture the recipients' interest or the message ended up in a spam or junk folder. It +could also indicate the email ended up in a spam or junk folder. + +:::{note} +Emails that consistently land in recipient spam folders could be due to having a poor sender +reputation (i.e. high unsubscribe rate, high percentage of past emails marked as spam, etc.), +or failing to {doc}`configure the proper DNS records +<../../general/email_communication/email_domain>`. +::: + +### Replied rate + +The percentage of recipients who responded to the email, against the total number of sent emails. + +A high replied rate may indicate the email resonated with recipients, prompting them to take +action or provide feedback. + +A low replied rate may suggest the message lacked relevance or did not contain a clear +call-to-action. + +### Clicked rate + +This represents the *Clicked through rate (CTR)*, which measures the +percentage of recipients who clicked on a link within the email, against the total number of sent +emails. + +A high {{ CTR }} may indicate the email content was relevant and appropriately targeted. Recipients +were motivated to click the links provided, and likely found the content engaging. + +A low {{ CTR }} may indicate issues with either the targeting, or the content itself. Recipients may +have been unmotivated by the calls-to-action, if there were any, or the message itself may have +been directed toward the wrong audience. + +### Received rate + +This rate measures the percentage of emails that were **successfully** delivered, against the total +number of sent emails. + +A high received rate can indicate the mailing list used is up-to-date, and the sender authentication +is trusted by email providers. + +A low received rate may indicate issues, either with the mailing list used for the mailing, or with +the sender authentication. View the {ref}`email-marketing/deliverability-issues` section for more +information. + +### Bounced rate + +This rate measures the percentage of emails that were **unsuccessfully** delivered, and did not +enter a recipient's inbox, against the total number of sent emails. + +A high bounce rate could indicate issues, either with the mailing list used for the mailing, or with +the sender authentication. + +A low bounce rate may indicate that the mailing list used is up-to-date, and the sender +authentication is trusted by email providers. View the {ref}`email-marketing/deliverability-issues` +section for more information. + +:::{tip} +Click on the respective smart buttons to see all the corresponding recipient records that are +attributed to each metric. When these filtered records are in view, multiple types of reports can +be run for further analysis. +::: + +(email-marketing-create-reports)= + +## Create metrics reports + +Individual metrics can be analyzed by creating a report. To begin, click on the smart button of the +desired metric. + +Next, click the {icon}`fa-caret-down` {guilabel}`(down arrow)` to the right of the search bar to see +a drop-down menu of filtering and grouping parameters. + +{guilabel}`Filters`, located in the left column of the search options, can be used to keep only the +results that fit the filter. For example, selecting the *Bounced* filter only shows emails +that could not be delivered. + +{guilabel}`Group By`, found in the middle column, is used to organize the results into groups, and +can be used with or without filters. + +:::{note} +Setting multiple {guilabel}`Group By` options creates nested groups, according to which option +is selected first. For example, selecting {guilabel}`Sent Period`, followed by +{guilabel}`Add Custom Group --> Responsible`, in the {guilabel}`Group By` column, sorts all +results *first* by the sent period, *then* by the team member responsible. This is a useful +metric for analyzing who on the team is sending in volume or quantity over a set time period. + +This can be verified by looking at the direction, and order, of the selections in the group tile +that appears in the search bar after the selections are made. +::: + +```{eval-rst} +.. example:: + A monthly newsletter has been sent out, and 6.9% of the sent emails were bounced. + + .. image:: analyze_metrics/newsletter-metrics.png + :align: center + :alt: The metrics smart buttons of the newsletter. + + To see what these bounced recipients have in common, the records are grouped using a custom group + targeting :guilabel:`Mailing Lists`, which groups all records by the mailing lists they are on. + The records are then filtered using a custom filter with the rule `Created on >= 07/01/2024 + 00:00:00`, to filter by when the mailing list was last checked. This filter only includes + recipients that have been created on, or after, July 1st, 2024, in the report. + + .. image:: analyze_metrics/metrics-filter.png + :align: center + :alt: The custom filter creation form. + + Using these configurations, it is evident that all the recipients with bounced emails were added + after the list was last checked. Looking closer at the domains, it is evident that each + recipient has a malformed email domain (i.e: @yaoo.com instead of @yahoo.com), likely due to a + manual entry error while updating the database. + + .. image:: analyze_metrics/malformed-addresses.png + :align: center + :alt: A list of bounced email addresses with malformed email domains. +``` + +:::{seealso} +View {doc}`../../essentials/search` for more information about making custom groups and +filters. +::: + +(email-marketing-deliverability-issues)= + +## Mass mailing analysis + +It is also possible to analyze the success between mailing campaigns by creating a *Mass Mailing +Analysis* report. To begin, navigate to {menuselection}`Email Marketing app --> Reporting --> Mass +Mailing Analysis`. + +A dashboard appears displaying a bar chart containing each mailing campaign. By default, +{guilabel}`Sent` is selected, displaying the number of sent records on the y-axis. To change the +measure, click the {guilabel}`Measures` button, and select the desired measure from the drop-down +menu. + +```{eval-rst} +.. example:: + The following chart displays the number of opened emails from two different mass mailings. + + In this view, it can be seen that the first mass mailing led to a higher opened rate than the + second. Because a lower opened rate can sometimes be attributed to a subject line that failed to + capture readers' attention, the subject line of each mass mailing can be a good place to begin + looking. + + .. image:: analyze_metrics/mma-opened.png + :align: center + :alt: A bar chart displaying the different opened rate between two mass mailing campaigns. + + Comparing the two subject lines, it is clear the newsletter's subject line was less engaging, + which may have led to the lower opened rate, when compared to the other mass mailing. + + .. image:: analyze_metrics/mailing-comparison.png + :align: center + :alt: alt text +``` + +## Deliverability issues + +The following define possible reasons for a high bounce rate or low received rate: + +- Using a mailing list that contains outdated contact information, or malformed email addresses are + likely to result in a high bounce rate and/or a low received rate. +- Mailings sent using a *From* email address that differs from the sender's domain are likely to + bounce with certain email providers due to failing {ref}`DMARC authentication + `. +- Failing to {doc}`configure the proper DNS records + <../../general/email_communication/email_domain>` can also result in a high bounce rate. + +:::{seealso} +- {ref}`Mailing campaigns ` +- {doc}`Manage unsubscriptions ` +::: + diff --git a/content/applications/marketing/email_marketing/lost_leads_email.md b/content/applications/marketing/email_marketing/lost_leads_email.md new file mode 100644 index 000000000..5f34516b3 --- /dev/null +++ b/content/applications/marketing/email_marketing/lost_leads_email.md @@ -0,0 +1,372 @@ +# Lost leads reactivation email + +In Odoo, lost leads are removed from the active *CRM* pipeline, but can still be targeted with the +*Email Marketing* application for strategic campaign purposes, such as lost leads reactivation. + +A lost leads reactivation email looks at the leads that were lost during a specific period of time, +and uses custom filters and lost reasons to exclude undesirable leads from the mailing list. + +Once a lost leads reactivation email is complete, it can be sent as is, modified and sent to +different groups for A/B testing, or saved as a template for later. + +```{eval-rst} +.. example:: + A warehouse has leftover merchandise from a limited run of items from last year. To help clear + out the excess inventory, the warehouse manager creates a lost leads email to reach out to old + opportunities that were lost, and inform them that the limited merchandise is back in stock. + + The warehouse manager uses the following filters for a lost leads email: + + - :guilabel:`Blacklist` *is* `not set` + - :guilabel:`Created on` *>=* `01/01/2024 00:00:01` + - :guilabel:`Stage` *is not in* `New`, `Qualified`, or `Won` + - :guilabel:`Lost Reason` *is in* `Not enough stock` + - and either :guilabel:`Active` *is* `set` or `not set` + + .. image:: lost_leads_email/example.png + :align: center + :alt: A lost leads reactivation filter list excluding lost reasons like Too Expensive. +``` + +:::{tip} +As filters are added and removed, pay attention to the {guilabel}`# record(s)` value below the +filtering section. This value indicates the total number of records that match the current +criteria. + +To view a list of all matching records, click the {guilabel}`# record(s)` text. + +```{image} lost_leads_email/records.png +:align: center +:alt: 'The # record(s) text is located below the list of Recipient filters.' +``` +::: + +## Minimum requirements + +In order to create and deliver a lost leads reactivation email campaign, the *CRM* and *Email +Marketing* applications **must** be {ref}`installed ` and configured. + +Here are the minimum necessary filters that pertain to a lost leads reactivation mailing campaign: + +- The {ref}`Recipients ` field **must** be set to the + *Lead/Opportunity* model. +- A {ref}`Blacklist ` filter to exclude unsubscribed recipients. +- A {ref}`Created on ` to target leads that were lost during a + specific period of time. +- {ref}`Stage ` filter(s) to exclude leads that were already won, or + are still active in new stages of the sales pipeline (i.e. *New*, *Qualified*, etc.). These values + will be different per organization; however, it's minimally viable to exclude all the leads in the + *Won* stage. +- One or more {ref}`Lost Reason ` filters to exclude undesired + leads, such as duplicate, spam, or irrelevant records. +- A pair of {ref}`Active ` filters to target *both* active and + inactive leads. + +## Add the necessary filters + +First, navigate to the {menuselection}`Email Marketing` app, and on the {guilabel}`Mailings` page, +click the {guilabel}`New` button in the top-left corner. + +(email-marketing-recipients-field)= + +On the new {guilabel}`Mailings` form, enter an appropriate {guilabel}`Subject` line for the email in +the corresponding field. Then, in the {guilabel}`Recipients` field, choose the +{guilabel}`Lead/Opportunity` model from the drop-down menu. + +(email-marketing-blacklist-filter)= + +In the rules section, located beneath the {guilabel}`Recipients` field, click the modify filter +({guilabel}`▶ (triangle pointing right)`) icon to expand the filter rules. Leave the default +{guilabel}`Blacklist` rule in place. + +(email-marketing-created-on-filter)= + +### Created on + +Begin by clicking {guilabel}`New Rule` beneath the default {guilabel}`Blacklist` rule. Then, click +the first field of the new rule that appears, and select the {guilabel}`Created on` parameter from +the drop-down menu. With that in place, a specific time period during which the targeted leads were +lost can be designated (e.g. 30 days prior, 90 days prior, previous year, etc.). + +Then, in the second field, select {guilabel}`<= (less than or equal to)`, {guilabel}`>= (greater +than or equal to)`, or {guilabel}`is between` as a date operator, in order to frame the time +selection chosen in the third field. + +In the third field, use the calendar popover window to select dates, and click {guilabel}`Apply` to +lock in the time range. + +```{image} lost_leads_email/created-on.png +:align: center +:alt: A custom filter rule setting the time period to be anything before today's date. +``` + +:::{important} +When there is more than one rule applied, make sure the statement at the top of the +{guilabel}`Recipients` filter list reads: {guilabel}`Match all of the following rules`. If it +does not, click on the statement, and select {guilabel}`all` from the drop-down menu (as opposed +to {guilabel}`any`). + +```{image} lost_leads_email/match-all.png +:align: center +:alt: The statement at the top of the filters list, with the drop-down menu open. +``` +::: + +(email-marketing-stage-filter)= + +### Stage + +Now, add the {guilabel}`Stage` filter to exclude leads that are in the *New*, *Qualified*, and *Won* +stages of the sales pipeline. + +:::{note} +This step assumes that the *New*, *Qualified*, and *Won* stages exist in the CRM pipeline; +however, stage names may differ from business to business. Refer to the database's actual stage +names in the *CRM* app's pipeline to complete this step, accordingly. +::: + +Begin again by clicking {guilabel}`New Rule` and select {guilabel}`Stage` from the first field's +drop-down menu. In the second field, select the {guilabel}`is not in` operator, and in the third +field, select the {guilabel}`New`, {guilabel}`Qualified` and {guilabel}`Won` stages to define the +rule's parameters. + +When the rule is added in this way, the logic in the third field renders as {code}`OR` (`|`) +statements. + +```{image} lost_leads_email/stage-is-in.png +:align: center +:alt: Include multiple Stages in the filtering rule, using the "is in" operator. +``` + +:::{tip} +Another way to add *Stage* rules, is to do so on a one-rule-per-row basis using the +{guilabel}`contains` or {guilabel}`does not contain` operators, and manually typing out the +defining characters in each stage name. This method, however, only allows for one selection at a +time, which can be useful for quickly turning on/off filters in the {guilabel}`Search...` bar. + +```{image} lost_leads_email/stages.png +:align: center +:alt: Three filter rules requiring that the Stage does not contain New, Qualified, +: or Won. +``` +::: + +(email-marketing-lost-reason-filter)= + +### Lost Reason + +Next, add one or more {guilabel}`Lost Reason` rules to exclude leads that should **not** be targeted +for specific {doc}`lost reasons <../../sales/crm/pipeline/lost_opportunities>`. + +To do that, create another {guilabel}`New Rule`, once again. Then, in the rule's first field, select +{guilabel}`Lost Reason` from the drop-down menu. For the operator, choose either {guilabel}`is not +in` or {guilabel}`does not contain` from the drop-down menu. With either selection, use the third +field to enter a lost reason (or multiple lost reasons, depending on your operator choice) to +include in the rule. + +If choosing the {guilabel}`does not contain` operator, then repeat the preceding steps to add more +lost reasons, as needed, where each lost reason occupies one rule row at a time. + +For more information, refer to the section below outlining how to {ref}`select appropriate lost +reasons `. + +```{image} lost_leads_email/reasons.png +:align: center +:alt: A list of filter rules that exclude all lost reasons other than the desired reason. +``` + +(email-marketing-active-filter)= + +### Active + +Finally, add a pair of {guilabel}`Active` filters to include both active and inactive leads for the +campaign. + +:::{important} +Adding both active *and* inactive lead records is necessary to capture the full scope of lost +leads in the database. Doing one without the other greatly impacts the number of targetable +records for the email campaign, and does **not** include a complete or accurate lost leads +audience. +::: + +First, click the {guilabel}`(Add Branch)` icon on the most recently created rule (e.g. +{guilabel}`Lost Reason`), which is the middle of three icons located to the right of the rule row. +Doing so adds a pair of {guilabel}`any of` rules. Then, in the top rule's first field of the +newly-created branch, select the {guilabel}`Active` parameter from the drop-down menu. The rule then +automatically fills out to read: {guilabel}`Active` *is* `set`. + +For the first field of the bottom rule of the branch, select {guilabel}`Active` from the drop-down +menu again. However, this time, select {guilabel}`is not` from the operator drop-down menu in the +second field. The rule should then read: {guilabel}`Active` *is not* `set`. + +```{image} lost_leads_email/active.png +:align: center +:alt: A pair of Match Any Of filter rules that include both active and inactive leads. +``` + +## Add body content + +Now, with the domain section of the email campaign complete, create the body content of the email +using any of the premade stylized templates, or choose between the {guilabel}`Plain Text` or +{guilabel}`Start From Scratch` options for more granular control. For more information, refer to the +*Email Marketing* {ref}`documentation on how to create an email `. + +:::{tip} +To save the set of filters for later use, click {guilabel}`Save as Favorite Filter 💾 (floppy +disk)`, enter a name (such as `Lost Leads`), and click {guilabel}`Add`. + +```{image} lost_leads_email/favorite-filter.png +:align: center +:alt: The Save as Favorite Filter pop-up can save the lost leads criteria for later. +``` +::: + +## Send or schedule + +Once all the components of the email campaign are complete, either: + +- click the purple {guilabel}`Send` button at the top-left of the form to immediately send the + email; or +- click the gray {guilabel}`Schedule` button, located to the right of the {guilabel}`Send` button, + to send the email at a future date and time. + +:::{tip} +Consider using *A/B Testing* to send an alternate version of the email to a percentage of the +target leads. This can help determine what subject lines and body content produce the best +click-through rates, before sending a final version to the remaining leads. + +To do so, open the {guilabel}`A/B Tests` tab on the mailing form and check the box next to +{guilabel}`Allow A/B Testing`. Then, adjust the parameters as needed, and click {guilabel}`Create +an Alternative Version`. + +```{image} lost_leads_email/ab-testing.png +:align: center +:alt: The A/B Tests tab with the Allow A/B Testing box checked to create an alternate +: version. +``` +::: + +(email-marketing-select-lost-reasons)= + +## Select appropriate lost reasons + +When a lead is marked as lost, Odoo recommends selecting a *Lost Reason* to indicate why the +opportunity did not result in a sale. Doing so keeps the pipeline organized and reporting data +accurate, and generates potential to follow up with the lead in the future. + +If an existing *Lost Reason* is not applicable, users with the necessary permissions can create new +ones, which means the lost reasons in a database can vary from organization to organization, and +from pipeline to pipeline. + +For more information on *Lost Reasons*, including the creation of them, refer to +{doc}`../../sales/crm/pipeline/lost_opportunities`. + +By default, Odoo includes a few common *Lost Reasons*, such as: + +- *Too expensive* +- *We don't have people/skills* +- *Not enough stock* + +When determining which reasons to include in a lost leads reactivation email, consider what the +email is advertising, in order pinpoint one or more relevant lost reasons. Then, add a rule stating, +{guilabel}`Lost Reason` *does not contain* `_____` for every reason in the database, **except** for +the relevant one(s). + +```{eval-rst} +.. example:: + If the email advertises a selection of previously-limited merchandise that is now back in stock, + it makes sense to target leads with the lost reason: *not enough stock*. + + .. image:: lost_leads_email/out-of-stock.png + :align: center + :alt: A list of filter rules that exclude all lost reasons except for Out of Stock. + + If the email advertises a price reduction, it makes sense to target leads with the lost reason: + *too expensive*. + + .. image:: lost_leads_email/too-expensive.png + :align: center + :alt: A list of filter rules that exclude all lost reasons except for Too Expensive. +``` + +## Analyze the results + +After sending a lost leads reactivation email, marketing teams can use the smart buttons along the +top of the email to analyze the results, and determine follow-up actions. + +Clicking on any of the smart buttons opens a list of records matching that button's specific +criteria. + +```{image} lost_leads_email/smart-buttons.png +:align: center +:alt: The Mailing page of a sent email showing the smart buttons along the top of the +: page. +``` + +The smart buttons include: + +- {guilabel}`Sent`: total number of emails sent. +- {guilabel}`Opened`: percentage of recipients that opened the email. +- {guilabel}`Replied`: percentage of recipients that replied to the email. +- {guilabel}`Clicked`: click-through rate (%) of recipients that clicked on a link in the email. +- {guilabel}`Leads/Opportunities`: number of leads (or opportunities) that have been created in the + *CRM* pipeline, as a result of the email campaign. +- {guilabel}`Quotations`: number of quotations that have been created in the *Sales* application, as + a result of the email. +- {guilabel}`Invoiced`: total revenues generated, as a result of the email campaign, via invoices + sent to, and paid by, customers. These values are recorded in either the *Invoicing* or + *Accounting* application, depending on which app is installed in the database. +- {guilabel}`Received`: percentage of recipients that received the email. +- {guilabel}`Bounced`: percentage of emails that bounced ({dfn}`not delivered`). +- {guilabel}`Ignored`: the number of recipients that received the email, but have not interacted + with it in a meaningful way (i.e. opened, clicked, etc.). + +## Email nurturing + +*Email nurturing* (sometimes referred to as *lead nurturing*) is the process of sending a series of +timely and relevant "nudge" emails to connect with a lead, build a deeper relationship, and +ultimately convert the lead into a sale. + +The point of nurturing is to keep the email campaign "visible" or at the top of a lead's inbox, +until they are ready to buy. + +There are many approaches to effective lead nurturing, but they often involve: + +- Sending an initial email (such as, a lost leads reactivation email). +- Sending a follow-up email each week (or according to specific triggers) for the duration of the + campaign. +- Continuously analyzing results to learn what approaches have resulted in sales. +- Continuously adjusting the approach to remain "visible" at the top of the lead's inbox, and + hopefully, get a meaningful response from the lead. + +As a campaign progresses, a marketing team may send different follow-up emails depending on how a +lead responded the previous week. + +```{eval-rst} +.. example:: + A marketing team wants to advertise a restocking of limited-run merchandise to all leads with a + lost reason of *not enough stock*. They develop the following three-week long lead nurturing + campaign. + + - **Week 1:** the marketing team sends an initial email, with the subject line: *“Limited run + merchandise is back in stock! Act now!”* + - **Week 2:** the marketing team sends two different emails, depending on how a lead responded. + + - If a lead ignored the Week 1 email: *“Stock is almost out, did you get yours?”* + - If a lead clicked on the Week 1 email: *"You still have time to add this to your collection"* + + - **Week 3:** the marketing team sends a final email to all leads who have not been converted + stating: *“20% off, don't miss your last chance to get these items before they're gone!”* + + Throughout the campaign, the marketing team continuously refers to the smart buttons along the + top of the mailing page to see what percentages of leads are opening, clicking on, or ignoring + the emails. They also regularly analyze reports on how many opportunities, quotations, and + invoices have been generated by the campaign. +``` + +:::{seealso} +- {doc}`../email_marketing` +- {doc}`unsubscriptions` +- {doc}`../marketing_automation` +::: + diff --git a/content/applications/marketing/email_marketing/mailing_lists.md b/content/applications/marketing/email_marketing/mailing_lists.md new file mode 100644 index 000000000..19d92146a --- /dev/null +++ b/content/applications/marketing/email_marketing/mailing_lists.md @@ -0,0 +1,233 @@ +# Mailing lists + +Mailing lists in Odoo are used for both pre and post sales communications in the *Email Marketing* +application. They provide sales teams with qualified lead lists, focus group participants, or +current customers that fulfill specific criteria. + +Mailing lists can be generated in Odoo, and exported as a downloadable file, or into the +*Knowledge*, *Dashboards*, or *Spreadsheets* applications, or imported via copy/paste or file +upload. + +## Create mailing lists + +To create a mailing list in the *Email Marketing* application, navigate to {menuselection}`Email +Marketing app --> Mailing Lists --> Mailing Lists --> New`. + +Clicking {guilabel}`New` reveals a blank mailing list form. + +```{image} mailing_lists/new-mailing-list-form.png +:align: center +:alt: View of the mailing list form in the Odoo Email Marketing application. +``` + +On the form, type a name in the {guilabel}`Mailing List` field at the top. + +If the mailing list should be accessible by recipients from the subscription management page, +allowing them to update their preferences, tick the box next to {guilabel}`Show In Preferences`. + +In the upper-left corner of the mailing list form, there are two buttons: {guilabel}`Send Mailing` +and {guilabel}`Send SMS`. + +:::{important} +The {guilabel}`Send SMS` button **only** appears if the *SMS Marketing* application is installed. +::: + +Clicking {guilabel}`Send Mailing` reveals a separate page with a blank email template form, which +can be filled out by following steps explained in the {doc}`Email Marketing doc +<../email_marketing>`. + +Clicking {guilabel}`Send SMS` reveals a separate page with a blank SMS template form, which can be +filled out by following steps explained in the {doc}`SMS Marketing doc +<../sms_marketing>`. + +At the top of the mailing list form is a series of smart buttons that display a variety of metrics +related to the specific mailing list. When any of the smart buttons are clicked, a separate page is +revealed, showcasing detailed analytics related to that particular statistic. + +The smart buttons available on a mailing list form are: + +- {guilabel}`Recipients`: how many people are subscribed to the mailing list +- {guilabel}`Mailings`: how many mailings have been sent using this mailing list +- {guilabel}`% Bounce`: percentage of mailings related to this mailing list that have been bounced + back +- {guilabel}`% Opt-out`: percentage of recipients that have opted-out of mailings from this mailing + list +- {guilabel}`% Blacklist`: percentage of recipients that have blacklisted themselves from the + mailing list altogether + +Once all the configurations on the mailing list form are complete, Odoo automatically adds the new +mailing list to the {guilabel}`Mailing List` page in the *Email Marketing* app +({menuselection}`Email Marketing app --> Mailing Lists --> Mailing Lists`). + +## Add contacts to mailing list + +In Odoo *Email Marketing*, there are a few different ways to add contacts to a mailing list. + +From the {guilabel}`Mailing Lists` page ({menuselection}`Email Marketing --> Mailing Lists --> +Mailing Lists`), click the {guilabel}`Total Contacts` link on the line of the desired mailing list +to which contacts should be added. + +Doing so reveals a separate {guilabel}`Mailing List Contacts` page for that specific mailing list, +where contacts can be created or imported, and then added to the specific mailing list. + +This same page can also be accessed by clicking the desired mailing list from the {guilabel}`Mailing +Lists` page, and then clicking the {guilabel}`Recipients` smart button on the mailing list form. + +Doing so *also* reveals a separate {guilabel}`Mailing List Contacts` page for that specific mailing +list, where contacts can be created or imported, and then added to the specific mailing list. + +Contacts can also be directly imported to a specific mailing list from the {guilabel}`Mailing Lists` +page, by clicking {guilabel}`Import Contacts` to the far-right of the desired mailing list. + +```{image} mailing_lists/import-contacts-button.png +:align: center +:alt: The import contacts button of a mailing list line in Odoo Email Marketing. +``` + +Doing so reveals an {guilabel}`Import Mailing Contacts` pop-up form. + +```{image} mailing_lists/import-mailing-contacts-popup.png +:align: center +:alt: The import mailing contacts pop-up form that appears in Odoo Email Marketing. +``` + +Here, the desired mailing list is auto-populated in the {guilabel}`Import contacts in` field. +Beneath that, write or paste email addresses in the {guilabel}`Contact List` field. + +The option to import a country, company name, and more is available, via the {guilabel}`Upload a +file` link at the bottom of the pop-up form. + +When all contacts and configurations are complete, click {guilabel}`Import`. + +To add contacts to a specific mailing list from a master list of all mailing list contacts in the +database, navigate to {menuselection}`Email Marketing app --> Mailing Lists --> Mailing List +Contacts`. Doing so reveals the {guilabel}`Mailing List Contacts` page, featuring a list of all +contacts associated with every mailing list. + +```{image} mailing_lists/mailing-list-page.png +:align: center +:alt: The Mailing List page in the Odoo Email Marketing application. +``` + +The default {guilabel}`Exclude Blacklisted Emails` filter appears in the search bar. + +From the {guilabel}`Mailing List Contacts` page, contacts can be created and/or imported, and then +added to a mailing list. + +To add an existing contact to a mailing list, select the desired contact from the list on the +{guilabel}`Mailing List Contacts` page to reveal their contact form. + +At the bottom of their contact form, click {guilabel}`Add a line` under the {guilabel}`Mailing List` +column, locate the desired mailing list from the drop-down menu, and select it. + +```{image} mailing_lists/contact-form-mailing-list-add.png +:align: center +:alt: The Add a line for mailing lists on a standard contact form in Odoo Email Marketing. +``` + +:::{tip} +A mailing list can be created directly from a contact form, by typing the name of the new mailing +list in the {guilabel}`Mailing List` field. Then, after a new mailing list name has been entered, +two options appear on the drop-down menu beneath the new mailing list name. + +From this drop-down menu, select {guilabel}`Create` to create the mailing list and edit it later, +or select {guilabel}`Create and edit...` to create and edit the new mailing list right away. +::: + +To remove a contact from a mailing list that the contact has been added to, enable the +{guilabel}`Opt Out` checkbox. If the {guilabel}`Opt Out` checkbox is ticked, the ability to add a +{guilabel}`Reason` why the contact opted-out is also available. + +When/if a contact *has* opted-out of a mailing list, the date they activated their opt-out appears +in the {guilabel}`Unsubscription Date` column on their contact form. + +Lastly, the initial {guilabel}`Subscription Date` can be seen, as well. This field is auto-populated +with the date and time their subscription to the mailing list has been saved. + +Multiple mailing lists can be added to a single contact form. + +To delete any mailing list from a contact form, simply click the {guilabel}`🗑️ (trash can)` icon. + +## Link mailing list to website + +When a mailing list is created in the database, Odoo provides the option to directly link the +mailing list to the Odoo-built website (created via the Odoo *Website* application). + +To link a mailing list to a website, navigate to the front-end of the website, which can be +accomplished in a variety of ways throughout the database. The most direct way to get to the +front-end of the website is to simply open the {menuselection}`Website` application from the main +Odoo dashboard. + +Doing so reveals the designated homepage of the Odoo-built website for the database. + +From the front-end of the website, click the {guilabel}`Edit` button in the upper-right corner. When +clicked, Odoo reveals a right-sidebar, filled with drag-and-drop *building blocks*, packed with +various features, options, and design elements. + +Next, in the search bar of the right-sidebar, search for `Newsletter`. The {guilabel}`Newsletter` +selection of building blocks is used to add subscription fields for any mailing list onto the +website. + +```{image} mailing_lists/newsletter-block-search.png +:align: center +:alt: View of how to quickly search for Newsletter blocks in the Odoo Website application. +``` + +Doing so reveals the following building block options: {guilabel}`Newsletter Block`, +{guilabel}`Newsletter Popup`, and {guilabel}`Newsletter`. Any of these options can be used to add +subscription fields for a mailing list onto the website. + +The {guilabel}`Newsletter Block` option places a customizable block onto the body of the website +where a visitor to enter their email and click a button to subscribe to a designated mailing list. + +```{image} mailing_lists/newsletter-block-sample.png +:align: center +:alt: Sample of how a newsletter block appears on an Odoo Website. +``` + +The {guilabel}`Newsletter Popup` option reveals a customizable pop-up window that appears when a +visitor scrolls to the specific section of the webpage on which the building block is placed. When +the visitor reaches the designated section, a pop-up window appears, in which a visitor can enter +their email address, click a button, and subscribe to that predetermined mailing list. + +```{image} mailing_lists/newsletter-popup-sample.png +:align: center +:alt: Sample of how a newsletter popup block appears on an Odoo Website. +``` + +The {guilabel}`Newsletter` option provides the same functionality as the other options. However, it +only consists of a field for the visitor to enter their email address, and a button to subscribe to +the mailing list. + +It is covertly designed in this fashion to be cleanly implemented into the content of the webpage +and/or footer. + +```{image} mailing_lists/newsletter-sample.png +:align: center +:alt: Sample of how a newsletter block appears on an Odoo Website. +``` + +Once the desired newsletter building block is chosen, drag-and-drop it onto the body of the +website. Then, select the newly-placed newsletter building block to reveal its configuration options +on the right-sidebar. + +From there, open the {guilabel}`Newsletter` drop-down menu, and select the specific mailing list +that should be applied to the block. + +```{image} mailing_lists/newsletter-dropdown-customize-sidebar.png +:align: center +:alt: The newsletter drop-down menu in the customize sidebar that appears in Odoo Website. +``` + +Once the desired configurations and customizations are complete, be sure to click the +{guilabel}`Save` button in the upper-right corner. + +Now, when a visitor enters their email address, and clicks the button to subscribe, they are +instantly subscribed to that pre-configured mailing list. They are also added as a contact for that +mailing list in Odoo *Email Marketing*. + +:::{seealso} +- {doc}`../email_marketing` +- {doc}`unsubscriptions` +::: + diff --git a/content/applications/marketing/email_marketing/unsubscriptions.md b/content/applications/marketing/email_marketing/unsubscriptions.md new file mode 100644 index 000000000..1f7d47fbe --- /dev/null +++ b/content/applications/marketing/email_marketing/unsubscriptions.md @@ -0,0 +1,136 @@ +# Manage unsubscriptions (blacklist) + +Providing recipients with the power to unsubscribe from mailing lists is not only a smart business +practice, it's often a legal requirement. Allowing recipients to unsubscribe from a mailing list +establishes a sense of trust and control with an audience. It also helps companies appear more +genuine, and less *spammy*. + +## Unsubscribe and blacklist + +In addition to having the option to unsubscribe from specific mailing lists, the recipient can also +*blacklist* themselves during the unsubscription process, meaning they will not receive *any* more +marketing emails from the Odoo database. + +In order to provide recipients with the ability to blacklist themselves, a specific feature **must** +be enabled in the *Email Marketing* application. + +Navigate to {menuselection}`Email Marketing app --> Configuration --> Settings`, and tick the +checkbox next to the {guilabel}`Blacklist Option when Unsubscribing` feature. Then, click +{guilabel}`Save` in the upper-left corner of the {guilabel}`Settings` page. + +```{image} unsubscriptions/blacklist-feature.png +:align: center +:alt: View of the blacklist feature in the Settings page of the Odoo Email Marketing +: app. +``` + +### Unsubscribe + +By default, an *Unsubscribe* link appears at the bottom of all mailing templates. + +:::{warning} +The *Unsubscribe* link does **not** appear by default if the *Start From Scratch* template is +used to create a mailing. The user **must** manually add the specific unsubscribe link +`/unsubscribe_from_list` in the body of the email, or use a block from the *Footers* section of +the email builder, which includes the unsubscribe link. +::: + +If a recipient clicks the *Unsubscribe* link in a mailing, Odoo instantly unsubscribes them from the +mailing list, presents them with a {guilabel}`Mailing Subscriptions` page where they can directly +manage their subscriptions, and informs them that they've been {guilabel}`Successfully +Unsubscribed`. + +```{image} unsubscriptions/mailing-subscriptions-page.png +:align: center +:alt: The Mailng Subscriptions page that appears when 'Unsubscribe' link in mailing +: is clicked. +``` + +Beneath that, Odoo asks the former subscriber to {guilabel}`Please let us know why you updated your +subscription`, and the user can proceed to choose the appropriate opt-out reason from a series of +options presented to them. + +:::{note} +The opt-out answer options can be created and modified by navigating to {menuselection}`Email +Marketing app --> Configuration --> Optout Reasons`. +::: + +Once they've chosen the appropriate opt-out reason from the options presented to them, they can +click the {guilabel}`Send` button. Odoo then logs their reasoning for unsubscribing in the *Email +Marketing* app for future analysis. + +### Blacklist + +For a recipient to remove (i.e. blacklist) themselves from **all** marketing emails during the +unsubscription process, on the {guilabel}`Mailing Subscriptions` page, they must click +{guilabel}`Exclude Me`. + +Upon clicking {guilabel}`Exclude Me`, Odoo informs the recipient they have been successfully +blacklisted, with a message reading: {guilabel}`✔️ Email added to our blocklist`. + +```{image} unsubscriptions/mailing-subscriptions-blocklist-question.png +:align: center +:alt: The blocklist question on the Mailing Subscriptions page that recipients see. +``` + +Beneath that, Odoo asks the former subscriber to {guilabel}`Please let us know why you want to be +added to our blocklist`, and the user can proceed to choose the appropriate reason from a series of +options presented to them. + +Once they've chosen the appropriate reason from the options presented to them, they can click the +{guilabel}`Send` button. Odoo then logs their reasoning for blacklisting themselves in the *Email +Marketing* app for future analysis. + +## Blacklisted email addresses + +To view a complete list of all blacklisted email addresses, navigate to {menuselection}`Email +Marketing app --> Configuration --> Blacklisted Email Addresses`. + +```{image} unsubscriptions/blacklisted-email-addresses.png +:align: center +:alt: View of the blacklisted email addresses page in Odoo Email Marketing. +``` + +When a blacklisted record is selected from this list, Odoo reveals a separate page with the +recipient's contact information, along with the provided {guilabel}`Reason` why they chose to +blacklist themselves. + +```{image} unsubscriptions/blacklisted-contact-form.png +:align: center +:alt: View of a blacklisted contact detail form in Odoo Email Marketing. +``` + +In the *chatter* of the blacklisted record page, there's a time-stamped message, informing the user +when the recipient blacklisted themselves (via a {guilabel}`Mail Blacklist created` log note). + +:::{note} +Blacklisted emails are excluded from all marketing mailings, however, these emails can still +receive transactional emails, such as order confirmations, shipping notifications, etc. +::: + +## Unblacklist contacts + +To *Unblacklist* contacts, click the {guilabel}`Unblacklist` button in the upper-left corner of a +blacklisted record's page to remove the contact from the blacklist, allowing them to receive +mailings once again. + +When {guilabel}`Unblacklist` is clicked, an {guilabel}`Are you sure you want to unblacklist this +Email Address?` pop-up window appears. + +In this pop-up window, the email address of the selected blacklisted record is shown, and there's a +{guilabel}`Reason` field, in which a reason can be entered, explaining why this particular contact +was removed from the blacklist. + +```{image} unsubscriptions/unblacklist-popup.png +:align: center +:alt: View of the unblacklist pop-up window in the Odoo Email Marketing application. +``` + +After filling in the fields, click {guilabel}`Confirm` to officially remove that particular contact +from the blacklist. + +:::{seealso} +- {doc}`../email_marketing` +- {doc}`mailing_lists` +::: + diff --git a/content/applications/marketing/events.md b/content/applications/marketing/events.md new file mode 100644 index 000000000..3352af051 --- /dev/null +++ b/content/applications/marketing/events.md @@ -0,0 +1,271 @@ +--- +show-content: true +--- + +# Events + +Explore the various aspects of the Odoo **Events** detailed dashboard, and useful settings, that can +be utilized to generate and gather valuable data about events (and their attendees), which can then +be used to improve decision-making and event-planning. + +:::{seealso} +[Odoo Tutorials: Events](https://www.odoo.com/slides/surveys-63) +::: + +```{eval-rst} +.. cards:: + + .. card:: Create events + :target: events/create_events + + Discover how to create events with Odoo. + + .. card:: Sell event tickets + :target: events/sell_tickets + + Learn how to create, configure, and sell event tickets. + + .. card:: Track and manage talks + :target: events/track_manage_talks + + See how to create, track, and manage event tracks with Odoo. + + .. card:: Event templates + :target: events/event_templates + + Expedite the event-creation process with event templates. + + .. card:: Event tracks + :target: events/event_tracks + + Learn how to create, track, and manage event tracks with Odoo. + + .. card:: Event booths + :target: events/event_booths + + Create, manage, and sell event booths. + + .. card:: Registration Desk + :target: events/registration_desk + + Instantly grant access to event attendees with Odoo's Registration Desk feature. + + .. card:: Revenues report + :target: events/revenues_report + + Analyze the financial success of events with Odoo. +``` + +## Events dashboard + +When the **Events** application is opened, Odoo reveals the main {guilabel}`Events` dashboard, which +can be viewed in a number of different ways. Those different view options are accessible from the +{guilabel}`Events` dashboard in the upper-right corner, via a series of view-related icon buttons. + +By default, the {guilabel}`Events` dashboard is displayed in the {icon}`oi-view-kanban` +{guilabel}`Kanban` view, which is populated with a variety of pipeline stages. + +```{image} events/kanban-dashboard.png +:align: center +:alt: Overview of events setting with the kanban view in Odoo Events. +``` + +This view showcases all the events in the database in their respective stages. By default, the +stages are: {guilabel}`New`, {guilabel}`Booked`, {guilabel}`Announced`, {guilabel}`Ended`, and +{guilabel}`Cancelled`. + +:::{note} +The {guilabel}`Ended` and {guilabel}`Cancelled` stages are folded, by default, and located to the +right of the other stages. +::: + +On each event card, find the scheduled date of the event, the name of the event, the location, the +number of expected {guilabel}`Attendees`, any scheduled activities related to the event, the status +of the event, and the person responsible for the event. + +To quickly add a new event to a pipeline, click the {icon}`fa-plus` {guilabel}`(plus)` icon at the +top of the stage to which the event should be added to reveal a blank Kanban card to fill out. + +```{image} events/blank-kanban-card.png +:align: center +:alt: Typical blank kanban card to fill out in the Odoo Events application. +``` + +In this blank Kanban card, enter the name of {guilabel}`Event`, along with the start and end +{guilabel}`Date` and time. + +Then, either click {guilabel}`Add` to add it to the stage and edit it later, or click +{guilabel}`Edit` to add the event to stage and edit its configurations on a separate page. + +Each event card can be dragged-and-dropped into any stage on the Kanban pipeline, providing easy +organizational access. + +## Settings + +To access the event settings and feature options in Odoo **Events**, navigate to +{menuselection}`Events app --> Configuration --> Settings`. From here, tick the checkboxes beside +the desired settings and/or features, and click {guilabel}`Save` to activate them. + +### Events section + +In the {guilabel}`Events` section of the {guilabel}`Settings` page, there are selectable features +that can be enabled to add various elements to events created with the Odoo **Events** application. + +```{image} events/settings-events-section.png +:align: center +:alt: The Events section on the Odoo Events settings page in the Odoo Events application. +``` + +The {guilabel}`Schedule & Tracks` feature allows users to manage and publish a schedule with tracks +for events. *Tracks* is a catch-all term that refers to talks, lectures, demonstrations, +presentations, and other similar elements that users may choose to include as part of an event. + +When the {guilabel}`Schedule & Tracks` feature is enabled, two additional fields appear beneath it: +{guilabel}`Live Broadcast` and {guilabel}`Event Gamification`. + +The {guilabel}`Live Broadcast` feature lets users air tracks online, via a *YouTube* integration. + +The {guilabel}`Event Gamification` feature lets users share a quiz after any event track, in order +for attendees to gauge how much they learned from the track they just saw/heard. Companies can also +benefit from this feature, in that the subsequent responses and results of the quizzes can help +determine where a company's strengths and weaknesses are, when it comes to their presentations. + +Next, is the {guilabel}`Online Exhibitors` feature. This feature allows users to display sponsors +and exhibitors on event pages, which can serve as a valuable incentive to encourage partners and +businesses to participate in the event. + +The {guilabel}`Jitsi Server Domain` field represents an external conferencing service that is +integrated with Odoo. It is what is used to create and host virtual conferences, community rooms, +and other similar elements for events. + +The {guilabel}`Community Chat Rooms` feature allows users to create virtual conference rooms for +event attendees, providing them with a centralized place to meet and discuss anything related to the +event. + +Lastly, there is the {guilabel}`Booth Management` feature. This feature provides users with the +ability to create and manage event booths and booth reservations. When enabled, users can create +different booth tiers, with individual price points, and sell them to interested parties. + +### Registration section + +The {guilabel}`Registration` section of the {guilabel}`Settings` page provides selectable settings +that are directly related to event registration. + +```{image} events/settings-registration-section.png +:align: center +:alt: The Registration section in the Odoo Events settings page in the Odoo Events +: application. +``` + +The {guilabel}`Tickets` setting allows users to sell event tickets, via standard sales orders. + +The {guilabel}`Online Ticketing` setting creates a selectable *Event Ticket* product type on product +forms, which provides users with the ability to sell event tickets online, via their +website/eCommerce store. + +### Attendance section + +In the {guilabel}`Attendance` section of the {guilabel}`Settings` page, there is a selectable +setting that is directly related to how attendees can attend/enter the event. + +```{image} events/settings-attendance-section.png +:align: center +:alt: The Attendance section in the Odoo Events Settings page in the Odoo Events application. +``` + +The {guilabel}`Use Event Barcode` setting, when activated, enables barcode (and QR code) scanning +for attendees to enter the event. This provides attendees with quick access, and helps Odoo users +easily track, manage, and analyze all event attendees. + +The {guilabel}`Barcode Nomenclature` field, beneath the {guilabel}`Use Event Barcode` setting, is +set to {guilabel}`Default Nomenclature`, by default, but can be changed at any time. + +## Create events + +With Odoo **Events**, events can be manually created from scratch or built off of pre-made +templates. + +Once launched, the **Events** application then integrates with the **Website** app for the front-end +promotion and registration of the event for attendees, the **Sales** app for the purchasing ability +of paid tickets, and the **CRM** application through customizable lead generation rules. + +:::{seealso} +{doc}`events/create_events` +::: + +## Sell event tickets + +Create custom ticket tiers (with various price points) for potential event attendees to choose from, +directly on the event template form, under the *Tickets* tab. + +Odoo simplifies the ticket-purchasing process by providing plenty of payment method options, as +well. + +:::{seealso} +{doc}`events/sell_tickets` +::: + +## Track and manage talks + +Discover how to access various event tracks (talks, presentations, etc.), view entire agendas, and +learn how attendees can propose talks for the event. + +:::{seealso} +{doc}`events/track_manage_talks` +::: + +## Event templates + +Learn the process to customize and configure event templates, which can be used to expedite the +event-creation process. + +:::{seealso} +{doc}`events/event_templates` +::: + +## Event booths + +Explore the various ways to create, manage, and sell event booths with the Odoo **Events** +application. + +:::{seealso} +{doc}`events/event_booths` +::: + +## Event tracks + +Find out how to create, manage, and schedule different experiences (aka *Tracks*) for events with +Odoo. + +:::{seealso} +{doc}`events/event_tracks` +::: + +## Registration desk + +Grant access to event attendees quickly and easily with the Odoo **Events** *Registration Desk* +feature. + +:::{seealso} +{doc}`events/registration_desk` +::: + +## Revenues report + +Gain invaluable insight into event-related revenues with customizable reports and metrics. + +:::{seealso} +{doc}`events/revenues_report` +::: + +```{toctree} +events/create_events +events/sell_tickets +events/track_manage_talks +events/event_templates +events/event_booths +events/event_tracks +events/registration_desk +events/revenues_report +``` + diff --git a/content/applications/marketing/events/create_events.md b/content/applications/marketing/events/create_events.md new file mode 100644 index 000000000..2d8391561 --- /dev/null +++ b/content/applications/marketing/events/create_events.md @@ -0,0 +1,454 @@ +# Create events + +With the *Events* application, event organizers can create and configure in-person or online-only +events in Odoo. Each new event contains a number of customizable options that are geared around +specific event logistics, as needed per event, such as ticket sales and registration desk, booths, +tracks, sponsors, rooms, and more. + +Events can be manually created from scratch or built off of pre-made templates. Once launched, the +*Events* application then integrates with the *Website* app for the front-end promotion and +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. + +## New event + +To create a new event, begin by navigating to the {menuselection}`Events app` to land on the default +{guilabel}`Events` dashboard, in the {icon}`oi-view-kanban` {guilabel}`Kanban` view. From there, or +alternatively from the {icon}`oi-view-list` {guilabel}`List` or {icon}`fa-tasks` {guilabel}`Gantt` +views, click the {guilabel}`New` button in the upper-left corner of the dashboard to open up a new +event form. + +```{image} create_events/blank-event-template.png +:align: center +:alt: Typical event template in the Odoo Events application. +``` + +:::{note} +If certain fields do not readily appear on the event form, that means an additional application +needs to be installed, or the database is not operating in a multi-company environment. + +For example, the {guilabel}`Twitter Wall` field **only** appears if the *Social Marketing* app is +installed, and the {guilabel}`Company` field **only** appears if the database is working in a +multi-company environment. + +These are just *additional* elements that can be used for an event. They are **not** required to +create, host, and manage an event with Odoo *Events*. +::: + +## Event form + +At the top of the event form are a series of smart buttons related to various event metrics, which +will autopopulate with pertinent data once attendees begin to register, booths and sponsors sign on +for the event, the event takes place, and so on. + +Primarily, these smart buttons are used as logistical portals to perform specific actions for the +event. The numeric displays are primarily for quick reference points. + +While those visual metrics are useful, they can still be clicked, and used to navigate to +specific event-related pages to modify and/or perform any desired actions. + +Beneath the smart buttons is the event form, which contains various fields and clickable tabs that +serve to configure the initial, necessary details of the event. + +The following are fields found on an event form: + +- {guilabel}`Event Name`: the title of the event. This field is **required**. + + :::{note} + To the right of the entered {guilabel}`Event Name`, there is a language tooltip, represented by + an abbreviated language indicator (e.g. `EN`). When clicked, a {guilabel}`Translate: name` + pop-up window appears, displaying various pre-configured language translation options available + in the database. + ::: + +- {guilabel}`Date`: when the event is scheduled to take place (expressed in your local timezone). + This field is auto-populated, but modifiable, and is **required**. + +- {guilabel}`Display Timezone`: the timezone in which the event dates/times will be displayed on the + website. This field is auto-populated, but modifiable, and is **required**. + +- {guilabel}`Language`: designate a specific language for all event communications to be translated + into, if necessary. This field is blank, by default, so if event-related communications are being + sent to recipients who speak a different language, be sure to configure this field properly. + +- {guilabel}`Twitter Wall`: creates a separate page on the event website to feature specific social + posts on X (formerly Twitter) that contain pre-determined desired elements. + + :::{tip} + To create and customize a {guilabel}`Twitter Wall`, type the name of the desired wall into the + field, and select {guilabel}`Create and edit...` from the resulting drop-down menu. + + Doing so reveals {guilabel}`Create Twitter Wall` pop-up window. + + ```{image} create_events/twitter-wall-popup.png + :align: center + :alt: The Twitter Wall pop-up window in the Odoo Events application. + ``` + + From this window, enter a {guilabel}`Wall Name`. Then, select a certain word or hashtag for + Odoo to search for on X, like `#WoodWorkingExpo24`, for example. + + Next, determine the {guilabel}`Type of tweets` Odoo should showcase with that predetermined + criteria. The choices in this field are: {guilabel}`Recent`, {guilabel}`Popular`, or + {guilabel}`Mixed`. + + Users also have the option to add a brief {guilabel}`Description` to the wall, as well. + + Lastly, the greyed-out, non-modifiable {guilabel}`Website URL` field will autopopulate with the + full URL needed to access the document through the event website. + + An image can also be added to the wall by clicking the {icon}`fa-pencil` {guilabel}`(pencil)` + icon that appears when the cursor hovers over the {guilabel}`(camera)` placeholder image in the + upper-right corner of the pop-up window. + + Then, from the resulting file explorer window, select the desired image to be added to the + wall. + + This {guilabel}`Twitter Wall` field **only** appears on the event form if the *Social + Marketing* app is installed, and an X account has been added as a stream on the application. To + learn more, check out the {doc}`Social Marketing <../social_marketing>` documentation. + ::: + +- {guilabel}`Template`: choose a pre-configured event template from the resulting drop-down menu. + + Or, create a new one directly from this field, by typing in the name of the new template, and + selecting either: + + - {guilabel}`Create` (which creates the template, and can be edited later) or + - {guilabel}`Create and edit...` (which creates the template, and reveals a separate template page + to configure the template in greater detail). + +- {guilabel}`Tags`: add any corresponding tags to briefly describe the event (e.g. `Online`, + `Conference`, etc.). Multiple tags can be added per event. + + :::{tip} + Tags can be displayed on events that are listed on the website by enabling the *Show on + Website* checkbox from {menuselection}`Events app --> Configuration --> Event Tag Categories`. + ::: + +- {guilabel}`Organizer`: designate the organizer of the event (a company, contact, or employee). + +- {guilabel}`Responsible`: designate a user in the database to be responsible for this event. + +- {guilabel}`Company`: designate which company in the database to which this event is related. This + field **only** appears if working in a multi-company environment. This field is auto-populated, + but modifiable, and is **required**. + +- {guilabel}`Website`: choose to restrict the publishing of this event to a specific website created + in Odoo. If this field is left blank, the event can be published on *all* websites in the + database. To learn more, refer to the {doc}`Multiple websites + <../../websites/website/configuration/multi_website>` documentation. + +- {guilabel}`Venue`: enter event venue details. This field pulls pertinent information from the + *Contacts* application. Alternatively, {guilabel}`Venue` information can be manually added in this + field, as well. At the very least, there **must** be a venue name, address, city, zip code/region, + and country entered. + +- {guilabel}`Exhibition Map`: if desired, click the {guilabel}`Upload your file` button to upload an + image of the event venue map. + +- {guilabel}`Limit Registrations`: if this checkbox is ticked, a limit to the amount of + registrations is added to the event, and that desired limit amount **must** be entered in the + blank field before {guilabel}`Attendees`. + +- {guilabel}`Badge Dimension`: select a desired paper format dimension for event badges. The options + are: {guilabel}`A4 foldable`, {guilabel}`A6`, or {guilabel}`4 per sheet`. + +- {guilabel}`Badge Background`: if desired, click the {guilabel}`Upload your file` button to upload + a custom background image for event badges. + +When the above fields in the event form have been adequately filled in, move on to the four tabs at +the bottom of the event form for further customization. + +Those tabs are: {ref}`Tickets `, {ref}`Communication +`, {ref}`Questions `, and {ref}`Notes +`. + +(events-event-tickets)= + +### Tickets tab + +Create custom tickets (and ticket tiers) for events in the {guilabel}`Tickets` tab of an event form. + +```{image} create_events/tickets-tab.png +:align: center +:alt: A typical tickets tab on an event form in the Odoo Events application. +``` + +To create a ticket, click {guilabel}`Add a line` in the {guilabel}`Tickets` tab. Then, enter a name +for the ticket (e.g. `Basic Ticket` or `VIP`) in the {guilabel}`Name` field. + +In the {guilabel}`Product` field, either select the pre-configured {guilabel}`Event Registration` +product, or create a new one by typing in the name of the new event registration product, and then +select either {guilabel}`Create` or {guilabel}`Create and edit...` from the resulting drop-down +menu. + +:::{important} +Upon installing Odoo *Events*, a new product type, *Event Ticket*, becomes available on product +forms ({menuselection}`Sales --> Products --> Products`). In order for an event registration +product to be selectable in the *Tickets* tab, the event registration {guilabel}`Product Type` +**must** be set to {guilabel}`Event Ticket`. +::: + +:::{tip} +Existing event registration products can be modified directly from this field, as well, by +clicking the {icon}`oi-arrow-right` {guilabel}`(right arrow)` icon, located beside the event +registration product. Doing so reveals that product's form. If the *Inventory* application is +installed, additional choices are available to customize for the product. +::: + +Next, set the registration cost of the ticket in the {guilabel}`Price` field. + +:::{note} +The *Sales Price* defined on the event registration product's product form sets the default cost +of a ticket. Modifying the {guilabel}`Price` of a ticket in the {guilabel}`Tickets` tab, sets a +new registration cost of the ticket for that event. +::: + +Next, determine a {guilabel}`Sales Start` and {guilabel}`Sales End` date in their respective fields. +To do that, click into the blank field to reveal a calendar popover. From there, select the desired +date and time, then click {icon}`fa-check` {guilabel}`Apply`. + +Then, if desired, designate a {guilabel}`Maximum` amount of that specific ticket that can be sold. + +The {guilabel}`Taken` column populates with the number of tickets that are sold. + +Optionally, in the {guilabel}`Color` column, add a custom color to differentiate ticket badges. The +selected color displays on ticket badges when printed. + +To delete any tickets from the {guilabel}`Tickets` tab, click the {icon}`fa-trash-o` +{guilabel}`(trash can)` icon on the corresponding line for the ticket that should be deleted. + +:::{tip} +To add an optional {guilabel}`Description` column to the {guilabel}`Tickets` tab, click the +{icon}`oi-settings-adjust` {guilabel}`(additional options)` drop-down menu, located to the +far-right of the column titles. + +Then, tick the checkbox beside {guilabel}`Description` from the resulting drop-down menu. + +When added, the option to add brief descriptions for each event ticket appears, which can be used +to inform attendees of any perks or amenities that may coincide with specific ticket purchases. +::: + +(events-event-communication)= + +### Communication tab + +In the {guilabel}`Communication` tab of an event form, create various marketing communications that +can be scheduled to be sent at specific intervals leading up to, and following, the event. + +```{image} create_events/communication-tab.png +:align: center +:alt: Typical communication tab on an event form in the Odoo Events application. +``` + +:::{note} +By default, Odoo provides three separate pre-configured communications on every new event form. +One is an email sent after each registration to confirm the purchase with the attendee. The other +two are email event reminders that are scheduled to be sent at different time intervals leading +up to the event to remind the recipient of the upcoming event. +::: + +To add a communication in the {guilabel}`Communication` tab, click {guilabel}`Add a line`. Then, +select the desired type of communication in the {guilabel}`Send` field. The options are: +{guilabel}`Mail`, {guilabel}`SMS`, {guilabel}`Social Post`, or {guilabel}`WhatsApp`. + +There is no limit to the number of communications that can be added in the {guilabel}`Communication` +tab of an event form. + +To delete a communication from the {guilabel}`Communication` tab, click the {icon}`fa-trash-o` +{guilabel}`(trash can)` icon on the corresponding communication line. Doing so removes the +communication from the event entirely. + +:::{important} +The {guilabel}`Social Post` option **only** appears if the *Social Marketing* application is +installed. The {guilabel}`WhatsApp` option **only** appears if the *WhatsApp Integration* module +is installed. + +{doc}`WhatsApp <../../productivity/whatsapp>` templates **cannot** be edited during active +configuration. A separate approval from *Meta* is required. +::: + +#### Mail + +Select an existing email template from the {guilabel}`Template` drop-down menu. + +Next, define the {guilabel}`Interval`, {guilabel}`Unit`, and {guilabel}`Trigger` from their +respective drop-down fields, letting Odoo know when the communication should be sent. + +The {guilabel}`Unit` options are: {guilabel}`Immediately`, {guilabel}`Hours`, {guilabel}`Days`, +{guilabel}`Weeks`, and {guilabel}`Months`. + +Then, select an option from the {guilabel}`Trigger` drop-down menu. The options are: +{guilabel}`After each registration`, {guilabel}`Before the event`, and {guilabel}`After the event`. + +The {guilabel}`Sent` column populates with the number of sent communications. And, beside the +number are different icons that appear, depending on the status of that particular communication. + +The status of *Running* is represented by a {icon}`fa-cogs` {guilabel}`(three gears)` icon. The +status of *Sent* is represented by a {icon}`fa-check` {guilabel}`(checkmark)` icon. And, the status +of *Scheduled* is represented by an {icon}`fa-hourglass-half` {guilabel}`(hourglass)` icon. + +```{eval-rst} +.. example:: + To send a confirmation email an hour after an attendee registers for an event, configure the + following communication: + + - :guilabel:`Interval`: `1` + - :guilabel:`Unit`: :guilabel:`Hours` + - :guilabel:`Trigger`: :guilabel:`After each registration` +``` + +:::{note} +Existing email templates can be modified directly from the {guilabel}`Template` drop-down menu, +if necessary, by clicking the {icon}`oi-arrow-right` {guilabel}`(right arrow)` icon next to the +template name. Doing so reveals a separate page where users can edit the {guilabel}`Content`, +{guilabel}`Email Configuration`, and {guilabel}`Settings` of that particular email template. + +To view and manage all email templates, activate {ref}`developer-mode` and navigate to +{menuselection}`Settings --> Technical --> Email: Email Templates`. Modify with caution as email +templates effect all communications where the template is used. +::: + +(events-event-questions)= + +### Questions tab + +In the {guilabel}`Questions` tab of an event form, users can create brief questionnaires for +registrants to interact with, and respond to, after they register for the event. + +These questions can be focused on gathering basic information about the attendee, learning about +their preferences, expectations, and other things of that nature. This information can also be used +to create more detailed reporting metrics, in addition to being utilized to create specific lead +generation rules. + +```{image} create_events/questions-tab.png +:align: center +:alt: Typical questions tab on an event form in the Odoo Events application. +``` + +:::{note} +By default, Odoo provides three questions in the {guilabel}`Questions` tab for every event form. +The default questions require the registrant(s) to provide their {guilabel}`Name` and +{guilabel}`Email`, and make it optional to include their {guilabel}`Phone` number, as well. + +The information gathered from the {guilabel}`Questions` tab can be found on the +{guilabel}`Attendees` dashboard, accessible via the {icon}`fa-users` {guilabel}`Attendees` smart +button. Odoo populates individual records that contain basic information about the registrant(s), +as well as their preferences. +::: + +To add a question in the {guilabel}`Questions` tab, click {guilabel}`Add a line`. Doing so reveals a +{guilabel}`Create Question` pop-up window. From here, users can create and configure their question. + +```{image} create_events/create-question-popup.png +:align: center +:alt: The Create Question pop-up window that appears in the Odoo Events application. +``` + +First, enter the question in the field at the top of the form. Then, decide if the question should +require a {guilabel}`Mandatory Answer` and/or if Odoo should {guilabel}`Ask once per order`, by +ticking their respective boxes, if desired. + +If the {guilabel}`Ask once per order` checkbox is ticked, the question will only be asked once, and +its value is propogated to every attendee in the order (if multiple tickets are purchased at once). +If the checkbox is *not* ticked for this setting, Odoo will present the question for every attendee +that is connected to that registration. + +Next, select a {guilabel}`Question Type` option: + +- {guilabel}`Selection`: provide answer options to the question for registrants to choose from. + Selectable answer options can be managed in the {guilabel}`Answers` column at the bottom of the + pop-up window. +- {guilabel}`Text Input`: lets the users enter a custom response to the question in a text field. +- {guilabel}`Name`: provides registrants with a field for them to enter their name. +- {guilabel}`Email`: provides registrants with a field for them to enter their email address. +- {guilabel}`Phone`: provides registrants with a field for them to enter their phone number. +- {guilabel}`Company`: provides registrants with a field for them to enter a company they are + associated with. + +Once all the desired configurations have been entered, either click {guilabel}`Save & Close` to save +the question, and return to the {guilabel}`Questions` tab on the event form, or click +{guilabel}`Save & New` to save the question and immediately create a new question on a new +{guilabel}`Create Question` pop-up window. + +As questions are added to the {guilabel}`Questions` tab, the informative columns showcase the +configurations of each question. + +The informative columns are the following: + +- {guilabel}`Title` +- {guilabel}`Mandatory` +- {guilabel}`Once per Order` +- {guilabel}`Type` +- {guilabel}`Answers` (if applicable) + +For {guilabel}`Selection` and {guilabel}`Text Input` types, a {icon}`fa-bar-chart` {guilabel}`Stats` +button appears on the right side of the question line. When clicked, Odoo reveals a separate page, +showcasing the response metrics to that specific question. + +To delete any question from the {guilabel}`Questions` tab, click the {icon}`fa-trash-o` +{guilabel}`(trash can)` icon on the corresponding question line. + +There is no limit to the number of questions that can be added in the {guilabel}`Questions` tab of +an event form. + +(events-event-notes)= + +### Notes tab + +In the {guilabel}`Notes` tab of an event form, users can leave detailed internal notes and/or +event-related instructions/information for attendees. + +```{image} create_events/notes-tab.png +:align: center +:alt: Typical notes tab on an event form in the Odoo Events application. +``` + +In the {guilabel}`Note` field of the {guilabel}`Notes` tab, users can leave internal notes for other +event employees, like "to-do" lists, contact information, instructions, and so on. + +In the {guilabel}`Ticket Instructions` field of the {guilabel}`Notes` tab, users can leave specific +instructions for people attending the event that appear on the attendees ticket. + +## Publish events + +Once all configurations and modifications are complete on the event form, it is time to publish the +event on the website. Doing so makes the event visible to website visitors, and makes it possible +for people to register for the event. + +To publish an event after all the customizations are complete, click the {icon}`fa-globe` +{guilabel}`Go to Website` smart button at the top of the event form. Doing so reveals the event's +web page, which can be customized like any other web page on the site, via the {guilabel}`Edit` +button. + +To learn more about website design functionality and options, consult the {doc}`Building block +<../../websites/website/web_design/building_blocks>` documentation. + +Once the event website is ready to be shared, click the red {guilabel}`Unpublished` toggle switch +in the header menu, changing it to a green {guilabel}`Published` switch. At this point, the event +web page is published, and viewable/accessible by all website visitors. + +## Send event invites + +To send event invites to potential attendees, navigate to the desired event form, via +{menuselection}`Events app --> Events`, and click into the desired event. Following this, click the +{guilabel}`Invite` button in the upper-left corner of the event form. + +Doing so reveals a blank email form to fill out, as desired. To learn more about how to create and +customize emails like this, refer to the {ref}`Create an email ` +documentation. + +Proceed to create and customize an email message to send as an invite to potential attendees. +Remember to include a link to the registration page on the event website, allowing interested +recipients to quickly register. + +:::{tip} +Sending emails from Odoo is subject to a daily limit, which, by default, is 200. To learn more +about daily limits, visit the {ref}`email-issues-outgoing-delivery-failure-messages-limit` documentation. +::: + +:::{seealso} +{doc}`track_manage_talks` +::: + diff --git a/content/applications/marketing/events/event_booths.md b/content/applications/marketing/events/event_booths.md new file mode 100644 index 000000000..2a7aeb41d --- /dev/null +++ b/content/applications/marketing/events/event_booths.md @@ -0,0 +1,279 @@ +# Event booths + +The Odoo *Events* application provides users with the ability to create event booths, sell their +availability, and manage their reservations. + +## Configuration + +In order to create, sell, and manage booths for events, the *Booth Management* feature must be +activated. + +To do that, navigate to {menuselection}`Events app --> Configuration --> Settings`, and tick the +{guilabel}`Booth Management` checkbox. Then, click {guilabel}`Save`. + +```{image} event_booths/booth-management-setting.png +:align: center +:alt: The Booth Management setting in the Odoo Events application. +``` + +:::{important} +When the {guilabel}`Booth Management` setting is activated, a new {doc}`Product Type +<../../inventory_and_mrp/inventory/product_management/configure/type>` becomes available on all +product forms: *Event Booth*. + +This is important because every created booth **must** be assigned a *Booth Category* on their +respective booth form, and every booth category **must** have an *Event Booth* product assigned +to it. +::: + +## Booth categories + +With the *Booth Management* setting activated in the *Events* app, the *Booth Categories* option +appears in the {guilabel}`Configuration` menu. + +To access the {guilabel}`Booth Category` dashboard, go to {menuselection}`Events app --> +Configuration --> Booth Categories`, which reveals a list of all created booth categories. + +```{image} event_booths/booth-category-page.png +:align: center +:alt: The Booth Category page in the Odoo Events application. +``` + +On the {guilabel}`Booth Category` page, the following information for each booth category is listed: + +- {guilabel}`Name`: the name of the booth category. +- {guilabel}`Create Sponsor`: if checked, booking this booth category creates a sponsor for the + user. +- {guilabel}`Product`: the *Event Booth* product associated with that specific booth category. +- {guilabel}`Price`: the price of a booth in that booth category. + +When the {icon}`oi-settings-adjust` {guilabel}`(settings)` icon, located to the far-right of the +column titles, is clicked, a drop-down menu of additional column options appears. From the resulting +drop-down menu, tick the checkbox beside {guilabel}`Sponsor Level` and/or {guilabel}`Sponsor Type` +to reveal those columns on the {guilabel}`Booth Category` page. + +To edit an existing booth category, select it from the list, and proceed to make any desired +modifications from the event category form. + +### Create booth category + +To create a booth category from the {guilabel}`Booth Category` page, click the {guilabel}`New` +button in the upper-left corner to reveal a blank booth category form. + +```{image} event_booths/booth-category-form.png +:align: center +:alt: A typical booth category form in the Odoo Events application. +``` + +Start by entering a name for the booth category in the top {guilabel}`Booth Category` field. This is +a **requried** field. + +To add a corresponding image to the booth category (e.g. a sample photo of how the booth looks), +click the {icon}`fa-pencil` {guilabel}`(pencil)` icon that appears when the cursor hovers over the +camera placeholder in the upper-right corner of the booth category form. When clicked, proceed to +upload the desired image to the booth category form, if needed. + +In the {guilabel}`Booth Details` section, users **must** assign a {guilabel}`Product` to the +category, and it **must** have *Event Booth* set as the *Product Type* on the product form. + +And, regardless of the listed price on the *Event Booth* product chosen, the user can input a custom +{guilabel}`Price` to be applied for this booth category in the field below. + +In the {guilabel}`Sponsorship` section, there is a {guilabel}`Create Sponsor` checkbox option. With +that checkbox ticked, whenever a booth belonging to this category is booked, the user is created as +an official *Sponsor* of the event. + +When the {guilabel}`Create Sponsor` checkbox is ticked, two additional fields appear beneath it: +{guilabel}`Sponsor Level` and {guilabel}`Sponsor Type`. + +:::{note} +{guilabel}`Sponsor Level` and {guilabel}`Sponsor Type` are purely to distinguish different +distinctions of sponsors. For example, if a sponsor has been attached to a company for multiple +years, they would be granted a higher level (e.g. *Gold* level), which provides them with +immediate credability and status. Whereas, conversely, a relatively new sponsor would be granted +a lower level (e.g. *Bronze* level), which coincides with its own credability and status. +::: + +Select a desired level of sponsorship from the {guilabel}`Sponsor Level` drop-down field. + +:::{tip} +To modify any existing {guilabel}`Sponsor Level`, select it from the drop-down field, then click +the {icon}`fa-arrow-right` {guilabel}`(right arrow)` that appears at the end of the line. Doing +so opens a separate page, wherein the {guilabel}`Sponsor Level` name and {guilabel}`Ribbon Style` +can be changed, if necessary. +::: + +Users can also create a new {guilabel}`Sponsor Level`, by typing in the name of the new level, and +clicking {guilabel}`Create and edit...` from the resulting drop-down menu. + +:::{note} +Clicking {guilabel}`Create` from the resulting drop-down menu in this instance creates the +sponsor level, but doesn't immediately prompt the user to further configure it, via a +{guilabel}`Create Sponsor Level` pop-up window. +::: + +Doing so reveals a {guilabel}`Create Sponsor Level` pop-up window. + +```{image} event_booths/create-sponsor-level-popup.png +:align: center +:alt: The Create Sponsor Level pop-up window that appears in the Odoo Events application. +``` + +From this pop-up window, confirm the newly-created {guilabel}`Sponsor Level`, and decide what kind +of {guilabel}`Ribbon Style` should be applied, if any. The {guilabel}`Ribbon Style` options +available in that drop-down field are: {guilabel}`No Ribbon`, {guilabel}`Gold`, {guilabel}`Silver`, +and {guilabel}`Bronze`. + +If one is selected, that {guilabel}`Ribbon Style` appears with the sponsor's name on the event +website. + +On the booth category form, beneath those sections ({guilabel}`Booth Details` and +{guilabel}`Sponsorship`), there is the {guilabel}`Description` tab. In this tab, proceed to enter +any vital information related to the booth category that would be important for any potential +booth-buyer to know about (e.g., the square footage, any amenities, size of display screen, etc.). + +## Add booth to an event + +In order to add a booth to an event, navigate to an existing event form, via {menuselection}`Events +app --> Events`, and select the desired event from the {guilabel}`Events` dashboard. Or, click +{guilabel}`New` to open a blank event form. + +From the event form, to access the *Booths* for that specific event, click the {guilabel}`Booths` +smart button at the top of the page. + +The {guilabel}`Booths` page is displayed in a Kanban view, by default, with two different stages: +{guilabel}`Available` and {guilabel}`Unavailable`. + +:::{note} +The {guilabel}`Booths` page of an event is also viewable in a {icon}`oi-view-list` +{guilabel}`List` view, {icon}`fa-area-chart` {guilabel}`Graph` view, and {icon}`oi-view-pivot` +{guilabel}`Pivot` view. All of which are accessible, via their icons, in the upper-right corner +of the {guilabel}`Booths` page. +::: + +The booths present in the {guilabel}`Available` stage are still available for people to purchase for +the event. The booths present in the {guilabel}`Unavailable` stage have already been purchased, and +are no longer available. + +To modify any existing booth, simply click the desired booth from the {guilabel}`Booths` page, and +proceed to make any necessary changes from the booth form. Or, create a new one, by clicking the +{guilabel}`New` button in the upper-left corner to reveal a blank booth form. + +### Booth form + +The booth form in Odoo *Events* lets users customize and configure event booths in a number of +different ways. + +```{image} event_booths/booth-form.png +:align: center +:alt: Typical booth form in the Odoo Events application. +``` + +Start by typing in a {guilabel}`Name` for the booth. This is a **required** field. + +Then, apply a {guilabel}`Booth Category` to the booth. This is a **required** field. + +:::{tip} +A new {guilabel}`Booth Category` can be created from this field, by typing in the name of the +new category, and clicking {guilabel}`Create and edit...` from the resulting drop-down menu. +Doing so reveals a {guilabel}`Create Booth Category` pop-up window, with all the standard fields +found on a common booth category form. + +Simply clicking {guilabel}`Create` from the resulting drop-down menu creates the category, but +does not reveal the {guilabel}`Create Booth Category` pop-up window. The category would have to +be modified later, via the *Booth Categories* page ({menuselection}`Events app --> Configuration +--> Booth Categories`). +::: + +Upon selecting a pre-existing {guilabel}`Booth Category`, two additional, non-modifiable fields +appear: {guilabel}`Product` and {guilabel}`Price`. Both fields represent their respective selections +for that specific booth category. + +When a person purchases a booth rental through the event website, the subsequent renter-related +fields on the form auto-populate, based on the information provided by the purchaser during the +online transaction. The booth also automatically changes its status from *Available* to +*Unavailable*. + +However, if the rental of a booth is conducted in any other way (e.g., in person, via sales order, +etc.), the {guilabel}`Renter`, {guilabel}`Renter Name`, {guilabel}`Renter Email`, and +{guilabel}`Renter Phone` fields can be entered in manually. + +The status of the booth ({guilabel}`Available` or {guilabel}`Unavailable`) can also be changed +manually, either by clicking the appropriate status from the status bar present on the booth form, +or by dragging-and-dropping the desired booth into the appropriate stage, via the *Booths* page +Kanban view. + +## Sell event booths + +With event booths configured on the event form, via the event-specific *Booths* pages, Odoo presents +them on the event website, via the *Get A Booth* event subheader link. + +To access the *Get A Booth* page on the event website, open the {menuselection}`Events app`, and +select the desired event from the {guilabel}`Events` dashboard. From the event form, click the +{guilabel}`Go to Website` smart button to be taken to the Odoo-built event website. + +If the event subheader menu (with the {guilabel}`Get A Booth` option) is *not* showing up on the +event website, there are two ways to make it appear. + +While on the event website, enter the edit mode by clicking the {guilabel}`Edit` button in the +upper-right corner. Then, click into the {guilabel}`Customize` tab of the resulting sidebar of web +design tools. + +In the {guilabel}`Customize` tab, click the toggle switch for {guilabel}`Sub-Menu (Specific)`, and +click {guilabel}`Save`. Doing so reveals the event subheader menu with various options. + +Alternatively, enter {doc}`Debug mode <../../general/developer_mode>`, and open the specific event +form in the the *Events* application. + +On the event form, with *Debug mode* on, an array of subheader menu options appears. Tick the +checkbox for {guilabel}`Website Submenu`, in order for the submenu to appear on the event website. +Doing so also ticks every other submenu-related checkbox automatically. + +At this point, proceed to choose which options to keep on the event subheader menu. In this case, +make sure the {guilabel}`Booth Register` checkbox is ticked. + +From there, click the {guilabel}`Get A Booth` event subheader menu option. Doing so reveals the +{guilabel}`Get A Booth` page, showcasing all the configured event booths that were created on the +event form. + +```{image} event_booths/get-a-booth-page.png +:align: center +:alt: Typical Get A Booth page on the event website via the Odoo Events app. +``` + +From here, the visitor can select their desired booth option, then {guilabel}`Location`. Next, they +would click the {guilabel}`Book my Booth(s)` button, located at the bottom of the {guilabel}`Get A +Booth` page. + +Doing so reveals a {guilabel}`Contact Details` page, wherein they fill out either *Contact Details* +or *Sponsor Details*, depending on how the booth was configured on the event form. The fields +present on this form vary, depending on whether its meant for a basic contact or an event sponsor. + +:::{note} +If the selected booth has the *Create Sponsor* checkbox ticked, this page reads as *Sponsor +Details*. +::: + +The information provided on this details page is used to auto-populate the renter-related +information on the booth form on the event form in the *Events* application. + +Once the necessary information has been entered, the visitor then clicks the {guilabel}`Go to +Payment` at the bottom of the page, and proceeds to complete the typical checkout process. + +Upon a successful payment confirmation, that selected booth automatically moves to the *Unavailable* +stage on the event-specific *Booths* page in the *Events* application (accessible via the *Booths* +smart button on the event form). + +Also, the provided *Sponsor* information (if applicable) and *Sales Order* information are +accessible from the specific event form, via their respective smart buttons that appear at the top +of the form. + +:::{note} +Click the *Sponsors* smart button to modify any information about the sponsor, if necessary. +::: + +:::{seealso} +- {doc}`create_events` +- {doc}`sell_tickets` +::: + diff --git a/content/applications/marketing/events/event_templates.md b/content/applications/marketing/events/event_templates.md new file mode 100644 index 000000000..53d2025ea --- /dev/null +++ b/content/applications/marketing/events/event_templates.md @@ -0,0 +1,229 @@ +# Event templates + +The Odoo *Events* application provides the ability to customize and configure event templates, which +can be used to expedite the event-creation process. + +These templates can be created and personalized in the application, and then selected from an event +form, in order to quickly apply a series of settings and elements to the new event, all of which can +be further modified, if needed. + +## Event templates page + +In the Odoo *Events* application, event templates can quickly be created and modified. + +To begin, navigate to {menuselection}`Events app --> Configuration --> Event Templates`. Doing so +reveals the {guilabel}`Event Templates` page. Here, find all the existing event templates in the +database. + +```{image} event_templates/event-templates-page.png +:align: center +:alt: The Event Templates page in the Odoo Events application. +``` + +By default, Odoo provides three pre-configured event templates: {guilabel}`Exhibition`, +{guilabel}`Training`, and {guilabel}`Sport`, which all have their own unique customizations applied +to them. + +To change how these event templates appear on the *Template* drop-down field on an event form, +drag-and-drop them into any desired order, using the {icon}`oi-draggable` {guilabel}`(draggable)` +icon, located to the left of each event template line on the {guilabel}`Event Templates` page. + +:::{seealso} +To learn more about event forms, refer to the {doc}`create_events` documentation. +::: + +## Create event template + +There are two ways to create and configure an event template in Odoo *Events*. + +1. **On the dashboard**, by navigating to {menuselection}`Events app --> Configuration --> Event + Templates` and clicking the {guilabel}`New` button in the upper-left corner. Doing so reveals a + blank event template form that can be customized in a number of different ways. +2. **On an event form itself**. Start by typing the name of a new event template in the *Template* + field, and click {guilabel}`Create and edit...` from the resulting drop-down menu. Doing so + reveals a *Create Template* pop-up window, featuring all the same configurable fields and + elements found on a standard event template form. + +:::{note} +Clicking {guilabel}`Create "[template name]"` from the resulting drop-down menu, via the +*Template* field on an event form creates the event template in the database, but does **not** +present the user with the *Create Template* pop-up window. + +The event template would have to be modified, by selecting it on the *Event Templates* page +({menuselection}`Events app --> Configuration --> Event Templates`). +::: + +### Event template form + +All the fields on a standard {guilabel}`Event Template` form are *also* on the *Create Template* +pop-up window, accessible via the *Template* field on an event form. + +```{image} event_templates/event-template-form.png +:align: center +:alt: A standard event template form in the Odoo Events application. +``` + +Start by providing the event template with a name in the {guilabel}`Event Template` field, located +at the top of the form. + +Beneath that field, there is a series of selectable checkboxes, all of which are related to how the +event menu will be displayed on the event web page. + +- {guilabel}`Website Submenu`: enables a submenu on the event's website. When this checkbox is + ticked, every other checkbox in this series is automatically ticked, as well. Then, choose to + untick (deselect) any of the checkbox options, as desired. + +- {guilabel}`Tracks Menu Item`: adds a submenu item to navigate to a page displaying all planned + tracks for the event. + +- {guilabel}`Track Proposals Menu Item`: adds a submenu item to navigate to a page, in which + visitors can fill out a form to propose a track (talk, lecture, presentation, etc.) to happen + during the event. + +- {guilabel}`Booth Menu Item`: adds a submenu item that takes visitors to a separate page, where an + event booth can be purchased. Event booths can be customized and configured in the + {guilabel}`Booths` tab of the event template form, from the *Booth Categories* page + ({menuselection}`Events app --> Configuration --> Booth Categories`). + + :::{important} + First, users **must** create a booth product with the required *Event Booth* option set as the + {guilabel}`Product Type` on the product form. + ::: + +- {guilabel}`Exhibitors Menu Item`: adds a submenu item that takes visitors to a separate page, + showcasing all the exhibitors related to that specific event. Icons representing those exhibitors + are also found on the footer of every event-specific web page, as well. + +- {guilabel}`Community`: adds a submenu item allowing attendees to access pre-configured virtual + community rooms to meet with other attendees, and discuss various topics related to the event. + When this checkbox is ticked, the {guilabel}`Allow Room Creation` feature becomes available. + +- {guilabel}`Allow Room Creation`: allow visitors to create community rooms of their own. + +- {guilabel}`Register Button`: adds a button at the end of the event submenu that takes visitors to + the event-specific registration page when clicked. + +Once the desired checkboxes have been ticked, select an appropriate {guilabel}`Timezone` for the +event from the available drop-down menu. + +Then, for organizational purposes, there is the option to add {guilabel}`Tags` to this event +template. + +There is also the option to {guilabel}`Limit Registrations` to this specific event template by +ticking that checkbox. If ticked, proceed to enter the number of {guilabel}`Attendees` this template +should be limited to. + +Beneath those general information fields at the top of the event template form, there are five tabs: + +- {ref}`Tickets ` +- {ref}`Communication ` +- {ref}`Booths ` +- {ref}`Questions ` +- {ref}`Notes ` + +(event-templates-event-template-booths)= + +#### Booths tab + +The {guilabel}`Booths` tab on an event template form is the only tab that differentiates itself from +a standard event form, where the other tabs ({guilabel}`Tickets`, {guilabel}`Communication`, +{guilabel}`Questions`, and {guilabel}`Notes`) are present and configured using the same process. For +more information about those tabs, refer to the {doc}`create_events` documentation. + +:::{important} +To create a booth or booth category, an event booth product **must** be created in the database +first, with the *Product Type* set to *Event Booth*. **Only** products with that specific +configuration can be selected in the required *Product* field of a booth or booth category form. +::: + +:::{note} +Event booths can be created and customized in two ways in the Odoo *Events* application. Either +in the {guilabel}`Booths` tab of an event template form, or by navigating to +{menuselection}`Events app --> Configuration --> Booth Categories`, and click {guilabel}`New`. +::: + +To add a booth from the {guilabel}`Booths` tab of an event template form, click {guilabel}`Add a +line`. Doing so reveals a blank {guilabel}`Create Booths` pop-up window. + +```{image} event_templates/create-booths-popup.png +:align: center +:alt: A Create Booths pop-up window in the Odoo Events application. +``` + +Start by providing a {guilabel}`Name` for this booth in the corresponding field at the top of the +pop-up window. + +Then, select an appropriate {guilabel}`Booth Category` from the drop-down field below. Booth +categories can be created and modified from the *Booth Categories* page in the *Events* application, +which is accessible by navigating to {menuselection}`Events app --> Configuration --> Booth +Categories`. + +:::{tip} +A {guilabel}`Booth Category` can be created directly from this field on the {guilabel}`Create +Booths` pop-up window. To accomplish that, type the name of the new booth category in the +{guilabel}`Booth Category` field, and select either {guilabel}`Create` or {guilabel}`Create and +edit...` from the resulting drop-down menu. + +Clicking {guilabel}`Create` merely creates the category, which can (and should be) customized at +a later date. Clicking {guilabel}`Create and edit...` reveals a new {guilabel}`Create Booth +Category` pop-up window, from which the category can be configured in a number of different ways. + +```{image} event_templates/create-booth-category-popup.png +:align: center +:alt: The Create Booth Category pop-up window in the Odoo Events application. +``` + +From this pop-up window, proceed to name the {guilabel}`Booth Category`, modify its +{guilabel}`Booth Details` settings, configure its {guilabel}`Sponsorship` options (if +applicable), and leave an optional {guilabel}`Description` to explain any pertinent details +related to this specific category of booths. + +There is also the option to add a photo/visual representation of the booth category, via the +{guilabel}`(camera)` icon in the upper-right corner. + +When all desired configurations are complete, click the {guilabel}`Save & Close` button. + +The same configurations and options are available by navigating to {menuselection}`Events app --> +Configuration --> Booth Categories`, and clicking {guilabel}`New`. +::: + +Once the desired {guilabel}`Booth Category` is selected, the remaining fields on the +{guilabel}`Create Booths` pop-up window ({guilabel}`Currency`, {guilabel}`Product`, and +{guilabel}`Price`) autopopulate, based on information configured for that selected {guilabel}`Booth +Category`. + +:::{note} +These fields **cannot** be modified from the {guilabel}`Create Booths` pop-up window. They can +only be modified from the specific booth category form page. +::: + +When all desired configurations are complete, click {guilabel}`Save & Close` to save the booth, and +return to the event template form. Or, click {guilabel}`Save & New` to save the booth, and start +creating another booth on a fresh {guilabel}`Create Booths` pop-up window. Click {guilabel}`Discard` +to remove all changes, and return to the event template form. + +Once the booth has been saved, it appears in the {guilabel}`Booths` tab on the event template form. + +## Use event templates + +Once an event template is complete, it is accessible on all event forms in the Odoo *Events* +application. + +To use an event template, navigate to the {menuselection}`Events app` and click {guilabel}`New` to +open a new event form. + +From the event form, click the {guilabel}`Template` field to reveal all the existing event templates +in the database. They appear in the same order as they are listed in on the *Event Templates* page +({menuselection}`Events app --> Configuration --> Event Templates`). + +Select the desired event template from the {guilabel}`Template` drop-down field on the event form. +Pre-configured settings automatically populate the event form, saving time during the event creation +process. + +Any of these pre-configured settings related to the selected event template chosen in the +{guilabel}`Template` field on an event form can be modified, as desired. + +:::{seealso} +{doc}`create_events` +::: + diff --git a/content/applications/marketing/events/event_tracks.md b/content/applications/marketing/events/event_tracks.md new file mode 100644 index 000000000..bb7ca2a62 --- /dev/null +++ b/content/applications/marketing/events/event_tracks.md @@ -0,0 +1,319 @@ +# Event tracks + +Odoo *Events* provides the ability to create, schedule, and manage talks, lectures, demonstrations, +presentations, etc., which known as *Tracks* in Odoo. + +The Odoo *Events* application also has an option to allow event attendees to propose talks (tracks) +for an event, which can then be approved (or disapproved). + +## Configuration + +First, there are some settings that need to be enabled, in order to get the most out of event +tracks. + +To do that, navigate to {menuselection}`Events app --> Configuration --> Settings`, and tick the +checkbox beside the {guilabel}`Schedule & Tracks` setting. Doing so provides the ability to manage +and publish an event schedule with various tracks. + +Also, when that setting checkbox is ticked, two additional setting options appear beneath it: +{guilabel}`Live Broadcast` and {guilabel}`Event Gamification`. + +```{image} event_tracks/track-settings.png +:align: center +:alt: The Schedule and Tracks setting in the Odoo Events app, along with corresponding +: options. +``` + +The {guilabel}`Live Broadcast` option provides the ability to air tracks online through a *YouTube* +integration. + +The {guilabel}`Event Gamification` options provides the ability to share a quiz with track attendees +once the track is over, in order to test how much they learned. + +:::{note} +With the {guilabel}`Event Gamification` setting enabled, an {guilabel}`Add Quiz` button appears +on track forms, providing the ability to {ref}`quickly create a quiz ` +specific to the topic related to that particular track. +::: + +Once all desired settings have been enabled, be sure to click the {guilabel}`Save` button in the +upper-left corner of the {guilabel}`Settings` page. + +## Event Tracks page + +To access, modify, and/or create tracks for an event, first navigate to a preconfigured event, or +{doc}`create a new one ` from the *Events* application. + +To do that, navigate to {menuselection}`Events app`, and either select a pre-existing event from the +{guilabel}`Events` dashboard, or create a new one by clicking {guilabel}`New`. + +Once on the desired event form, click into the {guilabel}`Tracks` smart button at the top of the +form. + +:::{tip} +If the {guilabel}`Tracks` smart button is not readily available, click the {guilabel}`More` +{icon}`fa-sort-desc` drop-down menu to reveal hidden smart buttons. Then, click +{guilabel}`Tracks` from the resulting drop-down menu. +::: + +Clicking the {guilabel}`Tracks` smart button reveals the {guilabel}`Event Tracks` page for that +particular event, which presents all the tracks (both scheduled and proposed) for the event, if +there are any. + +```{image} event_tracks/event-tracks-page.png +:align: center +:alt: Typical event tracks page for an event in the Odoo Events application. +``` + +The tracks are presented in a default {icon}`oi-view-kanban` {guilabel}`(Kanban)` view, but there is +also the option to view these tracks in a {icon}`oi-view-list` {guilabel}`(List)`, +{icon}`oi-view-cohort` {guilabel}`(Gantt)` chart, {icon}`fa-calendar-check-o` +{guilabel}`(Calendar)`, {icon}`fa-area-chart` {guilabel}`(Graph)`, or {icon}`fa-clock-o` +{guilabel}`(Activity)` view. All of which are accessible in the upper-right corner of the +{guilabel}`Tracks` page. + +In the default {icon}`oi-view-kanban` {guilabel}`(Kanban)` view, the tracks are categorized into +different stages. The default stages are: {guilabel}`Proposal`, {guilabel}`Confirmed`, +{guilabel}`Announced`, {guilabel}`Published`, {guilabel}`Refused` (collapsed stage), and +{guilabel}`Cancelled` (collapsed stage). All of which can be edited, if needed. + +:::{tip} +To edit a stage, hover over the stage name, click the {icon}`fa-cog` {guilabel}`(Settings)` icon, +and select {guilabel}`Edit` from the resulting drop-down menu. +::: + +Clicking into a track from the {guilabel}`Event Tracks` page reveals the track form for that +particular track. + +### Create event track + +From the {guilabel}`Event Tracks` page, click {guilabel}`New` in the upper-left corner to reveal a +blank event track form to create an event track. + +```{image} event_tracks/event-track-form.png +:align: center +:alt: Typical event track form in the Odoo Events application. +``` + +Start by giving this track a {guilabel}`Title`. This field is **required** by Odoo. + +Then, if desired, add an accompanying image to the track via the {icon}`fa-pencil` +{guilabel}`(pencil)` icon that appears when the cursor hovers over the {icon}`fa-camera` +{guilabel}`(camera)` icon in the upper-right corner of the form. When clicked, proceed to upload the +desired image for the track. This image appears on the front-end of the event website, on this +specific tracks webpage. + +Next, enter a {guilabel}`Track Date` and time for the track, and designate a {guilabel}`Location` +where the talk is planning to be held. + +:::{tip} +To access a complete list of locations for event tracks, which can be modified (and added to) at +any time, navigate to {menuselection}`Events app --> Configuration --> Track Locations`. +::: + +Then, add a {guilabel}`Duration` to the track (in minutes). + +If the *Live Broadcast* setting has been enabled in the *Events* app settings, the option to add a +corresponding link in the {guilabel}`YouTube Video Link` field is available. + +If the {guilabel}`Always Wishlisted` checkbox is ticked, the talk is automatically set as a favorite +for each registered event attendee. + +Assign someone to be in charge of managing this track in the {guilabel}`Responsible` field. By +default, the person who initially created the track is assigned. + +Then, ensure the track is applied to the correct event in the {guilabel}`Event` field. By default, +this field is auto-populated with the event related to the *Event Tracks* page the track was +originally created from. + +Next, choose to add existing tags, or create new ones, to further organize the track. These tags, +and their corresponding tag categories are utilized on the event specific website - mainly on the +*Talks* web page on the event website, via the drop-down filter menus. + +Beneath that general information section, there are three tabs: {ref}`Speaker +`, {ref}`Description `, and +{ref}`Interactivity `. + +(events-track-speaker-tab)= + +#### Speaker tab + +The {guilabel}`Speaker` tab on an event track form is filled with various fields related to the +specific speaker who is planning to conduct/host the track. + +```{image} event_tracks/speaker-tab.png +:align: center +:alt: The Speaker tab on an event track form in the Odoo Events application. +``` + +##### Contact Details section + +In the {guilabel}`Contact Details` section, proceed to use the {guilabel}`Contact` drop-down field +to select an existing contact from the database as the main point of contact for the talk. + +If this contact is not yet in the database, type in the name of the contact, and click +{guilabel}`Create` to create and edit the contact form later, or click {guilabel}`Create and +edit...` to be taken to that new contact's contact form, where the rest of their pertinent +information can be entered. + +The {guilabel}`Contact Email` and {guilabel}`Contact Phone` fields are greyed-out and populated with +the information found on that chosen contact's contact form. These fields are not modifiable once +the {guilabel}`Contact` field is selected. + +##### Speaker Bio section + +In the {guilabel}`Speaker Bio` section, proceed to enter information related to the specific speaker +scheduled to conduct/host the track. This section may auto-populate based on the {guilabel}`Contact` +selected in the {guilabel}`Contact Details` section. If not, enter information in the necessary +fields. + +:::{note} +This information appears on the front-end of the event website, on the specific track webpage, +providing more information about the speaker to the track attendees. +::: + +Start by entering a {guilabel}`Name`, {guilabel}`Email`, and {guilabel}`Phone` number for the +speaker. + +Next, if desired, add an image to appear alongside the speaker biogrpahy on the event website, via +the {icon}`fa-pencil` {guilabel}`(pencil)` icon that appears when the cursor hovers over the +{icon}`fa-camera` {guilabel}`(camera)` icon. When clicked, proceed to upload the desired image for +the speaker. + +Then, enter a {guilabel}`Job Position` for the designated speaker, followed by the +{guilabel}`Company Name` associated with the speaker. + +In the {guilabel}`Biography` field, proceed to enter in a custom biography with any speaker-related +information. + +(events-track-description-tab)= + +#### Description tab + +The {guilabel}`Description` tab of an event track form is a blank text field, in which a description +of the track can be entered. The information entered here appears on the specific track page on the +event website. + +(events-track-interactivity-tab)= + +#### Interactivity tab + +The {guilabel}`Interactivity` tab on an event track form features a single option at first: +{guilabel}`Magic Button`. + +```{image} event_tracks/interactivity-tab.png +:align: center +:alt: The Interactivity tab on an event track form in the Odoo Events application. +``` + +When the checkbox beside {guilabel}`Magic Button` is ticked, Odoo displays a *call to action* button +to attendees on the track sidebar, while the track is taking place. + +With that checkbox ticked, three more options appear, all of which are related to the +{guilabel}`Magic Button`: + +- {guilabel}`Button Title`: enter a title to appear on the button for attendees. +- {guilabel}`Button Target URL`: enter a URL that leads attendees, who click the button, to a + specific page. +- {guilabel}`Show Button`: enter a number in the field, and the button will appear that number of + {guilabel}`minutes after Track start`. + +:::{note} +The magic button **only** appears if there is more than one published track. +::: + +(events-track-add-quiz)= + +#### Add Quiz button + +The {guilabel}`Add Quiz` button **only** appears on event track forms if the *Event Gamification* +setting is enabled in the Odoo *Events* settings. + +To add a quiz to the event track, click the {guilabel}`Add Quiz` button. Doing so reveals a separate +page where an event track quiz can be created and configured. + +```{image} event_tracks/add-quiz.png +:align: center +:alt: The Add Quiz page in the Odoo Events application for an event track. +``` + +Start by entering a title for the quiz in the blank field at the top of the page. Then, if +participants should be allowed to try the quiz multiple times, tick the checkbox beside +{guilabel}`Allow multiple tries`. + +The {guilabel}`Event` and {guilabel}`Event Track` fields are non-modifiable, and show the +corresponding event and track this quiz is associated with. + +To add questions to the quiz, click {guilabel}`Add a line` beneath the {guilabel}`Question` column. +Doing so reveals a {guilabel}`Create Questions` pop-up window. + +```{image} event_tracks/create-questions.png +:align: center +:alt: The Create Questions pop-up window on an event-specific track quiz in the Odoo +: Events app. +``` + +:::{note} +**All** track quiz questions are multiple choice. +::: + +From the pop-up window, enter the question in the blank field at the top. Then, click {guilabel}`Add +a line` to add answer options. Upon clicking {guilabel}`Add a line`, a new line appears, in which an +answer option can be entered. + +Once an answer option has been entered, proceed to designate whether it is the {guilabel}`Correct` +response, by ticking the checkbox in the {guilabel}`Correct` column. + +Then, there is the option to add a point value in the {guilabel}`Points` column. + +And, if there are any additional comments that should accompany an answer option, type them into the +{guilabel}`Extra Comment` field. + +:::{note} +The {guilabel}`Correct`, {guilabel}`Points`, and {guilabel}`Extra Comment` fields are all +optional. +::: + +Repeat this process for all the answer options. + +To remove an answer option, click the {icon}`fa-trash-o` {guilabel}`(trash can)` icon on the +far-right. + +Once all desired answer options (and their configurations) are complete, click {guilabel}`Save & +Close` to save the question, close the pop-up window, and return to the track quiz form. Or, click +{guilabel}`Save & New` to save this question, and instantly start creating another question on a new +{guilabel}`Create Questions` pop-up form. + +To remove any question from the quiz, click the {icon}`fa-trash-o` {guilabel}`(trash can)` icon on +the far-right of the question line. + +## Publish event track + +Once all the desired configurations are complete on an event track form, click the desired stage it +should be in from the status bar in the upper-right corner (e.g. {guilabel}`Confirmed`, +{guilabel}`Announced`, etc.). + +:::{note} +The stage of a track can also be changed from the {guilabel}`Event Tracks` page, where the +desired track card can be dragged-and-dropped into the appropriate Kanban stage. +::: + +If an event track has *not* been published yet, and it is moved to the {guilabel}`Published` stage, +Odoo automatically publishes the track on the event website. + +An event track can *also* be published by opening the desired event track form, and clicking the +{guilabel}`Go to Website` smart button. Then, in order for the track page to be viewable (and +accessible) for event attendees, toggle the {icon}`fa-toggle-off` {guilabel}`Unpublished` switch at +the top of the page to {icon}`fa-toggle-on` {guilabel}`Published`; thus turning it from red to +green, and making it accessible for attendees. + +```{image} event_tracks/published-toggle.png +:align: center +:alt: The track-related event submenu options on an event website built with Odoo Events. +``` + +:::{seealso} +- {doc}`create_events` +- {doc}`track_manage_talks` +::: + diff --git a/content/applications/marketing/events/registration_desk.md b/content/applications/marketing/events/registration_desk.md new file mode 100644 index 000000000..421d3da07 --- /dev/null +++ b/content/applications/marketing/events/registration_desk.md @@ -0,0 +1,84 @@ +# Registration Desk + +Use the *Registration Desk* feature in Odoo **Events** to grant access to registered event attendees +as they arrive, and store attendee-related data in the reporting metrics. + +## Registration Desk page + +On a mobile device (on the Odoo app or in a browser), open the {menuselection}`Events app`, and +click the {guilabel}`Registration Desk` to view the {guilabel}`Registration Desk` page. + +```{image} registration_desk/registration-desk-page.png +:align: center +:alt: The Registration Desk page in the Odoo Events application. +``` + +At the bottom of the {guilabel}`Registration Desk` box, there are options to either {guilabel}`Scan +a badge` or {guilabel}`Select Attendee`. + +## Scan a badge + +Scan the codes present on event attendee badges, by navigating to {menuselection}`Events app --> +Registration Desk`, and selecting the {guilabel}`Scan a badge` option. + +:::{important} +Odoo **must** be granted access to the camera being used for the {guilabel}`Scan a badge` option +to work. +::: + +Once Odoo has access to the camera, a {guilabel}`Barcode Scanner` pop-up window appears, showing the +camera's point-of-view. There is also a specified view finder box present, whose size can be +manually modified, accordingly, using the {icon}`fa-crop` {guilabel}`(crop)` icon. + +```{image} registration_desk/barcode-scanner-window.png +:align: center +:alt: The Barcode Scanner window of the Registration Desk in the Odoo Events application. +``` + +When the badge code is in the middle of the view finder box, the code is scanned, the +{guilabel}`Barcode Scanner` pop-up window disappears, and the attendee is granted access to the +event. Once the code is scanned, their attendance is logged in the Odoo **Events** app. + +If the barcode being scanned is invalid, an error pop-up message appears in the upper-right corner. + +## Select attendee + +Manually grant access to event attendees, by navigating to {menuselection}`Events app --> +Registration Desk`, and selecting the {guilabel}`Select Attendee` option. + +Odoo reveals an {guilabel}`Attendees` page, with all the attendees for every event in the database, +in a default {icon}`oi-view-kanban` {guilabel}`Kanban` view. + +```{image} registration_desk/attendees-page.png +:align: center +:alt: The Attendees page, via the Registration Desk, located in the Odoo Events application. +``` + +On the {guilabel}`Attendees` page, each attendee card displays that person's name, which event they +are registered to attend, their associated company (if applicable), what ticket tier they purchased +(if applicable), along with two buttons: a {icon}`fa-check` {guilabel}`(checkmark)` and +{icon}`fa-undo` {guilabel}`(counter-clockwise arrow)`. + +To grant access to a person, marking them as attended, click the {icon}`fa-check` +{guilabel}`(checkmark)` button on that attendee's card. + +Click the {icon}`fa-undo` {guilabel}`(counter-clockwise arrow)` button on an attendee's card to undo +the previous action. + +:::{tip} +It is recommended to use an event-specific filter on the {guilabel}`Attendees` page, via the +search bar drop-down menu. + +To do that, click the {icon}`fa-sort-desc` {guilabel}`(down arrow)` beside the seach bar to +reveal a drop-down menu with {guilabel}`Filters`, {guilabel}`Group By`, and {guilabel}`Favorites` +options. + +For example, click the {guilabel}`Event` option, in the {guilabel}`Group By` column. Then, click +away to remove the drop-down menu. Odoo reveals the {guilabel}`Attendees` page with +event-specific columns, allowing users to locate specific event attendees. +::: + +:::{seealso} +{doc}`../../essentials/search` +::: + diff --git a/content/applications/marketing/events/revenues_report.md b/content/applications/marketing/events/revenues_report.md new file mode 100644 index 000000000..471ccc77b --- /dev/null +++ b/content/applications/marketing/events/revenues_report.md @@ -0,0 +1,192 @@ +# Revenues report + +The Odoo **Events** application creates custom reports, based on event-related data and analytics. +These reports can either be focused on *Attendees* or *Revenues*. + +The following documentation focuses on the reporting options related to event *Revenues*. + +## Revenues reporting page + +To access the *Attendees* reporting page, navigate to {menuselection}`Events app --> Reporting --> +Revenues`. + +```{image} revenues_report/default-view.png +:align: center +:alt: The default view of the Revenues reporting page in the Odoo Events application. +``` + +By default, the {guilabel}`Revenues` reporting page appears as a graph (a {icon}`fa-line-chart` +{guilabel}`(Line Chart)` with {icon}`fa-database` {guilabel}`(Stacked)` data). The default filters, +{guilabel}`Non-free tickets` and {guilabel}`Event Start Date: (current year)`, are present in the +search bar. + +:::{tip} +To learn more about the various graph views (and graph view options), refer to the {ref}`Graph +views ` documentation. +::: + +The {guilabel}`Revenues` reporting page can also be viewed as a {ref}`pivot table +`, by clicking the {icon}`oi-view-pivot` {guilabel}`(Pivot)` icon in the +upper-right corner. + +### Measures + +Choosing specific {ref}`Measures ` is a quick way to customize +reporting pages. + +Regardless of the chosen view, the measures on the {guilabel}`Revenues` reporting page are as +follows: {guilabel}`Revenues`, {guilabel}`Untaxed Revenues`, and {guilabel}`Count`. + +:::{note} +In the default graph view of the {guilabel}`Revenues` reporting page, only the +{guilabel}`Revenues` option is set in the {guilabel}`Measures` drop-down menu. + +In graph view, only one of the {guilabel}`Measures` can be selected at a time. + +When the pivot option is selected, all {guilabel}`Measures` options are selected, by default. +::: + +- {guilabel}`Revenues`: shows the revenues generated from events. +- {guilabel}`Untaxed Revenues`: shows the untaxed revenues generated from events. +- {guilabel}`Count`: shows the total amount of registrants who attended events. + +### Filters and grouping options + +To reveal a drop-down menu of filter and grouping options to create custom reports, click the +{icon}`fa-caret-down` {guilabel}`(down arrow)` to the right of the search bar. + +Doing so opens a drop-down mega menu of options organized into columns: {ref}`Filters +`, {ref}`Group By `, and {ref}`Favorites +`. + +:::{note} +If a time-related option has been selected from the {guilabel}`Filters` column (e.g. the default +{guilabel}`Event Start Date: (year)` filter), a {guilabel}`Comparison` column appears, with +comparison options for the corresponding time-related filter option selected. + +Only **one** selection can be made from the {guilabel}`Comparison` column at a time. +::: + +:::{seealso} +{doc}`../../essentials/search` +::: + +#### Filter options + +In the {guilabel}`Filters` column of the drop-down mega menu, there are various event-related +options that can be utilized to create custom reports, based on a number of specific criteria. + +Multiple options in the {guilabel}`Filters` column can be selected at once. + +The {guilabel}`Filters` column has the following options: + +- {guilabel}`Non-free tickets`: event tickets/registrations that were **not** free. +- {guilabel}`Free`: event tickets/registrations that *were* free. +- {guilabel}`Pending payment`: event tickets/registrations that were purchased, but still have + payment pending. +- {guilabel}`Sold`: event tickets/registrations that have been successfully sold (and paid for). +- {guilabel}`Registration Date`: Click the {icon}`fa-caret-down` {guilabel}`(down arrow)` icon to + reveal a list of month, quarter, and year options. Select any number of these options to view a + specific periods of time and see how many registrations happened during that time. +- {guilabel}`Upcoming/Running`: include revenue-related information for events that are either + currently running or are going to happen in the future. +- {guilabel}`Past Events`: include revenue-related information for events that have already taken + place. +- {guilabel}`Event Start Date`: Click the {icon}`fa-caret-down` {guilabel}`(down arrow)` icon to + reveal a list of month, quarter, and year options. Select any number of these options to designate + event start dates to use as filters for revenue-related event data. +- {guilabel}`Event End Date`: Click the {icon}`fa-caret-down` {guilabel}`(down arrow)` icon to + reveal a list of month, quarter, and year options. Select any number of these options to designate + event end dates to use as filters for revenue-related event data. +- {guilabel}`Published Events`: Select this option to show revenue-related data for published + events. +- {guilabel}`Add Custom Filter`: Create a custom filter to analyze event-related revenue data. To + learn more, refer to the documentation on {ref}`custom filters `. + +#### Group By options + +In the {guilabel}`Group By` column of the drop-down mega menu, there are various event-related +options to create custom groupings of data. + +Multiple {guilabel}`Group By` options can be selected at once. + +The {guilabel}`Group By` column has the following options: + +- {guilabel}`Event Type`: Group data based on the type of event. +- {guilabel}`Event`: Organize data into individual groups, separated by events. +- {guilabel}`Product`: Group data based on the event registration product. +- {guilabel}`Ticket`: Group data based on the type of event ticket purchased by attendees. +- {guilabel}`Registration Status`: Group data based on the status of registrations. +- {guilabel}`Sale Order Status`: Group data based on the status of event-related sales orders. +- {guilabel}`Customer`: Group data based on customer records. +- {guilabel}`Add Custom Group`: Click the {icon}`fa-caret-down` {guilabel}`(down arrow)` icon to + reveal a drop-down of grouping options. To select one, click on the desired option, and Odoo adds + it to the {guilabel}`Group By` column. Multiple selections can be made. + +## Sample report: event ticket analysis (graph) + +The following is an example of how various filters and grouping options can create a useful analytic +graph report related to event revenues. In this case, the configurations present data about sold or +free tickets to published events, with the metrics separated by ticket type and event. + +```{image} revenues_report/event-ticket-analysis.png +:align: center +:alt: The event ticket analysis sample report with unique filters and groupings in +: place. +``` + +To create such a report, navigate to {menuselection}`Events app --> Reporting --> Revenues`. Stay in +the default graph view, but remove the default filters from the search bar. + +Then, click the {icon}`fa-caret-down` {guilabel}`(down arrow)` to the right of the search bar, to +reveal the drop-down mega menu of filter and grouping options. + +From here, select {guilabel}`Free` and {guilabel}`Sold` from the {guilabel}`Filters` column. + +Then, since it is desired to **only** view data related to already published events, select the +{guilabel}`Published Events` option in the {guilabel}`Filters` column, as well. + +Next, in the {guilabel}`Group By` column, select the {guilabel}`Event` and {guilabel}`Ticket` +options, **in that sequential order**. Doing so first groups the data by event, *then* by ticket +type, which provides a more useful array of data to analyze. + +:::{important} +The order in which the options are selected in the {guilabel}`Group By` column directly affects +how the data is presented on the report. +::: + +From there, additional configurations can be added for more detailed data, if desired. + +If no additional filters or groupings are added, Odoo presents a graphical representation of data +related to all *free* or *sold* tickets for *published events*, grouped by *event*, and organized by +*ticket* type. + +## Sample report: event type analysis (pivot table) + +The following is an example of how various filters and grouping options can create a useful analytic +pivot table report related to event revenues. In this case, the configurations present data about +how much revenue different event types have generated, in order to gauge which events are the most +profitable. + +```{image} revenues_report/event-type-analysis.png +:align: center +:alt: The event type analysis sample report with unique filters and groupings in place. +``` + +First, navigate to {menuselection}`Events app --> Reporting --> Revenues`, and switch to the pivot +table view, by clicking the {icon}`oi-view-pivot` {guilabel}`(Pivot)` icon in the upper-right +corner. + +Keep the default filters ({guilabel}`Non-free tickets` and {guilabel}`Event Start Date: (year)`) in +the search bar. + +Next, open the {guilabel}`Measures` drop-down menu, and deselect the option for {guilabel}`Count`, +because this report is only going to focus on revenues. + +Then, click {icon}`fa-plus-square` {guilabel}`Total` above the column titles, and select +{guilabel}`Event Type` from the resulting drop-down menu. + +With these configurations in place, all the revenues generated from the events (and their +corresponding registrations) are displayed, organized by the event type (presented as expandable +columns). + diff --git a/content/applications/marketing/events/sell_tickets.md b/content/applications/marketing/events/sell_tickets.md new file mode 100644 index 000000000..81a217b60 --- /dev/null +++ b/content/applications/marketing/events/sell_tickets.md @@ -0,0 +1,156 @@ +# Sell event tickets + +Odoo *Events* provides users with the ability to create custom event tickets (and ticket tiers), +with various price points. + +It *also* allows them to sell event tickets in two different ways: via standard sales orders, and +online through an integrated website. + +Odoo also simplifies the ticket-purchasing process by providing plenty of payment method options. + +:::{tip} +To learn more about how to create custom tickets (and ticket tiers) for events, check out the +{doc}`create_events` documentation. +::: + +## Configuration + +In order to sell event tickets in Odoo, some settings must first be enabled. + +First, navigate to {menuselection}`Events app --> Configuration --> Settings`. In the +{guilabel}`Registration` section, there are two different settings: {guilabel}`Tickets` and +{guilabel}`Online Ticketing`. + +The {guilabel}`Tickets` setting allows users to sell event tickets with standard sales orders. + +The {guilabel}`Online Ticketing` setting allows users to sell event tickets online through their +integrated Odoo website. + +To activate a setting, tick the checkbox beside the desired feature's label, and click +{guilabel}`Save` to finish enabling it. + +:::{note} +If these options are *not* enabled, a default {guilabel}`Register` button becomes available for +visitors to interact with and procure free registrations to the event. +::: + +```{image} sell_tickets/events-settings-tickets.png +:align: center +:alt: View of the settings page for Odoo Events. +``` + +With those settings enabled, Odoo automatically creates a new *Product Type* called, *Event Ticket*, +which is accessible on every product form. Odoo also creates three event registration products (with +the *Product Type* set to *Event Ticket*) that can be used or modified for event tickets. + +:::{important} +When creating a new event registration product, the *Product Type* **must** be set to *Event +Ticket* on the product form, in order for it to be selected in the *Product* column under the +*Tickets* tab on an event form. + +```{image} sell_tickets/events-tickets-registration-product.png +:align: center +:alt: View of an event form highlighting the column product under the tickets tab in +: Odoo. +``` +::: + +:::{note} +Any event with paid tickets sold, features a {icon}`fa-dollar` {guilabel}`Sales` smart button at +the top of the event form, where the respective sales orders attributed to those ticket sales +become available. + +```{image} sell_tickets/events-sales-smartbutton.png +:align: center +:alt: View of an event's form and the sales smart button in Odoo Events. +``` + +Clicking the {icon}`fa-dollar` {guilabel}`Sales` smart button reveals a separate page, showcasing +all the sales orders (standard and/or online) related to tickets that have been sold for that +specific event. +::: + +## Sell event tickets with the Sales app + +To sell event tickets with sales orders, start by navigating to the {menuselection}`Sales` app. +Then, click {guilabel}`New` to open a new quotation form. + +After filling out the top portion of the form with the appropriate customer information, click +{guilabel}`Add a product` in the {guilabel}`Order Lines` tab. Then, in the {guilabel}`Product` +column, select (or create) an event registration product configured with its {guilabel}`Product +Type` set to {guilabel}`Event Ticket` on its product form. + +Once an event registration product is selected, a {guilabel}`Configure an event` pop-up window +appears. + +```{image} sell_tickets/configure-event-popup.png +:align: center +:alt: Standard 'Configure an event' pop-up window that appears on an event ticket sales +: order. +``` + +From the {guilabel}`Configure an event` pop-up window, select to which event this ticket purchase is +related to in the {guilabel}`Event` field drop-down menu. Then, in the {guilabel}`Event Ticket` +drop-down menu, select which ticket tier the customer wishes to purchase, if there are multiple +tiers configured for that event. + +When all the desired configurations are complete, click {guilabel}`Ok`. Doing so returns the user to +the sales order, with the event registration ticket product now present in the {guilabel}`Order +Lines` tab. The user can proceed to confirm and close the sale, per the usual process. + +:::{tip} +To re-open the *Configure an event* pop-up window, hover over the event registration product name +in the {guilabel}`Order Lines` tab, and click on the {icon}`fa-pencil` {guilabel}`(pencil)` icon. +::: + +## Sell event tickets through the Website app + +When a visitor arrives on the register page of the event website, they can click the +{guilabel}`Register` button to purchase a ticket to the event. + +:::{note} +If the visitor is *not* already on the register page of the event website, clicking +{guilabel}`Register` on the event website's submenu redirects them to the proper +register page. From there, they can click the {guilabel}`Register` button to begin the ticket +purchasing process. +::: + +If different ticket tiers are configured for the event, the visitor is presented with a +{guilabel}`Tickets` pop-up window. + +```{image} sell_tickets/tickets-popup.png +:align: center +:alt: The tickets pop-up window that appears on the event's website when 'Register' +: is clicked. +``` + +From here, visitors select which ticket tier they would like to purchase, along with a quantity, +using the numerical drop-down menu available to the right of their desired ticket. Once the desired +selections have been entered, the visitor then clicks the {guilabel}`Register` button. + +Then, an {guilabel}`Attendees` pop-up window appears, containing all the questions that have been +configured in the *Questions* tab of the event form for this particular event. + +```{image} sell_tickets/attendees-popup.png +:align: center +:alt: The attendees pop-up window that appears on the event's website when 'Ok' is +: clicked. +``` + +If multiple tickets are being purchased at once, there are numbered sections for each individual +ticket registrant, each containing the same questions. However, if any question has been configured +with the *Ask once per order* setting, that question is only asked once -- and **not** for every +attendee making the reservation in the order. + +With all necessary information entered, the visitor can then click the {guilabel}`Go to Payment` +button. Doing so first takes the visitor to a {guilabel}`Billing` confirmation page, followed by a +{guilabel}`Payment` confirmation page, where they can utilize any configured payment method set up +in the database to complete the order. + +Then, once the purchase is complete on the front-end of the website, the subsequent sales order is +instantly accessible in the back-end of the database. + +:::{seealso} +{doc}`create_events` +::: + diff --git a/content/applications/marketing/events/track_manage_talks.md b/content/applications/marketing/events/track_manage_talks.md new file mode 100644 index 000000000..bc00c4697 --- /dev/null +++ b/content/applications/marketing/events/track_manage_talks.md @@ -0,0 +1,146 @@ +# Talks, proposals, and agenda + +With Odoo *Events*, users can utilize a fully-integrated event website, where attendees can quickly +access various tracks (talks, presentations, etc.), view entire agendas, and propose talks for the +event. + +## Event website + +To access an event website, navigate to the specific event form in the Odoo *Events* app, and click +the {guilabel}`Go to Website` smart button. Or, while on the Odoo-built website for the company, +click the {guilabel}`Events` header option, and select the desired event to view that event's +website. + +On the event website, there is an event-specific subheader menu with different options to choose +from. + +With the *Schedule & Tracks* setting enabled in the Odoo *Events* app, the following links are +automatically added to the subheader menu, located on the event website: {guilabel}`Talks`, +{guilabel}`Talk Proposals`, and {guilabel}`Agenda`. + +```{image} track_manage_talks/track-submenu-options.png +:align: center +:alt: The track-related event submenu options on an event website built with Odoo Events. +``` + +To enable the {guilabel}`Schedule & Tracks` setting, navigate to {menuselection}`Events app --> +Configuration --> Settings`, tick the checkbox beside {guilabel}`Schedule & Tracks`, and click +{guilabel}`Save`. + +### Talks page + +The {guilabel}`Talks` link takes the attendee to a page filled with all the planned tracks for the +event. + +```{image} track_manage_talks/talks-page.png +:align: center +:alt: The Talks page on an event website built through the Odoo Events application. +``` + +At the top of {guilabel}`Talks` page, there are drop-down filter menus beside a {guilabel}`Search +a talk...` search bar. + +The first drop-down filter menu (with the starting title: {guilabel}`Favorites`) is the only +drop-down filter menu that appears by default. When clicked, the resulting menu presents two +options: {guilabel}`Favorites` and {guilabel}`All Talks`. + +Selecting {guilabel}`Favorites` shows *only* the tracks that have been favorited by the attendee. + +:::{note} +If no tracks have been favorited, and the {guilabel}`Favorites` filter is selected, Odoo presents +all the event tracks. +::: + +Selecting {guilabel}`All Talks` shows *all* the tracks, regardless if they have been favorited or +not. + +The other drop-down filter menus that appear on this page are related to any configured tags (and +tag categories) created for event tracks in the backend. + +:::{tip} +To add tags and tag categories to track forms, open a desired event track form, and start typing +a new tag in the {guilabel}`Tags` field. Then, click {guilabel}`Create and edit...` from the +resulting drop-down menu. + +Doing so reveals a {guilabel}`Create Tags` pop-up form. + +```{image} track_manage_talks/create-tags-popup.png +:align: center +:alt: The Create Tags pop-up form that coincides with drop-down filter menus on Talks +: page. +``` + +From here, users see the recently added tag in the {guilabel}`Tag Name` field. Beneath that, +there is an option to add a specific {guilabel}`Color Index` to the tag for added organization. + +Lastly, there is the {guilabel}`Category` field, where users can either select a pre-existing +category for this new tag, or create a new one. + +All options in the {guilabel}`Category` field for tags appear as their own drop-down filter menu +on the {guilabel}`Talks` page, located on the event website. +::: + +Beneath the drop-down filter menus at the top of the {guilabel}`Talks` page, there is a list of +planned tracks for the specific event, organized by day. + +If an attendee wishes to favorite a track, they can click the {icon}`fa-bell-o` {guilabel}`(empty +bell)` icon, located to the right of the track title. Attendees will know a track has been favorited +when they notice the icon has been changed to {icon}`fa-bell` {guilabel}`(filled bell)` icon. + +Favoriting a track this way places it on the list of {guilabel}`Favorites`, which is accessible from +the default drop-down filter menu, located at the top of the {guilabel}`Talks` page. + +### Talk Proposals page + +The {guilabel}`Talk Proposals` link takes attendees to a page on the event website, wherein they can +formerly submit a proposal for a talk ({dfn}`track`) for the event, via a custom online form. + +```{image} track_manage_talks/talk-proposals-page.png +:align: center +:alt: The Talk Proposals page on the event website built with the Odoo Events application. +``` + +In addition to the form, an introduction to the page, along with any other pertinent information +related to the types of talks the event will feature can be added, if needed. + +The talk proposal form can be modified in a number of different ways, via the web builder tools, +accessible by clicking {guilabel}`Edit` while on the specific page. + +Then, proceed to edit any of the default fields, or add new forms with the {guilabel}`Form` building +block (located in the {guilabel}`Blocks` section of the web builder tools sidebar). + +Once all the necessary information is entered into the form, the attendees just need to click the +{guilabel}`Submit Proposal` button. + +Then, that talk, and all the information entered on the form, can be accessed on the +{guilabel}`Event Tracks` page for that specific event in the {guilabel}`Proposal` stage, which is +accessible via the {guilabel}`Tracks` smart button on the event form. + +At that point, an internal user can review the proposed talk, and choose to accept or deny the +proposal. + +If accepted, the internal user can then move the track to the next appropriate stage in the Kanban +pipeline on the {guilabel}`Event Tracks` page for the event. Then, they can open that track form, +and click the {guilabel}`Go to Website` smart button to reveal that track's page on the event +website. + +From there, they can toggle the {guilabel}`Unpublished` switch in the header to +{guilabel}`Published`, which allows all event attendees to view and access the talk. + +### Agenda page + +The {guilabel}`Agenda` link takes attendees to a page on the event website, showcasing an event +calendar, depicting when (and where) events are taking place for that specific event. + +```{image} track_manage_talks/event-agenda-page.png +:align: center +:alt: The event Agenda page on the event website built with the Odoo Events application. +``` + +Clicking any track on the calendar takes the attendee to that specific track's detail page on the +event website. + +If an attendee wishes to favorite a track, they can click the {icon}`fa-bell-o` {guilabel}`(empty +bell)` icon, located to the right of the track title. Attendees will know a track has been favorited +when they notice the icon has been changed to {icon}`fa-bell` {guilabel}`(filled bell)` icon. + diff --git a/content/applications/marketing/marketing_automation.md b/content/applications/marketing/marketing_automation.md new file mode 100644 index 000000000..d8e1aba21 --- /dev/null +++ b/content/applications/marketing/marketing_automation.md @@ -0,0 +1,222 @@ +--- +show-content: true +--- + +# Marketing Automation + +Use the Odoo **Marketing Automation** application to create dynamic campaigns with actions that +automatically occur within a defined duration, such as sending a series of timed mass emails or +engaging with leads based on their interactions with marketing campaigns. + +While the application is designed to be user-friendly for creating, launching, and reviewing +marketing campaigns, it also provides advanced features to automate repetitive tasks throughout the +database. + +Get started by creating a {ref}`new campaign from scratch ` or start +with a {ref}`campaign template `. + +:::{seealso} +[Odoo Tutorials: Marketing](https://www.odoo.com/slides/marketing-27) +::: + +```{eval-rst} +.. cards:: + + .. card:: Audience targeting + :target: marketing_automation/target_audience + + Configure the target audience for a campaign. + + .. card:: Workflow activities + :target: marketing_automation/workflow_activities + + Define the activities that occur within a campaign. + + .. card:: Testing/running campaigns + :target: marketing_automation/testing_running + + Launch a test or run a campaign. + + .. card:: Campaign metrics + :target: marketing_automation/understanding_metrics + + Review the metrics of a campaign. +``` + +## Configuration + +To begin, make sure the **Marketing Automation** application is {ref}`installed `. + +:::{important} +Installing the **Marketing Automation** application also installs the {doc}`Email Marketing +` app, as most features of Odoo **Marketing Automation** are dependent on that +specific application. + +Additionally, install the {doc}`CRM <../sales/crm>` and {doc}`SMS Marketing ` +applications to access *all* of the features available in **Marketing Automation**. + +The following documentation assumes that all three of these dependent applications are installed +on the database. +::: + +(marketing-automation-campaigns)= + +## Campaigns + +A *campaign* refers to a workflow of activities that are automatically executed to a target +audience, based on predefined filters, triggers, and durations of activities. + +A new campaign can be created from scratch or from a {ref}`template +`. + +To create a campaign, navigate to the {menuselection}`Marketing Automation` application and click +the {guilabel}`New` button to reveal a new campaign form. + +(marketing-automation-campaign-templates)= + +### Campaign templates + +Odoo provides six campaign templates to help users get started. The campaign template cards **only** +display when there are no existing campaigns in the database. Once a campaign has been created, the +template cards on the *Campaigns* dashboard are replaced with a Kanban view of the existing +campaigns. + +To get started with a template, navigate to the {menuselection}`Marketing Automation` application, +from the main Odoo dashboard, to open the {guilabel}`Campaigns` dashboard, which displays six +{doc}`campaign template ` cards: + +- {icon}`fa-tag` + + {guilabel}`Tag Hot Contacts` + {guilabel}`Send a welcome email to contacts and tag them if they click it.` +- {icon}`fa-hand-peace-o` + + {guilabel}`Welcome Flow` + {guilabel}`Send a welcome email to new subscribers, remove the address that bounced.` +- {icon}`fa-check-square` + + {doc}`Double Opt-in + ` + {guilabel}`Send an email to new recipients to confirm their consent.` +- {icon}`fa-search` + + {guilabel}`Commercial prospection` + {guilabel}`Send a free catalog and follow-up according to reactions.` +- {icon}`fa-phone` + + {guilabel}`Schedule Calls` + {guilabel}`If a lead is created for existing contact, schedule a call with their salesperson.` +- {icon}`fa-star` + + {guilabel}`Prioritize Hot leads` + {guilabel}`Send an email to new leads and assign them a high priority if they open it.` + +```{image} marketing_automation/campaigns-dashboard.png +:alt: Six campaign template cards on the Campaigns dashboard of the Marketing Automation +: app. +``` + +These templates are designed to be used as starting points for creating new campaigns. Click one of +the template cards to open the campaign form. + +:::{tip} +To display the campaign template cards again after a campaign has been created, type the name of +a campaign that does **not** exist in the database into the search bar, then press {kbd}`Enter`. + +For example, searching for `empty` displays the campaign template cards again, as long as there +is not a campaign with the name "empty" in the database. +::: + +## Targets and filters + +On the campaign form, the {guilabel}`Target` and {guilabel}`Filter` section, also referred to as the +domain, contains the fields used to define the target audience for the campaign's reach (i.e., +the unique contact records in the database). + +The target audience specifies the type of records available for use in the campaign, such as +*Lead/Opportunity*, *Event Registration*, *Contact*, and more. + +### Records + +The contacts in the system that fit the specified criteria for a campaign are referred to as +*records*. + +The number of records that are displayed next to the campaign {guilabel}`Filter` represent the total +number of records the campaign is targeting. + +### Participants + +The records that are engaged by the campaign are referred to as *participants*. + +The number of participants engaged in a test run are shown in the *Tests* smart button, which +displays on the top of the campaign form after a test has been run. + +The number of participants engaged in a running, or stopped, campaign are shown in the +*Participants* smart button at the top of the campaign form. + +:::{seealso} +{doc}`Audience targeting ` +::: + +## Workflow + +A *workflow* consists of an activity, many activities, or a sequence of activities organized in a +campaign. A campaign's workflow is defined in the {guilabel}`Workflow` section of the campaign form. + +### Activities + +*Activities* are the methods of communication or server actions, organized in a workflow, that are +executed within a campaign. Once running, each activity displays the number of participants that +are engaged by the activity as *Success* and *Rejected* counts. + +To create one of the following activities, click {guilabel}`Add new activity` in the +{guilabel}`Workflow` section of the campaign form: + +- {ref}`Email `: an email that is sent to the target + audience. +- {ref}`Server action `: an internal action within the + database that is executed. +- {ref}`SMS `: a text message that is sent to the target + audience. + +:::{seealso} +{doc}`marketing_automation/workflow_activities` +::: + +## Testing and running + +Once a campaign has been created, it can be tested to ensure the workflow is functioning as +expected, to check for errors, and correct any mistakes before it reaches its target audience. + +After testing, the campaign can be launched to start engaging the target audience. The campaign can +also be launched *without* testing, if the user is confident in the workflow. + +:::{seealso} +{doc}`marketing_automation/testing_running` +::: + +## Reporting + +A range of reporting metrics are available to measure the success of each campaign. Navigate to +{menuselection}`Marketing Automation app --> Reporting` to access the following menu options: + +- {guilabel}`Link Tracker`: displays the metrics of links to track the number of clicks. +- {guilabel}`Traces`: displays the results of all activities from all campaigns. +- {guilabel}`Participants`: displays an overview of the participants of all campaigns. + +Additionally, each activity within the workflow of a campaign displays its engagement metrics. + +:::{seealso} +{doc}`marketing_automation/understanding_metrics` +::: + +```{toctree} +:titlesonly: true + +marketing_automation/target_audience +marketing_automation/workflow_activities +marketing_automation/testing_running +marketing_automation/understanding_metrics +marketing_automation/campaign_templates +``` + diff --git a/content/applications/marketing/marketing_automation/campaign_templates.md b/content/applications/marketing/marketing_automation/campaign_templates.md new file mode 100644 index 000000000..653bb7c5f --- /dev/null +++ b/content/applications/marketing/marketing_automation/campaign_templates.md @@ -0,0 +1,12 @@ +--- +nosearch: true +--- + +# Campaign templates + +```{toctree} +:titlesonly: true + +campaign_templates/double_optin +``` + diff --git a/content/applications/marketing/marketing_automation/campaign_templates/double_optin.md b/content/applications/marketing/marketing_automation/campaign_templates/double_optin.md new file mode 100644 index 000000000..8c73ad1d3 --- /dev/null +++ b/content/applications/marketing/marketing_automation/campaign_templates/double_optin.md @@ -0,0 +1,165 @@ +# Double Opt-in + +A *double opt-in*, also referred to as a *confirmed opt-in*, may be required in some countries +for marketing communications, due to anti-SPAM laws. Confirming consent has several other benefits, +as well: it validates email addresses, avoids spam/robo subscribers, keeps mailing lists clean, and +only includes engaged contacts in the mailing list. + +When the *Double Opt-in* campaign template is used, a new mailing list titled, *Confirmed contacts* +is created in the *Email Marketing* app, and any new mailing list contacts that are added to the +default *Newsletter* mailing list are sent a confirmation email to double opt-in. The contacts that +click on the confirmation link in the email are automatically added to the *Confirmed contacts* +mailing list in Odoo. + +:::{important} +When using the *Double Opt-in* campaign template, only the contacts in the *Confirmed contacts +mailing* list are considered to have confirmed their consent. +::: + +(marketing-automation-template-using-double-optin)= + +## Use the Double Opt-in campaign template + +Open the {menuselection}`Marketing Automation` app, and select the {guilabel}`Double Opt-in` +campaign template to create a new campaign for confirming consent. + +:::{tip} +The campaign templates do **not** display, by default, when there are existing *Marketing +Automation* campaigns. To display the campaign templates, type the name of a campaign (that does +not exist in the database) into the {guilabel}`Search...` bar, then press {kbd}`Enter`. + +For example, searching for `empty` displays the campaign template cards again, as long as there +is not a campaign with the name "empty" in the database. +::: + +### Campaign configuration + +Upon creation of the campaign, the campaign form loads with a new preconfigured campaign. + +The {guilabel}`Target` and {guilabel}`Filter` configurations of the campaign are as follows: + +- {guilabel}`Name`: `Double Opt-in` + +- {guilabel}`Responsible`\*: The user who created the campaign. + +- {guilabel}`Target`: {guilabel}`Mailing Contact` + +- {guilabel}`Unicity based on`: {guilabel}`Email (Mailing Contact)` + +- {guilabel}`Filter`: + + - {guilabel}`Email` {guilabel}`is set` + - {guilabel}`Blacklist` {guilabel}`is not` {guilabel}`set` + - {guilabel}`Mailing lists` {guilabel}`contains` `Newsletter` + +\* The {guilabel}`Responsible` field is only visible with {ref}`developer-mode` activated. + +:::{important} +The {guilabel}`Target` model of the campaign should **not** be modified. Changing the +{guilabel}`Target` model with activities in the {guilabel}`Workflow` invalidates the existing +activities in the {guilabel}`Workflow`. + +The *Double Opt-in* campaign template is intended to **only** use the {guilabel}`Mailing Contact` +model. +::: + +The campaign loads two activities in the {guilabel}`Workflow` section of the campaign: an email +activity, with a child server action activity that triggers *on click*. + +By default, the `Confirmation` email activity is set to trigger {guilabel}`1 Hours` after the +beginning of the workflow. In other words, the email is sent 1 hour after a new contact is added to +the *Newsletter* mailing list. + +The email activity uses the preconfigured *Confirmation* email template, which contains a button for +the contact to click to confirm their consent. + +To modify the email template, select the {icon}`fa-envelope-o` {guilabel}`Templates` smart button at +the top of the campaign form. Then, in the list of templates, select the `Confirmation` email +template. + +Be sure to personalize the contents of the email template; however, it is recommended to keep the +contents of double opt-in confirmation emails short and to-the-point. + +The default confirmation button, in the body of the template, links directly to the database's +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 +confirming their subscription to the mailing list. Add the link to that page in the URL of the +confirmation button. +::: + +:::{important} +The email template should only include a single call-to-action link for confirmation, other than +an unsubscribe link. + +Any click on a link (or button) included in the confirmation email, besides the unsubscribe +button, triggers the *Add to list* server action. + +The child activity *Add to list* server action's *On click* trigger cannot differentiate between +multiple URLs in an email, besides the `/unsubscribe_from_list` unsubscribe button that is +included in any one of the footer blocks. +::: + +The `Add to list` server action activity triggers immediately after a click in the parent +`Confirmation` email activity is detected. + +When triggered, the `Add to list` activity executes the *Add To Confirmed List* server action, +automatically adding the contact to the *Confirmed contacts* mailing list, if they are not already +in the mailing list. + +To modify the server action, select the title of the activity to open the {guilabel}`Open: +Activities` pop-up window and edit the server action activities configuration. + +:::{tip} +Consider setting an {guilabel}`Expiry Duration` to prevent executing the activity after a +specific amount of time. +::: + +:::{important} +It is not recommended to modify the preconfigured Python code in the {guilabel}`Add To Confirmed +List` server action, as doing so may trigger a change in the database's pricing plan. +::: + +Once the campaign configuration is complete, consider {doc}`launching a test <../testing_running>` +to verify the campaign executes as expected. If the campaign testing is successful, +{guilabel}`Start` the campaign to begin sending double opt-in confirmation emails to *Newsletter* +mailing list contacts, and fill the *Confirmed contacts* mailing list with engaged contacts. + +(marketing-automation-template-double-optin-usecase)= + +## Double Opt-in use-case + +```{eval-rst} +.. example:: + To prepare for sending newsletter marketing emails on an Odoo database, a mailing contact list + must be procured. One way of collecting subscribers is through a sign-up form on the website that + adds contacts to the *Newsletter* mailing list on the form submission. + + .. image:: double_optin/newsletter-signup.png + :align: center + :alt: Newsletter sign-up form on Odoo website footer. + + Before sending any marketing emails, :ref:`use the Double Opt-in campaign template + ` in the *Marketing Automation* app to confirm + marketing email consent from the contacts in the *Newsletter* mailing list. + + After launching the *Double Opt-in* campaign, view the contacts that have double opt-in in the + *Confirmed contacts* mailing list (:menuselection:`Email Marketing app --> Mailing Lists --> + Mailing Lists`). + + .. image:: double_optin/double-optin-metrics.png + :align: center + :alt: Activity metrics on the campaign form. + + Now, the *Confirmed contacts* mailing list is ready to be used for sending newsletter marketing + emails from an Odoo database. +``` + +:::{seealso} +- {doc}`../understanding_metrics` +- {doc}`../../email_marketing/mailing_lists` +- {doc}`../../email_marketing` +::: + diff --git a/content/applications/marketing/marketing_automation/target_audience.md b/content/applications/marketing/marketing_automation/target_audience.md new file mode 100644 index 000000000..745ae6b45 --- /dev/null +++ b/content/applications/marketing/marketing_automation/target_audience.md @@ -0,0 +1,89 @@ +# Audience targeting + +The {guilabel}`Target` and {guilabel}`Filter` fields on the campaign form, also referred to as the +*domain*, contain the parameters used to define the target audience for the campaign's reach (i.e., +the unique contact records in the database, and imported list, etc.). + +- {guilabel}`Target`: specifies the type of records available for use in the campaign, such as + {guilabel}`Lead/Opportunity`, {guilabel}`Event Registration`, {guilabel}`Contact`, The assigned + records model determines the fields that are available throughout the campaign, including the + fields available in the {guilabel}`Filter` section, and in dynamic placeholders. +- {guilabel}`Save as Favorite Filter`: saves the current {guilabel}`Filter` for future use with the + current {guilabel}`Target` model, and can be managed from the {menuselection}`Marketing Automation + app --> Configuration --> Favorite Filters` menu. +- {guilabel}`Unicity based on`: specifies the {guilabel}`Target` model field where duplicates should + be avoided. Traditionally, the {guilabel}`Email` field is used, but any available field can be + used. +- {guilabel}`Filter`: contains an interactive form with configurable logic to further refine the + targeting parameters under the chosen {guilabel}`Target` model. See more details in the + {ref}`marketing_automation/defining-filters` section. +- {guilabel}`Include archived`: allows or disallows the inclusion of archived records in the target + audience. + +:::{tip} +A {guilabel}`Responsible` user can be assigned to the campaign by activating +{ref}`developer-mode`. +::: + +:::{note} +Each activity in a campaign's workflow can target a subset of the target audience; see the +{doc}`workflow_activities` documentation for more information. +::: + +(marketing-automation-defining-filters)= + +## Defining filters + +The default campaign {guilabel}`Filter` configuration is set to {guilabel}`Match all records`, +indicating that the campaign is targeting **all** records of the {guilabel}`Target` model. + +To refine the {guilabel}`Filter` rules of a campaign, click the {guilabel}`➕ Add condition` button +to reveal a new row with configurable rule parameters. See the {ref}`Search, filter, and group +records ` documentation for more information on how to create filter rules. + +```{image} target_audience/domain-filters.png +:align: center +:alt: A new filter rule row on the campaign form Filters. +``` + +At the bottom of the filter rules is a {guilabel}`# record(s)` button, which indicates the total +number of records targeted by this domain. Select the {guilabel}`# record(s)` button to open a +{guilabel}`Selected records` pop-up window, in which the targeted records can be viewed. + +:::{tip} +Activate {ref}`developer-mode` to reveal each field's technical name and data type, as well as +the {guilabel}`# Code editor` text area below the filter rules, to view and edit the domain +manually. +::: + +```{eval-rst} +.. example:: + To target all leads and opportunities from the *CRM* app that are in the *New* stage, and have an + expected revenue greater than $1,000, the following should be entered: + + - :guilabel:`Target`: `Lead/Opportunity` + - :guilabel:`Unicity based on`: `Email (Lead/Opportunity)` + - :guilabel:`Filter`: :guilabel:`Match` :guilabel:`all 🔽 (down arrow)` :guilabel:`of the + following rules:` + + #. :guilabel:`Stage` :guilabel:`is in` :guilabel:`New` + #. :guilabel:`Expected Revenue` :guilabel:`>` `1,000` + #. :guilabel:`any 🔽 (down arrow)` :guilabel:`of:` + + - :guilabel:`Type` :guilabel:`=` :guilabel:`Lead` + - :guilabel:`Type` :guilabel:`=` :guilabel:`Opportunity` + + With the above configuration, the campaign targets :guilabel:`157 record(s)`. + + .. image:: target_audience/filter-scenario-one.png + :align: center + :alt: A domain configuration in a Marketing Automation campaign. +``` + +:::{seealso} +- {ref}`Domain developer documentation ` +- {doc}`workflow_activities` +- {doc}`testing_running` +- {doc}`understanding_metrics` +::: + diff --git a/content/applications/marketing/marketing_automation/testing_running.md b/content/applications/marketing/marketing_automation/testing_running.md new file mode 100644 index 000000000..e5139bccb --- /dev/null +++ b/content/applications/marketing/marketing_automation/testing_running.md @@ -0,0 +1,169 @@ +# Testing/running campaigns + +The Odoo *Marketing Automation* app allows users to test marketing campaigns (and mailings) before +officially running them to check for errors and correct any mistakes before it reaches its target +audience. + +## Test campaigns + +To test a marketing campaign, open the {menuselection}`Marketing Automation app`, and select the +desired campaign to test, which reveals the campaign's detail form. + +On the campaign detail form, make sure the campaign already has activities configured in the +workflow (or build a campaign by following the directions on {doc}`workflow_activities` +documentation). + +:::{note} +Testing marketing automation campaigns is meant to be performed in the production version of the +database. Duplicate (or trial) databases have limited email sending capabilities. +::: + +To start a test, click the {guilabel}`Launch a Test` button at the top of the campaign form, to the +right of the {guilabel}`Start` button. + +```{image} testing_running/launch-test.png +:align: center +:alt: Launch a test button on a campaign detail form in Odoo Marketing Automation. +``` + +When clicked, a {guilabel}`Launch a test` pop-up window appears. + +```{image} testing_running/launch-test-popup-window.png +:align: center +:alt: Launch a test pop-up window that appears in Odoo Markting Automation. +``` + +In the {guilabel}`Launch a test` pop-up window, click the {guilabel}`Pick or create a/an Contact to +generate a Test Participant` field to reveal a drop-down menu of contacts. From this drop-down menu, +select an existing contact (or create a new one) to run the test on. + +:::{note} +Only one contact can be selected from the {guilabel}`Launch a test` pop-up window. +::: + +To create a new contact directly from the {guilabel}`Launch a test` pop-up window, start typing the +name of the new contact in the blank field, and click {guilabel}`Create and edit...`. + +```{image} testing_running/new-contact-from-launch-test-popup.png +:align: center +:alt: Typing in a new contact directly from the launch a test pop-up window in Odoo. +``` + +Doing so reveals a blank {guilabel}`Create Record` pop-up form, in which the necessary contact +information ({guilabel}`Email`, {guilabel}`Mobile`, etc.) *must* be entered, in order for the test +to work. When the necessary information is entered, click {guilabel}`Save & Close`. + +```{image} testing_running/blank-contact-form.png +:align: center +:alt: A blank contact form from a launch test pop-up window in Odoo Marketing Automation. +``` + +When all the necessary fields have been entered, click {guilabel}`Save & Close` to return to the +{guilabel}`Launch a test` pop-up window. + +Once a contact is selected, click {guilabel}`Launch` to reveal the campaign test page. + +```{image} testing_running/test-screen.png +:align: center +:alt: Test screen in Odoo Marketing Automation. +``` + +On the campaign test page, the name of the {guilabel}`Record` being tested is visible, along with +the precise time this test workflow was started in the {guilabel}`Workflow Started On` field. +Beneath that, in the {guilabel}`Workflow` section is the first activity (or activities) in the +workflow that's being tested. + +To start a test, click the {guilabel}`Run` button, represented by a {guilabel}`▶️ (play button)` +icon beside the first activity in the workflow. When clicked, the page reloads, and Odoo shows the +various results (and analytics) connected to that specific activity as they occur, in real-time. + +:::{note} +If a child activity is scheduled beneath a parent activity, that child activity will be revealed +slightly indented in the workflow, once that parent activity has been run, via the {guilabel}`▶️ +(play button)` icon. +::: + +```{image} testing_running/workflow-test-progress.png +:align: center +:alt: Workflow test progress in Odoo Marketing Automation. +``` + +Once all the workflow activities are completed, the test ends, and the status bar (in the +upper-right corner) moves to the {guilabel}`Completed` stage. + +To stop a test before all the workflow activities are completed, click the {guilabel}`Stop` button +in the upper-left corner of the campaign test page. + +## Run campaigns + +To run a campaign, navigate to {menuselection}`Marketing Automation app`, and select the desired +campaign to run. + +On the campaign detail form, with all the desired activities ready in the {guilabel}`Workflow` +section, click {guilabel}`Start` in the upper-left corner to officially run the campaign to the +configured target audience specified on the campaign detail form. + +Clicking {guilabel}`Start` launches the campaign, and the status bar of the campaign switches to +{guilabel}`Running`, which is located in the upper-right corner of the campaign detail form. + +```{image} testing_running/campaign-running-status.png +:align: center +:alt: The status of a marketing campaign changing to running in the upper-right corner. +``` + +:::{note} +If some participants are already running on a campaign, and was stopped for any reason, clicking +the {guilabel}`Start` button again prompts a pop-up warning. This warning advises the user to +click an {guilabel}`Update` button to apply any modifications made to the campaign. + +```{image} testing_running/workflow-modification-warning.png +:align: center +:alt: The workflow has been modified warning pop-up window of a marketing campaign +: form. +``` + +Be aware that participants that had already gone through an entire campaign in its original state +**can** be reintroduced into the newly-modified campaign, and new traces could be created for +them. +::: + +Then, as the mailings and actions are triggered in the {guilabel}`Workflow`, the various stats and +data related to each activity appear in each activity block. There is also a series of stat-related +smart buttons that appear at the top of the campaign detail form, as well. + +These analytical smart buttons will *also* populate with real-time data as the campaign progresses: +{guilabel}`Templates`, {guilabel}`Clicks`, {guilabel}`Tests`, {guilabel}`Participants`. + +```{image} testing_running/campaign-smart-buttons.png +:align: center +:alt: The row of smart buttons that appear in a currently running marketing campaign +: in Odoo. +``` + +## Stop campaigns + +To stop a campaign that's currently running, navigate to the {menuselection}`Marketing Automation +app`, and select the desired campaign to stop. On the campaign detail form, click the +{guilabel}`Stop` button in the upper-left corner. + +```{image} testing_running/stop-button-campaign-form.png +:align: center +:alt: The stop button on a typical campaign detail form in Odoo Marketing Automation +: application. +``` + +When clicked, the campaign is officially stopped, and the status changes to {guilabel}`Stopped` in +the upper-right corner of the campaign detail form. + +```{image} testing_running/campaign-stopped-status-bar.png +:align: center +:alt: Marketing campaign's stopped status on a campaign detail form in Odoo Marketing +: Automation. +``` + +:::{seealso} +- {doc}`Campaign configuration <../marketing_automation>` +- {doc}`target_audience` +- {doc}`workflow_activities` +::: + diff --git a/content/applications/marketing/marketing_automation/understanding_metrics.md b/content/applications/marketing/marketing_automation/understanding_metrics.md new file mode 100644 index 000000000..1702bf242 --- /dev/null +++ b/content/applications/marketing/marketing_automation/understanding_metrics.md @@ -0,0 +1,187 @@ +# Campaign metrics + +*Campaign metrics* are detailed statistics and analytics within a marketing campaign, measuring its +success and effectiveness. Triggered marketing activities populate relevant activity blocks with +real-time metrics, in the campaign detail form. + +## Activity analytics + +In the {guilabel}`Workflow` section of a campaign detail form in the *Marketing Automation* app, +where the various campaign activities are located, a collection of useful data can be found on every +individual activity block, like number of communications {guilabel}`Sent`, percentage of messages +that have been {guilabel}`Clicked`, and more. + +```{image} understanding_metrics/activity-analytics-block-sample.png +:align: center +:alt: An activity block in the workflow section with useful analytical data in Odoo. +``` + +To the left of the activity block, the configured {doc}`trigger time ` is +displayed as a duration (either {guilabel}`Hours`, {guilabel}`Days`, {guilabel}`Weeks`, or +{guilabel}`Months`) if it corresponds to period after the workflow begins. + +:::{note} +If the trigger time is dependent on another activity or triggering action (e.g. {guilabel}`Mail: +Replied`, etc.) the time is displayed, along with the necessary action for that activity to be +activated (e.g. `Replied after 2 Hours`). + +```{image} understanding_metrics/replied-after-activity-time-trigger.png +:align: center +:alt: Time trigger display when dependent on another activity in Odoo Marketing Automation. +``` +::: + +In the activity block, an icon represents each activity type. An {guilabel}`✉️ (envelope)` icon +means the activity is an email. Three tiny, interlocking {guilabel}`⚙️ (gear)` icons means the +activity is an internal action. And, a small, basic {guilabel}`📱 (mobile)` icon means the activity +is an SMS. + +:::{tip} +The activity type name is also displayed in smaller font below the activity title. +::: + +Beside the activity icon, at the top of the activity block, is the title of the activity. To the +right of the activity title, there are {guilabel}`Edit` and {guilabel}`Delete` buttons. + +Click {guilabel}`Edit` to open the {guilabel}`Open: Activities` pop-up form for that specific +activity, in which that activity can be modified. Click the {guilabel}`Delete` button to completely +delete that specific activity from the workflow. + +:::{seealso} +{doc}`workflow_activities` +::: + +### Activity graph tab + +In every activity block, the {guilabel}`Graph (pie chart icon)` tab is open by default, displaying +related metrics as a simple line graph. The success metrics are represented in `green` and the +rejected metrics are represented in `red`. + +Numerical representations of both {guilabel}`Success` and {guilabel}`Rejected` activities are shown +to the right of the line graph. + +:::{tip} +Hovering over any point in the line graph of the activity block reveals a notated breakdown of +data for that specific date. + +```{image} understanding_metrics/graph-breakdown-data.png +:align: center +:alt: Hovering over any point in line graph reveals notated breakdown of data in Odoo. +``` +::: + +Beneath the graph in the activity block, for *Email* or *SMS* activity types, a line of accessible +data figures provide a bird's eye view of the campaign activity, including: {guilabel}`Sent` +(numerical), {guilabel}`Clicked` (percentage), {guilabel}`Replied` (percentage), and +{guilabel}`Bounced` (percentage). + +:::{tip} +Clicking any of those stats on the {guilabel}`DETAILS` line, beneath the line graph, reveals a +separate page containing every specific record for that particular data point. +::: + +### Activity filter tab + +Next to the {guilabel}`Graph` tab on the activity block, there's the option to open a +{guilabel}`Filter` tab (represented by a {guilabel}`filter/funnel` icon). + +```{image} understanding_metrics/activity-filter-tab.png +:align: center +:alt: What a campaign activity filter tab looks like in Odoo Marketing Automation. +``` + +Clicking the {guilabel}`Filter` tab on an activity block, reveals what the specific filters are for +that particular campaign activity, and how many records in the database match that specific +criteria. + +:::{tip} +Clicking the {guilabel}`records` link beneath the displayed filter reveals a separate pop-up +window containing a list of all the records that match that specific campaign activity rule(s). +::: + +## Link tracker + +Odoo tracks all URLs used in marketing campaigns. To access and analyze those URLs, navigate to +{menuselection}`Marketing Automation app --> Reporting --> Link Tracker`. Doing so reveals a +{guilabel}`Link Statistics` page, wherein all campaign-related URLs can be analyzed. + +```{image} understanding_metrics/campaign-link-tracker.png +:align: center +:alt: What a campaign activity filter tab looks like in Odoo Marketing Automation. +``` + +The default view on the {guilabel}`Link Statistics` page is the {guilabel}`Bar Chart` view, but +there are different view options available in the upper-left corner. There is the option to view the +statistics as a {guilabel}`Line Chart` or {guilabel}`Pie Chart`. + +Beside that, there is also the option to view the statistics as {guilabel}`Stacked`, and the data +can be put into {guilabel}`Descending` or {guilabel}`Ascending` order. + +To the far-left of the view options, there is the {guilabel}`Measures` drop-down menu. When clicked, +the options to view the {guilabel}`Number of Clicks` or total {guilabel}`Count` are available. And, +to the right of the {guilabel}`Measures` drop-down menu, there's the ability to add any data to a +spreadsheet by clicking the {guilabel}`Insert in Spreadsheet` button. + +Also, in the upper-right corner of the {guilabel}`Link Statistics` page, to the far-right of the +search bar, there are additional view options to choose from: the default {guilabel}`Graph` view, +the {guilabel}`Pivot` table view, and the {guilabel}`List` view. + +## Traces + +Odoo tracks all activities used in every marketing campaign. The data related to these activities +can be accessed and analyzed in the {guilabel}`Traces` page, which can be found by navigating to +{menuselection}`Marketing Automation app --> Reporting --> Traces`. + +```{image} understanding_metrics/traces-page-marketing-automation.png +:align: center +:alt: The Traces page in the Odoo Marketing Automation application. +``` + +The default view on the {guilabel}`Traces` page is the {guilabel}`Bar Chart` view, but there are +different view options available in the upper-left corner. There is the option to view the +statistics as a {guilabel}`Line Chart` or {guilabel}`Pie Chart`. + +At the top of the graph, there's a color key, informing the user which activities have been +{guilabel}`Processed`, {guilabel}`Scheduled`, and {guilabel}`Rejected`. There's also an outline +indicator to inform users of the {guilabel}`Sum` of certain activities, as well. + +Beside the various view option in the upper-left corner of the {guilabel}`Traces` page, there is +also the option to view the statistics as {guilabel}`Stacked`, and the data can be put into +{guilabel}`Descending` or {guilabel}`Ascending` order. + +To the far-left of the view options, there is the {guilabel}`Measures` drop-down menu. When clicked, +the options to view the {guilabel}`Document ID` or total {guilabel}`Count` are available. And, to +the right of the {guilabel}`Measures` drop-down menu, there's the ability to add any data to a +spreadsheet by clicking the {guilabel}`Insert in Spreadsheet` button. + +Also, in the upper-right corner of the {guilabel}`Link Statistics` page, to the far-right of the +search bar, there are additional view options to choose from: the default {guilabel}`Graph` view, +the {guilabel}`Pivot` table view, and the {guilabel}`List` view. + +## Participants + +Odoo tracks all participants related to every marketing campaign. The data related to these +participants can be accessed and analyzed in the {guilabel}`Participants` page, which can be found +by navigating to {menuselection}`Marketing Automation app --> Reporting --> Participants`. + +```{image} understanding_metrics/participants-page-marketing-automation.png +:align: center +:alt: The Participants page in the Odoo Marketing Automation application. +``` + +The default view on the {guilabel}`Participants` page is the {guilabel}`Pie Chart` view, but there +are different view options available in the upper-left corner. There is the option to view the +statistics as a {guilabel}`Line Chart` or {guilabel}`Bar Chart`. + +At the top of the graph, there's a color key that describes the type of participants found in the +graph. + +To the far-left of the view options, there is the {guilabel}`Measures` drop-down menu. When clicked, +the options to view the {guilabel}`Record ID` or total {guilabel}`Count` are available. And, to the +right of the {guilabel}`Measures` drop-down menu, there's the ability to add any data to a +spreadsheet by clicking the {guilabel}`Insert in Spreadsheet` button. + +Also, in the upper-right corner of the {guilabel}`Link Statistics` page, to the far-right of the +search bar, there are additional view options to choose from: the default {guilabel}`Graph` view, +the {guilabel}`Pivot` table view, and the {guilabel}`List` view. + diff --git a/content/applications/marketing/marketing_automation/workflow_activities.md b/content/applications/marketing/marketing_automation/workflow_activities.md new file mode 100644 index 000000000..053f82427 --- /dev/null +++ b/content/applications/marketing/marketing_automation/workflow_activities.md @@ -0,0 +1,346 @@ +# Campaign workflow activities + +A *workflow* is the overall *activity* structure of a marketing automation campaign. There can only +be a single workflow in each campaign. However, a workflow can be made up of any number of +{ref}`activities ` to meet the needs of the campaign. + +:::{figure} workflow_activities/workflow-activities.png +:align: center +:alt: A workflow in an Odoo Marketing Automation campaign. + +Workflow sequence of three activities; the last child activity has a {ref}`trigger type +` of **Mail: not opened**. +::: + +(marketing-automation-activities)= + +## Activities + +Activities are the methods of communication or server actions, organized in a workflow, that are +executed within a campaign; they are the building blocks of the campaign's workflow. + +A new activity can be added to the workflow on a campaign form by selecting an existing campaign or +{ref}`creating a new campaign ` from the {menuselection}`Marketing +Automation app --> Campaigns` dashboard, then clicking the {guilabel}`Add new activity` button in +the {guilabel}`Workflow` section. Doing so opens the {guilabel}`Create Activities` pop-up window. + +First, define the name of the activity in the {guilabel}`Activity Name` field, and select the +{ref}`type of activity ` to be executed from the +{guilabel}`Activity Type` field. + +Then, configure the activity's {ref}`Trigger `, and optionally, the +{ref}`Expiry Duration ` and the {ref}`DOMAIN +` of the activity. + +Once the activity is fully configured, click {guilabel}`Save & Close` to add it to the campaign's +workflow, or click {guilabel}`Save & New` to add the activity to the workflow and open a new +{guilabel}`Create Activities` pop-up window to add another activity. Clicking {guilabel}`Discard` +closes the pop-up window without saving the activity. + +```{image} workflow_activities/create-activities.png +:align: center +:alt: The create activities pop-up window. +``` + +(marketing-automation-activity-types)= + +### Activity types + +There are three different types of activities available in the *Marketing Automation* app: + +- {ref}`Email `: an email that is sent to the target + audience. +- {ref}`Server action `: an internal action within the + database that is executed. +- {ref}`SMS `: a text message that is sent to the target + audience. + +(marketing-automation-email-activity-type)= + +#### Email + +If {guilabel}`Email` is selected as the {guilabel}`Activity Type`, the option to {guilabel}`Pick a +Template` in the {guilabel}`Mail Template` field is available. + +To create a new template directly from the {guilabel}`Mail Template` field, start typing the title +of the new template, then select {guilabel}`Create and edit...` to reveal a {guilabel}`Create +Marketing Template` pop-up window. Proceed to create and configure the new email template. + +```{image} workflow_activities/email-activity-type.png +:align: center +:alt: The create and edit email drop-down option on create activities pop-up window. +``` + +Once the email template is configured, click {guilabel}`Save & Close` to save the activity, and +return to the {guilabel}`Create Activities` pop-up window, in order to continue to configure the +{ref}`trigger `. + +:::{note} +The title used for the {guilabel}`Mail Template` **must** be unique from any other mail template +titles in the campaign, and it also serves as the subject of the email. +::: + +:::{seealso} +{doc}`Creating and configuring email templates <../email_marketing>` +::: + +(marketing-automation-sa-activity-type)= + +#### Server action + +If {guilabel}`Server Action` is selected as the {guilabel}`Activity Type`, the option to +{guilabel}`Pick a Server Action` in the {guilabel}`Server Action` field is available. This field is +a drop-down menu containing all the pre-configured server actions for the campaign's +{guilabel}`Target` model. Optionally, {ref}`create a new server action +`. + +```{image} workflow_activities/sa-activity-type.png +:align: center +:alt: The Server Action drop-down menu on create activities pop-up window. +``` + +After selecting a pre-configured server action, no other activity type configuration is needed. +Click {guilabel}`Save & Close` to save the activity, and return to the {guilabel}`Create Activities` +pop-up window, in order to configure the {ref}`trigger `. + +:::{tip} +To view all server actions in the database, activate {ref}`developer-mode`, and navigate to +{menuselection}`Settings app --> Technical --> Actions --> Server Actions` dashboard. +::: + +(marketing-automation-create-sa)= + +##### Create a new server action + +The option to create a new server action is also available. To do so, type in the {guilabel}`Server +Action` field a title for the new action, then click {guilabel}`Create and edit...`. Doing so +reveals a blank {guilabel}`Create Server Action` pop-up window, wherein a custom server action can +be created and configured. + +```{image} workflow_activities/create-sa.png +:align: center +:alt: The Create Server Action pop-up window. +``` + +On the {guilabel}`Create Server Action` pop-up window, select the {guilabel}`Type` of server action. +The configuration fields change, depending on the selected {guilabel}`Type`: + +- {guilabel}`Update Record`: update the values of a record. +- {guilabel}`Create Activity`: create an activity with the *Discuss* app. +- {guilabel}`Send Email`: post a message, a note, or send an email with the *Discuss* app. +- {guilabel}`Send SMS`: send an SMS, and log them on documents, with the *SMS* app. +- {guilabel}`Add Followers` or {guilabel}`Remove Followers`: add or remove followers on a record + with the *Discuss* app. +- {guilabel}`Create Record`: create a new record with new values. +- {guilabel}`Execute Code`: execute a block of Python code. +- {guilabel}`Send Webhook Notification`: send a POST request to an external system. +- {guilabel}`Execute Existing Actions`: define an action that triggers several other server + actions. + +Once the server action is configured, click {guilabel}`Save & Close` to save the activity, and +return to the {guilabel}`Create Activities` pop-up window, in order to configure the {ref}`trigger +`. + +:::{tip} +Some of the server action types have advanced configurations available when {ref}`developer-mode` +is activated, such as specifying the {guilabel}`Allowed Groups` that can execute this server +action. +::: + +(marketing-automation-sms-activity-type)= + +#### SMS + +If {guilabel}`SMS` is selected as the {guilabel}`Activity Type`, the option to {guilabel}`Pick a +Template` in the {guilabel}`SMS Template` field is available. + +To create a new template directly from the {guilabel}`SMS Template` field, start typing the title of +the new template, and select {guilabel}`Create and edit...` to reveal a {guilabel}`Create Marketing +Template` pop-up window. Proceed to create and configure the new SMS template. + +```{image} workflow_activities/sms-activity-type.png +:align: center +:alt: The create and edit email drop-down option on create activities pop-up window. +``` + +Once the SMS template is configured, click {guilabel}`Save & Close` to save the activity, and return +to the {guilabel}`Create Activities` pop-up window, in order to configure the {ref}`trigger +`. + +:::{seealso} +{doc}`Creating and configuring SMS templates <../sms_marketing>` +::: + +(marketing-automation-trigger)= + +### Trigger + +Once an {ref}`activity type ` is configured, the next step in +the {guilabel}`Create Activities` pop-up window is to define when the activity should be executed. +This is done in the {guilabel}`Trigger` field group. + +```{image} workflow_activities/trigger.png +:align: center +:alt: The trigger field group on Create Activities pop-up window. +``` + +To set an execution delay for the activity from when the {ref}`trigger type +` occurs, type a whole number in the *interval number* input +(e.g. `2` is valid, `0` is also valid, and `1.5` is not). + +Next, select the unit of time for the interval number in the *interval type* drop-down menu, the +options are: {guilabel}`Hours`, {guilabel}`Days`, {guilabel}`Weeks`, and {guilabel}`Months`. + +```{eval-rst} +.. example:: + If the interval number is set to `0` and the interval type is set to :guilabel:`Hours`, the + activity will be executed immediately after the trigger type occurs (at the next scheduled run of + the :ref:`Mail: Email Queue Manager cron `). +``` + +(marketing-automation-trigger-type)= + +#### Trigger type + +To define the event occurrence that sets the activity into motion, select a *trigger type* from the +drop-down menu: + +- {guilabel}`beginning of workflow`: the activity is executed when the campaign is started. + +All other trigger types reveal a drop-down menu {guilabel}`Activity` field containing all of the +other activities in the campaign. Selecting one of these types converts this activity into a +{ref}`child activity ` to be executed directly after the +selected {guilabel}`Activity`: + +- {guilabel}`another activity`: to be executed after another activity in the campaign. +- {guilabel}`Mail: opened`: the activity's email was opened by the participant. +- {guilabel}`Mail: not opened`: the activity's email was **not** opened by the participant. +- {guilabel}`Mail: replied`: the activity's email was replied to by the participant. +- {guilabel}`Mail: not replied`: the activity's email was **not** replied to by the participant. +- {guilabel}`Mail: clicked`: a link in the activity's email was clicked by the participant. +- {guilabel}`Mail: not clicked`: a link in the activity's email was **not** clicked by the + participant. +- {guilabel}`Mail: bounced`: the activity's email has bounced. +- {guilabel}`SMS: clicked`: a link in the activity's SMS was clicked by the participant. +- {guilabel}`SMS: not clicked`: a link in the activity's SMS was **not** clicked by the participant. +- {guilabel}`SMS: bounced`: the activity's SMS has bounced. + +```{eval-rst} +.. example:: + If the trigger type is set to :guilabel:`Mail: clicked`, this activity is converted to a + :ref:`child activity ` and will execute **after** a + participant clicks on a link from the parent activity defined in the :guilabel:`Activity` field. +``` + +(marketing-automation-expiry-duration)= + +### Expiry duration + +Optionally, an {guilabel}`Expiry Duration` can be defined in the {guilabel}`Create Activities` +pop-up window to cancel the execution of this activity after a specific amount of time. Selecting +this checkbox reveals the {guilabel}`Cancel after` field with *interval* and *interval type* inputs. + +Type a whole number in the interval number input (e.g. `2` is valid, `0` is also valid, and `1.5` +is not). Then, select the unit of time for the interval number in the interval type drop-down menu, +the options are: {guilabel}`Hours`, {guilabel}`Days`, {guilabel}`Weeks`, and {guilabel}`Months`. + +```{eval-rst} +.. example:: + If the interval number is set to `2` and the interval type is set to :guilabel:`Days`, the + activity will be cancelled if it has not been executed within 2 days of the trigger type. +``` + +(marketing-automation-activity-domain)= + +### Activity domain + +The {guilabel}`DOMAIN` section of the {guilabel}`Create Activities` pop-up window contains fields to +further filter the target audience of the activity. + +The {guilabel}`Activity Filter` field focuses this activity, **and** its {ref}`child activities +`, even further on a specific group of the campaign's filter. +The process is the same as {ref}`defining filters ` for the +campaign, and the fields that are available to filter are also specific to the {guilabel}`Target` +of the campaign. + +The {guilabel}`# record(s)` beside the {guilabel}`Activity Filter` field indicates how many records +are currently being targeted by this {guilabel}`Activity Filter`. + +The {guilabel}`Applied Filter` displays the combined filters from the {guilabel}`Activity Filter` +and the inherited campaign {doc}`Filter `. This field is read-only. + +The {guilabel}`# record(s)` beside the {guilabel}`Applied Filter` field indicates how many records, +in total, are currently being targeted by the activity. + +(marketing-automation-child-activities)= + +## Child activities + +Activities that are connected to, and triggered by, another activity are known as, *child +activities*. + +The activity that triggers a child activity is known as its *parent activity*. + +A child activity can be added to a campaign's workflow by hovering over the {guilabel}`➕ Add child +activity` button, located beneath the desired parent activity. + +The child activity's {ref}`trigger types ` are specific to the +parent {ref}`activity type ` (*Email*, *SMS*, or *Server +Action*), and are as follows: + +```{eval-rst} +.. tabs:: + + .. tab:: Email + + .. image:: workflow_activities/email-trigger-types.png + :align: center + :alt: The trigger types for child activities of an email activity. + + Each trigger the child activity on the following conditions of the parent activity: + + - :guilabel:`Add Another Activity`: to be executed after the parent activity. + - :guilabel:`Opened`: the email was opened by the participant. + - :guilabel:`Not Opened`: the email was **not** opened by the participant. + - :guilabel:`Replied`: the email was replied to by the participant. + - :guilabel:`Not Replied`: the email was **not** replied to by the participant. + - :guilabel:`Clicked`: a link in the email was clicked by the participant. + - :guilabel:`Not Clicked`: a link in the email was **not** clicked by the participant. + - :guilabel:`Bounced`: the email has bounced. + + .. tab:: Server Action + + .. image:: workflow_activities/sa-trigger-types.png + :align: center + :alt: The trigger types for child activities of a server action activity. + + Triggers the child activity on the following condition of the parent activity: + + - :guilabel:`Add Another Activity`: to be executed after the parent activity. + + .. tab:: SMS + + .. image:: workflow_activities/sms-trigger-types.png + :align: center + :alt: The trigger types for child activities of an SMS activity. + + Each trigger the child activity on the following conditions of the parent activity: + + - :guilabel:`Add Another Activity`: to be executed after the parent activity. + - :guilabel:`Clicked`: a link in the SMS was clicked by the participant. + - :guilabel:`Not Clicked`: a link in the SMS was **not** clicked by the participant. + - :guilabel:`Bounced`: the SMS has bounced. +``` + +Once a trigger type is selected, the {guilabel}`Create Activities` pop-up window opens to configure +the child activity. The process is the same as {ref}`creating a new activity +`, with the exception that the {guilabel}`Trigger` field is +pre-filled with the selected trigger type, and the {guilabel}`Activity` field has the parent +activity selected. + +:::{seealso} +- {doc}`testing_running` +- {doc}`understanding_metrics` +- {doc}`target_audience` +::: + diff --git a/content/applications/marketing/sms_marketing.md b/content/applications/marketing/sms_marketing.md new file mode 100644 index 000000000..a26515d7c --- /dev/null +++ b/content/applications/marketing/sms_marketing.md @@ -0,0 +1,88 @@ +--- +show-content: true +--- + +# SMS Marketing + +Utilizing {abbr}`SMS (Short Message Service)` outreach in communication strategies can help +companies expand their market reach, especially in some countries, where emails might not be very +common, or even used at all. + +Odoo's *SMS Marketing* application can also help boost conversion rates around valuable actions, +such as event registrations, free trials, purchases, etc., since text and mobile-based marketing +channels typically yield higher {abbr}`CTOR (click-to-open rate)` and {abbr}`CTR (click-through +rate)` outcomes. + +:::{seealso} +[Odoo Tutorials: Marketing](https://www.odoo.com/slides/marketing-27) +::: + +```{eval-rst} +.. cards:: + + .. card:: Create SMS messages + :target: sms_marketing/create_sms + + Explore how to create, configure, send, and schedule SMS messages. + + .. card:: SMS analysis + :target: sms_marketing/sms_analysis + + Examine detailed reporting metrics related to every aspect of sent SMS messages. + + .. card:: SMS marketing campaigns + :target: sms_marketing/marketing_campaigns + + Discover how to create and customize SMS marketing campaigns for any occasion with Odoo. + + .. card:: Mailing lists and blacklists + :target: sms_marketing/mailing_lists_blacklists + + Set up custom mailing lists and blacklists to ensure all SMS messages reach the right + recipients. + + .. card:: Pricing and FAQ + :target: sms_marketing/pricing_and_faq + + Find out more about Odoo's SMS pricing, and check out some of the most frequently asked + questions. +``` + +## SMS marketing dashboard + +When the application is opened, Odoo displays the main {guilabel}`SMS Marketing` dashboard, which +showcases the various SMS mailings that have been created, along with pertinent information and data +related to that specific message. + +The {icon}`oi-view-kanban` {guilabel}`Kanban` view is the default Odoo uses when the application is +opened, which provides an organized display of the SMS mailings that have been created, and what +their current status is at the moment. + +:::{note} +An {abbr}`SMS (Short Message Service)` mailing can have one of the following statuses: +{guilabel}`Draft`, {guilabel}`In Queue`, {guilabel}`Sending`, or {guilabel}`Sent`. +::: + +In the upper right corner of the main {guilabel}`SMS Marketing` dashboard, there are a few different +view options to choose from. Each one provides a unique take on the same SMS information. + +The {icon}`oi-view-list` {guilabel}`List` view provides the same useful data related to SMS +mailings, but in a more traditional list layout. + +The {icon}`fa-calendar` {guilabel}`Calendar` view shows when SMS mailings are scheduled or have been +sent. Clicking a future date opens a blank SMS template to be scheduled for that date. + +Lastly, the {icon}`fa-area-chart` {guilabel}`Graph` view visualizes that same SMS-related data in +series of graphs and charts. Odoo also provides various ways to sort and group the data for more +detailed analysis. + +```{toctree} +:titlesonly: true + +sms_marketing/create_sms +sms_marketing/sms_analysis +sms_marketing/marketing_campaigns +sms_marketing/mailing_lists_blacklists +sms_marketing/pricing_and_faq +``` + diff --git a/content/applications/marketing/sms_marketing/create_sms.md b/content/applications/marketing/sms_marketing/create_sms.md new file mode 100644 index 000000000..e0a60d0ca --- /dev/null +++ b/content/applications/marketing/sms_marketing/create_sms.md @@ -0,0 +1,123 @@ +# Create SMS messages + +To start, click {guilabel}`Create` on the main {guilabel}`SMS Marketing` dashboard, and Odoo reveals +a blank SMS template form, which can be configured in a number of different ways. + +```{image} create_sms/sms-create.png +:align: center +:alt: Creating an SMS marketing template. +``` + +First, give the mailing a {guilabel}`Subject`, which describes what the mailing is about. + +Next, in the {guilabel}`Recipients` field, choose to whom this {abbr}`SMS (Short Message Service)` +will be sent. By default, Odoo has {guilabel}`Mailing List` selected. If this is the desired +{guilabel}`Recipients` field option, specify which mailing list Odoo should send this {abbr}`SMS +(Short Message Service)` to in the {guilabel}`Select Mailing List` field. + +:::{note} +To create (or edit) a mailing list, go to {menuselection}`Mailing Lists --> Mailing List`. There, +Odoo displays all previously created mailing lists, along with various types of data related to +that specific list (e.g. number of contacts, mailings, recipients, etc.). + +To learn more about mailing lists and contacts, check out {doc}`mailing_lists_blacklists`. +::: + +```{image} create_sms/sms-mailing-list.png +:align: center +:alt: View of the mailing list page in the SMS marketing application. +``` + +To reveal all the possible options in the {guilabel}`Recipients` field, click the field to see all +the choices Odoo makes available. + +When another field (other than {guilabel}`Mailing List`) is selected, the option to specify that +chosen field even further becomes available — either with a default recipient filter equation that +appears automatically (which can be customized to fit any business need), or, if no default +recipient filter equation is present, an {guilabel}`Add Filter` button will appear. + +Clicking the {guilabel}`Add Filter` button, reveals fully customizable domain rule fields, which can +be configured similar to an equation. You can create multiple recipient rules, if necessary. + +Then, Odoo will only send the {abbr}`SMS (Short Message Service)` to recipients who fit into +whatever criteria is configured in those fields. Multiple rules can be added. + +```{eval-rst} +.. example:: + If :guilabel:`Contact` is chosen, all of the *Contacts* records in the Odoo database (vendors, + customers, etc.) will receive the :abbr:`SMS (Short Message Service)`, by default — unless more + specific recipient rules are entered. + + For instance, the message below will only be sent to contacts in the database that are located in + the United States (e.g. `Country` > `Country Name` equals `United States`), and they haven't + blacklisted themselves from any mailings (e.g. `Blacklist` > `is` > `not set`). + + .. image:: create_sms/contact-recipient.png + :align: center + :alt: Contact recipients on SMS marketing. +``` + +## Writing SMS messages + +Enter the content of the {abbr}`SMS (Short Message Service)` in the text field, found in the +{guilabel}`SMS Content` tab. Links and emojis can also be included. Beneath the text field, Odoo +displays how many characters are used in the message, along with how many {abbr}`SMS (Short Message +Service)` mailings it will take to deliver the complete message. + +:::{tip} +To check the price of sending an {abbr}`SMS (Short Message Service)` for a country, click on the +{guilabel}`Information` icon. +::: + +```{image} create_sms/sms-price-check.png +:align: center +:alt: SMS price check icon. +``` + +:::{note} +Credits must be purchased from Odoo in order to take advantage of the *SMS Marketing* app; +{abbr}`SMS (Short Message Service)` messages will not be sent without credits. +::: + +:::{seealso} +[Odoo SMS - FAQ](https://iap-services.odoo.com/iap/sms/pricing) +::: + +## Track links used in SMS messages + +When links are used in {abbr}`SMS (Short Message Service)` messages, Odoo automatically generates +link trackers to gather analytical data and metrics related to those specific links, which can be +found by going to {menuselection}`Configuration --> Link Tracker`. + +```{image} create_sms/sms-link-tracker.png +:align: center +:alt: SMS Link Tracker page. +``` + +### Adjust SMS settings + +Under the {guilabel}`Settings` tab of the SMS template, there is an option to {guilabel}`Include +opt-out link`. If activated, the recipient is able to unsubscribe from the mailing list, thus +avoiding all future mailings. + +An employee can be designated as the {guilabel}`Responsible` in the {guilabel}`Tracking` section of +the {guilabel}`Settings` tab, as well. + +```{image} create_sms/sms-settings-tab.png +:align: center +:alt: SMS Settings tab. +``` + +### Send SMS messages + +Once a mailing is created, choose when Odoo should deliver the message from the following options: + +- {guilabel}`Send`: sends the message immediately. Consider using this option if the recipient list + is highly refined, or in cases that involve fast approaching deadlines, such as a "flash sale." +- {guilabel}`Schedule`: choose a day (and time) for Odoo to send the mailing. This is typically the + best option for mailings related to a specific event. Such a method can also be used to promote a + limited-time offer, or to help plan a company's content strategy in advance. +- {guilabel}`Test`: allows for an {abbr}`SMS (Short Message Service)` to be sent to one or multiple + numbers for test purposes. Remember to use a comma between phone numbers if multiple numbers are + used as recipients. + diff --git a/content/applications/marketing/sms_marketing/mailing_lists_blacklists.md b/content/applications/marketing/sms_marketing/mailing_lists_blacklists.md new file mode 100644 index 000000000..e82bb7567 --- /dev/null +++ b/content/applications/marketing/sms_marketing/mailing_lists_blacklists.md @@ -0,0 +1,150 @@ +# Mailing lists and blacklists + +Creating or importing mailing lists in Odoo is very useful when curating content to specific groups +of people that already share similar demographics or interests. Mailing lists are also a great way +to get started if a company is migrating from another system, and already has a established +audience. + +Moreover, providing an audience with the option to 'unsubscribe' from mailings, helps businesses +maintain good customer relations, by giving recipients the power to control what they are (and +aren't) sent. + +## Mailing lists + +In the {guilabel}`SMS Marketing` app, there's an option on the header menu called {guilabel}`Mailing +Lists`. When clicked, a sub-menu is revealed with options for {guilabel}`Mailing Lists` and +{guilabel}`Mailing List Contacts`. + +Click {menuselection}`Mailing Lists --> Mailing Lists` to see an overview of all mailing lists in +the database. + +```{image} mailing_lists_blacklists/mailing-list-main-page.png +:align: center +:alt: View of the main SMS mailing list page on the Odoo SMS Marketing application. +``` + +To edit any existing list, select the desired list from the {guilabel}`Mailing Lists` page, and +proceed to modify it in a number of ways. + +To create a new mailing list, click {guilabel}`Create` in the upper left corner of the +{guilabel}`Mailing Lists` page. Doing so, will reveal a blank mailing list template form. + +```{image} mailing_lists_blacklists/sms-mailing-list-popup.png +:align: center +:alt: View of the mailing list pop-up window in Odoo SMS Marketing. +``` + +First, choose a name for the {guilabel}`Mailing List`, and activate the option {guilabel}`Is +Public`, to make the mailing list accessible to recipients on the {guilabel}`Subscription Management +page`. Doing so allows users to update their subscription preferences at any time. + +:::{note} +Checking the {guilabel}`Is Public` box is not required, but is recommended to maintain good +customer relations. +::: + +When those fields are filled in, click {guilabel}`Create` to finalize the form. Then on the main +{guilabel}`Mailing Lists` dashboard, the new mailing list that was just created will be accessible. + +To edit or customize the mailing list further, select the mailing list from the main +{guilabel}`Mailing Lists` page to reveal the mailing list detail form. + +Along the top of the mailing list detail form, there are various analytical smart buttons displaying +statistics for different metrics related to the mailing list (e.g. {guilabel}`Recipients`, +{guilabel}`Mailings`, etc.). + +To review or edit any of those elements, click the desired smart button to reveal a separate page +with in-depth data associated with the mailing list. + +To make changes to the mailing list itself, click the {guilabel}`Edit` button in the upper-left +corner of the mailing list detail form. + +```{image} mailing_lists_blacklists/sms-mailing-list.png +:align: center +:alt: View of the mailing list template form in Odoo SMS Marketing. +``` + +:::{note} +Don't forget to hit the {guilabel}`Save` button once changes have been made. +::: + +## Mailing lists contacts + +Access contacts information from one or more mailing lists navigate to {menuselection}`Mailing Lists +--> Mailing List Contacts` to reveal a dashboard with with all the contacts associated with one or +more of the configured mailing lists in the database. + +```{image} mailing_lists_blacklists/mailing-list-contacts-page.png +:align: center +:alt: View of the mailing lists contact page in the Odoo SMS Marketing application. +``` + +:::{note} +By default, Odoo reveals the {guilabel}`Mailing List Contacts` page with the {guilabel}`Exclude +Blacklisted Phone` filter in the search bar. Therefore only showing contact information for +recipients who still want to receive communications and mailings. +::: + +### Communication history in the Chatter + +An accessible record of every sent mailing(s) is kept on each recipient's *chatter* section, located +beneath a recipient's contact form (in the *Contacts* application). + +Database users can reference the chatter to easily keep track of communications, and see a history +of interactions with contacts and prospects. + +For example, sales representatives can use the chatter to quickly find out which {abbr}`SMS (Short +Message Service)` mailing promotions a certain customer has received (or not received). + +```{image} mailing_lists_blacklists/sms-marketing-chatter.png +:align: center +:alt: View of what the chatter looks like in the Odoo Contacts app. +``` + +## Blacklist + +Odoo *SMS Marketing* has a {guilabel}`Blacklist` feature that provides recipients with the power to +add their phone number to a list of people who no longer want to receieve communications or +mailings. + +This is also known as the unsubscribe process: customers will automatically be added onto a +*blacklist*, if they click {guilabel}`Unsubscribe`, via their {guilabel}`Subscription Management` +page. Customers can also be added manually to the blacklist, if necessary. + +To see a complete collection of blacklisted numbers, navigate to the {menuselection}`SMS Marketing +app --> Configuration --> Blacklisted Phone Numbers` to reveal a dashboard containing every +blacklisted phone number in the database. + +```{image} mailing_lists_blacklists/sms-blacklist-menu.png +:align: center +:alt: SMS Blacklist menu in the application. +``` + +To manually add a number to a blacklist, click the {guilabel}`Create` button in the upper-left +corner of the dashboard and enter the phone number on the next page's form. There's also a +checkbox to indicate whether that particular phone numnber is {guilabel}`Active` (or not). + +```{image} mailing_lists_blacklists/sms-blacklist-create.png +:align: center +:alt: SMS Blacklist menu in the application. +``` + +Once the form is completed, click {guilabel}`Save` to add it to the {guilabel}`Blacklisted Phone +Numbers` list. To remove any number from the blacklist, select the desired number on the dashboard, +and then, on the phone number's form, click {guilabel}`Unblacklist`. + +### Importing blacklists + +During a software/platform migration, it is possible to import an already existing blacklist of +contacts. This would include customers, who have already asked to be blacklisted\` on {abbr}`SMS +(Short Message Service)` mailings. + +To do that, navigate to {menuselection}`SMS Marketing app --> Configuration --> Blacklisted Phone +Numbers`, and then select the {guilabel}`Favorites` drop-down menu (beneath the search bar), and +click {guilabel}`Import records`. + +```{image} mailing_lists_blacklists/import-blacklist.png +:align: center +:alt: View of how to import a blacklist in Odoo SMS Marketing. +``` + diff --git a/content/applications/marketing/sms_marketing/marketing_campaigns.md b/content/applications/marketing/sms_marketing/marketing_campaigns.md new file mode 100644 index 000000000..6c330062a --- /dev/null +++ b/content/applications/marketing/sms_marketing/marketing_campaigns.md @@ -0,0 +1,164 @@ +# SMS campaign settings + +Utilizing {abbr}`SMS (Short Message Service)` campaigns with Odoo *SMS Marketing* isn't just an +effective advertisement strategy, it's also a great way to remind people about upcoming events, +issued invoices, and so much more. + +But, before {abbr}`SMS (Short Message Service)` campaigns can be created (and sent), a few specific +settings and features must be enabled first. + +## SMS campaign setting + +To enable {abbr}`SMS (Short Message Service)` campaigns in Odoo, make sure the *Mailing Campaigns* +feature is activated by going to {menuselection}`Email Marketing --> Configuration --> Settings`, +and then enable {guilabel}`Mailing Campaigns` and {guilabel}`Save` the changes. + +```{image} marketing_campaigns/sms-mailing-campaigns.png +:align: center +:alt: View of the mailing campaigns setting in Odoo. +``` + +:::{note} +Activating the *Mailing Campaigns* feature in the *General Settings* also enables the *A/B Test* +feature. +::: + +Once the setting is enabled, navigate back to the {menuselection}`SMS Marketing` app, and notice the +{guilabel}`Campaigns` header menu is now available for use. Similarly, the {guilabel}`A/B Test` tab +is now also available on every {abbr}`SMS (Short Message Service)` template form. + +## A/B tests + +{guilabel}`A/B Tests` allows any {abbr}`SMS (Short Message Service)` mailings to be tested against +other versions within the same campaign, in order to compare which version is the most successful in +producing engagement and/or conversion outcomes. + +On an {abbr}`SMS (Short Message Service)` template form, under the {guilabel}`A/B Tests` tab, +initially, there's only a single checkbox labeled: {guilabel}`Allow A/B Testing.` + +When clicked, a series of other options appear. + +```{image} marketing_campaigns/ab-tests-sms.png +:align: center +:alt: The A/B Test tab is located on an Odoo SMS Marketing app campaign form. +``` + +In the first field, enter a desired percentage of recipients to conduct the A/B Test on. + +Beneath the percentage field is the {guilabel}`Winner Selection` field. This is what Odoo will use +to determine the successful result of an A/B Test. In other words, this tells Odoo how to pick a +winning A/B test. + +The following sections are available: {guilabel}`Manual`, {guilabel}`Highest Click Rate`, +{guilabel}`Leads`, {guilabel}`Quotations`, or {guilabel}`Revenues`. + +Finally, the {guilabel}`Send Final On` field is listed. This represents the date-time that Odoo uses +as a deadline to determine the winning mailing variation. Then, Odoo sends that winning mailing +variation to the remaining recipients, who weren't involved in the test, at that prior date and +time. + +:::{tip} +Quickly create different versions of the mailing to add to the A/B Test by clicking the +{guilabel}`Create an Alternate Version` button. +::: + +:::{note} +Remember, the winning mailing variation is based on the criteria selected in the +{guilabel}`Winner Selection` field. +::: + +## Campaigns page + +To create, edit, or analyze any campaign, click {menuselection}`Campaigns` in the header menu of the +{guilabel}`SMS Marketing` app. On the {guilabel}`Campaigns` page, each campaign displays various +information related to the mailings associated with that campaign (e.g. number of emails, social +posts, SMSs, and push notifications). + +```{image} marketing_campaigns/campaigns-page.png +:align: center +:alt: Dasbhoard view of different Campaigns in the Odoo SMS Marketing app, separated +: by stage. +``` + +## Campaign templates + +Click {guilabel}`Create` to create a new campaign, and Odoo reveals a blank campaign template form +to fill out. Alternatively, select any previously-made campaign in order to duplicate, review, or +edit its campaign template form. + +```{image} marketing_campaigns/sms-campaign-template.png +:align: center +:alt: View of an SMS campaign template in Odoo SMS marketing. +``` + +With each campaign, the options to {guilabel}`Send New Mailing`, {guilabel}`Send SMS`, +{guilabel}`Send Social Post`, and {guilabel}`Push Notifications` are available above the template +form. + +Whenever one of those communication options is added to the campaign, Odoo will create a new +corresponding tab on the template form, where those types of messages can be reviewed or edited, +along with various data sets related to each specific mailing. + +At the top of the template, there are various analytical smart buttons. When clicked, Odoo reveals +in-depth metrics related to that specific topic (e.g. {guilabel}`Engagement`, +{guilabel}`Opportunities`, etc.) on a separate page. + +Beneath the smart buttons, are fields for {guilabel}`Campaign Name` and {guilabel}`Responsible`. +Odoo also allows for various {guilabel}`Tags` to be added, as well (if necessary). + +## Sending SMSs through the Contacts app + +Sending {abbr}`SMS (Short Message Service)` mailings directly through a contact's form is available +by default. + +In order to send an {abbr}`SMS (Short Message Service)` in this fashion, navigate to the +{menuselection}`Contacts` app, select the desired contact in the database, and click on the +{guilabel}`SMS` icon on the contact form (next to the {guilabel}`Phone Number` field). + +```{image} marketing_campaigns/sms-contact-form.png +:align: center +:alt: The SMS icon is located on an individual's contact form in Odoo Contacts. +``` + +To send a message to multiple contacts at once, navigate to the main {menuselection}`Contacts` app +main dashboard, choose the {guilabel}`List View`, and select all the desired contacts to whom the +message should be sent. Then, under {guilabel}`Action`, select {guilabel}`Send SMS`. + +```{image} marketing_campaigns/sms-contacts-action-send-message.png +:align: center +:alt: Select a number of contacts, click action, and select send multiple SMSs. +``` + +## Set up SMS templates for future use + +In order to set up {guilabel}`SMS Templates` for future use, activate {ref}`developer mode +`, by navigating to the main Odoo dashboard that is full of apps, and select the +{menuselection}`Settings app`. Then, scroll down to the {guilabel}`Developer Tools` section, and +click {guilabel}`Activate the Developer Mode`. + +Once *developer mode* is activated, the main Odoo dashboard appears once more, with a now-visible +bug icon, which is located at the top-right corner of the dashboard; this bug icon indicates that +developer mode is currently active. + +Next return to the {menuselection}`Settings app` and, in the now-visible header menus at the top, +choose {menuselection}`Technical --> SMS Templates` to begin setting up {abbr}`SMS (Short Message +Service)` templates for future marketing campaigns. + +```{image} marketing_campaigns/sms-template-setting.png +:align: center +:alt: Select the SMS Template option in the Technical dropdown on the Settings app. +``` + +Inside of the {guilabel}`SMS Templates` dashboard, Odoo reveals an entire page of {abbr}`SMS (Short +Message Service)` templates. The default {guilabel}`List` view showcases each template's name, and +to which recipients it applies. + +On this page, {abbr}`SMS (Short Message Service)` templates can be edited or created from scratch. + +```{image} marketing_campaigns/sms-template.png +:align: center +:alt: |- +: The SMS Templates page in Odoo is available after enabling developer mode in the General +: Settings +``` + diff --git a/content/applications/marketing/sms_marketing/pricing_and_faq.md b/content/applications/marketing/sms_marketing/pricing_and_faq.md new file mode 100644 index 000000000..8c64d0ff1 --- /dev/null +++ b/content/applications/marketing/sms_marketing/pricing_and_faq.md @@ -0,0 +1,112 @@ +(pricing-pricing-and-faq)= + +# SMS Pricing and FAQ + +## What do I need to send SMSs? + +SMS Text Messaging is an In-App Purchase (IAP) service that *requires prepaid credits* to work. + +## How many types of SMSs are there? + +There are 2 types: GSM7 and UNICODE. + +**GSM7** is the standard format, with a limit of 160 characters per message, that includes the +following characters: + +```{image} pricing_and_faq/faq1.png +:align: center +:alt: GSM7 characters available in Odoo SMS Marketing. +``` + +**UNICODE** is the format applied if a special character, that *is not* in the GSM7 list, is used. +Limit per SMS: 70 characters. + +:::{note} +For GSM7 SMS the size limit is 160 characters, and for Unicode is 70. *Above these limits, the +content is divided into a multi-part message* and the limit of characters is lowered to 153 for +GSM7 and to 67 for Unicode. Then, in real-time, the system displays the number of SMS mailings +the message represents. +::: + +## How much does it cost to send an SMS? + +The price of an SMS depends on the destination and the length (number of characters) of the +message. To see the **price per country, please consult**: [Odoo SMS - FAQ](https://iap-services.odoo.com/iap/sms/pricing#sms_faq_01). + +The number of SMSs a message represents will always be available in the database. + +```{image} pricing_and_faq/faq2.png +:align: center +:alt: Number of GSM7 characters that fit in an SMS message in Odoo SMS Marketing. +``` + +## How to buy credits + +Go to {menuselection}`Settings --> Buy Credits`. + +```{image} pricing_and_faq/faq3.png +:align: center +:alt: Buying credits for SMS Marketing in Odoo settings. +``` + +Or go to {menuselection}`Settings --> View my Services`. + +```{image} pricing_and_faq/faq4.png +:align: center +:alt: Using Odoo IAP to recharge credits for SMS Marketing in Odoo settings. +``` + +:::{tip} +If Odoo Online (Saas) is being used, along with the Enterprise version, free trial credits are +available to test the feature. +::: + +## More common questions + +01. **Is there an expiration time for my credits?** + No, credits do not expire. +02. **Can I send an SMS to a phone number (which is not a mobile phone) because I see the icon in + front of the field “phone”?** + Only if that phone number supports SMS (e.g. SIP phones). +03. **Do I receive an invoice to buy my credits?** + Yes. +04. **Can the recipient answer me?** + No, it is not possible to reply to the SMS. +05. **What happens if I send multiple SMSs at once, but I don't have enough credits to send them + all?** + Multiple SMS communications at once at are counted as a single transaction, so no SMSs will be + sent until there are enough credits to send them all. +06. **Do I have a history of the sent SMSs?** + A history of sent SMSs, along with all pertinent information related to its sent contacts (and + the message itself), can be found in the + {guilabel}`Sent` + column of the main + {guilabel}`SMS + Marketing` + dashboard (while in + {guilabel}`Kanban` + view). + > For more detailed information, select a desired SMS from the main dashboard (in + > {guilabel}`Kanban` view), and click on either link in the blue banner above the SMS detail form + > to learn more. +07. **Can I send as many SMSs I want at once?** + Yes, if you have enough credits. +08. **If an SMS is sent to a number that doesn't exist in the list of recipients, will credits be + lost?** + No, not if the phone number is incorrectly formatted (e.g. too many digits). However, if the + SMS is sent to the wrong person (or to a fake number), the credit for that SMS will be lost. +09. **What happens if I send my SMS to a paying number (e.g.: a contest to win a ticket for a + festival)?** + The SMS will not be delivered to that kind of number, so no charges will be made. +10. **Can I identify the numbers that do not exist when I send several SMSs?** + Only the ones that have an invalid format. +11. **How does the GDPR regulation affect this service?** + Please find our + [Privacy Policy here](https://iap.odoo.com/privacy#sms) + . +12. **Can I use my own SMS provider?** + Yes, but it is not possible out-of-the-box. Odoo experts can help customize a database to allow + for the use of a personal SMS provider. Please check our success packs + [here](https://www.odoo.com/pricing-packs) + . + diff --git a/content/applications/marketing/sms_marketing/sms_analysis.md b/content/applications/marketing/sms_marketing/sms_analysis.md new file mode 100644 index 000000000..7bb4f4cc0 --- /dev/null +++ b/content/applications/marketing/sms_marketing/sms_analysis.md @@ -0,0 +1,96 @@ +# SMS analysis + +On the {guilabel}`Reporting` page (accessible via the {menuselection}`Reporting` option in the +header menu), there are options to apply different combinations of {guilabel}`Filters` and +{guilabel}`Measures` to view metrics in a number of different layouts (e.g. {guilabel}`Graph`, +{guilabel}`List`, and {guilabel}`Cohort` views.) + +Each {guilabel}`Reporting` metric view option allows for more extensive performance analysis of +{abbr}`SMS (Short Message Service)` mailings. + +For example, while in the default {guilabel}`Graph` view, {abbr}`SMS (Short Message Service)` data +is visualized as different graphs and charts, which can be sorted and grouped in various ways (e.g. +{guilabel}`Measures` drop down menu). + +```{image} sms_analysis/sms-reporting-page.png +:align: center +:alt: Reporting page in SMS Marketing. +``` + +:::{tip} +SMS messages can be sent using automation rules in Odoo. Odoo *Studio* is required to use +automation rules. + +To install Odoo *Studio*, go to the {menuselection}`Apps application`. Then, using the +{guilabel}`Search...` bar, search for `studio`. + +If it is not already installed, click {guilabel}`Install`. + +Adding the *Studio* application upgrades the subscription status to *Custom*, which increases the +cost. Consult [support](https://www.odoo.com/contactus), or reach out to the database's +customer success manager, with any questions on making the change. + +To use automation rules, navigate in {ref}`developer mode `, to +{menuselection}`Settings app --> Technical menu --> Automation section --> Automation Rules`. +Then, click {guilabel}`New` to create a new rule. + +Enter a name for the automation rule, and select a {guilabel}`Model` to implement this rule on. + +Based on the selection for the {guilabel}`Trigger`, additional fields will populate below. Set +the {guilabel}`Trigger` to one of the following options: + +{guilabel}`Values Updated` + +- {guilabel}`User is set` +- {guilabel}`State is set to` +- {guilabel}`On archived` +- {guilabel}`On unarchived` + +{guilabel}`Timing Conditions` + +- {guilabel}`Based on date field` +- {guilabel}`After creation` +- {guilabel}`After last update` + +{guilabel}`Custom` + +- {guilabel}`On save` +- {guilabel}`On deletion` +- {guilabel}`On UI change` + +{guilabel}`External` + +- {guilabel}`On webhook` + +Other options may appear based on the {guilabel}`Model` selected. For example if the +{guilabel}`Calendar Event` model is selected, then the following options appear in addition to +those above: + +{guilabel}`Email Events` + +- {guilabel}`On incoming message` +- {guilabel}`On outgoing message` + +Under the {guilabel}`Before Update Domain` field, set a condition to be met before updating the +record. Click {guilabel}`Edit Domain` to set record parameters. + +Under the {guilabel}`Actions To Do` tab, select {guilabel}`Add an action`. Next, in the resulting +{guilabel}`Create Actions` pop-up window, select {guilabel}`Send SMS`, and set the +{guilabel}`Allowed Groups`. {guilabel}`Allowed Groups` are the access rights groups that are +allowed to execute this rule. Leave the field empty to allow all groups. See this documentation: +{ref}`access-rights/groups`. + +Next, set the {guilabel}`SMS Template` and choose whether the SMS message should be logged as a +note, by making a selection in the drop-down menu: {guilabel}`Send SMS as`. Click +{guilabel}`Save and Close` to save the changes to this new action. + +```{image} sms_analysis/automation-rule-sms.png +:align: center +:alt: Automation rule template with rule to do, SMS template and log as note highlighted. +``` + +Add any necessary notes under the {guilabel}`Notes` tab. Finally, navigate away from the +completed automation rule, or manually save (by clicking the {guilabel}`☁️ (cloud)` icon), to +implement the change. +::: + diff --git a/content/applications/marketing/social_marketing.md b/content/applications/marketing/social_marketing.md new file mode 100644 index 000000000..029147941 --- /dev/null +++ b/content/applications/marketing/social_marketing.md @@ -0,0 +1,178 @@ +--- +show-content: true +--- + +# Social Marketing + +Odoo's *Social Marketing* application helps content marketers create and schedule posts, manage +various social media accounts, analyze content effectiveness, and engage directly with social media +followers in one, centralized location. + +:::{seealso} +- [Odoo Tutorials: Marketing](https://www.odoo.com/slides/marketing-27) +::: + +```{eval-rst} +.. cards:: + + .. card:: Social posts + :target: social_marketing/social_posts + + Discover everything there is to know about how to create and customize social media posts + using Odoo. + + .. card:: Social campaigns + :target: social_marketing/social_campaigns + + Learn about all the different campaign and marketing tools this application has to offer. +``` + +## Social media accounts + +In order to create social posts and analyze content with Odoo *Social Marketing*, social media +accounts **must** be added as a *stream* on the application's main dashboard. + +:::{note} +Be aware that personal profiles **cannot** be added as a stream. The main use of Odoo *Social +Marketing* is to manage and analyze business accounts on social media platforms. +::: + +:::{warning} +Odoo *Social Marketing* has some limitations in regards to social media accounts. For example, +Odoo **cannot** handle a large quantity of various pages (e.g. ~40 pages) under the same company. +The same limitations are present in a multi-company environment because of how the API is +constructed. +::: + +:::{warning} +In multi-company environments, if every company doesn't activate a page at once, it will result +in a permission error. + +For example, if Company 1 is the only company selected from the main Odoo dashboard, and +activates *Facebook Page 1* and *Facebook Page 2*, then those pages will be accesible on the +*Social Marketing* dashboard. + +However, if on that same database, the user adds Company 2 from the company drop-down menu in the +header, and attempts to add those same streams, it results in a permission error. + +```{image} social_marketing/permission-error.png +:align: center +:alt: View of the permission error that appears when incorrectly attempting to add +: stream. +``` +::: + +## Social media streams + +To add a social media business account as a stream, navigate to {menuselection}`Social Marketing +app` and select the {guilabel}`Add A Stream` button located in the upper-left corner. Doing so +reveals an {guilabel}`Add a Stream` pop-up window. + +```{image} social_marketing/add-stream-social-popup.png +:align: center +:alt: View of the pop-up window that appears when Add a Stream is selected in Odoo. +``` + +In the {guilabel}`Add a Stream` pop-up window, choose to {guilabel}`Link a new account` for a +business from any of the following popular social media platforms: {guilabel}`Facebook`, +{guilabel}`Instagram`, {guilabel}`LinkedIn`, {guilabel}`Twitter`, and {guilabel}`YouTube`. + +After clicking the desired social media outlet from the {guilabel}`Add a Stream` pop-up window, Odoo +navigates directly to that specific social media outlet's authorization page, where permission must +be granted, in order for Odoo to add that particular social media account as a stream to the *Social +Marketing* application. + +```{image} social_marketing/social-marketing-dashboard.png +:align: center +:alt: Sample of a populated social marketing dashboard with social media streams and +: content. +``` + +Once permission is granted, Odoo navigates back to the {guilabel}`Feed` on the main +{guilabel}`Social Marketing` dashboard, and a new column, with that account's posts, is added. +Accounts/streams can be added at any time. + +:::{important} +A {guilabel}`Facebook` page can be added as long as the {guilabel}`Facebook` account that grants +permission is the administrator for the page. It should also be noted that different pages can be +added for different streams. +::: + +:::{note} +{guilabel}`Instagram` accounts are added through a {guilabel}`Facebook` login because it uses the +same API. This means, an {guilabel}`Instagram` account needs to be linked to a +{guilabel}`Facebook` account in order for it to show up as a stream in Odoo. +::: + +## Social media page + +Another way to quickly link social media accounts to Odoo *Social Marketing* can be done on the +{guilabel}`Social Media` page. To access the {guilabel}`Social Media` page, navigate to +{menuselection}`Social Marketing app --> Configuration --> Social Media`. + +On the {guilabel}`Social Media` page there is a collection of all social media options, each +complete with a {guilabel}`Link account` button: {guilabel}`Facebook`, {guilabel}`Instagram`, +{guilabel}`LinkedIn`, {guilabel}`Twitter`, {guilabel}`YouTube`, and {guilabel}`Push Notifications`. + +```{image} social_marketing/social-media-page.png +:align: center +:alt: View of the social media page in the Odoo Social Marketing application. +``` + +## Social accounts page + +To see a list of all social accounts and websites linked to the database, go to +{menuselection}`Social Marketing app --> Configuration --> Social Accounts`. This {guilabel}`Social +Accounts` display the {guilabel}`Name`, the {guilabel}`Handle/Short Name`, the {guilabel}`Social +Media` platform, who it was {guilabel}`Created by`, and the {guilabel}`Company` to which it is +associated. + +```{image} social_marketing/social-accounts-page.png +:align: center +:alt: View of the social accounts page in the Odoo Social Marketing application. +``` + +To edit/modify any of the social accounts on this page, simply select the desired account from the +list on this page, and proceed to make any adjustments necessary. + +## Social streams page + +To view a separate page with all the social media streams that have been added to the main *Social +Marketing* dashboard, navigate to {menuselection}`Social Marketing app --> Configuration --> Social +Streams`. + +```{image} social_marketing/social-streams-page.png +:align: center +:alt: View of the social accounts page in the Odoo Social Marketing application. +``` + +Here, the social stream information is organized in a list with the {guilabel}`Social Media`, the +{guilabel}`Title` of the stream, the {guilabel}`Type` of the stream (e.g. {guilabel}`Posts`, +{guilabel}`Keyword`, etc.), who it was {guilabel}`Created by`, and the {guilabel}`Company` to which +it is associated. + +To modify any stream's information, simply click the desired stream from the list, and proceed to +make any necessary adjustments. + +## Visitors + +To see a complete overview of all the people who have visited the website(s) connected to the +database, navigate to {menuselection}`Social Marketing app --> Visitors`. + +```{image} social_marketing/visitors.png +:align: center +:alt: View of the Visitors page in the Odoo Social Marketing application. +``` + +Here, Odoo provides a detailed layout of all the visitors' pertinent information in a default kanban +view. If visitors already have contact information in the database, the option to send them an +{guilabel}`Email` and/or an {guilabel}`SMS` is available. + +This same visitor data can also be viewed as a list or a graph. Those view options are located in +the upper-right corner of the {guilabel}`Visitors` page. + +```{toctree} +social_marketing/social_posts +social_marketing/social_campaigns +``` + diff --git a/content/applications/marketing/social_marketing/social_campaigns.md b/content/applications/marketing/social_marketing/social_campaigns.md new file mode 100644 index 000000000..6ef41433d --- /dev/null +++ b/content/applications/marketing/social_marketing/social_campaigns.md @@ -0,0 +1,152 @@ +# Social marketing campaigns + +Social marketing campaigns help companies connect directly with the marketplace. These campaigns +are helpful when introducing a new product to customers, explaining the value of a product or +service, or when advertising an upcoming event or product release. + +The most effective social marketing campaigns typically involve multiple channels to maximize +content distribution, and Odoo's *Social Marketing* application acts as a singular control center to +monitor, plan, post, track, and analyze all of the various content and content channels within a +single dashboard. + +## Campaigns page + +To access a complete overview of all social marketing campaigns, open the {menuselection}`Social +Marketing` application, and click {menuselection}`Campaigns` from the header menu. Doing so reveals +a separate page with every campaign in a default kanban view. + +```{image} social_campaigns/campaigns-page.png +:align: center +:alt: View of the campaigns page in the Odoo Social Marketing application. +``` + +Each *stage* in the kanban view can be edited, by clicking the {guilabel}`gear icon` to the left of +the {guilabel}`+ (plus sign)` - located to the right of the stage title. + +:::{note} +The **gear icon** *only* appears when the cursor hovers to the left of the **+ (plus sign)**. +When the gear icon is clicked, a drop-down menu reveals the options: {guilabel}`Fold`, +{guilabel}`Edit Stage`, and {guilabel}`Delete`. +::: + +```{image} social_campaigns/campaign-stage-dropdown.png +:align: center +:alt: View of the campaigns page in the Odoo Social Marketing application. +``` + +Clicking {guilabel}`Fold` minimizes that specific stage's column. The stage column can be restored +by clicking the folded version of it on the main {guilabel}`Campaigns` dashboard in the default +kanban view. + +Selecting {guilabel}`Edit Stage` reveals a pop-up window, in which the name and the sequence of the +stage can be modified. If changes are made, be sure to click {guilabel}`Save`. + +Clicking {guilabel}`Delete` removes the stage entirely. + +:::{note} +To add a new stage to the pipeline, side-scroll to the right on the {guilabel}`Campaigns` +dashboard, click {guilabel}`Add a Column`, enter in the desired information, and click +{guilabel}`Add`. +::: + +:::{tip} +The same social marketing campaign information on the {guilabel}`Campaigns` dashboard can also be +viewed as a list, by selecting the {guilabel}`List` option, located under the search bar, in the +upper-right corner. +::: + +## Create social marketing campaigns + +First, open the {menuselection}`Social Marketing` application, and select {guilabel}`Campaigns` from +the header menu. + +On the {guilabel}`Campaigns` dashboard, a new campaign can be created by clicking the quick add +{guilabel}`+ (plus sign)` located in the top-right corner of each stage in the pipeline, visible in +the kanban view. Campaigns can also be created by clicking {guilabel}`Create` in the upper-left +corner of the {guilabel}`Campaigns` dashboard. + +Both options reveal a new campaign detail window directly on the {guilabel}`Campaigns` dashboard +when clicked. + +```{image} social_campaigns/quick-add-campaign.png +:align: center +:alt: View of the quick add option for campaigns in Odoo Social Marketing. +``` + +Here, the {guilabel}`Campaign Name`, {guilabel}`Responsible`, and {guilabel}`Tags` can be entered. +When all modifications are complete, click {guilabel}`Add` to add the campaign to the database. + +## Edit social marketing campaigns + +In order to edit a campaign in greater detail, and create/send various forms of communications +related to it, the template page for that campaign must be accessed and modified, accordingly. +There are multiple ways to access a template page for a campaign. + +- After entering the pertinent information in the {guilabel}`Quick Add` campaign drop-down, click + {guilabel}`Edit`. +- Simply select the desired campaign from the {guilabel}`Campaigns` dashboard in list or kanban + view. +- On the {guilabel}`Campaigns` dashboard in the kanban view, select the {guilabel}`⋮ (three dots)` + drop-down menu on the desired campaign, and select {guilabel}`Edit`. + +Any of the above routes will reveal the *Campaign Template* page for that specific campaign. + +## Social marketing campaign templates + +On a *Campaign Template* page, numerous elements can be customized/modified, and various forms of +communications can be created, modified, and sent or scheduled. Below is a sample of a completed +campaign template. + +```{image} social_campaigns/create-campaign.png +:align: center +:alt: View of a sample campaign template page in Odoo Social Marketing. +``` + +:::{important} +In order for the {guilabel}`Send New Mailing` option to appear on campaign templates, make sure +the *Mailing Campaigns* feature is enabled in the *Email Marketing* app. To do that, navigate to +{menuselection}`Email Marketing --> Configuration --> Settings`, activate {guilabel}`Mailing +Campaigns`, and click {guilabel}`Save`. +::: + +:::{note} +In order for the {guilabel}`Send SMS` option to appear, the Odoo *SMS Marketing* application must +be installed on the database. +::: + +## Add content and communications to campaigns + +If the proper settings and applications are installed (as instructed above), there are four forms +of communication/content options that can be added to campaigns. Each of these options are displayed +as buttons in the upper-left corner of the campaign template page. + +- {guilabel}`Send New Mailing`: reveals a blank email template on a separate page, in which the + message can be fully customized in a variety of ways. +- {guilabel}`Send SMS`: reveals a blank SMS template on a separate page, in which a SMS + communication can be created and configured. +- {guilabel}`Send Social Post`: reveals a blank social post template on a separate page, in which + a post can be created, and applied to social media accounts that are already connected to the + database. +- {guilabel}`Push Notification`: reveals a similar blank social post template on a separate page, + however, the {guilabel}`Push Notification` options are already pre-selected in the {guilabel}`Post + on` field. + +Whichever form of communication is created, once it's completed, Odoo returns to the +{guilabel}`Campaign Template` page, showcasing that new content in its corresponding tab (e.g. +{guilabel}`Mailings`, {guilabel}`SMS`, {guilabel}`Social Media`, and/or {guilabel}`Push +Notifications`). + +As content and communications are added to a campaign, tabs for those specific mediums appear, +along with a variety of analytical smart buttons (e.g. {guilabel}`Revenues`, {guilabel}`Quotations`, +{guilabel}`Leads`, etc.). + +These smart buttons, located at the top of the template, display different metrics related to the +campaign, and its various communications and content. Clicking any smart button reveals a separate +page dedicated to that particular element of the campaign, allowing for quicker, more organized +analysis. + +:::{note} +The Odoo *Social Marketing* app is integrated with other Odoo applications, such as *Sales*, +*Invoicing*, *CRM*, and *Website*. +::: + diff --git a/content/applications/marketing/social_marketing/social_posts.md b/content/applications/marketing/social_marketing/social_posts.md new file mode 100644 index 000000000..af462e3da --- /dev/null +++ b/content/applications/marketing/social_marketing/social_posts.md @@ -0,0 +1,411 @@ +# Social posts + +The Odoo *Social Marketing* application provides various ways to create posts for any type of social +media outlet. + +## Posts page + +To see a complete overview of posts, go to Odoo {menuselection}`Social Marketing app --> Posts`. +Here, on the {guilabel}`Social Posts` page, every post that has been created and posted with Odoo +can be seen and accessed. + +There are four different view options for the {guilabel}`Social Posts` page data: *kanban*, +*calendar*, *list*, and *pivot*. + +The view options are located in the upper right corner of the {guilabel}`Posts` page, beneath the +search bar. + +```{eval-rst} +.. tabs:: + + .. tab:: Kanban view + + By default, Odoo displays the posts in a kanban view. The information on this page can be + sorted even further, via the left sidebar, where all connected social accounts and posts can + be quickly seen, accessed, and analyzed. + + The kanban view is represented by an :guilabel:`inverted bar graph icon` in the upper-right + corner. + + .. image:: social_posts/posts-page-kanban.png + :align: center + :alt: Kanban view of the posts page in the Odoo Social Marketing application. + + .. tab:: Calendar view + + The calendar view option displays a visual representation of posts in a calendar format of + when posts were published, or are scheduled to be published. This option provides a clear + overview of any planned day, week, or month, and Odoo displays all drafted, scheduled, and + published posts. + + Clicking on a date reveals a blank social media post detail form, in which a social media + post can be created, and Odoo will post it on that specific date/time. + + The calendar view is represented by a :guilabel:`calendar icon` in the upper-right corner. + + .. image:: social_posts/calendar-view.png + :align: center + :alt: Example of the calendar view in Odoo Social Marketing. + + .. tab:: List view + + The list view option is similar to the kanban option, but instead of individual blocks, all + post information is displayed in a clear, list layout. Each line of the list displays the + :guilabel:`Social Accounts`, :guilabel:`Message`, and :guilabel:`Status` of every post. + + There is also a helpful left sidebar that organizes all posts by :guilabel:`Status` and lists + all connected :guilabel:`Social Accounts`, as well. + + The list view is represented by four vertical lines in the upper-right corner. + + .. image:: social_posts/list-view.png + :align: center + :alt: View of the list option on the posts page in Odoo Social Marketing. + + .. tab:: Pivot view + + The pivot view option provides a fully customizable grid table, where different measures of + data can be added and analyzed. + + .. image:: social_posts/pivot-view.png + :align: center + :alt: View of the pivot option on the posts page in Odoo Social Marketing. + + The pivot view option provides numerous analytical options, allowing for in-depth, detailed + analysis of various posts and metrics. + + Click on any :guilabel:`➕ (plus sign) icon` next to a line in the pivot table to reveal more + metric options to add to the grid. + + While in the pivot view, the option to :guilabel:`Insert in Spreadsheet` is available, located + to the right of the :guilabel:`Measures` drop-down menu, in the upper-left corner of the + :guilabel:`Social Posts` page. + + Next to the :guilabel:`Insert in Spreadsheet` are three options, specific to the pivot view. + + From left to right, those options are: + + - :guilabel:`Flip Axis`, which switches the *X* and *Y* axis in the grid table. + - :guilabel:`Expand All`, which expands each line in the grid, revealing more detailed + information related to it. + - :guilabel:`Download`, which, when clicked, instantly downloads the pivot table as a + spreadsheet. +``` + +### Posts + +Clicking on a post from a social media stream reveals a pop-up window, showcasing the content of +that specific post, along with all the engagement data related to it (e.g. likes, comments, etc.). + +```{image} social_posts/social-post-popup.png +:align: center +:alt: Sample of a social media post's pop-up window in Odoo Social Marketing application. +``` + +If desired, the user can leave a new comment of the post from the post's pop-up window, by typing +one in the {guilabel}`Write a comment...` field, and clicking {guilabel}`Enter` to post that +comment. + +### Create leads from comments + +Odoo *Social Marketing* also provides the ability to create leads directly from social media +comments. + +To create a lead from a comment left on a social media post, click on the desired post from the +dashboard to reveal that post's specific pop-up window. Then, scroll to the desired comment, and +click the {guilabel}`three vertical dots` icon to the right of that comment. + +Doing so reveals a drop-down menu with the option: {guilabel}`Create Lead`. + +```{image} social_posts/create-lead-drop-down.png +:align: center +:alt: The drop-down menu beside a comment revealing the option to create a lead. +``` + +Upon clicking {guilabel}`Create Lead` from the comment's drop-down menu, a {guilabel}`Conver Post to +Lead` pop-up window appears. + +```{image} social_posts/convert-post-to-lead-popup.png +:align: center +:alt: The convert post to lead pop-up window that appears in Odoo Social Marketing. +``` + +In this pop-up window, select to either: {guilabel}`Create a new customer`, {guilabel}`Link to an +existing customer`, or {guilabel}`Do not link to a customer`. + +:::{note} +If {guilabel}`Link to an existing customer` is selected, a new {guilabel}`Customer` field appears +beneath those options, wherein a customer can be chosen to be linked to this lead. +::: + +Once the desired selection has been made, click the {guilabel}`Convert` button at the bottom of the +{guilabel}`Convert Post to Lead` pop-up window. Doing so reveals a fresh lead detail form, where the +necessary information can be entered and processed. + +```{image} social_posts/new-lead-detail-form-comments.png +:align: center +:alt: New lead detail form generated from a social media comment in Odoo Social Marketing. +``` + +### Insights + +When a social media account stream is added to the *Social Marketing* dashboard, each stream also +displays and links that specific social media platform's KPIs (if the platform has them). + +To get redirected to the statistics and metrics related to any social media account's KPIs, click on +the {guilabel}`Insights` link, located at the top of each stream. + +```{image} social_posts/social-marketing-insights-link.png +:align: center +:alt: Visual of how the Insights link appears on the dashboard of the Social Marketing +: app. +``` + +:::{note} +In a multi-company environment, if not *all* pages are selected, de-authentication happens. + +For example, if the companies have 3 *Facebook* pages, but only grant access to 1, and try to +grant access to another at a later date, they will be de-authenticated, and access to the initial +page's insights/analytics will be lost. + +So, be sure to add *all* pages for *all* companies in a multi-company environment to avoid this +issue. If a page gets de-autenticated, simply remove the stream, and re-establish it. +::: + +## Create and post social media content + +Odoo *Social Marketing* offers the ability to create and post content for social media accounts +directly through the application. + +To create content for social media accounts, navigated to the {menuselection}`Social Marketing app`, +and click {guilabel}`New Post` located in the upper-right corner of the *Social Marketing* +dashboard. + +```{image} social_posts/new-post-button-social-marketing-dashboard.png +:align: center +:alt: New Post button on the main dashboard of the Odoo Social Marketing application. +``` + +Or, navigate to {menuselection}`Social Marketing app --> Posts` and click the {guilabel}`New` +button. + +```{image} social_posts/new-button-social-posts-page.png +:align: center +:alt: New button on the Social Posts page in the Odoo Social Marketing application. +``` + +Either route reveals a blank social media post detail form that can be customized and configured in +a number of different ways. + +```{image} social_posts/blank-post-detail-page.png +:align: center +:alt: Blank social media post detail page in Odoo Social Marketing. +``` + +### Post detail form + +The social media post detail form in Odoo *Social Marketing* has many different configurable options +available. + +#### Company + +If working in a multi-company environment, the first field in the {guilabel}`Your Post` section of +the social media post detail form is {guilabel}`Company`. In this field, select the company that +should be connected to this specific social media post. + +#### Post on + +If working in a single-company environment, the first field in the {guilabel}`Your Post` section of +the social media post detail form is {guilabel}`Post on`. In this field, determine which social +media outlets (streams) this post is intended to be posted on, and/or which website's visitors this +post should be sent to, via push notification, by checking the box beside the desired option(s). + +Odoo automatically provides every available social media account that's been linked to the database +as an option in this section. If a social media account hasn't been added as a stream to the *Social +Marketing* application, it will **not** appear as an option on the post template. + +Multiple social media outlets (streams) and websites can be selected in the {guilabel}`Post on` +field. At least **one** option in the {guilabel}`Post on` field *must* be selected. + +:::{important} +In order for the {guilabel}`Push Notification` option to appear on the social media post detail +form in Odoo *Social Marketing*, make sure the *Enable Web Push Notifications* feature is enabled +in the *Website* app. + +To do that, navigate to {menuselection}`Website app --> Configuration --> Settings`, activate +{guilabel}`Enable Web Push Notifications`, fill out the corresponding fields, and click +{guilabel}`Save`. +::: + +#### Message + +Next, there's the {guilabel}`Message` field. This is where the main content of the post is created. + +In the {guilabel}`Message` field, type in the desired message for the social post. After typing, +click away from the {guilabel}`Message` field to reveal visual samples of how the post will look on +all the previously selected social media accounts (and/or websites, as push notifications). + +```{image} social_posts/visual-samples-social-media-outlets-preview.png +:align: center +:alt: Sample social media post with visual samples of how it will appear on social +: media outlets. +``` + +:::{tip} +Emojis can also be added directly to the text in the {guilabel}`Message` field. Just click the +{guilabel}`🙂 (smiley face)` icon, located on the line of the {guilabel}`Message` field to the far +right. Clicking this icon reveals a drop-down menu containing numerous emojis to choose from. +::: + +:::{note} +If {guilabel}`Twitter` is chosen in the {guilabel}`Post on` field, a character counter appears +beneath the {guilabel}`Message` field. +::: + +#### Attach Images + +If images are to be used in the post, click the {guilabel}`Attach Images` button, in the +{guilabel}`Attach Images` field, located beneath the {guilabel}`Message` field. When clicked, Odoo +reveals a pop-up window. In this pop-up window, select the desired image from the hard drive, and +upload it. + +After successfully uploading and attaching the desired image, Odoo reveals a new preview of the +social media post, complete with the newly-added image, on the right side of the detail form. + +```{image} social_posts/attach-images-visual-social-post-sample.png +:align: center +:alt: Visualized samples of post with newly-attached images in Odoo Social Marketing. +``` + +#### Campaign + +Next, there is the {guilabel}`Campaign` field. This non-required field provides the options to +attach this post to a specific marketing campaign. + +To add this post to a pre-existing campaign, click the empty {guilabel}`Campaign` field to reveal a +drop-down menu, containing all the existing campaigns in the database. Select the desired campaign +from this drop-down menu to add this post to that campaign. + +To create a new campaign directly from the social media post detail form, start typing the name of +the new campaign in the blank {guilabel}`Campaign` field, and select either {guilabel}`Create` or +{guilabel}`Create and edit...`. + +```{image} social_posts/campaign-drop-down-menu-options.png +:align: center +:alt: Drop-down menu options of Create or Create and edit in the Campaign field. +``` + +Clicking {guilabel}`Create` creates the campaign, which can be edited/customized later. + +Clicking {guilabel}`Create and edit...` creates the campaign, and reveals a {guilabel}`Create +Campaign` pop-up form, wherein the {guilabel}`Campaign Identifier`, {guilabel}`Responsible`, and +{guilabel}`Tags` can be instantly configured. + +```{image} social_posts/create-campaign-popup.png +:align: center +:alt: Create campaign pop-up window that appears on a social media post detail form. +``` + +When all the desired settings have been entered, click {guilabel}`Save & Close` to save the campaign +and return to the social media post detail form. + +#### When + +Then, in the {guilabel}`When` field, choose either {guilabel}`Send Now` to have Odoo publish the +post immediately, or {guilabel}`Schedule later` to have Odoo publish the post at a later date and +time. + +If {guilabel}`Schedule later` is selected, a new {guilabel}`Scheduled Date` field appears. Clicking +the empty field reveals a pop-up calendar, in which a future date and time can be designated. + +```{image} social_posts/schedule-post-calendar-popup.png +:align: center +:alt: Schedule date pop-up window that appears on social media post detail form in +: Odoo. +``` + +After selecting a desired date and time, click {guilabel}`Apply`. Then, Odoo will promptly publish +the post at that specific date and time on the pre-detemined social media account(s). + +:::{note} +If scheduling a post, the {guilabel}`Post` button at the top of the social media post detail form +changes to {guilabel}`Schedule`. Be sure to click {guilabel}`Schedule` after completing the +social media post detail form. + +Doing so, locks in that specific date/time for Odoo to send the post, and it changes the status +of the post to {guilabel}`Scheduled`. +::: + +#### Push Notification Options + +If one (or multiple) {guilabel}`[Push Notification]` options are chosen in the {guilabel}`Post on` +field, a specific {guilabel}`Push Notification Options` section appears at the bottom of the social +media post detail form. + +```{image} social_posts/push-notification-options-section.png +:align: center +:alt: Push notification options section on a social media post detail form. +``` + +It should be noted that *none* of these fields are required. + +The first field in this section is {guilabel}`Notification Title`. In this field, there is the +option to add a custom title to the push notification that will be sent. + +To designate a specific page on the website that should trigger this push notification, enter that +page's URL in the {guilabel}`Target URL` field. Then, once a visitor reaches that specific page, +Odoo will display the push notification. + +Below that field is the option to add a custom {guilabel}`Icon Image` to the push notification. This +is an icon that appears beside the push notification. + +To upload a new image, click the {guilabel}`✏️ (pencil) icon` when hovering over the {guilabel}`Icon +Image` camera icon. Doing so reveals a pop-up window, in which the desired icon image can be located +on the hard drive, and subsequently uploaded. + +Once that's complete, Odoo automatically updates the visual preview of how the icon appears on the +push notification. + +:::{note} +Next, if the post is scheduled to be posted later, there is the option to ensure the post is sent +in the visitor's timezone, by enabling the {guilabel}`Local Time` option. If enabled, Odoo will +send it at the appropriate, pre-determined time, taking the visitor's location into +consideration. + +```{image} social_posts/push-notification-local-time.png +:align: center +:alt: The Local Time option in the Push Notification Options section of features. +``` +::: + +Then, there is the {guilabel}`Match all records` field. This field provides the ability to target a +specific group of recipients in the database, based on certain criteria, and can be applied to match +{guilabel}`all` or {guilabel}`any` of the rules. + +To utilize this field, click the {guilabel}`+ Add condition` button, which reveals an equation-like +rule field. + +In this equation-like rule field, specifiy the specific criteria Odoo should take into account when +sending this post to a particular target audience. + +```{image} social_posts/push-notification-condition.png +:align: center +:alt: Push notification conditions set up to match a specific amount of records in +: the database. +``` + +To add an additional rule, click the {guilabel}`➕ (plus sign) icon` to the far-right of the rule. + +To add a branch (series of additional rules based on the previous rule, to further specify a target +audience), click the unique {guilabel}`branch icon`, located to the right of the {guilabel}`➕ (plus +sign) icon`. + +Lastly, click the {guilabel}`🗑️ (trash can) icon` to delete any rule. + +The size of the specified target audience of recipients is represented by the number of +{guilabel}`Records` displayed beneath the rules. + +:::{seealso} +{doc}`social_campaigns` +::: + diff --git a/content/applications/marketing/surveys.md b/content/applications/marketing/surveys.md new file mode 100644 index 000000000..83362f62a --- /dev/null +++ b/content/applications/marketing/surveys.md @@ -0,0 +1,292 @@ +--- +show-content: true +--- + +# Surveys + +Companies gather valuable insights from customers and employees through surveys, aiding informed +decision-making. + +With Odoo *Surveys*, users create various surveys, questionnaires, certifications, assessments, and +so much more. These can be used to collect feedback, evaluate the success of a recent event, and +measure the satisfaction of customers and/or employees. This process yields valuable insights into +shifting market trends. + +:::{seealso} +[Odoo Tutorials: Surveys](https://www.odoo.com/slides/surveys-62) +::: + +```{eval-rst} +.. cards:: + + .. card:: Create surveys + :target: surveys/create + + Discover how to create surveys with Odoo. + + .. card:: Scoring surveys + :target: surveys/scoring + + Learn how to create and analyze survey scores with Odoo. + + .. card:: Create questions + :target: surveys/questions + + See how to create, configure, and customize all types of survey questions with Odoo. + + .. card:: Live Session surveys + :target: surveys/live_session + + Find out everything there is to know about Odoo's unique Live Session surveys. + + .. card:: Survey analysis + :target: surveys/analysis + + Explore the various ways to analyze surveys using Odoo's in-depth reporting pages. +``` + +## Dashboard + +Upon opening the *Surveys* application, Odoo presents the main dashboard of the *Surveys* +application, otherwise known as the {guilabel}`Surveys` page. + +```{image} surveys/surveys-dashboard.png +:align: center +:alt: The Odoo Surveys application dashboard in the default Kanban view. +``` + +:::{tip} +The *Surveys* dashboard can be accessed at any time throughout the application by clicking +{menuselection}`Surveys` from the header menu. +::: + +In the upper-left corner, there is a {guilabel}`New` button. When clicked, Odoo presents a blank +survey form that can be used to create a survey. + +On the dashboard, all the surveys that have been created in the database are displayed in a default +Kanban view. + +From left-to-right, after the survey name, the user who is responsible for it, and the month it was +created, each line on the *Surveys* dashboard shows the following: + +- Number of {guilabel}`Questions` in that particular survey + +- {guilabel}`Average Duration` of the survey (how long it typically takes a participant to complete) + +- Number of {guilabel}`Registered` participants for the survey + +- Number of times that particular survey has been {guilabel}`Completed` + +- Percentage and data bar showcasing how many people have {guilabel}`Passed` or become + {guilabel}`Certified` + + :::{note} + The {guilabel}`Passed` percentage and bar **only** appears when a *Required Score* has been + configured for that particular survey. + + The {guilabel}`Certified` percentage and bar **only** appears if that particular survey has the + *Is a Certification* option enabled on the survey form. + + If neither {guilabel}`Passed` nor {guilabel}`Certified` appear on the line, that indicates the + survey is without a *Required Score* and was not enabled with the *Is a Certification* option. + ::: + +- Number of {guilabel}`Courses` related to that survey, which **only** appears if more than one + course has been created and attached to a single survey + +:::{note} +A half-trophy background image behind the survey name indicates that the survey is a +*Certification*. +::: + +To the far-right of those data points on the survey lines, located on the *Surveys* application +dashboard, are a collection of buttons. + +Those buttons are as follows: + +- {guilabel}`Share`: click to reveal a {guilabel}`Share a Survey` pop-up form that can be used to + invite potential participants to the survey - complete with a {guilabel}`Survey Link` that can be + copied and sent to potential participants, and a {guilabel}`Send by Email` toggle switch. + + When the {guilabel}`Send by Email` toggle is active (green switch), additional fields appear, in + which {guilabel}`Recipients`, {guilabel}`Additional Emails`, and a {guilabel}`Subject` can be + added to the email. + + Below that, a dynamic email template, complete with a {guilabel}`Start Certification` button + appears, which can be modified, as well, if needed. + + {guilabel}`Attachments` can be added to the email, as well as an {guilabel}`Answer deadline` can + be set, if needed. + + Once modifications are complete, click {guilabel}`Send` to send that email invite to all the email + addresses/contacts listed in the {guilabel}`Recipients` field. + + ```{image} surveys/share-survey-popup-email-toggle.png + :align: center + :alt: The 'Share a Survey' pop-up window in Odoo Surveys with the Send by Email toggled + : on. + ``` + + :::{tip} + The default {guilabel}`Mail Template` for survey invites can be edited by navigating to + {menuselection}`Settings --> Technical --> Email Templates` and searching for `Survey: Invite`. + ::: + + :::{note} + The {guilabel}`Send by Email` toggle switch is **not** present when the survey line has zero + questions. + + The {guilabel}`Survey Link` only appears when the survey's *Access Mode* is set to *Anyone with + the link*. + + The {guilabel}`Additional Emails` field only appears when the survey's *Require Login* field is + **not** active. + ::: + +- {guilabel}`Test`: click to take a test version of the survey in a new tab, from the point-of-view + of a survey participant, in order to check for any errors or inconsistencies. + +- {guilabel}`See results`: click to reveal a new tab showcasing detailed metrics and graphical + representations of all survey participants, questions, and responses for deeper analysis. + +- {guilabel}`Start Live Session`: click to initiate a *Live session* survey, and reveal a session + manager window in a new tab. This button is **not** present for surveys that have enabled the *Is + a Certification* option on the survey form. + +- {guilabel}`End Live Session`: click to end a *Live session* survey that has been officially + started. This button option **only** appears on survey lines that have previously initiated a live + session. + +Above the buttons that are located to the far-right of the survey lines, a {guilabel}`⋮ (three +dots)` icon appears when the cursor hovers over that particular line. When the {guilabel}`⋮ (three +dots)` icon is clicked, a drop-down menu with some configuration-related options appear: + +The options are: + +- {guilabel}`Edit Survey`: when clicked, Odoo reveals the survey form for that particular survey, + which can then be modified in a number of different ways. +- {guilabel}`Share`: when clicked, Odoo reveals the {guilabel}`Share a Survey` pop-up form that can + be used to invite potential participants to the survey. +- {guilabel}`Delete`: when clicked, Odoo presents a pop-up window, wherein the user **must** confirm + they want to delete the survey entirely, which they can do by clicking the {guilabel}`Delete` + button at the bottom of the pop-up window. +- {guilabel}`Color`: users can opt to choose a color to add to the survey line on the dashboard for + added organizational purposes, if needed. + +```{image} surveys/three-dot-dropdown.png +:align: center +:alt: The three-dot drop-down menu of options that appears on the Odoo Surveys dashboard. +``` + +Beneath the buttons that are located to the far-right of the survey lines, there is an *Activities* +button, represented by a {guilabel}`🕘 (clock)` icon. When clicked, a mini pop-up window appears, +from which activities related to that particular survey can be scheduled and customized. + +```{image} surveys/schedule-activities-dropdown.png +:align: center +:alt: The Schedule Activities drop-down menu that appears on the Odoo Surveys dashboard. +``` + +### List view + +The *Surveys* dashboard is shown in the Kanban view, by default, but there is also a list view +option available in the upper-right corner, represented by a {guilabel}`≣ (bars)` icon. + +When the {guilabel}`≣ (bars)` icon is clicked, the survey related data is displayed in a list view. + +```{image} surveys/list-view.png +:align: center +:alt: The list view option located on the Odoo Surveys application dashboard. +``` + +The columns shown on the *Surveys* app dashboard, while in list view, are as follows: + +- {guilabel}`Survey Title` +- {guilabel}`Responsible` +- {guilabel}`Average Duration` +- {guilabel}`Registered` +- {guilabel}`Success Ratio (%)` +- {guilabel}`Avg Score (%)` + +:::{tip} +Additional columns can be added to the *Surveys* application dashboard, while in list view, by +clicking the *additional options* drop-down menu, located to the far-right of the column titles, +represented by a {guilabel}`(slider with two dots)` icon. +::: + +### Activities view + +To have the *Surveys* application dashboard display nothing but the activities associated to the +surveys in the database, click the {guilabel}`🕘 (clock)` icon to the far-right of the other view +options, located in the upper-right corner. + +```{image} surveys/activities-view.png +:align: center +:alt: The activities view option located on the Odoo Surveys dashboard. +``` + +Doing so reveals a table with rows and columns. The rows show the different surveys in the database, +and the columns depict the various activity types. + +:::{note} +A new survey cannot be created in this view, as it is solely for the purpose of creating and +viewing scheduled activities. +::: + +## Create surveys + +Learn about all the different options and configurations that can be utilized when creating a survey +in Odoo. + +:::{seealso} +{doc}`surveys/create` +::: + +## Scoring surveys + +Discover how to measure a survey participant's performance, or overall satisfaction, with Odoo's +detailed (and fully customizable) survey scoring options. + +:::{seealso} +{doc}`surveys/scoring` +::: + +## Create questions + +With Odoo *Surveys*, there are many question types and options to choose from, providing the ability +to create any kind of unique survey, questionnarire, and/or certification. + +:::{seealso} +{doc}`surveys/questions` +::: + +## Live Session surveys + +The *Live Session* survey option available in Odoo can enhance in-person demonstrations and +presentations, where participants' real-time responses can be used to dictate where the conversation +goes next. + +:::{seealso} +{doc}`surveys/live_session` +::: + +## Survey analysis + +Once the surveys start to come in, it is time to analyze the responses from your participants. +Fortuantely, the in-depth reporting pages and options available in Odoo *Surveys* provide countless +ways to examine everything related to surveys, and their submitted responses. + +:::{seealso} +{doc}`surveys/analysis` +::: + +```{toctree} +:titlesonly: true + +surveys/create +surveys/scoring +surveys/questions +surveys/live_session +surveys/analysis +``` + diff --git a/content/applications/marketing/surveys/analysis.md b/content/applications/marketing/surveys/analysis.md new file mode 100644 index 000000000..1355465b2 --- /dev/null +++ b/content/applications/marketing/surveys/analysis.md @@ -0,0 +1,285 @@ +# Survey analysis + +After surveys have been created and sent to participants, it is only a matter of time before the +responses start to come in. When they do, it is important to know where and how to analyze them in +the Odoo *Surveys* application. + +Fortunately, Odoo provides numerous ways to view survey responses, allowing users to access and +analyze survey responses as they are submitted. + +## See results + +Upon opening the {menuselection}`Surveys` application, the main dashboard reveals a list of all the +surveys in the database, along with pertinent information related to each one. + +By default, every survey line showcases its number of {guilabel}`Questions`, {guilabel}`Average +Duration`, and how many participants have {guilabel}`Registered` or {guilabel}`Completed` the +survey. + +There are also elements showing the percentage of how many participants {guilabel}`Passed` (if a +*Required Score (%)* was configured), or how many participants became {guilabel}`Certified` (if the +*Is a Certification* option was configured). + +:::{note} +To learn more about the different analytical elements found on the {guilabel}`Surveys` dashboard, +check out the {doc}`Survey Essentials <../surveys/create>` documentation. +::: + +On the {guilabel}`Surveys` dashboard, to the far-right of each survey line displayed in the default +list view, there is a {guilabel}`See results` button. + +```{image} analysis/see-results-button.png +:align: center +:alt: The 'See Results' button present on the main dashboard of the Odoo Surveys application. +``` + +When the {guilabel}`See results` button is clicked, a new browser tab opens, revealing a separate +page filled with all of that particular survey's results and responses, with an informative +{guilabel}`Results Overview` and some filtering drop-down menus at the top. + +```{image} analysis/results-page.png +:align: center +:alt: Typical survey results page when 'See results' is clicked from the Odoo Surveys +: dashboard. +``` + +At the top of the page, there is an {guilabel}`Edit Survey` link, in the middle of a blue header +banner. When clicked, Odoo returns the user to the survey form for that particular survey. + +Beneath that, is the title of the survey, and its description, if one was configured for it on its +survey form. + +To the right of the survey title, there are two drop-down menus with various filtering options, +which can be used to personalize and segment the survey results in a number of different ways. + +The first filter drop-down menu is set on the default {guilabel}`All Surveys` option, meaning the +results below are showing results and responses from all the submitted surveys, regardless if they +have been fully completed or not. + +When that drop-down menu is clicked open, another option, {guilabel}`Completed surveys`, appears. + +```{image} analysis/all-surveys-dropdown.png +:align: center +:alt: The 'All surveys' drop-down menu opened on the 'See results' page of the Odoo +: Surveys app. +``` + +With that drop-down menu open, the number corresponding to each filter option appears to the right +of each option. + +To the right of that drop-down menu of filter options, is another drop-down menu of filter options +that can be used to further customize the results showcased on this page. + +That drop-down menu is set to the {guilabel}`Passed and Failed` option, by default. This option +shows the results and responses from all participants who have passed or failed this particular +survey. + +:::{note} +This second drop-down menu of filter options **only** appears if the survey being analyzed has a +*Scoring* option configured, or if the *Is a Certification* feature has been enabled. +::: + +When that second drop-down menu of filter options is clicked open, two additional options appear: +{guilabel}`Passed only` and {guilabel}`Failed only`. + +```{image} analysis/passed-failed-dropdown.png +:align: center +:alt: The 'Passed and Failed' drop-down menu on the 'See results' page of the Odoo +: Surveys app. +``` + +Each option would filter the results below to only show responses from participants who have passed +the survey, or who have failed the survey, respectively. + +Directly beneath the survey title, there is a {guilabel}`Print` button. When clicked, the entire +results page can be printed. + +The {guilabel}`Results Overview` section is below the survey title, filter option drop-down menus, +and {guilabel}`Print` button. + +```{image} analysis/results-overview.png +:align: center +:alt: The 'Results Overview' section on the 'See results' page in the Odoo Surveys +: application. +``` + +This section of the results page provides a summarized collection of useful survey-related data and +metrics for quick analysis. + +### Question analysis + +Directly beneath the {guilabel}`Results Overview` section is where the results and responses of the +survey are found. + +:::{note} +The various sections of the survey, if there were any, appear at the top of their corresponding +questions on the results page, as well, for added organization. +::: + +Every question that was a part of the survey is shown, along with an in-depth breakdown, and visual +representation, of how it was answered by participants, beneath the {guilabel}`Results Overview` +section. + +Each question is displayed above its corresponding results. To the left of the question is an +{guilabel}`👁️ (eye)` icon. When clicked, Odoo hides the visual and data-related results and +responses. When clicked again, that question's visual and data-related results re-appear. + +To the far-right of the question, there are indicators to see how many participants +{guilabel}`Responded` and how many {guilabel}`Skipped` the question. + +```{image} analysis/responded-skipped-indicators.png +:align: center +:alt: The Responded and Skipped indicators on the 'See results' page in Odoo Surveys. +``` + +If the question required the participant to enter in their own answer, without any options to choose +from, like entering a specific number or date, for example, there is also an indicator to showcase +how many users answered the question {guilabel}`Correct`. + +```{image} analysis/correct-indicator.png +:align: center +:alt: Sample of a 'correct' indicator on the 'See results' page in the Odoo Surveys +: application. +``` + +:::{note} +Even if there is no configured *correct* response for question of this nature, the +{guilabel}`Correct` indicator still appears, although, it displays a `0`. + +This would occur for opinion-based questions, like `When would be a good time to hold another +sale?` +::: + +If there is only one correct response to a multiple choice question, those results and responses are +represented by a {guilabel}`Pie Graph`. The correct answer is indicated by a {guilabel}`✔️ +(checkmark)` icon next to the correct answer option, in the legend above the graph. + +```{image} analysis/pie-graph-results.png +:align: center +:alt: Typical pie graph results on the 'See results' page in the Odoo Surveys application. +``` + +If there are multiple correct answer options (or no correct answers at all) for a multiple choice +question, those results and responses are represented by a {guilabel}`Bar Graph`. + +```{image} analysis/bar-graph-results.png +:align: center +:alt: Typical bar graph results on the 'See results' page in the Odoo Surveys application. +``` + +Each multiple choice question has a {guilabel}`Graph` tab and an {guilabel}`Data` tab. The +graph-related tab is shown by default. + +The {guilabel}`Data` tab shows all the provided {guilabel}`Answer` options for the question. The +{guilabel}`User Choice` (with percentages and votes) along with the {guilabel}`Score` of each +option. + +```{image} analysis/data-tab.png +:align: center +:alt: Typical 'Data' tab on the 'See results' page in the Odoo Surveys application. +``` + +Other question types, wherein there were no answer options for the participant to choose from, there +is a {guilabel}`Most Common` tab and an {guilabel}`All Data` tab. + +The {guilabel}`Most Common` tab shows the {guilabel}`User Responses`, the {guilabel}`Occurrence`, +and the {guilabel}`Score` (if applicable). + +```{image} analysis/most-common-tab.png +:align: center +:alt: Typical 'Most Common' tab on the 'See results' page in the Odoo Surveys application. +``` + +The {guilabel}`All Data` tab shows a list of all the submitted responses to that particular +question. + +```{image} analysis/all-data-tab.png +:align: center +:alt: Typical 'All Data' tab on the 'See results' page in the Odoo Surveys application. +``` + +If a question is looking for participants to enter a numerical value as a response, +{guilabel}`Maximum`, {guilabel}`Minimum`, and {guilabel}`Average` indicators appear to the far-right +of the results tabs. + +```{image} analysis/max-min-avg-indicator.png +:align: center +:alt: The Maximum, Minimum, and Average indicators on the 'See results' page in Odoo +: Surveys. +``` + +A {guilabel}`filter` icon is also present either to the right of the {guilabel}`User Choice` column +in a {guilabel}`Data` tab, or to the far-right of a {guilabel}`User Response` line in an +{guilabel}`All Data` tab. + +```{image} analysis/filter-icon.png +:align: center +:alt: Typical 'Filter' icon on the 'See results' page in the Odoo Surveys application. +``` + +When that {guilabel}`filter` icon is clicked, Odoo returns the user to the top of the results page, +with that chosen filter applied, showing the results of each question for participants who submitted +that particular answer for that specific question. + +```{image} analysis/applied-filter.png +:align: center +:alt: The applied filter on the 'See results' page in the Odoo Surveys application. +``` + +Therefore, showcasing the remaining results for participants who answered that specific question in +the same way. To remove that filter, and reveal all the results once again, click {guilabel}`Remove +all filters` or click the {guilabel}`✖️ (X)` icon in the filter box at the top of the results page. + +## Participations + +To view a consolidated list of participation results for a specific survey, navigate to +{menuselection}`Surveys app`, select the desired survey from the list, and click the +{guilabel}`Participations` smart button at the top of the survey form. + +```{image} analysis/participations-smart-button.png +:align: center +:alt: The Participations smart button at the top of a survey form in Odoo Surveys. +``` + +Doing so reveals a separate {guilabel}`Participations` page, showcasing the participants for that +specific survey, along with a collection of pertinent information related to each one. + +```{image} analysis/participations-page-singular-survey.png +:align: center +:alt: The Participations page for a singular survey in the Odoo Surveys application. +``` + +Here, users can view information related to individual participants who took that specific survey. +If they desire to see a more detailed breakdown of their various answers and responses, they can +click on any participant, and Odoo reveals a separate page showing that participant's survey +details, along with their submitted answers. + +```{image} analysis/individual-participant-page.png +:align: center +:alt: An individual participant's detail form in the Odoo Surveys application. +``` + +To view a consolidated list of all participants of every survey in the database, navigate to +{menuselection}`Surveys app --> Participations`. Here, every survey in the database is shown in a +default nested list. Beside each survey title has the number of participants in parenthesis. + +```{image} analysis/participations-page-all-surveys.png +:align: center +:alt: The Participations page for all surveys in the Odoo Surveys application. +``` + +When a survey is un-nested from this list, by clicking the survey title, the corresponding +participants, along with their response-related data for that survey, appear on the page. + +The {guilabel}`Participations` page can also be viewed in a Kanban layout, as well. + +```{image} analysis/participations-page-kanban-view.png +:align: center +:alt: The Participations page in the Kanban view in the Odoo Surveys application. +``` + +:::{seealso} +- {doc}`create` +- {doc}`scoring` +::: + diff --git a/content/applications/marketing/surveys/create.md b/content/applications/marketing/surveys/create.md new file mode 100644 index 000000000..24ae7fb75 --- /dev/null +++ b/content/applications/marketing/surveys/create.md @@ -0,0 +1,343 @@ +# Create surveys + +To create a survey in the Odoo *Surveys* application, navigate to {menuselection}`Surveys app --> +New` to reveal a blank survey form. + +:::{note} +The {guilabel}`New` button is **not** present on the *Surveys* dashboard if in the *Activities* +view. +::: + +## Survey form + +```{image} create/blank-survey-form.png +:align: center +:alt: How a blank survey form looks in the Odoo Surveys application. +``` + +At the top of the survey form are four radio buttons, each representing a survey style. The radio +button options are: + +- {guilabel}`Survey` +- {guilabel}`Live Session` +- {guilabel}`Assessment` +- {guilabel}`Custom` (selected by default) + +These options are here to streamline the survey-making process, by providing users with automated +settings and options that are ideally specific to those types of surveys. Each of those survey type +options comes equipped with its own specific selection of options. + +The {guilabel}`Custom` option, selected by default, offers all the options from every potential +survey type (located in the {guilabel}`Options` tab). + +Beneath those radio survey type options is a blank field in which a name for the survey **must** be +entered. + +Below the survey name field, is the {guilabel}`Responsible` field. Choose a user from the drop-down +menu to be in charge of the survey. By default, the user who initially created the survey is +selected as the default {guilabel}`Responsible`. + +To the right of those fields, and above the tabs, is the option to add a background image, +represented by a {guilabel}`📷 (camera)` icon. When clicked, the option to upload an image becomes +available. This image would be used as the background image for the entire survey. This is **not** a +required option. + +Below those fields and options are four tabs: {guilabel}`Questions`, {guilabel}`Options`, +{guilabel}`Description`, and {guilabel}`End Message`. + +### Questions tab + +View, access, add, and/or delete questions and sections to the survey in the {guilabel}`Questions` +tab. + +By default, two columns are present in the {guilabel}`Questions` tab: {guilabel}`Title` (i.e. the +question) and {guilabel}`Question Type`. + +If the {guilabel}`Randomized per Section` option is enabled in the {guilabel}`Options` tab of the +survey form, a column titled, {guilabel}`# Questions Randomly Picked` appears in the +{guilabel}`Questions` tab. + +Indicate whether questions require a mandatory answer by clicking the {guilabel}`(optional columns)` +icon to the far-right of the column titles. Then, select {guilabel}`Mandatory Answer` from the +drop-down menu to reveal the {guilabel}`Mandatory Answer` column in the {guilabel}`Questions` tab. + +```{image} create/mandatory-answer-dropdown.png +:align: center +:alt: The slider drop-down menu with the Mandatory Answer option selected in Odoo Surveys. +``` + +#### Add a question + +To add a question to a survey, click {guilabel}`Add a question` in the {guilabel}`Questions` tab, +and proceed to fill out the {guilabel}`Create Sections and Questions` pop-up window that appears. + +To learn how to create and customize questions, refer to the {doc}`create questions ` +documentation. + +:::{important} +There **must** be a survey title entered in order for the {guilabel}`Create Sections and +Questions` pop-up window to appear. If no title is entered for the survey, an error pop-up +message appears in the upper-right corner, instructing the user to enter a survey title. +::: + +#### Add a section + +A *section* divides the survey into organized parts, in order to visually group similar questions +together. To make a section, click {guilabel}`Add a section` at the bottom of the +{guilabel}`Questions` tab, proceed to type in a desired name for the section, then either press +{kbd}`Enter` or click away. + +The section line appears in dark gray in the {guilabel}`Questions` tab. + +Then, drag-and-drop desired questions beneath a section, or drag-and-drop a section title on top of +(i.e. *before*) the desired question(s) in the survey. Doing so populates the section with questions +that align with its theme. + +If the {guilabel}`Randomized per Section` option is enabled in the {guilabel}`Options` tab of the +survey form, the number `1` appears, by default, on the section line, beneath the {guilabel}`# +Questions Randomly Picked` column. + +This indicates that `1` question from that section will be picked at random for each participant +taking the survey, bypassing every other, non-chosen question from that section. To change that +number, select that figure, and type in the desired number in its place. Then, either press +{kbd}`Enter`, or click away. + +### Options tab + +In the {guilabel}`Options` tab of the survey form, there are many options to choose from, separated +in four different sections: {guilabel}`Questions`, {guilabel}`Time & Scoring`, +{guilabel}`Participants`, and {guilabel}`Live Session`. + +The options available in this tab vary on the survey type chosen, via the radio buttons at the top +of the survey form: {guilabel}`Survey`, {guilabel}`Live Session`, {guilabel}`Assessment`, or +{guilabel}`Custom`. + +The {guilabel}`Custom` survey type showcases all the possible options in the {guilabel}`Options` +tab. So, if any of the following options do **not** appear in the {guilabel}`Options` tab, it is +likely because the selected survey type does not offer it. + +#### Questions section + +```{image} create/questions-section-options-tab.png +:align: center +:alt: The Questions section of the Options tab on a survey form in Odoo Surveys. +``` + +The first field in the {guilabel}`Questions` section revolves around the {guilabel}`Pagination`, +or overall layout, of the survey. + +Choose between {guilabel}`One page per question`, {guilabel}`One page per section`, or +{guilabel}`One page with all the questions` in the {guilabel}`Pagination` field. + +:::{note} +If {guilabel}`One page with all the questions` is selected, all the remaining options in the +{guilabel}`Questions` field, apart from {guilabel}`Question Selection` is removed, as they are no +longer needed. +::: + +Next, select one of the following options in the {guilabel}`Display Progress as` field: + +- {guilabel}`Percentage left`: displays the percentage of the survey remaining to participants. +- {guilabel}`Number`: display the number of questions answered along with the total number of + questions to answer. + +In the {guilabel}`Question Selection` field choose to have the survey show {guilabel}`All questions` +or {guilabel}`Randomized per Section`. If {guilabel}`Randomized per Section` a new column appears in +the {guilabel}`Questions` tab, titled: {guilabel}`# Questions Randomly Picked`. + +In the {guilabel}`# Questions Randomly Picked` column, designate how many questions, in that +particular section, should be chosen at random to the participant. + +Lastly, there is the {guilabel}`Allow Roaming` option. When enabled, participants are able to +navigate back to previous pages in the survey. + +#### Time & Scoring section + +```{image} create/time-scoring-section-options-tab.png +:align: center +:alt: The Time and Scoring section of the Options tab on a survey form in Odoo Surveys. +``` + +The first option in the {guilabel}`Time & Scoring` section is the {guilabel}`Survey Time Limit` +option. If enabled, proceed to enter in an amount of time (in {guilabel}`minutes`) to be set as the +time limit for the survey. + +Next, in the {guilabel}`Scoring` section, determine whether there should be: {guilabel}`No scoring`, +{guilabel}`Scoring with answers after each page`, {guilabel}`Scoring with answers at the end`, or +{guilabel}`Scoring without answers`. + +If the {guilabel}`No scoring` option is selected, no other options are available in this section. +However, if any *other* {guilabel}`Scoring` option is selected, two additional fields appear: +{guilabel}`Required Score (%)` and {guilabel}`Is a Certification`. + +In the {guilabel}`Required Score (%)` field, enter the minimum percentage participants **must** earn +in order to pass the survey. Scores below this threshold are considered fails. This figure is also +used to determine if a participant is 'certified' or not, if the {guilabel}`Is a Certification` +option is enabled. + +If the {guilabel}`Is a Certification` option is enabled, that makes the survey a *Certification*, +which is represented on the main *Surveys* app dashboard via a half-tropy image behind the survey +title, while in the default Kanban view. Or, via a full-trophy icon, while in list view. + +When the {guilabel}`Is a Certification` option is enabled, three additional fields appear -- one +beside the option, and two below. + +In the field that appears beside the option, users can select (and {guilabel}`Preview`) a +certification template. + +Beneath that, in the {guilabel}`Certified Email Template` field, users can select a preconfigured +email template, or create one on-the-fly, to be sent to certified participants of the survey upon +completion. + +Lastly, if the {guilabel}`Give Badge` field is enabled, a preconfigured badge is then displayed on +the contact page for that certified survey participant. + +#### Participants section + +```{image} create/participants-section-options-tab.png +:align: center +:alt: The Participants section of the Options tab on a survey form in Odoo Surveys. +``` + +The first available option in the {guilabel}`Participants` section is the {guilabel}`Access Mode` +field. This is where users can determine who has access to the survey. Users can select either: +{guilabel}`Anyone with the link` or {guilabel}`Invited people only`. + +Next, there is the option to {guilabel}`Require Login`. Enabling this feature means users **must** +login before being able to take the survey, even if they have a valid token. + +Lastly, in there is the {guilabel}`Limit Attempts` field. If enabled, an additional field appears +beside it, in which users can determine how many times users can attempt this survey. + +#### Live Session section + +```{image} create/live-session-section-options-tab.png +:align: center +:alt: The Live Session section of the Options tab on a survey form in Odoo Surveys. +``` + +:::{note} +The {guilabel}`Live Session` section in the {guilabel}`Options` tab of the survey form **only** +pertains to *Live Session* surveys. +::: + +The first option in the {guilabel}`Live Session` section is the {guilabel}`Session Code` field. In +this field, enter a custom code, consisting of letters, numbers, and/or symbols, to be used by +participants in order to access the live session survey. + +Next, is the {guilabel}`Session Link` field, which **cannot** be customized, but it *can* be sent +out to potential participants. + +:::{note} +If a {guilabel}`Session Code` has been entered, the URL in the {guilabel}`Session Link` field +ends with that specific {guilabel}`Session Code`. + +If that complete {guilabel}`Session Link` (ending in the custom {guilabel}`Session Code`) is used +by participants to access the live session survey, that link would *already* be entered for them. +At that point, they'd simply have to wait until the host of the live session begins the survey, +and then they'd be able to enter. + +If the {guilabel}`Session Link` (ending in the custom {guilabel}`Session Code`) is sent +**without** including the {guilabel}`Session Code` ending, participants trying to access the live +session, via that link, will need to enter the custom {guilabel}`Session Code` to gain access. + +If the {guilabel}`Session Code` field is empty, a slightly longer, more complicated URL populates +the {guilabel}`Session Link` field. When participants attempt to access the live session via that +link (without a configured {guilabel}`Session Code`), all they have to do is wait for the host of +the live session to begin the survey, and they'd be able to participate. +::: + +Lastly, in the {guilabel}`Live Session` section, there is the option to {guilabel}`Reward quick +answers`. If that option is enabled, participants who submit their answer quickly receive more +points. + +:::{seealso} +{doc}`live_session` +::: + +### Description tab + +In this non-required tab, users can enter a custom description about the survey, along with any +explanations or guidance that a survey participant may need in order to properly participate (and +complete) the survey. + +### End Message tab + +In this non-required tab, users can enter a custom message that participants see upon completing the +survey. + +## Survey form buttons + +Once the survey has been configured properly, and questions have been added, the user can utilize +any of the available buttons in the upper-left corner of the survey form. + +```{image} create/survey-form-buttons.png +:align: center +:alt: The various buttons on a survey form in Odoo Surveys. +``` + +Those buttons are the following: + +- {guilabel}`Share`: click to reveal a {guilabel}`Share a Survey` pop-up form that can be used to + invite potential participants to the survey — complete with a {guilabel}`Survey Link` that can be + copied and sent to potential participants, and a {guilabel}`Send by Email` toggle switch. + + ```{image} create/share-survey-popup.png + :align: center + :alt: The 'Share a Survey' pop-up window that appears in the Odoo Surveys application. + ``` + + When the {guilabel}`Send by Email` toggle is in the 'on' position, indicated by a green switch, + additional fields appear, in which {guilabel}`Recipients` and a {guilabel}`Subject` can be added + to the email. Below that, a dynamic email template, complete with a {guilabel}`Start + Certification` button appears, which can also be modified. + + ```{image} create/share-survey-popup-email-toggle.png + :align: center + :alt: The 'Share a Survey' pop-up window in Odoo Surveys with the Send by Email toggled + : on. + ``` + + Once modifications are complete, click {guilabel}`Send` to send that email invite to all the email + addresses/contacts listed in the {guilabel}`Recipients` field. + +- {guilabel}`See results`: this button **only** appears if there has been at least one participant + who has completed the survey. Clicking {guilabel}`See results` reveals a separate tab containing + a visual analysis of the survey questions and responses. For more information, check out the + {doc}`scoring surveys ` documentation. + +- {guilabel}`Create Live Session`: clicking this button opens the *Session Manager* in a separate + tab. It also allows participants to access the live session, but the actual survey does **not** + begin until the user hosting the live session survey clicks the {guilabel}`Start` button on the + *Session Manager* window. + + Additionally, when {guilabel}`Create Live Session` has been clicked, and the *Session Manager* tab + has been opened, the {guilabel}`Create Live Session` button on the survey form is replaced with + two new buttons: {guilabel}`Open Session Manager` and {guilabel}`Close Live Session`. + + Clicking {guilabel}`Open Session Manager` opens another separate tab to the *Session Manager*, and + clicking {guilabel}`Close Live Session` closes, and subsequently ends, the live session. + +- {guilabel}`Test`: clicking this button opens a new tab to a test version of the survey, in order + for the user to check for errors or inconsistencies, from the point-of-view of a participant. + Users can tell if they are in a test version of the survey if there is a blue banner at the top of + the screen, reading: `This is a Test Survey --> Edit Survey`. + + If the link in the blue banner is clicked, Odoo returns the user to the survey form. + +- {guilabel}`Print`: clicking this button opens a new tab to a printable version of the survey that + the user can proceed to print for their records. + +- {guilabel}`Close`: clicking this button closes the survey (i.e. archives it), which is represented + by a red {guilabel}`Archived` banner across the top-right corner of the survey form. + + When this button is clicked, and the survey is closed, a single button appears in the upper-right + corner of the survey form, titled: {guilabel}`Reopen`. When {guilabel}`Reopen` is clicked the + survey is reopened (i.e. unarchived), and the {guilabel}`Archived` banner is removed from the + survey form. + +:::{seealso} +- {doc}`questions` +- {doc}`scoring` +::: + diff --git a/content/applications/marketing/surveys/live_session.md b/content/applications/marketing/surveys/live_session.md new file mode 100644 index 000000000..f962c8b15 --- /dev/null +++ b/content/applications/marketing/surveys/live_session.md @@ -0,0 +1,227 @@ +# Live Session surveys + +With the Odoo *Surveys* application, users can enhance in-person demonstrations and presentations +with the *Live Session* feature. + +*Live Session* surveys function the same way as a normal survey, but with a host or moderator, who +presents the questions to participants, reveals their responses in real-time, and controls the tempo +of the survey. + +In *Live Session* surveys, participants access the survey experience via a custom URL, and sign in +with an optional access code. When the survey has begun, the host presents one question at a time. + +Then, the audience of participants submit their answer, either via their computer or mobile device, +and once the responses have been gathered, the host reveals all the participant's responses, in real +time, with each answer's results displayed as a bar graph. + +```{image} live_session/live-session-concept-sample.png +:align: center +:alt: Rendered concept of how a Live Session question and answer result appears in +: Odoo Surveys. +``` + +## Create Live Session survey + +To create a *Live Session* survey, begin by opening the *Surveys* application. From the +{guilabel}`Surveys` dashboard, click the {guilabel}`New` button to reveal a blank survey form. + +Any of the survey type options ({guilabel}`Survey`, {guilabel}`Live Session`, +{guilabel}`Assessment`, or {guilabel}`Custom`), presented as radio buttons at the top of the survey, +can be used to create a *Live Session*. + +However, selecting the {guilabel}`Live Session` survey type radio button streamlines the process +because Odoo auto-selects the optimal settings and options for a *Live Session* survey when that +option is selected. + +:::{important} +If the {guilabel}`Is a Certification` option is enabled in the {guilabel}`Options` tab, the +survey **cannot** be used as a *Live Session* survey. +::: + +With the desired survey radio button option selected, proceed to {doc}`create a survey +<../surveys/create>` with {doc}`questions and sections <../surveys/questions>`. + +While creating questions for the *Live Session* survey, open the {guilabel}`Options` tab on the +{guilabel}`Create Sections and Questions` pop-up form, in order to reveal the {guilabel}`Live +Sessions` section, which only has one available feature: {guilabel}`Question Time Limit`. + +When the {guilabel}`Question Time Limit` option is enabled, a new field appears beside it, wherein +the user **must** enter the desired amount of time (in seconds) the participant gets to answer the +question. + +```{image} live_session/question-time-limit-option.png +:align: center +:alt: The Live Session question time limit option for questions in the Odoo Surveys +: application. +``` + +### Options tab + +After the questions have been created for the *Live Session* survey, open the {guilabel}`Options` +tab of the survey form to further configure the survey. + +The {guilabel}`Options` tab is organized into four sections: {guilabel}`Questions`, {guilabel}`Time +& Scoring`, {guilabel}`Participants`, and {guilabel}`Live Session`. + +#### Questions section + +Regardless of the option selected for the {guilabel}`Pagination` field, the *Live Session* survey +*only* shows {guilabel}`One page per question`, and will default to that option when the +{guilabel}`Create Live Session` button is clicked, and a *Live Session* survey officially begins. + +:::{note} +The {guilabel}`One page per question` option in the {guilabel}`Pagination` field is selected by +default, and no other options appear in the {guilabel}`Questions` section, when the +{guilabel}`Live Session` survey type radio button is selected. +::: + +The {guilabel}`Display Progress as` and {guilabel}`Question Selection` options are still viable and +active options for *Live Session* surveys, if desired, but they are **not** required. + +However, the {guilabel}`Allow Roaming` feature is **not** available during *Live Session* surveys +whatsoever, as the host/moderator controls the survey, and participants have no control over what +question they see, or when they see it. + +#### Time & Scoring section + +The {guilabel}`Survey Time Limit` option is **not** applicable for *Live Session* surveys. This +option does not even appear in the {guilabel}`Time & Scoring` section of the {guilabel}`Options` tab +if the {guilabel}`Live Session` survey type radio button option is selected. + +:::{note} +While the {guilabel}`Survey Time Limit` option is not applicable for *Live Session* surveys, each +question *can* be affixed with its own *Question Time Limit*, via the *Options* tab of the +question pop-up form. Those question-specific time limits *do* work with *Live Session* surveys. +::: + +If desired, any {guilabel}`Scoring` option, and subsequent {guilabel}`Required Score (%)` option are +available to use with *Live Session* surveys. + +However, if the {guilabel}`Is a Certification` option is enabled, the survey **cannot** be used as a +*Live Session* survey. The {guilabel}`Is a Certification` option does **not** appear in the +{guilabel}`Time & Scoring` section of the {guilabel}`Options` tab if the {guilabel}`Live Session` +survey type radio button option is selected. + +#### Participants section + +The {guilabel}`Access Mode` field is set to the {guilabel}`Anyone with the link` option when the +survey is used as a *Live Session*. The {guilabel}`Anyone with the link` option **cannot** be +modified if the {guilabel}`Live Session` survey type radio button option is selected. + +The {guilabel}`Require Login` option is available for *Live Session* surveys. However, if the +{guilabel}`Live Session` survey type radio button option is selected, the usual {guilabel}`Limit +Attempts` field that appears when {guilabel}`Require Login` is enabled does **not** appear, as live +session participants only get to attempt the survey once, as the host leads them through it. + +#### Live Session section + +The {guilabel}`Session Code` field allows users to create unique codes for participants to use, in +order to gain access to the *Live Session* survey. This code can consist of any combination of +letters, numbers, and/or symbols. + +The {guilabel}`Session Code` field is **not** required, however, it is encouraged because it adds a +level of exclusivity to the survey and, without a {guilabel}`Session Code`, the URL that appears in +the following {guilabel}`Session Link` field becomes far more complex. + +:::{important} +If a {guilabel}`Session Code` is **not** entered, participants can access the survey, via the +{guilabel}`Session Link` without needing a host, and the fundamental elements of the *Live +Session* are lost, as the survey is then just a normal questionnaire, without any real-time +results. +::: + +With a {guilabel}`Session Code`, the URL in the non-modifiable {guilabel}`Session Link` field is +simplified, and ends with the {guilabel}`Session Code`, preceded by `/s/`. + +```{eval-rst} +.. example:: + If `1212` has been entered as the :guilabel:`Session Code`, the URL in the :guilabel:`Session + Link` field begins with the basic URL of the database (e.g. `sample-database.odoo.com`), followed + by: `/s/1212`. + + So, collectively, that sample :guilabel:`Session Link` would be: + `sample-database.odoo.com/s/1212`. +``` + +:::{tip} +If a user sends out the {guilabel}`Session Link` URL in its complete form - {guilabel}`Session +Code` and all - participants would *not* need to enter in a code, as it would already be entered +for them. That complete link places the participant in a virtual waiting room, where they simply +need to wait for the host to officially start the *Live Session* survey. + +If a user sends out the {guilabel}`Session Link` URL - *except* for the {guilabel}`Session Code` +at the end (i.e. the entire URL *through* `.../s/`) - participants would be taken to a page, +wherein they would need to enter the specific {guilabel}`Session Code` in order to access the +*Live Session*. +::: + +If any {guilabel}`Scoring` option has been enabled, the opportunity to {guilabel}`Reward quick +answers` is also available with *Live Session* surveys. + +## Start Live Session surveys + +Once all the questions and configurations are complete, users can click the {guilabel}`Create Live +Session` button at the top of the survey form. Doing so opens a new browser tab to the *Session +Manager*. + +When the {guilabel}`Create Live Session` button has been clicked, and the *Live Session* has begun, +a new {guilabel}`Open Session Manager` button appears on the survey form, which opens a new browser +tab to the *Session Manager*. If the *Live Session* has already begun, that button leads the user to +the question or section the *Live Session* is currently on. + +Additionally, a {guilabel}`Close Live Session` button appears on the survey form. When that button +is clicked, the *Live Session* survey closes. + +The *Session Manager* is controlled by the host/moderator of the *Live Session* survey, and is +typically shown on a projection or screen, so the participants can collectively view the questions +and real-time responses, as the host/moderator guides them through the *Live Session*. + +:::{note} +The participant can see and answer the questions from their computer or mobile device, but the +results and real-time responses can **only** be seen on the *Session Manager*. +::: + +Initially, the *Session Manager* shows the title of the *Live Session* survey, the link needed to +access it, and a {guilabel}`Waiting for attendees...` counter, which populates as participants enter +the *Live Session* survey. + +Once the desired amount of participants have entered the *Live Session* survey, the host/moderator +can click the {guilabel}`Start` button on the right side of the *Session Manager* window to begin +the *Live Session*. + +:::{note} +If the survey begins with a section title on the survey form, that section title appears in the +*Session Manager*, and the participant's view of the survey informs them to `Pay attention to the +host screen until the next question`. This message appears whenever a section title appears +during a *Live Session*. +::: + +When the first question appears on the survey, the *Session Manager* shows the question above an +empty bar graph, showing the potential answer options on the x-axis. The participants see the +question and selectable answer options on their computer or mobile device. + +As participants submit their answers, a progress bar, in the upper-left corner of the *Session +Manager*, fills in. This is how *Live Session* hosts/moderators know when every participant has +submitted their responses. + +Then, when the desired amount of participants have submitted their responses, the host/moderator +clicks the {guilabel}`Show Results` button on the right side of the *Session Manager* to reveal the +collective real-time responses on the bar graph. + +Once the host/moderator feels like the participants have had enough time to view the real-time +results, via the populated bar graph, they can click the {guilabel}`Show Correct Answer(s)` button +on the right side of the *Session Manager* window. Doing so highlights the correct response, if one +has been designated, in green. All incorrect responses are highlighted in red. + +When the host/moderator feels the participants have had enough time to take in the correct and +incorrect responses, via the bar graph on the *Session Manager*, they can click the +{guilabel}`Next` button to move on to the next portion of the survey. + +Repeat this process until the survey is complete. + +:::{seealso} +- {doc}`create` +- {doc}`questions` +- {doc}`scoring` +::: + diff --git a/content/applications/marketing/surveys/questions.md b/content/applications/marketing/surveys/questions.md new file mode 100644 index 000000000..d3a3b602a --- /dev/null +++ b/content/applications/marketing/surveys/questions.md @@ -0,0 +1,341 @@ +# Create questions + +In Odoo *Surveys*, crafting and tailoring survey questions is crucial for {doc}`creating and +customizing surveys <../surveys/create>`. + +Fortunately, Odoo provides numerous ways to configure tailored questions for any kind of survey. + +To access a list of *all* the questions that have been created in the database, navigate to +{menuselection}`Surveys app --> Questions & Answers --> Questions`. There, users can view and modify +any question from any survey. + +However, there is only one place in the Odoo *Surveys* application where survey questions can be +created. To do that, navigate to a survey form, by going to {menuselection}`Surveys app --> New`, or +by selecting any pre-existing survey from the {guilabel}`Surveys` page ({menuselection}`Surveys app +--> Surveys`). + +## Questions tab + +On a survey form, users can view, access, add, and/or delete questions (and sections) in the +{guilabel}`Questions` tab. + +By default, two columns are present in the {guilabel}`Questions` tab: {guilabel}`Title` (i.e. the +question) and {guilabel}`Question Type`. + +If the {guilabel}`Randomized per Section` option is enabled in the {guilabel}`Options` tab of the +survey form, a column titled, {guilabel}`# Questions Randomly Picked` appears in the +{guilabel}`Questions` tab. + +To reveal the {guilabel}`Mandatory Answer` column on the {guilabel}`Questions` tab, which indicates +if questions require a mandatory answer or not, click the {guilabel}`(optional columns)` icon +located to the far-right of the column titles. + +```{image} questions/slider-dropdown-mandatory-answer.png +:align: center +:alt: The slider drop-down menu showing the Mandatory Answer option in Odoo Surveys. +``` + +### Create sections + +A *section* divides the survey into organized parts, in order to visually group similar questions +together. To make a section, click {guilabel}`Add a section` at the bottom of the +{guilabel}`Questions` tab, proceed to type in a desired name for the section, then either press +{kbd}`Enter` or click away. + +The section line appears in dark gray in the {guilabel}`Questions` tab. + +Then, drag-and-drop desired questions beneath a section, or drag-and-drop a section title on top of +(i.e. *before*) the desired question(s) in the survey, in order to populate the section with +specific questions that fit the theme of the section. + +If the {guilabel}`Randomized per Section` option is enabled in the {guilabel}`Options` tab of the +survey form, the number `1` appears, by default, on the section line, beneath the {guilabel}`# +Questions Randomly Picked` column. + +This indicates that `1` question from that section will be picked at random for each participant +taking the survey, bypassing every other, non-chosen question from that section. To change that +number, select that figure, and type in the desired number in its place. Then, either press +{kbd}`Enter`, or click away. + +## Create questions + +To create questions for the survey, click {guilabel}`Add a question` in the {guilabel}`Questions` +tab. + +Clicking {guilabel}`Add a question` opens the {guilabel}`Create Sections and Questions` pop-up +window, in which a survey question can be created. + +:::{important} +There **must** be a survey title entered in order for the {guilabel}`Create Sections and +Questions` pop-up window to appear. If no title is entered for the survey, an error pop-up +message appears in the upper-right corner, instructing the user to enter a survey title. +::: + +When all desired configurations are complete click either {guilabel}`Save & Close` to save the +question and return to the survey form, or {guilabel}`Save & New` to save the question and create a +new one right away in a fresh {guilabel}`Create Sections and Questions` pop-up window. + +Click {guilabel}`Discard` to discard the question entirely. + +### Create Sections and Questions pop-up window + +```{image} questions/create-sections-questions-popup.png +:align: center +:alt: The Create Sections and Questions pop-up form in Odoo Surveys. +``` + +In the {guilabel}`Create Sections and Questions` pop-up window, start by typing the question into +the {guilabel}`Question` field, located at the top of the pop-up window. + +Then, choose the desired {guilabel}`Question Type`. A preview of each {guilabel}`Question Type` is +to the right of the {guilabel}`Question Type` field, when a {guilabel}`Question Type` is selected. + +Choose from the following {guilabel}`Question Types`: + +- {guilabel}`Multiple choice: only one answer`: a multiple choice question, where only one answer is + permitted. +- {guilabel}`Multiple choice: multiple answers allowed`: a multiple choice question, where more than + answer is permitted. +- {guilabel}`Multiple Lines Text Box`: an open-ended question, where participants can type in a + multiple line response. +- {guilabel}`Single Line Text Box`: an open-ended question, where participants can type in a single + line response. +- {guilabel}`Numerical Value`: a number-based question, where participants must enter a number as a + response. +- {guilabel}`Date`: a date-based question, where participants must enter a date (year-month-day) as + a response. +- {guilabel}`Datetime`: a date-based question, where participants must enter a date *and* time + (year-month-day, hour-minute-second) as a response. +- {guilabel}`Matrix`: a multiple-choice, multiple question, in a table/chart layout, where + participants are presented with different questions on each row, and different answer options on + each column. + +:::{note} +Different features appear in the {guilabel}`Answers` and {guilabel}`Options` tabs, depending on +the chosen {guilabel}`Question Type`. + +However, the {guilabel}`Description` tab **always** remains the same, regardless of the question +type chosen. +::: + +Once a {guilabel}`Question Type` has been selected, there are three possible tabs where information +can be customized for the question. These include the {guilabel}`Answers` tab (if applicable for the +chosen {guilabel}`Question Type`), the {guilabel}`Description` tab, and the {guilabel}`Options` tab. + +Each tab offers a variety of different features, depending on what {guilabel}`Question Type` was +chosen. + +#### Answers tab + +The {guilabel}`Answers` tab **only** appears if the selected {guilabel}`Question Type` provides +answer options to the participant. + +However, if a custom response is required to answer the selected {guilabel}`Question Type`, like a +{guilabel}`Multiple Lines Text Box`, for example. Or, if the answer to the {guilabel}`Question Type` +is a number, date, or datetime, the {guilabel}`Answers` tab disappears completely. + +If the {guilabel}`Single Line Text Box` is selected as the {guilabel}`Question Type`, the +{guilabel}`Answers` tab remains, although it only provides two checkbox options: {guilabel}`Input +must be an email` and {guilabel}`Save as user nickname`. + +```{image} questions/single-line-answer-tab.png +:align: center +:alt: The Single Line Text box question type answers tab in Odoo Surveys. +``` + +If the {guilabel}`Input must be an email` option is enabled, a new field, {guilabel}`Save as user +email` appears. If that box is ticked, Odoo saves the participant's answer to that specific question +as their email address. + +If the {guilabel}`Save as user nickname` option is enabled, Odoo saves the participant's answer as +its nickname. + +For all other applicable {guilabel}`Question Type` options that provide answer options to the +participant, the {guilabel}`Answers` tab appears the same. + +```{image} questions/multiple-choice-answer-options.png +:align: center +:alt: The answer tab with a multiple choice answer option selected in Odoo Surveys. +``` + +From here, users can add answer options by clicking {guilabel}`Add a line`, and typing in the +various answer options for that question. Then, either press {kbd}`Enter` to lock in that answer +option and immediately add another one. Or, click away to simply lock in that answer option. + +The entered answer options appear in the {guilabel}`Choices` column of the {guilabel}`Answers` tab. + +If any *Scoring* option is enabled in the {guilabel}`Options` tab of the survey form, the +{guilabel}`Correct` and {guilabel}`Score` columns appear to the right of the {guilabel}`Choices` +column. + +To mark an answer option as correct, tick the box beneath the {guilabel}`Correct` column for the +respective question. If {guilabel}`Multiple choice: multiple answers allowed` is set as the +{guilabel}`Question Type`, multiple answers in the {guilabel}`Choices` column can be marked as +{guilabel}`Correct`. + +In the {guilabel}`Score` column, designate how many points (if any) should be rewarded to the +participant for entering that specific answer. It is possible to enter a negative amount as the +{guilabel}`Score` to take points away for an incorrect response. + +The option to upload a corresponding image to accompany the answer options is available on the +question line, beneath the {guilabel}`Image` column, by clicking {guilabel}`Upload your file`, and +uploading the desired image. + +To delete any answer option, click the {guilabel}`🗑️ (trash can)` icon to the far-right of the +question line. + +An exception to that is if the {guilabel}`Matrix` option is selected as the {guilabel}`Question +Type`. If that's chosen, the {guilabel}`Answers` tab remains, but below the typical +{guilabel}`Choices` section, there is a {guilabel}`Rows` section. That's because the +{guilabel}`Matrix` option provides an answer table for participants to fill out. + +```{image} questions/matrix-answer-tab.png +:align: center +:alt: The answer tab with a matrix question type selected in Odoo Surveys. +``` + +#### Description tab + +In the {guilabel}`Description` tab of the {guilabel}`Create Sections and Questions` pop-up window is +used to provide any kind of guidelines, instructions, or any other type of supplemental material +deemed necessary to help participants answer/understand the question. + +Entering a description is **not** required. + +#### Options tab + +In the {guilabel}`Options` tab of the {guilabel}`Create Sections and Questions` pop-up window, there +are four available sections: {guilabel}`Answers`, {guilabel}`Constraints`, {guilabel}`Conditional +Display`, and {guilabel}`Live Sessions`. + +##### Answers section + +:::{note} +Fields in the {guilabel}`Answers` section in the {guilabel}`Options` tab of the {guilabel}`Create +Sections and Questions` pop-up window vary, depending on the selected {guilabel}`Question Type` +and overall {guilabel}`Options` configured on the survey form. +::: + +###### Multiple Choice question types + +If the selected {guilabel}`Question Type` is either {guilabel}`Multiple choice: only one answer` or +{guilabel}`Multiple choice: multiple answers allowed`, there is a {guilabel}`Show Comments Field` +present in the {guilabel}`Answers` section. + +When enabled, two additional fields appear: {guilabel}`Comment Message` and {guilabel}`Comment is an +answer`. + +```{image} questions/multiple-choice-options-tab.png +:align: center +:alt: The answers section of the options tab when a multiple choice question type is +: selected. +``` + +In the {guilabel}`Comment Message` field, type in a guiding message to help participants know what +is expected of them (e.g. `If other, please specify`). + +If the {guilabel}`Comment is an answer` option is enabled, Odoo takes the participant's commented +response as an answer, and not just commentary on the question. This is best utilized in surveys +where there is no scoring option enabled. + +###### Multiple Lines Text Box question type + +If the selected {guilabel}`Question Type` is {guilabel}`Multiple Lines Text Box`, a +{guilabel}`Placeholder` field appears in the {guilabel}`Answers` section of the {guilabel}`Options` +tab. + +```{image} questions/multiple-lines-placeholder.png +:align: center +:alt: The placeholder field when a multiple lines text box option is chosen in Odoo +: Surveys. +``` + +In the {guilabel}`Placeholder` field, enter a guiding direction to help participants know what they +should write in the {guilabel}`Multiple Lines Text Box` presented to them. + +###### Single Line Text Box, Numerical Value, Date, Datetime question types + +If the selected {guilabel}`Question Type` is {guilabel}`Single Line Text Box`, {guilabel}`Numerical +Value`, {guilabel}`Date`, or {guilabel}`Datetime`, two options appear in the {guilabel}`Answers` +section of the {guilabel}`Options` tab: {guilabel}`Validate Entry` and {guilabel}`Placeholder`. + +If the {guilabel}`Validate Entry` option is enabled, two additional fields appear beneath: +{guilabel}`Min/Max Limits` and {guilabel}`Validation Error`. + +```{image} questions/single-line-validate-entry.png +:align: center +:alt: The answers section of the option tab when a single line text box question type +: is chosen. +``` + +In the {guilabel}`Min/Max Limits` field, designate the minimum and maximum allowed quantities for +that specific question. + +In the {guilabel}`Validation Error` field, enter a custom message that Odoo displays when an answer +is not valid. + +In the {guilabel}`Placeholder` field, enter a guiding direction to help participants know what they +should write in the {guilabel}`Multiple Lines Text Box` presented to them. + +##### Constraints section + +The {guilabel}`Constraints` section in the {guilabel}`Options` tab is the same, regardless of the +selected {guilabel}`Question Type`. + +```{image} questions/constraints-section.png +:align: center +:alt: The Constraints section in the options tab in Odoo Surveys. +``` + +In the {guilabel}`Constraints` section, there is one option available: {guilabel}`Mandatory Answer`. + +When {guilabel}`Mandatory Answer` is enabled, that means that specific question requires an answer +from the participant before they can move on. Also, when {guilabel}`Mandatory Answer` is enabled, +that reveals an additional field: {guilabel}`Error Message`. + +In the {guilabel}`Error Message` field, enter a custom error message prompting the participant to +provide an answer for this question. + +##### Conditional Display section + +{guilabel}`Conditional Display` means the question is **only** displayed if a specified conditional +answer(s) (i.e. {guilabel}`Triggering Answers`) has been selected in a previous question(s). + +:::{note} +The {guilabel}`Conditional Display` section of the {guilabel}`Options` tab is **not** available +when questions are randomly picked. +::: + +There is only one field in the {guilabel}`Conditional Display` section: {guilabel}`Triggering +Answers`. + +```{image} questions/conditional-display-section.png +:align: center +:alt: The Conditional Display section of the options tab in the Odoo Surveys application. +``` + +In the {guilabel}`Triggering Answers` field, select specific responses from previous questions that +would trigger this question. More than one answer can be selected. Leave the field empty if the +question should always be displayed. + +##### Live Sessions section + +The option in the {guilabel}`Live Sessions` section of the {guilabel}`Options` tab are **only** +supported by *Live Session* surveys. + +There is only one option available in the {guilabel}`Live Sessions` section: {guilabel}`Question +Time Limit`. + +```{image} questions/live-sessions-section.png +:align: center +:alt: The Live Sessions section of the Option tab in the Odoo Surveys application. +``` + +When the {guilabel}`Question Time Limit` option is enabled, designate how much time (in +{guilabel}`seconds`) participants have to answer the question during a *Live Session* survey. + +:::{note} +Survey text colors are directly linked to the colors used for the {doc}`website theme +<../../websites/website/web_design/themes>`. +::: + diff --git a/content/applications/marketing/surveys/scoring.md b/content/applications/marketing/surveys/scoring.md new file mode 100644 index 000000000..0a26485bf --- /dev/null +++ b/content/applications/marketing/surveys/scoring.md @@ -0,0 +1,57 @@ +# Scoring surveys + +To measure a survey participant's performance, knowledge, or overall satisfaction, Odoo ascribes +points to survey answers. At the end of the survey, these points are summed up, resulting in the +participant's final score. + +To add points to questions, open the {guilabel}`Surveys` application, choose the desired survey +form, and then click on the {guilabel}`Options` tab. Under the :guilabel;\`Scoring\` section, choose +between {guilabel}`Scoring with answers at the end` or {guilabel}`Scoring without answers at the +end`. + +- {guilabel}`Scoring with answers at the end` shows the survey participant their answers after + completing the survey, and displays which questions they got right or wrong. On questions where + there was an incorrect answer, the correct answer will be highlighted. +- {guilabel}`Scoring without answers at the end` does not show the survey participant their answer + choices after completing the survey, only their final score. + +To indicate correct answers, click on the {guilabel}`Questions tab` and choose a question. In the +question form, check the {guilabel}`Is a correct answer` box for the choice that is the correct +answer and attach a score value. + +Back on the {guilabel}`Options` tab of the survey, set the {guilabel}`Success %`. The percentage +entered determines what percentage of correct answers is needed to pass the survey. + +Further on the {guilabel}`Options` tab of the survey, survey administrators can also choose to make +the survey a certification. A certification indicates that the survey asks questions to test the +participants' knowledge level on a subject. + +When enabling the {guilabel}`Is a certification` option, choose a {guilabel}`Certification email +template`. The certification will automatically be emailed using this email template to users who +pass the survey with a final score that is greater than or equal to the set {guilabel}`Success %`. + +In the {guilabel}`Candidates` section, participants can be required to log in to take the survey. +If the {guilabel}`Login Required` setting is enabled, two new options appear: the +{guilabel}`Attempts Limit` checkbox, which limits the number of times a participant can attempt +the survey, and the option to {guilabel}`Give Badge`, located beneath the {guilabel}`Certification` +options in the {guilabel}`Scoring` section. + +```{image} scoring/required-score-login.png +:align: center +:alt: Setting the Required Score (percentage), login required, and certification template. +``` + +Badges are displayed on the eLearning portion of a given user's portal, and are a way to set +milestones and reward participants for passing surveys or gaining points. Besides the awardee, +website visitors who access the {guilabel}`Courses` page will also be able to see the granted +badges. + +```{image} scoring/frontend-badges.png +:align: center +:alt: Example of how a badge looks on the eLearning portion of the website. +``` + +:::{seealso} +{doc}`questions` +::: + diff --git a/content/applications/productivity.md b/content/applications/productivity.md new file mode 100644 index 000000000..0ed327343 --- /dev/null +++ b/content/applications/productivity.md @@ -0,0 +1,19 @@ +--- +nosearch: true +--- + +# Productivity + +```{toctree} +productivity/documents +productivity/sign +productivity/spreadsheet +productivity/knowledge +productivity/calendar +productivity/discuss +productivity/data_cleaning +productivity/whatsapp +productivity/voip +productivity/to_do +``` + diff --git a/content/applications/productivity/calendar.md b/content/applications/productivity/calendar.md new file mode 100644 index 000000000..bdb3eaa22 --- /dev/null +++ b/content/applications/productivity/calendar.md @@ -0,0 +1,297 @@ +--- +show-content: true +--- + +# Calendar + +Odoo **Calendar** is a scheduling app that allows users to integrate a company's business flow into +a single management platform. By integrating with the other apps in Odoo's ecosystem, **Calendar** +allows users to schedule and organize meetings, schedule events, plan employee appraisals, +coordinate projects, and more – all from the same platform. + +Upon opening the {menuselection}`Calendar app`, users have an overview of their current meetings. +The selected view option appears as a {guilabel}`Day`, {guilabel}`Week`, {guilabel}`Month`, or +{guilabel}`Year` drop-down menu. Under the view options drop-down menu, users can also enable or +disable {guilabel}`Show weekends`. + +```{image} calendar/calendar-overview.png +:alt: Overview of Calendar app. +``` + +:::{tip} +Depending on the selected view option, users can click the {icon}`oi-arrow-left` +{icon}`oi-arrow-right` {guilabel}`(left or right arrow)` buttons to switch between days, weeks, +etc., and switch back to the current day with the {guilabel}`Today` button. +::: + +## Sync third-party calendars + +Users can sync Odoo with existing {doc}`Outlook ` and/or +{doc}`Google ` calendars, by heading to +{menuselection}`Calendar app --> Configuration --> Settings`. From here, enter +{guilabel}`Client ID` and {guilabel}`Client Secret`. There is also an option to pause +synchronization by ticking the checkbox, or automating synchronization by keeping it blank. + +Once the desired configurations are complete, be sure to click {guilabel}`Save` before moving on. + +Events created in synced calendars automatically appear across the integrated platforms. + +:::{seealso} +- {doc}`Synchronize Outlook calendar with Odoo ` +- {doc}`Synchronize Google calendar with Odoo ` +::: + +## Create activities from chatter + +Instantly create new meetings anywhere in Odoo through an individual record's chatter, like +in a **CRM** opportunity card or task in the **Projects** app. + +From the chatter, click on the {guilabel}`Activities` button. In the {guilabel}`Schedule Activity` +pop-up window, select the desired {guilabel}`Activity Type`, which populates a set of buttons, +depending on the activity. + +Activities that involve other schedules, like {guilabel}`Meeting` or {guilabel}`Call for Demo`, link +to the **Calendar** app. Select one of these activities to link to the **Calendar** app, then hit +{guilabel}`Open Calendar` to navigate back to the app. Alternatively, it is also possible to +{guilabel}`Schedule & Mark as Done` to close out the activity, or select {guilabel}`Done & Schedule +Next` to keep the {guilabel}`Schedule Activity` window open to create another. + +:::{seealso} +{doc}`Schedule activities in Odoo <../essentials/activities>` +::: + +## Plan an event + +To put an event on the calendar, open the {menuselection}`Calendar app`, and click into the target +date. On the {guilabel}`New Event` pop-up window that appears, start by adding the event title. + +```{image} calendar/calendar-schedule-event.png +:alt: Schedule an event window on Calendar app. +``` + +The target date auto-populates in the {guilabel}`Start` field. This can be changed by clicking +into the date section, and selecting a date from the calendar. For multi-day events, select the end +date in the second field, then click {guilabel}`Apply`. + +Tick the {guilabel}`All Day` checkbox if there is no specific start or end time. + +For events with specific start and stop times, ensure the {guilabel}`All Day` checkbox is unticked +to enable time selection. With the {guilabel}`All Day` checkbox unticked, time selections appear in +the {guilabel}`Start` field. + +The signed-in user auto-populates as the first attendee. Additional {guilabel}`Attendees` can be +added or created from here, as well. + +For virtual meetings, copy and paste the URL into the space provided in the +{guilabel}`Videocall URL` field. Or, click {icon}`fa-plus` {guilabel}`Odoo meeting` to create a +link. + +Next, either create the event by clicking {guilabel}`Save & Close`, or select {guilabel}`More +Options` to further configure the event. + +:::{tip} +Once the event is created, users can click into the virtual meeting directly from the calendar +event to access more configuration options. +::: + +```{image} calendar/calendar-new-meeting.png +:alt: The full event form for a new calendar event. +``` + +The {guilabel}`Description` field allows users to add additional information and details about the +meeting. + +Click {guilabel}`More Options` to navigate to the meeting form, which provides additional +configurations for the event: + +- {guilabel}`Duration`: Define the length of the meeting in {guilabel}`hours`, or toggle the + {guilabel}`All Day` switch. + +- {guilabel}`Recurrent`: Tick the checkbox to create a recurring meeting. Once selected, this + opens new fields: + + - {guilabel}`Timezone`: Select the timezone for which this meeting time is specified. + - {guilabel}`Repeat`: Select the recurring period of this meeting. Depending on what type of + recurrence has been selected, a subsequent field appears, in which users can indicate when the + meeting should recur. For example, if {guilabel}`Monthly` is selected as the {guilabel}`Repeat` + option, a new field appears, in which the user decides on what {guilabel}`Day of Month` the + meeting should recur. + - {guilabel}`Until`: Select the limited {guilabel}`Number of repetitions` this meeting should + recur, the {guilabel}`End date` of when the recurrences should stop, or if the meetings should + recur {guilabel}`Forever`. + +- {guilabel}`Tags`: Add tags to the event, like `Customer Meeting` or `Internal Meeting`. These can + be searched and filtered in the **Calendar** app when organizing multiple events. + +- {guilabel}`Appointment`: Link existing or new appointments. These can be configured through the + {ref}`Share Availabilities ` button from the main **Calendar** + dashboard. + +- {guilabel}`Privacy`: Toggle between visibility options to control who can view the event. + +- {guilabel}`Organizer`: This is defaulted to the current Odoo user. Select a new one from + existing users, or create and edit a new user. + +- {guilabel}`Description`: Add additional information or details about the meeting. + +- {guilabel}`Reminders`: Select notification options to send to attendees. Choose a default + notification, or configure new reminders. + +## Coordinate with teams' availability + +When scheduling an event for multiple users, on the **Calendar** app dashboard, tick the checkbox +next to {guilabel}`Attendees` to view team members' availability. Tick (or untick) the checkbox next +to listed users to show (or hide) individual calendars. + +```{image} calendar/calendar-attendees.png +:alt: View of Attendees section on Calendar app. +``` + +(calendar-share-availabilities)= + +## Share Availabilities + +On the **Calendar** app main dashboard, click the {guilabel}`Share Availabilities` button at the top +of the page. Next, click and drag to select the available times and dates on the calendar to add +them as options in the invitation. + +:::{tip} +To remove a selected time range, hover over the availability to click the {icon}`fa-trash` +{guilabel}`(trash)` icon. +::: + +:::{note} +Within the {guilabel}`Share Availabilities` feature, selecting times is only possible on the +*Day* calendar views. +::: + +Once availability has been selected, click the {icon}`fa-external-link` {guilabel}`Open` button to +navigate to the associated appointment. + +```{image} calendar/calendar-meeting-share-availability.png +:alt: Share availability window on Calendar app. +``` + +Several configuration options are available on the appointment form: + +In the {guilabel}`Scheduling` field, set a minimum hour window to ensure appointments are confirmed +a specified amount of time in advance. For example, set `01:00` to require attendees to confirm at +least one hour before their appointment time. + +In the {guilabel}`Allow Cancelling` field, set a maximum hour window before the appointment that +attendees are able to cancel. + +The {guilabel}`Availability on` field enables attendees to book {guilabel}`Users` or +{guilabel}`Resources`, such as meeting rooms or tables. After selecting {guilabel}`Users` or +{guilabel}`Resources`, type in the desired user or resource in the space below. + +The {guilabel}`Front-End Display` field is used to choose {guilabel}`No Picture` or +{guilabel}`Show Pictures` related to the selected user or resource on the appointment page. + +If {guilabel}`Resources` has been selected in the {guilabel}`Availability on` field, users have an +option to {guilabel}`Manage Capacities`. + +Tick the checkbox to limit the maximum amount of people that can use the resource at the same time. + +The {guilabel}`Assignment Method` field enables the order in which attendees book their time and +user/resource: + +- {guilabel}`Pick User/Resource then Time` +- {guilabel}`Select Time then User/Resource` + +If {guilabel}`Resources` has been selected in the {guilabel}`Availability On` field, a third option +is available, {guilabel}`Select Time then auto-assign`. + +Optionally, configure the following tabs: + +- {ref}`calendar/appointment-schedule` +- {ref}`calendar/appointment-options` +- {ref}`calendar/appointment-questions` +- {ref}`calendar/appointment-messages` + +Click the {guilabel}`Preview` button to see how the appointment link looks for attendees. + +Once the configurations are finished, click the {guilabel}`Share` button to generate a link to send +directly, or click {guilabel}`Publish` to publish the appointment selection on the connected Odoo +website. + +(calendar-appointment-schedule)= + +### Schedule tab + +In the {guilabel}`Schedule` tab of the appointment form, time slots can be managed. The target date +and time populate as the first time slots. + +To add a new time slot, hit {guilabel}`Add a line`. Click into the new blank space under the +{guilabel}`From` field, then select and enter the new target start date and time, respectively. +Repeat under the new blank space under {guilabel}`To` to select and enter the new target end date +and time. + +(calendar-appointment-options)= + +### Options tab + +The {guilabel}`Options` tab provides additional configurations: + +- {guilabel}`Website`: Specify which website this meeting invitation will be published on. +- {guilabel}`Timezone`: This defaults to the company's timezone selected in the **Settings** app. + To change the timezone, select the desired option from the drop-down menu. +- {guilabel}`Location`: Select or create new locations from the drop-down menu. If this field is + left empty, the meeting is considered to be taking place online. +- {guilabel}`Videoconference Link`: Select from {guilabel}`Odoo Discuss` or {guilabel}`Google Meet` + to include a video conference link in the meeting invitation, or leave it blank to prevent + generating a meeting URL. +- {guilabel}`Manual Confirmation`: Only shown if {guilabel}`Resources` has been selected in the + {guilabel}`Availability On` field. Tick the checkbox and enter a maximum percentage of the + selected resource(s)' total capacity to create a manual confirmation requirement to finalize the + meeting. +- {guilabel}`Up-front Payment`: Tick the checkbox to require users to pay before confirming their + booking. Once this is ticked, a link appears to {icon}`oi-arrow-right` {guilabel}`Configure + Payment Providers`, which enables online payments. +- {guilabel}`Limit to Work Hours`: If {guilabel}`Users` has been selected in the + {guilabel}`Availability On` field, tick the checkbox to limit meeting time slots to the selected + {doc}`users' working hours <../hr/employees/new_employee>`. +- {guilabel}`Create Opportunities`: When this is selected, each scheduled appointment creates + a new **CRM** opportunity. +- {guilabel}`Reminders`: Add or delete notification reminders in this field. Select the blank space + for additional options. +- {guilabel}`Confirmation Email`: Tick the checkbox to automatically send a confirmation email to + attendees once the meeting is confirmed. Select from the email templates or click + {guilabel}`Search More...`, then {guilabel}`New` to create a custom template. +- {guilabel}`Cancelation Email`: Tick the checkbox to automatically send a cancelation email to + attendees if the meeting is canceled. Select from the email templates or click + {guilabel}`Search More...`, then {guilabel}`New` to create a custom template. +- {guilabel}`CC to`: Add contacts to be notified of meeting updates in this field, regardless if + they attend the meeting. +- {guilabel}`Allow Guests`: Tick the checkbox to allow attendees to invite guests. + +(calendar-appointment-questions)= + +### Questions tab + +In the {guilabel}`Questions` tab, add questions for the attendee to answer when confirming their +meeting. Click {guilabel}`Add a line` to configure a {guilabel}`Question`. Then select a +{guilabel}`Question Type`, optionally add a {guilabel}`Placeholder` answer, and choose whether it is +a {guilabel}`Required Answer`. + +To learn how to create more comprehensive questionnaires, head to the **Survey** app +documentation on {doc}`creating and configuring data-capturing questions +<../marketing/surveys/questions>`. + +(calendar-appointment-messages)= + +### Messages tab + +In the {guilabel}`Introduction Message` field of the {guilabel}`Messages` tab, add additional +meeting information that appears on the invitation. + +Information added to the {guilabel}`Extra Message on Confirmation` field appears once the meeting is +confirmed. + +```{toctree} +:titlesonly: true + +calendar/outlook +calendar/google +``` + diff --git a/content/applications/productivity/calendar/google.md b/content/applications/productivity/calendar/google.md new file mode 100644 index 000000000..27af54e6a --- /dev/null +++ b/content/applications/productivity/calendar/google.md @@ -0,0 +1,257 @@ +# Google Calendar synchronization + +Synchronize Google Calendar with Odoo to see and manage meetings from both platforms (updates go in +both directions). This integration helps organize schedules, so a meeting is never missed. + +:::{seealso} +- {doc}`/applications/general/users/google` +- {doc}`/applications/general/email_communication/google_oauth` +::: + +## Setup in Google + +### Select (or create) a project + +Create a new Google API project and enable the Google Calendar API. First, go to the [Google API +Console](https://console.developers.google.com) and log into the Google account. + +:::{note} +If this is the first time visiting this page, Google will prompt the user to enter a country and +agree to the Terms of Service. Select a country from the drop-down list and agree to the +{abbr}`ToS (Terms of Service)`. +::: + +Next, click {guilabel}`Select a project` and select (or create) an API project to configure OAuth +in, and store credentials. Click {guilabel}`New Project`. + +```{image} google/new-api-project.png +:alt: Create a new API project to store credentials. +``` + +:::{tip} +Give the API Project a clear name, like "Odoo Sync", so it can be easily identified. +::: + +### Enable Google calendar API + +Now, click on {guilabel}`Enabled APIs and Services` in the left menu. Select {guilabel}`Enabled APIs +and Services` again if the {guilabel}`Search bar` doesn't appear. + +```{image} google/enable-apis-services.png +:alt: Enable APIs and Services on the API Project. +``` + +After that, search for `Google Calendar API` using the search bar and select {guilabel}`Google +Calendar API` from the search results. Click {guilabel}`Enable`. + +```{image} google/enable-google-cal-api.png +:alt: Enable the Google Calendar API. +``` + +### OAuth consent screen + +Now that the API project has been created, OAuth should be configured. To do that, click on +{guilabel}`OAuth consent` in the left menu and then select the {guilabel}`User Type`. + +:::{warning} +*Personal* Gmail Accounts are only allowed to be **External** User Type, which means Google may +require an approval, or for *Scopes* to be added on. However, using a *Google WorkSpace* account +allows for **Internal** User Type to be used. + +Note, as well, that while the API connection is in the *External* testing mode, then no approval +is necessary from Google. User limits in this testing mode is set to 100 users. +::: + +In the second step, {guilabel}`OAuth Consent Screen`, type `Odoo` in the {guilabel}`App name` field, +select the email address for the {guilabel}`User support email` field, and type the email address +for the {guilabel}`Developer contact information` section. Then, click {guilabel}`Save and +Continue`. + +Skip the third step, {menuselection}`Scopes`, by clicking {guilabel}`Save and Continue`. + +Next, if continuing in testing mode (External), add the email addresses being configured under the +{guilabel}`Test users` step, by clicking on {guilabel}`Add Users`, and then the {guilabel}`Save and +Continue` button. A summary of the app registration appears. + +Finally, scroll to the bottom, and click on {guilabel}`Back to Dashboard`. + +Now, the OAuth consent has been configured, and it's time to create credentials. + +### Create credentials + +The *Client ID* and the *Client Secret* are both needed to connect Google Calendar to Odoo. This is +the last step in the Google console. Begin by clicking {guilabel}`Credentials` in the left menu. +Then, click {guilabel}`Create Credentials`, and select {guilabel}`OAuth client ID`, Google will open +a guide to create credentials. + +Under {menuselection}`Create OAuth Client ID`, select {guilabel}`Website application` for the +{guilabel}`Application Type` field, and type `My Odoo Database` for the {guilabel}`Name`. + +- Under the {guilabel}`Authorized JavaScript Origins` section, click {guilabel}`+ Add URI` and type + the company's Odoo full {abbr}`URL (Uniform Resource Locator)` address. +- Under the {guilabel}`Authorized redirect URIs` section, click {guilabel}`+ Add URI` and type the + company's Odoo {abbr}`URL (Uniform Resource Locator)` address followed by + `/google_account/authentication`. Finally, click {guilabel}`Create`. + +```{image} google/uri.png +:alt: Add the authorized JavaScript origins and the authorized redirect URIs. +``` + +A {guilabel}`Client ID` and {guilabel}`Client Secret` will appear, copy these to a notepad. + +## Setup in Odoo + +Once the *Client ID* and the *Client Secret* are located, open the Odoo database and go to +{menuselection}`Settings --> Calendar` to find the {guilabel}`Google Calendar` feature. Tick the +checkbox labeled {guilabel}`Google Calendar`. + +```{image} google/settings-google-cal.png +:alt: The Google Calendar checkbox in General Settings. +``` + +Next, copy and paste the *Client ID* and the *Client Secret* from the Google Calendar API +credentials page into their respective fields below the {guilabel}`Google Calendar` checkbox. Then, +click {guilabel}`Save`. + +:::{note} +Tick the {guilabel}`Pause Synchronization` checkbox to temporarily pause events from being +updated. This allows for testing and troubleshooting without removing credentials or uninstalling +the synchronization. To resume the sync, clear the checkbox and save. +::: + +## Sync calendar in Odoo + +Finally, open the {menuselection}`Calendar` app in Odoo and click on the {guilabel}`Google` sync +button to sync Google Calendar with Odoo. + +```{image} google/sync-google.png +:alt: Click the Google sync button in Odoo Calendar to sync Google Calendar with Odoo. +``` + +:::{note} +When syncing Google Calendar with Odoo for the first time, the page will redirect to the Google +Account. From there, select the {guilabel}`Email Account` that should have access, then select +{guilabel}`Continue` (should the app be unverifed), and finally select {guilabel}`Continue` (to +give permission for the transfer of data)\`. +::: + +```{image} google/trust-odoo.png +:alt: Give Odoo permission to access Google Calendar. +``` + +Now, Odoo Calendar is successfully synced with Google Calendar! + +:::{warning} +Odoo highly recommends testing the Google calendar synchronization on a test database and a test +email address (that is not used for any other purpose) before attempting to sync the desired +Google Calendar with the user's production database. + +Once a user synchronizes their Google calendar with the Odoo calendar: + +- Creating an event in Odoo causes Google to send an invitation to all event attendees. +- Deleting an event in Odoo causes Google to send a cancellation to all event attendees. +- Adding a contact to an event causes Google to send an invitation to all event attendees. +- Removing a contact from an event causes Google to send a cancellation to all event attendees. + +Events can be created in *Google Calendar* without sending a notification by selecting +{guilabel}`Don't Send` when prompted to send invitation emails. +::: + +## Troubleshoot sync + +There may be times when the *Google Calendar* account does not sync correctly with Odoo. Sync issues +can be seen in the database logs. + +In these cases, the account needs troubleshooting. A reset can be performed using the +{guilabel}`Reset Account` button, which can be accessed by navigating to {menuselection}`Settings +app --> Manage Users`. Then, select the user to modify the calendar, and click the +{guilabel}`Calendar` tab. + +```{image} google/google-reset.png +:alt: Reset buttons highlighted on the calendar tab of the user. +``` + +Next, click {guilabel}`Reset Account` under the correct calendar. + +### Reset options + +The following reset options are available for troubleshooting Google calendar sync with Odoo: + +```{image} google/reset-calendar.png +:alt: Google calendar reset options in Odoo. +``` + +{guilabel}`User's Existing Events`: + +> - {guilabel}`Leave them untouched`: no changes to the events. +> - {guilabel}`Delete from the current Google Calendar account`: delete the events from *Google +> Calendar*. +> - {guilabel}`Delete from Odoo`: delete the events from the Odoo calendar. +> - {guilabel}`Delete from both`: delete the events from both *Google Calendar* and Odoo calendar. + +{guilabel}`Next Synchronization`: + +> - {guilabel}`Synchronize only new events`: sync new events on *Google Calendar* and/or Odoo +> calendar. +> - {guilabel}`Synchronize all existing events`: sync all events on *Google Calendar* and/or Odoo +> calendar. + +Click {guilabel}`Confirm` after making the selection to modify the user's events and the calendar +synchronization. + +## Google OAuth FAQ + +At times there can be configuration errors that occur, and troubleshooting is needed to resolve the +issue. Below are the most common errors that may occur when configuring the *Google Calendar* for +use with Odoo. + +### Production vs. testing publishing status + +Choosing {guilabel}`Production` as the {guilabel}`Publishing Status` (instead of +{guilabel}`Testing`) displays the following warning message: + +`OAuth is limited to 100 sensitive scope logins until the OAuth consent screen is verified. This may +require a verification process that can take several days.` + +To correct this warning, navigate to the [Google API Platform](https://console.cloud.google.com/apis/credentials/consent). If the {guilabel}`Publishing Status` +is {guilabel}`In Production`, click {guilabel}`Back to Testing` to correct the issue. + +### No test users added + +If no test users are added to the {guilabel}`OAuth consent screen`, then an {guilabel}`Error 403: +access_denied` populates. + +```{image} google/403-error.png +:alt: 403 Access Denied Error. +``` + +To correct this error, return to the {guilabel}`OAuth consent screen`, under {guilabel}`APIs & +Services`, and add test users to the app. Add the email to be configured in Odoo. + +### Application Type + +When creating the credentials (OAuth *Client ID* and *Client Secret*), if {guilabel}`Desktop App` is +selected for the {guilabel}`Application Type`, an {guilabel}`Authorization Error` appears +({guilabel}`Error 400:redirect_uri_mismatch`). + +```{image} google/error-400.png +:alt: Error 400 Redirect URI Mismatch. +``` + +To correct this error, delete the existing credentials, and create new credentials, by selecting +{guilabel}`Web Application` for the {guilabel}`Application Type`. + +Then, under {guilabel}`Authorized redirect URIs`, click {guilabel}`ADD URI`, and type: +`https://yourdbname.odoo.com/google_account/authentication` in the field, being sure to replace +*yourdbname* in the URL with the **real** Odoo database name. + +:::{tip} +Ensure that the domain (used in the URI: +`https://yourdbname.odoo.com/google_account/authentication`) is the exact same domain as +configured in the `web.base.url` system parameter. + +Access the `web.base.url` by activating {ref}`developer mode `, and navigating to +{menuselection}`Settings app --> Technical header menu --> Parameters section --> System +Parameters`. +::: + diff --git a/content/applications/productivity/calendar/outlook.md b/content/applications/productivity/calendar/outlook.md new file mode 100644 index 000000000..39a5a2965 --- /dev/null +++ b/content/applications/productivity/calendar/outlook.md @@ -0,0 +1,261 @@ +# Outlook Calendar synchronization + +Synchronizing a user's *Outlook Calendar* with Odoo is useful for keeping track of tasks and +appointments across all related applications. + +:::{seealso} +- {doc}`../../general/users/azure` +- {doc}`../../general/email_communication/azure_oauth` +::: + +## Microsoft Azure setup + +To sync the *Outlook Calendar* with Odoo's *Calendar*, a Microsoft *Azure* account is required. +Creating an account is free for users who have never tried, or paid for, *Azure*. For more +information, view the account options on the [Azure website](https://azure.microsoft.com/en-us/free/?WT.mc_id=A261C142F). + +Refer to [Microsoft's documentation](https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-create-new-tenant) on how to set up a Microsoft *Entra ID* (formally called +Microsoft *Azure Active Directory (Azure AD)*). This is an API console to manage and register +Microsoft applications. + +Existing Microsoft *Entra ID* users should log in at the [Microsoft Azure developer portal](https://portal.azure.com/#home). Next, select {guilabel}`View` under the section labeled +{guilabel}`Manage Microsoft Entra ID`. + +### Register application + +After logging in with the Microsoft *Entra ID*, [register an application](https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-register-app). + +To create an application, click {guilabel}`+ Add` in the top menu. From the resulting drop-down +menu, select {guilabel}`App Registration`. + +```{image} outlook/app-register.png +:align: center +:alt: Microsoft Azure management page with + Add and App Registration menu highlighted. +``` + +Enter a unique {guilabel}`Name` for the connected application. + +Choosing the appropriate {guilabel}`Supported account type` is essential, or else the connected +application will not work. Users who wish to connect their *Outlook Calendar* to Odoo should select +the {guilabel}`Accounts in any organizational directory (Any Microsoft Entra ID directory - +Multitenant) and personal Microsoft accounts (e.g. Skype, Xbox)` option for {guilabel}`Supported +account types`. + +When configuring the {guilabel}`Redirect URI`, choose the {guilabel}`Web` option from the first +drop-down menu. Then, enter the Odoo database URI (URL) followed by +`/microsoft_account/authentication`. + +```{eval-rst} +.. example:: + Enter `https://yourdbname.odoo.com/microsoft_account/authentication` for the :guilabel:`Redirect + URI`. Replace `yourdbname.odoo.com` with the :abbr:`URL (Uniform Resource Locator)`. +``` + +:::{tip} +Ensure the database's {abbr}`URL (Uniform Resource Locator)` (domain) used in the URI is the +exact same domain as the one configured on the `web.base.url` system parameter. + +Access the `web.base.url` by activating {ref}`developer mode `, and navigating to +{menuselection}`Settings app --> Technical header menu --> Parameters section --> System +Parameters`. Then, select it from the {guilabel}`Key` list on the {guilabel}`System Parameters` +page. +::: + +```{image} outlook/azure-register-application.png +:align: center +:alt: The "Supported account type" and "Redirect URI" settings in the Microsoft Entra +: ID portal. +``` + +For more information on the restrictions and limitations of URIs, check Microsoft's [Redirect URI +(reply URL) restrictions and limitations](https://docs.microsoft.com/en-us/azure/active-directory/develop/reply-url) page. + +Finally, on the application registration page, click {guilabel}`Register` button to complete the +application registration. The {guilabel}`Application (client) ID` is produced. Copy this value, as +it is needed later, in the {ref}`outlook_calendar/odoo_setup`. + +```{image} outlook/app-client-id.png +:align: center +:alt: |- +: Application client ID highlighted in the essentials section of the newly created +: application. +``` + +### Create client secret + +The second credential needed to complete the synchronization of the Microsoft *Outlook Calendar* is +the *Client Secret*. The user **must** add a client secret, as this allows Odoo to authenticate +itself, requiring no interaction from the user's side. *Certificates* are optional. + +To add a client secret, click {menuselection}`Certificates & secrets` in the left menu. Then click +{guilabel}`+ New client secret` to create the client secret. + +```{image} outlook/client-secret.png +:align: center +:alt: |- +: New client secret page with certificates and secrets menu and new client secret option +: highlighted. +``` + +Next, type a {guilabel}`Description`, and select when the client secret {guilabel}`Expires`. +Available options include: {guilabel}`90 days (3 months)`, {guilabel}`365 days (12 months)`, +{guilabel}`545 days (18 months)`, {guilabel}`730 days (24 months)` or {guilabel}`Custom`. The +{guilabel}`Custom` option allows the administrator to set a {guilabel}`Start` and {guilabel}`End` +date. + +Finally, click {guilabel}`Add` to {guilabel}`Add a client secret`. + +:::{tip} +Since resetting the synchronization can be tricky, Odoo recommends setting the maximum allowed +expiration date for the client secret (24 months or custom), so there is no need to +re-synchronize soon. +::: + +Copy the {guilabel}`Value` for use in the next section. + +:::{warning} +Client secret values cannot be viewed, except immediately after creation. Be sure to save the +secret when created *before* leaving the page. +::: + +(outlook-calendar-odoo-setup)= + +## Configuration in Odoo + +In the Odoo database, go to {menuselection}`Calendar app --> Configuration --> Settings`, and tick +the checkbox beside the {guilabel}`Outlook Calendar` setting. Remember to click {guilabel}`Save` to +implement the changes. + +```{image} outlook/outlook-calendar-setting.png +:alt: The "Outlook Calendar" setting activated in Odoo. +``` + +From the Microsoft *Azure* portal, under the {guilabel}`Overview` section of the application, copy +the {guilabel}`Application (Client) ID`, if it has not already been copied, and paste it into the +{guilabel}`Client ID` field in Odoo. + +```{image} outlook/client-id.png +:align: center +:alt: The "Client ID" in the Microsoft Azure portal. +``` + +Copy the previously-acquired {guilabel}`Value` (Client Secret Value), and paste it into the +{guilabel}`Client Secret` field in Odoo. + +```{image} outlook/client-secret-value.png +:align: center +:alt: The "Client Secret" token to be copied from Microsoft to Odoo. +``` + +Finally, on the Odoo {menuselection}`Settings --> General Settings` page, click {guilabel}`Save`. + +(outlook-sync)= + +## Sync with Outlook + +:::{warning} +Odoo highly recommends testing the Outlook calendar synchronization on a test database and a +test email address (that is not used for any other purpose) before attempting to sync the +desired Outlook Calendar with the user's production database. + +If the user has any past, present, or future events on their Odoo calendar before syncing their +Outlook calendar, Outlook will treat the events pulled from Odoo's calendar during the sync as +new events, causing an email notification to be sent from Outlook to all the event attendees. + +To avoid unwanted emails being sent to all past, present, and future event attendees, the user +must add the events from the Odoo calendar to the Outlook calendar before the first ever sync, +delete the events from Odoo, and then start the sync. + +Even after synchronizing the Odoo Calendar with the Outlook calendar, Outlook will still send a +notification to all event participants every time an event is edited (created, deleted, +unarchived, or event date/time changed), with no exceptions. This is a limitation that cannot be +fixed from Odoo's side. + +In summary, once a user synchronizes their Outlook calendar with the Odoo calendar: + +- Creating an event in Odoo causes Outlook to send an invitation to all event attendees. +- Deleting an event in Odoo causes Outlook to send a cancellation to all event attendees. +- Unarchiving an event in Odoo causes Outlook to send an invitation to all event attendees. +- Archiving an event in Odoo causes Outlook to send a cancellation to all event attendees. +- Adding a contact to an event causes Outlook to send an invitation to all event attendees. +- Removing a contact from an event causes Outlook to send a cancellation to all event attendees. +::: + +### Sync Odoo Calendar and Outlook + +In the Odoo database, open to the *Calendar* module, and click the {guilabel}`Outlook` sync button +on the right-side of the page, beneath the monthly calendar. + +```{image} outlook/outlook-sync-button.png +:align: center +:alt: The "Outlook" sync button in Odoo Calendar. +``` + +The synchronization is a two-way process, meaning that events are reconciled in both accounts +(*Outlook* and Odoo). The page redirects to a Microsoft login page, and the user is asked to log in +to their account, if they are not already. Finally, grant the required permissions by clicking +{guilabel}`Accept`. + +```{image} outlook/accept-terms.png +:align: center +:alt: Authentication process on Microsoft Outlook OAuth page. +``` + +:::{note} +All users that want to use the synchronization simply need to {ref}`sync their calendar with +Outlook `. The configuration of Microsoft's *Azure* account is only done once, as +Microsoft *Entra ID* tenants' client IDs and client secrets are unique, and help the user manage +a specific instance of Microsoft cloud services for internal and external users. +::: + +:::{seealso} +- {doc}`../../general/integrations/mail_plugins/outlook` +- {doc}`google` +::: + +## Troubleshoot sync + +There may be times when the *Microsoft Outlook Calendar* account does not sync correctly with Odoo. +Sync issues can be seen in the database logs. + +In these cases, the account needs troubleshooting. A reset can be performed using the +{guilabel}`Reset Account` button, which can be accessed by navigating to {menuselection}`Settings +app --> Manage Users`. Then, select the user to modify the calendar, and click on the +{guilabel}`Calendar` tab. + +```{image} outlook/outlook-reset.png +:align: center +:alt: Reset buttons highlighted on the calendar tab of the user. +``` + +Next, click {guilabel}`Reset Account` under the correct calendar. + +### Reset options + +The following reset options are available for troubleshooting *Microsoft Outlook Calendar* sync with +Odoo: + +```{image} outlook/reset-calendar.png +:align: center +:alt: Outlook calendar reset options in Odoo. +``` + +{guilabel}`User's Existing Events`: + +> - {guilabel}`Leave them untouched`: no changes to the events. +> - {guilabel}`Delete from the current Microsoft Calendar account`: delete the events from *Microsoft +> Outlook Calendar*. +> - {guilabel}`Delete from Odoo`: delete the events from the Odoo calendar. +> - {guilabel}`Delete from both`: delete the events from both *Microsoft Outlook Calendar* and Odoo +> calendar. + +{guilabel}`Next Synchronization`: + +> - {guilabel}`Synchronize only new events`: sync new events on *Microsoft Outlook Calendar* and/or +> Odoo calendar. +> - {guilabel}`Synchronize all existing events`: sync all events on *Microsoft Outlook Calendar* +> and/or Odoo calendar. + +Click {guilabel}`Confirm` after making the selection to modify the user's events and the calendar +synchronization. + diff --git a/content/applications/productivity/data_cleaning.md b/content/applications/productivity/data_cleaning.md new file mode 100644 index 000000000..59b24cf5c --- /dev/null +++ b/content/applications/productivity/data_cleaning.md @@ -0,0 +1,497 @@ +# Data Cleaning + +The Odoo **Data Cleaning** app maintains data integrity and consistency with the following features: + +- {ref}`Deduplicates `: merges or removes duplicate entries to ensure + data is unique. +- {ref}`Recycles `: identifies outdated records to either archive or delete + them. +- {ref}`Formats `: standardizes text data by finding and replacing it + according to specified needs. + +Customizable rules ensure text data stays up-to-date, streamlined, consistently formatted, and +aligned with company-specific formatting requirements. + +(data-cleaning-install-modules)= + +## Install modules + +The **Data Cleaning** application consists of several modules. {ref}`Install ` the +following to access all available features: + +```{eval-rst} +.. list-table:: + :header-rows: 1 + :widths: 40 60 + + * - | Name + | `Technical name` + - Description + * - | :guilabel:`Data Recycle` + | `data_recycle` + - Base module to enable the recycle feature, available on :ref:`Odoo Community edition + `. + * - | :guilabel:`Data Cleaning` + | `data_cleaning` + - Enables field cleaning feature to format text data across multiple records, available + **only** on :ref:`Odoo Enterprise edition `. + * - | :guilabel:`Data Cleaning (merge)` + | `data_merge` + - Enables the deduplication feature to find similar (or duplicate) records, and merge them, + available **only** on :ref:`Odoo Enterprise edition `. +``` + +```{eval-rst} +.. spoiler:: Additionally, several app-specific modules are available + + .. list-table:: + :widths: 40 60 + + * - | :guilabel:`CRM Deduplication` + | `data_merge_crm` + - Enables the deduplication feature on the **CRM** app, and uses the :doc:`CRM default + merging feature <../sales/crm/pipeline/merge_similar>`. + * - | :guilabel:`Helpdesk Merge action` + | `data_merge_helpdesk` + - Enables the merge feature for the **Helpdesk** app. + * - | :guilabel:`Project Merge action` + | `data_merge_project` + - Enables the merge feature for the **Projects** app. + * - | :guilabel:`UTM Deduplication` + | `data_merge_utm` + - Enables the merge feature for the **UTM Tracker** app. + * - | :guilabel:`WMS Accounting Merge` + | `data_merge_stock_account` + - Creates a warning in cases of products merging that may affect inventory valuation, if the + **Inventory** app is installed. +``` + +(data-cleaning-deduplication)= + +## Deduplication + +The *Duplicates* dashboard groups similar records to be {ref}`merged ` +by matching conditions within the records set by the {ref}`deduplication rules +`. + +Navigate to this dashboard by going to {menuselection}`Data Cleaning app --> Deduplication`. + +```{image} data_cleaning/data-cleaning-duplicates.png +:alt: Deduplication dashboard in the Data Cleaning application. +``` + +The {guilabel}`RULE` sidebar lists each of the active deduplication rules, and displays the total +number of duplicates detected beside each rule. + +By default, the {guilabel}`All` rule is selected. Records are grouped by their rule, with a +{guilabel}`Similarity` rating (out of 100%), with the following columns: + +- {guilabel}`Created On`: the date and time the original record was created. +- {guilabel}`Name`: the name or title of the original record. +- {guilabel}`Field Values`: the original record's values for the fields used to detect duplicates. +- {guilabel}`Used In`: lists other models referencing the original record. +- {guilabel}`ID`: the original record's unique ID. +- {guilabel}`Is Master`: the duplicates are merged into the *master* record. There can only be + **one** master record in a grouping of similar records. + +Select a specific rule in the {guilabel}`RULE` sidebar to filter the duplicate records. + +(data-cleaning-merge-records)= + +### Merge duplicate records + +To merge records, first choose a *master* record within the grouping of similar records. The master +record acts as the base, at which any additional information from similar records are merged into. + +Optionally, no master record can be set, leaving Odoo to choose a record at random to merge into. + +Next, click the {guilabel}`Merge` button at the top of the similar records grouping. Then, click +{guilabel}`Ok` to confirm the merge. + +Once a record is merged, a message is logged in the chatter of the master record, describing the +merge. Certain records, like **Project** tasks, are logged in the chatter with a link to the old +record as a convenient reference of the merge. + +:::{tip} +Discard groupings by clicking the {guilabel}`DISCARD` button. Upon doing so, the grouping is +hidden from the list and archived. + +View discarded groupings by selecting the {guilabel}`Discarded` filter from the {ref}`search bar +`. +::: + +(data-cleaning-deduplication-rules)= + +### Deduplication rules + +The *Deduplication Rules* set the conditions for how records are detected as duplicates. + +These rules can be configured for each model in the database, and with varying levels of +specificity. To get started, navigate to {menuselection}`Data Cleaning app --> Configuration --> +Deduplication`. + +:::{tip} +The deduplication rules run once every day, by default, as part of a scheduled action cron +(*Data Merge: Find Duplicate Records*). However, each rule can be {ref}`ran manually +` anytime. +::: + +#### Modify a deduplication rule + +Select a default rule to edit, or create a new rule by clicking on the {guilabel}`New` button. + +First, choose a {guilabel}`Model` for this rule to target. Selecting a model updates the rule title +to the chosen model. + +Optionally, configure a {guilabel}`Domain` to specify the records eligible for this rule. The number +of eligible records is shown in the {icon}`oi-arrow-right` {guilabel}`# record(s)` link. + +Depending on the selected {guilabel}`Model`, the {guilabel}`Duplicate Removal` field appears. +Choose whether to {guilabel}`Archive` or {guilabel}`Delete` merged records. + +Next, select a {guilabel}`Merge Mode`: + +- {guilabel}`Manual`: requires each duplicate grouping to be manually merged, also enables the + {guilabel}`Notify Users` field. +- {guilabel}`Automatic`: automatically merges duplicate groupings, without notifying users, based on + the records with a similarity percentage above the threshold set in the {guilabel}`Similarity + Threshold` field. + +Enable the {guilabel}`Active` toggle to start capturing duplicates with this rule as soon as it is +saved. + +Lastly, create at least one deduplication rule in the {guilabel}`Deduplication Rules` field, by +clicking {guilabel}`Add a line`, under the {guilabel}`Unique ID Field` column. + +- Select a field in the model from the {guilabel}`Unique ID Field` drop-down menu. This field is + referenced for similar records. + +- Select a matching condition in the {guilabel}`Match If` field to apply the deduplication rule, + depending on the text in the {guilabel}`Unique ID Field`: + + - {guilabel}`Exact Match`: the characters in the text match exactly. + - {guilabel}`Case/Accent Insensitive Match`: the characters in the text match, regardless of + casing and language-specific accent differences. + +:::{important} +At least one {guilabel}`Deduplication Rules` must be set for the rule to capture duplicates. +::: + +:::{tip} +A few more fields are available for an advanced configuration. + +If on a multi-company database, the {guilabel}`Cross-Company` field is available. When enabled, +duplicates across different companies are suggested. + +Activate {ref}`developer-mode` to display the {guilabel}`Suggestion Threshold` field. Duplicates +with a similarity below the threshold set in this field are **not** suggested. +::: + +With the rule's configuration complete, either close the rule form, or {ref}`run the rule manually +` to instantly capture duplicate records. + +(data-cleaning-run-deduplication-rule)= + +#### Manually run a deduplication rule + +To manually run a specific deduplication rule at any time, navigate to {menuselection}`Data Cleaning +app --> Configuration --> Deduplication`, and select the rule to run. + +Then, on the rule form, select the {guilabel}`Deduplicate` button on the top-left. Upon doing so, +the {icon}`fa-clone` {guilabel}`Duplicates` smart button displays the number of duplicates captured. + +Click on the {icon}`fa-clone` {guilabel}`Duplicates` smart button to {ref}`manage these records +`. + +(data-cleaning-recycle)= + +## Recycle records + +Use the *recycle records* feature to rid the database of old and outdated records. + +The *Field Recycle Records* dashboard displays records that can be archived or deleted, by matching +conditions within the records set by the {ref}`recycle record's rules `. + +Navigate to this dashboard by going to {menuselection}`Data Cleaning app --> Recycle Records`. + +```{image} data_cleaning/data-cleaning-recycle.png +:alt: Field Recycle Records dashboard in the Data Cleaning application. +``` + +The {guilabel}`RECYCLE RULES` sidebar lists each of the active recycle record rules. + +By default, the {guilabel}`All` option is selected. Records are displayed with the following +columns: + +- {guilabel}`Record ID`: the ID of the original record. +- {guilabel}`Record Name`: the name or title of the original record. + +Select a specific rule in the {guilabel}`RECYCLE RULES` sidebar to filter the records. + +To recycle records, click the {icon}`fa-check` {guilabel}`Validate` button on the row of the record. + +Upon doing so, the record is recycled, depending on how the rule is configured, to be either +archived or deleted from the database. + +:::{tip} +Discard groupings by clicking the {icon}`fa-times` {guilabel}`Discard` button. Upon doing so, the +record is hidden from the list, and is not detected by the recycle rule again in the future. + +View discarded records by selecting the {guilabel}`Discarded` filter from the {ref}`search bar +` drop-down menu. +::: + +(data-cleaning-recylce-rule)= + +### Recycle record rules + +The *Recycle Records Rules* set the conditions for how records are recycled. + +These rules can be configured for each model in the database, and with varying levels of +specificity. To get started, navigate to {menuselection}`Data Cleaning app --> Configuration --> +Recycle Records`. + +:::{tip} +Recycle rules run once a day, by default, as part of a scheduled action cron (*Data Recycle: +Clean Records*). However, each rule can be {ref}`run manually ` +anytime. +::: + +By default, no recycle record rules exist. Click the {guilabel}`New` button to create a new rule. + +On the recycle record rule form, first choose a {guilabel}`Model` for this rule to target. Selecting +a model updates the rule title to the chosen model. + +Optionally, configure a {guilabel}`Filter` to specify the records eligible for this rule. The number +of eligible records is shown in the {icon}`oi-arrow-right` {guilabel}`# record(s)` link. + +Next, configure the field and time range for how the rule detects the records to recycle: + +- {guilabel}`Time Field`: select a field from the model to base the time ({dfn}`Delta`). +- {guilabel}`Delta`: type the length of time, which must be a whole number (e.g. `7`). +- {guilabel}`Delta Unit`: select the unit of time ({guilabel}`Days`, {guilabel}`Weeks`, + {guilabel}`Months`, or {guilabel}`Years`). + +Then, select a {guilabel}`Recycle Mode`: + +- {guilabel}`Manual`: requires each detected record to be manually recycled, and enables the + {guilabel}`Notify Users` field. +- {guilabel}`Automatic`: automatically merges recycled groupings, without notifying users. + +Lastly, select a {guilabel}`Recycle Action` to either {guilabel}`Archive` or {guilabel}`Delete` +records. If {guilabel}`Delete` is selected, choose whether or not to {guilabel}`Include Archived` +records in the rule. + +With the rule's configuration complete, either close the rule form, or {ref}`run the rule manually +` to instantly capture records to recycle. + +```{eval-rst} +.. example:: + A recycle rule can be configured to delete archived leads and opportunities that were last + updated a year ago, and with a specific lost reason, by using the following configuration: + + - :guilabel:`Model`: :guilabel:`Lead/Opportunity` + - :guilabel:`Filter`: + + - `Active` `is` `not set` + - `Lost Reason` `is in` `Too expensive` + + - :guilabel:`Time Field`: :guilabel:`Last Updated on (Lead/Opportunity)` + - :guilabel:`Delta`: `1` + - :guilabel:`Delta Unit`: :guilabel:`Years` + - :guilabel:`Recycle Mode`: :guilabel:`Automatic` + - :guilabel:`Recycle Action`: :guilabel:`Delete` + - :guilabel:`Include Archived`: :icon:`fa-check-square` + + .. image:: data_cleaning/data-cleaning-recycle-rule.png + :alt: Recycle records rule form for a lead/opportunity. +``` + +(data-cleaning-run-recycle-rule)= + +#### Manually run a recycle rule + +To manually run a specific recycle rule at any time, navigate to {menuselection}`Data Cleaning app +--> Configuration --> Recycle Records`, and select the rule to run. + +Then, on the rule form, click the {guilabel}`Run Now` button on the top-left. Upon doing so, the +{icon}`fa-bars` {guilabel}`Records` smart button displays the number of records captured. + +Click the {icon}`fa-bars` {guilabel}`Records` smart button to {ref}`manage these records +`. + +(data-cleaning-field-cleaning)= + +## Field cleaning + +Use the field cleaning feature to maintain consistent formatting of names, phone numbers, IDs and +other fields throughout a database. + +The *Field Cleaning Records* dashboard displays formatting changes to data in fields of a record, +to follow a convention set by the field cleaning rules. + +Navigate to this dashboard by going to {menuselection}`Data Cleaning app --> Field Cleaning`. + +```{image} data_cleaning/data-cleaning-field.png +:alt: Field Cleaning Records dashboard in the Data Cleaning application. +``` + +The {guilabel}`CLEANING RULES` sidebar lists each of the active cleaning rules. + +By default, the {guilabel}`All` rule is selected. Records are listed with the following columns: + +- {guilabel}`Record ID`: the ID of the original record. +- {guilabel}`Record Name`: the name or title of the original record. +- {guilabel}`Field`: the original record's field that contains the value to format. +- {guilabel}`Current`: the current value in the field of the original record. +- {guilabel}`Suggested`: the suggested formatted value in the field of the original record. + +To clean and format records, click the {icon}`fa-check` {guilabel}`Validate` button on the row of +the record. + +Upon doing so, the record is formatted and/or cleaned. + +:::{tip} +Discard records by clicking the {icon}`fa-times` {guilabel}`Discard` button. Upon doing so, the +record is hidden from the list and will not be detected by the field cleaning rule again in the +future. + +View discarded records by selecting the {guilabel}`Discarded` filter from the {ref}`search bar +`. +::: + +(data-cleaning-field-cleaning-rule)= + +### Field cleaning rules + +The *Field Cleaning Rules* set the conditions for fields to be cleaned and/or formatted. + +These rules can be configured for each model in the database, and with varying levels of +specificity. To get started, navigate to {menuselection}`Data Cleaning app --> Configuration --> +Field Cleaning`. + +:::{tip} +The field cleaning rules run once every day, by default, as part of a scheduled action cron +(*Data Cleaning: Clean Records*). However, each rule can be {ref}`ran manually +` anytime. +::: + +By default, a {guilabel}`Contact` rule exists to format and clean up the **Contacts** app records. +Select the {guilabel}`Contact` record to make edits, or select the {guilabel}`New` button to create +a new rule. + +On the field cleaning rule form, first choose a {guilabel}`Model` for this rule to target. Selecting +a model updates the rule title to the chosen model. + +Next, configure at least one rule by clicking {guilabel}`Add a line` in the {guilabel}`Rules` +section. + +Upon doing so, a {guilabel}`Create Rules` popover window appears with the following fields to +configure: + +- Select a {guilabel}`Field To Clean` from the model to assign to an action. + +- Choose one of the following {guilabel}`Action` options: + + - {guilabel}`Trim Spaces` reveals the {guilabel}`Trim` field to select the {guilabel}`All Spaces` + or {guilabel}`Superfluous Spaces` option. Leading, trailing, and successive spaces are + considered superfluous. + + ```{eval-rst} + .. example:: + The contact name `Dr. John Doe` can be formatted with the following :guilabel:`Trim` + options: + + - :guilabel:`All Spaces`: `DR.JohnDoe` + - :guilabel:`Superfluous Spaces`: `DR. John Doe` + ``` + + - {guilabel}`Set Type Case` reveals the {guilabel}`Case` field to select either {guilabel}`First + Letters to Uppercase`, {guilabel}`All Uppercase`, or {guilabel}`All Lowercase`. + + ```{eval-rst} + .. example:: + The lead/opportunity title `lumber inc, Lorraine douglas` can be formatted with the following + :guilabel:`Case` options: + + - :guilabel:`First Letters to Uppercase`: `Lumber Inc, Lorraine Douglas` + - :guilabel:`All Uppercase`: `LUMBER INC, LORRAINE DOUGLAS` + - :guilabel:`All Lowercase`: `lumber inc, lorraine douglas` + ``` + + - {guilabel}`Format Phone` converts the phone number to an international country format. + + ```{eval-rst} + .. example:: + - Belgium: `061928374` :icon:`fa-long-arrow-right` `+32 61 92 83 74` + - United States: `800 555-0101` :icon:`fa-long-arrow-right` `+1 800-555-0101` + ``` + + - {guilabel}`Scrap HTML` converts {abbr}`HTML (HyperText Markup Language)` to plain text. + + ```{eval-rst} + .. example:: + + .. code-block:: html + :caption: HTML text + +

John Doe

+

Lorem ipsum dolor sit amet.

+ + .. code-block:: text + :caption: Plain text + + **John Doe** Lorem ipsum dolor sit amet [1] .[1] https://example.com + ``` + + Once a field and action are selected, click {guilabel}`Save` to close the {guilabel}`Create Rules` + popover window. + +Then, select a {guilabel}`Cleaning Mode`: + +- {guilabel}`Manual`: requires each detected field to be manually cleaned and enables the + {guilabel}`Notify Users` field. +- {guilabel}`Automatic`: automatically cleans fields without notifying users. + +With the rule's configuration complete, either close the rule form, or {ref}`run the rule manually +` to instantly capture fields to clean. + +(data-cleaning-run-field-cleaning-rule)= + +#### Manually run a field cleaning rule + +To manually run a specific field cleaning rule at any time, navigate to {menuselection}`Data +Cleaning app --> Configuration --> Field Cleaning`, and select the rule to run. + +Then, on the rule form, select the {guilabel}`Clean` button on the top-left. Upon doing so, the +{icon}`fa-bars` {guilabel}`Records` smart button displays the number of records captured. + +Click on the {icon}`fa-bars` {guilabel}`Records` smart button to {ref}`manage these records +`. + +(data-cleaning-merge-action-manager)= + +## Merge action manager + +The *Merge Action Manager* enables or disables the *Merge* action available in the *Actions* menu +for models in the database. + +Enable {ref}`developer-mode` and navigate to {menuselection}`Data Cleaning app --> Configuration --> +Merge Action Manager`. + +Models are listed with the following columns: + +- {guilabel}`Model`: technical name of the model. +- {guilabel}`Model Description`: display name of the model. +- {guilabel}`Type`: whether the model is of the *Base Object* or *Custom Object* type. +- {guilabel}`Transient Model`: the model handles temporary data that does not need to be stored + long-term in the database. +- {guilabel}`Can Be Merged`: enables the *Merge* action for the model. + +To view which models are enabled by default, use the {ref}`search bar ` to filter +models that {guilabel}`Can Be Merged`. + +:::{seealso} +{doc}`../essentials/contacts/merge` +::: + diff --git a/content/applications/productivity/discuss.md b/content/applications/productivity/discuss.md new file mode 100644 index 000000000..52bcb0a1b --- /dev/null +++ b/content/applications/productivity/discuss.md @@ -0,0 +1,168 @@ +--- +hide-page-toc: true +show-content: true +--- + +# Discuss + +Odoo **Discuss** is an internal communication app that allows users to connect through messages, +notes, file sharing, and video calls. **Discuss** enables communication through a persistent chat +window that works across applications, or through the dedicated *Discuss* dashboard. + +Upon opening the {menuselection}`Discuss app`, the {guilabel}`Discuss` dashboard appears. + +## Inbox, starred, and history + +Upon opening the {menuselection}`Discuss app`, the *Discuss* dashboard appears. + +On the {guilabel}`Discuss` dashboard, unread messages are visible in the {icon}`fa-inbox` +{guilabel}`Inbox`. {icon}`fa-star-o` {guilabel}`Starred` is where starred messages are stored. +{icon}`fa-history` {guilabel}`History` shows chatter updates for records in the Odoo database the +user has been assigned to, or tagged on. + +## Direct messages + +*Direct messages* allow the user to communicate privately with one or multiple team members. To +start a new direct message, click the {icon}`fa-plus` icon, next to {guilabel}`Direct Messages` on +the {guilabel}`Discuss` dashboard, and enter the name of the desired person in the {guilabel}`Start +a conversation` search bar that appears. + +:::{tip} +Multiple names can be selected in the {guilabel}`Start a conversation` search bar. Once all of +the names have been entered, press {kbd}`Enter`. +::: + +### Direct message actions + +Hover over a direct message in the chat window to see a menu of actions to take on the message. + +- {icon}`oi-smile-add` {guilabel}`(Add a Reaction)`: open a drop-down menu of emojis that can be + used to react to the direct message. + +- {icon}`fa-reply` {guilabel}`(Reply)`: reply to the direct message in a thread. + +- {icon}`fa-star-o` {guilabel}`(Mark as Todo)`: add the message to the {guilabel}`Starred` tab. + +- {icon}`fa-ellipsis-h` {guilabel}`(Expand)`: reveals more message actions, including: + + - {icon}`fa-thumb-tack` {guilabel}`Pin` + - {icon}`fa-eye-slash` {guilabel}`Mark as Unread` + - {icon}`fa-pencil` {guilabel}`Edit` + - {icon}`fa-trash` {guilabel}`Delete` + +### Conversation actions + +The icons in the top-right corner of a direct message conversation represent different actions the +user can take on that conversation. + +Click {icon}`fa-bell` {guilabel}`Notification Settings` to set up notification preferences for the +conversation, or click {icon}`fa-phone` {guilabel}`Start a Call` to begin a meeting. See the +{ref}`Meetings ` section for more information about meetings. + +At the top of the direct message window, click the name of the direct message to change the group +name, and choose to add a description in the adjacent {guilabel}`Add a description` field. + +```{image} discuss/conversation-actions.png +:alt: View of the conversation actions. +``` + +:::{note} +The {guilabel}`Add a description` field is **only** available for group messages with more than +two participants. +::: + +### User status + +It is helpful to see what colleagues are up to, and how quickly they can respond to messages, by +checking their status. The status is displayed as a circle in the bottom-right corner of a contact's +photo in the {icon}`fa-users` {guilabel}`(Members List)`. + +The color of the circle represents the user's status: + +- Green = online +- Orange = away +- White = offline +- Airplane = out of the office + +### Leave a direct message conversation + +To leave a direct message conversations, click the {icon}`fa-times` {guilabel}`(Leave this channel)` +icon next to the conversation name in the {guilabel}`Direct Messages` section of the sidebar. + +:::{note} +Leaving a conversation does **not** delete the direct messages in the conversation. The direct +message conversation's history is visible when another direct message with the same person, or +group, is created. +::: + +(discuss-meetings)= + +## Meetings + +In **Discuss**, *Meetings* are video calls. To start a meeting from the {guilabel}`Discuss` +dashboard, click {guilabel}`Start a meeting` in the top-left corner, and select who to invite to the +meeting, via the {guilabel}`Invite People` drop-down window that appears. To start a meeting from a +direct message, click the {icon}`fa-phone` {guilabel}`Start a Call` icon in the top-right corner. + +```{image} discuss/meeting.png +:alt: View of a Meeting in Odoo Discuss. +``` + +Once a meeting has been started, the following buttons can be used: + +| Icon | Use | +| --------------------------- | ------------------------------ | +| {icon}`fa-microphone` | {guilabel}`Mute` | +| {icon}`fa-microphone-slash` | {guilabel}`Unmute` | +| {icon}`fa-headphones` | {guilabel}`Deafen` | +| {icon}`fa-deaf` | {guilabel}`Undeafen` | +| {icon}`fa-video-camera` | {guilabel}`Turn camera on/off` | +| {icon}`fa-hand-paper-o` | {guilabel}`Raise Hand` | +| {icon}`fa-desktop` | {guilabel}`Share Screen` | +| {icon}`fa-arrows-alt` | {guilabel}`Enter Full Screen` | + +(discuss-app-notification-preferences)= + +## User-specific notification preferences + +Access user-specific preferences for the **Discuss** app by navigating to {menuselection}`Settings +app --> Manage Users`, select a user, then click the {guilabel}`Preferences` tab. + +```{image} discuss/preferences-user.png +:alt: View of the Preferences tab for Odoo Discuss. +``` + +By default, the {guilabel}`Notification` field is set as {guilabel}`Handle by Emails`. With this +setting enabled, a notification email is sent by Odoo every time a message is sent from the chatter +of a record, a note is sent with an `@` mention (from the chatter of a record), or a notification is +sent for a record the user follows. + +By choosing {guilabel}`Handle in Odoo`, the above notifications are shown in the **Discuss** app's +*Inbox*. + +## Chat from different applications + +The **Discuss** application enables communication across all of Odoo's applications. To view chats +and channels, or start a new message, select the speech bubbles that are consistently present in the +upper-right corner of the database header. + +```{image} discuss/discuss-in-other-apps.png +:alt: Use Discuss across other applications by clicking the speech bubbles. +``` + +:::{seealso} +- {doc}`discuss/team_communication` +- {doc}`/applications/essentials/activities` +- {doc}`discuss/ice_servers` +- {doc}`discuss/chatter` +::: + +```{toctree} +:titlesonly: true + +discuss/team_communication +discuss/ice_servers +discuss/chatter +discuss/canned_responses +``` + diff --git a/content/applications/productivity/discuss/canned_responses.md b/content/applications/productivity/discuss/canned_responses.md new file mode 100644 index 000000000..b8f13965c --- /dev/null +++ b/content/applications/productivity/discuss/canned_responses.md @@ -0,0 +1,140 @@ +# Canned responses + +*Canned responses* are customizable inputs where a typed shortcut populates a longer response. A +user enters a keyword shortcut, which is then automatically replaced by the expanded substitution +response. Canned responses save time by allowing users to use shorthand phrases to populate longer +messages. This also limits the possibility of errors when typing out longer messages because these +are pre-set messages. This maintains consistency throughout customer interactions. + +Canned responses consist of two main components: the *shortcut* and the *substitution*. The shortcut +is the keyword or key phrase that is to be replaced. The substitution is the longer message that +replaces the shortcut. + +```{image} canned_responses/canned-response-sample.png +:align: center +:alt: A live chat conversation using a canned response. +``` + +Canned responses are available {ref}`to use ` in *Live Chat* conversations, the +*Discuss* app, and the *Chatter* composer. This includes direct message conversations, channel +conversations, and *WhatsApp* messages. + +(discuss-created-canned-response)= + +## Creating canned responses + +Canned responses are managed through the *Discuss* application. To create a new canned response, or +manage the list of existing responses, navigate to {menuselection}`Discuss app --> Configuration +--> Canned Responses`. + +Then, to create a new canned response, click {guilabel}`New` at the top-left of the list. Doing so +reveals a new blank line in the list. + +Canned responses consist of two main components, a *shortcut* the user enters, and the +*substitution* that replaces the shortcut. + +```{image} canned_responses/shortcut-substitution.png +:align: center +:alt: A list of canned responses emphasizing the shortcut and substitution fields. +``` + +Type a shortcut command in the {guilabel}`Shortcut` field. Next, click on the +{guilabel}`Substitution` field, and type the message that will replace the shortcut. + +:::{tip} +Try to connect the shortcut to the topic of the substitution. Not only does this make it easier +to use the responses, it prevents the list of responses from becoming disorganized and +overwhelming. +::: + +In the {guilabel}`Description` field, add any information that provides context for this response, +such as guidelines for when it should or should not be used. + +The {guilabel}`Created by` field automatically populates with the name of the user that creates a +new response. This field cannot be edited. + +To {ref}`share ` this response with other users, select one or more +groups in the {guilabel}`Authorized Group` field that should have access. + +:::{warning} +If the {guilabel}`Authorized Group` field is left blank, the response can **only** be used by the +user that created it. + +Canned responses created by the database are automatically credited as created by *OdooBot*. They +must be assigned to an *authorized group* before they can be used by **any** users. To view the +responses created by *OdooBot*, navigate to {menuselection}`Discuss app --> Configuration --> +Canned Responses`. Click into the {guilabel}`Search..` bar, and remove any filters. +::: + +Lastly, the {guilabel}`Last Used` field keeps track of the date and time each response was most +recently used. This field cannot be edited. + +(discuss-sharing-responses)= + +## Share responses + +Canned responses, by default, are made available **only** to the user who creates them. To make a +canned response available for others to use, they need to be shared. + +:::{note} +Users with *Administrator* access rights can view and edit canned responses created by other +users through the *Discuss* app. However, they are **only** able to use them if they are included +in an authorized group that has been designated on that canned responses item line, located on +the {guilabel}`Canned Responses` page. +::: + +Access to shared responses is granted on the {ref}`groups ` level. + +To view the *Groups* a user is a member of, first enable {ref}`Developer mode `, +then navigate to {menuselection}`Settings app --> Users & Companies --> Users`. Select a user from +the list, and click to open their {guilabel}`User Record`. Then, click the {guilabel}`Groups` smart +button at the top of the page. + +:::{tip} +To view a list of users in a specific group, first enable {doc}`Developer mode +<../../general/developer_mode/>`. Next, navigate to {menuselection}`Settings app --> Users & +Companies --> Groups`. Select a group from the list, then click to open the {guilabel}`Group +Record`. A list of users is included on the {guilabel}`Users` tab. +::: + +After determining what groups should have access to a response, they **must** {ref}`be added +` to the {guilabel}`Authorized Groups` field for each canned +response. + +:::{note} +The user who created the response can use it, even if they are not a member of one of the +*Authorized Groups*. +::: + +(discuss-use-cases)= + +## Use a canned response + +Canned responses can be used in the *Discuss* app, in a *Live Chat* conversation, or on any record +that contains a *Chatter* composer. This includes direct message conversations, channel +conversations, and *WhatsApp* messages. + +To use a canned response, type a colon (`:`) into a *Chatter* composer or chat window, followed by +the shortcut. Then press {kbd}`Enter`. This replaces the shortcut with the substitution, though the +response can still be edited before it is sent. + +:::{tip} +Typing `:` in the *Chatter* composer, or chat window, on its own generates a drop-down list of +available canned responses. A response can be selected from the list, in addition to the use of +shortcuts. + +To search through the list of available responses, type `:`, followed by the first few letters of +the shortcut. + +```{image} canned_responses/canned-responses-using.png +:align: center +:alt: A live chat window with a list of all available canned responses. +``` +::: + +:::{seealso} +- {doc}`Chatter ` +- {doc}`Discuss <../discuss>` +- {ref}`Commands and Canned Responses ` +::: + diff --git a/content/applications/productivity/discuss/chatter.md b/content/applications/productivity/discuss/chatter.md new file mode 100644 index 000000000..d693b476c --- /dev/null +++ b/content/applications/productivity/discuss/chatter.md @@ -0,0 +1,441 @@ +--- +substitutions: + paperclip: '{icon}`fa-paperclip` {guilabel}`(paperclip)` icon' + user: '{icon}`fa-user-o` {guilabel}`(user)` icon' +--- + +# Chatter + +The *Chatter* feature is integrated throughout Odoo to streamline communication, maintain +traceability, and provide accountability among team members. Chatter windows, known as *composers*, +are located on almost every record within the database, and allow users to communicate with both +internal users and external contacts. + +Chatter composers also enable users to log notes, upload files, and schedule activities. + +## 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. + +```{eval-rst} +.. example:: + A user, Mitchell Admin, needs to update the email address of a contact. After they save the + changes to the contact record, a note is logged in the chatter of the contact record with the + following information: + + - The date when the change occurred. + - The email address as it was previously listed. + - 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 +intervention by the system, the chatter thread creates a log note, and credits the change to +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)= + +## Add followers + +A *follower* is a user or contact that is added to a record and is notified when the record is +updated, based on specific {ref}`follower subscription settings `. +Followers can add themselves, or can be added by another user. + +:::{note} +If a user creates, or is assigned to a record, they are automatically added as a follower. +::: + +To follow a record, navigate to any record with a chatter thread. For example, to open a *Helpdesk* +ticket, navigate to {menuselection}`Helpdesk app --> Tickets --> All Tickets`, and select a ticket +from the list to open it. + +At the top-right, above the chatter composer, click {guilabel}`Follow`. Doing this changes the +button to read {guilabel}`Following`. Click it again to {guilabel}`Unfollow`. + +### Manage followers + +To add another user, or contact, as a follower, click the {{ user }}. This opens a drop-down list of the +current followers. Click {guilabel}`Add Followers` to open an {guilabel}`Invite Follower` pop-up +window. + +Select one or more contacts from the {guilabel}`Recipients` drop-down list. To notify the contacts, +tick the {guilabel}`Send Notification` checkbox. Edit the message template as desired, then click +{guilabel}`Add Followers`. + +To remove followers, click the {{ user }} to open the current followers list. Find the name of the +follower to be removed, and click the {icon}`fa-remove` {guilabel}`(remove)` icon. + +(discuss-edit-subscription)= + +### Edit follower subscription + +The updates a follower receives can vary based on their subscription settings. To see the type of +updates a follower is subscribed to, and to edit the list, click the {{ user }}. Find the appropriate +follower in the list, then click the {icon}`fa-pencil` {guilabel}`(pencil)` icon. This opens the +{guilabel}`Edit Subscription` pop-up window for the follower. + +The list of available subscription settings varies depending on the record type. For example, a +follower of a *Helpdesk* ticket may be informed when the ticket is rated. This option would not be +available for the followers of a *CRM* opportunity. + +Tick the checkbox for any updates the follower should receive, and clear the checkbox for any +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 +Helpdesk ticket. +::: + +(discuss-log-notes)= + +## Log notes + +The chatter function includes the ability to log internal notes on individual records. These notes +are only accessible to internal users, and are available on any records that feature a chatter +thread. + +To log an internal note, first navigate to a record. For example, to open a *CRM* opportunity, +navigate to {menuselection}`CRM app --> Sales --> My Pipeline`, and click on the Kanban card of an +opportunity to open it. Then, at the top-right, above the chatter composer, click {guilabel}`Log +note`. + +Enter the note in the chatter composer. To tag an internal user, type `@`, and begin typing the name +of the person to tag. Then, select a name from the drop-down menu. Depending on their notification +settings, the user is notified by email, or through Odoo. + +:::{important} +Outside contacts can also be tagged in an internal log note. The contact then receives an email +with the contents of the note they were tagged in, including any attachments added directly to +the note. If they respond to the email, their response is logged in the chatter, and they are +added to the record as a follower. + +Outside contacts are **not** able to log in to view the entire chatter thread, and are only +notified of specific updates, based on their {ref}`follower subscription settings +`, or when they are tagged directly. +::: + +(discuss-send-messages)= + +## Send messages + +Chatter composers can send messages to outside contacts, without having to leave the database, or +open a different application. This makes it easy to communicate with potential customers in the +*Sales* and *CRM* applications, or vendors in the *Purchase* app. + +To send a message, first navigate to a record. For example, to send a message from a *CRM* +opportunity, navigate to {menuselection}`CRM app --> Sales --> My Pipeline`, and click on the Kanban +card of an opportunity to open it. Then, at the top-right, above the chatter composer, click +{guilabel}`Send message`. + +:::{tip} +Press {command}`Ctrl + Enter` to send a message, instead of using the {guilabel}`Send` button. +::: + +If any {ref}`followers ` have been added to the record, they are added as +recipients of the message. + +:::{warning} +{ref}`Followers ` of a record are added as recipients of a message +automatically. If a follower should **not** receive a message, they must be removed as a follower +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. +``` + +### Expand full composer + +The chatter composer can be expanded to a larger pop-up window, allowing for additional +customizations. + +To open the full composer, click the {icon}`fa-expand` {guilabel}`(expand)` icon in the bottom-right +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. +::: + +Doing this opens a {guilabel}`Compose Email` pop-up window. Confirm or edit the intended +{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. + +:::{note} +The number and type of templates available vary, based on the record the message is created from. +::: + +Click {icon}`fa-paperclip` {guilabel}`(paperclip)` icon to add any files to the message, then click +{guilabel}`Send`. + +```{image} chatter/chatter-full-composer.png +:align: center +:alt: The expanded full chatter composer in the CRM application. +``` + +### Edit sent messages + +Messages can be edited after they are sent, to fix typos, correct mistakes, or add missing +information. + +:::{note} +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. + +```{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`. + +:::{important} +Users with Admin-level access rights can edit any sent messages. Users without Admin rights can +**only** edit messages they created. +::: + +(discuss-search-messages)= + +## Search messages + +Chatter threads can become long after a while, because of all the information they contain. To make +it easier to find a specific entry, users can search the text of messages and notes for specific +keywords. + +First, select a record with a chatter thread. For example, to search a *CRM* opportunity, navigate +to {menuselection}`CRM app --> Sales --> My Pipeline`, and click on the Kanban card of an +opportunity to open it. Then, at the top-right, above the chatter composer, click the +{icon}`oi-search` {guilabel}`(search)` icon to open the search bar. + +Enter a keyword or phrase into the search bar, then hit {command}`Enter`, or click the +{icon}`oi-search` {guilabel}`(search)` icon to the right of the search bar. Any messages or notes +containing the keyword or phrase entered are listed below the search bar, with the keyword +highlighted. + +To be taken directly to a particular message in the chatter thread, hover over the upper-right +corner of the result to reveal a {guilabel}`Jump` button. Click this button to be directed to that +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 +**Jump** option. Click it to be taken directly to that message in the chatter thread. +::: + +(discuss-schedule-activities)= + +## Schedule activities + +*Activities* are follow-up tasks tied to a record in an Odoo database. Activities can be scheduled +on any database page that contains a chatter thread, Kanban view, list view, or activities view of +an application. + +To schedule an activity through a chatter thread, click the {guilabel}`Activities` button, located +at the top of the chatter on any record. On the {guilabel}`Schedule Activity` pop-up window that +appears, select an {guilabel}`Activity Type` from the drop-down menu. + +:::{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 +{menuselection}`CRM app --> Configuration --> Activity Types`. +::: + +Enter a title for the activity in the {guilabel}`Summary` field, located in the {guilabel}`Schedule +Activity` pop-up window. + +Select a name from the {guilabel}`Assigned to` drop-down menu to assign the activity to a different +user. Otherwise, the user creating the activity is automatically assigned. + +Add any additional information in the optional {guilabel}`Log a note...` field. + +:::{note} +The {guilabel}`Due Date` field on the {guilabel}`Schedule Activity` pop-up window auto-populates +based on the configuration settings for the selected {guilabel}`Activity Type`. However, this +date can be changed by selecting a day on the calendar in the {guilabel}`Due Date` 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. + +Scheduled activities are added to the chatter for the record under {guilabel}`Planned activities`, +and are color-coded based on their due date. + +- **Red** icons indicate an overdue activity. +- **Yellow** icons indicate an activity with a due date scheduled for the current 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} +Click the {icon}`fa-info-circle` {guilabel}`(info)` icon next to a planned activity to see +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. +This opens a {guilabel}`Mark Done` pop-up window, where additional notes about the activity can be +entered. After adding any comments to the pop-up window, click: {guilabel}`Done \& Schedule Next`, +{guilabel}`Done`, or {guilabel}`Discard`. + +After the activity is marked complete, an entry with the activity type, title, and any other details +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)= + +## Attach files + +Files can be added as attachments in the chatter, either to send with messages, or to include with a +record. + +:::{note} +After a file has been added to a chatter thread, it can be downloaded by any user with access to +the thread. Click the {{ paperclip }} to make the files header visible, if necessary. Then, click the +{icon}`fa-download` {guilabel}`(download)` icon the file to download it. +::: + +To attach a file, click the {{ paperclip }} located at the top of the chatter composer of any record +that contains a chatter thread. + +This opens a file explorer pop-up window. Navigate to the desired file, select it, then click +{guilabel}`Open` to add it to the record. Alternatively, files can be dragged and dropped directly +onto a chatter thread. + +After files have been added, they are listed in the chatter thread, under a {guilabel}`Files` +heading. + +:::{note} +After at least one file has been added to a chatter record, a new button labeled +{guilabel}`Attach files` appears below the {guilabel}`Files` heading. To attach any additional +files, this is the button that **must** be used, instead of the {{ paperclip }} at the top of the +chatter thread. + +After the {guilabel}`Files` section heading appears in the thread, clicking the {{ paperclip }} no +longer opens a file explorer pop-up window. Instead, clicking the {{ paperclip }} toggles the +{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)= + +## Integrations + +Beyond the standard features, additional integrations can be enabled to work with the chatter +feature, specifically *WhatsApp* and *Google Translate*. + +:::{important} +Before the *WhatsApp* and *Google Translate* integrations can be used with the chatter, they +**must** be configured. Step-by-step instructions on how to set-up each of these features can be +found in the documentation below: + +- {doc}`WhatsApp <../whatsapp>` +- {doc}`Google Translate <../../general/integrations/google_translate>` +::: + +### WhatsApp + +*WhatsApp* is an instant messaging and voice-over-IP app that allows users to send and receive +messages, as well as share content. + +:::{warning} +*WhatsApp* is an Odoo Enterprise-only application that does **not** work in the Odoo Community +edition. To sign up for an Odoo Enterprise edition, click here: [Odoo Free Trial](https://www.odoo.com/trial). +::: + +After *WhatsApp* has been configured and enabled within a database, a {guilabel}`WhatsApp` button is +added above the chatter composer on any applicable record. If one or more approved *WhatsApp* +templates are found for that model, clicking this button opens a {guilabel}`Send WhatsApp Message` +pop-up window. + +:::{important} +*WhatsApp* templates **must** be approved before they can be used. See {ref}`WhatsApp templates +` for more information. +::: + +```{image} chatter/whats-app-message.png +:align: center +:alt: A send WhatsApp message pop-up window. +``` + +### Google Translate + +*Google Translate* can be used to translate user-generated text in the Odoo chatter. + +To enable *Google Translate* on a database, an *API key* must first {doc}`be created +<../../general/integrations/google_translate>` through the [Google API Console](https://console.developers.google.com/). + +After creating the API key, navigate to the {menuselection}`Settings app --> Discuss section` and +paste the key in the {guilabel}`Message Translation` field. Click {guilabel}`Save` to save the +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/>`. + +```{image} chatter/chatter-translate-message.png +:align: center +:alt: alt text +``` + +:::{important} +Using the *Google Translate* API **requires** a current billing account with [Google](https://myaccount.google.com/). +::: + +:::{seealso} +- {doc}`Discuss <../discuss>` +- {doc}`Discuss Channels <../discuss/team_communication/>` +- {doc}`Activities <../../essentials/activities>` +- {doc}`WhatsApp <../whatsapp>` +::: + diff --git a/content/applications/productivity/discuss/ice_servers.md b/content/applications/productivity/discuss/ice_servers.md new file mode 100644 index 000000000..4ede7ecb1 --- /dev/null +++ b/content/applications/productivity/discuss/ice_servers.md @@ -0,0 +1,84 @@ +# Configure ICE servers with Twilio + +Odoo Discuss uses WebRTC API and peer-to-peer connections for voice and video calls. If one of the +call attendees is behind a symmetric NAT, you need to configure an ICE server to establish a +connection to the call attendee. To set up an ICE server, first, create a Twilio account for video +calls, and then, connect that Twilio account to Odoo. + +## Create a Twilio account + +First, go to [Twilio](https://www.twilio.com) and click {guilabel}`Sign up` to create a new +Twilio account. Next, enter your name and email address, create a password, and accept Twilio's +terms of service. Then, click {guilabel}`Start your free trial`. Verify your email address with +Twilio, as per their instructions. + +Next, enter your phone number into Twilio. Then, Twilio will send you an SMS text message +containing a verification code. Enter the verification code into Twilio to verify your phone +number. + +After that, Twilio redirects to a welcome page. Use the following list to answer Twilio's +questions: + +- For {guilabel}`Which Twilio product are you here to use?`, select {guilabel}`Video`. +- For {guilabel}`What do you plan to build with Twilio?`, select {guilabel}`Other`. +- For {guilabel}`How do you want to build with Twilio?`, select {guilabel}`With no code at all`. +- For {guilabel}`What is your goal today?`, select {guilabel}`3rd party integrations`. + +```{image} ice_servers/twilio-welcome.png +:align: center +:alt: The Twilio welcome page. +``` + +If necessary, change the billing country. Finally, click {guilabel}`Get Started with Twilio`. + +## Locate the Twilio Account SID and Auth Token + +To locate the Account SID and Auth Token, go to the Twilio account dashboard. Then, click +{guilabel}`Develop` on the sidebar. In the {guilabel}`Account Info` section, locate the +{guilabel}`Account SID` and the {guilabel}`Auth Token`. Both of these are needed to connect Twilio +to Odoo. + +```{image} ice_servers/twilio-acct-info.png +:align: center +:alt: The Twilio Account SID and Auth Token can be found uner the Account Info section. +``` + +## Connect Twilio to Odoo + +Open the Odoo database and go to {menuselection}`Settings --> General Settings --> Discuss`. Check +the box next to {guilabel}`Use Twilio ICE servers` and enter the Twilio account's +{guilabel}`Account SID` and {guilabel}`Auth Token`. Finally, click {guilabel}`Save` to apply these +changes. + +```{image} ice_servers/connect-twilio-to-odoo.png +:align: center +:alt: Enable the "Use Twilio ICE servers" option in Odoo General Settings. +``` + +## Define a list of custom ICE servers + +This step is not required for the Twilio configuration. However, if Twilio is not configured or is +not working at any given moment, Odoo will fall back on the custom ICE servers list. The user must +define the list of custom ICE servers. + +In {menuselection}`Settings --> General Settings --> Discuss`, click the {guilabel}`ICE Servers` +button under {guilabel}`Custom ICE server list`. + +```{image} ice_servers/custom-ice-servers-list.png +:align: center +:alt: The "ICE Servers" button in Odoo General Settings. +``` + +Odoo will redirect to the {guilabel}`ICE servers` page. Here you can define your own list of ICE +servers. + +```{image} ice_servers/ice-servers-page.png +:align: center +:alt: The "ICE servers" page in Odoo. +``` + +:::{note} +For on-premise instances of Odoo, the package `python3-gevent` is necessary for the Discuss +module to run calls/video calls on Ubuntu (Linux) servers. +::: + diff --git a/content/applications/productivity/discuss/team_communication.md b/content/applications/productivity/discuss/team_communication.md new file mode 100644 index 000000000..ba4c046d1 --- /dev/null +++ b/content/applications/productivity/discuss/team_communication.md @@ -0,0 +1,116 @@ +# Use channels for team communication + +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 + +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. + +```{image} team_communication/public-private-channel.png +:align: center +: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). +::: + +### Configuration options + +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. + +```{image} team_communication/channel-settings.png +:align: center +:alt: View of a channel's settings form in Odoo Discuss. +``` + +#### Privacy and Members tabs + +Changing {guilabel}`Who can follow the group's activities?` controls which groups can have access to +the channel. + +:::{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`. + +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`. + +## 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. + +```{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. + +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. + +Users are able to contribute to this group channel (either public or member based) 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. +``` + +:::{seealso} +- {doc}`../discuss` +- {doc}`/applications/essentials/activities` +::: + diff --git a/content/applications/productivity/documents.md b/content/applications/productivity/documents.md new file mode 100644 index 000000000..1a9f78a69 --- /dev/null +++ b/content/applications/productivity/documents.md @@ -0,0 +1,397 @@ +# Documents + +**Odoo Documents** allows you to store, view, and manage files within Odoo. + +:::{seealso} +- [Odoo Documents: product page](https://www.odoo.com/app/documents) +- [Odoo Tutorials: Documents basics [video]](https://www.odoo.com/slides/slide/documents-basics-6841?fullscreen=1) +- [Odoo Tutorials: Using Documents with your Accounting App [video]](https://www.odoo.com/slides/slide/accounting-integration-and-workflow-actions-6853?fullscreen=1) +::: + +## Configuration + +By going to {menuselection}`Documents --> Configuration --> Settings`, you can enable the +centralization of files attached to a specific area of your activity. For example, by ticking +{guilabel}`Human Resources`, your HR documents are automatically available in the HR workspace, +while documents related to Payroll are automatically available in the Payroll sub-workspace. You +can change the default workspace using the dropdown menu and edit its properties by clicking the +{icon}`fa-arrow-right` ({guilabel}`Internal link`) icon. + +```{image} documents/files-centralization.png +:alt: Enable the centralization of files attached to a specific area of your activity. +``` + +:::{note} +- If you enable the centralization of your accounting files and documents, it is necessary to + click on {guilabel}`Journals` and define each journal independently to allow automatic + synchronization. + + ```{image} documents/accounting-files-centralization.png + :alt: Enable the centralization of files attached to your accounting. + ``` + +- If you select a new workspace, existing documents are not moved. Only newly created documents + will be found under the new workspace. +::: + +(documents-workspaces)= + +## Workspaces + +Workspaces are hierarchical folders having their own set of {ref}`tags ` +and {ref}`actions `. Default workspaces exist, but you can create your +own by going to {menuselection}`Documents --> Configuration --> Workspaces` and clicking +{guilabel}`New`. On the new page, fill in the following information: + +- {guilabel}`Name` +- {guilabel}`Parent Workspace`: if you want to create a sub-workspace, select its {guilabel}`Parent + Workspace`. + +Three tabs are available: {ref}`Tags `, +{ref}`Access Rights `, and {ref}`Description `. + +(documents-tags)= + +### Tags + +Tags are used within workspaces to add a level of differentiation between documents. They are +organized per category, and filters can be used to sort them. + +From the {guilabel}`Tags` tab, click {guilabel}`Add a line`, create the {guilabel}`Tag Category`, +and {guilabel}`Name` your tags. + +:::{note} +- The tags of a parent workspace apply to the child workspaces automatically; +- Tags can be created and modified by going to {menuselection}`Documents --> Configuration --> + Tags`; +- Tags can also be created or edited by clicking the {icon}`fa-gear` ({guilabel}`gear`) icon on + the left panel; +- An {ref}`email alias ` can be used to automatically send received documents + to a specific workspace based on the tag assigned. +::: + +(documents-access-rights)= + +### Access rights + +To manage your workspace access rights, go to the {guilabel}`Access Rights` tab. You can add +{guilabel}`Write Groups` that can view, create, and edit the workspace's documents. You can also add +{guilabel}`Read Groups` that only view the workspace's documents. + +:::{tip} +Enable {guilabel}`Own Documents Only` to limit {guilabel}`Read Groups` and +{guilabel}`Write Groups` to the documents of which they are owner. +::: + +(documents-description)= + +### Description + +You can add descriptive information to your workspace by going to the {guilabel}`Description` tab. + +:::{note} +Workspaces can also be created and edited by clicking the {icon}`fa-gear` ({guilabel}`gear`) icon +on the left panel. +::: + +(documents-management)= + +## Documents management + +When selecting or opening a document, the right panel displays different options, including, for +example: + +- {icon}`fa-download` ({guilabel}`Download`); +- {icon}`fa-share-alt` ({guilabel}`Share this selection`): a share URL is copied to your clipboard; +- {icon}`fa-retweet` ({guilabel}`Replace`): select a new file to replace the existing one. Scroll + down to the bottom of the right panel to see the {guilabel}`History` and {guilabel}`restore`, + {guilabel}`download`, or {guilabel}`delete` the document; +- {icon}`fa-unlock` ({guilabel}`Lock`); +- {icon}`fa-scissors` ({ref}`Split `); +- {icon}`fa-comments` ({guilabel}`Open chatter`). + +To modify the name of your file, edit the {guilabel}`Name` field. Click the {icon}`fa-trash` +({guilabel}`Move to trash`) icon to delete your document. + +:::{note} +Items moved to the trash are kept for 30 days in the {icon}`fa-trash` {guilabel}`Trash` +workspace, after which they are permanently deleted. +::: + +A {guilabel}`Contact` or an {guilabel}`Owner` can be assigned. You can also modify the related +{guilabel}`Workspace` and add {guilabel}`Tags`. + +:::{note} +- The {guilabel}`Contact` is a person related to the document who only has read + {ref}`access rights ` to the document, e.g., an existing supplier in + your database; +- The creator of a document is automatically assigned as its {guilabel}`Owner` and is granted + full access rights to it. To replace the owner of a document, select the required user from the + dropdown list in the {guilabel}`Owner` field. +::: + +:::{tip} +An employee must be a user and the owner of a document to view it in **My Profile**. +::: + +Different {ref}`Actions ` are available at the bottom of the right +panel, depending on the workspace where your document is stored. + +(documents-split)= + +### Split PDF documents + +Select the PDF you want to split, and click the {icon}`fa-scissors` ({guilabel}`scissors`) icon. A +new view displays all the pages of the document. + +By default, all pages are split when you click {guilabel}`Split`. To remove a split between two +pages, click the {icon}`fa-scissors` ({guilabel}`scissors`) icon. + +```{image} documents/split-pdf.png +:alt: split your documents +``` + +:::{tip} +To merge documents from your dashboard, select them and click the {icon}`fa-scissors` +({guilabel}`scissors`) icon. Click on the scissors between the two documents and click +{guilabel}`Split` to merge the documents. +::: + +### Additional features + +Select a workspace and click the {guilabel}`New` button to access additional features: + +#### Upload + +You can upload any file (max 64MB per file on Odoo Online) to your **Documents** app. Select the +workspace where you want to upload your file, click the {guilabel}`New` button, then +{icon}`fa-upload` {guilabel}`Upload`. + +#### Request + +You can request files and organize them as documents to remind users to download them. + +Select the workspace where the file should be stored, click the {guilabel}`New` button, then +{icon}`fa-paper-plane-o` {guilabel}`Request`. Add the {guilabel}`Document Name` and select the +person you need it from in the {guilabel}`Request To` field. You can also fill in the +{guilabel}`Due Date In`, confirm the {guilabel}`Workspace` the document should belong to, and add +{guilabel}`Tags` and a {guilabel}`Message`. Then, click {guilabel}`Request`. A placeholder for the +missing document is created in the workspace. + +When your document is available, click the placeholder to upload it. + +You can see all missing documents by going to the **Activity** view and the {guilabel}`Requested +Document` column. + +:::{tip} +From the {guilabel}`Activity` view, you can send a **reminder email** to users from whom you are +expecting a document. Go to the {guilabel}`Requested Document` column and click the +{icon}`fa-ellipsis-v` ({guilabel}`ellipsis`) icon, and {guilabel}`Document Request: Reminder`. +Click on a date to see the details of a specific request. You can update it by clicking on the +{icon}`fa-pencil` ({guilabel}`pen`) icon, {guilabel}`Preview` the content of the reminder email, +or {guilabel}`Send Now` to send a reminder email. + +> ```{image} documents/reminder-email.png +> :alt: send a reminder email from the Activity view +> ``` +::: + +(documents-add-a-link)= + +#### Link + +To add a link to your documents dashboard, click {icon}`fa-link` {guilabel}`Link`, enter the +{guilabel}`URL`, and {guilabel}`Name` it. + +(documents-documents-spreadsheet)= + +#### Spreadsheet + +To create a new {doc}`spreadsheet `, select the workspace where the file should be +stored, click the {guilabel}`New` button, then {guilabel}`Spreadsheet`. You can create a +{guilabel}`Blank spreadsheet` or select an {doc}`existing template ` to use. + +### Share + +You can make a document or a workspace accessible to anyone by sharing a URL. + +#### Share a document + +To generate a **share link** to a document, select the document and click the {guilabel}`Share` +button. + +In the pop-up, you can {guilabel}`Name` the share link, set a validity date by filling in the +{guilabel}`Valid Until` field, and if you own more than one site, select the {guilabel}`Website` you +want so the right domain name is reflected in the URL. + +Click {guilabel}`Copy Link & Close` to copy the URL to your clipboard. + +:::{tip} +You can also generate a share URL by selecting the document, going to the right panel, and +clicking the {icon}`fa-share-alt` ({guilabel}`Share this selection`) icon. +::: + +#### Share a workspace + +You can share a link to a workspace and allow users to {guilabel}`Download` its content or +{guilabel}`Download and Upload` files to it. + +To do so, go to the left column of your dashboard and select the workspace you want to share. You +can also choose one or more tags that will be automatically added to the uploaded documents. Then, +click the {guilabel}`Share` button. + +In the pop-up, a share {guilabel}`URL` you can {guilabel}`Copy` is displayed. You can +{guilabel}`Name` your share link and set a validity date by filling in the {guilabel}`Valid Until` +field. If you own more than one site, select the {guilabel}`Website` you want so the share link +reflects the right domain name. + +:::{Note} +- The links added to your workspace using the {ref}`Link ` option cannot be + shared and are, therefore, excluded. +- When tags are applied to a shared workspace, users can exclusively access the documents + associated with those tags. +::: + +(documents-upload)= + +##### Files upload + +Toggle the {guilabel}`Allow upload` switch to allow users to upload files to your workspace. + +Tick the {guilabel}`Upload by Email` checkbox to enable users to upload documents sent by email in +the workspace. + +Enter an alias in the {guilabel}`Email Alias` field. All documents sent to this email address are +uploaded to the workspace using the chosen tags. + +:::{note} +- You need to have an alias domain set to be able to upload documents by email. If it isn't + existing yet, click {guilabel}`Choose or Configure Email Servers` and create an + {ref}`alias domain `. +- By default, the {guilabel}`Document Owner` is the person who uploads a file to a workspace, but + you can select another user. You can also set a {guilabel}`Contact`, usually an external + person, such as a partner. +- Enable {guilabel}`Create a new activity` to automatically create an activity when a document is + uploaded. Select the {guilabel}`Activity type` from the dropdown list and set the + {guilabel}`Due Date In` field. You can also add a {guilabel}`Summary` and a + {guilabel}`Responsible` person assigned to the activity. +::: + +:::{tip} +Go to {menuselection}`Configuration --> Share & Emails` to see and manage your share links. +Select a line and click {guilabel}`Delete` to disable the URL. People who have received this +link will no longer be able to access the document(s) or workspace. +::: + +(documents-workflow-actions)= + +## Workflow actions + +Workflow actions help manage documents and overall business operations. These are automated actions +that can be created and customized for each workspace. With a single click you can, for example, +create, move, sign, add tags to a document, and process bills. + +When a document meets the set criteria, these workflow actions appear on the right panel. + +### Create workflow actions + +To update an existing workflow action or create a new one, go to {menuselection}`Documents --> +Configuration --> Actions` and click {guilabel}`New`. + +:::{note} +An action applies to all **sub-workspaces** under the {guilabel}`Related Workspace` you selected. +::: + +### Set the conditions + +Define the {guilabel}`Action Name` and then set the conditions that trigger the appearance of the +action button on the right-side panel when selecting a file. + +There are three basic types of conditions you can set: + +1. {guilabel}`Tags`: you can use the {guilabel}`Contains` and {guilabel}`Does not contain` + conditions, meaning the files *must have* or *must not have* the tags set here; +2. {guilabel}`Contact`: the files must be associated with the contact set here; +3. {guilabel}`Owner`: the files must be associated with the owner set here. + +```{image} documents/basic-condition-example.png +:alt: Example of a workflow action's basic condition in Odoo Documents +``` + +:::{tip} +If you do not set any conditions, the action button appears for all files inside the selected +workspace. +::: + +#### Advanced condition type: domain + +:::{important} +It is recommended to have some knowledge of Odoo development to configure *Domain* filters +properly. +::: + +The {ref}`developer mode ` needs to be activated to enable the {guilabel}`Domain` +{guilabel}`Condition type`. Once done, click {guilabel}`New Rule`. + +To create a rule, you typically select a {guilabel}`field`, an {guilabel}`operator`, and a +{guilabel}`value`. For example, if you want to add a workflow action to all the PDF files inside a +workspace, set the {guilabel}`field` to *Mime Type*, the {guilabel}`operator` to *contains*, and the +pdf {guilabel}`value`. + +```{image} documents/domain-condition-example.png +:alt: Example of a workflow action's domain condition in Odoo Documents +``` + +Click the {icon}`fa-plus` ({guilabel}`Add New Rule`) icon and the {icon}`fa-sitemap` +({guilabel}`Add branch`) icon to add conditions and sub-conditions. You can then specify if your +rule should match {guilabel}`all` or {guilabel}`any` conditions. You can also edit the rule directly +using the {guilabel}`Code editor`. + +### Configure the actions + +Go to the {guilabel}`Actions` section to set up your action. You can simultaneously: + +- **Move to Workspace**: move the file to any workspace; + +- **Create**: create one of the following items attached to the file in your database: + + - **Link to record**: create a link between a document and a record from a specific model; + - **Product template**: create a product you can edit directly; + - **Task**: create a Project task you can edit directly; + - **Signature PDF template**: create a new Sign template to send out; + - **PDF to sign**: create a Sign template to sign directly; + - **Applicant**: create a new HR application you can edit directly; + - **Vendor bill**: create a vendor bill using OCR and AI to scrape information from the file + content; + - **Customer invoice**: create an invoice using OCR and AI to scrape information from the file; + - **Vendor credit note**: create a vendor credit note using OCR and AI to scrape information + from the file; + - **Credit note**: create a customer credit note using OCR and AI to scrape information from the + file; + - **Miscellaneous Operations**: create an entry in the Miscellaneous Operations journal; + - **Bank Statement**: import a bank statement; + - **Purchase Receipt**: create a vendor receipt; + - **Expense**: create an HR expense. + +- **Set Contact**: add a contact to the file, or replace an existing contact with a new one; + +- **Set Owner**: add an owner to the file, or replace an existing owner with a new one; + +- **Set Tags**: add, remove, and replace any number of tags. + +To set up activities related to your actions, go to the {guilabel}`Activities` section: + +- **Activities - Mark all as Done**: mark all activities linked to the file as done; +- **Activities - Schedule Activity**: create a new activity linked to the file as configured in + the action. You can choose to set the activity on the document owner. + +## Digitize documents with AI and optical character recognition (OCR) + +Documents available in the Finance workspace can be digitized. Select the document to digitize, +click {guilabel}`Create Vendor Bill`, {guilabel}`Create Customer Invoice`, or +{guilabel}`Create Customer Credit Note`, and then click {guilabel}`Send for Digitization`. + +:::{seealso} +{doc}`AI-powered document digitization <../finance/accounting/vendor_bills/invoice_digitization>` +::: + diff --git a/content/applications/productivity/knowledge.md b/content/applications/productivity/knowledge.md new file mode 100644 index 000000000..4140362eb --- /dev/null +++ b/content/applications/productivity/knowledge.md @@ -0,0 +1,27 @@ +--- +hide-page-toc: true +show-content: true +show-toc: true +--- + +# 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. + +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. + +:::{seealso} +- [Knowledge product page](https://www.odoo.com/app/knowledge) +::: + +```{toctree} +:titlesonly: true + +knowledge/articles_editing +knowledge/management +knowledge/properties +``` + diff --git a/content/applications/productivity/knowledge/articles_editing.md b/content/applications/productivity/knowledge/articles_editing.md new file mode 100644 index 000000000..cc1ed4744 --- /dev/null +++ b/content/applications/productivity/knowledge/articles_editing.md @@ -0,0 +1,268 @@ +# Articles editing + +## Add and style content + +To start adding content, click anywhere on the page. Your cursor is automatically set to write the +article's first-level header. Once you are done writing the title, press **enter** on your keyboard +to move to the next line. + +```{image} articles_editing/ui.png +:align: center +:alt: knowledge's user interface +``` + +:::{tip} +Click {guilabel}`Untitled` on the left side of the top bar to automatically match your h1 +{dfn}`(First-level header)` title and the article's name. To change the name of your article +later, you must do it manually. To do so, click the name on the top bar and proceed to the +modification. +::: + +(knowledge-text-editor)= + +### Text editor + +To stylize the text using the text editor, select the text to format. + +Then, you can: + +- Change the style by clicking {guilabel}`Normal`. Doing so opens a dropdown menu with multiple + styles to choose from ({guilabel}`Normal, Code, Header 1 → Header 6, Quote`); + +- Format the text. Click {guilabel}`B` to put it in bold, {guilabel}`I` to put it in italic, + {guilabel}`U` to underline, and {guilabel}`S` to strikethrough; + +- Change the font color by clicking {guilabel}`A` or the background color by clicking the **pencil** + icon: + + - To choose from a predefined theme color, click {guilabel}`Theme` and select the desired color. + - To customize, click {guilabel}`Solid` and define a color using the wheel, by typing its hex + code, or its RGBA values. + - To use a gradient, click {guilabel}`Gradient`, choose a predefined gradient or click + {guilabel}`Custom` to create a personalized gradient. + +- To change the text's size, click the **size number** and select the desired size; + +- Click the **lists** icons to turn the paragraph into an unordered list, an ordered list, or a + checklist; + +- Click the **chain** icon to insert or edit an URL link. + +```{image} articles_editing/style-and-colors.png +:align: center +:alt: Text editor's toolbox +``` + +To format a whole paragraph, type `/` anywhere in the text. Doing so opens the **powerbox**, which +allows: + +- Changing a paragraph into lists (unordered, ordered, checklists). +- Changing a paragraph into a header (1 → 6), normal text, `code`, or *quotes*. + +### Cover pictures + +You can customize your article by adding a cover picture and an icon. Hover above the h1 title and +click {guilabel}`Add Cover`. A pop-up window opens to set a cover picture. + +If your database and your Unsplash account are associated, the cover picture is automatically +selected based on the article's name. To modify it, hover over the picture to make the buttons +appear, click {guilabel}`Change Cover`, and select another image. + +Retrieve images from different sources: + +- Search the **Unsplash** database. +- Enter a picture's **URL**. +- **Upload** an image from a computer. + +To remove the cover, hover over it to make the buttons appear and click {guilabel}`Remove Cover`. + +:::{note} +- To associate Unsplash with your database, please refer to + {doc}`/applications/general/integrations/unsplash`. +- The articles are responsive, and so are the cover pictures. As a result, the images cannot + be repositioned manually to fit a particular screen, as they automatically resize + depending on the device. +::: + +### Icons + +To add an icon, hover above the h1 title and click {guilabel}`Add Icon`. Doing this sets a random +emoji automatically. To change it, click it and select one from the emoji window. To remove it, +proceed equally and click the red-circled {guilabel}`x`. + +:::{note} +- The emoji is also displayed before the corresponding article in the side panel hierarchic tree. +- Click the emoji on the side panel to change it without opening the related article. +::: + +(knowledge-powerbox)= + +## Commands + +To use a command, type `/` and open the **powerbox**. Type the command's name or select from +multiple features to insert blocks, images, files, etc. Some of them, such as `/Image` or `/Article` +are common to all the apps, but others are inherent to the knowledge app and cannot be found or used +in any other application. + +### List of commands + +Commands are divided into multiple categories depending on their use. + +```{eval-rst} +.. tabs:: + .. tab:: Structure + + .. list-table:: + :widths: 20 80 + :header-rows: 1 + :stub-columns: 1 + + * - Command + - Use + * - :guilabel:`Bulleted list` + - Create a bulleted list. + * - :guilabel:`Numbered list` + - Create a list with numbering. + * - :guilabel:`Checklist` + - Track tasks with a checklist. + * - :guilabel:`Table` + - Insert a table. + * - :guilabel:`Separator` + - Insert an horizontal rule separator. + * - :guilabel:`Quote` + - Add a blockquote section. + * - :guilabel:`Code` + - Add a code section. + * - :guilabel:`2 columns` + - Convert into 2 columns. + * - :guilabel:`3 columns` + - Convert into 3 columns. + * - :guilabel:`4 columns` + - Convert into 4 columns. + + .. tab:: Format + + .. list-table:: + :widths: 20 80 + :header-rows: 1 + :stub-columns: 1 + + * - Command + - Use + * - :guilabel:`Heading 1` + - Big section heading. + * - :guilabel:`Heading 2` + - Medium section heading. + * - :guilabel:`Heading 3` + - Small section heading. + * - :guilabel:`Switch direction` + - Switch the text's direction. + * - :guilabel:`Text` + - Paragraph block. + + .. tab:: Media + + .. list-table:: + :widths: 20 80 + :header-rows: 1 + :stub-columns: 1 + + * - Command + - Use + * - :guilabel:`Image` + - Insert an image. + * - :guilabel:`Article` + - Link an article. + + .. tab:: Navigation + + .. list-table:: + :widths: 20 80 + :header-rows: 1 + :stub-columns: 1 + + * - Command + - Use + * - :guilabel:`Link` + - Add a link. + * - :guilabel:`Button` + - Add a button. + * - :guilabel:`Appointment` + - Add a specific appointment. + * - :guilabel:`Calendar` + - Schedule an appointment. + + .. tab:: Widget + + .. list-table:: + :widths: 20 80 + :header-rows: 1 + :stub-columns: 1 + + * - Command + - Use + * - :guilabel:`3 Stars` + - Insert a rating over 3 stars. + * - :guilabel:`5 Stars` + - Insert a rating over 5 stars. + + .. tab:: Knowledge + + .. list-table:: + :widths: 20 80 + :header-rows: 1 + :stub-columns: 1 + + * - Command + - Use + * - :guilabel:`Table of Content` + - Add a table of content with the article's headings. + * - :guilabel:`Index` + - Show the first level of nested articles. + * - :guilabel:`Outline` + - Show all nested articles. + * - :guilabel:`Item Kanban` + - Insert a kanban view of article items. + * - :guilabel:`Item List` + - Insert a list view of article items. + * - :guilabel:`File` + - Embed a file that can be downloaded. + * - :guilabel:`Template` + - Add a template section that can be inserted in messages, terms & conditions, or + description in other applications. + + .. tab:: Basic Blocks + + .. list-table:: + :widths: 20 80 + :header-rows: 1 + :stub-columns: 1 + + * - Command + - Use + * - :guilabel:`Signature` + - Insert your signature. +``` + +## Content from other apps + +Knowledge allows to retrieve content views from other applications. To do so, go to the targeted app +and create the desired view. Then, click {menuselection}`Favorite --> Insert view in article` and +select an article. The view is inserted at the bottom of the selected article. + +```{eval-rst} +.. example:: + To retrieve the view below, we created it by going to :menuselection:`Sales --> Graph icon --> + Pie Chart icon` and inserted it by clicking :menuselection:`Favorite --> Insert view in article` + and selecting the *Sales Playbook* article. + + .. image:: articles_editing/inserted-view.png + :align: center + :alt: article view from the Sales app +``` + +:::{important} +Users who do **not** have access to the view will **not** be able to access it in **Knowledge** +even though they have access to the article containing the view. +::: + diff --git a/content/applications/productivity/knowledge/management.md b/content/applications/productivity/knowledge/management.md new file mode 100644 index 000000000..1e1a16a8e --- /dev/null +++ b/content/applications/productivity/knowledge/management.md @@ -0,0 +1,110 @@ +# Articles management + +Managing articles effectively is key to maximizing the value of your knowledge resources, whether +working on a research project, studying for an exam, or building a knowledge database for your +business. Knowledge allows you to fully manage your articles, from +{ref}`creation ` to {ref}`removal `, through {ref}`sharing +` and {ref}`structure `. + +You can find most tools to manage articles by clicking the vertical ellipsis button ({guilabel}`⋮`) +at the right side of the top bar. From there, you can move, lock, delete, or duplicate an article. + +```{image} management/toolbox.png +:alt: Menu with tools for the management of articles +``` + +## Creation, sharing, and removal of articles + +(management-create)= + +### Creation + +To create articles, click the {guilabel}`+ New` button on the right side of the top bar or the +{guilabel}`+` button next to a category or another article. + +:::{tip} +Create private articles quickly with the Alt/Option + C keyboard shortcut. +::: + +(management-share)= + +### Sharing + +You can share articles with internal or external users. To do so, open the share menu by clicking +{guilabel}`Share` in the top-right menu of articles. + +#### Invite users + +To share articles with specific users (internal or external, such as a partner or a customer), click +{guilabel}`Invite`. This opens a pop-up window in which you can choose the {guilabel}`Permission` +{ref}`(i.e, access rights) ` and enter the {guilabel}`Recipients`' name or +email. + +You can also restrict a specific user from accessing the article by selecting {guilabel}`No access` +permission. + +```{image} management/invite.png +:alt: pop-up window to invite users to access a Knowledge article +``` + +#### Share online + +To share articles **online**, activate the {guilabel}`Share to web` button. Doing so generates a URL +link anyone can use to view the article. + +Additionally, the share menu displays the default permission for internal members along with all the +users who have been granted specific permission. + +```{image} management/share-menu.png +:alt: Sharing menu with URL for online sharing and the list of members. +``` + +(management-remove)= + +### Removal + +To remove an article, you can either **delete** it or **archive** it. + +To delete an article, open it and click the vertical ellipsis button {menuselection}`(⋮) --> +Delete`. The article is moved to the trash for 30 days before being permanently deleted. To restore +it, click {guilabel}`Open the Trash`, select the article, and click {guilabel}`Restore`. + +To archive articles, click {guilabel}`Search`, select the article(s), and click +{menuselection}`Action --> Archive --> Archive`. Archived articles are hidden from the search menu. +To retrieve an archived article, add a custom filter to display them ({menuselection}`Search --> +Filters --> Add Custom Filter`, and set {guilabel}`Active` as {guilabel}`is No`). Then, select the +article(s) and go to {menuselection}`Action --> Unarchive`. + +(management-structure)= + +## Structure of articles + +Articles are organized into a hierarchical structure wherein the article on top is a parent article, +and those underneath are called nested articles. This structure allows the grouping of related +articles. + +To establish this hierarchy, create new articles by clicking the {guilabel}`+` button next to the +parent-to-be article, or move existing articles by either dragging and dropping them under the +parent-to-be or by clicking the vertical ellipsis button ({guilabel}`⋮`), clicking {guilabel}`Move +To` on the toolbox and selecting the article to use as a parent. + +(management-categories)= + +### Categories + +Additionally, articles are divided into four categories that can be found on the left sidebar. These +categories give articles default **access rights**. + +- {guilabel}`Favorites`: You can set any article you can access as a favorite. To do so, click the + star-shaped icon ({guilabel}`★`) in the top-right menu of articles. Marking articles as + **favorites** is user-specific and does not affect other users. +- {guilabel}`Workspace`: Articles displayed in that category are available to all internal users. + These users have the right to read, modify or share these articles. +- {guilabel}`Shared`: Articles displayed in that category are those you shared with internal users, + external users, or shared with you. +- {guilabel}`Private`: Articles displayed in that category are only available to you. + +```{image} management/left-sidebar-cat.png +:alt: Categories displayed in the left sidebar of Odoo Knowledge +``` + diff --git a/content/applications/productivity/knowledge/properties.md b/content/applications/productivity/knowledge/properties.md new file mode 100644 index 000000000..f87e80e09 --- /dev/null +++ b/content/applications/productivity/knowledge/properties.md @@ -0,0 +1,106 @@ +# 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: + +```{eval-rst} +.. 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 +``` + +```{eval-rst} +.. 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/sign.md b/content/applications/productivity/sign.md new file mode 100644 index 000000000..07bf7036c --- /dev/null +++ b/content/applications/productivity/sign.md @@ -0,0 +1,378 @@ +# Sign + +**Odoo Sign** allows you to send, sign, and approve documents online, using electronic signatures. + +An **electronic signature** shows a person's agreement to the content of a document. Just like a +handwritten signature, the electronic one represents a legal bounding by the terms of the signed +document. + +With Sign, you can upload any PDF file and add fields to it. These fields can be automatically +filled in with the user's details present in your database. + +:::{seealso} +- [Odoo Sign: product page](https://www.odoo.com/app/sign) +- [Odoo Tutorials: Sign [video]](https://www.odoo.com/slides/sign-61) +::: + +## Validity of electronic signatures + +Documents signed via the Sign app are valid electronic signatures in the European Union and the +United States of America. They also meet the requirements for electronic signatures in most +countries. The legal validity of electronic signatures generated by Odoo depends on your country's +legislation. Companies doing business abroad should also consider other countries' electronic +signature laws. + +:::{important} +The below information has no legal value; it is only provided for general informational purposes. +As laws governing electronic signatures rapidly evolve, we cannot guarantee that all information +is up-to-date. We advise contacting a local attorney for legal advice regarding electronic +signature compliance and validity. +::: + +### European Union + +The [eIDAS regulation](http://data.europa.eu/eli/reg/2014/910/oj) establishes the framework for +electronic signatures in the [27 member states of the European Union](https://europa.eu/european-union/about-eu/countries_en). It distinguishes three types of +electronic signatures: + +1. Simple electronic signatures +2. Advanced electronic signatures +3. Qualified electronic signatures + +Odoo generates the first type, **simple electronic signatures**; these signatures are legally valid +in the EU, as stated in the eIDAS regulation. + +Electronic signatures may not be automatically recognized as valid. You may need to bring +supporting evidence of a signature's validity. While the Sign app provides a simple electronic +signature, some supporting evidence is automatically collected during the signature process, such +as: + +1. Email and SMS validation (if enabled) +2. Strong identity proof through itsme® (available in Belgium and the Netherlands) +3. Timestamped, IP and geographically traceable access logs to the documents and their associated + signatures +4. Document traceability and inalterability (any alteration made to a signed document is detected by + Odoo with the use of cryptographic proofs) + +:::{note} +{doc}`Documentation for Germany ` +::: + +### United States of America + +The [ESIGN Act (Electronic Signatures in Global and National Commerce Act)](https://www.fdic.gov/regulations/compliance/manual/10/X-3.1.pdf), at the interstate and +international levels, and the [UETA (Uniform Electronic Transactions Act)](https://www.uniformlaws.org/committees/community-home/librarydocuments?communitykey=2c04b76c-2b7d-4399-977e-d5876ba7e034&tab=librarydocuments), +at the state level, provide the legal framework for electronic signatures. Note that [Illinois](https://www.ilga.gov/legislation/ilcs/ilcs5.asp?ActID=89&) and [New York](https://its.ny.gov/electronic-signatures-and-records-act-esra) have not adopted the UETA, but +similar acts instead. + +Overall, to be recognized as valid, electronic signatures have to meet five criteria: + +1. The signer must show a clear **intent to sign**. For example, using a mouse to draw a signature + can show intent. The signer must also have the option to opt out of the electronic document. +2. The signer must first express or imply their **consent to conduct business electronically**. +3. **The signature must be clearly attributed**. In Odoo, metadata, such as the signer's IP address, + is added to the signature, which can be used as supporting evidence. +4. **The signature must be associated with the signed document**, for example, by keeping a record + detailing how the signature was captured. +5. Electronically signed documents need to be **retained and stored** by all parties involved; for + example, by providing the signer either a fully-executed copy or the possibility to download a + copy. + +### Other countries + +- {doc}`Algeria ` +- {doc}`Angola ` +- {doc}`Argentina ` +- {doc}`Australia ` +- {doc}`Azerbaijan ` +- {doc}`Bangladesh ` +- {doc}`Brazil ` +- {doc}`Canada ` +- {doc}`Chile ` +- {doc}`China ` +- {doc}`Colombia ` +- {doc}`Dominican Republic ` +- {doc}`Ecuador ` +- {doc}`Egypt ` +- {doc}`Ethiopia ` +- {doc}`Guatemala ` +- {doc}`Hong Kong ` +- {doc}`India ` +- {doc}`Indonesia ` +- {doc}`Iran ` +- {doc}`Iraq ` +- {doc}`Israel ` +- {doc}`Japan ` +- {doc}`Kazakhstan ` +- {doc}`Kenya ` +- {doc}`Kuwait ` +- {doc}`Malaysia ` +- {doc}`Mexico ` +- {doc}`Morocco ` +- {doc}`New Zealand ` +- {doc}`Nigeria ` +- {doc}`Norway ` +- {doc}`Oman ` +- {doc}`Pakistan ` +- {doc}`Peru ` +- {doc}`Philippines ` +- {doc}`Qatar ` +- {doc}`Russia ` +- {doc}`Saudi Arabia ` +- {doc}`Singapore ` +- {doc}`South Africa ` +- {doc}`South Korea ` +- {doc}`Switzerland ` +- {doc}`Thailand ` +- {doc}`Turkey ` +- {doc}`Ukraine ` +- {doc}`United Arab Emirates ` +- {doc}`United Kingdom ` +- {doc}`Uzbekistan ` +- {doc}`Vietnam ` + +## Send a document to sign + +### One-time signature + +You can click {guilabel}`Upload a PDF to sign` from your dashboard for a one-time signature. Select +your document, open it, and drag and drop the required {ref}`fields ` in your document. +You can modify the {ref}`role ` assigned to a field by clicking on it and selecting the +one you want. + +When ready, click {guilabel}`Send`, and fill in the required fields. Once sent, your document +remains available. Go to {menuselection}`Documents --> All Documents` to see your document +and the status of the signatures. + +```{image} sign/signature-status.png +:alt: Signature status +``` + +#### Validity dates and reminders + +You can set **validity dates** on limited-duration agreement documents or send **automatic email +reminders** to obtain signatures on time. From your dashboard, click {guilabel}`Send` on your +document. On the new page, go to the {guilabel}`Options` section, fill in the +{guilabel}`Valid Until` field, toggle the {guilabel}`Reminder` switch, and click the value to edit +the default number of days between reminders. + +```{image} sign/reminder.png +:alt: Set the number of days between reminders +``` + +### Templates + +You can create document templates when you have to send the same document several times. From your +dashboard, click {guilabel}`Upload a PDF template`. Select the document and add the required +{ref}`fields `. You can modify the {ref}`role ` of a field by clicking on it +and selecting the one you want. + +Click {guilabel}`Template Properties` to add {guilabel}`Tags` to your template, define a +{guilabel}`Signed Document Workspace`, add {guilabel}`Signed Document Tags`, set a +{guilabel}`Redirect Link` that will be available in the signature confirmation message received +after the signature, or define {guilabel}`Authorized Users` if you want to restrict the use of your +template to specific authorized users or groups. + +Your templates are visible by default on your dashboard. You can click {guilabel}`Send` to quickly +send a document template to a signer or {guilabel}`Sign Now` if you are ready to sign your document +immediately. + +:::{tip} +You can **create a template from a document that was previously sent**. To do so, go to +{menuselection}`Documents --> All Documents`. On the document you want to retrieve, click on the +the vertical ellipsis ({guilabel}`⋮`), then {guilabel}`Template`. Click on the vertical ellipsis +({guilabel}`⋮`) again, then {guilabel}`Restore`. Your document now appears on your dashboard next +to your other templates. +::: + +(sign-role)= + +## Roles + +Each field in a Sign document is related to a role corresponding to a specific person. When a +document is being signed, the person assigned to the role must fill in their assigned fields and +sign it. + +Roles are available by going to {menuselection}`Sign --> Configuration --> Roles`. + +It is possible to update existing roles or to create new roles by clicking on {guilabel}`New`. +Choose a {guilabel}`Role Name`, add an {guilabel}`Extra Authentication Step` to confirm the +identity of the signing person, and if the document can be reassigned to another contact, select +{guilabel}`Change Authorized` for the role. A {guilabel}`Color` can also be chosen for the role. +This color can help understand which roles are responsible for which field when configuring a +template. + +### Secured identification + +As the owner of a document, you may request an {guilabel}`Extra Authentication Step` through +{ref}`SMS verification ` or via {ref}`Itsme® ` (available in Belgium and the +Netherlands). Both authentication options require {ref}`credits `. If you do not +have any credits left, the authentication steps will be skipped. + +:::{seealso} +- {doc}`In-App Purchase (IAP) <../essentials/in_app_purchase>` +- {doc}`SMS pricing and FAQ <../marketing/sms_marketing/pricing_and_faq>` +::: + +(sign-sms)= + +#### SMS verification + +Go to {menuselection}`Sign --> Configuration --> Roles`. Click in the {guilabel}`Extra +Authentication Step` column for the role, and select {guilabel}`Unique Code Via SMS`. + +:::{note} +Before being able to send SMS Text Messages, you need to register your phone number. To do so, go +to {menuselection}`Sign --> Configuration --> Settings` and click {guilabel}`Buy credits` under +{guilabel}`Authenticate by SMS`. +::: + +Go to the document to sign, add the field for which the SMS verification is required, for example, +the {guilabel}`Signature` field, and click {guilabel}`Send`. On the new page, select the +{guilabel}`customer` and click {guilabel}`Send`. + +The person signing the document fills in the {guilabel}`Signature` field, then {guilabel}`Sign`, and +clicks {guilabel}`Validate & Send Completed Document`. A {guilabel}`Final Validation` page pops up +where to add their phone number. One-time codes are sent by SMS. + +```{image} sign/sms-verification.png +:alt: Add a hash to your document +``` + +:::{note} +- This feature is enabled by default. +- As soon as the {guilabel}`Extra Authentication Step` applies to a role, this validation step is + requested for any field assigned to this role. +::: + +(sign-itsme)= + +#### Itsme® + +Itsme® authentication can be used to allow signatories to provide their identity using itsme®. This +feature is only available in **Belgium** and the **Netherlands**. + +The feature can be enabled in {guilabel}`Sign Settings` and applies automatically to the +{guilabel}`Customer (identified with itsme®)` role. To enable it for other roles, go to +{menuselection}`Sign --> Configuration --> Roles`. Click in the {guilabel}`Extra Authentication +Step` column for the role, and select {guilabel}`Via itsme®`. + +Go to the document that needs to be signed and add the {guilabel}`Signature` field. Switch to any +role configured to use the feature, and click {guilabel}`Validate` and {guilabel}`Send`. + +```{image} sign/itsme-identification.png +:alt: "select customer identified with itsme\xAE" +``` + +Upon signing the document, the signer completes the {guilabel}`Signature` field and proceeds by +clicking on {guilabel}`Validate & Send Completed Document`, triggering a +{guilabel}`Final verification` page where authentication via itsme® is required. + +## Signatory hash + +Each time someone signs a document, a **hash** - a unique digital signature of the operation - is +generated to ensure traceability, integrity, and inalterability. This process guarantees that any +changes made after a signature is affixed can be easily detected, maintaining the document's +authenticity and security throughout its lifecycle. + +A visual security frame displaying the beginning of the hash is added to the signatures. Internal +users can hide or show it by turning the {guilabel}`Frame` option on or off when signing the +document. + +```{image} sign/sign-hash.png +:alt: Adding the visual security frame to a signature. +``` + +(sign-field-types)= + +## Tags + +Tags can be used to categorize and organize documents, allowing users to quickly search for and +filter documents based on specific criteria. + +You can manage tags by going to {menuselection}`Configuration --> Tags`. To create a tag, click +{guilabel}`New`. On the new line, add the {guilabel}`Tag Name` and select a {guilabel}`Color Index` +for your tag. + +To apply a tag to a document, use the dropdown list available in your document. + +:::{note} +You can modify the tags of a signed document by going to {menuselection}`Documents --> All +Documents`, clicking the vertical ellipsis ({guilabel}`⋮`) on your document, then +{guilabel}`Details`, and modifying your {guilabel}`Tags`. +::: + +## Sign order + +When a document needs to be signed by different parties, the signing order lets you control the +order in which your recipients receive it for signature. + +After uploading a PDF with at least two signature fields with two different roles and clicking +{guilabel}`Send`, toggle the {guilabel}`Specify Signing Order` switch and search for the signer's +name or email information to add them. You can decide on the signing order by typing **1** or **2** +in the first column. + +```{image} sign/specify-signing-order.png +:alt: Toggle the switch to specify the signing order. +``` + +Each recipient receives the signature request notification only once the previous recipient has +completed their action. + +(sign-fields)= + +## Field types + +Fields are used in a document to indicate what information must be completed by the signers. You can +add fields to your document simply by dragging and dropping them for the left column into your +document. + +Various field types can be used to sign documents (placeholder, autocompletion, etc.). By +configuring your own field types, also known as signature item types, the signing process can be +even faster for your customers, partners, and employees. + +To create and edit field types, go to {menuselection}`Sign --> Configuration --> Settings --> +Edit field types`. + +You can select an existing field by clicking on it, or you can {guilabel}`Create` a new one. First, +edit the {guilabel}`Field Name`. Then, select a {guilabel}`Field Type`: + +- {guilabel}`Signature`: users are asked to enter their signature either by drawing it, generating + an automatic one based on their name, or uploading a local file (usually an image). + Each subsequent {guilabel}`Signature` field type then reuses the data entered in the first field. +- {guilabel}`Initial`: users are asked to enter their initials, in a similar way to the + {guilabel}`Signature` field. +- {guilabel}`Text`: users enter text on a single line. +- {guilabel}`Multiline Text`: users enter text on multiple lines. +- {guilabel}`Checkbox`: users can tick a box (e.g., to mark their approval or consent). +- {guilabel}`Selection`: users choose a single option from a variety of options. + +The {guilabel}`Auto-fill Partner Field` setting is used to automatically fill in a field during the +signature process. It uses the value of one of the fields on the contact (`res.partner`) model of +the person signing the document. To do so, enter the contact model field's technical name. + +:::{tip} +To know the technical name of a field, enable developer mode and hover your mouse on the question +mark next to the field. +::: + +:::{note} +Auto-completed values are suggestions and can be modified as required by the person signing the +document. +::: + +The size of the fields can also be changed by editing the {guilabel}`Default Width` and +{guilabel}`Default Height`. Both sizes are defined as a percentage of the full page expressed as a +decimal, with 1 equalling the full page's width or height. By default, the width of new fields you +create is set to 15% (0.150) of a full page's width, while their height is set to 1.5% (0.015) of a +full page's height. + +Next, write a {guilabel}`Tip`. Tips are displayed inside arrows on the left-hand side of the user's +screen during the signing process to help them understand what the step entails (e.g., "Sign here" +or “Fill in your birthdate”). You can also use a {guilabel}`Placeholder` text to be displayed inside +the field before it is completed. + +```{image} sign/tip-placeholder.png +:alt: Tip and placeholder example in Odoo Sign +``` + diff --git a/content/applications/productivity/sign/algeria.md b/content/applications/productivity/sign/algeria.md new file mode 100644 index 000000000..2156fd836 --- /dev/null +++ b/content/applications/productivity/sign/algeria.md @@ -0,0 +1,69 @@ +--- +orphan: true +--- + +# Odoo Sign legality in Algeria + +{doc}`Odoo Sign <../sign>` is your trusted partner for secure, efficient, and legally compliant +electronic signatures in Algeria. + +## Legal framework for electronic signatures in Algeria + +In Algeria, electronic signatures are regulated under the [Civil Code](https://www.wipo.int/wipolex/en/legislation/details/14774) and the Law 15 04 of Electronic +Signature. The law establishes the legal basis for acknowledging electronic records, contracts, and +digital signatures. The key points of the law include: + +- **Legal recognition**: electronic signatures are legally equivalent to handwritten signatures if + they meet certain criteria. +- **Reliability and security**: electronic signatures must be created with a secure method that can + reliably identify the signatory and ensure the integrity of the signed document. +- **Qualified electronic signature**: digital signature generated using a digital certificate + supplied by a qualified provider. + +## How Odoo Sign complies with Algerian regulations + +Odoo Sign ensures full compliance with the Electronic Signature Law of Algeria by incorporating the +following features: + +- **Secure signature creation**: Odoo Sign utilizes advanced cryptographic techniques to ensure the + authenticity and integrity of electronic signatures. +- **Third-party signature authenticator**: Odoo Online serves as an independent validation mechanism + that adds an extra layer of security to the procurement process. +- **Audit trails**: detailed audit logs are maintained to provide evidence of the signing process, + including timestamps, IP addresses, and identity verification. +- **Cryptographic traceability and immutability**: Odoo Sign ensures that any operation is logged + securely. An audit log provides full transparency to all parties while preserving private data. +- **Multiple authentication means**: authentication by SMS, email, geoIP or handwritten electronic + signature. + +## Types of documents you can sign with Odoo Sign + +Odoo Sign is versatile and can be used for a wide range of documents, including but not limited to: + +- **Contracts and agreements**: business contracts, employment agreements, and service contracts. +- **Financial documents**: loan agreements, investment documents, and financial reports. +- **HR documents**: employee onboarding forms, non-disclosure agreements (NDAs), and performance + reviews. +- **Commercial transactions**: purchase orders, sales agreements, and supplier contracts. + +## Potential exceptions + +While Odoo Sign is broadly applicable, there are certain exceptions where electronic signatures may +not be suitable or legally recognized in Algeria: + +- **Wills and trusts**: documents related to inheritance, wills, and trusts often require + handwritten signatures. +- **Real estate transactions**: some property transactions may still require notarized handwritten + signatures. +- **Government forms**: specific government forms and applications may mandate physical signatures. + +:::{admonition} Disclaimer +The information provided on this page is for general informational purposes only and does not +constitute legal advice. While Odoo Sign complies with the Electronic Signature Law of Algeria, +users should consult with legal professionals to ensure specific document types and use cases +meet all legal requirements. Compliance with additional industry-specific regulations may also be +necessary. +::: + +*Last updated: June 21, 2024* + diff --git a/content/applications/productivity/sign/angola.md b/content/applications/productivity/sign/angola.md new file mode 100644 index 000000000..197a2583c --- /dev/null +++ b/content/applications/productivity/sign/angola.md @@ -0,0 +1,72 @@ +--- +orphan: true +--- + +# Odoo Sign legality in Angola + +{doc}`Odoo Sign <../sign>` is your trusted partner for secure, efficient, and legally compliant +electronic signatures in Angola. + +## Legal framework for electronic signatures in Angola + +In Angola, electronic signatures are regulated under the Presidential Decree 312/2018 and Executive +Order 74/2019. The law establishes the legal basis for acknowledging electronic records, contracts, +and digital signatures. The key points of the law include: + +- **Legal recognition**: electronic signatures are legally equivalent to handwritten signatures if + they meet certain criteria. +- **Reliability and security**: electronic signatures must be created with a secure method that can + reliably identify the signatory and ensure the integrity of the signed document. +- **Certified electronic signature**: digital signature generated using a digital certificate + supplied by a qualified provider. In some cases, only the certified electronic signature has legal + and juridical validity in Angola. In those cases, simple electronic signatures like the Odoo + Signature only work as a proof of the agreement to celebrate the corresponding transaction, which + will be submitted to the authority's criteria. + +## How Odoo Sign complies with Angolan regulations + +Odoo Sign ensures full compliance with the Electronic Signature Law of Angola by incorporating the +following features: + +- **Secure signature creation**: Odoo Sign utilizes advanced cryptographic techniques to ensure the + authenticity and integrity of electronic signatures. +- **Third-party signature authenticator**: Odoo Online serves as an independent validation mechanism + that adds an extra layer of security to the procurement process. +- **Audit trails**: detailed audit logs are maintained to provide evidence of the signing process, + including timestamps, IP addresses, and identity verification. +- **Cryptographic traceability and immutability**: Odoo Sign ensures that any operation is logged + securely. An audit log provides full transparency to all parties while preserving private data. +- **Multiple authentication means**: authentication by SMS, email, geoIP or handwritten electronic + signature. + +## Types of documents you can sign with Odoo Sign + +Odoo Sign is versatile and can be used for a wide range of documents, including but not limited to: + +- **Contracts and agreements**: business contracts, employment agreements, and service contracts. +- **Financial documents**: loan agreements, investment documents, and financial reports. +- **HR documents**: employee onboarding forms, non-disclosure agreements (NDAs), and performance + reviews. +- **Commercial transactions**: purchase orders, sales agreements, and supplier contracts. + +## Potential exceptions + +While Odoo Sign is broadly applicable, there are certain exceptions where electronic signatures may +not be suitable or legally recognized in Angola: + +- **Wills and trusts**: documents related to inheritance, wills, and trusts often require + handwritten signatures. +- **Real estate transactions**: some property transactions may still require notarized handwritten + signatures. +- **Government forms**: specific government forms and applications may mandate physical signatures. + +:::{admonition} Disclaimer +The information provided on this page is for general informational purposes only and does not +constitute legal advice. While Odoo Sign complies with the Electronic Signature Law of Angola, +users should consult with legal professionals to ensure specific document types and use cases +meet all legal requirements. Compliance with additional industry-specific regulations may also be +necessary. +::: + +*Last updated: June 21, 2024* + diff --git a/content/applications/productivity/sign/argentina.md b/content/applications/productivity/sign/argentina.md new file mode 100644 index 000000000..98972dfc1 --- /dev/null +++ b/content/applications/productivity/sign/argentina.md @@ -0,0 +1,70 @@ +--- +orphan: true +--- + +# Odoo Sign legality in Argentina + +{doc}`Odoo Sign <../sign>` is your trusted partner for secure, efficient, and legally compliant +electronic signatures in Argentina. + +## Legal framework for electronic signatures in Argentina + +In Argentina, electronic signatures are regulated under the [Digital Signature Law](https://www.argentina.gob.ar/normativa/nacional/70749/actualizacion), and the [Civil and +Commercial Code](https://www.wipo.int/wipolex/en/legislation/details/19085). The law governs +transactions performed through electronic means and the use of electronic signatures. The key points +of the law include: + +- **Legal recognition**: electronic signatures are legally equivalent to handwritten signatures if + they meet certain criteria. +- **Reliability and security**: electronic signatures must be created with a secure method that can + reliably identify the signatory and ensure the integrity of the signed document. +- **Qualified digital signatures**: the law recognizes electronic signatures supported by digital + certificates issued by accredited Certification Service Providers. + +## How Odoo Sign complies with Argentinian regulations + +Odoo Sign ensures full compliance with the Electronic Signature Law of Argentina by incorporating +the following features: + +- **Secure signature creation**: Odoo Sign utilizes advanced cryptographic techniques to ensure the + authenticity and integrity of electronic signatures. +- **Third-party signature authenticator**: Odoo Online serves as an independent validation mechanism + that adds an extra layer of security to the procurement process. +- **Audit trails**: detailed audit logs are maintained to provide evidence of the signing process, + including timestamps, IP addresses, and identity verification. +- **Cryptographic traceability and immutability**: Odoo Sign ensures that any operation is logged + securely. An audit log provides full transparency to all parties while preserving private data. +- **Multiple authentication means**: authentication by SMS, email, geoIP or handwritten electronic + signature. + +## Types of documents you can sign with Odoo Sign + +Odoo Sign is versatile and can be used for a wide range of documents, including but not limited to: + +- **Contracts and agreements**: business contracts, employment agreements, and service contracts. +- **Financial documents**: loan agreements, investment documents, and financial reports. +- **HR documents**: employee onboarding forms, non-disclosure agreements (NDAs), and performance + reviews. +- **Commercial transactions**: purchase orders, sales agreements, and supplier contracts. + +## Potential exceptions + +While Odoo Sign is broadly applicable, there are certain exceptions where electronic signatures may +not be suitable or legally recognized in Argentina: + +- **Wills and trusts**: documents related to inheritance, wills, and trusts often require + handwritten signatures. +- **Real estate transactions**: some property transactions may still require notarized handwritten + signatures. +- **Government forms**: specific government forms and applications may mandate physical signatures. + +:::{admonition} Disclaimer +The information provided on this page is for general informational purposes only and does not +constitute legal advice. While Odoo Sign complies with the Electronic Signature Law of Argentina, +users should consult with legal professionals to ensure specific document types and use cases +meet all legal requirements. Compliance with additional industry-specific regulations may also be +necessary. +::: + +*Last updated: June 21, 2024* + diff --git a/content/applications/productivity/sign/australia.md b/content/applications/productivity/sign/australia.md new file mode 100644 index 000000000..daee4a5a0 --- /dev/null +++ b/content/applications/productivity/sign/australia.md @@ -0,0 +1,68 @@ +--- +orphan: true +--- + +# Odoo Sign legality in Australia + +{doc}`Odoo Sign <../sign>` is your trusted partner for secure, efficient, and legally compliant +electronic signatures in Australia. + +## Legal framework for electronic signatures in Australia + +In Australia, electronic signatures are regulated under the [Electronic Transactions Act (ETA)](https://www.legislation.gov.au/C2004A00553/latest/text), the [Electronic Transactions Regulations +(ETR)](https://www.legislation.wa.gov.au/legislation/prod/filestore.nsf/FileURL/mrdoc_23907.pdf/$FILE/Electronic%20Transactions%20Regulations%202012%20-%20%5B00-a0-04%5D.pdf?OpenElement) +and local regulations in each state. The law governs transactions performed through electronic means +and the use of electronic signatures. The key points of the law include: + +- **Legal recognition**: electronic signatures are legally equivalent to handwritten signatures if + they meet certain criteria. +- **Reliability and security**: electronic signatures must be created with a secure method that can + reliably identify the signatory and ensure the integrity of the signed document. + +## How Odoo Sign complies with Australian regulations + +Odoo Sign ensures full compliance with the Electronic Signature Law of Australia by incorporating +the following features: + +- **Secure signature creation**: Odoo Sign utilizes advanced cryptographic techniques to ensure the + authenticity and integrity of electronic signatures. +- **Third-party signature authenticator**: Odoo Online serves as an independent validation mechanism + that adds an extra layer of security to the procurement process. +- **Audit trails**: detailed audit logs are maintained to provide evidence of the signing process, + including timestamps, IP addresses, and identity verification. +- **Cryptographic traceability and immutability**: Odoo Sign ensures that any operation is logged + securely. An audit log provides full transparency to all parties while preserving private data. +- **Multiple authentication means**: authentication by SMS, email, geoIP or handwritten electronic + signature. + +## Types of documents you can sign with Odoo Sign + +Odoo Sign is versatile and can be used for a wide range of documents, including but not limited to: + +- **Contracts and agreements**: business contracts, employment agreements, and service contracts. +- **Financial documents**: loan agreements, investment documents, and financial reports. +- **HR documents**: employee onboarding forms, non-disclosure agreements (NDAs), and performance + reviews. +- **Commercial transactions**: purchase orders, sales agreements, and supplier contracts. + +## Potential exceptions + +While Odoo Sign is broadly applicable, there are certain exceptions where electronic signatures may +not be suitable or legally recognized in Australia: + +- **Wills and trusts**: documents related to inheritance, wills, and trusts often require + handwritten signatures. +- **Real estate transactions**: some property transactions may still require notarized handwritten + signatures. +- **Government forms**: specific government forms and applications may mandate physical signatures. + +:::{admonition} Disclaimer +The information provided on this page is for general informational purposes only and does not +constitute legal advice. While Odoo Sign complies with the Electronic Signature Law of Australia, +users should consult with legal professionals to ensure specific document types and use cases +meet all legal requirements. Compliance with additional industry-specific regulations may also be +necessary. +::: + +*Last updated: June 19, 2024* + diff --git a/content/applications/productivity/sign/azerbaijan.md b/content/applications/productivity/sign/azerbaijan.md new file mode 100644 index 000000000..1e4415cb4 --- /dev/null +++ b/content/applications/productivity/sign/azerbaijan.md @@ -0,0 +1,69 @@ +--- +orphan: true +--- + +# Odoo Sign legality in Azerbaijan + +{doc}`Odoo Sign <../sign>` is your trusted partner for secure, efficient, and legally compliant +electronic signatures in Azerbaijan. + +## Legal framework for electronic signatures in Azerbaijan + +In Azerbaijan, electronic signatures are regulated under the [Law on Electronic Digital Signature](https://cis-legislation.com/document.fwx?rgn=144357). The law establishes the legal basis for +acknowledging electronic records, contracts, and digital signatures. The key points of the law +include: + +- **Legal recognition**: electronic signatures are legally equivalent to handwritten signatures if + they meet certain criteria. +- **Reliability and security**: electronic signatures must be created with a secure method that can + reliably identify the signatory and ensure the integrity of the signed document. +- **Digital signature certificate**: digital signature generated using a digital certificate + supplied by a qualified provider. + +## How Odoo Sign complies with Azerbaijani regulations + +Odoo Sign ensures full compliance with the Electronic Signature Law of Azerbaijan by incorporating +the following features: + +- **Secure signature creation**: Odoo Sign utilizes advanced cryptographic techniques to ensure the + authenticity and integrity of electronic signatures. +- **Third-party signature authenticator**: Odoo Online serves as an independent validation mechanism + that adds an extra layer of security to the procurement process. +- **Audit trails**: detailed audit logs are maintained to provide evidence of the signing process, + including timestamps, IP addresses, and identity verification. +- **Cryptographic traceability and immutability**: Odoo Sign ensures that any operation is logged + securely. An audit log provides full transparency to all parties while preserving private data. +- **Multiple authentication means**: authentication by SMS, email, geoIP or handwritten electronic + signature. + +## Types of documents you can sign with Odoo Sign + +Odoo Sign is versatile and can be used for a wide range of documents, including but not limited to: + +- **Contracts and agreements**: business contracts, employment agreements, and service contracts. +- **Financial documents**: loan agreements, investment documents, and financial reports. +- **HR documents**: employee onboarding forms, non-disclosure agreements (NDAs), and performance + reviews. +- **Commercial transactions**: purchase orders, sales agreements, and supplier contracts. + +## Potential exceptions + +While Odoo Sign is broadly applicable, there are certain exceptions where electronic signatures may +not be suitable or legally recognized in Azerbaijan: + +- **Wills and trusts**: documents related to inheritance, wills, and trusts often require + handwritten signatures. +- **Real estate transactions**: some property transactions may still require notarized handwritten + signatures. +- **Government forms**: specific government forms and applications may mandate physical signatures. + +:::{admonition} Disclaimer +The information provided on this page is for general informational purposes only and does not +constitute legal advice. While Odoo Sign complies with the Electronic Signature Law of +Azerbaijan, users should consult with legal professionals to ensure specific document types and +use cases meet all legal requirements. Compliance with additional industry-specific regulations +may also be necessary. +::: + +*Last updated: June 21, 2024* + diff --git a/content/applications/productivity/sign/bangladesh.md b/content/applications/productivity/sign/bangladesh.md new file mode 100644 index 000000000..2963508db --- /dev/null +++ b/content/applications/productivity/sign/bangladesh.md @@ -0,0 +1,70 @@ +--- +orphan: true +--- + +# Odoo Sign legality in Bangladesh + +{doc}`Odoo Sign <../sign>` is your trusted partner for secure, efficient, and legally compliant +electronic signatures in Bangladesh. + +## Legal framework for electronic signatures in Bangladesh + +In Bangladesh, electronic signatures are regulated under the [Information and Communication +Technology Act](https://samsn.ifj.org/wp-content/uploads/2015/07/Bangladesh-ICT-Act-2006.pdf). The +law recognizes the use of electronic documents and electronic signatures for the execution of +contracts and other transactions. The key points of the law include: + +- **Legal recognition**: electronic signatures are legally equivalent to handwritten signatures if + they meet certain criteria. +- **Reliability and security**: electronic signatures must be created with a secure method that can + reliably identify the signatory and ensure the integrity of the signed document. +- **Special cases**: some cases require a traditional signature. These requirements can vary on a + case-by-case basis, particularly when dealing with public sector entities. + +## How Odoo Sign complies with Bangladeshi regulations + +Odoo Sign ensures full compliance with the Electronic Signature Law of Bangladesh by incorporating +the following features: + +- **Secure signature creation**: Odoo Sign utilizes advanced cryptographic techniques to ensure the + authenticity and integrity of electronic signatures. +- **Third-party signature authenticator**: Odoo Online serves as an independent validation mechanism + that adds an extra layer of security to the procurement process. +- **Audit trails**: detailed audit logs are maintained to provide evidence of the signing process, + including timestamps, IP addresses, and identity verification. +- **Cryptographic traceability and immutability**: Odoo Sign ensures that any operation is logged + securely. An audit log provides full transparency to all parties while preserving private data. +- **Multiple authentication means**: authentication by SMS, email, geoIP or handwritten electronic + signature. + +## Types of documents you can sign with Odoo Sign + +Odoo Sign is versatile and can be used for a wide range of documents, including but not limited to: + +- **Contracts and agreements**: business contracts, employment agreements, and service contracts. +- **Financial documents**: loan agreements, investment documents, and financial reports. +- **HR documents**: employee onboarding forms, non-disclosure agreements (NDAs), and performance + reviews. +- **Commercial transactions**: purchase orders, sales agreements, and supplier contracts. + +## Potential exceptions + +While Odoo Sign is broadly applicable, there are certain exceptions where electronic signatures may +not be suitable or legally recognized in Bangladesh: + +- **Wills and trusts**: documents related to inheritance, wills, and trusts often require + handwritten signatures. +- **Real estate transactions**: some property transactions may still require notarized handwritten + signatures. +- **Government forms**: specific government forms and applications may mandate physical signatures. + +:::{admonition} Disclaimer +The information provided on this page is for general informational purposes only and does not +constitute legal advice. While Odoo Sign complies with the Electronic Signature Law of +Bangladesh, users should consult with legal professionals to ensure specific document types and +use cases meet all legal requirements. Compliance with additional industry-specific regulations +may also be necessary. +::: + +*Last updated: June 21, 2024* + diff --git a/content/applications/productivity/sign/brazil.md b/content/applications/productivity/sign/brazil.md new file mode 100644 index 000000000..68a1421ed --- /dev/null +++ b/content/applications/productivity/sign/brazil.md @@ -0,0 +1,74 @@ +--- +orphan: true +--- + +# Odoo Sign legality in Brazil + +{doc}`Odoo Sign <../sign>` is your trusted partner for secure, efficient, and legally compliant +electronic signatures in Brazil. + +## Legal framework for electronic signatures in Brazil + +In Brazil, electronic signatures are regulated under the [Brazilian Civil Code](https://webfiles-sc1.blackbaud.com/files/support/helpfiles/npoconnect-qa/content/resources/attachments/brazil-law-civil-code-13.777-2018.pdf) +and the Provisional Executive Act 2.200-2 (EA 2200) regulations. The law governs transactions +performed through electronic means and the use of electronic signatures. The key points of the law +include: + +- **Legal recognition**: electronic signatures are legally equivalent to handwritten signatures if + they meet certain criteria. +- **Reliability and security**: electronic signatures must be created with a secure method that can + reliably identify the signatory and ensure the integrity of the signed document. +- **Infraestrutura de Chaves Públicas Brasileira (ICP-Brazil)**: Brazil maintains its own public key + infrastructure (PKI) for digital certificates called “Infraestrutura de Chaves Públicas + Brasileira”. These are digital signature certificates or “seals” that serve as proof of identity + of an individual for a certain purpose that can be used in special cases to provide additional + security. These certificates are issued by Certification Authorities and are required by law for + the signature of specific acts. + +## How Odoo Sign complies with Brazilian regulations + +Odoo Sign ensures full compliance with the Electronic Signature Law of Brazil by incorporating the +following features: + +- **Secure signature creation**: Odoo Sign utilizes advanced cryptographic techniques to ensure the + authenticity and integrity of electronic signatures. +- **Third-party signature authenticator**: Odoo Online serves as an independent validation mechanism + that adds an extra layer of security to the procurement process. +- **Audit trails**: detailed audit logs are maintained to provide evidence of the signing process, + including timestamps, IP addresses, and identity verification. +- **Cryptographic traceability and immutability**: Odoo Sign ensures that any operation is logged + securely. An audit log provides full transparency to all parties while preserving private data. +- **Multiple authentication means**: authentication by SMS, email, geoIP or handwritten electronic + signature. + +## Types of documents you can sign with Odoo Sign + +Odoo Sign is versatile and can be used for a wide range of documents, including but not limited to: + +- **Contracts and agreements**: business contracts, employment agreements, and service contracts. +- **Financial documents**: loan agreements, investment documents, and financial reports. +- **HR documents**: employee onboarding forms, non-disclosure agreements (NDAs), and performance + reviews. +- **Commercial transactions**: purchase orders, sales agreements, and supplier contracts. + +## Potential exceptions + +While Odoo Sign is broadly applicable, there are certain exceptions where electronic signatures may +not be suitable or legally recognized in Brazil: + +- **Wills and trusts**: documents related to inheritance, wills, and trusts often require + handwritten signatures. +- **Real estate transactions**: some property transactions may still require notarized handwritten + signatures. +- **Government forms**: specific government forms and applications may mandate physical signatures. + +:::{admonition} Disclaimer +The information provided on this page is for general informational purposes only and does not +constitute legal advice. While Odoo Sign complies with the Electronic Signature Law of Brazil, +users should consult with legal professionals to ensure specific document types and use cases +meet all legal requirements. Compliance with additional industry-specific regulations may also be +necessary. +::: + +*Last updated: June 19, 2024* + diff --git a/content/applications/productivity/sign/canada.md b/content/applications/productivity/sign/canada.md new file mode 100644 index 000000000..99f0ffe1d --- /dev/null +++ b/content/applications/productivity/sign/canada.md @@ -0,0 +1,72 @@ +--- +orphan: true +--- + +# Odoo Sign legality in Canada + +{doc}`Odoo Sign <../sign>` is your trusted partner for secure, efficient, and legally compliant +electronic signatures in Canada. + +## Legal framework for electronic signatures in Canada + +In Canada, electronic signatures are regulated under the [Personal Information Protection and +Electronic Documents Act (PIPEDA)](https://laws-lois.justice.gc.ca/pdf/p-8.6.pdf) and local +regulations. The law establishes electronic equivalents to paper-based documents and signatures at +the federal level. The key points of the law include: + +- **Legal recognition**: electronic signatures are legally equivalent to handwritten signatures if + they meet certain criteria. +- **Reliability and security**: electronic signatures must be created with a secure method that can + reliably identify the signatory and ensure the integrity of the signed document. +- **Secure electronic signature**: the law recognizes digital signature certificates or “seals” that + serve as proof of identity of an individual for a certain purpose that can be used in special + cases to provide additional security. These certificates are issued by Certification Authorities + and are required by law for the signature of specific acts. + +## How Odoo Sign complies with Canadian regulations + +Odoo Sign ensures full compliance with the Electronic Signature Law of Canada by incorporating the +following features: + +- **Secure signature creation**: Odoo Sign utilizes advanced cryptographic techniques to ensure the + authenticity and integrity of electronic signatures. +- **Third-party signature authenticator**: Odoo Online serves as an independent validation mechanism + that adds an extra layer of security to the procurement process. +- **Audit trails**: detailed audit logs are maintained to provide evidence of the signing process, + including timestamps, IP addresses, and identity verification. +- **Cryptographic traceability and immutability**: Odoo Sign ensures that any operation is logged + securely. An audit log provides full transparency to all parties while preserving private data. +- **Multiple authentication means**: authentication by SMS, email, geoIP or handwritten electronic + signature. + +## Types of documents you can sign with Odoo Sign + +Odoo Sign is versatile and can be used for a wide range of documents, including but not limited to: + +- **Contracts and agreements**: business contracts, employment agreements, and service contracts. +- **Financial documents**: loan agreements, investment documents, and financial reports. +- **HR documents**: employee onboarding forms, non-disclosure agreements (NDAs), and performance + reviews. +- **Commercial transactions**: purchase orders, sales agreements, and supplier contracts. + +## Potential exceptions + +While Odoo Sign is broadly applicable, there are certain exceptions where electronic signatures may +not be suitable or legally recognized in Canada: + +- **Wills and trusts**: documents related to inheritance, wills, and trusts often require + handwritten signatures. +- **Real estate transactions**: some property transactions may still require notarized handwritten + signatures. +- **Government forms**: specific government forms and applications may mandate physical signatures. + +:::{admonition} Disclaimer +The information provided on this page is for general informational purposes only and does not +constitute legal advice. While Odoo Sign complies with the Electronic Signature Law of Canada, +users should consult with legal professionals to ensure specific document types and use cases +meet all legal requirements. Compliance with additional industry-specific regulations may also be +necessary. +::: + +*Last updated: June 19, 2024* + diff --git a/content/applications/productivity/sign/chile.md b/content/applications/productivity/sign/chile.md new file mode 100644 index 000000000..42b11d3ed --- /dev/null +++ b/content/applications/productivity/sign/chile.md @@ -0,0 +1,71 @@ +--- +orphan: true +--- + +# Odoo Sign legality in Chile + +{doc}`Odoo Sign <../sign>` is your trusted partner for secure, efficient, and legally compliant +electronic signatures in Chile. + +## Legal framework for electronic signatures in Chile + +In Chile, electronic signatures are regulated under the [Law 19.799 on electronic documents, +electronic signature and certification services of such signature](https://www.bcn.cl/leychile/navegar?idNorma=196640), [Decree 181/2002](https://www.bcn.cl/leychile/navegar?idNorma=201668) and [Law No. 21,180, on Digital +Transformation of the State](https://www.bcn.cl/leychile/navegar?idNorma=1138479&tipoVersion=0). +The law establishes the legal basis for acknowledging electronic records, contracts, and signatures. +The key points of the law include: + +- **Legal recognition**: electronic signatures are legally equivalent to handwritten signatures if + they meet certain criteria. +- **Reliability and security**: electronic signatures must be created with a secure method that can + reliably identify the signatory and ensure the integrity of the signed document. +- **Certified electronic signatures**: special electronic signature that incorporates certificates + issued by a recognized certification authority. + +## How Odoo Sign complies with Chilean regulations + +Odoo Sign ensures full compliance with the Electronic Signature Law of Chile by incorporating the +following features: + +- **Secure signature creation**: Odoo Sign utilizes advanced cryptographic techniques to ensure the + authenticity and integrity of electronic signatures. +- **Third-party signature authenticator**: Odoo Online serves as an independent validation mechanism + that adds an extra layer of security to the procurement process. +- **Audit trails**: detailed audit logs are maintained to provide evidence of the signing process, + including timestamps, IP addresses, and identity verification. +- **Cryptographic traceability and immutability**: Odoo Sign ensures that any operation is logged + securely. An audit log provides full transparency to all parties while preserving private data. +- **Multiple authentication means**: authentication by SMS, email, geoIP or handwritten electronic + signature. + +## Types of documents you can sign with Odoo Sign + +Odoo Sign is versatile and can be used for a wide range of documents, including but not limited to: + +- **Contracts and agreements**: business contracts, employment agreements, and service contracts. +- **Financial documents**: loan agreements, investment documents, and financial reports. +- **HR documents**: employee onboarding forms, non-disclosure agreements (NDAs), and performance + reviews. +- **Commercial transactions**: purchase orders, sales agreements, and supplier contracts. + +## Potential exceptions + +While Odoo Sign is broadly applicable, there are certain exceptions where electronic signatures may +not be suitable or legally recognized in Chile: + +- **Wills and trusts**: documents related to inheritance, wills, and trusts often require + handwritten signatures. +- **Real estate transactions**: some property transactions may still require notarized handwritten + signatures. +- **Government forms**: specific government forms and applications may mandate physical signatures. + +:::{admonition} Disclaimer +The information provided on this page is for general informational purposes only and does not +constitute legal advice. While Odoo Sign complies with the Electronic Signature Law of Chile, +users should consult with legal professionals to ensure specific document types and use cases +meet all legal requirements. Compliance with additional industry-specific regulations may also be +necessary. +::: + +*Last updated: June 21, 2024* + diff --git a/content/applications/productivity/sign/china.md b/content/applications/productivity/sign/china.md new file mode 100644 index 000000000..f96ccd37e --- /dev/null +++ b/content/applications/productivity/sign/china.md @@ -0,0 +1,69 @@ +--- +orphan: true +--- + +# Odoo Sign legality in China + +{doc}`Odoo Sign <../sign>` is your trusted partner for secure, efficient, and legally compliant +electronic signatures in China. + +## Legal framework for electronic signatures in China + +In China, electronic signatures are regulated under the Electronic Signature Law (ESL) of the +People's Republic of China, enacted in 2005 and amended in 2015. The law provides the foundation for +the use and legal recognition of electronic signatures. The key points of the ESL include: + +- **Legal recognition**: electronic signatures are legally equivalent to handwritten signatures if + they meet certain criteria. +- **Reliability and security**: electronic signatures must be created with a secure method that can + reliably identify the signatory and ensure the integrity of the signed document. +- **Certification Authorities (CAs)**: the law recognizes electronic signatures supported by digital + certificates issued by accredited Certification Authorities (CAs). + +## How Odoo Sign complies with Chinese regulations + +Odoo Sign ensures full compliance with the Electronic Signature Law of China by incorporating the +following features: + +- **Secure signature creation**: Odoo Sign utilizes advanced cryptographic techniques to ensure the + authenticity and integrity of electronic signatures. +- **Third-party signature authenticator**: Odoo Online serves as an independent validation mechanism + that adds an extra layer of security to the procurement process. +- **Audit trails**: detailed audit logs are maintained to provide evidence of the signing process, + including timestamps, IP addresses, and identity verification. +- **Cryptographic traceability and immutability**: Odoo Sign ensures that any operation is logged + securely. An audit log provides full transparency to all parties while preserving private data. +- **Multiple authentication means**: authentication by SMS, email, geoIP or handwritten electronic + signature. + +## Types of documents you can sign with Odoo Sign + +Odoo Sign is versatile and can be used for a wide range of documents, including but not limited to: + +- **Contracts and agreements**: business contracts, employment agreements, and service contracts. +- **Financial documents**: loan agreements, investment documents, and financial reports. +- **HR documents**: employee onboarding forms, non-disclosure agreements (NDAs), and performance + reviews. +- **Commercial transactions**: purchase orders, sales agreements, and supplier contracts. + +## Potential exceptions + +While Odoo Sign is broadly applicable, there are certain exceptions where electronic signatures may +not be suitable or legally recognized in China: + +- **Wills and trusts**: documents related to inheritance, wills, and trusts often require + handwritten signatures. +- **Real estate transactions**: some property transactions may still require notarized handwritten + signatures. +- **Government forms**: specific government forms and applications may mandate physical signatures. + +:::{admonition} Disclaimer +The information provided on this page is for general informational purposes only and does not +constitute legal advice. While Odoo Sign complies with the Electronic Signature Law of China, +users should consult with legal professionals to ensure specific document types and use cases +meet all legal requirements. Compliance with additional industry-specific regulations may also be +necessary. +::: + +*Last updated: June 19, 2024* + diff --git a/content/applications/productivity/sign/colombia.md b/content/applications/productivity/sign/colombia.md new file mode 100644 index 000000000..0533e495f --- /dev/null +++ b/content/applications/productivity/sign/colombia.md @@ -0,0 +1,72 @@ +--- +orphan: true +--- + +# Odoo Sign legality in Colombia + +{doc}`Odoo Sign <../sign>` is your trusted partner for secure, efficient, and legally compliant +electronic signatures in Colombia. + +## Legal framework for electronic signatures in Colombia + +In Colombia, electronic signatures are regulated under the [Law 529 of 1999](https://www.funcionpublica.gov.co/eva/gestornormativo/norma.php?i=4276#:~:text=%E2%80%9CPor%20medio%20de%20la%20cual,y%20se%20dictan%20otras%20disposiciones.%E2%80%9D). +The law establishes the legal basis for acknowledging electronic records, contracts, and signatures. +The key points of the law include: + +- **Legal recognition**: electronic signatures are legally equivalent to handwritten signatures if + they meet certain criteria. +- **Reliability and security**: electronic signatures must be created with a secure method that can + reliably identify the signatory and ensure the integrity of the signed document. +- **Certified electronic signatures**: special electronic signature that incorporates certificates + issued by a recognized certification authority. In some cases, only the certified electronic + signature has legal and juridical validity in Colombia. In those cases, simple electronic + signatures like the Odoo Signature only work as a proof of the agreement to celebrate the + corresponding transaction, which will be submitted to the authority's criteria. + +## How Odoo Sign complies with Colombian regulations + +Odoo Sign ensures full compliance with the Electronic Signature Law of Colombia by incorporating the +following features: + +- **Secure signature creation**: Odoo Sign utilizes advanced cryptographic techniques to ensure the + authenticity and integrity of electronic signatures. +- **Third-party signature authenticator**: Odoo Online serves as an independent validation mechanism + that adds an extra layer of security to the procurement process. +- **Audit trails**: detailed audit logs are maintained to provide evidence of the signing process, + including timestamps, IP addresses, and identity verification. +- **Cryptographic traceability and immutability**: Odoo Sign ensures that any operation is logged + securely. An audit log provides full transparency to all parties while preserving private data. +- **Multiple authentication means**: authentication by SMS, email, geoIP or handwritten electronic + signature. + +## Types of documents you can sign with Odoo Sign + +Odoo Sign is versatile and can be used for a wide range of documents, including but not limited to: + +- **Contracts and agreements**: business contracts, employment agreements, and service contracts. +- **Financial documents**: loan agreements, investment documents, and financial reports. +- **HR documents**: employee onboarding forms, non-disclosure agreements (NDAs), and performance + reviews. +- **Commercial transactions**: purchase orders, sales agreements, and supplier contracts. + +## Potential exceptions + +While Odoo Sign is broadly applicable, there are certain exceptions where electronic signatures may +not be suitable or legally recognized in Colombia: + +- **Wills and trusts**: documents related to inheritance, wills, and trusts often require + handwritten signatures. +- **Real estate transactions**: some property transactions may still require notarized handwritten + signatures. +- **Government forms**: specific government forms and applications may mandate physical signatures. + +:::{admonition} Disclaimer +The information provided on this page is for general informational purposes only and does not +constitute legal advice. While Odoo Sign complies with the Electronic Signature Law of Colombia, +users should consult with legal professionals to ensure specific document types and use cases +meet all legal requirements. Compliance with additional industry-specific regulations may also be +necessary. +::: + +*Last updated: June 21, 2024* + diff --git a/content/applications/productivity/sign/dominican_republic.md b/content/applications/productivity/sign/dominican_republic.md new file mode 100644 index 000000000..f517ce017 --- /dev/null +++ b/content/applications/productivity/sign/dominican_republic.md @@ -0,0 +1,70 @@ +--- +orphan: true +--- + +# Odoo Sign legality in the Dominican Republic + +{doc}`Odoo Sign <../sign>` is your trusted partner for secure, efficient, and legally compliant +electronic signatures in the Dominican Republic. + +## Legal framework for electronic signatures in the Dominican Republic + +In the Dominican Republic, electronic signatures are regulated under the [Law 126-02 on Electronic +Commerce, Documents and Digital Signatures](https://dgii.gov.do/legislacion/leyesTributarias/Documents/Otras%20Leyes%20de%20Inter%C3%A9s/126-02.pdf). +The law establishes the legal basis for acknowledging electronic records, contracts, and digital +signatures. The key points of the law include: + +- **Legal recognition**: electronic signatures are legally equivalent to handwritten signatures if + they meet certain criteria. +- **Reliability and security**: electronic signatures must be created with a secure method that can + reliably identify the signatory and ensure the integrity of the signed document. +- **Certified electronic signature**: digital signature generated using a digital certificate + supplied by a qualified provider. + +## How Odoo Sign complies with Dominican regulations + +Odoo Sign ensures full compliance with the Electronic Signature Law of the Dominican Republic by +incorporating the following features: + +- **Secure signature creation**: Odoo Sign utilizes advanced cryptographic techniques to ensure the + authenticity and integrity of electronic signatures. +- **Third-party signature authenticator**: Odoo Online serves as an independent validation mechanism + that adds an extra layer of security to the procurement process. +- **Audit trails**: detailed audit logs are maintained to provide evidence of the signing process, + including timestamps, IP addresses, and identity verification. +- **Cryptographic traceability and immutability**: Odoo Sign ensures that any operation is logged + securely. An audit log provides full transparency to all parties while preserving private data. +- **Multiple authentication means**: authentication by SMS, email, geoIP or handwritten electronic + signature. + +## Types of documents you can sign with Odoo Sign + +Odoo Sign is versatile and can be used for a wide range of documents, including but not limited to: + +- **Contracts and agreements**: business contracts, employment agreements, and service contracts. +- **Financial documents**: loan agreements, investment documents, and financial reports. +- **HR documents**: employee onboarding forms, non-disclosure agreements (NDAs), and performance + reviews. +- **Commercial transactions**: purchase orders, sales agreements, and supplier contracts. + +## Potential exceptions + +While Odoo Sign is broadly applicable, there are certain exceptions where electronic signatures may +not be suitable or legally recognized in the Dominican Republic: + +- **Wills and trusts**: documents related to inheritance, wills, and trusts often require + handwritten signatures. +- **Real estate transactions**: some property transactions may still require notarized handwritten + signatures. +- **Government forms**: specific government forms and applications may mandate physical signatures. + +:::{admonition} Disclaimer +The information provided on this page is for general informational purposes only and does not +constitute legal advice. While Odoo Sign complies with the Electronic Signature Law of the +Dominican Republic, users should consult with legal professionals to ensure specific document +types and use cases meet all legal requirements. Compliance with additional industry-specific +regulations may also be necessary. +::: + +*Last updated: June 21, 2024* + diff --git a/content/applications/productivity/sign/ecuador.md b/content/applications/productivity/sign/ecuador.md new file mode 100644 index 000000000..021ee26e5 --- /dev/null +++ b/content/applications/productivity/sign/ecuador.md @@ -0,0 +1,70 @@ +--- +orphan: true +--- + +# Odoo Sign legality in Ecuador + +{doc}`Odoo Sign <../sign>` is your trusted partner for secure, efficient, and legally compliant +electronic signatures in Ecuador. + +## Legal framework for electronic signatures in Ecuador + +In Ecuador, electronic signatures are regulated under the [Law on Electronic Commerce, Electronic +Signatures and Data Messages](https://www.wipo.int/wipolex/en/legislation/details/18942). The law +establishes the legal basis for acknowledging electronic records, contracts, and digital signatures. +The key points of the law include: + +- **Legal recognition**: electronic signatures are legally equivalent to handwritten signatures if + they meet certain criteria. +- **Reliability and security**: electronic signatures must be created with a secure method that can + reliably identify the signatory and ensure the integrity of the signed document. +- **Qualified electronic signature**: digital signature generated using a digital certificate + supplied by a qualified provider. + +## How Odoo Sign complies with Ecuadoran regulations + +Odoo Sign ensures full compliance with the Electronic Signature Law of Ecuador by incorporating the +following features: + +- **Secure signature creation**: Odoo Sign utilizes advanced cryptographic techniques to ensure the + authenticity and integrity of electronic signatures. +- **Third-party signature authenticator**: Odoo Online serves as an independent validation mechanism + that adds an extra layer of security to the procurement process. +- **Audit trails**: detailed audit logs are maintained to provide evidence of the signing process, + including timestamps, IP addresses, and identity verification. +- **Cryptographic traceability and immutability**: Odoo Sign ensures that any operation is logged + securely. An audit log provides full transparency to all parties while preserving private data. +- **Multiple authentication means**: authentication by SMS, email, geoIP or handwritten electronic + signature. + +## Types of documents you can sign with Odoo Sign + +Odoo Sign is versatile and can be used for a wide range of documents, including but not limited to: + +- **Contracts and agreements**: business contracts, employment agreements, and service contracts. +- **Financial documents**: loan agreements, investment documents, and financial reports. +- **HR documents**: employee onboarding forms, non-disclosure agreements (NDAs), and performance + reviews. +- **Commercial transactions**: purchase orders, sales agreements, and supplier contracts. + +## Potential exceptions + +While Odoo Sign is broadly applicable, there are certain exceptions where electronic signatures may +not be suitable or legally recognized in Ecuador: + +- **Wills and trusts**: documents related to inheritance, wills, and trusts often require + handwritten signatures. +- **Real estate transactions**: some property transactions may still require notarized handwritten + signatures. +- **Government forms**: specific government forms and applications may mandate physical signatures. + +:::{admonition} Disclaimer +The information provided on this page is for general informational purposes only and does not +constitute legal advice. While Odoo Sign complies with the Electronic Signature Law of Ecuador, +users should consult with legal professionals to ensure specific document types and use cases +meet all legal requirements. Compliance with additional industry-specific regulations may also be +necessary. +::: + +*Last updated: June 21, 2024* + diff --git a/content/applications/productivity/sign/egypt.md b/content/applications/productivity/sign/egypt.md new file mode 100644 index 000000000..43aaa3e74 --- /dev/null +++ b/content/applications/productivity/sign/egypt.md @@ -0,0 +1,68 @@ +--- +orphan: true +--- + +# Odoo Sign legality in Egypt + +{doc}`Odoo Sign <../sign>` is your trusted partner for secure, efficient, and legally compliant +electronic signatures in Egypt. + +## Legal framework for electronic signatures in Egypt + +In Egypt, electronic signatures are regulated under the [E-Signature Law](https://www.itida.gov.eg/English/Documents/4.pdf). The law governs transactions performed through +electronic means and the use of digital signatures. The key points of the law include: + +- **Legal recognition**: electronic signatures are legally equivalent to handwritten signatures if + they meet certain criteria. +- **Reliability and security**: electronic signatures must be created with a secure method that can + reliably identify the signatory and ensure the integrity of the signed document. +- **Qualified electronic signatures**: law recognizes special digital signatures certified by a + qualified authority. In some cases, this type of signature is mandatory. + +## How Odoo Sign complies with Egyptian regulations + +Odoo Sign ensures full compliance with the Electronic Signature Law of Egypt by incorporating the +following features: + +- **Secure signature creation**: Odoo Sign utilizes advanced cryptographic techniques to ensure the + authenticity and integrity of electronic signatures. +- **Third-party signature authenticator**: Odoo Online serves as an independent validation mechanism + that adds an extra layer of security to the procurement process. +- **Audit trails**: detailed audit logs are maintained to provide evidence of the signing process, + including timestamps, IP addresses, and identity verification. +- **Cryptographic traceability and immutability**: Odoo Sign ensures that any operation is logged + securely. An audit log provides full transparency to all parties while preserving private data. +- **Multiple authentication means**: authentication by SMS, email, geoIP or handwritten electronic + signature. + +## Types of documents you can sign with Odoo Sign + +Odoo Sign is versatile and can be used for a wide range of documents, including but not limited to: + +- **Contracts and agreements**: business contracts, employment agreements, and service contracts. +- **Financial documents**: loan agreements, investment documents, and financial reports. +- **HR documents**: employee onboarding forms, non-disclosure agreements (NDAs), and performance + reviews. +- **Commercial transactions**: purchase orders, sales agreements, and supplier contracts. + +## Potential exceptions + +While Odoo Sign is broadly applicable, there are certain exceptions where electronic signatures may +not be suitable or legally recognized in Egypt: + +- **Wills and trusts**: documents related to inheritance, wills, and trusts often require + handwritten signatures. +- **Real estate transactions**: some property transactions may still require notarized handwritten + signatures. +- **Government forms**: specific government forms and applications may mandate physical signatures. + +:::{admonition} Disclaimer +The information provided on this page is for general informational purposes only and does not +constitute legal advice. While Odoo Sign complies with the Electronic Signature Law of Egypt, +users should consult with legal professionals to ensure specific document types and use cases +meet all legal requirements. Compliance with additional industry-specific regulations may also be +necessary. +::: + +*Last updated: June 19, 2024* + diff --git a/content/applications/productivity/sign/ethiopia.md b/content/applications/productivity/sign/ethiopia.md new file mode 100644 index 000000000..30e779a55 --- /dev/null +++ b/content/applications/productivity/sign/ethiopia.md @@ -0,0 +1,69 @@ +--- +orphan: true +--- + +# Odoo Sign legality in Ethiopia + +{doc}`Odoo Sign <../sign>` is your trusted partner for secure, efficient, and legally compliant +electronic signatures in Ethiopia. + +## Legal framework for electronic signatures in Ethiopia + +In Ethiopia, electronic signatures are regulated under the [Electronic Signature Proclamation No. 1072/2018](http://laws.eag.gov.et/Upload/CassationDecisionsDocument/fce05041-f22e-4930-a225-95748dd53c3e.pdf). +The law establishes the legal basis for acknowledging electronic records, contracts, and digital +signatures. The key points of the law include: + +- **Legal recognition**: electronic signatures are legally equivalent to handwritten signatures if + they meet certain criteria. +- **Reliability and security**: electronic signatures must be created with a secure method that can + reliably identify the signatory and ensure the integrity of the signed document. +- **Certificate electronic signature**: digital signature generated using a digital certificate + supplied by a qualified provider. + +## How Odoo Sign complies with Ethiopian regulations + +Odoo Sign ensures full compliance with the Electronic Signature Law of Ethiopia by incorporating +the following features: + +- **Secure signature creation**: Odoo Sign utilizes advanced cryptographic techniques to ensure the + authenticity and integrity of electronic signatures. +- **Third-party signature authenticator**: Odoo Online serves as an independent validation mechanism + that adds an extra layer of security to the procurement process. +- **Audit trails**: detailed audit logs are maintained to provide evidence of the signing process, + including timestamps, IP addresses, and identity verification. +- **Cryptographic traceability and immutability**: Odoo Sign ensures that any operation is logged + securely. An audit log provides full transparency to all parties while preserving private data. +- **Multiple authentication means**: authentication by SMS, email, geoIP or handwritten electronic + signature. + +## Types of documents you can sign with Odoo Sign + +Odoo Sign is versatile and can be used for a wide range of documents, including but not limited to: + +- **Contracts and agreements**: business contracts, employment agreements, and service contracts. +- **Financial documents**: loan agreements, investment documents, and financial reports. +- **HR documents**: employee onboarding forms, non-disclosure agreements (NDAs), and performance + reviews. +- **Commercial transactions**: purchase orders, sales agreements, and supplier contracts. + +## Potential exceptions + +While Odoo Sign is broadly applicable, there are certain exceptions where electronic signatures may +not be suitable or legally recognized in Ethiopia: + +- **Wills and trusts**: documents related to inheritance, wills, and trusts often require + handwritten signatures. +- **Real estate transactions**: some property transactions may still require notarized handwritten + signatures. +- **Government forms**: specific government forms and applications may mandate physical signatures. + +:::{admonition} Disclaimer +The information provided on this page is for general informational purposes only and does not +constitute legal advice. While Odoo Sign complies with the Electronic Signature Law of Ethiopia, +users should consult with legal professionals to ensure specific document types and use cases +meet all legal requirements. Compliance with additional industry-specific regulations may also be +necessary. +::: + +*Last updated: June 21, 2024* + diff --git a/content/applications/productivity/sign/germany.md b/content/applications/productivity/sign/germany.md new file mode 100644 index 000000000..2d2c992ac --- /dev/null +++ b/content/applications/productivity/sign/germany.md @@ -0,0 +1,70 @@ +--- +orphan: true +--- + +# Odoo Sign legality in Germany + +{doc}`Odoo Sign <../sign>` is your trusted partner for secure, efficient, and legally compliant +electronic signatures in Germany. + +## Legal framework for electronic signatures in Germany + +In Germany, electronic signatures are regulated under [eIDAS Regulation No. 910/2014](https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=uriserv%3AOJ.L_.2014.257.01.0073.01.ENG) and +the [Trust Services Act](https://www.gesetze-im-internet.de/vdg/BJNR274510017.html). The law +establishes the legal basis for acknowledging electronic records, contracts, and digital signatures. +The key points of the law include: + +- **Legal recognition**: electronic signatures are legally equivalent to handwritten signatures if + they meet certain criteria. +- **Reliability and security**: electronic signatures must be created with a secure method that can + reliably identify the signatory and ensure the integrity of the signed document. +- **Qualified signature**: there are certain use cases that require a qualified signature issued by + a trust service provider. + +## How Odoo Sign complies with German regulations + +Odoo Sign ensures full compliance with the Electronic Signature Law of Germany by incorporating the +following features: + +- **Secure signature creation**: Odoo Sign utilizes advanced cryptographic techniques to ensure the + authenticity and integrity of electronic signatures. +- **Third-party signature authenticator**: Odoo Online serves as an independent validation mechanism + that adds an extra layer of security to the procurement process. +- **Audit trails**: detailed audit logs are maintained to provide evidence of the signing process, + including timestamps, IP addresses, and identity verification. +- **Cryptographic traceability and immutability**: Odoo Sign ensures that any operation is logged + securely. An audit log provides full transparency to all parties while preserving private data. +- **Multiple authentication means**: authentication by SMS, email, geoIP or handwritten electronic + signature. + +## Types of documents you can sign with Odoo Sign + +Odoo Sign is versatile and can be used for a wide range of documents, including but not limited to: + +- **Contracts and agreements**: business contracts, employment agreements, and service contracts. +- **Financial documents**: loan agreements, investment documents, and financial reports. +- **HR documents**: employee onboarding forms, non-disclosure agreements (NDAs), and performance + reviews. +- **Commercial transactions**: purchase orders, sales agreements, and supplier contracts. + +## Potential exceptions + +While Odoo Sign is broadly applicable, there are certain exceptions where electronic signatures may +not be suitable or legally recognized in Germany: + +- **Wills and trusts**: documents related to inheritance, wills, and trusts often require + handwritten signatures. +- **Real estate transactions**: some property transactions may still require notarized handwritten + signatures. +- **Government forms**: specific government forms and applications may mandate physical signatures. + +:::{admonition} Disclaimer +The information provided on this page is for general informational purposes only and does not +constitute legal advice. While Odoo Sign complies with the Electronic Signature Law of Germany, +users should consult with legal professionals to ensure specific document types and use cases +meet all legal requirements. Compliance with additional industry-specific regulations may also be +necessary. +::: + +*Last updated: June 21, 2024* + diff --git a/content/applications/productivity/sign/guatemala.md b/content/applications/productivity/sign/guatemala.md new file mode 100644 index 000000000..897c5762f --- /dev/null +++ b/content/applications/productivity/sign/guatemala.md @@ -0,0 +1,69 @@ +--- +orphan: true +--- + +# Odoo Sign legality in Guatemala + +{doc}`Odoo Sign <../sign>` is your trusted partner for secure, efficient, and legally compliant +electronic signatures in Guatemala. + +## Legal framework for electronic signatures in Guatemala + +In Guatemala, electronic signatures are regulated under the [Electronic Communications and Signatures Law](https://www.rpsc.gob.gt/wp-content/uploads/2021/10/LEY-PARA-EL-RECONOCIMIENTO-DE-LAS-COMUNICACIONES-Y-FIRMAS-ELECTRONICAS-19-11-2020.pdf). +The law establishes the legal basis for acknowledging electronic records, contracts, and digital +signatures. The key points of the law include: + +- **Legal recognition**: electronic signatures are legally equivalent to handwritten signatures if + they meet certain criteria. +- **Reliability and security**: electronic signatures must be created with a secure method that can + reliably identify the signatory and ensure the integrity of the signed document. +- **Certification service providers**: digital signature generated using a digital certificate + supplied by a qualified provider. + +## How Odoo Sign complies with Guatemalan regulations + +Odoo Sign ensures full compliance with the Electronic Signature Law of Guatemala by incorporating +the following features: + +- **Secure signature creation**: Odoo Sign utilizes advanced cryptographic techniques to ensure the + authenticity and integrity of electronic signatures. +- **Third-party signature authenticator**: Odoo Online serves as an independent validation mechanism + that adds an extra layer of security to the procurement process. +- **Audit trails**: detailed audit logs are maintained to provide evidence of the signing process, + including timestamps, IP addresses, and identity verification. +- **Cryptographic traceability and immutability**: Odoo Sign ensures that any operation is logged + securely. An audit log provides full transparency to all parties while preserving private data. +- **Multiple authentication means**: authentication by SMS, email, geoIP or handwritten electronic + signature. + +## Types of documents you can sign with Odoo Sign + +Odoo Sign is versatile and can be used for a wide range of documents, including but not limited to: + +- **Contracts and agreements**: business contracts, employment agreements, and service contracts. +- **Financial documents**: loan agreements, investment documents, and financial reports. +- **HR documents**: employee onboarding forms, non-disclosure agreements (NDAs), and performance + reviews. +- **Commercial transactions**: purchase orders, sales agreements, and supplier contracts. + +## Potential exceptions + +While Odoo Sign is broadly applicable, there are certain exceptions where electronic signatures may +not be suitable or legally recognized in Guatemala: + +- **Wills and trusts**: documents related to inheritance, wills, and trusts often require + handwritten signatures. +- **Real estate transactions**: some property transactions may still require notarized handwritten + signatures. +- **Government forms**: specific government forms and applications may mandate physical signatures. + +:::{admonition} Disclaimer +The information provided on this page is for general informational purposes only and does not +constitute legal advice. While Odoo Sign complies with the Electronic Signature Law of Guatemala, +users should consult with legal professionals to ensure specific document types and use cases +meet all legal requirements. Compliance with additional industry-specific regulations may also be +necessary. +::: + +*Last updated: June 21, 2024* + diff --git a/content/applications/productivity/sign/hong_kong.md b/content/applications/productivity/sign/hong_kong.md new file mode 100644 index 000000000..75b8a8f33 --- /dev/null +++ b/content/applications/productivity/sign/hong_kong.md @@ -0,0 +1,68 @@ +--- +orphan: true +--- + +# Odoo Sign legality in Hong Kong + +{doc}`Odoo Sign <../sign>` is your trusted partner for secure, efficient, and legally compliant +electronic signatures in Hong Kong. + +## Legal framework for electronic signatures in Hong Kong + +In Hong Kong, electronic signatures are regulated under the [Electronic Transactions Ordinance](https://www.elegislation.gov.hk/hk/cap553). The law establishes the legal basis for acknowledging +electronic records, contracts, and signatures. The key points of the law include: + +- **Legal recognition**: electronic signatures are legally equivalent to handwritten signatures if + they meet certain criteria. +- **Reliability and security**: electronic signatures must be created with a secure method that can + reliably identify the signatory and ensure the integrity of the signed document. +- **Certified electronic signatures**: special electronic signature that incorporates certificates + issued by a recognized certification authority. + +## How Odoo Sign complies with Hong Kong regulations + +Odoo Sign ensures full compliance with the Electronic Signature Law of Hong Kong by incorporating +the following features: + +- **Secure signature creation**: Odoo Sign utilizes advanced cryptographic techniques to ensure the + authenticity and integrity of electronic signatures. +- **Third-party signature authenticator**: Odoo Online serves as an independent validation mechanism + that adds an extra layer of security to the procurement process. +- **Audit trails**: detailed audit logs are maintained to provide evidence of the signing process, + including timestamps, IP addresses, and identity verification. +- **Cryptographic traceability and immutability**: Odoo Sign ensures that any operation is logged + securely. An audit log provides full transparency to all parties while preserving private data. +- **Multiple authentication means**: authentication by SMS, email, geoIP or handwritten electronic + signature. + +## Types of documents you can sign with Odoo Sign + +Odoo Sign is versatile and can be used for a wide range of documents, including but not limited to: + +- **Contracts and agreements**: business contracts, employment agreements, and service contracts. +- **Financial documents**: loan agreements, investment documents, and financial reports. +- **HR documents**: employee onboarding forms, non-disclosure agreements (NDAs), and performance + reviews. +- **Commercial transactions**: purchase orders, sales agreements, and supplier contracts. + +## Potential exceptions + +While Odoo Sign is broadly applicable, there are certain exceptions where electronic signatures may +not be suitable or legally recognized in Hong Kong: + +- **Wills and trusts**: documents related to inheritance, wills, and trusts often require + handwritten signatures. +- **Real estate transactions**: some property transactions may still require notarized handwritten + signatures. +- **Government forms**: specific government forms and applications may mandate physical signatures. + +:::{admonition} Disclaimer +The information provided on this page is for general informational purposes only and does not +constitute legal advice. While Odoo Sign complies with the Electronic Signature Law of Hong Kong, +users should consult with legal professionals to ensure specific document types and use cases +meet all legal requirements. Compliance with additional industry-specific regulations may also be +necessary. +::: + +*Last updated: June 21, 2024* + diff --git a/content/applications/productivity/sign/india.md b/content/applications/productivity/sign/india.md new file mode 100644 index 000000000..c9358fd65 --- /dev/null +++ b/content/applications/productivity/sign/india.md @@ -0,0 +1,72 @@ +--- +orphan: true +--- + +# Odoo Sign legality in India + +{doc}`Odoo Sign <../sign>` is your trusted partner for secure, efficient, and legally compliant +electronic signatures in India. + +## Legal framework for electronic signatures in India + +In India, electronic signatures are regulated under the [Information Technology Act (ITA)](https://eprocure.gov.in/cppp/rulesandprocs/kbadqkdlcswfjdelrquehwuxcfmijmuixngudufgbuubgubfugbububjxcgfvsbdihbgfGhdfgFHytyhRtMjk4NzY=), +the [Indian Contract Act (ICA)](https://www.indiacode.nic.in/bitstream/123456789/2187/2/A187209.pdf) and the Electronic Signature +or Electronic Authentication Technique and Procedure Rules (ESEATPR). The law provides the +foundation for the use and legal recognition of electronic signatures. The key points of the law +include: + +- **Legal recognition**: electronic signatures are legally equivalent to handwritten signatures if + they meet certain criteria. +- **Reliability and security**: electronic signatures must be created with a secure method that can + reliably identify the signatory and ensure the integrity of the signed document. +- **Digital signature certificates**: the law recognizes digital signature certificates that serve + as proof of identity of an individual for a certain purpose that can be used in special cases to + provide additional security. + +## How Odoo Sign complies with Indian regulations + +Odoo Sign ensures full compliance with the Electronic Signature Law of India by incorporating the +following features: + +- **Secure signature creation**: Odoo Sign utilizes advanced cryptographic techniques to ensure the + authenticity and integrity of electronic signatures. +- **Third-party signature authenticator**: Odoo Online serves as an independent validation mechanism + that adds an extra layer of security to the procurement process. +- **Audit trails**: detailed audit logs are maintained to provide evidence of the signing process, + including timestamps, IP addresses, and identity verification. +- **Cryptographic traceability and immutability**: Odoo Sign ensures that any operation is logged + securely. An audit log provides full transparency to all parties while preserving private data. +- **Multiple authentication means**: authentication by SMS, email, geoIP or handwritten electronic + signature. + +## Types of documents you can sign with Odoo Sign + +Odoo Sign is versatile and can be used for a wide range of documents, including but not limited to: + +- **Contracts and agreements**: business contracts, employment agreements, and service contracts. +- **Financial documents**: loan agreements, investment documents, and financial reports. +- **HR documents**: employee onboarding forms, non-disclosure agreements (NDAs), and performance + reviews. +- **Commercial transactions**: purchase orders, sales agreements, and supplier contracts. + +## Potential exceptions + +While Odoo Sign is broadly applicable, there are certain exceptions where electronic signatures may +not be suitable or legally recognized in India: + +- **Wills and trusts**: documents related to inheritance, wills, and trusts often require + handwritten signatures. +- **Real estate transactions**: some property transactions may still require notarized handwritten + signatures. +- **Government forms**: specific government forms and applications may mandate physical signatures. + +:::{admonition} Disclaimer +The information provided on this page is for general informational purposes only and does not +constitute legal advice. While Odoo Sign complies with the Electronic Signature Law of India, +users should consult with legal professionals to ensure specific document types and use cases +meet all legal requirements. Compliance with additional industry-specific regulations may also be +necessary. +::: + +*Last updated: June 19, 2024* + diff --git a/content/applications/productivity/sign/indonesia.md b/content/applications/productivity/sign/indonesia.md new file mode 100644 index 000000000..7937b0ca8 --- /dev/null +++ b/content/applications/productivity/sign/indonesia.md @@ -0,0 +1,74 @@ +--- +orphan: true +--- + +# Odoo Sign legality in Indonesia + +{doc}`Odoo Sign <../sign>` is your trusted partner for secure, efficient, and legally compliant +electronic signatures in Indonesia. + +## Legal framework for electronic signatures in Indonesia + +In Indonesia, electronic signatures are regulated under the [Law of the Republic of Indonesia No. 11 +of 2008 on Electronic Information and Transactions](https://www.icnl.org/wp-content/uploads/Indonesia_elec.pdf), Government Regulation No. 71 of 2019 +on Organization of Electronic system and Transactions, as well as the Minister of Communications and +Informatics (MoCI) Regulation No. 11 of 2018 on Administration of Electronic Certification ("MoCI +Regulation 11 of 2018"). The law governs transactions performed through electronic means and the use +of electronic signatures. The key points of the law include: + +- **Legal recognition**: electronic signatures are legally equivalent to handwritten signatures if + they meet certain criteria. +- **Reliability and security**: electronic signatures must be created with a secure method that can + reliably identify the signatory and ensure the integrity of the signed document. +- **Certified e-signatures**: the law recognizes digital signature certificates that serve as proof + of identity of an individual for a certain purpose that can be used in special cases to provide + additional security. These certificates are issued by Certification Authorities and are required + by law for the signature of specific acts. + +## How Odoo Sign complies with Indonesian regulations + +Odoo Sign ensures full compliance with the Electronic Signature Law of Indonesia by incorporating +the following features: + +- **Secure signature creation**: Odoo Sign utilizes advanced cryptographic techniques to ensure the + authenticity and integrity of electronic signatures. +- **Third-party signature authenticator**: Odoo Online serves as an independent validation mechanism + that adds an extra layer of security to the procurement process. +- **Audit trails**: detailed audit logs are maintained to provide evidence of the signing process, + including timestamps, IP addresses, and identity verification. +- **Cryptographic traceability and immutability**: Odoo Sign ensures that any operation is logged + securely. An audit log provides full transparency to all parties while preserving private data. +- **Multiple authentication means**: authentication by SMS, email, geoIP or handwritten electronic + signature. + +## Types of documents you can sign with Odoo Sign + +Odoo Sign is versatile and can be used for a wide range of documents, including but not limited to: + +- **Contracts and agreements**: business contracts, employment agreements, and service contracts. +- **Financial documents**: loan agreements, investment documents, and financial reports. +- **HR documents**: employee onboarding forms, non-disclosure agreements (NDAs), and performance + reviews. +- **Commercial transactions**: purchase orders, sales agreements, and supplier contracts. + +## Potential exceptions + +While Odoo Sign is broadly applicable, there are certain exceptions where electronic signatures may +not be suitable or legally recognized in Indonesia: + +- **Wills and trusts**: documents related to inheritance, wills, and trusts often require + handwritten signatures. +- **Real estate transactions**: some property transactions may still require notarized handwritten + signatures. +- **Government forms**: specific government forms and applications may mandate physical signatures. + +:::{admonition} Disclaimer +The information provided on this page is for general informational purposes only and does not +constitute legal advice. While Odoo Sign complies with the Electronic Signature Law of Indonesia, +users should consult with legal professionals to ensure specific document types and use cases +meet all legal requirements. Compliance with additional industry-specific regulations may also be +necessary. +::: + +*Last updated: June 19, 2024* + diff --git a/content/applications/productivity/sign/iran.md b/content/applications/productivity/sign/iran.md new file mode 100644 index 000000000..19592678f --- /dev/null +++ b/content/applications/productivity/sign/iran.md @@ -0,0 +1,66 @@ +--- +orphan: true +--- + +# Odoo Sign legality in Iran + +{doc}`Odoo Sign <../sign>` is your trusted partner for secure, efficient, and legally compliant +electronic signatures in Iran. + +## Legal framework for electronic signatures in Iran + +In Iran, electronic signatures are regulated under the [Iran Civil Code](https://faolex.fao.org/docs/pdf/ira206827.pdf) and the [Electronic Commerce Act](https://wipolex-res.wipo.int/edocs/lexdocs/laws/en/ir/ir008en.html). The law governs the use of +electronic records and signatures. The key points of the law include: + +- **Legal recognition**: electronic signatures are legally equivalent to handwritten signatures if + they meet certain criteria. +- **Reliability and security**: electronic signatures must be created with a secure method that can + reliably identify the signatory and ensure the integrity of the signed document. + +## How Odoo Sign complies with Iranian regulations + +Odoo Sign ensures full compliance with the Electronic Signature Law of Iran by incorporating the +following features: + +- **Secure signature creation**: Odoo Sign utilizes advanced cryptographic techniques to ensure the + authenticity and integrity of electronic signatures. +- **Third-party signature authenticator**: Odoo Online serves as an independent validation mechanism + that adds an extra layer of security to the procurement process. +- **Audit trails**: detailed audit logs are maintained to provide evidence of the signing process, + including timestamps, IP addresses, and identity verification. +- **Cryptographic traceability and immutability**: Odoo Sign ensures that any operation is logged + securely. An audit log provides full transparency to all parties while preserving private data. +- **Multiple authentication means**: authentication by SMS, email, geoIP or handwritten electronic + signature. + +## Types of documents you can sign with Odoo Sign + +Odoo Sign is versatile and can be used for a wide range of documents, including but not limited to: + +- **Contracts and agreements**: business contracts, employment agreements, and service contracts. +- **Financial documents**: loan agreements, investment documents, and financial reports. +- **HR documents**: employee onboarding forms, non-disclosure agreements (NDAs), and performance + reviews. +- **Commercial transactions**: purchase orders, sales agreements, and supplier contracts. + +## Potential exceptions + +While Odoo Sign is broadly applicable, there are certain exceptions where electronic signatures may +not be suitable or legally recognized in Iran: + +- **Wills and trusts**: documents related to inheritance, wills, and trusts often require + handwritten signatures. +- **Real estate transactions**: some property transactions may still require notarized handwritten + signatures. +- **Government forms**: specific government forms and applications may mandate physical signatures. + +:::{admonition} Disclaimer +The information provided on this page is for general informational purposes only and does not +constitute legal advice. While Odoo Sign complies with the Electronic Signature Law of Iran, +users should consult with legal professionals to ensure specific document types and use cases +meet all legal requirements. Compliance with additional industry-specific regulations may also be +necessary. +::: + +*Last updated: June 21, 2024* + diff --git a/content/applications/productivity/sign/iraq.md b/content/applications/productivity/sign/iraq.md new file mode 100644 index 000000000..7e9ec2d62 --- /dev/null +++ b/content/applications/productivity/sign/iraq.md @@ -0,0 +1,73 @@ +--- +orphan: true +--- + +# Odoo Sign legality in Iraq + +{doc}`Odoo Sign <../sign>` is your trusted partner for secure, efficient, and legally compliant +electronic signatures in Iraq. + +## Legal framework for electronic signatures in Iraq + +In Iraq, electronic signatures are regulated under the [Electronic Signature and Electronic +transactions Law No. 78 Of 2012](https://www.itu.int/en/ITU-T/Workshops-and-Seminars/bsg/201712/Documents/2.Halah%20Al-Rubaye.pdf). +The law establishes the legal basis for acknowledging electronic records, contracts, and digital +signatures. The key points of the law include: + +- **Legal recognition**: electronic signatures are legally equivalent to handwritten signatures if + they meet certain criteria. +- **Reliability and security**: electronic signatures must be created with a secure method that can + reliably identify the signatory and ensure the integrity of the signed document. +- **Certified electronic signatures**: Special electronic signature that incorporates certificates + issued by a recognized certification authority. In some cases, only the certified electronic + signature has legal and juridical validity in Iraq. In those cases, simple electronic signatures + like the Odoo Signature only work as a proof of the agreement of wills to celebrate the + corresponding transaction, which will be submitted to the authority's criteria. + +## How Odoo Sign complies with Iraqi regulations + +Odoo Sign ensures full compliance with the Electronic Signature Law of Iraq by incorporating the +following features: + +- **Secure signature creation**: Odoo Sign utilizes advanced cryptographic techniques to ensure the + authenticity and integrity of electronic signatures. +- **Third-party signature authenticator**: Odoo Online serves as an independent validation mechanism + that adds an extra layer of security to the procurement process. +- **Audit trails**: detailed audit logs are maintained to provide evidence of the signing process, + including timestamps, IP addresses, and identity verification. +- **Cryptographic traceability and immutability**: Odoo Sign ensures that any operation is logged + securely. An audit log provides full transparency to all parties while preserving private data. +- **Multiple authentication means**: authentication by SMS, email, geoIP or handwritten electronic + signature. + +## Types of documents you can sign with Odoo Sign + +Odoo Sign is versatile and can be used for a wide range of documents, including but not limited to: + +- **Contracts and agreements**: business contracts, employment agreements, and service contracts. +- **Financial documents**: loan agreements, investment documents, and financial reports. +- **HR documents**: employee onboarding forms, non-disclosure agreements (NDAs), and performance + reviews. +- **Commercial transactions**: purchase orders, sales agreements, and supplier contracts. + +## Potential exceptions + +While Odoo Sign is broadly applicable, there are certain exceptions where electronic signatures may +not be suitable or legally recognized in Iraq: + +- **Wills and trusts**: documents related to inheritance, wills, and trusts often require + handwritten signatures. +- **Real estate transactions**: some property transactions may still require notarized handwritten + signatures. +- **Government forms**: specific government forms and applications may mandate physical signatures. + +:::{admonition} Disclaimer +The information provided on this page is for general informational purposes only and does not +constitute legal advice. While Odoo Sign complies with the Electronic Signature Law of Iraq, +users should consult with legal professionals to ensure specific document types and use cases +meet all legal requirements. Compliance with additional industry-specific regulations may also be +necessary. +::: + +*Last updated: June 21, 2024* + diff --git a/content/applications/productivity/sign/israel.md b/content/applications/productivity/sign/israel.md new file mode 100644 index 000000000..0efcca454 --- /dev/null +++ b/content/applications/productivity/sign/israel.md @@ -0,0 +1,69 @@ +--- +orphan: true +--- + +# Odoo Sign legality in Israel + +{doc}`Odoo Sign <../sign>` is your trusted partner for secure, efficient, and legally compliant +electronic signatures in Israel. + +## Legal framework for electronic signatures in Israel + +In Israel, electronic signatures are regulated under the Electronic Signature Law, and various +electronic signature regulations. The law governs transactions performed through electronic means +and the use of electronic signatures. The key points of the law include: + +- **Legal recognition**: electronic signatures are legally equivalent to handwritten signatures if + they meet certain criteria. +- **Reliability and security**: electronic signatures must be created with a secure method that can + reliably identify the signatory and ensure the integrity of the signed document. +- **Certified electronic signature**: the law recognizes electronic signatures supported by digital + certificates issued by Certified Providers. + +## How Odoo Sign complies with Israeli regulations + +Odoo Sign ensures full compliance with the Electronic Signature Law of Israel by incorporating the +following features: + +- **Secure signature creation**: Odoo Sign utilizes advanced cryptographic techniques to ensure the + authenticity and integrity of electronic signatures. +- **Third-party signature authenticator**: Odoo Online serves as an independent validation mechanism + that adds an extra layer of security to the procurement process. +- **Audit trails**: detailed audit logs are maintained to provide evidence of the signing process, + including timestamps, IP addresses, and identity verification. +- **Cryptographic traceability and immutability**: Odoo Sign ensures that any operation is logged + securely. An audit log provides full transparency to all parties while preserving private data. +- **Multiple authentication means**: authentication by SMS, email, geoIP or handwritten electronic + signature. + +## Types of documents you can sign with Odoo Sign + +Odoo Sign is versatile and can be used for a wide range of documents, including but not limited to: + +- **Contracts and agreements**: business contracts, employment agreements, and service contracts. +- **Financial documents**: loan agreements, investment documents, and financial reports. +- **HR documents**: employee onboarding forms, non-disclosure agreements (NDAs), and performance + reviews. +- **Commercial transactions**: purchase orders, sales agreements, and supplier contracts. + +## Potential exceptions + +While Odoo Sign is broadly applicable, there are certain exceptions where electronic signatures may +not be suitable or legally recognized in Israel: + +- **Wills and trusts**: documents related to inheritance, wills, and trusts often require + handwritten signatures. +- **Real estate transactions**: some property transactions may still require notarized handwritten + signatures. +- **Government forms**: specific government forms and applications may mandate physical signatures. + +:::{admonition} Disclaimer +The information provided on this page is for general informational purposes only and does not +constitute legal advice. While Odoo Sign complies with the Electronic Signature Law of Israel, +users should consult with legal professionals to ensure specific document types and use cases +meet all legal requirements. Compliance with additional industry-specific regulations may also be +necessary. +::: + +*Last updated: June 21, 2024* + diff --git a/content/applications/productivity/sign/japan.md b/content/applications/productivity/sign/japan.md new file mode 100644 index 000000000..b4f7b0d6a --- /dev/null +++ b/content/applications/productivity/sign/japan.md @@ -0,0 +1,70 @@ +--- +orphan: true +--- + +# Odoo Sign legality in Japan + +{doc}`Odoo Sign <../sign>` is your trusted partner for secure, efficient, and legally compliant +electronic signatures in Japan. + +## Legal framework for electronic signatures in Japan + +In Japan, electronic signatures are regulated under the [Act on Electronic Signatures and +Certification Business (E-signature Act)](https://www.cas.go.jp/jp/seisaku/hourei/data/aescb.pdf) +published in the official gazette on May 31, 2000. The law provides the foundation for the use and +legal recognition of electronic signatures. The key points of the E-signature Act include: + +- **Legal recognition**: electronic signatures are legally equivalent to handwritten signatures if + they meet certain criteria. +- **Reliability and security**: electronic signatures must be created with a secure method that can + reliably identify the signatory and ensure the integrity of the signed document. +- **Certification Businesses (CBs)**: the law recognizes electronic signatures supported by digital + certificates issued by accredited CBs. + +## How Odoo Sign complies with Japanese regulations + +Odoo Sign ensures full compliance with the Electronic Signature Law of Japan by incorporating the +following features: + +- **Secure signature creation**: Odoo Sign utilizes advanced cryptographic techniques to ensure the + authenticity and integrity of electronic signatures. +- **Third-party signature authenticator**: Odoo Online serves as an independent validation mechanism + that adds an extra layer of security to the procurement process. +- **Audit trails**: detailed audit logs are maintained to provide evidence of the signing process, + including timestamps, IP addresses, and identity verification. +- **Cryptographic traceability and immutability**: Odoo Sign ensures that any operation is logged + securely. An audit log provides full transparency to all parties while preserving private data. +- **Multiple authentication means**: authentication by SMS, email, geoIP or handwritten electronic + signature. + +## Types of documents you can sign with Odoo Sign + +Odoo Sign is versatile and can be used for a wide range of documents, including but not limited to: + +- **Contracts and agreements**: business contracts, employment agreements, and service contracts. +- **Financial documents**: loan agreements, investment documents, and financial reports. +- **HR documents**: employee onboarding forms, non-disclosure agreements (NDAs), and performance + reviews. +- **Commercial transactions**: purchase orders, sales agreements, and supplier contracts. + +## Potential exceptions + +While Odoo Sign is broadly applicable, there are certain exceptions where electronic signatures may +not be suitable or legally recognized in Japan: + +- **Wills and trusts**: documents related to inheritance, wills, and trusts often require + handwritten signatures. +- **Real estate transactions**: some property transactions may still require notarized handwritten + signatures. +- **Government forms**: specific government forms and applications may mandate physical signatures. + +:::{admonition} Disclaimer +The information provided on this page is for general informational purposes only and does not +constitute legal advice. While Odoo Sign complies with the Electronic Signature Law of Japan, +users should consult with legal professionals to ensure specific document types and use cases +meet all legal requirements. Compliance with additional industry-specific regulations may also be +necessary. +::: + +*Last updated: June 19, 2024* + diff --git a/content/applications/productivity/sign/kazakhstan.md b/content/applications/productivity/sign/kazakhstan.md new file mode 100644 index 000000000..f89a05702 --- /dev/null +++ b/content/applications/productivity/sign/kazakhstan.md @@ -0,0 +1,70 @@ +--- +orphan: true +--- + +# Odoo Sign legality in Kazakhstan + +{doc}`Odoo Sign <../sign>` is your trusted partner for secure, efficient, and legally compliant +electronic signatures in Kazakhstan. + +## Legal framework for electronic signatures in Kazakhstan + +In Kazakhstan, electronic signatures are regulated under the [Civil Code](https://adilet.zan.kz/eng/docs/K940001000_) and the [Law On Electronic Document and Electronic +Digital Signature](https://wipolex-res.wipo.int/edocs/lexdocs/laws/en/kz/kz102en.pdf). The law +establishes the legal basis for acknowledging electronic records, contracts, and digital signatures. +The key points of the law include: + +- **Legal recognition**: electronic signatures are legally equivalent to handwritten signatures if + they meet certain criteria. +- **Reliability and security**: electronic signatures must be created with a secure method that can + reliably identify the signatory and ensure the integrity of the signed document. +- **Qualified electronic signature**: digital signature generated using a digital certificate + supplied by a qualified provider. + +## How Odoo Sign complies with Kazakhstani regulations + +Odoo Sign ensures full compliance with the Electronic Signature Law of Kazakhstan by incorporating +the following features: + +- **Secure signature creation**: Odoo Sign utilizes advanced cryptographic techniques to ensure the + authenticity and integrity of electronic signatures. +- **Third-party signature authenticator**: Odoo Online serves as an independent validation mechanism + that adds an extra layer of security to the procurement process. +- **Audit trails**: detailed audit logs are maintained to provide evidence of the signing process, + including timestamps, IP addresses, and identity verification. +- **Cryptographic traceability and immutability**: Odoo Sign ensures that any operation is logged + securely. An audit log provides full transparency to all parties while preserving private data. +- **Multiple authentication means**: authentication by SMS, email, geoIP or handwritten electronic + signature. + +## Types of documents you can sign with Odoo Sign + +Odoo Sign is versatile and can be used for a wide range of documents, including but not limited to: + +- **Contracts and agreements**: business contracts, employment agreements, and service contracts. +- **Financial documents**: loan agreements, investment documents, and financial reports. +- **HR documents**: employee onboarding forms, non-disclosure agreements (NDAs), and performance + reviews. +- **Commercial transactions**: purchase orders, sales agreements, and supplier contracts. + +## Potential exceptions + +While Odoo Sign is broadly applicable, there are certain exceptions where electronic signatures may +not be suitable or legally recognized in Kazakhstan: + +- **Wills and trusts**: documents related to inheritance, wills, and trusts often require + handwritten signatures. +- **Real estate transactions**: some property transactions may still require notarized handwritten + signatures. +- **Government forms**: specific government forms and applications may mandate physical signatures. + +:::{admonition} Disclaimer +The information provided on this page is for general informational purposes only and does not +constitute legal advice. While Odoo Sign complies with the Electronic Signature Law of +Kazakhstan, users should consult with legal professionals to ensure specific document types and +use cases meet all legal requirements. Compliance with additional industry-specific regulations +may also be necessary. +::: + +*Last updated: June 21, 2024* + diff --git a/content/applications/productivity/sign/kenya.md b/content/applications/productivity/sign/kenya.md new file mode 100644 index 000000000..df01db11f --- /dev/null +++ b/content/applications/productivity/sign/kenya.md @@ -0,0 +1,69 @@ +--- +orphan: true +--- + +# Odoo Sign legality in Kenya + +{doc}`Odoo Sign <../sign>` is your trusted partner for secure, efficient, and legally compliant +electronic signatures in Kenya. + +## Legal framework for electronic signatures in Kenya + +In Kenya, electronic signatures are regulated under the [Information and Communications Act](). +The law establishes the legal basis for acknowledging electronic records, contracts, and digital +signatures. The key points of the law include: + +- **Legal recognition**: electronic signatures are legally equivalent to handwritten signatures if + they meet certain criteria. +- **Reliability and security**: electronic signatures must be created with a secure method that can + reliably identify the signatory and ensure the integrity of the signed document. +- **Certified electronic signature**: digital signature generated using a digital certificate + supplied by a qualified provider. + +## How Odoo Sign complies with Kenyan regulations + +Odoo Sign ensures full compliance with the Electronic Signature Law of Kenya by incorporating the +following features: + +- **Secure signature creation**: Odoo Sign utilizes advanced cryptographic techniques to ensure the + authenticity and integrity of electronic signatures. +- **Third-party signature authenticator**: Odoo Online serves as an independent validation mechanism + that adds an extra layer of security to the procurement process. +- **Audit trails**: detailed audit logs are maintained to provide evidence of the signing process, + including timestamps, IP addresses, and identity verification. +- **Cryptographic traceability and immutability**: Odoo Sign ensures that any operation is logged + securely. An audit log provides full transparency to all parties while preserving private data. +- **Multiple authentication means**: authentication by SMS, email, geoIP or handwritten electronic + signature. + +## Types of documents you can sign with Odoo Sign + +Odoo Sign is versatile and can be used for a wide range of documents, including but not limited to: + +- **Contracts and agreements**: business contracts, employment agreements, and service contracts. +- **Financial documents**: loan agreements, investment documents, and financial reports. +- **HR documents**: employee onboarding forms, non-disclosure agreements (NDAs), and performance + reviews. +- **Commercial transactions**: purchase orders, sales agreements, and supplier contracts. + +## Potential exceptions + +While Odoo Sign is broadly applicable, there are certain exceptions where electronic signatures may +not be suitable or legally recognized in Kenya: + +- **Wills and trusts**: documents related to inheritance, wills, and trusts often require + handwritten signatures. +- **Real estate transactions**: some property transactions may still require notarized handwritten + signatures. +- **Government forms**: specific government forms and applications may mandate physical signatures. + +:::{admonition} Disclaimer +The information provided on this page is for general informational purposes only and does not +constitute legal advice. While Odoo Sign complies with the Electronic Signature Law of Kenya, +users should consult with legal professionals to ensure specific document types and use cases +meet all legal requirements. Compliance with additional industry-specific regulations may also be +necessary. +::: + +*Last updated: June 21, 2024* + diff --git a/content/applications/productivity/sign/kuwait.md b/content/applications/productivity/sign/kuwait.md new file mode 100644 index 000000000..012b2649e --- /dev/null +++ b/content/applications/productivity/sign/kuwait.md @@ -0,0 +1,68 @@ +--- +orphan: true +--- + +# Odoo Sign legality in Kuwait + +{doc}`Odoo Sign <../sign>` is your trusted partner for secure, efficient, and legally compliant +electronic signatures in Kuwait. + +## Legal framework for electronic signatures in Kuwait + +In Kuwait, electronic signatures are regulated under the [Law No.20 of 2014 concerning Electronic +Transactions and its Implementing Regulations](https://kdipa.gov.kw/wp-content/uploads/2022/08/%D9%82%D8%A7%D9%86%D9%88%D9%86-%D8%A7%D9%84%D9%85%D8%B9%D8%A7%D9%85%D9%84%D8%A7%D8%AA-%D8%A7%D9%84%D8%A7%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A%D8%A9-20-%D9%84%D8%B3%D9%86%D8%A9-2014-%D9%85%D8%AA%D8%B1%D8%AC%D9%85-%D8%A8%D8%A7%D9%84%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%A7%D9%86%D8%AC%D9%84%D9%8A%D8%B2%D9%8A%D8%A9.pdf). +The law establishes the legal basis for acknowledging electronic records, contracts, and digital +signatures. The key points of the law include: + +- **Legal recognition**: electronic signatures are legally equivalent to handwritten signatures if + they meet certain criteria. +- **Reliability and security**: electronic signatures must be created with a secure method that can + reliably identify the signatory and ensure the integrity of the signed document. + +## How Odoo Sign complies with Kuwaiti regulations + +Odoo Sign ensures full compliance with the Electronic Signature Law of Kuwait by incorporating the +following features: + +- **Secure signature creation**: Odoo Sign utilizes advanced cryptographic techniques to ensure the + authenticity and integrity of electronic signatures. +- **Third-party signature authenticator**: Odoo Online serves as an independent validation mechanism + that adds an extra layer of security to the procurement process. +- **Audit trails**: detailed audit logs are maintained to provide evidence of the signing process, + including timestamps, IP addresses, and identity verification. +- **Cryptographic traceability and immutability**: Odoo Sign ensures that any operation is logged + securely. An audit log provides full transparency to all parties while preserving private data. +- **Multiple authentication means**: authentication by SMS, email, geoIP or handwritten electronic + signature. + +## Types of documents you can sign with Odoo Sign + +Odoo Sign is versatile and can be used for a wide range of documents, including but not limited to: + +- **Contracts and agreements**: business contracts, employment agreements, and service contracts. +- **Financial documents**: loan agreements, investment documents, and financial reports. +- **HR documents**: employee onboarding forms, non-disclosure agreements (NDAs), and performance + reviews. +- **Commercial transactions**: purchase orders, sales agreements, and supplier contracts. + +## Potential exceptions + +While Odoo Sign is broadly applicable, there are certain exceptions where electronic signatures may +not be suitable or legally recognized in Kuwait: + +- **Wills and trusts**: documents related to inheritance, wills, and trusts often require + handwritten signatures. +- **Real estate transactions**: some property transactions may still require notarized handwritten + signatures. +- **Government forms**: specific government forms and applications may mandate physical signatures. + +:::{admonition} Disclaimer +The information provided on this page is for general informational purposes only and does not +constitute legal advice. While Odoo Sign complies with the Electronic Signature Law of Kuwait, +users should consult with legal professionals to ensure specific document types and use cases +meet all legal requirements. Compliance with additional industry-specific regulations may also be +necessary. +::: + +*Last updated: June 21, 2024* + diff --git a/content/applications/productivity/sign/malaysia.md b/content/applications/productivity/sign/malaysia.md new file mode 100644 index 000000000..8ce52f795 --- /dev/null +++ b/content/applications/productivity/sign/malaysia.md @@ -0,0 +1,70 @@ +--- +orphan: true +--- + +# Odoo Sign legality in Malaysia + +{doc}`Odoo Sign <../sign>` is your trusted partner for secure, efficient, and legally compliant +electronic signatures in Malaysia. + +## Legal framework for electronic signatures in Malaysia + +In Malaysia, electronic signatures are regulated under the [Digital Signature Act 1997](http://www.commonlii.org/my/legis/consol_act/dsa1997181/) and the [Electronic Commerce Act 2006](https://aseanconsumer.org/file/post_image/Act%20658%20-%20Electronic%20Commerce%20Act%202006.pdf). +The law governs transactions performed through electronic means and the use of digital signatures. +The key points of the law include: + +- **Legal recognition**: electronic signatures are legally equivalent to handwritten signatures if + they meet certain criteria. +- **Reliability and security**: electronic signatures must be created with a secure method that can + reliably identify the signatory and ensure the integrity of the signed document. +- **Certified digital signatures**: the law governs the use of digital certificates to provide major + security and integrity to digital signatures. In some cases, electronic signatures must be + certified by an electronic signature certification authority. + +## How Odoo Sign complies with Malaysian regulations + +Odoo Sign ensures full compliance with the Electronic Signature Law of Malaysia by incorporating +the following features: + +- **Secure signature creation**: Odoo Sign utilizes advanced cryptographic techniques to ensure the + authenticity and integrity of electronic signatures. +- **Third-party signature authenticator**: Odoo Online serves as an independent validation mechanism + that adds an extra layer of security to the procurement process. +- **Audit trails**: detailed audit logs are maintained to provide evidence of the signing process, + including timestamps, IP addresses, and identity verification. +- **Cryptographic traceability and immutability**: Odoo Sign ensures that any operation is logged + securely. An audit log provides full transparency to all parties while preserving private data. +- **Multiple authentication means**: authentication by SMS, email, geoIP or handwritten electronic + signature. + +## Types of documents you can sign with Odoo Sign + +Odoo Sign is versatile and can be used for a wide range of documents, including but not limited to: + +- **Contracts and agreements**: business contracts, employment agreements, and service contracts. +- **Financial documents**: loan agreements, investment documents, and financial reports. +- **HR documents**: employee onboarding forms, non-disclosure agreements (NDAs), and performance + reviews. +- **Commercial transactions**: purchase orders, sales agreements, and supplier contracts. + +## Potential exceptions + +While Odoo Sign is broadly applicable, there are certain exceptions where electronic signatures may +not be suitable or legally recognized in Malaysia: + +- **Wills and trusts**: documents related to inheritance, wills, and trusts often require + handwritten signatures. +- **Real estate transactions**: some property transactions may still require notarized handwritten + signatures. +- **Government forms**: specific government forms and applications may mandate physical signatures. + +:::{admonition} Disclaimer +The information provided on this page is for general informational purposes only and does not +constitute legal advice. While Odoo Sign complies with the Electronic Signature Law of Malaysia, +users should consult with legal professionals to ensure specific document types and use cases +meet all legal requirements. Compliance with additional industry-specific regulations may also be +necessary. +::: + +*Last updated: June 21, 2024* + diff --git a/content/applications/productivity/sign/mexico.md b/content/applications/productivity/sign/mexico.md new file mode 100644 index 000000000..5263df154 --- /dev/null +++ b/content/applications/productivity/sign/mexico.md @@ -0,0 +1,70 @@ +--- +orphan: true +--- + +# Odoo Sign legality in Mexico + +{doc}`Odoo Sign <../sign>` is your trusted partner for secure, efficient, and legally compliant +electronic signatures in Mexico. + +## Legal framework for electronic signatures in Mexico + +In Mexico, electronic signatures are regulated under the [Mexican Civil Code](https://www.diputados.gob.mx/LeyesBiblio/pdf/CCF.pdf) and the [Commercial Code](http://www.ordenjuridico.gob.mx/Publicaciones/pdf/L222.pdf), as well as the civil codes of each +state. The law governs transactions performed through electronic means and the use of electronic +signatures. The key points of the law include: + +- **Legal recognition**: electronic signatures are legally equivalent to handwritten signatures if + they meet certain criteria. +- **Reliability and security**: electronic signatures must be created with a secure method that can + reliably identify the signatory and ensure the integrity of the signed document. +- **NORMA Oficial Mexicana NOM-151-SCFI-2016 (NOM 151)**: establishes the requirements for the + conservation of data messages and digitization of documents with full guarantees of integrity. It + also establishes the certification and time stamping requirements for certain documents. + +## How Odoo Sign complies with Mexican regulations + +Odoo Sign ensures full compliance with the Electronic Signature Law of Mexico by incorporating the +following features: + +- **Secure signature creation**: Odoo Sign utilizes advanced cryptographic techniques to ensure the + authenticity and integrity of electronic signatures. +- **Third-party signature authenticator**: Odoo Online serves as an independent validation mechanism + that adds an extra layer of security to the procurement process. +- **Audit trails**: detailed audit logs are maintained to provide evidence of the signing process, + including timestamps, IP addresses, and identity verification. +- **Cryptographic traceability and immutability**: Odoo Sign ensures that any operation is logged + securely. An audit log provides full transparency to all parties while preserving private data. +- **Multiple authentication means**: authentication by SMS, email, geoIP or handwritten electronic + signature. + +## Types of documents you can sign with Odoo Sign + +Odoo Sign is versatile and can be used for a wide range of documents, including but not limited to: + +- **Contracts and agreements**: business contracts, employment agreements, and service contracts. +- **Financial documents**: loan agreements, investment documents, and financial reports. +- **HR documents**: employee onboarding forms, non-disclosure agreements (NDAs), and performance + reviews. +- **Commercial transactions**: purchase orders, sales agreements, and supplier contracts. + +## Potential exceptions + +While Odoo Sign is broadly applicable, there are certain exceptions where electronic signatures may +not be suitable or legally recognized in Mexico: + +- **Wills and trusts**: documents related to inheritance, wills, and trusts often require + handwritten signatures. +- **Real estate transactions**: some property transactions may still require notarized handwritten + signatures. +- **Government forms**: specific government forms and applications may mandate physical signatures. + +:::{admonition} Disclaimer +The information provided on this page is for general informational purposes only and does not +constitute legal advice. While Odoo Sign complies with the Electronic Signature Law of Mexico, +users should consult with legal professionals to ensure specific document types and use cases +meet all legal requirements. Compliance with additional industry-specific regulations may also be +necessary. +::: + +*Last updated: June 19, 2024* + diff --git a/content/applications/productivity/sign/morocco.md b/content/applications/productivity/sign/morocco.md new file mode 100644 index 000000000..abffc06d1 --- /dev/null +++ b/content/applications/productivity/sign/morocco.md @@ -0,0 +1,69 @@ +--- +orphan: true +--- + +# Odoo Sign legality in Morocco + +{doc}`Odoo Sign <../sign>` is your trusted partner for secure, efficient, and legally compliant +electronic signatures in Morocco. + +## Legal framework for electronic signatures in Morocco + +In Morocco, electronic signatures are regulated under the [Law No. 53-05 on Digital Signature](https://tahseen.ae/media/3036/law-on-electronic-exchange-of-legal-data.pdf). The law establishes +the legal basis for acknowledging electronic records, contracts, and digital signatures. The key +points of the law include: + +- **Legal recognition**: electronic signatures are legally equivalent to handwritten signatures if + they meet certain criteria. +- **Reliability and security**: electronic signatures must be created with a secure method that can + reliably identify the signatory and ensure the integrity of the signed document. +- **Certified electronic signature**: digital signature generated using a digital certificate + supplied by a qualified provider. + +## How Odoo Sign complies with Moroccan regulations + +Odoo Sign ensures full compliance with the Electronic Signature Law of Morocco by incorporating the +following features: + +- **Secure signature creation**: Odoo Sign utilizes advanced cryptographic techniques to ensure the + authenticity and integrity of electronic signatures. +- **Third-party signature authenticator**: Odoo Online serves as an independent validation mechanism + that adds an extra layer of security to the procurement process. +- **Audit trails**: detailed audit logs are maintained to provide evidence of the signing process, + including timestamps, IP addresses, and identity verification. +- **Cryptographic traceability and immutability**: Odoo Sign ensures that any operation is logged + securely. An audit log provides full transparency to all parties while preserving private data. +- **Multiple authentication means**: authentication by SMS, email, geoIP or handwritten electronic + signature. + +## Types of documents you can sign with Odoo Sign + +Odoo Sign is versatile and can be used for a wide range of documents, including but not limited to: + +- **Contracts and agreements**: business contracts, employment agreements, and service contracts. +- **Financial documents**: loan agreements, investment documents, and financial reports. +- **HR documents**: employee onboarding forms, non-disclosure agreements (NDAs), and performance + reviews. +- **Commercial transactions**: purchase orders, sales agreements, and supplier contracts. + +## Potential exceptions + +While Odoo Sign is broadly applicable, there are certain exceptions where electronic signatures may +not be suitable or legally recognized in Morocco: + +- **Wills and trusts**: documents related to inheritance, wills, and trusts often require + handwritten signatures. +- **Real estate transactions**: some property transactions may still require notarized handwritten + signatures. +- **Government forms**: specific government forms and applications may mandate physical signatures. + +:::{admonition} Disclaimer +The information provided on this page is for general informational purposes only and does not +constitute legal advice. While Odoo Sign complies with the Electronic Signature Law of Morocco, +users should consult with legal professionals to ensure specific document types and use cases +meet all legal requirements. Compliance with additional industry-specific regulations may also be +necessary. +::: + +*Last updated: June 21, 2024* + diff --git a/content/applications/productivity/sign/new_zealand.md b/content/applications/productivity/sign/new_zealand.md new file mode 100644 index 000000000..60a487f10 --- /dev/null +++ b/content/applications/productivity/sign/new_zealand.md @@ -0,0 +1,69 @@ +--- +orphan: true +--- + +# Odoo Sign legality in New Zealand + +{doc}`Odoo Sign <../sign>` is your trusted partner for secure, efficient, and legally compliant +electronic signatures in New Zealand. + +## Legal framework for electronic signatures in New Zealand + +In New Zealand, electronic signatures are regulated under the [Contract and Commercial Law Act](https://www.legislation.govt.nz/act/public/2017/0005/21.0/DLM6844033.html). The law establishes +the legal basis for acknowledging electronic records, contracts, and digital signatures. The key +points of the law include: + +- **Legal recognition**: electronic signatures are legally equivalent to handwritten signatures if + they meet certain criteria. +- **Reliability and security**: electronic signatures must be created with a secure method that can + reliably identify the signatory and ensure the integrity of the signed document. +- **Special cases**: in New Zealand, there are certain use cases that require a traditional + signature and expressly exclude the use of electronic signatures. + +## How Odoo Sign complies with New Zealand regulations + +Odoo Sign ensures full compliance with the Electronic Signature Law of New Zealand by incorporating +the following features: + +- **Secure signature creation**: Odoo Sign utilizes advanced cryptographic techniques to ensure the + authenticity and integrity of electronic signatures. +- **Third-party signature authenticator**: Odoo Online serves as an independent validation mechanism + that adds an extra layer of security to the procurement process. +- **Audit trails**: detailed audit logs are maintained to provide evidence of the signing process, + including timestamps, IP addresses, and identity verification. +- **Cryptographic traceability and immutability**: Odoo Sign ensures that any operation is logged + securely. An audit log provides full transparency to all parties while preserving private data. +- **Multiple authentication means**: authentication by SMS, email, geoIP or handwritten electronic + signature. + +## Types of documents you can sign with Odoo Sign + +Odoo Sign is versatile and can be used for a wide range of documents, including but not limited to: + +- **Contracts and agreements**: business contracts, employment agreements, and service contracts. +- **Financial documents**: loan agreements, investment documents, and financial reports. +- **HR documents**: employee onboarding forms, non-disclosure agreements (NDAs), and performance + reviews. +- **Commercial transactions**: purchase orders, sales agreements, and supplier contracts. + +## Potential exceptions + +While Odoo Sign is broadly applicable, there are certain exceptions where electronic signatures may +not be suitable or legally recognized in New Zealand: + +- **Wills and trusts**: documents related to inheritance, wills, and trusts often require + handwritten signatures. +- **Real estate transactions**: some property transactions may still require notarized handwritten + signatures. +- **Government forms**: specific government forms and applications may mandate physical signatures. + +:::{admonition} Disclaimer +The information provided on this page is for general informational purposes only and does not +constitute legal advice. While Odoo Sign complies with the Electronic Signature Law of New +Zealand, users should consult with legal professionals to ensure specific document types and use +cases meet all legal requirements. Compliance with additional industry-specific regulations may +also be necessary. +::: + +*Last updated: June 21, 2024* + diff --git a/content/applications/productivity/sign/nigeria.md b/content/applications/productivity/sign/nigeria.md new file mode 100644 index 000000000..7728c1b7f --- /dev/null +++ b/content/applications/productivity/sign/nigeria.md @@ -0,0 +1,67 @@ +--- +orphan: true +--- + +# Odoo Sign legality in Nigeria + +{doc}`Odoo Sign <../sign>` is your trusted partner for secure, efficient, and legally compliant +electronic signatures in Nigeria. + +## Legal framework for electronic signatures in Nigeria + +In Nigeria, electronic signatures are regulated under the [Nigerian Evidence Act](https://www.refworld.org/legal/legislation/natlegbod/2011/en/104226). The law governs +transactions performed through electronic means and the use of digital signatures. The key points of +the law include: + +- **Legal recognition**: electronic signatures are legally equivalent to handwritten signatures if + they meet certain criteria. +- **Reliability and security**: electronic signatures must be created with a secure method that can + reliably identify the signatory and ensure the integrity of the signed document. + +## How Odoo Sign complies with Nigerian regulations + +Odoo Sign ensures full compliance with the Electronic Signature Law of Nigeria by incorporating +the following features: + +- **Secure signature creation**: Odoo Sign utilizes advanced cryptographic techniques to ensure the + authenticity and integrity of electronic signatures. +- **Third-party signature authenticator**: Odoo Online serves as an independent validation mechanism + that adds an extra layer of security to the procurement process. +- **Audit trails**: detailed audit logs are maintained to provide evidence of the signing process, + including timestamps, IP addresses, and identity verification. +- **Cryptographic traceability and immutability**: Odoo Sign ensures that any operation is logged + securely. An audit log provides full transparency to all parties while preserving private data. +- **Multiple authentication means**: authentication by SMS, email, geoIP or handwritten electronic + signature. + +## Types of documents you can sign with Odoo Sign + +Odoo Sign is versatile and can be used for a wide range of documents, including but not limited to: + +- **Contracts and agreements**: business contracts, employment agreements, and service contracts. +- **Financial documents**: loan agreements, investment documents, and financial reports. +- **HR documents**: employee onboarding forms, non-disclosure agreements (NDAs), and performance + reviews. +- **Commercial transactions**: purchase orders, sales agreements, and supplier contracts. + +## Potential exceptions + +While Odoo Sign is broadly applicable, there are certain exceptions where electronic signatures may +not be suitable or legally recognized in Nigeria: + +- **Wills and trusts**: documents related to inheritance, wills, and trusts often require + handwritten signatures. +- **Real estate transactions**: some property transactions may still require notarized handwritten + signatures. +- **Government forms**: specific government forms and applications may mandate physical signatures. + +:::{admonition} Disclaimer +The information provided on this page is for general informational purposes only and does not +constitute legal advice. While Odoo Sign complies with the Electronic Signature Law of Nigeria, +users should consult with legal professionals to ensure specific document types and use cases +meet all legal requirements. Compliance with additional industry-specific regulations may also be +necessary. +::: + +*Last updated: June 21, 2024* + diff --git a/content/applications/productivity/sign/norway.md b/content/applications/productivity/sign/norway.md new file mode 100644 index 000000000..d8447ce6d --- /dev/null +++ b/content/applications/productivity/sign/norway.md @@ -0,0 +1,71 @@ +--- +orphan: true +--- + +# Odoo Sign legality in Norway + +{doc}`Odoo Sign <../sign>` is your trusted partner for secure, efficient, and legally compliant +electronic signatures in Norway. + +## Legal framework for electronic signatures in Norway + +In Norway, electronic signatures are regulated under the Act on electronic trust services that +incorporates Electronic Identification and Trust Services for Electronic Transactions in the +Internal Market (eIDAS) and Regulation No. 910/2014 of the European Parliament and of the Council. +The law governs transactions performed through electronic means and the use of electronic +signatures. The key points of the law include: + +- **Legal recognition**: electronic signatures are legally equivalent to handwritten signatures if + they meet certain criteria. +- **Reliability and security**: electronic signatures must be created with a secure method that can + reliably identify the signatory and ensure the integrity of the signed document. +- **Qualified trust service providers**: the law recognizes electronic signatures supported by + digital certificates issued by Qualified Trust Service Providers. + +## How Odoo Sign complies with Norwegian regulations + +Odoo Sign ensures full compliance with the Electronic Signature Law of Norway by incorporating the +following features: + +- **Secure signature creation**: Odoo Sign utilizes advanced cryptographic techniques to ensure the + authenticity and integrity of electronic signatures. +- **Third-party signature authenticator**: Odoo Online serves as an independent validation mechanism + that adds an extra layer of security to the procurement process. +- **Audit trails**: detailed audit logs are maintained to provide evidence of the signing process, + including timestamps, IP addresses, and identity verification. +- **Cryptographic traceability and immutability**: Odoo Sign ensures that any operation is logged + securely. An audit log provides full transparency to all parties while preserving private data. +- **Multiple authentication means**: authentication by SMS, email, geoIP or handwritten electronic + signature. + +## Types of documents you can sign with Odoo Sign + +Odoo Sign is versatile and can be used for a wide range of documents, including but not limited to: + +- **Contracts and agreements**: business contracts, employment agreements, and service contracts. +- **Financial documents**: loan agreements, investment documents, and financial reports. +- **HR documents**: employee onboarding forms, non-disclosure agreements (NDAs), and performance + reviews. +- **Commercial transactions**: purchase orders, sales agreements, and supplier contracts. + +## Potential exceptions + +While Odoo Sign is broadly applicable, there are certain exceptions where electronic signatures may +not be suitable or legally recognized in Norway: + +- **Wills and trusts**: documents related to inheritance, wills, and trusts often require + handwritten signatures. +- **Real estate transactions**: some property transactions may still require notarized handwritten + signatures. +- **Government forms**: specific government forms and applications may mandate physical signatures. + +:::{admonition} Disclaimer +The information provided on this page is for general informational purposes only and does not +constitute legal advice. While Odoo Sign complies with the Electronic Signature Law of Norway, +users should consult with legal professionals to ensure specific document types and use cases +meet all legal requirements. Compliance with additional industry-specific regulations may also be +necessary. +::: + +*Last updated: June 21, 2024* + diff --git a/content/applications/productivity/sign/oman.md b/content/applications/productivity/sign/oman.md new file mode 100644 index 000000000..3f43415f5 --- /dev/null +++ b/content/applications/productivity/sign/oman.md @@ -0,0 +1,69 @@ +--- +orphan: true +--- + +# Odoo Sign legality in Oman + +{doc}`Odoo Sign <../sign>` is your trusted partner for secure, efficient, and legally compliant +electronic signatures in Oman. + +## Legal framework for electronic signatures in Oman + +In Oman, electronic signatures are regulated under the Electronic Transactions Law. The law +establishes the legal basis for acknowledging electronic records, contracts, and digital signatures. +The key points of the law include: + +- **Legal recognition**: electronic signatures are legally equivalent to handwritten signatures if + they meet certain criteria. +- **Reliability and security**: electronic signatures must be created with a secure method that can + reliably identify the signatory and ensure the integrity of the signed document. +- **Certified electronic signature**: digital signature generated using a digital certificate + supplied by a qualified provider. + +## How Odoo Sign complies with Omani regulations + +Odoo Sign ensures full compliance with the Electronic Signature Law of Oman by incorporating the +following features: + +- **Secure signature creation**: Odoo Sign utilizes advanced cryptographic techniques to ensure the + authenticity and integrity of electronic signatures. +- **Third-party signature authenticator**: Odoo Online serves as an independent validation mechanism + that adds an extra layer of security to the procurement process. +- **Audit trails**: detailed audit logs are maintained to provide evidence of the signing process, + including timestamps, IP addresses, and identity verification. +- **Cryptographic traceability and immutability**: Odoo Sign ensures that any operation is logged + securely. An audit log provides full transparency to all parties while preserving private data. +- **Multiple authentication means**: authentication by SMS, email, geoIP or handwritten electronic + signature. + +## Types of documents you can sign with Odoo Sign + +Odoo Sign is versatile and can be used for a wide range of documents, including but not limited to: + +- **Contracts and agreements**: business contracts, employment agreements, and service contracts. +- **Financial documents**: loan agreements, investment documents, and financial reports. +- **HR documents**: employee onboarding forms, non-disclosure agreements (NDAs), and performance + reviews. +- **Commercial transactions**: purchase orders, sales agreements, and supplier contracts. + +## Potential exceptions + +While Odoo Sign is broadly applicable, there are certain exceptions where electronic signatures may +not be suitable or legally recognized in Oman: + +- **Wills and trusts**: documents related to inheritance, wills, and trusts often require + handwritten signatures. +- **Real estate transactions**: some property transactions may still require notarized handwritten + signatures. +- **Government forms**: specific government forms and applications may mandate physical signatures. + +:::{admonition} Disclaimer +The information provided on this page is for general informational purposes only and does not +constitute legal advice. While Odoo Sign complies with the Electronic Signature Law of Oman, +users should consult with legal professionals to ensure specific document types and use cases +meet all legal requirements. Compliance with additional industry-specific regulations may also be +necessary. +::: + +*Last updated: June 21, 2024* + diff --git a/content/applications/productivity/sign/pakistan.md b/content/applications/productivity/sign/pakistan.md new file mode 100644 index 000000000..53dea3109 --- /dev/null +++ b/content/applications/productivity/sign/pakistan.md @@ -0,0 +1,69 @@ +--- +orphan: true +--- + +# Odoo Sign legality in Pakistan + +{doc}`Odoo Sign <../sign>` is your trusted partner for secure, efficient, and legally compliant +electronic signatures in Pakistan. + +## Legal framework for electronic signatures in Pakistan + +In Pakistan, electronic signatures are regulated under the [Electronic Transactions Ordinance](https://www.pakistanlaw.com/eto.pdf). The law governs the use of electronic records and +signatures. The key points of the law include: + +- **Legal recognition**: electronic signatures are legally equivalent to handwritten signatures if + they meet certain criteria. +- **Reliability and security**: electronic signatures must be created with a secure method that can + reliably identify the signatory and ensure the integrity of the signed document. +- **Certified electronic signatures**: special electronic signature that incorporates certificates + issued by an accredited certification service provider authorized by the Certification Council as + being capable of establishing authenticity and integrity of an electronic document. + +## How Odoo Sign complies with Pakistani regulations + +Odoo Sign ensures full compliance with the Electronic Signature Law of Pakistan by incorporating the +following features: + +- **Secure signature creation**: Odoo Sign utilizes advanced cryptographic techniques to ensure the + authenticity and integrity of electronic signatures. +- **Third-party signature authenticator**: Odoo Online serves as an independent validation mechanism + that adds an extra layer of security to the procurement process. +- **Audit trails**: detailed audit logs are maintained to provide evidence of the signing process, + including timestamps, IP addresses, and identity verification. +- **Cryptographic traceability and immutability**: Odoo Sign ensures that any operation is logged + securely. An audit log provides full transparency to all parties while preserving private data. +- **Multiple authentication means**: authentication by SMS, email, geoIP or handwritten electronic + signature. + +## Types of documents you can sign with Odoo Sign + +Odoo Sign is versatile and can be used for a wide range of documents, including but not limited to: + +- **Contracts and agreements**: business contracts, employment agreements, and service contracts. +- **Financial documents**: loan agreements, investment documents, and financial reports. +- **HR documents**: employee onboarding forms, non-disclosure agreements (NDAs), and performance + reviews. +- **Commercial transactions**: purchase orders, sales agreements, and supplier contracts. + +## Potential exceptions + +While Odoo Sign is broadly applicable, there are certain exceptions where electronic signatures may +not be suitable or legally recognized in Pakistan: + +- **Wills and trusts**: documents related to inheritance, wills, and trusts often require + handwritten signatures. +- **Real estate transactions**: some property transactions may still require notarized handwritten + signatures. +- **Government forms**: specific government forms and applications may mandate physical signatures. + +:::{admonition} Disclaimer +The information provided on this page is for general informational purposes only and does not +constitute legal advice. While Odoo Sign complies with the Electronic Signature Law of Pakistan, +users should consult with legal professionals to ensure specific document types and use cases +meet all legal requirements. Compliance with additional industry-specific regulations may also be +necessary. +::: + +*Last updated: June 21, 2024* + diff --git a/content/applications/productivity/sign/peru.md b/content/applications/productivity/sign/peru.md new file mode 100644 index 000000000..dbb8b8de9 --- /dev/null +++ b/content/applications/productivity/sign/peru.md @@ -0,0 +1,72 @@ +--- +orphan: true +--- + +# Odoo Sign legality in Peru + +{doc}`Odoo Sign <../sign>` is your trusted partner for secure, efficient, and legally compliant +electronic signatures in Peru. + +## Legal framework for electronic signatures in Peru + +In Peru, electronic signatures are regulated under the [Peruvian Civil Code, Law 27269 – Law of +Digital Signatures and Certificates](https://webfiles-sc1.blackbaud.com/files/support/helpfiles/npoconnect/content/resources/attachments/peru-law-295-civil-code.pdf), +[Supreme Decree N° 052-2008-PCM – Regulation of the Law of Digital Signatures and Certificates](https://www.gob.pe/institucion/pcm/normas-legales/292462-052-2008-pcm). +The law establishes the legal basis for acknowledging electronic records, contracts, and digital +signatures. The key points of the law include: + +- **Legal recognition**: electronic signatures are legally equivalent to handwritten signatures if + they meet certain criteria. +- **Reliability and security**: electronic signatures must be created with a secure method that can + reliably identify the signatory and ensure the integrity of the signed document. +- **Digital signatures generated with the official electronic signature infrastructure**: digital + signature generated using a digital certificate supplied by a provider accredited as such by the + National Institute for the Defense of Competition and the Protection of Intellectual Property. + +## How Odoo Sign complies with Peruvian regulations + +Odoo Sign ensures full compliance with the Electronic Signature Law of Peru by incorporating the +following features: + +- **Secure signature creation**: Odoo Sign utilizes advanced cryptographic techniques to ensure the + authenticity and integrity of electronic signatures. +- **Third-party signature authenticator**: Odoo Online serves as an independent validation mechanism + that adds an extra layer of security to the procurement process. +- **Audit trails**: detailed audit logs are maintained to provide evidence of the signing process, + including timestamps, IP addresses, and identity verification. +- **Cryptographic traceability and immutability**: Odoo Sign ensures that any operation is logged + securely. An audit log provides full transparency to all parties while preserving private data. +- **Multiple authentication means**: authentication by SMS, email, geoIP or handwritten electronic + signature. + +## Types of documents you can sign with Odoo Sign + +Odoo Sign is versatile and can be used for a wide range of documents, including but not limited to: + +- **Contracts and agreements**: business contracts, employment agreements, and service contracts. +- **Financial documents**: loan agreements, investment documents, and financial reports. +- **HR documents**: employee onboarding forms, non-disclosure agreements (NDAs), and performance + reviews. +- **Commercial transactions**: purchase orders, sales agreements, and supplier contracts. + +## Potential exceptions + +While Odoo Sign is broadly applicable, there are certain exceptions where electronic signatures may +not be suitable or legally recognized in Peru: + +- **Wills and trusts**: documents related to inheritance, wills, and trusts often require + handwritten signatures. +- **Real estate transactions**: some property transactions may still require notarized handwritten + signatures. +- **Government forms**: specific government forms and applications may mandate physical signatures. + +:::{admonition} Disclaimer +The information provided on this page is for general informational purposes only and does not +constitute legal advice. While Odoo Sign complies with the Electronic Signature Law of Peru, +users should consult with legal professionals to ensure specific document types and use cases +meet all legal requirements. Compliance with additional industry-specific regulations may also be +necessary. +::: + +*Last updated: June 21, 2024* + diff --git a/content/applications/productivity/sign/philippines.md b/content/applications/productivity/sign/philippines.md new file mode 100644 index 000000000..24d4b4826 --- /dev/null +++ b/content/applications/productivity/sign/philippines.md @@ -0,0 +1,70 @@ +--- +orphan: true +--- + +# Odoo Sign legality in the Philippines + +{doc}`Odoo Sign <../sign>` is your trusted partner for secure, efficient, and legally compliant +electronic signatures in the Philippines. + +## Legal framework for electronic signatures in the Philippines + +In the Philippines, electronic signatures are regulated under the [Republic Act No. 8792](https://www.bsp.gov.ph/PaymentAndSettlement/RA8792.pdf) and the [Electronic Commerce Act](https://pdf.usaid.gov/pdf_docs/pnacn440.pdf). The law governs the use of electronic records and +signatures. The key points of the law include: + +- **Legal recognition**: electronic signatures are legally equivalent to handwritten signatures if + they meet certain criteria. +- **Reliability and security**: electronic signatures must be created with a secure method that can + reliably identify the signatory and ensure the integrity of the signed document. +- **Philippine national public key infrastructure system**: the Philippine government operates an + official PKI system known as the Philippine National Public Key Infrastructure. This system + requires subscribers to adhere to specific obligations regarding the custody and proper use of + digital certificates. + +## How Odoo Sign complies with Philippine regulations + +Odoo Sign ensures full compliance with the Electronic Signature Law of the Philippines by +incorporating the following features: + +- **Secure signature creation**: Odoo Sign utilizes advanced cryptographic techniques to ensure the + authenticity and integrity of electronic signatures. +- **Third-party signature authenticator**: Odoo Online serves as an independent validation mechanism + that adds an extra layer of security to the procurement process. +- **Audit trails**: detailed audit logs are maintained to provide evidence of the signing process, + including timestamps, IP addresses, and identity verification. +- **Cryptographic traceability and immutability**: Odoo Sign ensures that any operation is logged + securely. An audit log provides full transparency to all parties while preserving private data. +- **Multiple authentication means**: authentication by SMS, email, geoIP or handwritten electronic + signature. + +## Types of documents you can sign with Odoo Sign + +Odoo Sign is versatile and can be used for a wide range of documents, including but not limited to: + +- **Contracts and agreements**: business contracts, employment agreements, and service contracts. +- **Financial documents**: loan agreements, investment documents, and financial reports. +- **HR documents**: employee onboarding forms, non-disclosure agreements (NDAs), and performance + reviews. +- **Commercial transactions**: purchase orders, sales agreements, and supplier contracts. + +## Potential exceptions + +While Odoo Sign is broadly applicable, there are certain exceptions where electronic signatures may +not be suitable or legally recognized in the Philippines: + +- **Wills and trusts**: documents related to inheritance, wills, and trusts often require + handwritten signatures. +- **Real estate transactions**: some property transactions may still require notarized handwritten + signatures. +- **Government forms**: specific government forms and applications may mandate physical signatures. + +:::{admonition} Disclaimer +The information provided on this page is for general informational purposes only and does not +constitute legal advice. While Odoo Sign complies with the Electronic Signature Law of the +Philippines, users should consult with legal professionals to ensure specific document types and +use cases meet all legal requirements. Compliance with additional industry-specific regulations +may also be necessary. +::: + +*Last updated: June 21, 2024* + diff --git a/content/applications/productivity/sign/qatar.md b/content/applications/productivity/sign/qatar.md new file mode 100644 index 000000000..7ca5ac597 --- /dev/null +++ b/content/applications/productivity/sign/qatar.md @@ -0,0 +1,70 @@ +--- +orphan: true +--- + +# Odoo Sign legality in Qatar + +{doc}`Odoo Sign <../sign>` is your trusted partner for secure, efficient, and legally compliant +electronic signatures in Qatar. + +## Legal framework for electronic signatures in Qatar + +In Qatar, electronic signatures are regulated under the [Electronic Transactions and Commerce Law +No. 16 of 2010](https://cyrilla.org/api/files/158944297524747iagh8c1wf.pdf). The law establishes +the legal basis for acknowledging electronic records, contracts, and digital signatures. The key +points of the law include: + +- **Legal recognition**: electronic signatures are legally equivalent to handwritten signatures if + they meet certain criteria. +- **Reliability and security**: electronic signatures must be created with a secure method that can + reliably identify the signatory and ensure the integrity of the signed document. +- **Certification authorities**: digital signature generated using a digital certificate supplied by + a certified provider. + +## How Odoo Sign complies with Qatari regulations + +Odoo Sign ensures full compliance with the Electronic Signature Law of Qatar by incorporating the +following features: + +- **Secure signature creation**: Odoo Sign utilizes advanced cryptographic techniques to ensure the + authenticity and integrity of electronic signatures. +- **Third-party signature authenticator**: Odoo Online serves as an independent validation mechanism + that adds an extra layer of security to the procurement process. +- **Audit trails**: detailed audit logs are maintained to provide evidence of the signing process, + including timestamps, IP addresses, and identity verification. +- **Cryptographic traceability and immutability**: Odoo Sign ensures that any operation is logged + securely. An audit log provides full transparency to all parties while preserving private data. +- **Multiple authentication means**: authentication by SMS, email, geoIP or handwritten electronic + signature. + +## Types of documents you can sign with Odoo Sign + +Odoo Sign is versatile and can be used for a wide range of documents, including but not limited to: + +- **Contracts and agreements**: business contracts, employment agreements, and service contracts. +- **Financial documents**: loan agreements, investment documents, and financial reports. +- **HR documents**: employee onboarding forms, non-disclosure agreements (NDAs), and performance + reviews. +- **Commercial transactions**: purchase orders, sales agreements, and supplier contracts. + +## Potential exceptions + +While Odoo Sign is broadly applicable, there are certain exceptions where electronic signatures may +not be suitable or legally recognized in Qatar: + +- **Wills and trusts**: documents related to inheritance, wills, and trusts often require + handwritten signatures. +- **Real estate transactions**: some property transactions may still require notarized handwritten + signatures. +- **Government forms**: specific government forms and applications may mandate physical signatures. + +:::{admonition} Disclaimer +The information provided on this page is for general informational purposes only and does not +constitute legal advice. While Odoo Sign complies with the Electronic Signature Law of Qatar, +users should consult with legal professionals to ensure specific document types and use cases +meet all legal requirements. Compliance with additional industry-specific regulations may also be +necessary. +::: + +*Last updated: June 21, 2024* + diff --git a/content/applications/productivity/sign/russia.md b/content/applications/productivity/sign/russia.md new file mode 100644 index 000000000..78077b93e --- /dev/null +++ b/content/applications/productivity/sign/russia.md @@ -0,0 +1,73 @@ +--- +orphan: true +--- + +# Odoo Sign legality in Russia + +{doc}`Odoo Sign <../sign>` is your trusted partner for secure, efficient, and legally compliant +electronic signatures in Russia. + +## Legal framework for electronic signatures in Russia + +In Russia, electronic signatures are regulated under the [Federal Law No. 63-FZ as of 6 April 2011 +"On electronic signature"](https://afyonluoglu.org/PublicWebFiles/e-imza/int-legislation/Russia-Federal%20Law%20on%20e-Signatures.pdf) +and the [Civil Code of the Russian Federation](https://www.wto.org/english/thewto_e/acc_e/rus_e/wtaccrus58_leg_360.pdf). The law provides the +foundation for the use and legal recognition of electronic signatures. The key points of the law +include: + +- **Legal recognition**: electronic signatures are legally equivalent to handwritten signatures if + they meet certain criteria. +- **Reliability and security**: electronic signatures must be created with a secure method that can + reliably identify the signatory and ensure the integrity of the signed document. +- **Qualified electronic signatures**: the law recognizes digital signature certificates that serve + as proof of identity of an individual for a certain purpose that can be used in special cases to + provide additional security. These certificates are issued by Certification Authorities and are + required by law for the signature of specific acts. + +## How Odoo Sign complies with Russian regulations + +Odoo Sign ensures full compliance with the Electronic Signature Law of Russia by incorporating the +following features: + +- **Secure signature creation**: Odoo Sign utilizes advanced cryptographic techniques to ensure the + authenticity and integrity of electronic signatures. +- **Third-party signature authenticator**: Odoo Online serves as an independent validation mechanism + that adds an extra layer of security to the procurement process. +- **Audit trails**: detailed audit logs are maintained to provide evidence of the signing process, + including timestamps, IP addresses, and identity verification. +- **Cryptographic traceability and immutability**: Odoo Sign ensures that any operation is logged + securely. An audit log provides full transparency to all parties while preserving private data. +- **Multiple authentication means**: authentication by SMS, email, geoIP or handwritten electronic + signature. + +## Types of documents you can sign with Odoo Sign + +Odoo Sign is versatile and can be used for a wide range of documents, including but not limited to: + +- **Contracts and agreements**: business contracts, employment agreements, and service contracts. +- **Financial documents**: loan agreements, investment documents, and financial reports. +- **HR documents**: employee onboarding forms, non-disclosure agreements (NDAs), and performance + reviews. +- **Commercial transactions**: purchase orders, sales agreements, and supplier contracts. + +## Potential exceptions + +While Odoo Sign is broadly applicable, there are certain exceptions where electronic signatures may +not be suitable or legally recognized in Russia: + +- **Wills and trusts**: documents related to inheritance, wills, and trusts often require + handwritten signatures. +- **Real estate transactions**: some property transactions may still require notarized handwritten + signatures. +- **Government forms**: specific government forms and applications may mandate physical signatures. + +:::{admonition} Disclaimer +The information provided on this page is for general informational purposes only and does not +constitute legal advice. While Odoo Sign complies with the Electronic Signature Law of Russia, +users should consult with legal professionals to ensure specific document types and use cases +meet all legal requirements. Compliance with additional industry-specific regulations may also be +necessary. +::: + +*Last updated: June 19, 2024* + diff --git a/content/applications/productivity/sign/saudi_arabia.md b/content/applications/productivity/sign/saudi_arabia.md new file mode 100644 index 000000000..66a44d7f5 --- /dev/null +++ b/content/applications/productivity/sign/saudi_arabia.md @@ -0,0 +1,69 @@ +--- +orphan: true +--- + +# Odoo Sign legality in Saudi Arabia + +{doc}`Odoo Sign <../sign>` is your trusted partner for secure, efficient, and legally compliant +electronic signatures in Saudi Arabia. + +## Legal framework for electronic signatures in Saudi Arabia + +In Saudi Arabia, electronic signatures are regulated under the [Electronic Transactions Law](https://www.mcit.gov.sa/sites/default/files/2021-06/la_003_e_e-transactions_act%20%281%29.pdf) +and the Regulation No. 1/1429. The law governs transactions performed through electronic means and +the use of electronic signatures. The key points of the law include: + +- **Legal recognition**: electronic signatures are legally equivalent to handwritten signatures if + they meet certain criteria. +- **Reliability and security**: electronic signatures must be created with a secure method that can + reliably identify the signatory and ensure the integrity of the signed document. +- **Certificate-based digital signatures**: the law recognizes electronic signatures supported by + digital certificates issued by accredited Certification Service Provider. + +## How Odoo Sign complies with Saudi regulations + +Odoo Sign ensures full compliance with the Electronic Signature Law of Saudi Arabia by incorporating +the following features: + +- **Secure signature creation**: Odoo Sign utilizes advanced cryptographic techniques to ensure the + authenticity and integrity of electronic signatures. +- **Third-party signature authenticator**: Odoo Online serves as an independent validation mechanism + that adds an extra layer of security to the procurement process. +- **Audit trails**: detailed audit logs are maintained to provide evidence of the signing process, + including timestamps, IP addresses, and identity verification. +- **Cryptographic traceability and immutability**: Odoo Sign ensures that any operation is logged + securely. An audit log provides full transparency to all parties while preserving private data. +- **Multiple authentication means**: authentication by SMS, email, geoIP or handwritten electronic + signature. + +## Types of documents you can sign with Odoo Sign + +Odoo Sign is versatile and can be used for a wide range of documents, including but not limited to: + +- **Contracts and agreements**: business contracts, employment agreements, and service contracts. +- **Financial documents**: loan agreements, investment documents, and financial reports. +- **HR documents**: employee onboarding forms, non-disclosure agreements (NDAs), and performance + reviews. +- **Commercial transactions**: purchase orders, sales agreements, and supplier contracts. + +## Potential exceptions + +While Odoo Sign is broadly applicable, there are certain exceptions where electronic signatures may +not be suitable or legally recognized in Saudi Arabia: + +- **Wills and trusts**: documents related to inheritance, wills, and trusts often require + handwritten signatures. +- **Real estate transactions**: some property transactions may still require notarized handwritten + signatures. +- **Government forms**: specific government forms and applications may mandate physical signatures. + +:::{admonition} Disclaimer +The information provided on this page is for general informational purposes only and does not +constitute legal advice. While Odoo Sign complies with the Electronic Signature Law of Saudi +Arabia, users should consult with legal professionals to ensure specific document types and use +cases meet all legal requirements. Compliance with additional industry-specific regulations may +also be necessary. +::: + +*Last updated: June 21, 2024* + diff --git a/content/applications/productivity/sign/singapore.md b/content/applications/productivity/sign/singapore.md new file mode 100644 index 000000000..fc5716cd0 --- /dev/null +++ b/content/applications/productivity/sign/singapore.md @@ -0,0 +1,67 @@ +--- +orphan: true +--- + +# Odoo Sign legality in Singapore + +{doc}`Odoo Sign <../sign>` is your trusted partner for secure, efficient, and legally compliant +electronic signatures in Singapore. + +## Legal framework for electronic signatures in Singapore + +In Singapore, electronic signatures are regulated under the [Electronic Transactions Act](https://www.imda.gov.sg/-/media/imda/files/regulation-licensing-and-consultations/acts-regulations/electronic-transactions-act.pdf). +The law recognizes the use of electronic documents and electronic signatures for the execution of +contracts and other transactions. The key points of the law include: + +- **Legal recognition**: electronic signatures are legally equivalent to handwritten signatures if + they meet certain criteria. +- **Reliability and security**: electronic signatures must be created with a secure method that can + reliably identify the signatory and ensure the integrity of the signed document. + +## How Odoo Sign complies with Singapore regulations + +Odoo Sign ensures full compliance with the Electronic Signature Law of Singapore by incorporating +the following features: + +- **Secure signature creation**: Odoo Sign utilizes advanced cryptographic techniques to ensure the + authenticity and integrity of electronic signatures. +- **Third-party signature authenticator**: Odoo Online serves as an independent validation mechanism + that adds an extra layer of security to the procurement process. +- **Audit trails**: detailed audit logs are maintained to provide evidence of the signing process, + including timestamps, IP addresses, and identity verification. +- **Cryptographic traceability and immutability**: Odoo Sign ensures that any operation is logged + securely. An audit log provides full transparency to all parties while preserving private data. +- **Multiple authentication means**: authentication by SMS, email, geoIP or handwritten electronic + signature. + +## Types of documents you can sign with Odoo Sign + +Odoo Sign is versatile and can be used for a wide range of documents, including but not limited to: + +- **Contracts and agreements**: business contracts, employment agreements, and service contracts. +- **Financial documents**: loan agreements, investment documents, and financial reports. +- **HR documents**: employee onboarding forms, non-disclosure agreements (NDAs), and performance + reviews. +- **Commercial transactions**: purchase orders, sales agreements, and supplier contracts. + +## Potential exceptions + +While Odoo Sign is broadly applicable, there are certain exceptions where electronic signatures may +not be suitable or legally recognized in Singapore: + +- **Wills and trusts**: documents related to inheritance, wills, and trusts often require + handwritten signatures. +- **Real estate transactions**: some property transactions may still require notarized handwritten + signatures. +- **Government forms**: specific government forms and applications may mandate physical signatures. + +:::{admonition} Disclaimer +The information provided on this page is for general informational purposes only and does not +constitute legal advice. While Odoo Sign complies with the Electronic Signature Law of Singapore, +users should consult with legal professionals to ensure specific document types and use cases +meet all legal requirements. Compliance with additional industry-specific regulations may also be +necessary. +::: + +*Last updated: June 21, 2024* + diff --git a/content/applications/productivity/sign/south_africa.md b/content/applications/productivity/sign/south_africa.md new file mode 100644 index 000000000..83c4d2a23 --- /dev/null +++ b/content/applications/productivity/sign/south_africa.md @@ -0,0 +1,70 @@ +--- +orphan: true +--- + +# Odoo Sign legality in South Africa + +{doc}`Odoo Sign <../sign>` is your trusted partner for secure, efficient, and legally compliant +electronic signatures in South Africa. + +## Legal framework for electronic signatures in South Africa + +In South Africa, electronic signatures are regulated under the [Electronic Communications and +Transactions Act](https://www.gov.za/sites/default/files/gcis_document/201409/a25-02.pdf). The law +governs transactions performed through electronic means and the use of digital signatures. The key +points of the law include: + +- **Legal recognition**: electronic signatures are legally equivalent to handwritten signatures if + they meet certain criteria. +- **Reliability and security**: electronic signatures must be created with a secure method that can + reliably identify the signatory and ensure the integrity of the signed document. +- **Advance electronic signatures**: in some cases, electronic signatures must be certified by an + electronic signature certification authority. + +## How Odoo Sign complies with South African regulations + +Odoo Sign ensures full compliance with the Electronic Signature Law of South Africa by incorporating +the following features: + +- **Secure signature creation**: Odoo Sign utilizes advanced cryptographic techniques to ensure the + authenticity and integrity of electronic signatures. +- **Third-party signature authenticator**: Odoo Online serves as an independent validation mechanism + that adds an extra layer of security to the procurement process. +- **Audit trails**: detailed audit logs are maintained to provide evidence of the signing process, + including timestamps, IP addresses, and identity verification. +- **Cryptographic traceability and immutability**: Odoo Sign ensures that any operation is logged + securely. An audit log provides full transparency to all parties while preserving private data. +- **Multiple authentication means**: authentication by SMS, email, geoIP or handwritten electronic + signature. + +## Types of documents you can sign with Odoo Sign + +Odoo Sign is versatile and can be used for a wide range of documents, including but not limited to: + +- **Contracts and agreements**: business contracts, employment agreements, and service contracts. +- **Financial documents**: loan agreements, investment documents, and financial reports. +- **HR documents**: employee onboarding forms, non-disclosure agreements (NDAs), and performance + reviews. +- **Commercial transactions**: purchase orders, sales agreements, and supplier contracts. + +## Potential exceptions + +While Odoo Sign is broadly applicable, there are certain exceptions where electronic signatures may +not be suitable or legally recognized in South Africa: + +- **Wills and trusts**: documents related to inheritance, wills, and trusts often require + handwritten signatures. +- **Real estate transactions**: some property transactions may still require notarized handwritten + signatures. +- **Government forms**: specific government forms and applications may mandate physical signatures. + +:::{admonition} Disclaimer +The information provided on this page is for general informational purposes only and does not +constitute legal advice. While Odoo Sign complies with the Electronic Signature Law of South +Africa, users should consult with legal professionals to ensure specific document types and use +cases meet all legal requirements. Compliance with additional industry-specific regulations may +also be necessary. +::: + +*Last updated: June 21, 2024* + diff --git a/content/applications/productivity/sign/south_korea.md b/content/applications/productivity/sign/south_korea.md new file mode 100644 index 000000000..286939918 --- /dev/null +++ b/content/applications/productivity/sign/south_korea.md @@ -0,0 +1,72 @@ +--- +orphan: true +--- + +# Odoo Sign legality in South Korea + +{doc}`Odoo Sign <../sign>` is your trusted partner for secure, efficient, and legally compliant +electronic signatures in South Korea. + +## Legal framework for electronic signatures in South Korea + +In South Korea, electronic signatures are regulated under the [Digital Signature Act](https://elaw.klri.re.kr/eng_mobile/viewer.do?hseq=61440&type=part&key=28#:~:text=The%20purpose%20of%20this%20Act,infrastructure%20for%20facilitating%20the%20use) +and the [Framework Act on Electronic Documents and Transactions of Korea](https://elaw.klri.re.kr/eng_mobile/viewer.do?hseq=61440&type=part&key=28#:~:text=The%20purpose%20of%20this%20Act,infrastructure%20for%20facilitating%20the%20use). +The law governs transactions performed through electronic means and the use of electronic +signatures. The key points of the law include: + +- **Legal recognition**: electronic signatures are legally equivalent to handwritten signatures if + they meet certain criteria. +- **Reliability and security**: electronic signatures must be created with a secure method that can + reliably identify the signatory and ensure the integrity of the signed document. +- **Electronic signature certification services**: the law recognizes digital signature certificates + or “seals” that serve as proof of identity of an individual for a certain purpose that can be used + in special cases to provide additional security. These certificates are issued by Certification + Authorities and are required by law for the signature of specific acts. + +## How Odoo Sign complies with South Korean regulations + +Odoo Sign ensures full compliance with the Electronic Signature Law of South Korea by incorporating +the following features: + +- **Secure signature creation**: Odoo Sign utilizes advanced cryptographic techniques to ensure the + authenticity and integrity of electronic signatures. +- **Third-party signature authenticator**: Odoo Online serves as an independent validation mechanism + that adds an extra layer of security to the procurement process. +- **Audit trails**: detailed audit logs are maintained to provide evidence of the signing process, + including timestamps, IP addresses, and identity verification. +- **Cryptographic traceability and immutability**: Odoo Sign ensures that any operation is logged + securely. An audit log provides full transparency to all parties while preserving private data. +- **Multiple authentication means**: authentication by SMS, email, geoIP or handwritten electronic + signature. + +## Types of documents you can sign with Odoo Sign + +Odoo Sign is versatile and can be used for a wide range of documents, including but not limited to: + +- **Contracts and agreements**: business contracts, employment agreements, and service contracts. +- **Financial documents**: loan agreements, investment documents, and financial reports. +- **HR documents**: employee onboarding forms, non-disclosure agreements (NDAs), and performance + reviews. +- **Commercial transactions**: purchase orders, sales agreements, and supplier contracts. + +## Potential exceptions + +While Odoo Sign is broadly applicable, there are certain exceptions where electronic signatures may +not be suitable or legally recognized in South Korea: + +- **Wills and trusts**: documents related to inheritance, wills, and trusts often require + handwritten signatures. +- **Real estate transactions**: some property transactions may still require notarized handwritten + signatures. +- **Government forms**: specific government forms and applications may mandate physical signatures. + +:::{admonition} Disclaimer +The information provided on this page is for general informational purposes only and does not +constitute legal advice. While Odoo Sign complies with the Electronic Signature Law of South +Korea, users should consult with legal professionals to ensure specific document types and use +cases meet all legal requirements. Compliance with additional industry-specific regulations may +also be necessary. +::: + +*Last updated: June 19, 2024* + diff --git a/content/applications/productivity/sign/switzerland.md b/content/applications/productivity/sign/switzerland.md new file mode 100644 index 000000000..d41c3a78f --- /dev/null +++ b/content/applications/productivity/sign/switzerland.md @@ -0,0 +1,69 @@ +--- +orphan: true +--- + +# Odoo Sign legality in Switzerland + +{doc}`Odoo Sign <../sign>` is your trusted partner for secure, efficient, and legally compliant +electronic signatures in Switzerland. + +## Legal framework for electronic signatures in Switzerland + +In Switzerland, electronic signatures are regulated under the [Federal Act on Electronic Signatures](https://www.wipo.int/wipolex/en/legislation/details/20036) and the Swiss Code of Obligations. The +law governs transactions performed through electronic means and the use of electronic signatures. +The key points of the law include: + +- **Legal recognition**: electronic signatures are legally equivalent to handwritten signatures if + they meet certain criteria. +- **Reliability and security**: electronic signatures must be created with a secure method that can + reliably identify the signatory and ensure the integrity of the signed document. +- **Qualified electronic signatures**: the law recognizes electronic signatures supported by digital + certificates issued by accredited Certification Service Providers mandatory in some cases. + +## How Odoo Sign complies with Swiss regulations + +Odoo Sign ensures full compliance with the Electronic Signature Law of Switzerland by incorporating +the following features: + +- **Secure signature creation**: Odoo Sign utilizes advanced cryptographic techniques to ensure the + authenticity and integrity of electronic signatures. +- **Third-party signature authenticator**: Odoo Online serves as an independent validation mechanism + that adds an extra layer of security to the procurement process. +- **Audit trails**: detailed audit logs are maintained to provide evidence of the signing process, + including timestamps, IP addresses, and identity verification. +- **Cryptographic traceability and immutability**: Odoo Sign ensures that any operation is logged + securely. An audit log provides full transparency to all parties while preserving private data. +- **Multiple authentication means**: authentication by SMS, email, geoIP or handwritten electronic + signature. + +## Types of documents you can sign with Odoo Sign + +Odoo Sign is versatile and can be used for a wide range of documents, including but not limited to: + +- **Contracts and agreements**: business contracts, employment agreements, and service contracts. +- **Financial documents**: loan agreements, investment documents, and financial reports. +- **HR documents**: employee onboarding forms, non-disclosure agreements (NDAs), and performance + reviews. +- **Commercial transactions**: purchase orders, sales agreements, and supplier contracts. + +## Potential exceptions + +While Odoo Sign is broadly applicable, there are certain exceptions where electronic signatures may +not be suitable or legally recognized in Switzerland: + +- **Wills and trusts**: documents related to inheritance, wills, and trusts often require + handwritten signatures. +- **Real estate transactions**: some property transactions may still require notarized handwritten + signatures. +- **Government forms**: specific government forms and applications may mandate physical signatures. + +:::{admonition} Disclaimer +The information provided on this page is for general informational purposes only and does not +constitute legal advice. While Odoo Sign complies with the Electronic Signature Law of +Switzerland, users should consult with legal professionals to ensure specific document types and +use cases meet all legal requirements. Compliance with additional industry-specific regulations +may also be necessary. +::: + +*Last updated: June 21, 2024* + diff --git a/content/applications/productivity/sign/thailand.md b/content/applications/productivity/sign/thailand.md new file mode 100644 index 000000000..61698d065 --- /dev/null +++ b/content/applications/productivity/sign/thailand.md @@ -0,0 +1,67 @@ +--- +orphan: true +--- + +# Odoo Sign legality in Thailand + +{doc}`Odoo Sign <../sign>` is your trusted partner for secure, efficient, and legally compliant +electronic signatures in Thailand. + +## Legal framework for electronic signatures in Thailand + +In Thailand, electronic signatures are regulated under the [Electronic Transaction Act B.E. 2544](https://www.etda.or.th/getattachment/8faa736b-3235-49c8-8b01-d37ff53a9a45/ENG-Version.aspx). +The law governs transactions performed through electronic means and the use of digital signatures. +The key points of the law include: + +- **Legal recognition**: electronic signatures are legally equivalent to handwritten signatures if + they meet certain criteria. +- **Reliability and security**: electronic signatures must be created with a secure method that can + reliably identify the signatory and ensure the integrity of the signed document. + +## How Odoo Sign complies with Thai regulations + +Odoo Sign ensures full compliance with the Electronic Signature Law of Thailand by incorporating +the following features: + +- **Secure signature creation**: Odoo Sign utilizes advanced cryptographic techniques to ensure the + authenticity and integrity of electronic signatures. +- **Third-party signature authenticator**: Odoo Online serves as an independent validation mechanism + that adds an extra layer of security to the procurement process. +- **Audit trails**: detailed audit logs are maintained to provide evidence of the signing process, + including timestamps, IP addresses, and identity verification. +- **Cryptographic traceability and immutability**: Odoo Sign ensures that any operation is logged + securely. An audit log provides full transparency to all parties while preserving private data. +- **Multiple authentication means**: authentication by SMS, email, geoIP or handwritten electronic + signature. + +## Types of documents you can sign with Odoo Sign + +Odoo Sign is versatile and can be used for a wide range of documents, including but not limited to: + +- **Contracts and agreements**: business contracts, employment agreements, and service contracts. +- **Financial documents**: loan agreements, investment documents, and financial reports. +- **HR documents**: employee onboarding forms, non-disclosure agreements (NDAs), and performance + reviews. +- **Commercial transactions**: purchase orders, sales agreements, and supplier contracts. + +## Potential exceptions + +While Odoo Sign is broadly applicable, there are certain exceptions where electronic signatures may +not be suitable or legally recognized in Thailand: + +- **Wills and trusts**: documents related to inheritance, wills, and trusts often require + handwritten signatures. +- **Real estate transactions**: some property transactions may still require notarized handwritten + signatures. +- **Government forms**: specific government forms and applications may mandate physical signatures. + +:::{admonition} Disclaimer +The information provided on this page is for general informational purposes only and does not +constitute legal advice. While Odoo Sign complies with the Electronic Signature Law of Thailand, +users should consult with legal professionals to ensure specific document types and use cases +meet all legal requirements. Compliance with additional industry-specific regulations may also be +necessary. +::: + +*Last updated: June 21, 2024* + diff --git a/content/applications/productivity/sign/turkey.md b/content/applications/productivity/sign/turkey.md new file mode 100644 index 000000000..892e3f1f4 --- /dev/null +++ b/content/applications/productivity/sign/turkey.md @@ -0,0 +1,69 @@ +--- +orphan: true +--- + +# Odoo Sign legality in Turkey + +{doc}`Odoo Sign <../sign>` is your trusted partner for secure, efficient, and legally compliant +electronic signatures in Turkey. + +## Legal framework for electronic signatures in Turkey + +In Turkey, electronic signatures are regulated under the [Electronic Signature Law No.5070](https://www.mevzuat.gov.tr/MevzuatMetin/1.5.5070.pdf), [Code of Obligations No. 6098](https://www.wipo.int/wipolex/en/legislation/details/11084), among other secondary regulations. +The law governs transactions performed through electronic means and the use of electronic +signatures. The key points of the law include: + +- **Legal recognition**: electronic signatures are legally equivalent to handwritten signatures if + they meet certain criteria. +- **Reliability and security**: electronic signatures must be created with a secure method that can + reliably identify the signatory and ensure the integrity of the signed document. +- **Electronic certificate service provider**: the law recognizes electronic signatures supported by + digital certificates issued by accredited Certification Service Provider. + +## How Odoo Sign complies with Turkish regulations + +Odoo Sign ensures full compliance with the Electronic Signature Law of Turkey by incorporating the +following features: + +- **Secure signature creation**: Odoo Sign utilizes advanced cryptographic techniques to ensure the + authenticity and integrity of electronic signatures. +- **Third-party signature authenticator**: Odoo Online serves as an independent validation mechanism + that adds an extra layer of security to the procurement process. +- **Audit trails**: detailed audit logs are maintained to provide evidence of the signing process, + including timestamps, IP addresses, and identity verification. +- **Cryptographic traceability and immutability**: Odoo Sign ensures that any operation is logged + securely. An audit log provides full transparency to all parties while preserving private data. +- **Multiple authentication means**: authentication by SMS, email, geoIP or handwritten electronic + signature. + +## Types of documents you can sign with Odoo Sign + +Odoo Sign is versatile and can be used for a wide range of documents, including but not limited to: + +- **Contracts and agreements**: business contracts, employment agreements, and service contracts. +- **Financial documents**: loan agreements, investment documents, and financial reports. +- **HR documents**: employee onboarding forms, non-disclosure agreements (NDAs), and performance + reviews. +- **Commercial transactions**: purchase orders, sales agreements, and supplier contracts. + +## Potential exceptions + +While Odoo Sign is broadly applicable, there are certain exceptions where electronic signatures may +not be suitable or legally recognized in Turkey: + +- **Wills and trusts**: documents related to inheritance, wills, and trusts often require + handwritten signatures. +- **Real estate transactions**: some property transactions may still require notarized handwritten + signatures. +- **Government forms**: specific government forms and applications may mandate physical signatures. + +:::{admonition} Disclaimer +The information provided on this page is for general informational purposes only and does not +constitute legal advice. While Odoo Sign complies with the Electronic Signature Law of Turkey, +users should consult with legal professionals to ensure specific document types and use cases +meet all legal requirements. Compliance with additional industry-specific regulations may also be +necessary. +::: + +*Last updated: June 21, 2024* + diff --git a/content/applications/productivity/sign/ukraine.md b/content/applications/productivity/sign/ukraine.md new file mode 100644 index 000000000..45f90603b --- /dev/null +++ b/content/applications/productivity/sign/ukraine.md @@ -0,0 +1,69 @@ +--- +orphan: true +--- + +# Odoo Sign legality in Ukraine + +{doc}`Odoo Sign <../sign>` is your trusted partner for secure, efficient, and legally compliant +electronic signatures in Ukraine. + +## Legal framework for electronic signatures in Ukraine + +In Ukraine, electronic signatures are regulated under the Law of Ukraine No. 852-IV "On Electronic +Digital Signature. The law establishes the legal basis for acknowledging electronic records, +contracts, and digital signatures. The key points of the law include: + +- **Legal recognition**: electronic signatures are legally equivalent to handwritten signatures if + they meet certain criteria. +- **Reliability and security**: electronic signatures must be created with a secure method that can + reliably identify the signatory and ensure the integrity of the signed document. +- **Qualified electronic signature**: digital signature generated using a digital certificate + supplied by a qualified provider. + +## How Odoo Sign complies with Ukrainian regulations + +Odoo Sign ensures full compliance with the Electronic Signature Law of Ukraine by incorporating the +following features: + +- **Secure signature creation**: Odoo Sign utilizes advanced cryptographic techniques to ensure the + authenticity and integrity of electronic signatures. +- **Third-party signature authenticator**: Odoo Online serves as an independent validation mechanism + that adds an extra layer of security to the procurement process. +- **Audit trails**: detailed audit logs are maintained to provide evidence of the signing process, + including timestamps, IP addresses, and identity verification. +- **Cryptographic traceability and immutability**: Odoo Sign ensures that any operation is logged + securely. An audit log provides full transparency to all parties while preserving private data. +- **Multiple authentication means**: authentication by SMS, email, geoIP or handwritten electronic + signature. + +## Types of documents you can sign with Odoo Sign + +Odoo Sign is versatile and can be used for a wide range of documents, including but not limited to: + +- **Contracts and agreements**: business contracts, employment agreements, and service contracts. +- **Financial documents**: loan agreements, investment documents, and financial reports. +- **HR documents**: employee onboarding forms, non-disclosure agreements (NDAs), and performance + reviews. +- **Commercial transactions**: purchase orders, sales agreements, and supplier contracts. + +## Potential exceptions + +While Odoo Sign is broadly applicable, there are certain exceptions where electronic signatures may +not be suitable or legally recognized in Ukraine: + +- **Wills and trusts**: documents related to inheritance, wills, and trusts often require + handwritten signatures. +- **Real estate transactions**: some property transactions may still require notarized handwritten + signatures. +- **Government forms**: specific government forms and applications may mandate physical signatures. + +:::{admonition} Disclaimer +The information provided on this page is for general informational purposes only and does not +constitute legal advice. While Odoo Sign complies with the Electronic Signature Law of Ukraine, +users should consult with legal professionals to ensure specific document types and use cases +meet all legal requirements. Compliance with additional industry-specific regulations may also be +necessary. +::: + +*Last updated: June 21, 2024* + diff --git a/content/applications/productivity/sign/united_arab_emirates.md b/content/applications/productivity/sign/united_arab_emirates.md new file mode 100644 index 000000000..2e315b140 --- /dev/null +++ b/content/applications/productivity/sign/united_arab_emirates.md @@ -0,0 +1,72 @@ +--- +orphan: true +--- + +# Odoo Sign legality in the United Arab Emirates + +{doc}`Odoo Sign <../sign>` is your trusted partner for secure, efficient, and legally compliant +electronic signatures in the United Arab Emirates. + +## Legal framework for electronic signatures in the United Arab Emirates + +In the United Arab Emirates, electronic signatures are regulated under the [Federal Decree by Law +No. 46 of 2021 on Electronic Transactions and Trust Services](https://tdra.gov.ae/-/media/About/Others/FEDERAL-DECREELAW-NO-46-OF-2021--English.ashx#:~:text=This%20Decree%2DLaw%20aims%20to,Electronic%20Transactions%20across%20all%20sectors.), +[ADGM Electronic Transactions Regulations 202](https://adgmen.thomsonreuters.com/sites/default/files/net_file_store/ADGM1547_23197_VER2021.pdf), +[DIFC Law No. 2 of 2017](https://www.difc.ae/business/laws-and-regulations/legal-database/difc-laws/electronic-transactions-law-difc-law-no-2-2017). +The law governs transactions performed through electronic means and the use of digital signatures. +The key points of the law include: + +- **Legal recognition**: electronic signatures are legally equivalent to handwritten signatures if + they meet certain criteria. +- **Reliability and security**: electronic signatures must be created with a secure method that can + reliably identify the signatory and ensure the integrity of the signed document. +- **Qualified electronic signature**: the law recognizes electronic signatures supported by digital + certificates issued by a qualified trust service provider. + +## How Odoo Sign complies with Emirati regulations + +Odoo Sign ensures full compliance with the Electronic Signature Law of the United Arab Emirates by +incorporating the following features: + +- **Secure signature creation**: Odoo Sign utilizes advanced cryptographic techniques to ensure the + authenticity and integrity of electronic signatures. +- **Third-party signature authenticator**: Odoo Online serves as an independent validation mechanism + that adds an extra layer of security to the procurement process. +- **Audit trails**: detailed audit logs are maintained to provide evidence of the signing process, + including timestamps, IP addresses, and identity verification. +- **Cryptographic traceability and immutability**: Odoo Sign ensures that any operation is logged + securely. An audit log provides full transparency to all parties while preserving private data. +- **Multiple authentication means**: authentication by SMS, email, geoIP or handwritten electronic + signature. + +## Types of documents you can sign with Odoo Sign + +Odoo Sign is versatile and can be used for a wide range of documents, including but not limited to: + +- **Contracts and agreements**: business contracts, employment agreements, and service contracts. +- **Financial documents**: loan agreements, investment documents, and financial reports. +- **HR documents**: employee onboarding forms, non-disclosure agreements (NDAs), and performance + reviews. +- **Commercial transactions**: purchase orders, sales agreements, and supplier contracts. + +## Potential exceptions + +While Odoo Sign is broadly applicable, there are certain exceptions where electronic signatures may +not be suitable or legally recognized in the United Arab Emirates: + +- **Wills and trusts**: documents related to inheritance, wills, and trusts often require + handwritten signatures. +- **Real estate transactions**: some property transactions may still require notarized handwritten + signatures. +- **Government forms**: specific government forms and applications may mandate physical signatures. + +:::{admonition} Disclaimer +The information provided on this page is for general informational purposes only and does not +constitute legal advice. While Odoo Sign complies with the Electronic Signature Law of the United +Arab Emirates, users should consult with legal professionals to ensure specific document types +and use cases meet all legal requirements. Compliance with additional industry-specific +regulations may also be necessary. +::: + +*Last updated: June 21, 2024* + diff --git a/content/applications/productivity/sign/united_kingdom.md b/content/applications/productivity/sign/united_kingdom.md new file mode 100644 index 000000000..f77b85701 --- /dev/null +++ b/content/applications/productivity/sign/united_kingdom.md @@ -0,0 +1,75 @@ +--- +orphan: true +--- + +# Odoo Sign legality in the United Kingdom + +{doc}`Odoo Sign <../sign>` is your trusted partner for secure, efficient, and legally compliant +electronic signatures in the United Kingdom. + +## Legal framework for electronic signatures in the United Kingdom + +In the United Kingdom, electronic signatures are regulated under Electronic Communications Act +(ECA), and the [UK version](https://ico.org.uk/for-organisations/guide-to-eidas/) of Regulation +(EU) No 910/2014 of the European Parliament and of the Council of 23 July 2014 on electronic +identification and trust services for electronic transactions in the internal market (eIDAS) as +amended by the [Electronic Identification and Trust Services for Electronic Transactions](https://www.legislation.gov.uk/uksi/2019/89/made) (Amendment) (EU Exit) Regulations 2019 (SI +2019/89) (the “UK eIDAS Regulation”). The law provides the foundation for the use and legal +recognition of electronic signatures. The key points of the law include: + +- **Legal recognition**: electronic signatures are legally equivalent to handwritten signatures if + they meet certain criteria. +- **Reliability and security**: electronic signatures must be created with a secure method that can + reliably identify the signatory and ensure the integrity of the signed document. +- **Digital signature certificates**: the law recognizes digital signature certificates that serve + as proof of identity of an individual for a certain purpose that can be used in special cases to + provide additional security. These certificates are issued by Certification Authorities and are + required by law for the signature of specific acts. + +## How Odoo Sign complies with the United Kingdom regulations + +Odoo Sign ensures full compliance with the Electronic Signature Law of the United Kingdom by +incorporating the following features: + +- **Secure signature creation**: Odoo Sign utilizes advanced cryptographic techniques to ensure the + authenticity and integrity of electronic signatures. +- **Third-party signature authenticator**: Odoo Online serves as an independent validation mechanism + that adds an extra layer of security to the procurement process. +- **Audit trails**: detailed audit logs are maintained to provide evidence of the signing process, + including timestamps, IP addresses, and identity verification. +- **Cryptographic traceability and immutability**: Odoo Sign ensures that any operation is logged + securely. An audit log provides full transparency to all parties while preserving private data. +- **Multiple authentication means**: authentication by SMS, email, geoIP or handwritten electronic + signature. + +## Types of documents you can sign with Odoo Sign + +Odoo Sign is versatile and can be used for a wide range of documents, including but not limited to: + +- **Contracts and agreements**: business contracts, employment agreements, and service contracts. +- **Financial documents**: loan agreements, investment documents, and financial reports. +- **HR documents**: employee onboarding forms, non-disclosure agreements (NDAs), and performance + reviews. +- **Commercial transactions**: purchase orders, sales agreements, and supplier contracts. + +## Potential exceptions + +While Odoo Sign is broadly applicable, there are certain exceptions where electronic signatures may +not be suitable or legally recognized in the United Kingdom: + +- **Wills and trusts**: documents related to inheritance, wills, and trusts often require + handwritten signatures. +- **Real estate transactions**: some property transactions may still require notarized handwritten + signatures. +- **Government forms**: specific government forms and applications may mandate physical signatures. + +:::{admonition} Disclaimer +The information provided on this page is for general informational purposes only and does not +constitute legal advice. While Odoo Sign complies with the Electronic Signature Law of the United +Kingdom, users should consult with legal professionals to ensure specific document types and use +cases meet all legal requirements. Compliance with additional industry-specific regulations may +also be necessary. +::: + +*Last updated: June 19, 2024* + diff --git a/content/applications/productivity/sign/uzbekistan.md b/content/applications/productivity/sign/uzbekistan.md new file mode 100644 index 000000000..5885574d5 --- /dev/null +++ b/content/applications/productivity/sign/uzbekistan.md @@ -0,0 +1,69 @@ +--- +orphan: true +--- + +# Odoo Sign legality in Uzbekistan + +{doc}`Odoo Sign <../sign>` is your trusted partner for secure, efficient, and legally compliant +electronic signatures in Uzbekistan. + +## Legal framework for electronic signatures in Uzbekistan + +In Uzbekistan, electronic signatures are regulated under the [Law On Electronic Digital Signature](https://cis-legislation.com/document.fwx?rgn=144357). The law establishes the legal basis for +acknowledging electronic records, contracts, and digital signatures. The key points of the law +include: + +- **Legal recognition**: electronic signatures are legally equivalent to handwritten signatures if + they meet certain criteria. +- **Reliability and security**: electronic signatures must be created with a secure method that can + reliably identify the signatory and ensure the integrity of the signed document. +- **Electronic digital signature keys**: digital signature generated using a digital certificate + supplied by a qualified provider. + +## How Odoo Sign complies with Uzbekistani regulations + +Odoo Sign ensures full compliance with the Electronic Signature Law of Uzbekistan by incorporating +the following features: + +- **Secure signature creation**: Odoo Sign utilizes advanced cryptographic techniques to ensure the + authenticity and integrity of electronic signatures. +- **Third-party signature authenticator**: Odoo Online serves as an independent validation mechanism + that adds an extra layer of security to the procurement process. +- **Audit trails**: detailed audit logs are maintained to provide evidence of the signing process, + including timestamps, IP addresses, and identity verification. +- **Cryptographic traceability and immutability**: Odoo Sign ensures that any operation is logged + securely. An audit log provides full transparency to all parties while preserving private data. +- **Multiple authentication means**: authentication by SMS, email, geoIP or handwritten electronic + signature. + +## Types of documents you can sign with Odoo Sign + +Odoo Sign is versatile and can be used for a wide range of documents, including but not limited to: + +- **Contracts and agreements**: business contracts, employment agreements, and service contracts. +- **Financial documents**: loan agreements, investment documents, and financial reports. +- **HR documents**: employee onboarding forms, non-disclosure agreements (NDAs), and performance + reviews. +- **Commercial transactions**: purchase orders, sales agreements, and supplier contracts. + +## Potential exceptions + +While Odoo Sign is broadly applicable, there are certain exceptions where electronic signatures may +not be suitable or legally recognized in Uzbekistan: + +- **Wills and trusts**: documents related to inheritance, wills, and trusts often require + handwritten signatures. +- **Real estate transactions**: some property transactions may still require notarized handwritten + signatures. +- **Government forms**: specific government forms and applications may mandate physical signatures. + +:::{admonition} Disclaimer +The information provided on this page is for general informational purposes only and does not +constitute legal advice. While Odoo Sign complies with the Electronic Signature Law of +Uzbekistan, users should consult with legal professionals to ensure specific document types and +use cases meet all legal requirements. Compliance with additional industry-specific regulations +may also be necessary. +::: + +*Last updated: June 21, 2024* + diff --git a/content/applications/productivity/sign/vietnam.md b/content/applications/productivity/sign/vietnam.md new file mode 100644 index 000000000..9b974e399 --- /dev/null +++ b/content/applications/productivity/sign/vietnam.md @@ -0,0 +1,71 @@ +--- +orphan: true +--- + +# Odoo Sign legality in Vietnam + +{doc}`Odoo Sign <../sign>` is your trusted partner for secure, efficient, and legally compliant +electronic signatures in Vietnam. + +## Legal framework for electronic signatures in Vietnam + +In Vietnam, electronic signatures are regulated under the [Civil Code No. 91/2015/QH132015](https://www.wipo.int/wipolex/en/legislation/details/17200), the [Law on E-Transactions No. +51/2005/QH11](https://www.wto.org/english/thewto_e/acc_e/vnm_e/wtaccvnm43_leg_5.pdf). The law +governs transactions performed through electronic means and the use of digital signatures. The key +points of the law include: + +- **Legal recognition**: electronic signatures are legally equivalent to handwritten signatures if + they meet certain criteria. +- **Reliability and security**: electronic signatures must be created with a secure method that can + reliably identify the signatory and ensure the integrity of the signed document. +- **Certified electronic signatures**: the law regulates the use of digital certificates that + guarantee security and integrity of the signature. In some cases, electronic signatures must be + certified by an electronic signature certification service provide + +## How Odoo Sign complies with Vietnamese regulations + +Odoo Sign ensures full compliance with the Electronic Signature Law of Vietnam by incorporating the +following features: + +- **Secure signature creation**: Odoo Sign utilizes advanced cryptographic techniques to ensure the + authenticity and integrity of electronic signatures. +- **Third-party signature authenticator**: Odoo Online serves as an independent validation mechanism + that adds an extra layer of security to the procurement process. +- **Audit trails**: detailed audit logs are maintained to provide evidence of the signing process, + including timestamps, IP addresses, and identity verification. +- **Cryptographic traceability and immutability**: Odoo Sign ensures that any operation is logged + securely. An audit log provides full transparency to all parties while preserving private data. +- **Multiple authentication means**: authentication by SMS, email, geoIP or handwritten electronic + signature. + +## Types of documents you can sign with Odoo Sign + +Odoo Sign is versatile and can be used for a wide range of documents, including but not limited to: + +- **Contracts and agreements**: business contracts, employment agreements, and service contracts. +- **Financial documents**: loan agreements, investment documents, and financial reports. +- **HR documents**: employee onboarding forms, non-disclosure agreements (NDAs), and performance + reviews. +- **Commercial transactions**: purchase orders, sales agreements, and supplier contracts. + +## Potential exceptions + +While Odoo Sign is broadly applicable, there are certain exceptions where electronic signatures may +not be suitable or legally recognized in Vietnam: + +- **Wills and trusts**: documents related to inheritance, wills, and trusts often require + handwritten signatures. +- **Real estate transactions**: some property transactions may still require notarized handwritten + signatures. +- **Government forms**: specific government forms and applications may mandate physical signatures. + +:::{admonition} Disclaimer +The information provided on this page is for general informational purposes only and does not +constitute legal advice. While Odoo Sign complies with the Electronic Signature Law of Vietnam, +users should consult with legal professionals to ensure specific document types and use cases +meet all legal requirements. Compliance with additional industry-specific regulations may also be +necessary. +::: + +*Last updated: June 21, 2024* + diff --git a/content/applications/productivity/spreadsheet.md b/content/applications/productivity/spreadsheet.md new file mode 100644 index 000000000..062b4fee0 --- /dev/null +++ b/content/applications/productivity/spreadsheet.md @@ -0,0 +1,46 @@ +--- +hide-page-toc: true +show-content: true +--- + +# Spreadsheet + +```{toctree} +:titlesonly: true + +spreadsheet/insert +spreadsheet/functions +spreadsheet/templates +spreadsheet/global_filters +``` + +Spreadsheet lets you organize, analyze, and visualize your data in tabular form. Among others, you +can: + +- {doc}`Insert and link your Odoo data (pivots, graphs, lists, and menus) `. +- {doc}`Use global filters `. +- {doc}`Use formulas and functions `. +- {doc}`Create and use templates `. +- Format data. +- Sort and filter data. + +(spreadsheet-glossary)= + +## Glossary + +Some of Spreadsheet's main {abbr}`UI (user interface)` elements are highlighted and defined below. + +```{image} spreadsheet/ui-elements.png +:align: center +:alt: Spreadsheet main UI elements +``` + +1. Menu bar +2. Top bar +3. Formula bar +4. Filters button +5. Row header +6. Column header +7. Cell menu +8. Bottom bar + diff --git a/content/applications/productivity/spreadsheet/functions.md b/content/applications/productivity/spreadsheet/functions.md new file mode 100644 index 000000000..1d9eaedc1 --- /dev/null +++ b/content/applications/productivity/spreadsheet/functions.md @@ -0,0 +1,854 @@ +# Functions + +Spreadsheet functions are divided in the following categories: + +- {ref}`Array ` +- {ref}`Database ` +- {ref}`Date ` +- {ref}`Engineering ` +- {ref}`Filter ` +- {ref}`Financial ` +- {ref}`Info ` +- {ref}`Logical ` +- {ref}`Lookup ` +- {ref}`Math ` +- {ref}`Misc ` +- {ref}`Odoo ` +- {ref}`Operators ` +- {ref}`Statistical ` +- {ref}`Text ` +- {ref}`Web ` + +:::{note} +Formulas containing functions that are not compatible with Excel are replaced by their evaluated +result when exporting a spreadsheet. +::: + +(functions-array)= + +## Array + +```{eval-rst} +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - Name and arguments + - Description or link + * - ARRAY.CONSTRAIN(input_range, rows, columns) + - Returns a result array constrained to a specific width and height (not compatible with Excel) + * - CHOOSECOLS(array, col_num, [col_num2, ...]) + - `Excel CHOOSECOLS article `_ + * - CHOOSEROWS(array, row_num, [row_num2, ...]) + - `Excel CHOOSEROWS article `_ + * - EXPAND(array, rows, [columns], [pad_with]) + - `Excel EXPAND article `_ + * - FLATTEN(range, [range2, ...]) + - Flattens all the values from one or more ranges into a single column (not compatible with Excel) + * - FREQUENCY(data, classes) + - `Excel FREQUENCY article `_ + * - HSTACK(range1, [range2, ...]) + - `Excel HSTACK article `_ + * - MDETERM(square_matrix) + - `Excel MDETERM article `_ + * - MINVERSE(square_matrix) + - `Excel MINVERSE article `_ + * - MMULT(matrix1, matrix2) + - `Excel MMULT article `_ + * - SUMPRODUCT(range1, [range2, ...]) + - `Excel SUMPRODUCT article `_ + * - SUMX2MY2(array_x, array_y) + - `Excel SUMX2MY2 article `_ + * - SUMX2PY2(array_x, array_y) + - `Excel SUMX2PY2 article `_ + * - SUMXMY2(array_x, array_y) + - `Excel SUMXMY2 article `_ + * - TOCOL(array, [ignore], [scan_by_column]) + - `Excel TOCOL article `_ + * - TOROW(array, [ignore], [scan_by_column]) + - `Excel TOROW article `_ + * - TRANSPOSE(range) + - `Excel TRANSPOSE article `_ + * - VSTACK(range1, [range2, ...]) + - `Excel VSTACK article `_ + * - WRAPCOLS(range, wrap_count, [pad_with]) + - `Excel WRAPCOLS article `_ + * - WRAPROWS(range, wrap_count, [pad_with]) + - `Excel WRAPROWS article `_ +``` + +(functions-database)= + +## Database + +```{eval-rst} +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - Name and arguments + - Description or link + * - DAVERAGE(database, field, criteria) + - `Excel DAVERAGE article `_ + * - DCOUNT(database, field, criteria) + - `Excel DCOUNT article `_ + * - DCOUNTA(database, field, criteria) + - `Excel DCOUNTA article `_ + * - DGET(database, field, criteria) + - `Excel DGET article `_ + * - DMAX(database, field, criteria) + - `Excel DMAX article `_ + * - DMIN(database, field, criteria) + - `Excel DMIN article `_ + * - DPRODUCT(database, field, criteria) + - `Excel DPRODUCT article `_ + * - DSTDEV(database, field, criteria) + - `Excel DSTDEV article `_ + * - DSTDEVP(database, field, criteria) + - `Excel DSTDEVP article `_ + * - DSUM(database, field, criteria) + - `Excel DSUM article `_ + * - DVAR(database, field, criteria) + - `Excel DVAR article `_ + * - DVARP(database, field, criteria) + - `Excel DVARP article `_ +``` + +(functions-date)= + +## Date + +```{eval-rst} +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - Name and arguments + - Description or link + * - DATE(year, month, day) + - `Excel DATE article `_ + * - DATEDIF(start_date, end_date, unit) + - `Excel DATEDIF article `_ + * - DATEVALUE(date_string) + - `Excel DATEVALUE article `_ + * - DAY(date) + - `Excel DAY article `_ + * - DAYS(end_date, start_date) + - `Excel DAYS article `_ + * - DAYS360(start_date, end_date, [method]) + - `Excel DAYS360 article `_ + * - EDATE(start_date, months) + - `Excel EDATE article `_ + * - EOMONTH(start_date, months) + - `Excel EOMONTH article `_ + * - HOUR(time) + - `Excel HOUR article `_ + * - ISOWEEKNUM(date) + - `Excel ISOWEEKNUM article `_ + * - MINUTE(time) + - `Excel MINUTE article `_ + * - MONTH(date) + - `Excel MONTH article `_ + * - NETWORKDAYS(start_date, end_date, [holidays]) + - `Excel NETWORKDAYS article `_ + * - NETWORKDAYS.INTL(start_date, end_date, [weekend], [holidays]) + - `Excel NETWORKDAYS.INTL article `_ + * - NOW() + - `Excel NOW article `_ + * - SECOND(time) + - `Excel SECOND article `_ + * - TIME(hour, minute, second) + - `Excel TIME article `_ + * - TIMEVALUE(time_string) + - `Excel TIMEVALUE article `_ + * - TODAY() + - `Excel TODAY article `_ + * - WEEKDAY(date, [type]) + - `Excel WEEKDAY article `_ + * - WEEKNUM(date, [type]) + - `Excel WEEKNUM article `_ + * - WORKDAY(start_date, num_days, [holidays]) + - `Excel WORKDAY article `_ + * - WORKDAY.INTL(start_date, num_days, [weekend], [holidays]) + - `Excel WORKDAY.INTL article `_ + * - YEAR(date) + - `Excel YEAR article `_ + * - YEARFRAC(start_date, end_date, [day_count_convention]) + - Exact number of years between two dates (not compatible with Excel) + * - MONTH.START(date) + - First day of the month preceding a date (not compatible with Excel) + * - MONTH.END(date) + - Last day of the month following a date (not compatible with Excel) + * - QUARTER(date) + - Quarter of the year a specific date falls in (not compatible with Excel) + * - QUARTER.START(date) + - First day of the quarter of the year a specific date falls in (not compatible with Excel) + * - QUARTER.END(date) + - Last day of the quarter of the year a specific date falls in (not compatible with Excel) + * - YEAR.START(date) + - First day of the year a specific date falls in (not compatible with Excel) + * - YEAR.END(date) + - Last day of the year a specific date falls in (not compatible with Excel) +``` + +(functions-engineering)= + +## Engineering + +```{eval-rst} +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - Name and arguments + - Description or link + * - DELTA(number1, [number2]) + - `Excel DELTA article `_ +``` + +(functions-filter)= + +## Filter + +```{eval-rst} +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - Name and arguments + - Description or link + * - FILTER(range, condition1, [condition2, ...]) + - `Excel FILTER article `_ + * - UNIQUE(range, [by_column], [exactly_once]) + - `Excel UNIQUE article `_ +``` + +(functions-financial)= + +## Financial + +```{eval-rst} +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - Name and arguments + - Description or link + * - ACCRINTM(issue, maturity, rate, redemption, [day_count_convention]) + - `Excel ACCRINTM article `_ + * - AMORLINC(cost, purchase_date, first_period_end, salvage, period, rate, [day_count_convention]) + - `Excel AMORLINC article `_ + * - COUPDAYS(settlement, maturity, frequency, [day_count_convention]) + - `Excel COUPDAYS article `_ + * - COUPDAYBS(settlement, maturity, frequency, [day_count_convention]) + - `Excel COUPDAYBS article `_ + * - COUPDAYSNC(settlement, maturity, frequency, [day_count_convention]) + - `Excel COUPDAYSNC article `_ + * - COUPNCD(settlement, maturity, frequency, [day_count_convention]) + - `Excel COUPNCD article `_ + * - COUPNUM(settlement, maturity, frequency, [day_count_convention]) + - `Excel COUPNUM article `_ + * - COUPPCD(settlement, maturity, frequency, [day_count_convention]) + - `Excel COUPPCD article `_ + * - CUMIPMT(rate, number_of_periods, present_value, first_period, last_period, [end_or_beginning]) + - `Excel CUMIPMT article `_ + * - CUMPRINC(rate, number_of_periods, present_value, first_period, last_period, [end_or_beginning]) + - `Excel CUMPRINC article `_ + * - DB(cost, salvage, life, period, [month]) + - `Excel DB article `_ + * - DDB(cost, salvage, life, period, [factor]) + - `Excel DDB article `_ + * - DISC(settlement, maturity, price, redemption, [day_count_convention]) + - `Excel DISC article `_ + * - DOLLARDE(fractional_price, unit) + - `Excel DOLLARDE article `_ + * - DOLLARFR(decimal_price, unit) + - `Excel DOLLARFR article `_ + * - DURATION(settlement, maturity, rate, yield, frequency, [day_count_convention]) + - `Excel DURATION article `_ + * - EFFECT(nominal_rate, periods_per_year) + - `Excel EFFECT article `_ + * - FV(rate, number_of_periods, payment_amount, [present_value], [end_or_beginning]) + - `Excel FV article `_ + * - FVSCHEDULE(principal, rate_schedule) + - `Excel FVSCHEDULE article `_ + * - INTRATE(settlement, maturity, investment, redemption, [day_count_convention]) + - `Excel INTRATE article `_ + * - IPMT(rate, period, number_of_periods, present_value, [future_value], [end_or_beginning]) + - `Excel IPMT article `_ + * - IRR(cashflow_amounts, [rate_guess]) + - `Excel IRR article `_ + * - ISPMT(rate, period, number_of_periods, present_value) + - `Excel ISPMT article `_ + * - MDURATION(settlement, maturity, rate, yield, frequency, [day_count_convention]) + - `Excel MDURATION article `_ + * - MIRR(cashflow_amounts, financing_rate, reinvestment_return_rate) + - `Excel MIRR article `_ + * - NOMINAL(effective_rate, periods_per_year) + - `Excel NOMINAL article `_ + * - NPER(rate, payment_amount, present_value, [future_value], [end_or_beginning]) + - `Excel NPER article `_ + * - NPV(discount, cashflow1, [cashflow2, ...]) + - `Excel NPV article `_ + * - PDURATION(rate, present_value, future_value) + - `Excel PDURATION article `_ + * - PMT(rate, number_of_periods, present_value, [future_value], [end_or_beginning]) + - `Excel PMT article `_ + * - PPMT(rate, period, number_of_periods, present_value, [future_value], [end_or_beginning]) + - `Excel PPMT article `_ + * - PV(rate, number_of_periods, payment_amount, [future_value], [end_or_beginning]) + - `Excel PV article `_ + * - PRICE(settlement, maturity, rate, yield, redemption, frequency, [day_count_convention]) + - `Excel PRICE article `_ + * - PRICEDISC(settlement, maturity, discount, redemption, [day_count_convention]) + - `Excel PRICEDISC article `_ + * - PRICEMAT(settlement, maturity, issue, rate, yield, [day_count_convention]) + - `Excel PRICEMAT article `_ + * - RATE(number_of_periods, payment_per_period, present_value, [future_value], [end_or_beginning], [rate_guess]) + - `Excel RATE article `_ + * - RECEIVED(settlement, maturity, investment, discount, [day_count_convention]) + - `Excel RECEIVED article `_ + * - RRI(number_of_periods, present_value, future_value) + - `Excel RRI article `_ + * - SLN(cost, salvage, life) + - `Excel SLN article `_ + * - SYD(cost, salvage, life, period) + - `Excel SYD article `_ + * - TBILLPRICE(settlement, maturity, discount) + - `Excel TBILLPRICE article `_ + * - TBILLEQ(settlement, maturity, discount) + - `Excel TBILLEQ article `_ + * - TBILLYIELD(settlement, maturity, price) + - `Excel TBILLYIELD article `_ + * - VDB(cost, salvage, life, start, end, [factor], [no_switch]) + - `Excel VDB article `_ + * - XIRR(cashflow_amounts, cashflow_dates, [rate_guess]) + - `Excel XIRR article `_ + * - XNPV(discount, cashflow_amounts, cashflow_dates) + - `Excel XNPV article `_ + * - YIELD(settlement, maturity, rate, price, redemption, frequency, [day_count_convention]) + - `Excel YIELD article `_ + * - YIELDDISC(settlement, maturity, price, redemption, [day_count_convention]) + - `Excel YIELDDISC article `_ + * - YIELDMAT(settlement, maturity, issue, rate, price, [day_count_convention]) + - `Excel YIELDMAT article `_ +``` + +(functions-info)= + +## Info + +```{eval-rst} +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - Name and arguments + - Description or link + * - CELL(info_type, reference) + - `Excel CELL article `_ + * - ISERR(value) + - `Excel IS article `_ + * - ISERROR(value) + - `Excel IS article `_ + * - ISLOGICAL(value) + - `Excel IS article `_ + * - ISNA(value) + - `Excel IS article `_ + * - ISNONTEXT(value) + - `Excel IS article `_ + * - ISNUMBER(value) + - `Excel IS article `_ + * - ISTEXT(value) + - `Excel IS article `_ + * - ISBLANK(value) + - `Excel IS article `_ + * - NA() + - `Excel NA article `_ +``` + +(functions-logical)= + +## Logical + +```{eval-rst} +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - Name and arguments + - Description or link + * - AND(logical_expression1, [logical_expression2, ...]) + - `Excel AND article `_ + * - FALSE() + - `Excel FALSE article `_ + * - IF(logical_expression, value_if_true, [value_if_false]) + - `Excel IF article `_ + * - IFERROR(value, [value_if_error]) + - `Excel IFERROR article `_ + * - IFNA(value, [value_if_error]) + - `Excel IFNA article `_ + * - IFS(condition1, value1, [condition2, ...], [value2, ...]) + - `Excel IFS article `_ + * - NOT(logical_expression) + - `Excel NOT article `_ + * - OR(logical_expression1, [logical_expression2, ...]) + - `Excel OR article `_ + * - TRUE() + - `Excel TRUE article `_ + * - XOR(logical_expression1, [logical_expression2, ...]) + - `Excel XOR article `_ +``` + +(functions-lookup)= + +## Lookup + +```{eval-rst} +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - Name and arguments + - Description or link + * - ADDRESS(row, column, [absolute_relative_mode], [use_a1_notation], [sheet]) + - `Excel ADDRESS article `_ + * - COLUMN([cell_reference]) + - `Excel COLUMN article `_ + * - COLUMNS(range) + - `Excel COLUMNS article `_ + * - HLOOKUP(search_key, range, index, [is_sorted]) + - `Excel HLOOKUP article `_ + * - INDEX(reference, row, column) + - `Excel INDEX article `_ + * - INDIRECT(reference, [use_a1_notation]) + - `Excel INDIRECT article `_ + * - LOOKUP(search_key, search_array, [result_range]) + - `Excel LOOKUP article `_ + * - MATCH(search_key, range, [search_type]) + - `Excel MATCH article `_ + * - PIVOT(pivot_id, measure_name, [domain_field_name, ...], [domain_value, ...]) + - Get the value from a pivot (not compatible with Excel) + * - PIVOT.HEADER(pivot_id, [domain_field_name, ...], [domain_value, ...]) + - Get the header of a pivot (not compatible with Excel) + * - PIVOT.TABLE(pivot_id, [row_count], [include_total], [include_column_titles]) + - Get a pivot table (not compatible with Excel) + * - ROW([cell_reference]) + - `Excel ROW article `_ + * - ROWS(range) + - `Excel ROWS article `_ + * - VLOOKUP(search_key, range, index, [is_sorted]) + - `Excel VLOOKUP article `_ + * - XLOOKUP(search_key, lookup_range, return_range, [if_not_found], [match_mode], [search_mode]) + - `Excel XLOOKUP article `_ +``` + +(functions-math)= + +## Math + +```{eval-rst} +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - Name and arguments + - Description or link + * - ABS(value) + - `Excel ABS article `_ + * - ACOS(value) + - `Excel ACOS article `_ + * - ACOSH(value) + - `Excel ACOSH article `_ + * - ACOT(value) + - `Excel ACOT article `_ + * - ACOTH(value) + - `Excel ACOTH article `_ + * - ASIN(value) + - `Excel ASIN article `_ + * - ASINH(value) + - `Excel ASINH article `_ + * - ATAN(value) + - `Excel ATAN article `_ + * - ATAN2(x, y) + - `Excel ATAN2 article `_ + * - ATANH(value) + - `Excel ATANH article `_ + * - CEILING(value, [factor]) + - `Excel CEILING article `_ + * - CEILING.MATH(number, [significance], [mode]) + - `Excel CEILING.MATH article `_ + * - CEILING.PRECISE(number, [significance]) + - `Excel CEILING.PRECISE article `_ + * - COS(angle) + - `Excel COS article `_ + * - COSH(value) + - `Excel COSH article `_ + * - COT(angle) + - `Excel COT article `_ + * - COTH(value) + - `Excel COTH article `_ + * - COUNTBLANK(value1, [value2, ...]) + - `Excel COUNTBLANK article `_ + * - COUNTIF(range, criterion) + - `Excel COUNTIF article `_ + * - COUNTIFS(criteria_range1, criterion1, [criteria_range2, ...], [criterion2, ...]) + - `Excel COUNTIFS article `_ + * - COUNTUNIQUE(value1, [value2, ...]) + - Counts number of unique values in a range (not compatible with Excel) + * - COUNTUNIQUEIFS(range, criteria_range1, criterion1, [criteria_range2, ...], [criterion2, ...]) + - Counts number of unique values in a range, filtered by a set of criteria (not compatible with Excel) + * - CSC(angle) + - `Excel CSC article `_ + * - CSCH(value) + - `Excel CSCH article `_ + * - DECIMAL(value, base) + - `Excel DECIMAL article `_ + * - DEGREES(angle) + - `Excel DEGREES article `_ + * - EXP(value) + - `Excel EXP article `_ + * - FLOOR(value, [factor]) + - `Excel FLOOR article `_ + * - FLOOR.MATH(number, [significance], [mode]) + - `Excel FLOOR.MATH article `_ + * - FLOOR.PRECISE(number, [significance]) + - `Excel FLOOR.PRECISE article `_ + * - INT(value) + - `Excel INT article `_ + * - ISEVEN(value) + - `Excel ISEVEN article `_ + * - ISO.CEILING(number, [significance]) + - `Excel ISO.CEILING article `_ + * - ISODD(value) + - `Excel ISODD article `_ + * - LN(value) + - `Excel LN article `_ + * - MOD(dividend, divisor) + - `Excel MOD article `_ + * - MUNIT(dimension) + - `Excel MUNIT article `_ + * - ODD(value) + - `Excel ODD article `_ + * - PI() + - `Excel PI article `_ + * - POWER(base, exponent) + - `Excel POWER article `_ + * - PRODUCT(factor1, [factor2, ...]) + - `Excel PRODUCT article `_ + * - RAND() + - `Excel RAND article `_ + * - RANDARRAY([rows], [columns], [min], [max], [whole_number]) + - `Excel RANDARRAY article `_ + * - RANDBETWEEN(low, high) + - `Excel RANDBETWEEN article `_ + * - ROUND(value, [places]) + - `Excel ROUND article `_ + * - ROUNDDOWN(value, [places]) + - `Excel ROUNDDOWN article `_ + * - ROUNDUP(value, [places]) + - `Excel ROUNDUP article `_ + * - SEC(angle) + - `Excel SEC article `_ + * - SECH(value) + - `Excel SECH article `_ + * - SIN(angle) + - `Excel SIN article `_ + * - SINH(value) + - `Excel SINH article `_ + * - SQRT(value) + - `Excel SQRT article `_ + * - SUM(value1, [value2, ...]) + - `Excel SUM article `_ + * - SUMIF(criteria_range, criterion, [sum_range]) + - `Excel SUMIF article `_ + * - SUMIFS(sum_range, criteria_range1, criterion1, [criteria_range2, ...], [criterion2, ...]) + - `Excel SUMIFS article `_ + * - TAN(angle) + - `Excel TAN article `_ + * - TANH(value) + - `Excel TANH article `_ + * - TRUNC(value, [places]) + - `Excel TRUNC article `_ +``` + +(functions-misc)= + +## Misc + +```{eval-rst} +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - Name and arguments + - Description or link + * - FORMAT.LARGE.NUMBER(value, [unit]) + - Apply a large number format (not compatible with Excel) +``` + +(functions-odoo)= + +## Odoo + +```{eval-rst} +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - Name and arguments + - Description or link + * - ODOO.CREDIT(account_codes, date_range, [offset], [company_id], [include_unposted]) + - Get the total credit for the specified account(s) and period (not compatible with Excel) + * - ODOO.DEBIT(account_codes, date_range, [offset], [company_id], [include_unposted]) + - Get the total debit for the specified account(s) and period (not compatible with Excel) + * - ODOO.BALANCE(account_codes, date_range, [offset], [company_id], [include_unposted]) + - Get the total balance for the specified account(s) and period (not compatible with Excel) + * - ODOO.FISCALYEAR.START(day, [company_id]) + - Returns the starting date of the fiscal year encompassing the provided date (not compatible with Excel) + * - ODOO.FISCALYEAR.END(day, [company_id]) + - Returns the ending date of the fiscal year encompassing the provided date (not compatible with Excel) + * - ODOO.ACCOUNT.GROUP(type) + - Returns the account ids of a given group (not compatible with Excel) + * - ODOO.CURRENCY.RATE(currency_from, currency_to, [date]) + - This function takes in two currency codes as arguments, and returns the exchange rate from the first currency to the second as float (not compatible with Excel) + * - ODOO.LIST(list_id, index, field_name) + - Get the value from a list (not compatible with Excel) + * - ODOO.LIST.HEADER(list_id, field_name) + - Get the header of a list (not compatible with Excel) + * - ODOO.FILTER.VALUE(filter_name) + - Return the current value of a spreadsheet filter (not compatible with Excel) +``` + +(functions-operators)= + +## Operators + +```{eval-rst} +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - Name and arguments + - Description or link + * - ADD(value1, value2) + - Sum of two numbers (not compatible with Excel) + * - CONCAT(value1, value2) + - `Excel CONCAT article `_ + * - DIVIDE(dividend, divisor) + - One number divided by another (not compatible with Excel) + * - EQ(value1, value2) + - Equal (not compatible with Excel) + * - GT(value1, value2) + - Strictly greater than (not compatible with Excel) + * - GTE(value1, value2) + - Greater than or equal to (not compatible with Excel) + * - LT(value1, value2) + - Less than (not compatible with Excel) + * - LTE(value1, value2) + - Less than or equal to (not compatible with Excel) + * - MINUS(value1, value2) + - Difference of two numbers (not compatible with Excel) + * - MULTIPLY(factor1, factor2) + - Product of two numbers (not compatible with Excel) + * - NE(value1, value2) + - Not equal (not compatible with Excel) + * - POW(base, exponent) + - A number raised to a power (not compatible with Excel) + * - UMINUS(value) + - A number with the sign reversed (not compatible with Excel) + * - UNARY.PERCENT(percentage) + - Value interpreted as a percentage (not compatible with Excel) + * - UPLUS(value) + - A specified number, unchanged (not compatible with Excel) +``` + +(functions-statistical)= + +## Statistical + +```{eval-rst} +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - Name and arguments + - Description or link + * - AVEDEV(value1, [value2, ...]) + - `Excel AVEDEV article `_ + * - AVERAGE(value1, [value2, ...]) + - `Excel AVERAGE article `_ + * - AVERAGE.WEIGHTED(values, weights, [additional_values, ...], [additional_weights, ...]) + - Weighted average (not compatible with Excel) + * - AVERAGEA(value1, [value2, ...]) + - `Excel AVERAGEA article `_ + * - AVERAGEIF(criteria_range, criterion, [average_range]) + - `Excel AVERAGEIF article `_ + * - AVERAGEIFS(average_range, criteria_range1, criterion1, [criteria_range2, ...], [criterion2, ...]) + - `Excel AVERAGEIFS article `_ + * - CORREL(data_y, data_x) + - `Excel CORREL article `_ + * - COUNT(value1, [value2, ...]) + - `Excel COUNT article `_ + * - COUNTA(value1, [value2, ...]) + - `Excel COUNTA article `_ + * - COVAR(data_y, data_x) + - `Excel COVAR article `_ + * - COVARIANCE.P(data_y, data_x) + - `Excel COVARIANCE.P article `_ + * - COVARIANCE.S(data_y, data_x) + - `Excel COVARIANCE.S article `_ + * - FORECAST(x, data_y, data_x) + - `Excel FORECAST article `_ + * - GROWTH(known_data_y, [known_data_x], [new_data_x], [b]) + - Fits points to exponential growth trend (not compatible with Excel) + * - INTERCEPT(data_y, data_x) + - `Excel INTERCEPT article `_ + * - LARGE(data, n) + - `Excel LARGE article `_ + * - LINEST(data_y, [data_x], [calculate_b], [verbose]) + - `Excel LINEST article `_ + * - LOGEST(data_y, [data_x], [calculate_b], [verbose]) + - `Excel LOGEST article `_ + * - MATTHEWS(data_x, data_y) + - Compute the Matthews correlation coefficient of a dataset (not compatible with Excel) + * - MAX(value1, [value2, ...]) + - `Excel MAX article `_ + * - MAXA(value1, [value2, ...]) + - `Excel MAXA article `_ + * - MAXIFS(range, criteria_range1, criterion1, [criteria_range2, ...], [criterion2, ...]) + - `Excel MAXIFS article `_ + * - MEDIAN(value1, [value2, ...]) + - `Excel MEDIAN article `_ + * - MIN(value1, [value2, ...]) + - `Excel MIN article `_ + * - MINA(value1, [value2, ...]) + - `Excel MINA article `_ + * - MINIFS(range, criteria_range1, criterion1, [criteria_range2, ...], [criterion2, ...]) + - `Excel MINIFS article `_ + * - PEARSON(data_y, data_x) + - `Excel PEARSON article `_ + * - PERCENTILE(data, percentile) + - `Excel PERCENTILE article `_ + * - PERCENTILE.EXC(data, percentile) + - `Excel PERCENTILE.EXC article `_ + * - PERCENTILE.INC(data, percentile) + - `Excel PERCENTILE.INC article `_ + * - POLYFIT.COEFFS(data_y, data_x, order, [intercept]) + - Compute the coefficients of polynomial regression of the dataset (not compatible with Excel) + * - POLYFIT.FORECAST(x, data_y, data_x, order, [intercept]) + - Predict value by computing a polynomial regression of the dataset (not compatible with Excel) + * - QUARTILE(data, quartile_number) + - `Excel QUARTILE article `_ + * - QUARTILE.EXC(data, quartile_number) + - `Excel QUARTILE.EXC article `_ + * - QUARTILE.INC(data, quartile_number) + - `Excel QUARTILE.INC article `_ + * - RANK(value, data, [is_ascending]) + - `Excel RANK article `_ + * - RSQ(data_y, data_x) + - `Excel RSQ article `_ + * - SMALL(data, n) + - `Excel SMALL article `_ + * - SLOPE(data_y, data_x) + - `Excel SLOPE article `_ + * - SPEARMAN(data_y, data_x) + - Compute the Spearman rank correlation coefficient of a dataset (not compatible with Excel) + * - STDEV(value1, [value2, ...]) + - `Excel STDEV article `_ + * - STDEV.P(value1, [value2, ...]) + - `Excel STDEV.P article `_ + * - STDEV.S(value1, [value2, ...]) + - `Excel STDEV.S article `_ + * - STDEVA(value1, [value2, ...]) + - `Excel STDEVA article `_ + * - STDEVP(value1, [value2, ...]) + - `Excel STDEVP article `_ + * - STDEVPA(value1, [value2, ...]) + - `Excel STDEVPA article `_ + * - STEYX(data_y, data_x) + - `Excel STEYX article `_ + * - TREND(known_data_y, [known_data_x], [new_data_x], [b]) + - Fits points to linear trend derived via least-squares (not compatible with Excel) + * - VAR(value1, [value2, ...]) + - `Excel VAR article `_ + * - VAR.P(value1, [value2, ...]) + - `Excel VAR.P article `_ + * - VAR.S(value1, [value2, ...]) + - `Excel VAR.S article `_ + * - VARA(value1, [value2, ...]) + - `Excel VARA article `_ + * - VARP(value1, [value2, ...]) + - `Excel VARP article `_ + * - VARPA(value1, [value2, ...]) + - `Excel VARPA article `_ +``` + +(functions-text)= + +## Text + +```{eval-rst} +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - Name and arguments + - Description or link + * - CHAR(table_number) + - `Excel CHAR article `_ + * - CLEAN(text) + - `Excel CLEAN article `_ + * - CONCATENATE(string1, [string2, ...]) + - `Excel CONCATENATE article `_ + * - EXACT(string1, string2) + - `Excel EXACT article `_ + * - FIND(search_for, text_to_search, [starting_at]) + - `Excel FIND article `_ + * - JOIN(delimiter, value_or_array1, [value_or_array2, ...]) + - Concatenates elements of arrays with delimiter (not compatible with Excel) + * - LEFT(text, [number_of_characters]) + - `Excel LEFT article `_ + * - LEN(text) + - `Excel LEN article `_ + * - LOWER(text) + - `Excel LOWER article `_ + * - MID(text, starting_at, extract_length) + - `Excel MID article `_ + * - PROPER(text_to_capitalize) + - `Excel PROPER article `_ + * - REPLACE(text, position, length, new_text) + - `Excel REPLACE article `_ + * - RIGHT(text, [number_of_characters]) + - `Excel RIGHT article `_ + * - SEARCH(search_for, text_to_search, [starting_at]) + - `Excel SEARCH article `_ + * - SPLIT(text, delimiter, [split_by_each], [remove_empty_text]) + - `Excel TEXTSPLIT article `_ + * - SUBSTITUTE(text_to_search, search_for, replace_with, [occurrence_number]) + - `Excel SUBSTITUTE article `_ + * - TEXT(number, format) + - `Excel TEXT article `_ + * - TEXTJOIN(delimiter, ignore_empty, text1, [text2, ...]) + - `Excel TEXTJOIN article `_ + * - TRIM(text) + - `Excel TRIM article `_ + * - UPPER(text) + - `Excel UPPER article `_ +``` + +(functions-web)= + +## Web + +```{eval-rst} +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - Name and arguments + - Description or link + * - HYPERLINK(url, [link_label]) + - `Excel HYPERLINK article `_ +``` + diff --git a/content/applications/productivity/spreadsheet/global_filters.md b/content/applications/productivity/spreadsheet/global_filters.md new file mode 100644 index 000000000..8d4250e2d --- /dev/null +++ b/content/applications/productivity/spreadsheet/global_filters.md @@ -0,0 +1,219 @@ +--- +substitutions: + drag-handle: '{raw-html}`` {guilabel}`(drag handle)`' + global-filter: '{raw-html}`` {guilabel}`(global filter)`' +--- + +# Global filters + +```{eval-rst} +.. role:: raw-html(raw) + :format: html +``` + +Create dynamic views of {doc}`inserted data `, by mapping data source fields to *global +filters* in the Odoo **Spreadsheets** app. + +:::{note} +The global filters are represented by the {{ global-filter }} icon, and enable data that was inserted +via a pivot table, list, or chart to be filtered. Global filters differ from the *sort and +filter* feature for cell ranges represented by the {icon}`fa-filter` {guilabel}`(filter)` icon. +::: + +```{image} global_filters/global-filters-menu.png +:align: center +:alt: The global filters menu sidebar on a spreadsheet. +``` + +## Add filters + +Navigate to the {menuselection}`Documents app` and click on the desired spreadsheet, then open the +{{ global-filter }} filter menu. + +Create a new filter by selecting one of the buttons under the {guilabel}`Add a new filter...` +section: + +- {ref}`Date `: filter dates by matching data source date fields to + a time range (e.g., *Month / Quarter*, *Relative Period*, or *From / To*). +- {ref}`Relation `: filter records by matching data source + fields to fields in a related model (e.g., *Lead/Opportunity*, *Sales Order*, or *Event + Registration*). +- {ref}`Text `: filter text by matching data source text fields to a + string of text (e.g., *Restrict values to a range* and/or provide a *Default value*). + +:::{note} +Only filters that are able to be applied to the fields in the data source are shown. +::: + +(spreadsheet-global-filter-date)= + +### Date + +The *Date* global filter enables the filtering of data sources by a specific time range, to +automatically filter on the current period, or to offset the time range relative to the period. + +With the {{ global-filter }} menu open, select the {guilabel}`Date` button to create a new date filter. +The {guilabel}`Filter properties` menu displays the following fields for configuration below. + +First, enter a name for the new date filter in the {guilabel}`Label` field. + +Then, select one of the three period options in the {guilabel}`Time range` field: + +- {guilabel}`Month / Quarter`: enables a drop-down menu of specific months and quarters of a year + (i.e., *Q1*, *Q2*, *January*, etc.). +- {guilabel}`Relative Period`: enables a drop-down menu of specific moving time frames (i.e., *Year + to Date*, *Last 7 Days*, *Last 30 Days*, etc.). +- {guilabel}`From / To`: enables *Date from...* and *Date to...* date selection fields to define a + specific time range (e.g., `06/05/2024` to `06/27/2024`). + +Optionally, set a {guilabel}`Default value` for the {guilabel}`Time range`. + +:::{note} +The {guilabel}`Default value` field only appears for {guilabel}`Month / Quarter` or +{guilabel}`Relative Period` ranges. + +If the {guilabel}`Month / Quarter` range is selected, tick the {guilabel}`Automatically filter on +the current period` checkbox to define the default period of either {guilabel}`Month`, +{guilabel}`Quarter`, or {guilabel}`Year`. +::: + +Next, configure the {guilabel}`Field matching` for each data source. To do so, expand the section by +clicking on the {guilabel}`Field matching` heading, to reveal a list of the data sources in the +spreadsheet where each data source has two fields for matching: + +- {guilabel}`Date field`: select a date field from the data source model to apply the time range to. + +- {guilabel}`Period offset`: (optionally) select an offset that shifts the time range by a relative + period. + + The options available are: {guilabel}`Previous`, {guilabel}`Before Previous`, {guilabel}`Next`, + {guilabel}`After Next`. + +Lastly, once all the information is entered on the form, click the {guilabel}`Save` button. If any +of the data source fields do not match the data type of *date* (or *datetime*), an error is shown +stating {guilabel}`Some required fields are not valid`. + +```{eval-rst} +.. example:: + Consider a :guilabel:`Period offset` of :guilabel:`Next` when using the :guilabel:`Month / + Quarter` range to apply the filter to the *next* period relative to the set time range. + + With this configuration, selecting `January` `2024` as the date, filters data as `February` + `2024`; where the selected month is offset to the next month. + + .. image:: global_filters/date-period-offset.png + :align: center + :alt: A date filter with a period offset of "Next" configured. +``` + +(spreadsheet-global-filter-relation)= + +### Relation + +The *Relation* global filter enables the filtering of records in data sources by selecting a field +from a related model. + +With the {{ global-filter }} menu open, select the {guilabel}`Relation` button to create a new relation +filter. The {guilabel}`Filter properties` menu displays the following fields for configuration. + +First, enter a name for the new relation filter in the {guilabel}`Label` field. + +Then, select or search for a model from the {guilabel}`Related model` field. + +Once a model is selected, the {guilabel}`Default value` and {guilabel}`Field matching` fields +appear. + +Optionally, set a {guilabel}`Default value` for the {guilabel}`Related model`. The available options +are records of the model. + +Next, configure the {guilabel}`Field matching` for each data source. To do so, expand the section by +clicking on the {guilabel}`Field matching` heading, to reveal a list of the data sources in the +spreadsheet where each data source has a field for matching. + +Select a field from the data source model from which to apply the relation filter. + +Lastly, once all the information is entered on the form, click the {guilabel}`Save` button. If any +of the data source fields do not match the data type of the related model, an error is shown +stating {guilabel}`Some required fields are not valid`. + +```{eval-rst} +.. example:: + Consider a *Relation* filter with the :guilabel:`Related model` set as :guilabel:`Contact`. The + :guilabel:`Field matching` *CRM* lead (`crm.lead`) pivot data sources are set to + :guilabel:`Customer`. + + With this configuration, selecting a customer record filters the pivot table to only leads that + are related to the selected customer record. + + .. image:: global_filters/relation-contact.png + :align: center + :alt: A relation filter with the Contact model configured. +``` + +(spreadsheet-global-filter-text)= + +### Text + +The *Text* global filter enables the filtering of text by matching data source text fields to a +string of text or to a range of predefined values. + +With the {{ global-filter }} menu open, select the {guilabel}`Text` button to create a new text filter. +The {guilabel}`Filter properties` menu displays the following fields for configuration. + +First, enter a name for the new text filter in the {guilabel}`Label` field. + +Then, choose whether or not to {guilabel}`Restrict values to a range` by ticking the checkbox. Doing +so, reveals a field to input a range within the spreadsheet. Either type in or select the range. + +Next, configure the {guilabel}`Field matching` for each data source. To do so, expand the section by +clicking on the {guilabel}`Field matching` heading, to reveal a list of the data sources in the +spreadsheet where each data source has a field for matching. + +Select a field from the data source model from which to apply the text filter. + +Lastly, once all the information is entered on the form, click the {guilabel}`Save` button. If any +of the data source fields do not match the data type of the related model, an error is shown +stating {guilabel}`Some required fields are not valid`. + +```{eval-rst} +.. example:: + Consider a text filter with the range `A2:A6` added to the :guilabel:`Restrict values to a range` + field. The spreadsheet has five different product names listed as values in the cells of column + `A`, rows `2` though `6`. + + With the above configuration, a pivot table of products can be filtered by product name by + selecting one of the 5 predefined values available in the text filter. + + Furthermore, if the values in the range `A2:A6` are added dynamically– the text filter becomes + dynamic as well. + + .. image:: global_filters/text-values.png + :align: center + :alt: A dynamic text filter with a restricted range. +``` + +## Manage filters + +Open the {{ global-filter }} filter menu by navigating to the {menuselection}`Documents app` and +clicking on the desired spreadsheet. + +Existing global filters appear under the {guilabel}`Filters` section. Filters can be used +individually, or at the same time. + +:::{tip} +The order of existing filters can be changed by hovering over a filter and using the +{{ drag-handle }} icon to change the position. +::: + +To reset a filter with set values back to default, click on the {icon}`fa-times` (clear) icon next +to the value in the filter. + +To edit an existing filter, select the {icon}`fa-cog` {guilabel}`(gear)` icon to open the filter's +{guilabel}`Filter properties` menu. From here, edits can be made or the filter can be deleted by +clicking the {guilabel}`Remove` button. + diff --git a/content/applications/productivity/spreadsheet/insert.md b/content/applications/productivity/spreadsheet/insert.md new file mode 100644 index 000000000..98a018141 --- /dev/null +++ b/content/applications/productivity/spreadsheet/insert.md @@ -0,0 +1,59 @@ +# Link Odoo data + +You can insert and link several elements from your database in your spreadsheets, namely: + +- pivots, +- graphs, +- lists, and +- links to menus (i.e., a clickable link to a view of a specific model). + +Before inserting {ref}`pivots `, {ref}`graphs `, or +lists, ensure they are tailored to your needs, as some elements are more quickly - or only - +configurable in their respective view. + +- To insert pivots and graphs, click {guilabel}`Insert in spreadsheet` from any pivot or graph view. +- To insert lists, click {menuselection}`Favorites --> Insert list in spreadsheet` from any list + view. +- To insert links to menus, click {menuselection}`Favorites --> Link menu in spreadsheet` from any + view. + +In the pop-up box, either create a new spreadsheet by selecting {guilabel}`Blank spreadsheet` or +insert it in an existing one by selecting it and clicking {guilabel}`Confirm`. + +```{image} insert/insert-spreadsheet.png +:align: center +:alt: Inserting a pivot in a spreadsheet +``` + +:::{note} +By default, new spreadsheets are saved under the {guilabel}`Spreadsheet` workspace of the +Documents app. +::: + +(insert-update)= + +## Updating data + +Once inserted in a spreadsheet, your data is kept up-to-date, reflecting any changes made to your +database. Reopening the spreadsheet reloads the linked data. + +:::{note} +To update pivots and lists data without reopening a spreadsheet, go to the menu bar and click +{menuselection}`Data --> Refresh all data`. +::: + +### Pivot data + +Using {guilabel}`Refresh all data` only updates existing pivot cells. If new cells need to be added, +go to the menu bar and click {menuselection}`Data --> Re-insert pivot` to fully update the pivot. +Alternatively, click {guilabel}`Insert pivot`, select the pivot, and tick {guilabel}`Display missing +cells only` to preview first the missing data. + +> ```{image} insert/missing-cells.png +> :align: center +> :alt: Displaying missing cells in a pivot +> ``` + +To change which records are {ref}`used by the pivot `, right-click on +a pivot cell, select {guilabel}`See pivot properties`, and click {guilabel}`Edit domain`. + diff --git a/content/applications/productivity/spreadsheet/templates.md b/content/applications/productivity/spreadsheet/templates.md new file mode 100644 index 000000000..3d9b4f990 --- /dev/null +++ b/content/applications/productivity/spreadsheet/templates.md @@ -0,0 +1,67 @@ +# Templates + +Spreadsheet templates allow you to quickly create spreadsheets without starting from scratch. For +example, you could create a template for a monthly budget report or a quarterly sales commission +report. + +:::{note} +Templates are available to all users on the database. +::: + +(spreadsheet-templates-create)= + +## 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`. + +:::{important} +Once a spreadsheet is saved as a template, any further changes to the open spreadsheet are +saved only in that spreadsheet. To make changes to the template, you need to {ref}`edit +the template `. +::: + +You can also create a template by {ref}`making a copy of an existing template and editing it +`. + +(spreadsheet-templates-use)= + +## Use templates + +To create a new spreadsheet using a template, open the Documents app and click +{menuselection}`New --> Spreadsheet`. Select the relevant template and click {guilabel}`Create`. + +Alternatively, go to {menuselection}`Documents --> Configuration --> Spreadsheet Templates` then, +on the line of the relevant template, click {icon}`fa-plus` {guilabel}`New spreadsheet`. + +:::{note} +By default, the new spreadsheet inherits the name of the template, which is shown at the top of +the screen. To rename the spreadsheet, click the name and edit it. +::: + +(spreadsheet-templates-manage)= + +## Manage and edit templates + +Manage templates by going to {menuselection}`Documents --> Configuration --> Spreadsheet Templates`. +Remove the {guilabel}`My Templates` {ref}`filter ` to view all +templates in the database. + +Various actions are possible: + +- Copy an existing template by clicking {icon}`fa-clone` {guilabel}`Make a copy` at the right of + the screen. The new template appears at the bottom of the list. Click the {guilabel}`Name` to + edit it. +- Edit an existing template (including one you just copied) by clicking {icon}`fa-pencil` + {guilabel}`Edit`, then making the required changes. Modifications are + automatically saved. +- 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/to_do.md b/content/applications/productivity/to_do.md new file mode 100644 index 000000000..745398429 --- /dev/null +++ b/content/applications/productivity/to_do.md @@ -0,0 +1,98 @@ +# To-do + +To-do assists you in organizing and managing personal tasks. + +## Creating to-dos + +To create a to-do, click {guilabel}`New` or the plus button ({guilabel}`➕`) next to a stage name. +Add a title to your to-do, then click {guilabel}`Add` to save it or {guilabel}`Edit` to access more +options. + +If you choose to {guilabel}`Edit` a to-do, you have the option to add {guilabel}`Tags`, +{guilabel}`Assignees`, or more information using the Odoo Editor. + +:::{note} +- Adding {guilabel}`Assignees` shares the to-do with the users selected. +- Type `/` in the editor box to structure and format your content. You can also add media, links, + and widgets. +::: + +:::{tip} +You can create a new to-do on the fly from anywhere in Odoo by opening the **command palette +tool** with the keyboard shortcut ´ctrl+k´ and clicking {guilabel}`Add a To-Do`, or by clicking +the clock button and then {guilabel}`Add a To-Do`. + +```{image} to_do/add-on-the-fly.png +:alt: Adding a to-do on the fly +``` +::: + +### Converting to-dos into project tasks + +If you use the {doc}`Project app <../services/project>`, you can convert to-dos into project tasks. +To do so, open a to-do and click the gear button ({guilabel}`⚙`), then {guilabel}`Convert to Task`. + +Next, select the {guilabel}`Project`, {guilabel}`Assignees`, and {guilabel}`Tags`, then click +{guilabel}`Convert to Task`. The to-do is now a project task and appears in the selected project. + +```{image} to_do/convert-task-button.png +:alt: Converting a to-do into a task +``` + +## Managing the to-do pipeline + +Your assigned **to-dos** are displayed on the app dashboard. You can drag and drop a to-do to move +it from one stage to another. + +```{image} to_do/to-do-pipeline.png +:alt: Example of a to-do pipeline +``` + +:::{tip} +- Click the {guilabel}`+ Personal Stage` button on the left of the pipeline to create a new + stage. +- Click the gear button ({guilabel}`⚙`) next to a stage to {guilabel}`Fold`, {guilabel}`Edit`, + or {guilabel}`Delete` it. + +> ```{image} to_do/stage-options.png +> :alt: Stage settings button +> ``` +::: + +### Scheduling activities + +To schedule an activity on a to-do, click the clock button on the app dashboard, then the +{guilabel}`+ Schedule an activity` button. + +```{image} to_do/schedule-activity.png +:alt: Scheduling an activity from the To-do dashboard +``` + +To create the activity: + +- Select an {guilabel}`Activity Type`. +- Select a {guilabel}`Due date`. +- Choose who the activity should be {guilabel}`Assigned to`. +- Add a brief {guilabel}`Summary` if needed. You can add a more elaborate description in the + {guilabel}`Log a note` box. + +Click {guilabel}`Schedule` to complete the action. + +:::{note} +The {guilabel}`To Do` activity is *not* a to-do task. Selecting it does not create a to-do task. +::: + +### Viewing to-dos in the Project app + +If you use the {doc}`Project app <../services/project>`, your to-dos also appear as private tasks +under the {guilabel}`My Tasks` view. + +```{image} to_do/my-task-pipeline.png +:alt: Example of a "My Tasks" pipeline in the Project app +``` + +:::{note} +A padlock icon is visible on your private tasks to quickly identify them among your project +tasks. +::: + diff --git a/content/applications/productivity/voip.md b/content/applications/productivity/voip.md new file mode 100644 index 000000000..587226c9f --- /dev/null +++ b/content/applications/productivity/voip.md @@ -0,0 +1,22 @@ +--- +hide-page-toc: true +show-content: true +show-toc: true +--- + +# VoIP (Voice over Internet Protocol) + +:::{seealso} +For more information, reference the [Odoo eLearning (video tutorials) on VoIP](https://www.odoo.com/slides/voip-voice-over-ip-315) +::: + +```{toctree} +:titlesonly: true + +voip/onsip +voip/axivox +voip/voip_widget +voip/devices_integrations +voip/transfer_forward +``` + diff --git a/content/applications/productivity/voip/axivox.md b/content/applications/productivity/voip/axivox.md new file mode 100644 index 000000000..e8ca7db73 --- /dev/null +++ b/content/applications/productivity/voip/axivox.md @@ -0,0 +1,19 @@ +--- +nosearch: true +--- + +# Axivox configuration + +```{toctree} +:titlesonly: true + +axivox/axivox_config +axivox/manage_users +axivox/vm_audio_messages +axivox/dynamic_caller_id +axivox/conference_calls +axivox/dial_plan_basics +axivox/dial_plan_advanced +axivox/call_queues +``` + diff --git a/content/applications/productivity/voip/axivox/axivox_config.md b/content/applications/productivity/voip/axivox/axivox_config.md new file mode 100644 index 000000000..814b7cf65 --- /dev/null +++ b/content/applications/productivity/voip/axivox/axivox_config.md @@ -0,0 +1,72 @@ +# VoIP services in Odoo with Axivox + +## Introduction + +Odoo VoIP (Voice over Internet Protocol) can be set up to work together with [Axivox](https://www.axivox.com/). In that case, a VoIP server is **not** necessary, as the +infrastructure is hosted and managed by Axivox. + +To use this service, [contact Axivox](https://www.axivox.com/en/contact) to open an account. +Before doing so, verify that Axivox covers the company's area, along with the areas the company's +users wish to call. + +## 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: + +- {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 +:align: center +:alt: Integration of Axivox as VoIP provider in an Odoo database. +``` + +:::{tip} +Access the domain on the Axivox administrative panel by navigating to [https://manage.axivox.com/](https://manage.axivox.com/). After logging into the portal, go to {menuselection}`Users --> +Edit (next to any user) --> SIP Identifiers tab --> Domain`. +::: + +### Configure VoIP user in Odoo + +Next, the user is configured in Odoo, which **must** take place for every Axivox/Odoo user using +VoIP. + +In Odoo, go to {menuselection}`Settings app --> Users & Companies --> Users`, then open the desired +user's form to configure {abbr}`VoIP (Voice over Internet Protocol)`. Under the +{guilabel}`Preferences` tab, fill out the {guilabel}`VOIP Configuration` section: + +- {guilabel}`VoIP username` / {guilabel}`Extension number`: (Axivox) {guilabel}`SIP username` +- {guilabel}`OnSip Auth Username`: (Axivox) {guilabel}`SIP username` +- {guilabel}`VoIP Secret`: (Axivox) {guilabel}`SIP Password` +- {guilabel}`Call from another device`: option to always transfer phone calls to handset +- {guilabel}`External device number`: SIP external phone extension +- {guilabel}`Reject incoming calls`: option to reject all incoming calls +- {guilabel}`How to place calls on mobile`: method to make calls on a mobile device + +```{image} axivox_config/odoo-user.png +:align: center +:alt: Integration of Axivox user in the Odoo user preference. +``` + +:::{tip} +Access the domain on the Axivox administrative panel by navigating to [https://manage.axivox.com/](https://manage.axivox.com/). After logging into the portal, go to {menuselection}`Users --> +Edit (next to the user) --> SIP Identifiers tab --> SIP username / SIP password`. + +```{image} axivox_config/manager-sip.png +:align: center +:alt: SIP credentials in the Axivox manager. +``` +::: + +:::{important} +When entering the {guilabel}`SIP Password` into the user's {guilabel}`Preferences` tab, this +value **must** be typed out manually and **not** pasted in. Pasting in causes a `401 server +rejection error`. +::: + diff --git a/content/applications/productivity/voip/axivox/call_queues.md b/content/applications/productivity/voip/axivox/call_queues.md new file mode 100644 index 000000000..d38c17826 --- /dev/null +++ b/content/applications/productivity/voip/axivox/call_queues.md @@ -0,0 +1,237 @@ +# Call queues + +A call queue is a system that organizes and routes incoming calls. When customers call a business, +and all of the agents are busy, the call queue lines up the callers in sequential order, based on +the time they called in. + +The callers then wait on hold to be connected to the next available call center agent. + +Implementing a call queue system reduces stress for employees, and helps build brand trust with +customers. Many companies use call queues to set expectations with customers, and to distribute the +workload equally amongst employees. + +This document covers the process required to configure call queues (with advanced settings), as well +as how to log into a call queue from the Odoo database. + +:::{seealso} +{ref}`voip/axivox/music_on_hold` +::: + +## Add a queue + +To add a call queue in Axivox, navigate to the [Axivox management console](https://manage.axivox.com). In the left menu, click {guilabel}`Queues`. Next, click +{guilabel}`Add a queue`. Doing so reveals a blank {guilabel}`New queue` form with various fields to +fill out. + +### Name + +Once the {guilabel}`New queue` page appears, enter the {guilabel}`Name` of the queue. + +### Internal extension + +Choose an {guilabel}`Internal extension` for the queue. This is a number to be dialed by users of +the database to reach the login prompt for the queue. + +### Strategy + +Next, is the {guilabel}`Strategy` field. This field determines the call routing of received calls +into this queue. + +The following choices are available in the {guilabel}`Strategy` drop-down menu: + +- {guilabel}`Call all available agents` +- {guilabel}`Calls the agent who has received the call for the longest time` +- {guilabel}`Calls the agent who has received the least call` +- {guilabel}`Call a random agent` +- {guilabel}`Call agents one after the other` +- {guilabel}`Call agents one after the other starting with the first in the list` + +Choose a strategy that best meets the company's needs for customers in the queue. + +### Maximum waiting time in seconds + +In the {guilabel}`Maximum waiting time in seconds` field, determine the longest time a customer +waits in the queue before going to a voicemail, or wherever else they are directed to in a dial +plan. Enter a time in seconds. + +### Maximum duration of ringing at an agent + +In the {guilabel}`Maximum duration of ringing at an agent` field, determine the longest time an +individual agent's line rings before moving on to another agent, or moving to the next step in the +dial plan. Enter a time in seconds. + +:::{seealso} +For more information on dial plans, visit: + +- {doc}`dial_plan_basics` +- {doc}`dial_plan_advanced` +::: + +### Adding agents + +The final two fields on the {guilabel}`New queue` form revolve around adding agents. Adding +{guilabel}`Static agents` and {guilabel}`Dynamic agents` are two pre-configured methods for adding +agents onto the call queue during the configuration. + +(voip-axivox-static-agents)= + +#### Static agents + +When {guilabel}`Static agents` are added, these agents are automatically added to the queue without +the need to log in to receive calls. + +(voip-axivox-dynamic-agents)= + +#### Dynamic agents + +When {guilabel}`Dynamic agents` are added, these agents have the ability to log into this queue. +They are **not** logged-in automatically, and **must** log in to receive calls. + +Be sure to {guilabel}`Save` the changes, and click {guilabel}`Apply changes` in the upper-right +corner to implement the change in production. + +## Agent connection + +There are three ways call agents can connect to an Axivox call queue: + +1. Dynamic agents connect automatically. +2. Manager logs in specific agent(s), via the [Axivox management console](https://manage.axivox.com). +3. Agent connects to the queue in Odoo, via the *VoIP* widget. + +:::{seealso} +See the documentation on setting {ref}`voip/axivox/dynamic-agents` in the [Axivox management +console](https://manage.axivox.com). +::: + +### Connect via Axivox queue + +After the initial configuration of the call queue is completed, with the changes saved and +implemented, a manager can log into the [Axivox management console](https://manage.axivox.com) and +connect dynamic agents to the queue manually. + +To connect an agent, click {guilabel}`Queues`, located in the left-hand column. Doing so reveals the +{guilabel}`Queues` dashboard, with a few different columns listed: + +- {guilabel}`Name`: name of the queue. +- {guilabel}`Extension`: number of the extension to be dialed to reach the queue. +- {guilabel}`Agent Connection`: number to dial to log into the queue. +- {guilabel}`Agent disconnection`: number to dial to log out of the queue. +- {guilabel}`Connected Agents`: name of agent connected to the queue. + +The following buttons are also available on the {guilabel}`Queues` dashboard: + +- {guilabel}`Connect an agent`: manually connect an agent to the queue. +- {guilabel}`Report`: run a report on the queue. +- {guilabel}`Delete`: delete the queue. +- {guilabel}`Edit`: make changes to the settings of the queue. + +When agents are connected to the queue, or are live with a customer, they are displayed under the +{guilabel}`Connected Agents` column. + +If they are static agents, they **always** show up as connected. + +Connect an agent by clicking the orange button labeled, {guilabel}`Connect an agent`. Then, select +the desired agent's name from the drop-down menu, and click {guilabel}`Connect`. + +```{image} call_queues/call-queue.png +:align: center +:alt: |- +: Call queue with connected agents column highlighted and connect an agent and report buttons +: highlighted. +``` + +:::{seealso} +For more information on static and dynamic agents, see this documentation: + +- {ref}`voip/axivox/static-agents` +- {ref}`voip/axivox/dynamic-agents` +::: + +#### Report + +Click {guilabel}`Report` to check on the reporting for a particular queue, in order to see who +connected when, and what phone calls came in and out of the queue. This information is showcased on +a separate {guilabel}`Queue report` page, when the green {guilabel}`Report` button is clicked. + +Reports can be customized by date in the {guilabel}`Period` field, and specified in the +{guilabel}`From` and {guilabel}`to` fields. The information can be organized by {guilabel}`Event +type`, and {guilabel}`Call ID`. + +When the custom configurations have been entered, click {guilabel}`Apply`. + +Each report can be exported to a {abbr}`CSV (comma separated value)` file for further use and +analysis, via the {guilabel}`Export to CSV` button. + +When the {guilabel}`Event type` field is clicked, a drop-down menu appears with the following +options: + +- {guilabel}`The caller quit` +- {guilabel}`An agent is connecting` +- {guilabel}`An agent is disconnecting` +- {guilabel}`The call was terminated (agent hangs up)` +- {guilabel}`The call was terminated (caller hangs up)` +- {guilabel}`The caller is connected to an agent.` +- {guilabel}`Someone is entering the queue` +- {guilabel}`The caller exits the queue (no agent is connected)` +- {guilabel}`The caller exits the queue (timeout)` +- {guilabel}`No one is answering` +- {guilabel}`No one is answering, the caller hangs up` +- {guilabel}`Transfer` +- {guilabel}`Blind Transfer` + +```{image} call_queues/event-type.png +:align: center +:alt: Event types in the Axivox queue reporting feature. +``` + +There is no limit to how many options can be selected from the {guilabel}`Event type` drop-down +menu. + +Clicking {guilabel}`Check all` selects all the available options from the drop-down menu, and +clicking {guilabel}`Uncheck all` removes all selections from the drop-down menu. + +To select an individual {guilabel}`Event type`, click on the desired option in the drop-down menu. + +```{image} call_queues/report.png +:align: center +:alt: Axivox queue report with result, event type, and period highlighted. +``` + +### Connect to queue on Odoo + +Dynamic agents can connect manually to the Axivox call queue from the Odoo *VoIP* widget, once the +*VoIP* app is configured for the individual user in Odoo. + +:::{seealso} +{doc}`axivox_config` +::: + +To access the Odoo *VoIP* widget, click the {guilabel}`☎️ (phone)` icon in the upper-right corner of +the screen, from any window within Odoo. + +:::{seealso} +For more information on the Odoo *VoIP* widget, see this documentation: {doc}`../voip_widget` +::: + +For an agent to connect to the call queue, simply dial the {guilabel}`Agent connection` number, and +press the green call button {guilabel}`📞 (phone)` icon in the *VoIP* widget. Then, the agent hears +a short, two-second message indicating the agent is logged in. The call automatically ends +(disconnects). + +To view the connected agents in a call queue, navigate to the [Axivox management console](https://manage.axivox.com), and click {guilabel}`Queues`, located in the left-hand column. + +Then, click the green {guilabel}`Refresh` button at the top of the {guilabel}`Connected agents` +column. Any agent (static or dynamic) that is connected to the queue currently, appears in the +column next to the queue they are logged into. + +To log out of the queue, open the Odoo *VoIP* widget, dial the {guilabel}`Agent disconnection` +number, and press the green call button {guilabel}`📞 (phone)` icon. The agent is disconnected from +the queue after a short, two-second message. + +To manually log a dynamic agent out of a call queue, navigate to the [Axivox management console](https://manage.axivox.com), and click {guilabel}`Queues`, located in the left-hand column. Then, +click the green {guilabel}`Refresh` button at the top of the {guilabel}`Connected agents` column. + +To disconnect an agent manually, click the red {guilabel}`Disconnect` button, and they are +immediately disconnected. This can be helpful in situations where agents forget to log out at the +end of the day. + diff --git a/content/applications/productivity/voip/axivox/conference_calls.md b/content/applications/productivity/voip/axivox/conference_calls.md new file mode 100644 index 000000000..7f29e8d00 --- /dev/null +++ b/content/applications/productivity/voip/axivox/conference_calls.md @@ -0,0 +1,97 @@ +# Conference calls + +Conference calls help employees connect quickly and efficiently, so matters can be discussed in an +open forum of sorts. Attendees can be limited, via a sign-in code. That way, confidential matters +stay private. + +This document covers the configuration of conference calls in Axivox for use in Odoo *VoIP*. + +## Add a virtual conference + +To add a virtual conference room, navigate to the [Axivox management console](https://manage.axivox.com). After logging in, click on {guilabel}`Conferences` in the menu on the +left. + +Next, click the green button labeled, {guilabel}`Add a conference`, and a {guilabel}`New conference` +form appears. + +```{image} conference_calls/new-conference.png +:align: center +:alt: New conference form on Axivox. +``` + +From here, fill in the {guilabel}`Name` field, and set an {guilabel}`Internal extension`. + +The internal extension is what everyone in the network uses to quickly dial into the conference +call, instead of typing in the whole phone number. + +:::{tip} +Pick a number between three and five digits long, making it easy to remember and dial. +::: + +Next, set the {guilabel}`Access code`, if the conference room requires security. This is a password +to get into the conference, once the extension for the conference is dialed. Immediately after +dialing the extension, a digital receptionist prompts for the {guilabel}`Access code`. + +In the {guilabel}`Administrator extension` field, click the drop-down menu, and select the user's +extension that manages the call. + +Finally, in the {guilabel}`Wait for the administrator to start the conference` field, click the +drop-down menu, and select {guilabel}`Yes` or {guilabel}`No`. + +Should the selection be {guilabel}`Yes`, then nobody is allowed to utilize the virtual conference +room until the administrator is present, and logged into the conference call. + +When all fields are filled in, be sure to {guilabel}`Save` the configuration. Then, click +{guilabel}`Apply changes` in the upper-right corner to implement the change in production. + +Upon doing so, the conference is added, and the Axivox administrator has the option to +{guilabel}`Delete` or {guilabel}`Edit` the conference from the Axivox {guilabel}`Conference` main +dashboard. + +To invite an Axivox user to a specific conference call, click {guilabel}`Invite` to the right of the +desired conference, and proceed to enter the extension or phone number of the invitee in the pop-up +window that appears. + +Once the extension or number is added into the {guilabel}`Please enter the phone number of the +person you want to invite` field, click the green {guilabel}`Invite` button, and the recipient +immediately receives a phone call, automatically linking them to the conference. + +```{image} conference_calls/conference-invite.png +:align: center +:alt: New conference form on Axivox. +``` + +## Incoming numbers + +To open a conference to a wider audience, an Axivox conference can be linked to *Incoming numbers*. + +To do that, log into the [Axivox management console](https://manage.axivox.com), and click +{guilabel}`Incoming numbers` in the menu on the left. + +On the {guilabel}`Incoming numbers` dashboard, click {guilabel}`Edit` to the far-right of the +{guilabel}`Number` to which the conference should be attached. + +Then, under the first field, labeled, {guilabel}`Destination type for voice call`, click the +drop-down menu, and select {guilabel}`Conference`. + +Next, in the {guilabel}`Conference` field, click the drop-down menu, and select the specific +conference that should be attached to this incoming number. + +Now, whenever this incoming number is dialed, the caller is let into the conference, if there is not +an {guilabel}`Access code` required. If there *is* an {guilabel}`Access code` required, the caller +is then prompted to enter the {guilabel}`Access code` to enter the conference. + +## Start call in Odoo + +Anywhere in the Odoo database, open the *VoIP* widget, by clicking the {guilabel}`☎️ (phone)` icon, +located in the upper-right corner. Then, dial the specific extension number for the conference, and +click the {guilabel}`📞 (phone)` icon. + +```{image} conference_calls/phone-widget.png +:align: center +:alt: Connecting to a conference extension using the Odoo VoIP widget. +``` + +Once the digital receptionist answers, enter the {guilabel}`Access code` (if needed), and press the +{guilabel}`# (pound)` icon/key. + diff --git a/content/applications/productivity/voip/axivox/dial_plan_advanced.md b/content/applications/productivity/voip/axivox/dial_plan_advanced.md new file mode 100644 index 000000000..b5944e4f2 --- /dev/null +++ b/content/applications/productivity/voip/axivox/dial_plan_advanced.md @@ -0,0 +1,425 @@ +# Advanced dial plans + +Typically, companies have a lot of incoming calls every day, but many do not want their teams to +answer calls 24 hours a day, 7 days a week. + +By using Axivox advanced dial plan features, the process can be automated, and routing can be set up +for all scenarios. This way, customers are never left waiting, or frustrated, because they cannot +get in touch with anyone. + +By utilizing the advanced elements in dial plans, companies can automate call routing for certain +days or times, like company holidays. Companies can also allow callers to enter extensions +themselves, and get transferred automatically using a digital receptionist. This way, an +administrative team does **not** have to be available around the clock. + +There is even the option to route callers, depending on where they are calling from in the world, +thus maximizing efficiency. + +:::{important} +For more information on basic dial plans, and how to add elements, visit {doc}`dial_plan_basics`. +::: + +:::{warning} +Using a browser add-on for spelling may hinder the use of the visual editor in dial plans. Do +**not** use a translator with the Axivox management console. +::: + +## Advanced elements + +In Axivox dial plans (as described in {doc}`dial_plan_basics`), there are two advanced elements that +can be used. + +- {guilabel}`Record`: recording feature is enabled (requires plan change, enabled in Axivox + settings). +- {guilabel}`Caller ID`: replace the caller ID by the called number or free text. + +To add one of these elements, navigate to the {guilabel}`Dial plans` page, located in the menu on +the left side of the [Axivox management console](https://manage.axivox.com). + +Next, click on the {guilabel}`Visual Editor` button to the right of the desired dial plan to edit +it. Finally, open the {guilabel}`New element` drop-down menu, select the element, and click +{guilabel}`Add`. + +```{image} dial_plan_advanced/visual-editor.png +:align: center +:alt: Visual editor for a dial plan in Axivox, with Add and the dispatcher element +: highlighted. +``` + +For more information, visit {ref}`voip/axivox/dial_plans`. + +:::{important} +The {guilabel}`Record` element records calls that are routed through this element, and requires +an additional plan change in Axivox. +::: + +To enable recording on Axivox, navigate to {guilabel}`Settings` in the [Axivox management console](https://manage.axivox.com). Then, go to the {guilabel}`Recording` drop-down menu, near the bottom +of the page. From there, select {guilabel}`Enabled` from the drop-down menu to enable recording +using the {guilabel}`Record` element in a dial plan. + +:::{tip} +If the {guilabel}`Recording` drop-down menu is unavailable and unable to change, then consult +Axivox to enable the feature. +::: + +The {guilabel}`Caller ID` element allows for the replacement of the caller ID downstream, after +routing. + +Upon adding the {guilabel}`Caller ID` element to the dial plan, and double-clicking it to configure +it, two options appear. + +The first is a {guilabel}`Free text` field, where any text can be input to replace the caller ID. +The second option is {guilabel}`Replace the caller ID by the called number`. This option replaces +the caller's ID with the {guilabel}`Incoming number`. + +:::{tip} +A company may want to use the {guilabel}`Caller ID` element to replace the {guilabel}`Incoming +number`, so employees, or outside transfers, cannot see the number, and information is kept +private. +::: + +## Basic routing elements + +Basic routing elements in Axivox dial plans provide extension-based routing. This can be done by +adding either a *Menu* to numerically link the dial-by-numbers to an action, or by using a *Digital +Receptionist* to automatically route or listen for an extension, based on a key input from the +caller. + +The main difference between the two elements is that the *Digital Receptionist* does **not** need to +be pre-configured numerically with actions. Instead, it acts as a virtual receptionist. + +- {guilabel}`Menu`: add a dial-by-number directory and configured downstream actions (not + terminal). For example, a dial-by-numbers function could feature an element, wherein clicking '2' + takes the caller to the element linked to '2' on the Menu element in the dial plan. +- {guilabel}`Digital Receptionist`: attach a virtual dispatcher to listen for extensions. + +To add one of these elements, navigate to the {guilabel}`Dial plans` page, located in the menu on +the left side of the [Axivox management console](https://manage.axivox.com). Next, click on the +{guilabel}`Visual Editor` button to the right of the dial plan, to edit the dial plan. Then, open +the {guilabel}`New element` drop-down menu, select the element, and click {guilabel}`Add`. + +For more information, visit {ref}`voip/axivox/dial_plans`. + +### Digital receptionist scenario + +The *Digital Receptionist* element is a listen-feature that accurately routes callers through a dial +plan, based on the extension they enter, via the key pad. + +Set a *Digital Receptionist* to eliminate the need of a team, or live receptionist, to be on-call +all the time. With that element in place, calls now reach their destination, without a real person +interjecting. + +After adding the {guilabel}`Digital Receptionist` element to a dial plan, connect the appropriate +endpoints, and double-click on the element to set the {guilabel}`Timeout` on the +{guilabel}`receptionist` pop-up window that appears. + +The {guilabel}`Timeout` can be set in `5` second increments, from `5` seconds to `60` seconds. + +:::{important} +The {guilabel}`Digital Receptionist` element **requires** a {guilabel}`Play a file` element on +either side of it, to explain what action to take, and when a wrong extension is entered. +::: + +```{eval-rst} +.. example:: + While customizing a dial plan in a :guilabel:`Dialplan Editor` pop-up window, add a + :guilabel:`Menu` element, with a :guilabel:`Greeting message` that might read, `Press star to + dial an extension`. + + Then, on the :guilabel:`Menu` element, for the :guilabel:`* (star)` option, link a + :guilabel:`Play a file` element, that plays an :guilabel:`Audio message` saying, 'Enter the + extension of the person you are trying to reach'. + + Following the first :guilabel:`Play a file` element, add the :guilabel:`Digital Receptionist` + element, followed by another :guilabel:`Play a file` element, which states, 'That is not a valid + extension'. + + This last element is in place to close the loop, should the caller not enter a correct extension. + + Finally, this last :guilabel:`Play a file` element is looped back into the :guilabel:`Menu` + element. + + .. image:: dial_plan_advanced/receptionist.png + :align: center + :alt: A digital receptionist element highlighted in an example dial plan. +``` + +:::{important} +Dial plan elements can be configured by double-clicking them, and selecting different features +of the Axivox console to them. + +For example, an {guilabel}`Audio message` needs to be made, and then selected in a +{guilabel}`Play a file` or {guilabel}`Menu` element. + +For more information, see this documentation {ref}`voip/axivox/audio_messages`. +::: + +## Advanced routing elements + +Advanced routing elements route calls automatically as they are received into the incoming +number(s). This can be configured using geo-location, whitelisting, or time-based variables. Calls +pass through a filter prior to their final destination, and are routed, based on the set +variable(s). + +The following are advanced routing elements: + +- {guilabel}`Dispatcher`: create a call filter to route traffic, based on the geo-location of the + caller ID. +- {guilabel}`Access List`: create a tailored access list, with VIP customer preference. +- {guilabel}`Time Condition`: create time conditions to route incoming traffic around holidays, or + other sensitive time-frames. + +:::{tip} +Whitelisting is a technical term used to create a list of allowed numbers. Conversely, +blacklisting is used to create a list of denied numbers. +::: + +To add one of these elements, navigate to the {guilabel}`Dial plans` page, located in the menu on +the left side of the [Axivox management console](https://manage.axivox.com). Next, click on the +{guilabel}`Visual Editor` button to the right of the dial plan, to edit the dial plan. Then, open +the {guilabel}`New element` drop-down menu, select the element, and click {guilabel}`Add`. For more +information, visit {ref}`voip/axivox/dial_plans`. + +### Dispatcher scenario + +A *Dispatcher* element is a dial plan feature that directs calls, based on region or geo-location. +In most cases, the {guilabel}`Dispatcher` element in a dial plan is linked to the {guilabel}`Start` +element, in order to filter or screen calls as they come into an incoming number. + +Double-click the {guilabel}`Dispatcher` element in the {guilabel}`Dialplan Editor` pop-up window to +configure it. + +This element checks numbers (routed through this element), according to regular expressions. To add +a regular expression, click {guilabel}`Add a line` on the bottom of the {guilabel}`Dispatcher` +pop-up window. + +Then, under {guilabel}`Name`, enter a recognizable name to identify this expression. This is the +name that appears in the {guilabel}`Dispatcher` element on the dial plan showcased in the +{guilabel}`Dialplan Editor` pop-up window. + +In the {guilabel}`Regular expression` field, enter the country code, or area code, which Axivox +should route for incoming calls. This is especially helpful when a company would like to filter +their customers to certain queues, or users based on the customer's geo-location. + +To specify all numbers behind a certain country code, or area code, include `\d+` after the country +code, or country code + area code. + +```{image} dial_plan_advanced/dispatcher.png +:align: center +:alt: Dispatcher configuration panel, with name, regular expression and add a line +: highlighted. +``` + +```{eval-rst} +.. example:: + - `02\\d+`: validates the numbers starting with `02` + - `00\\d+`: validates all numbers beginning with `00` + - `0052\\d+` validates all numbers beginning with `0052` (Mexico country code) + - `001716\\d+`: validates all numbers beginning with `001716` (USA country code + Western New York + area code) +``` + +:::{tip} +A regular expression (shortened to "regex" or "regexp"), sometimes referred to as a "rational +expression," is a sequence of characters that specifies a match pattern in text. In other words, +a match is made within the given range of numbers. +::: + +When the desired configurations are complete on the {guilabel}`Dispatcher` pop-up window, be sure to +click {guilabel}`Save`. + +Upon doing so, the {guilabel}`Dispatcher` element appears with different routes available to +configure, based on the {guilabel}`Regular Expressions` that were set. + +Attach these routes to any {guilabel}`New element` in the {guilabel}`Dialplan Editor` pop-up window. + +By default, there is an {guilabel}`Unknown` path that appears on the {guilabel}`Dispatcher` element +after setting at least one {guilabel}`Regular Expression`. + +Calls follow this route/path when their number does not match any {guilabel}`Regular Expression` set +on the {guilabel}`Dispatcher` element. + +```{image} dial_plan_advanced/dispatcher-element.png +:align: center +:alt: Dial plan with dispatcher element highlighted. +``` + +### Time condition scenario + +When a {guilabel}`Time Condition` element is added to a dial plan, it has a simple {guilabel}`True` +and {guilabel}`False` routing. + +After adding the {guilabel}`Time Condition` element to a dial plan, double-click it to configure the +variables. {guilabel}`Hour/Minute`, {guilabel}`Days of the week`, {guilabel}`Day of the month`, and +{guilabel}`Month` can all be configured. + +If the time which the caller contacts the incoming number matches the set time conditions, then the +{guilabel}`True` path is followed, otherwise the {guilabel}`False` path is followed. + +```{eval-rst} +.. example:: + For a company that is closed yearly for the American Independence Day holiday (July 4th) the + following time conditions should be set: + + - :guilabel:`Hour/Minute` - `0:0 to 23:59` + - :guilabel:`Day of the week` - `All to All` + - :guilabel:`Day of the month` - `From 4 to 4` + - :guilabel:`Month` - `July` +``` + +The {guilabel}`Time Condition` element is especially useful for holidays, weekends, and to set +working hours. When a caller reaches a destination where they can be helped, either with a real +person or voicemail, this reduces wasted time and hangups. + +```{image} dial_plan_advanced/time-condition.png +:align: center +:alt: Time condition element set in a dial plan on Axivox. Time condition is highlighted. +``` + +:::{important} +To set the {guilabel}`Timezone` that the {guilabel}`Time Condition` operates under, navigate to +[Axivox management console](https://manage.axivox.com), and click {guilabel}`Settings` in the +menu on the left. Then, set the {guilabel}`Timezone` using the second field from the bottom, by +clicking the drop-down menu. +::: + +### Access list scenario + +An *Access List* element in a dial plan allows for the routing of certain numbers, and disallows +(denies) other numbers. + +After adding an {guilabel}`Access List` element to a dial plan, it can be configured by +double-clicking on the element directly in the {guilabel}`Dialplan Editor` pop-up window. + +Two fields appear where regular expressions can based in the {guilabel}`Allow` and {guilabel}`Deny` +fields of the {guilabel}`Access List` pop-up window. + +```{eval-rst} +.. example:: + For a very important customer, their number can be set in the :guilabel:`Allow` field, and these + callers can be sent directly to management. +``` + +:::{tip} +A regular expression (shortened to "regex" or "regexp"), sometimes also referred to as a +"rational expression," is a sequence of characters that specifies a match pattern in text. +::: + +```{image} dial_plan_advanced/access-config.png +:align: center +:alt: Access list element configuration with the allow/deny fields highlighted. +``` + +```{eval-rst} +.. example:: + - `2\\d\\d`: validates numbers from `200 to 299` + - `02\\d*`: validates all numbers beginning with `02` + - `0017165551212`: validates the number (`0017165551212`) +``` + +After setting the {guilabel}`Allow` and {guilabel}`Deny` fields with regular expressions or numbers, +click {guilabel}`Save` on the {guilabel}`Access List` pop-up window. + +Then, on the {guilabel}`Access list` element in the dial plan, three paths (or routes) are available +to link to further actions. + +Unknown calls can be routed through the regular menu flow by adding a {guilabel}`Menu` element, and +connecting it to the {guilabel}`Unknown` path. {guilabel}`Refused` calls can be routed to the +{guilabel}`Hang up` element. Lastly, {guilabel}`Authorized` callers can be sent to a specific +extension or queue. + +```{image} dial_plan_advanced/access-list.png +:align: center +:alt: Access list element highlighted in an example dial plan. +``` + +## Switches + +A *Switch* element in Axivox is a simple activated/deactivated route action. + +These can be activated or chosen quickly, allowing for quick routing changes, without altering the +dial plan. + +Alternate routes can be configured, so that in a moments notice, they can be switched to. This could +be for new availability, or to adjust traffic flow for any number of reasons. + +Axivox allows for a simple on/off switch, and a multi-switch, which can have several paths to choose +from. + +- {guilabel}`Switch`: a manual on/off control that can divert traffic, based on whether it is opened + (on) or closed (off). +- {guilabel}`Multi-Switch`: a mechanism to create paths, and turn them on and off, to divert + incoming calls. + +### Basic switch + +A {guilabel}`Switch` can be set in the [Axivox management console](https://manage.axivox.com) by +navigating to {guilabel}`Switches` in the left menu. To create a new switch click {guilabel}`Add a +switch` from the {guilabel}`Switches` dashboard, configure a {guilabel}`Name` for it, and click +{guilabel}`Save`. + +Then, toggle the desired switch to either {guilabel}`On` or {guilabel}`Off`, from the +{guilabel}`State` column on the {guilabel}`Switches` dashboard. + +This {guilabel}`On` / {guilabel}`Off` state automatically routes traffic in a dial plan, in which +this switch is set. + +The traffic travels to the {guilabel}`Active` route when {guilabel}`On` is toggled in the switch. +The call traffic travels to the {guilabel}`Inactive` route when {guilabel}`Off` is toggled in the +switch. + +Changes can be made on the fly, just be sure to click {guilabel}`Apply changes` to implement the +them. + +#### Add a switch to dial plan + +To add a {guilabel}`Switch` to a dial plan, navigate to [Axivox management console](https://manage.axivox.com), and click on {guilabel}`Dial plans` in the left menu. Then, click +{guilabel}`Visual Editor` next to the desired dial plan to open the {guilabel}`Dialplan Editor` +pop-up window. + +Then, from the {guilabel}`New element` drop-down menu, select {guilabel}`Switch`, and then click +{guilabel}`Add`. Double-click on the element to further configure the {guilabel}`Switch` element. + +```{image} dial_plan_advanced/switch.png +:align: center +:alt: Switch configuration in a dial plan, with inactive and active routes highlighted. +``` + +### Multi-switch + +A *Multi-Switch* element in Axivox is a switch where multiple paths can be configured, and switched +between. + +To configure and set a {guilabel}`Multi-Switch` element, navigate to [Axivox management console](https://manage.axivox.com). Then, click on the {guilabel}`Switches` menu item in the left menu. + +Toggle to the {guilabel}`Multi-switch` tab to create, or set, a pre-configured +{guilabel}`Multi-Switch` element. + +To create a new {guilabel}`Multi-Switch`, click {guilabel}`Create new`. Then, enter a +{guilabel}`Name` for the element, and then enter the {guilabel}`Available choice`. Enter one +{guilabel}`Available choice` per line. Do **not** duplicate any entries. + +Remember to click {guilabel}`Save` when done. + +To select the {guilabel}`State` of the {guilabel}`Multi-Switch`, click the drop-down menu next to +the {guilabel}`Multi-Switch` name, under the {guilabel}`Multi-switch` tab on the +{guilabel}`Switches` dashboard. + +The {guilabel}`State` chosen is the route that is followed in the dial plan. The {guilabel}`State` +can be edited on the fly, just be sure to click {guilabel}`Apply changes`. + +#### Add a multi-switch to dial plan + +To add a {guilabel}`Multi-Switch` element to a dial plan, navigate to [Axivox management console](https://manage.axivox.com), and click {guilabel}`Dial plans` in the left menu. + +Then, select or create a dial plan. Next, click {guilabel}`Visual Editor` on the desired dial plan. + +On the {guilabel}`Dialplan Editor` pop-up window that appears, click on the {guilabel}`New element` +drop-down menu, and select {guilabel}`Multi-Switch`. Then, click {guilabel}`Add`. Double-click on +the element to further configure the {guilabel}`Switch` element. + +```{image} dial_plan_advanced/multi-switch.png +:align: center +:alt: Multi-switch configuration in a dial plan, with chosen route highlighted. +``` + diff --git a/content/applications/productivity/voip/axivox/dial_plan_basics.md b/content/applications/productivity/voip/axivox/dial_plan_basics.md new file mode 100644 index 000000000..8e3aac660 --- /dev/null +++ b/content/applications/productivity/voip/axivox/dial_plan_basics.md @@ -0,0 +1,206 @@ +# Dial plan basics + +When someone calls a business, they might need to get in contact with customer support, a sales +team, or even a person's direct line. The caller might also be in search of some information about +the business, such as store hours. Or, they might want to leave a voicemail, so someone from the +company can call them back. With dial plans in Axivox, a company can manage how incoming calls like +this are handled. + +Using proper call architecture through a dial plan, callers get directed to the right people, or to +the right information, in a quick, efficient manner. + +This document covers the basic configuration of dial plans in Axivox. + +:::{seealso} +For more information on advanced dial plans, visit {doc}`dial_plan_advanced`. +::: + +:::{important} +Using a browser add-on for spelling may hinder the use of the visual editor in dial plans. Do not +use a translator with the Axivox management console. +::: + +(voip-axivox-dial-plans)= + +## Dial plans + +Access dial plans by navigating to [Axivox management console](https://manage.axivox.com), and +clicking on {guilabel}`Dial plans` from the menu on the left. + +To add a new dial plan from the {guilabel}`Dial plan` page, click the green button labeled, +{guilabel}`Add a new dial plan`. + +:::{note} +Axivox has no limit to the number of dial plans that can be created. These can be added, and +improved upon, at any time. This allows for sandboxes to be created with many different +configurations. +::: + +```{image} dial_plan_basics/dial-plan-edits.png +:align: center +:alt: Dial plan dashboard with the edit features and Add a dial plan button highlighted. +``` + +To edit an existing dial plan, choose one of the following options to the right of the saved dial +plan: + +1. {guilabel}`Delete`: this action deletes the attached dial plan. +2. {guilabel}`Edit`: this action allows the user to edit the dial plan. +3. {guilabel}`Visual Editor`: this action opens a visual editor window, where the dial plan + architecture can be viewed and edited. +4. {guilabel}`Duplicate`: this action duplicates the dial plan, and puts it at the bottom of the + list, with an extension of one number (+1) larger than the original extension. + +### Dialplan editor (visual editor) + +When the {guilabel}`Visual Editor` button is clicked for a dial plan on the {guilabel}`Dial plan` +page, a pop-up {guilabel}`Dialplan Editor` window appears. + +This pop-up window is the primary place where the architecture, or structure, of the dial plan is +configured. In this window, a {abbr}`GUI (graphical user interface)` appears, where various dial +plan elements can be configured and linked together. + +```{image} dial_plan_basics/dial-plan-visual.png +:align: center +:alt: |- +: Visual editor for an example dial plan, with the new element, Add, and Save buttons +: highlighted. +``` + +:::{important} +New dial plans come blank with {guilabel}`New element` options for the user to {guilabel}`Add` +and {guilabel}`Save`. + +The method for saving in the {guilabel}`Dialplan Editor` is different from saving any other edits +in the Axivox management console because the {guilabel}`Save` button **must** be pressed before +closing the {menuselection}`Visual editor`. + +Then, before these changes can take place on the Axivox platform, the user **must** click +{guilabel}`Apply changes` in the upper-right corner of the {guilabel}`Dial plan` page. +::: + +From the {guilabel}`Dialplan Editor` pop-up window, users can add a new element to the dial plan. To +do that, open the {guilabel}`New element` drop-down menu, and select the desired element. Then, +click {guilabel}`Add`. + +Doing so adds that element to the visual editor display of the dial plan being modified. This +element can be moved where desired amongst the other elements present in the dial plan. + +Connect elements in the dial plan by clicking and dragging outward from the {guilabel}`(open +circle)` icon on the right side of the element. Doing so reveals an {guilabel}`(arrow)` icon. +Proceed to drag this {guilabel}`(arrow)` icon to the desired element in the dial plan that it is +meant to connect with. + +Connect the {guilabel}`(arrow)` icon to the circle on the left side of the desired element. + +Calls displayed in the dial plan flow from left-to-right in the element. + +In order to further configure a {guilabel}`New element`, double-click on the element inside the dial +plan, to reveal a subsequent pop-up window, wherein additional customizations can be entered. + +Each element has a different configuration pop-up window that appears when double-clicked. + +:::{important} +All elements **must** have a final destination in the dial plan in order to close a loop. This +can be accomplished by implementing the {guilabel}`Hang up` element, or looping the element back +to a {guilabel}`Menu` element or {guilabel}`Digital Receptionist` element elsewhere in the dial +plan. + +```{image} dial_plan_basics/loop-back.png +:align: center +:alt: |- +: Dial plan, shown with highlight looping open end back to the beginning of the menu +: element. +``` +::: + +Once all desired dial plan elements and configurations are complete, remember to click +{guilabel}`Save` before exiting the {guilabel}`Dialplan Editor` pop-up window. Then, click +{guilabel}`Apply changes` on the {guilabel}`Dial plans` page to ensure they are implemented into +Axivox production. + +### Dial plan elements + +The following elements are available in the {guilabel}`New element` drop-down menu, while designing +a dial plan in the {guilabel}`Dialplan Editor` pop-up window. + +#### Basic elements + +These are the basic elements that are used in simple dial plans in Axivox: + +- {guilabel}`Call`: call an extension or queue. +- {guilabel}`Play a file`: play an audio file or voice greeting. +- {guilabel}`Voicemail`: forward to a voicemail (terminal). +- {guilabel}`Hang up`: hang up the call (terminal). +- {guilabel}`Queue`: attach a call queue with a group of users to answer a call. +- {guilabel}`Conference`: add a conference room for a caller to connect to. + +#### Basic routing elements + +Routing elements change or route the path of a caller, these are some basic routing elements used in +Axivox: + +- {guilabel}`Menu`: add a dial-by-number directory and configure downstream actions (not terminal). +- {guilabel}`Switch`: attach a manual on/off control that can divert traffic based on whether it is + opened (On) or closed (Off). +- {guilabel}`Digital Receptionist`: attach a virtual dispatcher to listen for extensions to connect + to. + +#### Advanced routing elements + +These are the more advanced elements that route calls in Axivox: + +- {guilabel}`Dispatcher`: create a call filter to route traffic based on the geo-location of the + caller ID. +- {guilabel}`Access List`: create a tailored access list with VIP customer preference. +- {guilabel}`Time Condition`: create time conditions to route incoming traffic around holidays, or + other sensitive time-frames. +- {guilabel}`Multi-Switch`: a mechanism to create paths, and turn them on and off, to divert + incoming calls. + +#### Advanced elements + +The following are more advanced elements (not routing) in Axivox: + +- {guilabel}`Record`: recording feature is enabled (requires plan change, enabled in Axivox + settings). +- {guilabel}`Caller ID`: replace the caller ID by the called number or free text. + +:::{important} +Dial plan elements can be configured by double-clicking them, and linking different aspects of +the Axivox console to them. +::: + +## Attach to incoming number + +To attach an existing dial plan to an incoming number, go to [Axivox management console](https://manage.axivox.com) , and click on {guilabel}`Incoming numbers`. + +Next, click {guilabel}`Edit` next to the number to which the dial plan should be attached. + +Doing so reveals a separate page wherein that number's dial plan can be modified. To do that, select +{guilabel}`Dial plan` from the {guilabel}`Destination type for voice call` field drop-down menu. +Then, choose the desired dial plan from the {guilabel}`Dial plan` field that appears. + +With that in place, that means when that specific number calls in, the configured dial plan is +activated, and runs through the prompts to properly route the caller. + +Finally, {guilabel}`Save` the changes, and click {guilabel}`Apply changes` in the upper-right +corner. + +### Basic dial plan scenario + +The following showcases a basic dial plan scenario for call routing, where additional elements can +be added to expand the setup. This basic dial plan scenario includes the following linked elements +{menuselection}`Start --> Play a file --> Menu --> (Hang-up, Calls, Queues, Conferences) --> +(Voicemail, Hang-up)`. + +```{image} dial_plan_basics/basic-scenario.png +:align: center +:alt: Basic dial plan configuration. +``` + +:::{seealso} +This setup does **not** include any basic or advanced call routing. For more information on call +routing, reference this documentation: {doc}`dial_plan_advanced`. +::: + diff --git a/content/applications/productivity/voip/axivox/dynamic_caller_id.md b/content/applications/productivity/voip/axivox/dynamic_caller_id.md new file mode 100644 index 000000000..a5132e853 --- /dev/null +++ b/content/applications/productivity/voip/axivox/dynamic_caller_id.md @@ -0,0 +1,114 @@ +# Dynamic caller ID + +*Caller ID* identifies the caller when they make a phone call. It allows the recipient of the call +to see what number the caller is calling from. Caller ID shows users and clients who is calling, so +they can choose to pick up or decline the call. + +Axivox offers a dynamic caller ID option to choose which number is displayed on outgoing calls. + +International numbers can be purchased to do business transactions internationally, via a phone +call, from a number that has an area code or country code of the destination being called. By +displaying a local number, this can increase customer engagement. + +Some companies have many employees making calls from a call center. These employees are not always +available to receive a return phone call from a prospective customer. In this case, {abbr}`VoIP +(Voice over Internet Protocol)` can be configured in such a way that dynamic caller ID shows the +main company phone number, so any number of employees in the group can answer the call. This way, a +call is never missed. + +(voip-axivox-dynamic-caller-id-default)= + +## Default outgoing number + +In Axivox a *default number* can be set. This is a company's main number. This means, when anyone +from the company (user/employee) calls a number outside the company, the default outgoing number +shows up automatically on the caller ID. + +If someone from outside the company tries to call back a user/employee, they are then funneled back +through the main line (default number). If there is a dial plan set up, they are prompted to make +selections. This is especially helpful in cases where employees change positions frequently, or if +they leave the company. + +:::{seealso} +- {doc}`dial_plan_basics` +- {doc}`dial_plan_advanced` +::: + +To access the default number, go to the [Axivox management console](https://manage.axivox.com), +and log in. Then, click into {guilabel}`Settings` in the left menu, and navigate to +{guilabel}`Default outgoing number`. + +From here, change the {guilabel}`Default outgoing number` by clicking the drop-down menu, and making +a selection from the incoming phone numbers available on Axivox. + +Be sure to {guilabel}`Save` the changes, then click {guilabel}`Apply changes` in the upper-right +corner of the {guilabel}`General Settings` page to implement the change. + +The {guilabel}`Default outgoing number` is what shows up by default in the Axivox management portal. +However, the outgoing number can also be configured differently at the user level. + +### Users + +To configure the outgoing number at the user level, log in to the [Axivox management console](https://manage.axivox.com). Next, click {guilabel}`Users` from the menu on the left, and then +click {guilabel}`Edit` to the right of the user that is to be configured. + +Under {guilabel}`Outgoing number`, click the drop-down menu to select either the {guilabel}`Default +outgoing number` (as specified here: {ref}`voip/axivox/dynamic-caller-id-default`), or any of the +incoming numbers on the Axivox account. + +Choosing the {guilabel}`Default` selection in the {guilabel}`Outgoing number` drop-down menu ensures +this user has the {guilabel}`Default outgoing number` shown on their caller ID when making calls. + +If a specific number is chosen, and that number is assigned to this user under {guilabel}`Incoming +numbers` (in the Axivox console's menu on the left), that means this user has a direct line for +customers to reach them. + +Once the desired changes are complete, be sure to click {guilabel}`Save`, then click +{guilabel}`Apply changes` in the upper-right corner to implement the change. + +:::{tip} +By default, when creating a new user in Axivox, the {guilabel}`Outgoing number` is automatically +set to {guilabel}`Default`. +::: + +### Advanced options + +To access the {guilabel}`Advanced options`, navigate to the {guilabel}`Settings` option in the menu +on the left of the [Axivox management console](https://manage.axivox.com). Then, click +{guilabel}`Advanced options` to the right of {guilabel}`Default outgoing number`. + +By default, there are not any advanced rules set. To create one, click the green {guilabel}`+ +(plus)` icon. Doing so reveals a line with two blank fields. From here, different caller IDs can be +set up, depending on what location the user/employee is calling from. + +To create a rule, first set the {guilabel}`Destination prefix` in the first empty field. This is the +country code, complete with zero(s) in front of it. Then, in the second empty field, select the +phone number that should be used for calling out from that country code. + +:::{important} +Check the box for {guilabel}`Apply advanced rules even for users with a default outgoing number +configured` to allow these rules to take precedent over all other outgoing configurations. +::: + +:::{tip} +The order of the rules can be modified by dragging-and-dropping them into another order. The +first matching rule is applied. +::: + +```{eval-rst} +.. example:: + For example, a company wants all users/employees to utilize the configured number for Great + Britain when calling from the `0044` country code (Great Britain). + + To accomplish that, simply type in `0044` into the :guilabel:`Destination prefix` field, and + select the number starting with the `+44` country code. Order the rules as necessary, and select + the checkbox to supersede all other rules, if needed. + + .. image:: dynamic_caller_id/advanced-callerid.png + :align: center + :alt: Advanced options for the default outgoing number. +``` + +Once the desired configurations are complete, be sure to click {guilabel}`Save`, then click +{guilabel}`Apply changes` in the upper-right corner to implement the change. + diff --git a/content/applications/productivity/voip/axivox/manage_users.md b/content/applications/productivity/voip/axivox/manage_users.md new file mode 100644 index 000000000..3631b6f6a --- /dev/null +++ b/content/applications/productivity/voip/axivox/manage_users.md @@ -0,0 +1,354 @@ +# Manage users in Axivox + +Managing Axivox {abbr}`VoIP (Voice over Internet Protocol)` users is an important part of setting up +{abbr}`VoIP (Voice over Internet Protocol)` in an Odoo database. Each Axivox user has a unique name, +phone number and/or extension, and a voicemail. This way, they can be reached in a variety of +convenient ways. + +Axivox users are organized in a simple, straightforward way in the Axivox console, so an +administrator can manage users quickly and easily. + +:::{note} +This documentation covers how to configure everything through a provider called, Axivox. +Depending on the chosen VoIP provider, the processes to manage users may be different. +::: + +## Overview + +Begin at the Axivox management console by navigating to [https://manage.axivox.com](https://manage.axivox.com). Log in with the appropriate administrator credentials. + +:::{note} +Actions in the Axivox management console **must** be double-saved, in order for the changes to +take effect. To save any changes, click {guilabel}`Save` in the individualized changes screen. +Then, to implement those changes, click the {guilabel}`Apply Changes` button in the upper-right +corner of the console. +::: + +(voip-axivox-incoming-number)= + +### Incoming numbers + +Incoming numbers are all the numbers a company is paying to use to receive calls. + +Click on {menuselection}`Incoming numbers` from the menu on the left of the Axivox management +console. Doing so reveals the {guilabel}`Incoming numbers` page, where all the incoming numbers are +listed, along with their {guilabel}`Destination` and SMS information. + +The {guilabel}`Destination` determines the action that is taken, or the path the caller follows when +dialing said numbers. + +To edit the {guilabel}`Destination`, click the {guilabel}`Edit` button to the far-right of the +incoming number line to be modified. Then, on the {guilabel}`Edit number` page that appears, the +{guilabel}`Destination type for voice call` can be changed. + +The options available in the {guilabel}`Destination type for voice call` drop-down menu are as +follows: + +- {guilabel}`Not configured` +- {guilabel}`Extension` +- {guilabel}`Dial plan` +- {guilabel}`Voicemail` +- {guilabel}`Hang up` +- {guilabel}`Conference` + +Depending on the selection made in the {guilabel}`Destination type for voice call` drop-down menu, a +second, selection-specific drop-down menu is populated with further configuration options. +Additionally, more fields are revealed, based on the selection made in the {guilabel}`Destination +type for voice call` drop-down menu. + +Once the desired configurations are complete, click {guilabel}`Save`, then click {guilabel}`Apply +changes` in the upper-right corner to implement them. + +## New users + +Every employee using {abbr}`VoIP (Voice over Internet Protocol)` at the company needs an Axivox user +account associated with them. + +To view existing users in the Axivox management console, click {guilabel}`Users` from the menu on +the left of the console. Every user has a {guilabel}`Number`, {guilabel}`Name`, option for a +{guilabel}`Voicemail`, and an {guilabel}`Outgoing number` specified. + +To create a new user in the Axivox console, click {guilabel}`Add a user` to reveal a {guilabel}`New +user` form. The following tabs are available for configuring the new user: + +- {guilabel}`General`: basic information, including the extension of the user, can be set. +- {guilabel}`Forwardings`: internal forwards on 'no answer' or busy signals. +- {guilabel}`Follow Me`: external forward configuration. +- {guilabel}`Keys`: set hot-keys within the {abbr}`VoIP (Voice over Internet Protocol)` system. +- {guilabel}`SIP Identifiers`: {abbr}`SIP (Session Initiation Protocol)` username and password for + external configuration. +- {guilabel}`Permissions`: set access rights for users in the Axivox management console. + +### General tab + +Under the {guilabel}`General` tab of the {guilabel}`New user` form, in the {guilabel}`Extension` +field, input an extension that is unique to the user. This is the number internal users dial to +reach a specific employee. + +In the {guilabel}`Name` field, input the employee name. + +Next, fill out the {guilabel}`Email address of the user` field. A valid email address for the +employee should be added here, where the user receives business emails. + +In the {guilabel}`GSM number` field, enter an alternative number at which the user can be reached. +Be sure to include the country code. + +:::{note} +A country code is a locator code that allows access to the desired country's phone system. The +country code is dialed first, prior to the target number. Each country in the world has its own +specific country code. + +For a list of comprehensive country codes, visit: [https://countrycode.org](https://countrycode.org). +::: + +```{image} manage_users/general-tab.png +:align: center +:alt: General tab layout in the Axivox management console. +``` + +In the {guilabel}`Voicemail` field, select either {guilabel}`Yes` or {guilabel}`No` from the +drop-down menu. + +In the {guilabel}`Directory` field, the administrator has the option to leave it blank, by making no +changes, or selecting {guilabel}`Default` from the drop-down menu. The {guilabel}`Directory` is used +in the *Digital Receptionist* feature element of a dial-plan. + +At the bottom of the {guilabel}`General` tab, there are two separate options with selection boxes. + +The first option is {guilabel}`This user can receive multiple calls at the same time`. By selecting +this option, users are able to receive calls when on another call. + +The second option, {guilabel}`This user must log-in to call`, provides the option to make it +mandatory for the user to log in. + +:::{note} +If a company uses physical VoIP phones on desks, and wants their employees to be able to log in +from *any* phone or desk in the office, they would make the selection for {guilabel}`This user +must log-in to call`. +::: + +Once the desired configurations are complete, click {guilabel}`Save`, then click {guilabel}`Apply +changes` in the upper-right corner. + +(voip-axivox-forwardings-tab)= + +### Forwardings tab + +Under the {guilabel}`Forwardings` tab of the {guilabel}`New user` form, a company can decide what +happens if someone calls a user, and the call is not answered. + +:::{important} +Forwardings are disabled when the {guilabel}`Follow Me` option is enabled. +::: + +For example, under the {guilabel}`Forwarding on no answer` field, when the button for {guilabel}`Add +a destination` is selected, the option to add a specific user or phone number is revealed. After +entering the {guilabel}`Destination`, a specific time frame can be selected by sliding the +{guilabel}`seconds bar` to the desired ring time. + +Additional {guilabel}`Destinations` can be added on with different ring times. + +:::{note} +Ring times can be staggered, so the call is forwarded to another user after the first user does +not pick up the call. The option to {guilabel}`Send to voicemail as a last resort` is available +to the administrator, should the {guilabel}`Destinations` not pick up. +::: + +Under the {guilabel}`Forwarding on busy` field, an administrator can {guilabel}`Add a destination`. +When clicked, they can then set the {guilabel}`Destination` (user) and time frame. Should the +original user's {abbr}`VoIP (Voice over Internet Protocol)` extension, or incoming number, be busy, +the call is forwarded to the destination(s). + +```{image} manage_users/forwardings-tab.png +:align: center +:alt: Manage forwarding calls to different users or phone numbers in the Forwardings +: tab. +``` + +When the desired configurations are complete, click {guilabel}`Save`, then click {guilabel}`Apply +changes` in the upper-right corner of the page. + +### Follow Me tab + +When the {guilabel}`Follow Me` option is selected, under the {guilabel}`Follow Me` tab of the +{guilabel}`New user` form, no {menuselection}`Forwardings` can be made. + +Also, when the {guilabel}`Follow Me` option is selected, the {guilabel}`Add a destination` button +can be selected to add users, or a destination phone number, to the original user's account. That +way, these added numbers ring when a call is received. + +After entering the {guilabel}`Destination`, a specific time frame can be made by sliding the +{guilabel}`seconds bar` to the desired ring time. Additional {guilabel}`Destinations` can be added +with different ring times. + +:::{note} +The original user's {abbr}`VoIP (Voice over Internet Protocol)` number does **not** ring with +this option selected. Ring times can also be staggered, so the call is forwarded to another user +after the first user does not pick up the call. +::: + +```{image} manage_users/follow-me-tab.png +:align: center +:alt: Ring destinations like different users or phone numbers from the Follow Me tab. +``` + +:::{important} +The Odoo mobile app, or another {abbr}`SIP (Session Initiation Protocol)` mobile client, allows +for simultaneous ringing of the user's extension or incoming number. For more information, visit +the {doc}`VoIP Mobile Integrations <../devices_integrations>` documentation. +::: + +Once all desired configurations are complete, click {guilabel}`Save`, then click {guilabel}`Apply +changes` in the upper-right corner. + +### Keys tab + +Under the {guilabel}`Keys` tab of the {guilabel}`New user` form, speed dial actions for the user can +be configured. Some more advanced options are available, as well. + +The following options are available to set to numerical values `1-20`. + +These actions can be set on each number: + +- {guilabel}`Not configured`: the default action, which is nothing. +- {guilabel}`BLF (Busy lamp fields)`: this action shows the status of other users' phones connected + to the Axivox phone system. This is primarily used on a desk-phone. +- {guilabel}`Quick Call`: this action allows for a speed-dial of an external number. +- {guilabel}`Line`: this action allows the user to call another user. +- {guilabel}`Switch`: this action allows the user to switch between calls from a desk-phone. +- {guilabel}`Pickup`: this action allows the user to pick up an incoming call from a desk-phone. + +```{image} manage_users/user-keys.png +:align: center +:alt: |- +: Manage user page with Keys tab highlighted and number 2 key drop-down menu selected (with +: highlight) +``` + +Once all the desired configurations are complete, click {guilabel}`Save`, then click +{guilabel}`Apply changes` in the upper-right corner. + +:::{important} +Many of the preceding options have secondary options available, as well, that can be used to link +a user, or external phone number. These **must** be filled out in conjunction with the initial +action. +::: + +:::{note} +The {guilabel}`Number of keys` field can be changed by entering in the desired numerical value in +the {guilabel}`Number of keys` field, located at the top of the {guilabel}`Keys` tab of the +{guilabel}`New user` form. +::: + +### SIP Identifiers tab + +*SIP*, which stands for Session Initiation Protocol telephony, allows one to make and receive calls +through an internet connection. The {guilabel}`SIP Identifiers` tab on the {guilabel}`New user` +form, contains credentials needed to configure Axivox users in Odoo and/or a different {abbr}`SIP +(Session Initiation Protocol)` mobile client. + +:::{seealso} +See the documentation on configuring Axivox, using the SIP identifiers: + +- {doc}`Use VoIP services in Odoo with Axivox ` +- {doc}`Axivox Mobile Integrations <../devices_integrations>` +::: + +Under the {guilabel}`SIP Identifiers` tab, the {guilabel}`SIP username` field represents the user's +information that was entered in the {guilabel}`Extension` field, under the {guilabel}`General` tab. + +The {guilabel}`Domain` field is assigned to the company by the Axivox representative. + +The value in the {guilabel}`SIP Password` field is unique for every Axivox user. This value is used +to sign into Axivox on Odoo, and for any mobile {abbr}`SIP (Session Initiation Protocol)` clients. + +```{image} manage_users/sip-identifiers-tab.png +:align: center +:alt: Important credentials used for external configurations of Axivox VoIP. +``` + +The value listed in the {guilabel}`Address of the proxy server` field is typically: +`pabx.axivox.com`, but is subject to change by Axivox, so be sure to check the {guilabel}`SIP +Identifiers` tab for the most accurate value. + +Once all desired configurations have been made, click {guilabel}`Save`, then click {guilabel}`Apply +changes` in the upper-right corner. + +### Permissions tab + +Under the {guilabel}`Permissions` tab of a {guilabel}`New user` form, a {guilabel}`Username` and +{guilabel}`Password` can be entered for the user. + +Beneath those fields, the following permissions can be granted to Axivox users for portal access: + +- {guilabel}`User portal access` +- {guilabel}`User management` +- {guilabel}`Administrator access` +- {guilabel}`Phone management` +- {guilabel}`User group management` +- {guilabel}`Phone number management` +- {guilabel}`Dial plan management` +- {guilabel}`Pickup group management` +- {guilabel}`Switch management` +- {guilabel}`Conference management` +- {guilabel}`Queue management` +- {guilabel}`Voicemail management` +- {guilabel}`Audio messages management` +- {guilabel}`Music on hold management` +- {guilabel}`Directory management` +- {guilabel}`Call list` +- {guilabel}`Connected user list` +- {guilabel}`Global settings` +- {guilabel}`Apply changes button` +- {guilabel}`Invoice download` +- {guilabel}`Invoice details` +- {guilabel}`Blacklist management` +- {guilabel}`Conference participant management` + +To access credentials for the Axivox user portal, navigate to the top of the +{menuselection}`Permissions` tab. Then, copy the {guilabel}`Username`, and enter the correct +{guilabel}`Password` for the individual user. There is a minimum of 8 characters for a user +password. + +:::{note} +These are the same permissions granted to the Axivox administrator that are listed in the menu on +the left in the Axivox management console. Should a selection state {guilabel}`No`, or +{guilabel}`No access`, then the menu option does **not** populate for the user. +::: + +Once all the desired configurations are complete, click {guilabel}`Save`, then click +{guilabel}`Apply changes` in the upper-right corner. + +Upon finishing the setup for a new user, an {ref}`voip/axivox/incoming_number` can be linked. + +```{image} manage_users/user-permissions.png +:align: center +:alt: |- +: Manage a user page, with the permissions tab highlighted, along with the first permission +: highlighted indicating a no selection. +``` + +(voip-axivox-user-groups)= + +## User groups + +A user group is a grouping of Axivox users that can be linked to a queue for call center +capability. + +To begin using user groups, navigate to [https://manage.axivox.com](https://manage.axivox.com). + +Then, log in with the appropriate administrator credentials. From the menu on the left of the Axivox +administrative panel, click into {guilabel}`User Groups`. + +To add a user group from the {guilabel}`User Groups` page, click {guilabel}`Add a group`. + +Next, name the group, by entering text into the {guilabel}`Name` field. Then, add a member to the +group by typing the first few letters of the user's name into the {guilabel}`Members` field. The +user populates in a drop-down menu below the field. Then, click on the desired user, and they are +added to the user group. + +Repeat this process to add more users to the group. + +Once all desired configurations are complete, click {guilabel}`Save`, then click {guilabel}`Apply +changes` in the upper-right corner. + diff --git a/content/applications/productivity/voip/axivox/vm_audio_messages.md b/content/applications/productivity/voip/axivox/vm_audio_messages.md new file mode 100644 index 000000000..1614a01a0 --- /dev/null +++ b/content/applications/productivity/voip/axivox/vm_audio_messages.md @@ -0,0 +1,263 @@ +# Voicemails and audio messages + +Managing voicemail is an important part of any business. A company needs to access their messages +with ease, and stay on top of any missed calls. Recording audio messages, like thanking a caller for +reaching out, or directing them to the right extension, is also a great way to personalize the +business interaction, and set the tone with the customer. + +This document covers the configuration of both voicemail and audio messages in the Axivox +administrative portal. + +(voip-axivox-global-language)= + +## Set global language + +To start using voicemails and audio messages with Axivox, the global language should be set in the +Axivox admin portal settings. To do that, navigate to [manage.axivox.com][axivox_admin]. After +logging into the portal, go to {menuselection}`Settings --> Global language (e.g.: voicemail +messages,...)`. + +From here, set the language to either: {guilabel}`Francais`, {guilabel}`English`, +{guilabel}`Espanol`, or {guilabel}`Deutsch`. + +Then, click {guilabel}`Save`, followed by {guilabel}`Apply changes` in the upper-right corner of the +{guilabel}`General Settings` page to implement the change into production. + +(voip-axivox-activate-voicemail)= + +## Activate voicemail + +In order for a user to utilize voicemail in Axivox, the voicemail feature **must** be turned on in +the Axivox administrative portal. To begin using voicemail with a user, navigate to +[manage.axivox.com][axivox_admin]. Then, log in with the appropriate administrator credentials. + +On the left menu of the Axivox administrative panel, click into {guilabel}`Users`. + +Then, click into the specific user the voicemail should be activated for. Under the section marked, +{guilabel}`Voicemail`, open the drop-down menu, and click on {guilabel}`Yes`. + +Lastly, {guilabel}`Save` the change, then click {guilabel}`Apply changes` in the upper-right corner +of the screen. + +## Voicemail + +The next step is to set up the individual voicemail boxes on the Axivox administrative portal. To +access the portal, visit [manage.axivox.com][axivox_admin] and log in. Then, navigate to +{menuselection}`Voicemails`, located in the menu on the left. + +If the voicemail option was activated in the user profile, using this process +{ref}`voip/axivox/activate_voicemail`, then a voicemail is automatically created on the +{guilabel}`Voicemails` page. + +:::{tip} +It should be noted that some of the administrative portal language is in French, as Axivox is a +Belgian company. The global language is still set to one of the four options as seen here: +{ref}`voip/axivox/global_language`. +::: + +### Manually create voicemail + +To manually create a new voicemail box, click {guilabel}`Add a voicemail` on the +{guilabel}`Voicemails` page. Or, edit an existing voicemail box, by clicking {guilabel}`Edit` to the +far-right of an existing voicemail box on the {guilabel}`Voicemails` page. + +```{eval-rst} +.. example:: + Suppose a sales or support team needs a general voicemail box. The voicemail would need to be + created manually, and attached to an incoming number. +``` + +The new, manually-created voicemail box should be attached to an incoming number, so it can receive +messages. To do so, navigate to {menuselection}`Incoming numbers`, located in the menu on the left. +Then, click {guilabel}`Edit` to the far-right of the specific number the voicemail should be linked +to. + +In the {guilabel}`Destination type for voice call` field, click the drop-down menu, and select +{guilabel}`Voicemail`. Then, open the drop-down menu on the next line labeled, +{guilabel}`Voicemail`, and select the manually-created voicemail box. + +:::{important} +If an incoming number is capable of receiving SMS/text messages, an additional field, +{guilabel}`Destination email address for Incoming SMS`, is present. + +To determine whether an incoming number is capable of receiving SMS/text messages, click +{guilabel}`Incoming numbers` from the menu on the left, then check the {guilabel}`SMS compatible` +column for the incoming number. +::: + +Then, if applicable, in the field labeled, {guilabel}`Destination email address for Incoming SMS`, +enter an email to which incoming text messages sent to the incoming number can be received. Some +incoming numbers (US +1) in Axivox are capable of receiving text messages from individuals and +automated numbers. + +Should this field be left empty, the default destination address is used, instead (as previously set +in the beginning of the process for manually creating a voicemail). + +Once all desired configurations are complete, click {guilabel}`Save`, then click {guilabel}`Apply +changes` in the upper-right corner of the screen to implement the change into production. + +### Notifications + +Now, whenever a voicemail is received on any of the automatically pre-configured or manually-linked +voicemail boxes, an email is sent to the user's email address, as listed in the +{guilabel}`Voicemails` page, or in the user's Axivox profile. + +This information can be accessed by navigating to {menuselection}`Users` in the left menu, and +clicking {guilabel}`Edit` next to the specific user in question. + +(voip-axivox-vm-forwarding)= + +## Forwarding to voicemail + +In Axivox, there are also numerous forwarding settings for a user. To access these forwarding +settings, go to [manage.axivox.com][axivox_admin] and log in. + +Next, navigate to {menuselection}`Users`, located in the menu on the left. + +From there, click into the specific user the forwarding should be added to. Then, open the +{guilabel}`Forwardings` tab. + +If the user is busy on another call, or away from the phone, there is an option present in this tab +to {guilabel}`Send to voicemail as a last resort`, located in the {guilabel}`Forwarding on no +answer` and {guilabel}`Forwarding on busy` fields. + +```{image} vm_audio_messages/forwardings.png +:align: center +:alt: Send to voicemail as a last resort options highlighted on the Forwardings tab +: of the user. +``` + +If the {guilabel}`Send to voicemail as a last resort` box is ticked, when the forwarding actions +stated in each section are not successful, the caller is routed to the voicemail set on the +particular user. + +:::{seealso} +For more information on forwarding and transfers, visit {ref}`voip/axivox/forwardings_tab`. +::: + +When all the desired configurations are complete, click {guilabel}`Save`, then click +{guilabel}`Apply changes` in the upper-right corner of the screen to implement the change. + +(voip-axivox-audio-messages)= + +## Audio messages + +It is possible to add audio messages *before* a customer's call is even taken, to inform them about +the waiting time for deliveries, the availability of a product, or any other important promotional +messages. + +To record an audio message in Axivox, navigate to [manage.axivox.com][axivox_admin] and log in. + +Next, click on {guilabel}`Audio messages` in the menu on the left. From the {guilabel}`Audio +messages` page, click {guilabel}`Add a message`. + +Type in a {guilabel}`Name`, and click {guilabel}`Save`. + +Upon clicking {guilabel}`Save`, the browser redirects back to the main {guilabel}`Audio messages` +page, where the newly-created message can be found on the list. + +There are two different ways to make the audio message. The user could either record the message +over the phone, or type the message (in text), and select a computer-generated speaker to read the +message. + +### Record audio message + +To record an audio message over the phone, click the orange button labeled, +{guilabel}`Record/Listen`, located to the right of the desired message on the list to record, on the +{guilabel}`Audio messages` page. + +When clicked, a {guilabel}`Record / listen to a message` pop-up window appears. From here, the +message is then recorded, via one of the extensions that is associated with the user. Under +{guilabel}`Extension to use for message management` field, click the drop-down menu, and select the +extension where Axivox should call to record the message. + +Then, click {guilabel}`OK` to begin the call. + +:::{note} +The user **must** be active in the production database with {abbr}`VoIP (Voice over Internet +Protocol)` configured. To configure {abbr}`VoIP (Voice over Internet Protocol)` for a user, see +this documentation: {doc}`axivox_config`. +::: + +Upon connecting to the Axivox audio recorder management line, a recorded French-speaking operator +provides the following options: + +1. Press `1` to record a message. +2. Press `2` to listen to the current message. + +Press either `1` or `2`, depending on whether or not there is already a message present in the +system for this particular audio message that requires a review, before recording a new one. + +Record the new audio message after pressing `1`, then press `#` to end the recording. + +The French-speaking operator returns to the line presenting the first set of questions again: + +1. Press `1` to record a message. +2. Press `2` to listen to the current message. + +Press `#` to end the call. + +### Write audio message + +To type the message, and select a computerized speaker to say the text, navigate to the +{menuselection}`Audio messages` in the menu on the left. + +From the {guilabel}`Audio messages` page, select the blue button labeled, {guilabel}`Text message`, +next to the corresponding audio message {guilabel}`Name` that the message should be attached to. + +Doing so reveals a {guilabel}`Convert text to message` pop-up window. + +From the {guilabel}`Convert to text message` pop-up window, click the drop-down menu next to the +field labeled, {guilabel}`Voice`, and select an option for the {guilabel}`Text` to be read in. + +After the {guilabel}`Voice` selection has been made, and the message has been written in the +{guilabel}`Text` field, click {guilabel}`Generate` to process the audio file. + +The text is read in the same language it is written in the {guilabel}`Text` field. Should the +language differ in the {guilabel}`Voice` field, then an accent is used by the computerized speaker. + +Finally, when these steps are complete, click {guilabel}`Save` to save the audio message. + +To implement the changes, click {guilabel}`Apply changes` in the upper-right corner of the screen. + +```{image} vm_audio_messages/sample-message.png +:align: center +:alt: Convert text to message window with voice, text, generate button and save highlighted. +``` + +:::{tip} +To set a greeting or audio message in a dial plan element double-click on the element. This could +be a {guilabel}`Play a file` element, or a {guilabel}`Menu` element, in which the caller should +encounter an urgent message, or a dial-by-number directory. + +For more information on dial plans see this documentation: {doc}`dial_plan_basics` or +{doc}`dial_plan_advanced`. +::: + +(voip-axivox-music-on-hold)= + +## Music on-hold + +Axivox has the option to add custom hold music to the call whenever a caller is waiting for their +call to be answered. To add hold music to the Axivox administrative portal, navigate to the +[manage.axivox.com][axivox_admin], and log in. + +Then, click on {guilabel}`Music on hold` from the menu on the left, and a {guilabel}`Change the +music on hold` pop-up window appears. + +On the {guilabel}`Change the music on hold` pop-up window, click the {guilabel}`Choose File` button +to select an MP3 (MPEG Audio Layer 3) or WAV (Waveform Audio File Format ) file to be uploaded. + +:::{note} +Only {abbr}`MP3 (MPEG Audio Layer 3)` or {abbr}`WAV (Waveform Audio File Format)` files can be +uploaded to the Axivox administrative portal. +::: + +Once the file is selected, the {guilabel}`Progression` bar shows an upload status. When this +activity completes, the window can be closed, by clicking {guilabel}`Close`. + +When the desired changes are complete, click {guilabel}`Apply changes` in the upper-right corner of +the screen. + +[axivox_admin]: https://manage.axivox.com/ + diff --git a/content/applications/productivity/voip/devices_integrations.md b/content/applications/productivity/voip/devices_integrations.md new file mode 100644 index 000000000..c9361149c --- /dev/null +++ b/content/applications/productivity/voip/devices_integrations.md @@ -0,0 +1,207 @@ +# Devices and integrations + +{abbr}`VoIP (Voice over Internet Protocol)` can be used on many different devices, such as a +computer, tablet, mobile phone, and many more. This is helpful in that it reduces costs, and +employees can work from anywhere in the world, so long as they have a broadband internet connection. + +Odoo *VoIP* is SIP (Session Initiation Protocol) compatible, which means it can be used with *any* +{abbr}`SIP (Session Initiation Protocol)` compatible application. + +This document covers the process of setting up Odoo *VoIP* across different devices and +integrations. + +Odoo is fully-integrated with all Odoo apps, allowing users to click into any app, and schedule a +call as an activity in the chatter. + +```{eval-rst} +.. example:: + For example, in the *CRM* app, a user can click into an opportunity, and click on + :guilabel:`Activities` in the chatter. + + Next, they can choose :guilabel:`Call`, and under :guilabel:`Due Date`, they can select a date. + + Once they click :guilabel:`Save`, an activity shows up in the chatter. + + Should the :guilabel:`Due Date` be for today's date, the activity shows up in the :abbr:`VoIP + (Voice over Internet Protocol)` widget. + + .. image:: devices_integrations/crm-voip-widget.png + :align: center + :alt: View of CRM leads and the option to schedule an activity for Odoo Discuss. +``` + +## Odoo VoIP (laptop/desktop computer) + +The Odoo *VoIP* (Voice over Internet Protocol) module and widget can be used from any browser on a +laptop or desktop device. Simply click on the {guilabel}`☎️ (phone)` icon in the upper-right corner, +while in the Odoo database, and the widget appears. + +:::{seealso} +To see how to use the {abbr}`VoIP (Voice over Internet Protocol)` widget on a desktop/laptop +computer, check out this documentation: {doc}`voip_widget`. +::: + +## Odoo VoIP (tablet/mobile device) + +The Odoo *VoIP* app can be used on tablets and mobile phones, through the Odoo Android or Apple IOS +applications. Additionally, a mobile web browser can be used to access the database. + +:::{warning} +Odoo Android and Apple IOS applications are no longer being maintained by Odoo on the Android and +Apple portals. This means Odoo support only handles limited scopes of Odoo Android or Apple IOS +support tickets. +::: + +:::{important} +While outgoing calls can be placed using Odoo on a mobile device, be aware that Odoo is **not** a +full {abbr}`VoIP (Voice over Internet Protocol)` application, and does **not** ring on incoming +calls. If the user needs to be reachable on a mobile device at all times, an app, like Zoiper, +should be used. Apps like that stay connected in the background at all times. + +For more information, see this documentation: {ref}`voip/zoiper`. +::: + +While in the mobile application on a mobile device/tablet, access the Odoo *VoIP* widget, by tapping +on the {guilabel}`☎️ (phone)` icon in the upper-right corner. The widget appears in the lower-left +corner. + +When first making a call from the tablet using the mobile application, the user is prompted to +{guilabel}`Allow` the database to use the microphone. Click {guilabel}`Allow` when prompted to +continue with the call using the microphone. + +This step is **necessary**, whether using the mobile Odoo application or web browser. + +```{image} devices_integrations/allow-mic.png +:align: center +:alt: Allow the database to access the microphone. +``` + +Odoo then asks how to make the call. The two options are : {guilabel}`VOIP` or {guilabel}`Phone` +(should the tablet be enabled for calling). Click the box next to {guilabel}`Remember ?` should this +decision be the default moving forward. + +```{image} devices_integrations/voip-phone.png +:align: center +:alt: Window prompt to choose whether to use VOIP or the devices phone to make the +: call. +``` + +Here is the layout of what the Odoo *VoIP* app looks like on a mobile device: + +```{image} devices_integrations/voip-odoo-dashboard.png +:align: center +:alt: Layout of what the VoIP app looks like on the a mobile device. +``` + +(voip-zoiper)= + +## Zoiper Lite + +*Zoiper Lite* is a free {abbr}`VoIP (Voice over Internet Protocol)` {abbr}`SIP (Session Initiation +Protocol)` dialer with voice and video. + +To start using the *Zoiper* app, download it to the device, via the [Zoiper download page](https://www.zoiper.com/en/voip-softphone/download/current). + +A mobile device is the most common installation, and this document covers how to set up on the +*Zoiper* IOS application. Screenshots and steps may differ depending on the set up conditions. + +After installing the *Zoiper* application on the mobile phone, open the application, and tap on +{guilabel}`Settings`. Navigate to {menuselection}`Accounts`, and tap on the {guilabel}`+ (plus)` +icon to add an account. + +If the {abbr}`VoIP (Voice over Internet Protocol)` account is already set up, then click +{guilabel}`Yes`. This means an account username and password has already been produced. + +```{image} devices_integrations/account-settings-zoiper-group.png +:align: center +:alt: Zoiper account setup, shown in the view from a mobile device. +``` + +Next, tap on {guilabel}`Select a provider`. On the screen that populates, tap {guilabel}`Country`, +in the upper-right corner, to narrow the providers down to a specific country. Choose the country +for the provider that is being configured, then find the {guilabel}`Provider`, and select it. + +```{eval-rst} +.. example:: + If the provider being configured is *Axivox*, then select :guilabel:`Belgium`. Then, choose + :guilabel:`Axivox` as the provider. +``` + +```{image} devices_integrations/provider-zoiper-odoo.png +:align: center +:alt: Zoiper account setup, choosing the provider. +``` + +Under {abbr}`SIP (Session Initiation Protocol)` options, enter the {guilabel}`Account name`, +{guilabel}`Domain`, {guilabel}`Username`, and {guilabel}`Password`. All this information varies, +based on the account. + +:::{tip} +To access this information, via the *Axivox* portal, navigate to {menuselection}`Users --> Choose +user --> Edit --> SIP Identifiers tab`. The {guilabel}`SIP username`, {guilabel}`Domain`, +{guilabel}`SIP password`, and {guilabel}`Address of the proxy server` are all present in this +tab. +::: + +```{eval-rst} +.. list-table:: + :header-rows: 1 + + * - Zoiper Field + - Axivox Field + * - Account name + - *Can be anything* + * - Domain + - Domain + * - Username + - SIP username + * - Password + - SIP password +``` + +Once this account information is entered, click the green {guilabel}`Register` button at the top of +the screen. Once the registration information is checked, *Zoiper* populates a message, stating +{guilabel}`Registration Status: OK`. + +At this point, *Zoiper* is now set up to make phone calls using the {abbr}`VoIP (Voice over Internet +Protocol)` service. + +```{image} devices_integrations/sip-options-zoiper.png +:align: center +:alt: Zoiper account setup, registration successful. +``` + +## Linphone + +*Linphone* is an open-source {abbr}`VoIP (Voice over Internet Protocol)` {abbr}`SIP (Session +Initiation Protocol)` softphone, used for voice, video, messaging (group and individual), as well as +conference calls. + +To start using the *Linphone* app, download it to the device, via the [Linphone download page](https://new.linphone.org/technical-corner/linphone?qt-technical_corner=2#qt-technical_corner). + +A mobile device is the most common installation, and this document covers how to set up the +*Linphone* IOS application. Screenshots and steps may differ depending on the circumstances. + +To begin configuring *Linphone* for use with a {abbr}`SIP (Session Initiation Protocol)` provider, +first open *Linphone*, and an assistant screen appears. + +From this screen, select {guilabel}`Use SIP Account`. Then, on the following screen, enter the +{guilabel}`Username`, {guilabel}`Password`, {guilabel}`Domain`, and {guilabel}`Display Name`. Once +complete, press {guilabel}`Login`. + +At this point, *Linphone* is ready to start making calls, once there is a green button at the top of +the application screen that reads, {guilabel}`Connected`. + +```{image} devices_integrations/linphone-odoo-setup.png +:align: center +:alt: Linphone account setup, registration successful. +``` + +:::{tip} +*Linphone* makes a variety of applications for mobile and desktop devices in operating systems, +such as Windows, Linux, Apple, and Android. Because *Linphone* is an open-source project, many +new updates are released on a regular basis. + +See [Linphone's wiki-documentation page](https://wiki.linphone.org/xwiki/wiki/public/view/Linphone/). +::: + diff --git a/content/applications/productivity/voip/onsip.md b/content/applications/productivity/voip/onsip.md new file mode 100644 index 000000000..648b94e72 --- /dev/null +++ b/content/applications/productivity/voip/onsip.md @@ -0,0 +1,166 @@ +# Use VoIP services in Odoo with OnSIP + +:::{important} +OnSIP {abbr}`VoIP (voice over internet protocol)` services are only available in the **United +States** (US). OnSIP {abbr}`VoIP (voice over internet protocol)` services are widely available in +the lower-48, contiguous United States. In Alaska or Hawaii, charges for service can be higher. + +Additionally, a {abbr}`US (United States)` billing address, and {abbr}`US (United States)` credit +card are required to use the service. + +Before setting up an account with OnSIP, the business will need to make sure the business +telephone numbers are portable to OnSIP. + +OnSIP makes every attempt to work with all telephone service providers. However, certain local or +regional guidelines may preclude the company's current provider from releasing the number. +::: + +## Introduction + +Odoo *VoIP* can be set up to work together with [OnSIP (Odoo Landing Page)](https://info.onsip.com/odoo/). OnSIP is a VoIP provider. An account is needed with OnSIP in order +to use this service. + +Before setting up an account with OnSIP, make sure the company's home area, and the areas that will +be called, are covered by OnSIP services. + +After opening an OnSIP account, follow the configuration procedure below to configure it on an Odoo +database. + +## Configuration + +To configure the Odoo database to connect to OnSIP services, first navigate to the +{menuselection}`Apps application` from the main Odoo dashboard. Then, remove the default `Apps` +filter from the {guilabel}`Search...` bar, and search for `OnSIP`. + +Next, activate the {guilabel}`VOIP OnSIP` module. + +```{image} onsip/install-onsip.png +:align: center +:alt: View of OnSIP app in the app search results. +``` + +### Odoo VoIP setting + +After installing the *VOIP OnSIP* module, go to the {menuselection}`Settings app`, scroll down to +the {guilabel}`Integrations` section, and locate the {guilabel}`VoIP` fields. Then, proceed to fill +in those three fields with the following information: + +- {guilabel}`OnSIP Domain`: the domain that was assigned when creating an account on [OnSIP](https://www.onsip.com/). +- {guilabel}`WebSocket`: `wss://edge.sip.onsip.com` +- {guilabel}`VoIP Environment`: {guilabel}`Production` + +```{image} onsip/voip-setting.png +:align: center +:alt: VoIP configuration settings in Odoo Settings app. +``` + +:::{tip} +To access the OnSIP domain, navigate to [OnSIP](https://www.onsip.com/) and log in. Then, click +the {guilabel}`Administrators` link in the top-right of the page. + +Next, in the left menu, click {guilabel}`Users`, and then select any user. By default, the +selected user opens on the {guilabel}`User Info` tab. + +Click on the {guilabel}`Phone Settings` tab to reveal OnSIP configuration credentials (first +column). + +```{image} onsip/domain-setting.png +:align: center +:alt: |- +: Domain setting revealed (highlighted) on administrative panel of OnSIP management +: console. +``` +::: + +### Odoo user setting + +Next, the user needs to be set up in Odoo. Every user associated with an OnSIP user **must** also be +configured in the Odoo user's settings/preferences. + +To do that, navigate to {menuselection}`Settings app --> Manage Users --> Select the User`. + +On the user form, click {guilabel}`Edit` to configure the user's OnSIP account. Then, click the +{guilabel}`Preferences` tab, and scroll to the {guilabel}`VoIP Configuration` section. + +In this section, fill in the fields with OnSIP credentials. + +Fill in the following fields with the associated credentials listed below: + +- {guilabel}`Voip Username` = OnSIP {guilabel}`Username` +- {guilabel}`OnSIP Auth Username` = OnSIP {guilabel}`Auth Username` +- {guilabel}`VoIP Secret` = OnSIP {guilabel}`SIP Password` + +:::{tip} +The OnSIP extension can be found in the *User* banner line above the tabs. +::: + +When these steps are complete, navigate away from the user form in Odoo to save the configurations. + +Once saved, Odoo users can make phone calls by clicking the {guilabel}`☎️ (phone)` icon in the +top-right corner of Odoo. + +:::{seealso} +Additional setup and troubleshooting steps can be found on [OnSIP's knowledge base](https://support.onsip.com/hc/en-us). +::: + +### Incoming calls + +The Odoo database also receives incoming calls that produce pop-up windows in Odoo. When those call +pop-up windows appear, click the green {guilabel}`📞 (phone)` icon to answer the call. + +To ignore the call, click the red {guilabel}`📞 (phone)` icon. + +```{image} onsip/incoming-call.png +:align: center +:alt: Incoming call shown in the Odoo VoIP widget. +``` + +:::{seealso} +{doc}`voip_widget` +::: + +### Troubleshooting + +#### Missing parameters + +If a *Missing Parameters* message appears in the Odoo widget, make sure to refresh the Odoo browser +window (or tab), and try again. + +```{image} onsip/onsip04.png +:align: center +:alt: Missing parameter message in the Odoo VoIP widget. +``` + +#### Incorrect number + +If an *Incorrect Number* message appears in the Odoo widget, make sure to use the international +format for the number. This means leading with the international country code. + +A country code is a locator code that allows access to the desired country's phone system. The +country code is dialed first, prior to the target number. Each country in the world has its own +specific country code. + +For example, `16505555555` (where `1` is the international prefix for the United States). + +```{image} onsip/onsip05.png +:align: center +:alt: Incorrect number message populated in the Odoo VoIP widget. +``` + +:::{seealso} +For a list of comprehensive country codes, visit: [https://countrycode.org](https://countrycode.org). +::: + +## OnSIP on mobile phone + +In order to make and receive phone calls when the user is not in front of Odoo on their computer, a +softphone app on a mobile phone can be used in parallel with Odoo *VoIP*. + +This is useful for convenient, on-the-go calls, and to make sure incoming calls are heard. Any SIP +softphone will work. + +:::{seealso} +- {doc}`devices_integrations` +- [OnSIP App Download](https://www.onsip.com/app/download) +::: + diff --git a/content/applications/productivity/voip/transfer_forward.md b/content/applications/productivity/voip/transfer_forward.md new file mode 100644 index 000000000..dd96bf9f9 --- /dev/null +++ b/content/applications/productivity/voip/transfer_forward.md @@ -0,0 +1,154 @@ +# Make, receive, transfer, and forward calls + +Calling prospective clients, customers, or colleagues is an essential part of any business. A +company also needs to be available when customers call, in order to build trust and make +connections. + +This document covers how to make, receive, transfer, and forward calls with Odoo *VoIP*. + +## Make calls + +Starting on the Odoo dashboard, a call can be made by opening the phone widget in the the +upper-right corner, which is represented by a {guilabel}`☎️ (phone)` icon. + +Then, a user can click on the {guilabel}`Contacts` tab, and click into any contact in the database +to make a call. + +Additionally, one can also use the {guilabel}`Search bar` in the {guilabel}`VOIP` pop-up window to +find any desired contact. + +```{image} transfer_forward/widget-operation.png +:align: center +:alt: Using the VoIP phone widget to make calls. +``` + +To manually make a call, click the {guilabel}`⌨️ (keyboard)` icon, and proceed to manually key in +the desired number. Do not forget to lead with the {guilabel}`+ (plus)` icon, followed by the +international country code. + +```{eval-rst} +.. example:: + For the United States of America, the country code and :guilabel:`+ (plus)` icon, would look like + this: `+1`. If one were to dial Belgium, the number would be prefixed by `+32`, and for Great + Britain it would be `+44`. +``` + +After entering the full number, with the required {guilabel}`+ (plus)` icon prefix and country code, +click the green {guilabel}`📞 (phone)` icon to start the call. When finished, click the red +{guilabel}`📞 (phone)` icon to end the call. + +```{image} transfer_forward/manual-call.png +:align: center +:alt: Using the VoIP phone widget to make calls. +``` + +## Receive calls + +An incoming call automatically opens the *VoIP* widget, when a user is using the Odoo database. +Should the database be open in another tab, a sound plays (the sound **must** be activated on the +device). + +Once back to the tab, the calling screen of the *VoIP* phone widget appears. + +Click the green {guilabel}`📞 (phone)` icon to pick up the call, or the red {guilabel}`📞 (phone)` +icon to reject the call. + +```{image} transfer_forward/incoming-call.png +:align: center +:alt: Incoming call on the VoIP widget, with the call answer and call reject buttons +: highlighted. +``` + +## Add to call queue + +All the contacts and customers that need to be called can be seen in one place with the Odoo *VoIP* +phone widget, under the {guilabel}`Next activities` tab. + +```{image} transfer_forward/next-activities.png +:align: center +:alt: VoIP widget with next activities highlighted, showing tasks below. +``` + +To add a call to the {guilabel}`Next activities` tab, click the green {guilabel}`📞 (phone)` icon, +while in kanban view of the *CRM* application. + +To remove them from the call queue, hover over the opportunity that has a call scheduled, and click +the red {guilabel}`📞 (phone)` icon that appears with the {guilabel}`- (minus)` icon. + +When navigating back to the *VoIP* phone widget, **only** the calls that are scheduled immediately +for that day appear in the queue under the {guilabel}`Next Activities` tab of the *VoIP* pop-up +widget. + +```{image} transfer_forward/add-call-queue.png +:align: center +:alt: Adding a call to the next activities tab in the VoIP phone widget. +``` + +The {guilabel}`Next Activities` tab of the *VoIP* phone widget is integrated with the following Odoo +apps: *CRM*, *Project*, and *Helpdesk*. + +A call can be added in the chatter of records within those applications. + +To manually add a call, via the chatter, click {guilabel}`Activities` (next to the {guilabel}`🕗 +(clock)` icon). Under {guilabel}`Activity Type`, select {guilabel}`Call` from the drop-down menu +that appears. + +Next, set a {guilabel}`Due Date`, and add a {guilabel}`Summary`. + +Lastly, change the {guilabel}`Assigned to` field to the person that should make the call. Whomever +is set in this last field ({guilabel}`Assigned to`) has this call show up in their {guilabel}`Next +Activities` call queue in the Odoo *VoIP* phone widget. + +:::{important} +Only calls for the immediate day (today's date) appear in the {guilabel}`Next Activities` tab of +the *VoIP* phone widget for that specific user. +::: + +If specified, click {guilabel}`Save` or {guilabel}`Open Calendar` to complete the scheduling of the +call. + +## Transfer calls + +A call can be transferred from one user to another in the Odoo *VoIP* phone widget. However, this +can **only** occur after speaking to the caller first. Without picking up the call in the Odoo +*VoIP* phone widget, the only way to transfer a call is automatically though the provider +console/portal. + +:::{seealso} +For more information on transfers, visit {ref}`voip/axivox/forwardings_tab`. +::: + +To transfer a call within the Odoo *VoIP* phone widget, first, answer the call using the green +{guilabel}`📞 (phone)` icon. + +Once the incoming call is answered, click the {guilabel}`↔ (left-right arrow)` icon. Then, enter the +extension of the user the call should be forwarded to. Finally, click {guilabel}`Transfer` to route +the call to that phone number. + +:::{tip} +To find the extension for a user, consult the {abbr}`VoIP (Voice over Internet Protocol)` +administrator, or, if the user has *Settings* access rights to *Administration*, navigate to +{menuselection}`Settings App --> Manage Users --> Select the user --> Preferences --> VOIP --> +VoIP username / Extension number`. + +For more information on access rights, visit: {doc}`/applications/general/users/access_rights`. +::: + +```{image} transfer_forward/transfer.png +:align: center +:alt: Transferring a call within the phone widget, with the transfer buttons highlighted. +``` + +## Forward calls + +To forward a call within the Odoo *VoIP* phone widget, first, answer the call using the green +{guilabel}`📞 (phone)` icon. Once the incoming call is answered, click the {guilabel}`↔ (left-right +arrow)` icon. + +Then, enter the full phone number of the user the call should be forwarded to. Finally, click +{guilabel}`Transfer` to route the call to that phone number. + +:::{seealso} +For more information on forwarding, visit {ref}`voip/axivox/forwardings_tab`. +::: + diff --git a/content/applications/productivity/voip/voip_widget.md b/content/applications/productivity/voip/voip_widget.md new file mode 100644 index 000000000..9ef1c57a7 --- /dev/null +++ b/content/applications/productivity/voip/voip_widget.md @@ -0,0 +1,111 @@ +# VoIP widget + +The *VoIP* widget is an add-on made available to Odoo users through the *VoIP* module. It is used to +incorporate virtual telephony into the database. The widget is the control center for making and +managing calls in Odoo. + +## Phone calls + +To make phone calls while in the Odoo database, click the {guilabel}`☎️ (phone)` icon, located in +the top navigation bar. + +When clicked, a {guilabel}`VOIP` pop-up widget appears in the lower-left corner of the Odoo +database. The widget allows users to freely navigate throughout the database, while making and +receiving calls. + +When receiving calls in Odoo, the {guilabel}`VOIP` widget rings,and displays a notification. To +close the widget, click the {guilabel}`X (close)` icon in the upper-right of the widget's screen. + +:::{note} +The {abbr}`VoIP (Voice over Internet Protocol)` number is the one provided by Axivox. It can be +accessed by navigating to [https://manage.axivox.com/](https://manage.axivox.com/). After +logging into the portal, go to {menuselection}`Users --> Outgoing number` (column). +::: + +```{image} voip_widget/call.png +:align: center +:alt: VoIP call in Odoo. +``` + +## Troubleshooting + +:::{tip} +If a *Missing Parameter* error message appears in the Odoo *VoIP* widget, refresh the Odoo +window, and try again. + +```{image} voip_widget/missing-parameter.png +:align: center +:alt: '"Missing Parameter" error message in the Odoo softphone.' +``` +::: + +:::{tip} +If an *Incorrect Number* error message appears in the Odoo *VoIP* widget, make sure to use the +international format, leading with the {guilabel}`+ (plus)` sign, followed by the international +country code. + +(E.g., +16506913277, where `+1` is the international prefix for the United States.) + +```{image} voip_widget/incorrect-number.png +:align: center +:alt: '"Incorrect Number" error message in the Odoo softphone.' +``` +::: + +## Tabs + +In all, there are three tabs ({guilabel}`Recent`, {guilabel}`Next Activities`, and +{guilabel}`Contacts`) present in the *VoIP* widget, which are used for managing calls and day-to-day +activities in Odoo. + +### Recent + +Under the {guilabel}`Recent` tab of the *VoIP* widget, the call history for the user is available. +This includes incoming and outgoing calls. Any number can be clicked to begin a call. + +### Next activities + +Under the {guilabel}`Next Activities` tab of the *VoIP* widget, a user can see any activities +assigned to them, and which ones are due to be completed for the day. + +Click an activity from this tab to perform any actions including: Sending an email, accessing their +contact, scheduling another activity, or accessing a linked record (such as a Sales Order, +Lead/Opportunity, or Project Task). + +The user can also mark the activity as complete, edit the details of the activity, or cancel it. + +To call the customer related to a scheduled activity, click the {guilabel}`📞 (phone)` icon, or +click the {guilabel}`⌨️ (keyboard)` icon to dial another number for the customer. + +```{image} voip_widget/activity-widget.png +:align: center +:alt: Activity control center on the VoIP widget. +``` + +Some other icons appear in the *VoIP* widget, categorized by two sections: {guilabel}`Document` and +{guilabel}`Activity`. + +Under the {guilabel}`Document` section, from right to left: + +- {guilabel}`✉️ (envelope)` icon: sends an email +- {guilabel}`👤 (person icon)` icon: redirects to the contact card +- {guilabel}`📄 (document)` icon: redirects to the attached record in Odoo +- {guilabel}`🕓 (clock)` icon: schedule an activity + +Under the {guilabel}`Activity` section, from left to right: + +- {guilabel}`✔️ (checkmark)` icon: mark activity as done +- {guilabel}`✏️ (pencil)` icon: edit the activity +- {guilabel}`✖️ (cancel)` icon: cancel the activity + +### Contacts + +Under the {guilabel}`Contacts` tab of the *VoIP* widget, a user can access a contact in the +*Contacts* app. + +Any contact can easily be called by clicking into the contact from the *VoIP* widget's +{guilabel}`Contacts` tab. + +A search feature is also available in the upper-right side of the widget, represented by a +{guilabel}`🔍 (magnifying glass)` icon. + diff --git a/content/applications/productivity/whatsapp.md b/content/applications/productivity/whatsapp.md new file mode 100644 index 000000000..db864b6fc --- /dev/null +++ b/content/applications/productivity/whatsapp.md @@ -0,0 +1,918 @@ +# WhatsApp + +**WhatsApp** is an instant messaging and voice-over-IP app that allows users to send messages, make +calls, and share content. Businesses can use [WhatsApp Business](https://developers.facebook.com/products/whatsapp/) to communicate with their customers by text, +send documents and provide support. + +:::{warning} +WhatsApp is an Odoo Enterprise-only application that does not work in Odoo Community edition. To +sign up for Odoo Enterprise edition, click here: [Odoo Free Trial](https://www.odoo.com/trial). +::: + +:::{seealso} +For more information on migrating from Odoo Community version to Odoo Enterprise version see this +documentation: {doc}`/administration/on_premise/community_to_enterprise`. +::: + +With the **Odoo WhatsApp** app, a company can connect a WhatsApp Business Account (WABA) to an Odoo +database, which allows for the following: + +- Receive and reply to WhatsApp messages directly from an Odoo database + +- Create new templates with dynamic placeholders/variables + +- Send pre-approved templates that use dynamic variables, such as: + + - Quotations from the Sales app + - Receipts and invoices from the Point of Sale app + - Tickets from the Events app + +:::{seealso} +- [Meta Business: create message templates for the WhatsApp Business account](https://www.facebook.com/business/help/2055875911147364). +- [Meta Business: connect a phone number to the WhatsApp Business account](https://www.facebook.com/business/help/456220311516626). +- [Meta Business: change the WhatsApp Business display name](https://www.facebook.com/business/help/378834799515077). +::: + +WhatsApp is a messaging service operated by Meta, which is the parent company of Facebook. WhatsApp +is commonly used as a communication tool in many countries and by many businesses. This +documentation will cover the integration of a WhatsApp Business Account with Odoo. The company's +Meta account is configured in Odoo via an {abbr}`API (Application Programming Interface)` +connection. + +The WhatsApp connector supports two flows: company initiated, and customer initiated. A company can +initiate a discussion by sending a template to one or more people. Once the template is sent, the +recipient can answer in order to trigger a discussion between the sender and the receiver (a +*Discuss* chat window will pop up if the customer answers within 15 days). + +If the discussion is initiated by the client (e.g. by sending to the company's public WhatsApp +number), then Odoo will open a group chat with all operators responsible for this WhatsApp channel. + +:::{tip} +It is recommended to set up multiple WhatsApp accounts for different departments. For example, +the help desk team and sales teams can chat on different channels. +::: + +## WhatsApp configuration in a Meta + +A WhatsApp integration with Odoo uses a standard {abbr}`API (Application Programming Interface)` +connection, and is configured on Meta in the following steps: + +1. Create a Meta business account +2. Create a Meta developer account +3. Setup an *app* and WhatsApp *product* on Meta's developer console +4. Test the API connection. + +Once connected, messages are then sent and received through Odoo's *Discuss* application using the +WhatsApp {abbr}`API (Application Programming Interface)`. + +### Meta business account setup + +To create a Business account with Meta (owner of Facebook) navigate to: [Facebook Business Manager](https://business.facebook.com/overview). Begin by clicking {guilabel}`Create account` and then +enter the business name, the administrator's name, and a work email address. Then click +{guilabel}`Next`, and a pop-up window will appear prompting to confirm the email address. After +confirming, click {guilabel}`Done` to close the window. + +Next, follow the instructions in the email sent by Facebook to confirm the creation of the business +account and to complete the setup process. + +:::{seealso} +[Set up a Meta business account](https://www.facebook.com/business/help/1710077379203657?id=180505742745347). +::: + +:::{important} +If the business account is linked to a personal Facebook account then the administrator must +toggle between the personal account to the business account for the remainder of the +configuration. + +To toggle to the business account navigate to the [Facebook Developer Console](https://developers.facebook.com) and click on the *account name* in the upper right corner. +Under the {guilabel}`Business Accounts` heading, click on the desired business that the WhatsApp +configuration should take place in. This will be the account for which Odoo will send and receive +WhatsApp messages. + +```{image} whatsapp/toggle.png +:align: center +:alt: Toggle between Meta personal and business accounts. +``` +::: + +:::{important} +In order to create a Meta business account, the user must already have a personal Facebook +account that has existed for a minimum of one hour prior to setting up the Facebook Business +account. Trying to create the business account prior to this time will result in an error. +::: + +### App creation + +On the [Meta for Developers](https://developers.facebook.com) dashboard, sign in with the Meta +developer account. If no account is configured yet, link a Facebook account to create a Meta +developer account. + +:::{note} +A Facebook *developer* account is different than a Facebook *business* account. While developer +accounts are made up of personal Facebook accounts, business accounts are **not** as they +represent a business and manage all of the business's assets in Meta, such as apps. +::: + +:::{seealso} +[Set up the WhatsApp Business Platform](https://www.facebookblueprint.com/student/collection/409587/path/360218). +::: + +Click on {guilabel}`My Apps` in the top right corner after successfully signing in to the Meta +developer account. This will redirect the administrator to all the apps the developer has configured +in this specific developer account. Click on {guilabel}`Create App` to begin the process of +configuring a new Meta application. + +### App type + +On the {menuselection}`Create an app` page, select {guilabel}`Other` under the section labeled, +{guilabel}`Looking for something else?`, and then click {guilabel}`Next` to be directed to another +page in order to select the app type. Then, click on the first option listed under the +{guilabel}`Select an app type` label, titled {guilabel}`Business`. This selection allows for the +creation and management of the WhatsApp {abbr}`API (Application Programming Interface)`. + +Now, click {guilabel}`Next` to configure the app, as desired. When the app *type* has been +configured, the administrator will move onto the app *details* section. + +### App details + +On the {guilabel}`Details` section of the {guilabel}`Create an app` process, enter `Odoo` in the +field under the {guilabel}`Add an app name` label. + +:::{note} +The app name can be changed at a later time in the settings, if necessary. +::: + +:::{warning} +Trademarks and branded elements may not be used in this text section. These include the Meta +group of companies. Do not include the word: `WhatsApp` or the system will flag this in error. +::: + +Next, enter the developer email address in the field under the {guilabel}`App contact email` label. + +Lastly, set the {guilabel}`Business Account - Optional` field to the Meta business account profile, +using the drop-down menu. To finish, click {guilabel}`Create app`. This action will create the app +and prompts the *Meta Platform Terms* and *Developer Policies* agreements. + +To accept the agreements, enter the Facebook password for security purposes, and click +{guilabel}`Submit` to finalize the app creation. The browser will then direct to the {guilabel}`Meta +for Developers` dashboard. + +:::{note} +If the Meta business account is prohibited from advertising, claiming an app won't be allowed. To +resolve this issue navigate to [https://business.facebook.com/business](https://business.facebook.com/business) for assistance. + +For more information, see [Meta's documentation on advertising restrictions](https://www.facebook.com/business/help/975570072950669). +::: + +### Add a WhatsApp product to the app + +Now that the basic structure of the app has been created, a product will need to be added to the +app. Begin by accessing the Meta app dashboard by navigating to +[https://developers.facebook.com/apps](https://developers.facebook.com/apps), and clicking on the app that is being configured. + +On the next page: since WhatsApp will be used, click {guilabel}`Set up` next to the box containing +WhatsApp, located towards the bottom of the page. + +:::{seealso} +[Meta's WhatsApp developer documentation](https://developers.facebook.com/docs/whatsapp/). +::: + +The page then directs to the configuration page for the {guilabel}`WhatsApp Business Platform API`. +Use the drop-down menu to select the Meta business to be configured for the {guilabel}`Select a Meta +Business Account` option, and then click {guilabel}`Continue` to confirm the selection. + +:::{note} +When {guilabel}`Continue` is clicked, the administrator agrees to Meta's terms and conditions as +linked on the {guilabel}`Meta App Dashboard`. +::: + +:::{note} +Once the WhatsApp product is added to the app, Meta will provide a WhatsApp test phone number +with 5 test messages. +::: + +### Start using the WhatsApp API + +After finishing the previous WhatsApp product wizard, and clicking {guilabel}`Continue`, the browser +should have directed to the WhatsApp {guilabel}`Quickstart` page; this {guilabel}`Quickstart` page +is where to begin configuring the WhatsApp API by adding a phone number and then sending an initial +test message. + +```{image} whatsapp/quickstart.png +:align: center +:alt: Navigating to the WhatsApp quickstart wizard in Meta for Developer dashboard. +``` + +:::{note} +If the browser isn't on the {guilabel}`Quickstart` page for WhatsApp, navigate to +[https://developers.facebook.com/apps](https://developers.facebook.com/apps) 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 +following options: + +- {guilabel}`Quickstart` +- {guilabel}`API Setup` +- {guilabel}`Configuration` + +Click the {guilabel}`Quickstart` option, and then click {guilabel}`Start using the API`. +::: + +#### API Setup + +After clicking on {guilabel}`Start using the API`, the page navigates to the {guilabel}`API Setup`. +Now that the test number has been created, a test message can be sent to confirm that WhatsApp is +working properly. To begin, navigate to the section on the page labeled {guilabel}`Send and receive +messages` and click the drop-down menu next to {guilabel}`To`, under {guilabel}`Step 1 Select phone +numbers`. + +Now, select the only option available: {guilabel}`Manage phone number list`. Follow the steps and +add up to five numbers to send the free test messages to. After entering the appropriate country +code and phone number, click on {guilabel}`Next`. + +:::{important} +Adding a phone number to send to in this step will allow for a successful test to be sent by the +terminal. This is critical to ensure the WhatsApp {abbr}`API (Application Programming Interface)` +is working. +::: + +A verification code from WhatsApp Business is then sent to the phone number, which needs to be input +on the next screen to verify ownership of the number. Enter the verification code and click +{guilabel}`Next` to verify the number. + +#### Send a test message via terminal + +Next, send a test message via the terminal. Under the section labeled {guilabel}`Step 2 Send +messages with the API`, click {guilabel}`Send Message`. A test message will then be sent to the +phone number that was set in the previous section. + +Upon successfully receiving the message to the number, move onto the next section to produce and +configure webhooks. + +(productivity-whatsapp-webhooks)= + +## WhatsApp configuration in Odoo + +The next steps configured in this section are all within the Odoo database. A few different values +for a token, phone number, and account IDs all need to be configured in Odoo; these values are +necessary in order to create a {guilabel}`Callback URL` and {guilabel}`Webhook Verify Token`, which +are then used to configure the webhooks (in order to receive messages back into the database). + +In Odoo, navigate to {menuselection}`WhatsApp app --> Configuration --> WhatsApp Business Accounts`. +Then click {guilabel}`New` to configure the WhatsApp business account in Odoo. + +In another browser tab, navigate to {menuselection}`https://developers.facebook.com --> My Apps --> +WhatsApp --> API Configuration`, and then copy the following values from the Meta developer console +into the corresponding fields in Odoo: + +```{eval-rst} +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - Name + - Meta Console + - Odoo Interface + * - Phone + - :guilabel:`Phone number ID` + - :guilabel:`Phone Number ID` + * - Token + - :guilabel:`Temporary access token` + - :guilabel:`Access Token` + * - App ID + - :guilabel:`App ID` + - :guilabel:`App ID` + * - Account ID + - :guilabel:`WhatsApp Business Account ID` + - :guilabel:`Account ID` +``` + +To retrieve the {guilabel}`App Secret`, navigate to the Meta developer console, +[https://developers.facebook.com/apps](https://developers.facebook.com/apps) and select the app that Odoo is being configured in. Then +in the left-side menu, under {guilabel}`App settings`, select {guilabel}`Basic`. + +Next, click {guilabel}`Show` next to the field {guilabel}`App secret`, and enter the account +password to verify ownership. Copy the {guilabel}`App secret` and then paste that copied value into +the {guilabel}`App Secret` field on the Odoo {guilabel}`WhatsApp Business Account` configuration +dashboard. + +To complete the setup of the WhatsApp business account in Odoo, click {guilabel}`Test Connection`. A +successful message in green will populate in the upper-right corner of the dashboard if the +configuration is set correctly. + +### Configuring webhooks + +To configure the webhooks for WhatsApp in Odoo, navigate to +[https://developers.facebook.com/apps](https://developers.facebook.com/apps) and select the app that Odoo is being configured in. Next +under the {guilabel}`WhatsApp` menu heading on the left side of the screen, click on the +{guilabel}`API Setup` menu item. Finally go to the section marked {guilabel}`Step 3: Configure +webhooks to receive messages` and click on {guilabel}`Configure webhooks`. + +:::{tip} +Another way to configure *Webhooks* is to navigate to [https://developers.facebook.com/apps](https://developers.facebook.com/apps) +and select the app that Odoo is being configured in. Then select {guilabel}`Webhooks` in the left +hand menu. + +```{image} whatsapp/webhooks.png +:align: center +:alt: Manually navigating to the Whatsapp webhooks configuration. +``` +::: + +On the {menuselection}`Webhook configuration` page, click on {guilabel}`Edit`, where both the +{guilabel}`Callback URL` and {guilabel}`Webhook Verify Token` values from the Odoo will be added. + +:::{note} +Both the {guilabel}`Callback URL` and {guilabel}`Webhook Verify Token` values were automatically +populated after clicking on {guilabel}`Test Connection` in the previous step. +::: + +In a separate browser window, retrieve the necessary values in Odoo by navigating to +{menuselection}`WhatsApp app --> Configuration --> WhatsApp Business Accounts` and select the +account that is being configured. Locate the values under the section labeled {guilabel}`Receiving +Messages`. + +Copy and paste the {guilabel}`Callback URL` from Odoo into the {guilabel}`Callback URL` field in +Meta. Similarly, copy and paste the {guilabel}`Webhook Verify Token` into the {guilabel}`Verify +Token` field on the Meta developer console, as well. + +Finally, click {guilabel}`Verify and save` to record the values in the Meta developer console. + +#### Webhook fields + +Now input individual webhook fields into Meta's developer console, under the {guilabel}`Webhook +fields` section. Click {guilabel}`Manage` and when the pop-up window appears, check the boxes in the +{guilabel}`Subscribe` column for the following *field names*: + +- account_update +- message_template_quality_update +- message_template_status_update +- messages +- template_category_update + +After making the selections, click {guilabel}`Done`. + +The finished {guilabel}`Webhooks` configuration will appear like this in the Meta developer console: + +```{image} whatsapp/webhooks-done.png +:align: center +:alt: WhatsApp webhooks set in the Meta developer console. +``` + +:::{important} +The {guilabel}`Webhook fields` will only appear once the subscription is confirmed using the +{guilabel}`Callback URL` and {guilabel}`Webhook Verify Token`. +::: + +:::{seealso} +[Meta's WhatsApp documentation on setting webhooks](https://developers.facebook.com/docs/whatsapp/cloud-api/guides/set-up-webhooks). +::: + +#### Add phone number + +To configure the phone number to use for WhatsApp in Odoo, navigate back to the Meta developer +console ([https://developers.facebook.com/apps](https://developers.facebook.com/apps)) and again select the app that Odoo is being +configured in. Under the {guilabel}`WhatsApp` menu heading on the left side of the screen, click on +the {guilabel}`API Setup` menu item. From there, go to the section marked: {guilabel}`Step 5: Add a +phone number`, and click on {guilabel}`Add phone number`. + +In the fields, enter a {guilabel}`Business name` as well as a {guilabel}`Business website or profile +page`. + +:::{tip} +The {guilabel}`Business website or profile page` field can be a social media page's {abbr}`URL +(Uniform Resource Locator)`. +::: + +Complete filling out the business information by next selecting the country that the company does +business in from the drop-down menu in the {guilabel}`Country` section. Add an address if desired, +however, this information is optional. After adding the location, click {guilabel}`Next` to +continue. + +The following page contains information for the {guilabel}`WhatsApp Business profile`. Complete the +following sections, accordingly: + +- {guilabel}`WhatsApp Business Profile Display Name` +- {guilabel}`Timezone` +- {guilabel}`Category` +- {guilabel}`Business description` (optional) + +Once these sections are complete, click {guilabel}`Next`. The page refreshes and then prompts the +administrator to {guilabel}`Add a phone number for WhatsApp` in the respective field. Here, enter +the phone number to configure in WhatsApp. + +:::{seealso} +[Migrate an Existing WhatsApp Number to a Business Account](https://developers.facebook.com/docs/whatsapp/cloud-api/get-started/migrate-existing-whatsapp-number-to-a-business-account). +::: + +Next, choose a verification method for the phone number. Select either {guilabel}`Text message` or +{guilabel}`Phone call`, and then click {guilabel}`Next` proceed. + +The phone number entered will receive either a text or a phone call by WhatsApp with a code, +depending on the verification method chosen. Enter that verification code into the +{guilabel}`Verification code` field and click {guilabel}`Next` to finish. + +:::{warning} +If a payment method hasn't been added this will be necessary to proceed. [Visit Meta's +documentation on how to add a payment method in Meta's Business Manager](https://www.facebook.com/business/help/915454841921082?id=180505742745347). 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. +::: + +:::{seealso} +[Meta for Developers: Add a Phone Number](https://developers.facebook.com/docs/whatsapp/cloud-api/get-started/add-a-phone-number). +::: + +(productivity-whatsapp-token)= + +#### Permanent token + +After configuration and testing are complete, a permanent token should be created to replace the +{guilabel}`Temporary token`. + +:::{seealso} +[Meta for Developers: System User Access Tokens](https://developers.facebook.com/docs/whatsapp/business-management-api/get-started#system-user-access-tokens). +::: + +Begin by navigating to [https://business.facebook.com/](https://business.facebook.com/) and then go to {menuselection}`Business +settings --> User --> System Users`. Select an existing system user or create a new system user by +clicking on {guilabel}`Add`. + +Assets now must be added to the system user and then a permanent token can be generated. + +Click on {guilabel}`Add assets`, and when the pop-up window appears select {guilabel}`Apps` under +the {guilabel}`Select asset type`. Then, select the Odoo app and toggle the permissions to *On* +under the {guilabel}`Full control` option. Set this new permission setting by clicking +{guilabel}`Save Changes`, to which a confirmation window will appear, acknowledging the addition of +the asset to the system user. Finish by clicking {guilabel}`Done`. + +Next, the permanent token will be generated. Click on {guilabel}`Generate new token`, and a pop-up +window will appear asking which app this token should be generated for. Select the {guilabel}`App` +that this token is for. Then determine the expiration date of either {guilabel}`60 days` or +{guilabel}`Never`. + +Finally, when Meta asks which permissions should the system user allow, add all of the following +permissions: + +- WhatsApp_business_messaging +- WhatsApp_business_management + +When permissions are set, click {guilabel}`Generate token`. Copy the token value that populates on +the screen that follows. + +With that token value, update the {guilabel}`Access Token` field in the WhatsApp business account in +Odoo by navigating to {menuselection}`WhatsApp app --> Configuration --> WhatsApp Business +Accounts`. + +## Go live with the Meta app + +Finally, to launch the app, the Meta app must be set to {guilabel}`Live` in the Meta developer +console. Navigate to [https://developers.facebook.com/apps](https://developers.facebook.com/apps) and click on the app that is being +configured. In the top menu, toggle the {guilabel}`App Mode` field from {guilabel}`Development` to +{guilabel}`Live`. + +:::{important} +If the app status is not set to *live*, then the database will only be able to contact the test +numbers specified in the developer console. +::: + +:::{warning} +A privacy policy URL must be set in order for the app to be set to live. Go to the Meta developer +console, [https://developers.facebook.com/apps](https://developers.facebook.com/apps) and select the app that Odoo is being +configured in. Then, using the menu on the left side of the screen, go to {menuselection}`App +Settings --> Basic`. Then, enter the privacy policy hyperlink address under the +{guilabel}`Privacy Policy URL` field of the form. Click {guilabel}`Save changes` to apply the +privacy policy to the app. +::: + +Once the app has gone live in the Meta developer console, a confirmation email is sent to the +administrator. + +(productivity-whatsapp-templates)= + +## WhatsApp templates + +WhatsApp templates are saved messages that are used repeatedly to send messages from the database. +They allow users to send quality communications, without having to compose the same text repeatedly. + +Creating different templates that are tailored to specific situations lets users choose the right +message for the right audience. This increases the quality of the message and the overall +engagement rate with the customer. + +WhatsApp templates can be created on both the Odoo and Meta consoles. The following process will +overview the process for creating templates in Odoo and then afterward in Meta. + +:::{important} +WhatsApp has an approval process that must be completed before the template can be used. +{ref}`productivity/whatsapp/approval`. +::: + +(id1)= + +### Creating templates in Odoo + +To access and create WhatsApp templates, begin by navigating to the {menuselection}`WhatsApp app --> +Templates` dashboard. + +At the bottom of an individual template's form, there are three tabs: {guilabel}`Body`, +{guilabel}`Buttons`, and {guilabel}`Variables`; these three tabs combined create the WhatsApp +template. + +The text is entered into the {guilabel}`Body` tab, and dynamic content that is called out in the +{guilabel}`Body` tab is specified in the {guilabel}`Variables` tab. Every piece of dynamic content +(e.g., placeholders) in the message (body) is specifically called out and specified in the +{guilabel}`Variables` tab. + +Templates are prefabricated layouts that allow users to send professional looking messages to +customers. These templates are capable of containing dynamic data that will populate in the end +message using variables that are set in the template configuration. For example, messages can +contain the end user's name, call out specific products, or reference a sales order, to name a few +convenient and impactful variables. + +To create a WhatsApp template, go to the {menuselection}`WhatsApp app --> Templates` dashboard and +click {guilabel}`New`. On the form, enter a {guilabel}`Name` for the template, and select a +{guilabel}`Language`. + +:::{important} +In order to complete this next task, administrator access rights are needed to edit the +{guilabel}`Applies to` field. See this {doc}`access rights documentation +<../general/users/access_rights>` for more information. +::: + +In the {guilabel}`Account` drop-down menu, select the *WhatsApp business account* in Odoo that this +template should link to. Next, under the {guilabel}`Applies to` field select the *model* the server +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 will be 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. +::: + +:::{warning} +Often when changing the model or {guilabel}`Applies to` field, the {guilabel}`Phone Field` may +produce an error The {guilabel}`Phone Field` should always be set to the `Phone` or `Mobile` +model. +::: + +To search available fields, type in the front-end name in the {guilabel}`Search...` box. This will +find a result from all of the available fields for the model ({guilabel}`Applies to`) that the +template is created for. + +:::{note} +In order to find specific fields, multiple levels may need to be navigated in the search results +box. Use the {guilabel}`> (right chevron)` and {guilabel}`⬅️ (left arrow)` icons to navigate +between the menu levels. +::: + +```{image} whatsapp/phone-field.png +:align: center +:alt: Searching for the phone field in the search bar. +``` + +Change the {guilabel}`Category` to fit either a {guilabel}`Marketing`, {guilabel}`Utility`, or +{guilabel}`Authentication` category. In most instances the first two options will be used, unless +the user would like to send a password reset or something security related. Set to +{guilabel}`Marketing` should there be anything promotional being sent and set to {guilabel}`Utility` +should there be general transactional messages being sent (i.e., sales order, event ticket, etc). + +:::{important} +Specifying an incorrect category can cause a flag/rejected status from Meta during the approval +process. +::: + +Add any {guilabel}`Users` that are allowed to use this template. In the right-side column, a +{guilabel}`Header type` can be configured along with a {guilabel}`Header message`, as well. + +The available {guilabel}`Header types` are as follows: + +- Text +- Image +- Video +- Document +- Location (variables need to be set) + +Navigate to the {guilabel}`Body` tab to configure the main message of the template. + +When all the necessary changes are made to the template, click on the {guilabel}`Submit for +approval` button in the upper-left corner. This will cause the status of the template to change to +{guilabel}`Pending`. + +The status will remain in {guilabel}`Pending` until a decision has been made by Meta, whereby a +confirmation email will then be sent indicating that the template has been approved (or rejected). +The templates will then need to be synced from the Odoo database. + +See this section for more information on {ref}`syncing templates `. + +:::{tip} +There are pre-configured demo data templates available in Odoo to use or modify. These templates +can be used as-is or modified to suit a specific business need. + +To use these templates, navigate to {menuselection}`WhatsApp app --> Templates` and select a +pre-configured template. Click {guilabel}`Submit for Approval` to start the approval process. An +email will be sent to the administrator of the Meta account when the template has been approved. +::: + +#### Buttons + +Buttons can be added into the message from the {guilabel}`Buttons` tab. Enter the {guilabel}`Type` +(either {guilabel}`Visit Website`, {guilabel}`Call Number`, or {guilabel}`Quick Reply`), and then +specify the {guilabel}`Button Text`, {guilabel}`Call Number` or {guilabel}`Website URL` (including +{guilabel}`Url Type`), depending on the {guilabel}`Type` of button. + +:::{note} +Buttons can also be added on the Meta business console. See Meta's WhatsApp template dashboard by +navigating to [https://business.facebook.com/wa/manage/home](https://business.facebook.com/wa/manage/home). Then go to +{menuselection}`Account tools --> Message templates`. +::: + +#### Using placeholders and variables + +Dynamic variables reference certain fields within the Odoo database to produce unique data in the +WhatsApp message when using a template. Dynamic variables are encoded to display fields from within +the database, referencing fields from within a model. + +```{eval-rst} +.. example:: + Many companies like to customize their WhatsApp messages with a personalized piece of customer + information to grab attention. This can be accomplished in Odoo by referencing a field within a + model by setting a dynamic variable. For example, a customer's name can be referenced in the + email from the :guilabel:`Customer` field on the :guilabel:`Sales Order` model. +``` + +```{image} whatsapp/message.png +:align: center +:alt: WhatsApp message with dynamic variables highlighted. +``` + +Dynamic variables can be added in to the {guilabel}`Body` by adding {guilabel}`placeholders` in the +*text*. To add a placeholder in the *message body* enter the following text `{{1}}`. For the second +placeholder enter `{{2}}` and increase incrementally as more placeholders are added to the text. + +```{eval-rst} +.. example:: + *The following is the text from payment receipt template body:* + + Dear {{1}}, + + | Here is your invoice *{{2}}* from *{{3}}* for a total of *{{4}}{{5}}*. + | To review your invoice or pay online: {{6}} + + Thank you +``` + +:::{seealso} +{ref}`productivity/whatsapp/templates`. +::: + +These placeholders must be configured on the {guilabel}`Variables` tab of the template before +submitting for approval from Meta. To edit the dynamic variables on a template, first change the +{guilabel}`Type` to {guilabel}`Field of Model`. This allows Odoo to reference a field within a model +to produce unique data in the message being sent. + +Next, edit the {guilabel}`Field` of the dynamic variables. The {guilabel}`Applies to` field in the +template should be edited prior to ensure the correct model and field are referenced. + +To search the available fields, type in the front-end name of the field in the search box. This will +find a result from all of the available fields for the model ({guilabel}`Applies to`) that the +template is created for. There may be multiple levels that need to be configured. + +```{eval-rst} +.. example:: + The following is an example of the variables set for the above placeholders in the payment + receipt noted above: + + .. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - Name + - Sample Value + - Type + - Field + * - body - {{1}} + - Azure Interior + - Field of Model + - `Partner` + * - body - {{2}} + - INV/2022/00001 + - Field of Model + - `Number` + * - body - {{3}} + - My Company + - Field of Model + - `Company` + * - body - {{4}} + - $ + - Field of Model + - `Currency > Symbol` + * - body - {{5}} + - 4000 + - Field of Model + - `Amount` + * - body - {{6}} + - \https://.. + - Portal link + - +``` + +```{eval-rst} +.. example:: + For example, in the :guilabel:`Body` tab, if the following is typed, "Hello {{1}},", then `{{1}}` + must be set in the :guilabel:`Variables` tab. For this specific case, the message should greet + the customer by name, so the `{{1}}` should be configured to populate the `{{1}}` + :guilabel:`Field` with the :guilabel:`Customer` name. +``` + +:::{warning} +Customizing WhatsApp templates is out of the scope of Odoo Support. +::: + +(productivity-whatsapp-approval)= + +#### Meta template approval + +After updating the dynamic variables on the template, the template needs to be submitted to Meta for +approval again. Click {guilabel}`Submit for Approval` to start the approval process. An email will +be sent to the administrator of the Meta account when the template has been approved. + +Following the approval from Meta, sync the templates again in the Odoo database. See this +documentation: {ref}`productivity/whatsapp/sync`. + +:::{tip} +To see the status to Meta's WhatsApp template dashboard by navigating to +[https://business.facebook.com/wa/manage/home](https://business.facebook.com/wa/manage/home). Then go to {menuselection}`Account tools --> +Message templates`. +::: + +(productivity-whatsapp-sync)= + +#### Syncing templates + +Templates must be synced on the Odoo database once they are approved by the Meta team. To do so, +begin by navigating to {menuselection}`WhatsApp app --> Configuration --> WhatsApp Business +Accounts` and select the configuration that should be synced. Under the section marked +{menuselection}`Sending messages`, towards the bottom, click on {guilabel}`Sync Templates`. Meta +will update the templates that are approved so that they can be utilized with various apps in the +database. + +```{image} whatsapp/sync-template.png +:align: center +:alt: |- +: Syncing Meta WhatsApp templates to the Odoo database, with the 'Sync Templates' +: highlighted. +``` + +A successful message in green appears in the upper-right corner with the number of templates +updated. + +:::{tip} +Templates can also be synced individually from the template itself. Navigate to the +{menuselection}`WhatsApp app --> Templates` dashboard and select the template to sync. Then, +click on the {guilabel}`Sync Template` button located in the top menu of the template's form. +::: + +### Creating templates in Meta + +First, navigate to [Meta's WhatsApp template dashboard](https://business.facebook.com/wa/manage/home), and then go to {menuselection}`Account tools --> +Message templates`. + +```{image} whatsapp/account-tools.png +:align: center +:alt: Account tools highlighted in business manager with the manage templates link +: highlighted. +``` + +To create a WhatsApp template, click on the blue {guilabel}`Create template` button, and then select +the {guilabel}`Category`. The options listed include: {guilabel}`Marketing`, {guilabel}`Utility`, +and {guilabel}`Authentication`. In most instances the first two options will be used, unless the +user would like to send a password reset or something security related. + +Enter the {guilabel}`Name` of the template and then select the {guilabel}`Language` for the +template. + +:::{note} +Multiple languages can be selected by typing the language name(s) and selecting the other +languages as needed. +::: + +```{image} whatsapp/template-config.png +:align: center +:alt: |- +: Template configuration options listed, with Marketing, Utility, Name and Language +: highlighted. +``` + +After making the appropriate selections, click on {guilabel}`Continue` in the upper-right corner. +The page redirects to the {guilabel}`Edit template` page. Here the {guilabel}`Header`, +{guilabel}`Body`, {guilabel}`Footer` and {guilabel}`Buttons` are configured. To the right of the +template is a preview of what the template will look like in production. + +```{image} whatsapp/edit-template.png +:align: center +:alt: Edit the template using a header, body, footer and buttons. +``` + +When all the necessary changes are made to the template, click on the {guilabel}`Submit` button in +the upper-right corner. A confirmation window appears to confirm the language— click +{guilabel}`Confirm` to approve and then another window appears stating that the template will be +submitted to Meta for review and approval. + +The {guilabel}`Status` of the template will remain in {guilabel}`In review` until a decision has +been made by Meta. Once an email confirmation is received approving the template, the templates will +need to be synced from within the Odoo database. + +:::{seealso} +For more information on configuring templates on the Meta developer console visit [Meta's +WhatsApp template documentation](https://developers.facebook.com/docs/whatsapp/business-management-api/message-templates/). +::: + +## Notifications + +Notifications in WhatsApp are handled similar to a message conversation in Odoo. A pop-up window +appears with the received conversation from the customer. By default, notifications are set in the +WhatsApp business account configuration in Odoo. + +Notification settings can be adjusted by navigating to {menuselection}`WhatsApp app --> +Configuration --> WhatsApp Business Accounts`. From there, select the account and scroll down to the +{menuselection}`Control` section where notifications are handled. Under the {guilabel}`Notify users` +heading, type in the field which user(s) should be notified for this particular WhatsApp channel. + +:::{note} +Once a conversation is initiated between a user and a customer, notifications to all the users +specified in the WhatsApp business account configuration won't occur. Only notifications to the +user(s) in the conversation will occur. Should the user not respond within 15 days, the +customer's reply after the 15 days will populate once again to all the users specified in the +WhatsApp configuration. +::: + +## Adding users to chat + +Users can be added to a WhatsApp chat by expanding the WhatsApp pop-up window. WhatsApp +conversations are located in the *Discuss* app. Click on the {guilabel}`👤+ (add user)` icon next to +it, and a window appears to invite users to the conversation. + +```{image} whatsapp/add-users.png +:align: center +:alt: Adding users to a WhatsApp conversation, with the add user icon highlighted. +``` + +## WhatsApp API FAQ + +### Verification + +As of February 1, 2023, if the Meta app requires advanced level access to permissions, a complete +business verification may need to be completed. This includes submitting office business documents +to Meta. [See this documentation](https://developers.facebook.com/docs/development/release/business-verification). + +:::{seealso} +[Meta's WhatsApp access verification documentation](https://developers.facebook.com/docs/development/release/access-verification/). +::: + +### Template errors + +Editing templates can cause tracebacks and errors unless the exact process is followed above, here: +({ref}`productivity/whatsapp/templates`). + +#### Duplicate validation error + +When syncing the templates there may be an instance when there are multiple templates with the same +name on Meta's business manager and in Odoo. This causes a duplicate validation error. To correct +this issue, rename the duplicate template name on Odoo and sync the templates once again by +following the steps here: {ref}`productivity/whatsapp/sync`. + +```{image} whatsapp/validation-error-2.png +:align: center +:alt: User error populated in Odoo when a duplicate template exists. +``` + +### Token errors + +#### User error + +Should the temporary token not be replaced with a permanent token a user error will populate in Odoo +when testing the connection after sending fails. To correct this issues see +{ref}`productivity/whatsapp/token`. + +```{image} whatsapp/user-error.png +:align: center +:alt: User error populated in Odoo when token expires. +``` + +#### System user error 100 + +Should the system user be an {guilabel}`Employee` when setting up the permanent token, a user error +100 will populate. + +To correct this error, create an {guilabel}`Admin` system user, following the process outlined here: +{ref}`productivity/whatsapp/token`. + +```{image} whatsapp/user-error-2.png +:align: center +:alt: User error populated in Odoo when an employee token is generated instead of a +: Admin user. +``` + diff --git a/content/applications/sales.md b/content/applications/sales.md new file mode 100644 index 000000000..fcf1ce4f7 --- /dev/null +++ b/content/applications/sales.md @@ -0,0 +1,15 @@ +--- +nosearch: true +--- + +# Sales + +```{toctree} +sales/crm +sales/sales +sales/point_of_sale +sales/subscriptions +sales/rental +sales/members +``` + diff --git a/content/applications/sales/crm.md b/content/applications/sales/crm.md new file mode 100644 index 000000000..35538341d --- /dev/null +++ b/content/applications/sales/crm.md @@ -0,0 +1,27 @@ +--- +hide-page-toc: true +nosearch: true +show-content: true +show-toc: true +--- + +# CRM + +**Odoo CRM** helps you organize your sales activities: track leads, close opportunities and get +accurate forecasts. Keep opportunities organized with the pipeline and manage your day-to-day +activities with meetings and next activities. + +:::{seealso} +- [Odoo Tutorials: CRM](https://www.odoo.com/slides/crm-16) +::: + +```{toctree} +:titlesonly: true + +crm/pipeline +crm/acquire_leads +crm/track_leads +crm/performance +crm/optimize +``` + diff --git a/content/applications/sales/crm/acquire_leads.md b/content/applications/sales/crm/acquire_leads.md new file mode 100644 index 000000000..59b642ad5 --- /dev/null +++ b/content/applications/sales/crm/acquire_leads.md @@ -0,0 +1,16 @@ +--- +nosearch: true +--- + +# Acquire leads + +```{toctree} +:titlesonly: true + +acquire_leads/convert +acquire_leads/opportunities_form +acquire_leads/email_manual +acquire_leads/send_quotes +acquire_leads/lead_mining +``` + diff --git a/content/applications/sales/crm/acquire_leads/convert.md b/content/applications/sales/crm/acquire_leads/convert.md new file mode 100644 index 000000000..e9ad50b88 --- /dev/null +++ b/content/applications/sales/crm/acquire_leads/convert.md @@ -0,0 +1,102 @@ +# Convert leads into opportunities + +*Leads* act as a qualifying step before an opportunity is created. This provides additional time to +review its potential, and gauge its viability, before the opportunity is assigned to a salesperson. + +## Configuration + +To activate the *Leads* setting, navigate to {menuselection}`CRM app --> Configuration --> Settings` +and check the box labeled, {guilabel}`Leads`. Then, click {guilabel}`Save`. + +```{image} convert/convert-leads-leads-setting.png +:align: center +:alt: Leads setting on CRM configuration page. +``` + +Activating this feature adds a new menu option, {guilabel}`Leads`, to the header bar, located along +the top of the screen. + +```{image} convert/convert-leads-leads-menu.png +:align: center +:alt: Leads menu on CRM application. +``` + +Once the *Leads* setting has been activated, it applies to all sales teams by default. To turn off +leads for a specific team, navigate to {menuselection}`CRM app --> Configuration --> Sales Teams`. +Then, select a team from the list to open that team's configuration page. Clear the +{guilabel}`Leads` checkbox, located beneath the {guilabel}`Sales Team` field, then click +{guilabel}`Save`. + +```{image} convert/convert-leads-leads-button.png +:align: center +:alt: Leads menu on CRM application. +``` + +## Convert a lead into an opportunity + +To convert a lead into an *opportunity*, navigate to {menuselection}`CRM app --> Leads`, and click +on a lead from the list to open it. + +:::{warning} +If a {guilabel}`Similar Leads` smart button appears at the top of the page for the lead, it +indicates a similar lead or opportunity already exists in the database. Before converting this +lead, click the smart button to confirm if the lead should be merged. + +```{image} convert/similar-leads-smart-button.png +:align: center +:alt: Close up of a lead with emphasis on the Similar Leads smart button. +``` +::: + +Click the {guilabel}`Convert to Opportunity` button, located at the top-left of the page. + +```{image} convert/convert-leads-convert-opp-button.png +:align: center +:alt: Create opportunity button on a lead record. +``` + +This opens a {guilabel}`Convert to opportunity` pop-up modal. Here, in the {guilabel}`Conversion +Action` field, select the {guilabel}`Convert to opportunity` option. + +:::{note} +To merge this lead with an existing similar lead or opportunity, select {guilabel}`Merge with +existing opportunities` in the {guilabel}`Conversion Action` field. This generates a list of the +similar leads/opportunities to be merged. + +When merging, Odoo gives priority to whichever lead/opportunity was created in the system first, +merging the information into the first created lead/opportunity. However, if a lead and an +opportunity are being merged, the resulting record is referred to as an opportunity, regardless +of which record was created first. +::: + +Then, select a {guilabel}`Salesperson` and a {guilabel}`Sales Team` to which the opportunity should +be assigned. Neither field is required, though if a selection is made in the {guilabel}`Salesperson` +field, the {guilabel}`Sales Team` field is populated automatically, based on the salesperson's team +assignments. + +If the lead has already been assigned to a salesperson or a team, these fields automatically +populate with that information. + +```{image} convert/convert-leads-conversion-action.png +:align: center +:alt: Create opportunity pop-up. +``` + +Under the {guilabel}`Customer` heading, choose from the following options: + +- {guilabel}`Create a new customer`: choose this option to use the information in the lead to create + a new customer record. +- {guilabel}`Link to an existing customer`: choose this option, then select a customer from the + resulting drop-down menu, to link this opportunity to an existing customer record. +- {guilabel}`Do not link to a customer`: choose this option to convert the lead, but not link it to + a new or existing customer. + +Lastly, when all configurations are complete, click {guilabel}`Create Opportunity`. + +To view the newly created opportunity, navigate to {menuselection}`CRM app --> My Pipeline`. + +:::{note} +Some filters may need to be removed from the {guilabel}`Search...` bar on the top +{guilabel}`Pipeline` page to view all opportunities. +::: + diff --git a/content/applications/sales/crm/acquire_leads/email_manual.md b/content/applications/sales/crm/acquire_leads/email_manual.md new file mode 100644 index 000000000..a3045bdca --- /dev/null +++ b/content/applications/sales/crm/acquire_leads/email_manual.md @@ -0,0 +1,137 @@ +--- +substitutions: + st: '{icon}`fa-star`' + st-o: '{icon}`fa-star-o`' +--- + +# Create leads (from email or manually) + +Leads can be added to the *CRM* app from custom email aliases, and by manually creating new +records. This is in addition to the leads and opportunities created in the app through the +{doc}`website contact form `. + +First, ensure the *Leads* feature is enabled in the database by navigating to {menuselection}`CRM +app --> Configuration --> Settings`. Tick the {guilabel}`Leads` checkbox, then click +{guilabel}`Save`. + +(crm-configure-email-alias)= + +## Configure email aliases + +Each sales team has the option to create and utilize their own unique email alias. When messages +are sent to this address, a lead (or opportunity), is created with the information from the +message. + +To create or update a sales teams' email alias, navigate to {menuselection}`CRM app --> +Configuration --> Sales Teams`. Click on a team from the list to open the team's details page. + +```{image} email_manual/email-alias.png +:align: center +:alt: The sales team details page, focused on the email alias section. +``` + +In the {guilabel}`Email Alias` field, enter a name for the email alias, or edit the existing name. +In the {guilabel}`Accept Emails From` field, use the drop-down menu to choose who is allowed to send +messages to this email alias: + +- {guilabel}`Everyone`: messages are accepted from any email address. +- {guilabel}`Authenticated Partners`: only accepts messages from email addresses associated with a + a partner (contact or customer) record. +- {guilabel}`Followers only`: only accepts messages from those who are following a record related to + the team, such as a lead or opportunity. Messages are also accepted from team members. +- {guilabel}`Authenticated Employees`: only accepts messages from email addresses that are connected + to a record in the *Employees* app. + +### Leads created from email + +Leads created from email alias messages can be viewed by navigating to {menuselection}`CRM app --> +Leads`. Click a lead from the list to open it, and view the details. + +The email received by the alias is added to the *chatter* thread for the lead. The subject line of +the message is added to the title field, and the {guilabel}`Email` field is updated with the +contact's email address. + +```{image} email_manual/chatter-message.png +:align: center +:alt: The chatter thread of a newly created lead in the CRM app. +``` + +:::{note} +If the *leads* feature is **not** enabled on the database, messages to the email alias are added +to the database as opportunities. +::: + +:::{seealso} +{doc}`../../../general/email_communication` +::: + +## Manually create leads + +Leads can be added directly to the *CRM* app by manually creating a new record. Navigate to +{menuselection}`CRM app --> Leads` to view a list of existing leads. + +:::{tip} +Leads can also be added via the {doc}`Generate Leads ` button. +::: + +At the top-left of the list, click {guilabel}`New` to open a blank {guilabel}`Leads` form. + +In the first field of the new form, enter a title for the new lead. Next, enter a {guilabel}`Contact +Name`, and a {guilabel}`Company Name`. + +:::{note} +If a lead is {doc}`converted to an opportunity `, the {guilabel}`Company Name` field is +used to either link this opportunity to an existing customer, or to create a new customer. +::: + +### Manually create opportunities + +To manually create an opportunity, navigate to {menuselection}`CRM app --> Sales --> My Pipeline`. +At the top-left of the page, click {guilabel}`New` to create a new opportunity Kanban card. In the +{guilabel}`Organization/Contact` field, enter the name of the company the opportunity is for. + +Choose a name, and enter it in the {guilabel}`Opportunity` field. *This is a required field.* When +manually creating an opportunity, it is helpful to add a name that relates to the details of the +opportunity. + +```{eval-rst} +.. example:: + In the example below, the opportunity is named `5 VP Chairs`. This identifies the product the + customer is interested in, as well as the potential number of products. + + .. image:: email_manual/opportunity-example.png + :align: center + :alt: An example of an opportunity in the CRM pipeline. +``` + +Enter the contact information for the opportunity in the {guilabel}`Email` and {guilabel}`Phone` +fields. + +In the {guilabel}`Expected Revenue` field, enter an estimated value for the opportunity. + +:::{note} +The information in the {guilabel}`Expected Revenue` and priority fields can be used to track +performance for individual salespeople, and on a team basis. See +{doc}`../performance/expected_revenue_report` and {doc}`../track_leads/lead_scoring` for more +information. +::: + +Then, use the {{ st-o }} {guilabel}`(star)` icons to assign a priority. + +- {{ st-o }} {{ st-o }} {{ st-o }}: low priority +- {{ st }} {{ st-o }} {{ st-o }}: medium priority +- {{ st }} {{ st }} {{ st-o }}: high priority +- {{ st }} {{ st }} {{ st }}: very high priority + +:::{note} +Assigning a priority changes the order of leads in Kanban view, with higher priority leads +displayed first. +::: + +Once all the necessary information has been entered, click {guilabel}`Add`. + +```{image} email_manual/create-opportunities.png +:align: center +:alt: The CRM pipeline with a newly created opportunity. +``` + diff --git a/content/applications/sales/crm/acquire_leads/lead_mining.md b/content/applications/sales/crm/acquire_leads/lead_mining.md new file mode 100644 index 000000000..35306c5df --- /dev/null +++ b/content/applications/sales/crm/acquire_leads/lead_mining.md @@ -0,0 +1,125 @@ +--- +substitutions: + CC: '{guilabel}`Companies and their Contacts`' + IAP: '{abbr}`IAP (In-App Purchase)`' +--- + +# Lead mining + +*Lead mining* is a feature that allows *CRM* users to generate new leads directly into their Odoo +database. To ensure lead qualification, lead mining output is determined by a variety of filtering +criteria, such as the country, the company size, and the industry. + +## Configuration + +To get started, go to {menuselection}`CRM app --> Configuration --> Settings`, and tick the +{guilabel}`Lead Mining` checkbox to activate the feature. Then, click {guilabel}`Save`. + +```{image} lead_mining/activate-lead-mining.png +:align: center +:alt: Activate lead mining in Odoo CRM settings. +``` + +## Generate leads + +After the *Lead Mining* setting is activated, a new button called *Generate Leads* is available to +use in the upper-left corner of the *CRM* *Pipeline* ({menuselection}`CRM app --> Sales --> My +Pipeline`). + +Lead mining requests are also available through {menuselection}`CRM app --> Configuration --> Lead +Mining Requests`, or through {menuselection}`CRM app --> Leads --> Leads`, where the +{guilabel}`Generate Leads` button is also available. + +```{image} lead_mining/generate-leads-button.png +:align: center +:alt: The Generate Leads button to use the lead mining feature. +``` + +Click the {guilabel}`Generate Leads` button, and a pop-up window appears, offering a variety of +criteria by which to generate leads. + +```{image} lead_mining/generate-leads-popup.png +:align: center +:alt: The pop-up window with the selection criteria in order to generate leads in Odoo. +``` + +Choose to generate leads for {guilabel}`Companies` to get company information only, or choose +{{ CC }} to get company information and individual employee contact information. + +:::{note} +When targeting {{ CC }}, additional options are available to filter contacts based on +{guilabel}`Role` or {guilabel}`Seniority`. +::: + +Additional filtering options include the following: + +- {guilabel}`Countries`: filter leads based on the country (or countries) they are located in. +- {guilabel}`States`: further filter leads based on the state in which they are located, if + applicable. +- {guilabel}`Industries`: filter leads based on the specific industry they work in. +- {guilabel}`Filter on Size`: tick this checkbox to specify the number of employees at the company. + This generates a field labeled {guilabel}`Size`. Fill in the blanks to create a range for the + desired company size. +- {guilabel}`Sales Team`: choose which Sales Team the leads will be assigned to. +- {guilabel}`Salesperson`: choose which member of the Sales Team the leads will be assigned to. +- {guilabel}`Default Tags`: choose which tags are applied directly to the leads once found. + +:::{important} +Make sure to be aware of the latest EU regulations when receiving contact information. Get more +information about the General Data Protection Regulation on [Odoo GDPR](http://odoo.com/gdpr). +::: + +### View leads + +After leads are generated, they are assigned to the designated salesperson and team. To view +additional information regarding the lead, select one from the list, and click to open it. + +In the chatter thread for the lead, additional information is provided. This can include the number +of employees, the technology used by the company, the timezone, and direct contact information. + +```{image} lead_mining/generated-lead.png +:align: center +:alt: The chatter thread of a newly generated lead. +``` + +:::{note} +If {guilabel}`Leads` are **not** enabled for the database, then leads are generated as +*opportunities*, and added to the pipeline for the designated salesperson. + +To enable the {guilabel}`Leads` feature, navigate to {menuselection}`CRM app --> Configuration +--> Settings`, and tick the {guilabel}`Leads` checkbox. Then, click {guilabel}`Save`. +::: + +## Pricing + +Lead mining is an *In-App Purchase* feature, and each generated lead costs one {ref}`credit +`. + +:::{important} +Generating {{ CC }} costs one additional credit for each contact generated. See here for complete +pricing information: [Lead Generation by Odoo IAP](https://iap.odoo.com/iap/in-app-services/167?). +::: + +To buy credits, navigate to {menuselection}`CRM app --> Configuration --> Settings`. In the +{guilabel}`Lead Generation` section, under the {guilabel}`Lead Mining` feature, click {guilabel}`Buy +Credits`. + +Credits may also be purchased by navigating to the {menuselection}`Settings app`. In the +{guilabel}`Contacts` section, under the {guilabel}`Odoo IAP` feature, click {guilabel}`View My +Services`. + +```{image} lead_mining/view-my-services-setting.png +:align: center +:alt: Buy credits in the Odoo IAP settings. +``` + +:::{note} +Enterprise Odoo 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. +::: + +:::{seealso} +{doc}`/applications/essentials/in_app_purchase` +::: + diff --git a/content/applications/sales/crm/acquire_leads/opportunities_form.md b/content/applications/sales/crm/acquire_leads/opportunities_form.md new file mode 100644 index 000000000..0da75be4b --- /dev/null +++ b/content/applications/sales/crm/acquire_leads/opportunities_form.md @@ -0,0 +1,120 @@ +# Create opportunities from web contact forms + +Adding a contact form to a website makes it easy to convert visitors into leads and opportunities. +After a visitor submits their information, an opportunity can be created automatically, and assigned +to a designated sales team and salesperson. + +(crm-customize-contact-form)= + +## Customize contact forms + +By default, the *Contact Us* page on an Odoo website displays a preconfigured contact form. This +form can be customized, as needed, to suit the needs of a specific sales team. + +Navigate to {menuselection}`Website app --> Contact Us`, then click {guilabel}`Edit` in the +top-right of the screen to open the web editor. Click on the form building block in the body of the +webpage to open the form configuration settings on the right sidebar. The following options are +available to customize the contact form from the {guilabel}`From` section of the right sidebar: + +```{image} opportunities_form/form-customization.png +:align: center +:alt: The form configuration settings on an Odoo website. +``` + +- {guilabel}`Action`: the default action for a contact form is {guilabel}`Send an Email`. Select + {guilabel}`Create an Opportunity` from the drop-down list to capture the information in the *CRM* + app. +- {guilabel}`Sales Team`: choose a sales team from the drop-down menu that the opportunities from + this form should be assigned to. This field **only** appears if the {guilabel}`Action` field is + set to {guilabel}`Create an Opportunity`. +- {guilabel}`Salesperson`: if the opportunities should be assigned to a specific salesperson, select + them from the drop-down menu. If no selection is made in this field, the opportunities are + assigned based on the team's existing rules. +- {guilabel}`Marked Fields`: use this field to alter how the form handles marked fields. The default + option is to treat marked fields as {guilabel}`Required`, which is the recommended setting. +- {guilabel}`Mark Text`: choose how {guilabel}`Marked Fields` should be identified. The default + character is an asterisk (`*`). +- {guilabel}`Labels Width`: use this field to alter the pixel width of the labels, if desired. +- {guilabel}`On Success`: select how the webpage reacts after a customer successfully submits a + form. {guilabel}`Nothing` keeps the customer on the same screen, with the addition of a + confirmation message that the form was submitted successfully. {guilabel}`Redirect` sends the + customer to a new webpage, based on the address provided in the {guilabel}`URL` field below. + {guilabel}`Show Message` replaces the form with a preconfigured message that informs the customer + someone should respond to them as soon as possible. +- {guilabel}`URL`: if {guilabel}`Redirect` is selected in the {guilabel}`On Success` field, enter + the URL for the webpage, where customers should be directed after successfully submitting a form. +- {guilabel}`Visibility`: use the drop-down menu to add any visibility conditions for this field, if + desired. + +:::{important} +If *leads* are activated in *CRM* settings, selecting {guilabel}`Create an Opportunity` generates +a lead instead. To activate leads, navigate to {menuselection}`CRM app --> Configuration --> +Settings`, and tick the {guilabel}`Leads` checkbox. Then, click {guilabel}`Save`. +::: + +### Customize contact form fields + +In addition to the settings for the form, the settings for each field can be customized, as well. +With the web editor menu still open, click into a field to open the {guilabel}`Field` configuration +settings section on the sidebar. The following options are available to customize a field: + +- {guilabel}`Type`: choose a custom field option or an existing field type. +- {guilabel}`Input Type`: determine the type of information customers should input. Available + options are {guilabel}`Text`, {guilabel}`Email`, {guilabel}`Telephone`, or {guilabel}`Url`. The + selection made in this field limits the format that customers can use when entering information. +- {guilabel}`Label`: enter the name for the field. +- {guilabel}`Position`: choose the way the label is aligned with the rest of the form. The label can + be hidden, above the field, to the left of the field, or right adjusted and closer to the field. +- {guilabel}`Description`: slide the toggle to add a description for the field, which can provide + additional instructions to customers. Click under the field on the form to add the description. +- {guilabel}`Placeholder`: enter an example to help users know how to input information where + formatting is important, such as a phone number or email address. +- {guilabel}`Default Value`: enter a value to include in the form, by default, if the customer does + not provide information in the field. *It is not recommended to include a default value for + required fields*. +- {guilabel}`Required`: slide the toggle to mark this field as required if it **must** be filled in + for every submission. +- {guilabel}`Visibility`: select when this field should be visible. Use the button on the left to + choose whether to show or hide this field on a desktop users. Use the button on the right to + choose whether to show or hide this field to mobile users. +- {guilabel}`Animation`: select if this field should have any animation. + +```{image} opportunities_form/field-customization.png +:align: center +:alt: The field configuration settings on an Odoo website. +``` + +## View opportunities + +After a customer submits a contact form, and an opportunity is created, it is assigned based on the +{ref}`form settings `. To view opportunities, navigate to +{menuselection}`CRM app --> Sales --> My Pipeline`. + +:::{note} +If leads are activated on the database, contact form submissions are generated as leads, not +opportunities. To activate leads, navigate to {menuselection}`CRM app --> Configuration --> +Settings`, and tick the {guilabel}`Leads` checkbox. Then, click {guilabel}`Save`. + +Navigate to {menuselection}`CRM app --> Leads` to view the newly-created leads. +::: + +On the {guilabel}`My Pipeline` dashboard, click on an opportunity card in the Kanban view to open +the opportunity record. The information submitted by the customer is visible on the opportunity +record. + +:::{note} +As the contact form fields are customizable, the fields on the opportunity record, where the form +information is stored, varies accordingly. + +If the preconfigured contact form is used, the *Subject* field is added to the {guilabel}`Title` +field, and the content in the {guilabel}`Notes` field, which is labeled as {guilabel}`Your +Question`, is added to the {guilabel}`Internal Notes` tab. +::: + +:::{seealso} +- {doc}`../pipeline/manage_sales_teams` +- {doc}`convert` +- {doc}`../track_leads/lead_scoring` +- {ref}`Website forms ` +::: + diff --git a/content/applications/sales/crm/acquire_leads/send_quotes.md b/content/applications/sales/crm/acquire_leads/send_quotes.md new file mode 100644 index 000000000..7132bcfb2 --- /dev/null +++ b/content/applications/sales/crm/acquire_leads/send_quotes.md @@ -0,0 +1,230 @@ +# Create and send quotations + +Once a qualified lead has been converted into an opportunity, the next step is to create and deliver +a quotation. This process can be easily handled through Odoo's *CRM* application. + +## Create a new quotation + +To create a new quotation, open the {menuselection}`CRM app`, revealing the {guilabel}`Pipeline` +page on the main *CRM* dashboard. + +From here, click on any opportunity to open it. Review the existing information and update any +fields, if necessary. + +:::{note} +If a quotation has already been created for this opportunity, it can be found by clicking on the +{guilabel}`Quotations` smart button at the top of the top of the form. The number of existing +quotations is listed on the smart button, as well. +::: + +At the top-left of the form, click the {guilabel}`New Quotation` button. + +```{image} send_quotes/send-quotes-new-button.png +:align: center +:alt: Qualified lead form with New Quotation button emphasized. +``` + +:::{important} +The **Sales** application **must** be installed for the {guilabel}`New Quotation` button to +appear. +::: + +:::{important} +The {guilabel}`Customer` field is **not** required on the opportunity form. + +However, customer information must be added or linked before a quotation can be sent. If the +{guilabel}`Customer` field is left blank on the opportunity, clicking the {guilabel}`New +Quotation` button opens a pop-up window with the following options: + +- {guilabel}`Create a new customer`: creates a new customer record, using any available + information provided on the opportunity form. +- {guilabel}`Link to an existing customer`: opens a drop-down field with existing customer names. + Select a name to link this new quotation to an existing customer record. +- {guilabel}`Do not link to a customer`: the quotation will **not** be linked to a customer, and + no changes are made to the customer information. +::: + +Once this button is clicked, a new quotation form appears. Confirm the information in the top half +of the form, and update any missing or incorrect fields: + +- {guilabel}`Customer`: the company or contact for whom this quotation was created. +- {guilabel}`Referrer`: if this customer was referred by another customer or contact, select it from + the drop-down menu in this field. +- {guilabel}`Invoice Address`: physical address where the invoice should be sent. +- {guilabel}`Delivery Address`: physical address where any products should be delivered. +- {guilabel}`Quotation Template`: if applicable, select a pre-configured {doc}`quotation template + ` from this field. +- {guilabel}`Expiration`: date when this quotation is no longer valid. +- {guilabel}`Quotation Date`: creation date of draft/sent orders, confirmation date of confirmed + orders. Note that this field is only visible if {doc}`Developer mode (debug mode) + ` is active. +- {guilabel}`Recurring Plan`: if this quotation is for a recurring product or subscription, select + the recurring plan configuration to be used. +- {guilabel}`Pricelist`: select a pricelist to be applied to this order. +- {guilabel}`Payment Terms`: select any applicable payment terms for this quotation. + +```{image} send_quotes/send-quotes-new-quotation.png +:align: center +:alt: Qualified lead form with New Quotation button emphasized. +``` + +:::{tip} +The {guilabel}`Expiration` field automatically populates based on the creation date of the +quotation, and the default validity time frame. + +To update the default validity time frame, navigate to {menuselection}`Sales app --> +Configuration --> Settings --> Quotations & Orders` and update the {guilabel}`Default Quotation +Validity` field. To disable automatic expiration, enter `0` in this field. + +When the desired changes are complete, click {guilabel}`Save`. + +When using a quotation template, the expiration date is based off of the {guilabel}`Quotation +Validity` field on the template. To alter the validity date computation on a template, go to +{menuselection}`Sales app --> Configuration --> Sales Orders --> Quotation Templates`. + +Then, click on a template to open it, and update the number in the {guilabel}`Quotation Validity` +field. +::: + +### Order lines + +After updating the customer, payment, and deadline information on the new quotation, the +{guilabel}`Order Lines` tab can be updated with the appropriate product information. + +To do that, click {guilabel}`Add a product` in the {guilabel}`Order Lines` tab. + +Next, type the name of an item into the {guilabel}`Product` field to search through the product +catalog. Then, select a product from the drop-down menu, or create a new one by selecting +{guilabel}`Create` or {guilabel}`Create and Edit`. + +After selecting a product, update the {guilabel}`Quantity`, if necessary. Confirm the information in +the remaining fields. + +To remove a line from the quotation, click the {icon}`fa-trash-o` {guilabel}`(trash can)` icon. + +To organize products into sections click {guilabel}`Add a section` and type a name for the section. +Then, click the {icon}`oi-draggable` {guilabel}`(drag)` icon to the left of the name and drag to +move the section to the appropriate location. Move each product using the same method to finish +organizing the quotation order lines. + +```{image} send_quotes/product-sections.png +:align: center +:alt: Categories are used to create separate sections on the order lines of a quote. +``` + +#### Product catalog + +To quickly add numerous products to the quotation, click the {guilabel}`Catalog` button to open the +product catalog. + +All products in the database are listed as cards and can be sorted in the left panel by +{guilabel}`Product Category` and {guilabel}`Attributes`. + +```{image} send_quotes/product-catalog.png +:align: center +:alt: The product catalog displays all products as cards. +``` + +To add a product, click the {icon}`fa-shopping-cart` {guilabel}`Add` button on the product card. +Set the quantity of the item using the {icon}`fa-plus` {guilabel}`(add)` or {icon}`fa-minus` +{guilabel}`(subtract)` buttons, or type the quantity in the number field between the two buttons. +To remove an item, click the {icon}`fa-trash` {guilabel}`Remove` button on the product card. + +```{image} send_quotes/set-quantity.png +:align: center +:alt: The purple add and subtract buttons are used to set the quantity of an item. +``` + +Once all product quantities are set, click the {guilabel}`Back to Quotation` button to return to the +quotation. The items selected in the product catalog now appear in the {guilabel}`Order Lines` tab. + +## Preview and send quotation + +To see a preview of the quotation as the customer will see it, click the {guilabel}`Preview` button. +Doing so opens a preview in the {guilabel}`Customer Portal`. + +After reviewing the customer preview, click {guilabel}`Return to edit mode` to return to the +quotation form in the backend. + +When the quotation is ready to deliver to the customer, click the {guilabel}`Send by Email` button. + +Doing so opens a pop-up window with a pre-configured email message. Information from the quotation, +including the contact information, total cost, and quotation title are be imported from the +quotation. + +A PDF of the quotation is added as an attachment to the email. + +:::{note} +A pre-loaded template is used to create the email message. To alter the template, click the +internal link to the right of the {guilabel}`Load template` field, located at the bottom of the +email pop-up window. + +To select a new template, select an option from the {guilabel}`Load template` drop-down menu. +::: + +Proceed to make any necessary changes to the email, then click {guilabel}`Send`. A copy of the +message is added to the *Chatter* of the of the record. + +After a quotation is sent, the originating opportunity's {guilabel}`Quotations` smart button updates +with a new count. This quotation, and all other quotations can be accessed through this smart +button at the top of the opportunity in the *CRM* app. + +Any quotations attached to the opportunity that are confirmed, and have therefore been converted to +sales orders, will be deducted from the number listed on the {guilabel}`Quotations` smart button. +Instead, the value of the sales order will appear in the {guilabel}`Orders` smart button located in +the same control panel. + +## Mark an opportunity won or lost + +In order to keep the pipeline up to date and accurate, opportunities need to be identified as *won* +or *lost* once a customer has responded to a quotation. + +To mark an opportunity as *won* or *lost*, return to the opportunity using the breadcrumbs at the +top-left of the quotation form. Or navigate to {menuselection}`CRM app --> Sales --> My Pipeline` +and click on the correct opportunity to open it. + +At the top-left of the form, click on either the {guilabel}`Won` or {guilabel}`Lost` button. + +If the opportunity is marked *won*, a green {guilabel}`Won` banner is added to the record, and it is +moved to the {guilabel}`Won` stage. + +Marking an opportunity as *lost*, via the {guilabel}`Lost` button opens a {guilabel}`Mark Lost` +pop-up window, where a {guilabel}`Lost Reason` can be entered. + +From the {guilabel}`Lost Reason` drop-down field, choose an existing lost reason. If no applicable +reason is available, create a new one by entering it into the {guilabel}`Lost Reason` field, and +clicking {guilabel}`Create`. + +:::{tip} +It's best practice to try and use pre-configured {guilabel}`Lost Reason` values as much as +possible or to limit the creation of new values only to sales team leads. Using consistent values +for this parameter will make pipeline analysis easier and more accurate when filtering for the +{guilabel}`Lost Reason` parameter. + +To set up new values for this field, navigate to {menuselection}`CRM --> Configuration --> Lost +Reasons`, and click both {guilabel}`New` and {guilabel}`Save` for each new entry added to the +list. +::: + +Additional notes and comments can be added in the {guilabel}`Closing Note` field. + +When all the desired information has been entered in the {guilabel}`Mark Lost` pop-up window, click +{guilabel}`Mark as Lost`. + +Upon clicking {guilabel}`Mark as Lost`, the pop-up window disappears, and Odoo returns to the +opportunity form, where a new red {guilabel}`Lost` banner is now present in the upper-right corner +of the opportunity. + +Once an opportunity is marked as *lost*, it is no longer considered active, and it is removed from +the pipeline. + +In order to view a *lost* opportunity from the pipeline, click the {guilabel}`down arrow icon` to +the right of the search bar, and select either {guilabel}`Lost` or {guilabel}`Archived` from the +drop-down menu that appears. + +:::{important} +While opportunities that have been marked as *lost* are considered *Archived*, be advised that, +in order for an opportunity to be included as *lost* in reporting, it **must** be specifically +marked as *lost*, not *Archived*. +::: + diff --git a/content/applications/sales/crm/optimize.md b/content/applications/sales/crm/optimize.md new file mode 100644 index 000000000..1a07024be --- /dev/null +++ b/content/applications/sales/crm/optimize.md @@ -0,0 +1,15 @@ +--- +nosearch: true +--- + +# Optimize your Day-to-Day work + +```{toctree} +:titlesonly: true + +optimize/partner_autocomplete +optimize/gamification +optimize/utilize_activities +optimize/lead_enrichment +``` + diff --git a/content/applications/sales/crm/optimize/gamification.md b/content/applications/sales/crm/optimize/gamification.md new file mode 100644 index 000000000..3a9f9510e --- /dev/null +++ b/content/applications/sales/crm/optimize/gamification.md @@ -0,0 +1,160 @@ +# CRM Gamification + +In Odoo's *CRM* app, *gamification tools* provide the opportunity to evaluate and motivate users +through customizable challenges, goals, and rewards. Goals are created to target actions within the +*CRM* app, and can be tracked and rewarded automatically to participating sales teams. + +## Configuration + +To install the *CRM Gamification* module, navigate to the {menuselection}`Apps` application. Click +into the {guilabel}`Search...` bar at the top of the page and remove the {guilabel}`Apps` filter. +Type `CRM Gamification` to search. + +On the {guilabel}`CRM Gamification` module, click {guilabel}`Install`. This module features goals +and challenges related to the *CRM* and *Sales* applications. + +```{image} gamification/gamification-module-install.png +:align: center +:alt: View of the gamification module being installed in Odoo. +``` + +:::{note} +If **both** the *CRM* and *Sales* apps are installed, the *CRM Gamification* module is +automatically installed on the database. +::: + +To access the *Gamification Tools* menu, first enable {ref}`developer-mode`. + +Next, navigate to {menuselection}`Settings app --> Gamification Tools`. + +```{image} gamification/gamification-tools-menu.png +:align: center +:alt: View if the gamification tools menu in Odoo Settings. +``` + +(crm-create-rewards)= + +## Create badges + +*Badges* are awarded to users when they have completed a challenge. Different badges can be awarded +based on the type of task completed, and can be issued to more than one user, depending on the time +they accomplish the goal. + +To view the existing badges, or create a new one, navigate to {menuselection}`Settings --> +Gamification Tools --> Badges`. + +```{image} gamification/badges.png +:align: center +:alt: View of the badges page in Odoo. +``` + +:::{note} +Some badges can be awarded outside of challenges, as well. Select the Kanban card for the desired +badge, then click {guilabel}`Grant`. This opens a {guilabel}`Grant Badge` pop-up window. Select +a user from the {guilabel}`Who would you like to reward?` field. + +Add any additional information regarding why the user is receiving the reward in the field below, +then click {guilabel}`Grant Badge`. +::: + +To create a new badge, click {guilabel}`New` at the top-left of the page to open a blank form. +Enter a name for the {guilabel}`Badge`, followed by a description. + +The {guilabel}`Allowance to Grant` field determines when a badge can be granted, and by whom: + +- {guilabel}`Everyone`: this badge can be manually granted by any user. +- {guilabel}`A selected list of users`: this badge can only be granted by a select group of users. + If this option is selected, it generates a new field, {guilabel}`Authorized Users`. Choose the + appropriate users from this drop-down list. +- {guilabel}`People having some badges`: this badge can only be granted by users who have already + been awarded a specific badge. If this option is selected it generates a new field, + {guilabel}`Required Badges`. Use this drop-down list to select the badge(s) a user must have + before they can award this badge to others. +- {guilabel}`No one, assigned through challenges`: this badge cannot be manually granted, it can + only be awarded through challenges. + +To limit the number of badges a user can send, tick the {guilabel}`Monthly Limited Spending` +checkbox. This sets a limit on the number of times a user can grant this badge. In the +{guilabel}`Limitation Number` field, enter the maximum number of times this badge can be sent per +month, per person. + +```{image} gamification/create-badge.png +:align: center +:alt: The details page for a new badge. +``` + +(crm-create-challenge)= + +## Create a challenge + +To create a challenge, navigate to to {menuselection}`Settings --> Gamification Tools --> +Challenges`. Click {guilabel}`New` in the top-left corner to open a blank challenge form. + +At the top of the form, enter a {guilabel}`Challenge Name`. + +### Create assignment rules + +To assign the challenge to specific users, one or more assignment rules must be utilized. + +Click into the first field under {guilabel}`Assign Challenge to`, and select a parameter from the +drop-down list to define the rule. Then, click into the next field to define the rule's operator. If +necessary, click into the third field to further define the parameter. + +:::{tip} +To include all users with permissions in the *Sales* app, create a rule with the following +parameters: + +- {guilabel}`Groups` +- {guilabel}`is in` +- `Sales/User: Own Documents Only` + +```{image} gamification/assignation-rule.png +:align: center +:alt: View of the assignation rules section of a Challenge form. +``` +::: + +In the {guilabel}`Periodicity` field, select a time frame for goals to be automatically assessed. + +### Add goals + +Challenges can be based on a single goal, or can include multiple goals with different targets. To +add a goal to the challenge, click {guilabel}`Add a line` on the {guilabel}`Goals` tab. + +In the {guilabel}`Goal Definition` field, choose a goal from the drop-down list. The +{guilabel}`Condition` field automatically updates to reflect the condition set on the goal +definition. + +:::{tip} +The *CRM Gamification* module contains preconfigured goals geared towards salesteams: + +- {guilabel}`New Leads` +- {guilabel}`Time to Qualify a Lead` +- {guilabel}`Days to Close a Deal` +- {guilabel}`New Opportunities` +- {guilabel}`New Sales Orders` +::: + +Enter a {guilabel}`Target` for the goal based on the {guilabel}`Suffix`. + +Repeat these steps for each additional goal. + +```{image} gamification/challenge-goals.png +:align: center +:alt: The goals tab of a challenge form. +``` + +### Add rewards + +Next, click the {guilabel}`Reward` tab. Choose the {ref}`badges ` to be awarded +{guilabel}`For 1st User` and {guilabel}`For Every Succeeding User` by selecting them from the +drop-down lists. + +:::{note} +Badges are granted when a challenge is finished. This is either at the end of a running period, +at the end date of a challenge, or when the challenge is manually closed. +::: + +After setup is complete, click the {guilabel}`Start Challenge` button at the top-left of the page to +begin the challenge. + diff --git a/content/applications/sales/crm/optimize/lead_enrichment.md b/content/applications/sales/crm/optimize/lead_enrichment.md new file mode 100644 index 000000000..ed13a1e9f --- /dev/null +++ b/content/applications/sales/crm/optimize/lead_enrichment.md @@ -0,0 +1,130 @@ +# Lead enrichment + +*Lead enrichment* is a service that provides business information for a contact attached to a lead. +Lead enrichment is an In-App Purchase (IAP) that requires credits to use, and is available for +existing leads in an Odoo database. + +The information provided by lead enrichment 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`. + +:::{note} +Enterprise Odoo users with a valid subscription get free credits to test {abbr}`IAP (In-App +Purchase)` features before deciding to purchase more credits for the database. This includes +demo/training databases, educational databases, and one-app-free databases. +::: + +:::{important} +The *leads* feature **must** be activated in the *CRM* settings page in order to use lead +enrichment. To access the *CRM* settings, navigate to {menuselection}`CRM app --> Configuration +--> Settings`. Under the {guilabel}`CRM` section activate the {guilabel}`Leads` option and click +{guilabel}`Save`. +::: + +## Lead enrichment set up + +To set up lead enrichment in the *CRM* application, navigate to {menuselection}`CRM app --> +Configuration --> Settings`. Then, under the {guilabel}`Lead Generation` section, tick the checkbox +next to {guilabel}`Lead Enrichment`, and select either {guilabel}`Enrich leads on demand only` or +{guilabel}`Enrich all leads automatically`. Click the {guilabel}`Save` button to activate the +changes. + +```{image} lead_enrichment/lead-enrichment-activate.png +:align: center +:alt: |- +: CRM lead generation settings page, with lead enrichment activation highlighted, and enrich +: leads on demand only chosen. +``` + +## Enrich leads + +Enrichment of leads is based on the domain of the email address of the customer set on the lead. +There are two different ways that a lead can be enriched: *automatically* or *manually*. + +### Automatically enrich leads + +During set up, if {guilabel}`Enrich all leads automatically` was selected on the *CRM* +{guilabel}`Settings` page, then no action needs to be taken by the user to enrich the lead. A +scheduled action runs automatically, every sixty minutes, and enrichment occurs on leads, after a +remote database is contacted. + +:::{tip} +To access the cron that runs for the automatic lead enrichment, activate {ref}`developer mode +`, and navigate to {menuselection}`Settings app --> Technical menu --> Automation +section --> Scheduled Actions`. In the {guilabel}`Search...` bar, type in `CRM`. Click into the +result labeled {guilabel}`CRM: enrich leads (IAP)`, and make any necessary adjustments. In the +{guilabel}`Execute Every` field, enter a value greater than, or equal to, five minutes. +::: + +```{eval-rst} +.. example:: + The following is an example of lead enrichment data that has been autocompleted successfully: + + .. image:: lead_enrichment/lead-enrichment-data.png + :align: center + :alt: Chatter showing lead enrichment data. +``` + +### Manually enrich leads + +If the {guilabel}`Enrich leads on demand only` option was selected on the *CRM* {guilabel}`Settings` +page, when activating {guilabel}`Lead Enrichment`, each lead that a user wishes to enrich **must** +be manually enriched. This is achieved by clicking the {guilabel}`Enrich` button in the top menu of +the lead. + +The same information will be retrieved at the same {abbr}`IAP (In-App Puchase)` credit cost (one per +enrichment). This method of enrichment is useful when every lead does not need to be enriched, or +cost is an issue. + +```{image} lead_enrichment/manual-enrichment.png +:align: center +:alt: Manual enrich button feature highlighted on the CRM lead. +``` + +:::{tip} +Manually enrich leads in bulk using the *list* view. First, navigate to {menuselection}`CRM app +--> Leads`, and click the list view button ({guilabel}`☰ (three horizontal lines)` icon). Next, +tick the checkboxes for the leads that should be manually enriched. Finally, click the +{guilabel}`⚙️ Action` icon, and select {guilabel}`Enrich` from the resulting drop-down menu. This +can also be achieved from the *My Pipeline* page. To do so, simply open the *CRM* app, or +navigate to {menuselection}`CRM app --> Sales --> My Pipeline`. Either route reveals leads and +opportunities on the {guilabel}`Pipeline` page. +::: + +## Pricing + +Lead enrichment is an In-App Purchase (IAP) feature, and each enriched lead costs one credit. + +:::{note} +See here for full pricing information: [Lead Generation by Odoo IAP](https://iap.odoo.com/iap/in-app-services/273). +::: + +To buy credits, navigate to {menuselection}`CRM app --> Configuration --> Settings`. In the +{guilabel}`Lead Generation` section, under the {guilabel}`Lead Enrichment` feature, click on +{guilabel}`Buy Credits`. + +```{image} lead_enrichment/buy-lead-enrichment-credits-setting.png +:align: center +:alt: Buy credits from the lead enrichment settings. +``` + +Credits and balances may also be purchased by navigating to the {menuselection}`Settings app`. In +the {guilabel}`Contacts` section, under the {guilabel}`Odoo IAP` feature, click on {guilabel}`View +My Services`. + +```{image} lead_enrichment/view-my-services-setting.png +:align: center +:alt: Buy credits in the Odoo IAP settings. +``` + +:::{seealso} +{doc}`../../../essentials/in_app_purchase` +::: + +:::{important} +When collecting a company's contact information, make sure to be aware of the latest EU +regulations. For more information about General Data Protection Regulation, refer to: [Odoo GDPR](http://odoo.com/gdpr). +::: + diff --git a/content/applications/sales/crm/optimize/partner_autocomplete.md b/content/applications/sales/crm/optimize/partner_autocomplete.md new file mode 100644 index 000000000..0c1129483 --- /dev/null +++ b/content/applications/sales/crm/optimize/partner_autocomplete.md @@ -0,0 +1,88 @@ +# Enrich contacts with partner autocomplete + +*Partner autocomplete* enriches the contacts database with corporate data. In any module, enter the +new company name into the {guilabel}`Customer` field (`partner_id` technical field), and select one +of the companies suggested in the drop-down menu. Instantly get valuable company information full of +hard-to-find data for a desired company. + +:::{important} +A company **cannot** already be manually entered in the *Contacts* application prior to enriching +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`. + +:::{important} +When getting a company's contact information make sure to be aware of the latest EU regulations. +For more information about General Data Protection Regulation refer to: [Odoo GDPR](http://odoo.com/gdpr). In Odoo, individual contact information cannot be searched for with +the partner autocomplete feature. +::: + +## Configuration + +Go to {menuselection}`Settings app --> Contacts section`. Then, activate the {guilabel}`Partner +Autocomplete` feature, by ticking the checkbox beside it, and clicking {guilabel}`Save`. + +```{image} partner_autocomplete/settings-partner-autocomplete.png +:align: center +:alt: View of settings page and the activations of the feature in Odoo. +``` + +## Enrich contacts with corporate data + +From any module, as the user is typing in the name of a new company contact, Odoo reveals a large +drop-down menu of potential match suggestions. If any are selected, the contact is then populated +with corporate data related to that specific selection. + +For example, after typing `Odoo`, the following information populates: + +```{image} partner_autocomplete/odoo-autocomplete.png +: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. +::: + +## Pricing + +*Partner Autocomplete* is an *In-App Purchase (IAP)* service, which requires prepaid credits to be +used. Each request consumes one credit. + +To buy credits, go to {menuselection}`Settings app --> Contacts section`. Then, locate either the +{guilabel}`Partner Autocomplete` feature and click {guilabel}`Buy credits`, or locate the +{guilabel}`Odoo IAP` feature and click {guilabel}`View My Services`. From the resulting page, select +a desired package. + +:::{note} +If the database runs out of credits, the only information populated when clicking on the +suggested company will be the website link and the logo. + +Learn about our [Privacy Policy](https://iap.odoo.com/privacy). +::: + +:::{note} +Enterprise Odoo users with a valid subscription get free credits to test {abbr}`IAP (In-App +Purchase)` features before deciding to purchase more credits for the database. This includes +demo/training databases, educational databases, and one-app-free databases. +::: + +:::{seealso} +{doc}`../../../essentials/in_app_purchase` +::: + diff --git a/content/applications/sales/crm/optimize/utilize_activities.md b/content/applications/sales/crm/optimize/utilize_activities.md new file mode 100644 index 000000000..2efc45e26 --- /dev/null +++ b/content/applications/sales/crm/optimize/utilize_activities.md @@ -0,0 +1,258 @@ +# Utilize activities for sales teams + +*Activities* are follow-up tasks tied to a record in an *Odoo* database. Activities can be scheduled +on any page of the database that contains a chatter thread, Kanban view, list view, or activities +view of an application. + +:::{figure} utilize_activities/activities-view.png +:align: center +:alt: The summary view of activities for leads and opportunities in an Odoo database. + +Planned Activities for Leads and Opportunities. +::: + +## Activity types + +A set of preconfigured activity types is available in the *CRM* app. To view the list of available +activity types, navigate to the {menuselection}`CRM app --> Configuration --> Activity Types`. + +:::{note} +Additional activity types are available within the database, and can be utilized through +different applications. To access the complete list of activity types, go to the +{menuselection}`Settings app`, then scroll to the {guilabel}`Discuss` section, and click +{guilabel}`Activity Types`. +::: + +The preconfigured activity types for the *CRM* app are as follows: + +> - {guilabel}`Email`: adds a reminder to the chatter that prompts the salesperson to send an email. +> - {guilabel}`Call`: opens a calendar link where the salesperson can schedule time to call the +> contact. +> - {guilabel}`Meeting`: opens a calendar link where the salesperson can schedule time to have a +> meeting with the contact. +> - {guilabel}`To Do`: adds a general reminder task to the chatter. +> - {guilabel}`Upload Document`: adds a link on the activity where an external document can be +> uploaded. Note that the *Documents* app is **not** required to utilize this activity type. + +:::{note} +If other applications are installed, such as *Sales* or *Accounting*, other activity types are +made available in the *CRM* app. +::: + +(crm-create-new-activity-type)= + +### Create a new activity type + +To create a new activity type, click {guilabel}`New` at the top-left of the page to open a blank +form. + +At the top of the form, start by choosing a {guilabel}`Name` for the new activity type. + +#### Activity settings + +##### Action + +The *Action* field specifies the intent of the activity. Some actions trigger specific behaviors +after an activity is scheduled. + +- If {guilabel}`Upload Document` is selected, a link to upload a document is added directly to the + planned activity in the chatter. +- If either {guilabel}`Phonecall` or {guilabel}`Meeting` are selected, users have the option to open + their calendar to schedule a time for this activity. +- If {guilabel}`Request Signature` is selected, a link is added to the planned activity in the + chatter that opens a signature request pop-up window. + +```{image} utilize_activities/action-field.png +:align: center +:alt: The Activity settings on a new activity type with emphasis on the Action field. +``` + +:::{note} +The actions available to select on an activity type vary, depending on the applications currently +installed in the database. +::: + +##### Default user + +To automatically assign this activity to a specific user when this activity type is scheduled, +choose a name from the {guilabel}`Default User` drop-down menu. If this field is left blank, the +activity is assigned to the user who creates the activity. + +##### Default summary + +To include notes whenever this activity type is created, enter them into the {guilabel}`Default +Summary` field. + +:::{note} +The information in the {guilabel}`Default User` and {guilabel}`Default Summary` fields are +included when an activity is created. However, they can be altered before the activity is +scheduled or saved. +::: + +#### Next activity + +To automatically suggest, or trigger, a new activity after an activity has been marked complete, the +{guilabel}`Chaining Type` must be set. + +##### Suggest next activity + +In the {guilabel}`Chaining Type` field, select {guilabel}`Suggest Next Activity`. Upon doing so, the +field underneath changes to: {guilabel}`Suggest`. Click the {guilabel}`Suggest` field drop-down menu +to select any activities to recommend as follow-up tasks to this activity type. + +```{image} utilize_activities/next-activity.png +:align: center +:alt: The Next Activity section on a new activity type form. +``` + +In the {guilabel}`Schedule` field, choose a default deadline for these activities. To do so, +configure a desired number of {guilabel}`Days`, {guilabel}`Weeks`, or {guilabel}`Months`. Then, +decide if it should occur {guilabel}`after completion date` or {guilabel}`after previous activity +deadline`. + +This {guilabel}`Schedule` field information can be altered before the activity is scheduled. + +When all configurations are complete, click {guilabel}`Save`. + +:::{note} +If an activity has the {guilabel}`Chaining Type` set to {guilabel}`Suggest Next Activity`, and +has activities listed in the {guilabel}`Suggest` field, users are presented with recommendations +for activities as next steps. + +```{image} utilize_activities/suggest-next-activity.png +:align: center +:alt: A schedule activity pop-up with emphasis on the recommended activities. +``` +::: + +##### Trigger next activity + +Setting the {guilabel}`Chaining Type` to {guilabel}`Trigger Next Activity` immediately launches the +next activity once the previous one is completed. + +If {guilabel}`Trigger Next Activity` is selected in the {guilabel}`Chaining Type` field, the field +beneath changes to: {guilabel}`Trigger`. From the {guilabel}`Trigger` field drop-down menu, select +the activity that should be launched once this activity is completed. + +In the {guilabel}`Schedule` field, choose a default deadline for these activities. To do so, +configure a desired number of {guilabel}`Days`, {guilabel}`Weeks`, or {guilabel}`Months`. Then, +decide if it should occur {guilabel}`after completion date` or {guilabel}`after previous activity +deadline`. + +This {guilabel}`Schedule` field information can be altered before the activity is scheduled. + +When all configurations are complete, click {guilabel}`Save`. + +:::{note} +When an activity has the {guilabel}`Chaining Type` set to {guilabel}`Trigger Next Activity`, +marking the activity as *Done* immediately launches the next activity listed in the +{guilabel}`Trigger` field. +::: + +## Activity tracking + +To keep the pipeline up to date with the most accurate view of the status of activities, as soon as +a lead is interacted with, the associated activity should be marked as *Done*. This ensures the next +activity can be scheduled as needed. It also prevents the pipeline from becoming cluttered with +past due activities. + +The pipeline is most effective when it is kept up-to-date and accurate to the interactions it is +tracking. + +(crm-activity-plans)= + +## Activity plans + +*Activity plans* are preconfigured sequences of activities. When an activity plan is launched, every +activity in the sequence is scheduled automatically. + +To create a new plan, navigate to {menuselection}`CRM app --> Configuration --> Activity Plan`. +Click {guilabel}`New` at the top-left of the page to open a blank {guilabel}`Lead Plans` form. + +Enter a name for the new plan in the {guilabel}`Plan Name` field. On the {guilabel}`Activities to +Create` tab, click {guilabel}`Add a line` to add a new activity. + +Select an {guilabel}`Activity Type` from the drop-down menu. Click {guilabel}`Search More` to see a +complete list of available activity types, or to create a {ref}`new one +`. + +Next, in the {guilabel}`Summary` field, enter any details to describe the specifics of the activity, +including instructions for the salesperson or information due upon the completion of the activity. +The contents of this field are included with the scheduled activity, and can be edited later. + +In the {guilabel}`Assignment` field, select one of the following options: + +> - {guilabel}`Ask at launch`: activities are assigned to a user when the plan is scheduled. +> - {guilabel}`Default user`: activities are always assigned to a specific user. + +If {guilabel}`Default user` is selected in the {guilabel}`Assignment` field, choose a user in the +{guilabel}`Assigned to` field. + +:::{tip} +> Activity plans can feature activities that are assigned to default users and users assigned at +> the plan launch. + +```{image} utilize_activities/create-activity-plan.png +:align: center +:alt: A Lead Plan form with scheduled activities. +``` +::: + +Next, configure the timeline for the activity. Activities can be scheduled to occur either before +the plan date or after. Use the {guilabel}`Interval` and {guilabel}`Units` fields to set the +deadline for this activity. Lastly, in the {guilabel}`Trigger` field, select whether the activity +should occur before or after the plan date. + +```{eval-rst} +.. example:: + An activity plan is created to handle high priority leads. Specifically, these leads should be + contacted quickly, with a meeting scheduled within two days of the initial contact. The plan is + configured with the following activities: + + - Email two days **before** plan date + - Meeting zero days **before** plan date + - Make quote three days **after** plan date + - Upload document three days **after** plan date + - Follow-up five days **after** plan date + + This sets the *plan date* as the meeting deadline, which is the objective of the plan. Before + that date, there is lead time to contact the customer and prepare for the meeting. After that + date, the salesperson has time to create a quote, upload the document, and follow-up. +``` + +Repeat these steps for each activity included in the plan. + +### Launch an activity plan + +To launch an activity plan on a *CRM* opportunity, navigate to {menuselection}`CRM app` and click on +the Kanban card of an opportunity to open it. + +At the top-right of the chatter, click {guilabel}`Activities` to open the {guilabel}`Schedule +Activity` pop-up window. + +In the {guilabel}`Plan` field, select the desired activity plan to launch. This generates a +{guilabel}`Plan summary`, listing out the activities included in the plan. Select a {guilabel}`Plan +Date` using the calendar popover. This updates the {guilabel}`Plan summary` with deadlines based on +the intervals configured on the {ref}`activity plan `. + +Select a user in the {guilabel}`Assigned To` field. This user is assigned to any of the activities +on the plan were configured with {guilabel}`Ask at launch` in the {guilabel}`Assignment` field. + +```{image} utilize_activities/schedule-activity-plan.png +:align: center +:alt: The schedule activity pop-up window with an Activity plan selected. +``` + +Click {guilabel}`Schedule`. + +The details of the plan are added to the chatter, in addition to each of the activities. + +```{image} utilize_activities/activity-plan-chatter.png +:align: center +:alt: The chatter thread of a CRM opportunity with a launched activity plan. +``` + +:::{seealso} +- {doc}`Activities ` +::: + diff --git a/content/applications/sales/crm/performance.md b/content/applications/sales/crm/performance.md new file mode 100644 index 000000000..2e3d107d1 --- /dev/null +++ b/content/applications/sales/crm/performance.md @@ -0,0 +1,14 @@ +--- +nosearch: true +--- + +# Analyze performance + +```{toctree} +:titlesonly: true + +performance/win_loss +performance/expected_revenue_report +performance/forecast_report +``` + diff --git a/content/applications/sales/crm/performance/expected_revenue_report.md b/content/applications/sales/crm/performance/expected_revenue_report.md new file mode 100644 index 000000000..aeedfb9d3 --- /dev/null +++ b/content/applications/sales/crm/performance/expected_revenue_report.md @@ -0,0 +1,215 @@ +# Expected revenue report + +*Expected revenue* is the total cash value of leads that are expected to close by a certain date, +usually the end of the current month. + +An *expected revenue report* compiles all active leads in a sales pipeline that have a set expected +closing date, and compares how sales teams are performing in a given time frame. + +```{image} expected_revenue_report/expected-revenue-closing.png +:align: center +:alt: Close up of the expected closing date on a lead in the CRM app. +``` + +By pulling a monthly expected revenue report, sales managers can see which team members are reaching +their goals, and who may need additional assistance to close valuable deals. + +## Create an expected revenue report + +To create an expected revenue report, first navigate to {menuselection}`CRM app --> Reporting --> +Pipeline`. This opens the {guilabel}`Pipeline Analysis` dashboard. + +:::{important} +The *Pipeline Analysis* dashboard includes several filters in the search bar by default. Remove +these before adding any additional custom filters. +::: + +On the top-left of the report, click {guilabel}`Measures`, then select {guilabel}`Expected Revenue` +from the drop-down menu. + +At the top of the page, click the {guilabel}`🔻(triangle pointed down)` icon to the right of the +{guilabel}`Search...` bar to open the drop-down menu that contains {guilabel}`Filters`, +{guilabel}`Group By`, and {guilabel}`Favorites` columns. Under the {guilabel}`Filters` column, click +{guilabel}`Add Custom Filter`, which opens an {guilabel}`Add Custom Filter` pop-up window. + +(expected-revenue-report-custom-filters)= + +### Add custom filters + +In order to generate an expected revenue report, filters need to be created for the following +conditions: + +> - {ref}`Expected closing date `: limits results to only +> include leads expected to close within a specific time frame. +> - {ref}`Exclude unassigned leads `: excludes leads +> without an assigned salesperson. +> - {ref}`Specific sales teams `: limits results to only include +> leads assigned to one or more sales teams. This filter is optional and should not be included if +> the report is intended for the entire company. + +(expected-revenue-report-closing-date)= + +#### Add filter for expected closing date + +On the {guilabel}`Add Custom Filter` pop-up window, click into the first field of the new rule. +Type `Expected Closing` into the {guilabel}`Search...` bar, or scroll to select it from the list. +Click in the second field and select {guilabel}`is set`. This limits the results to only include +leads where an estimated closing date is listed. + +Next, click the {guilabel}`➕ (plus)` icon to the right of the rule to duplicate it. + +:::{tip} +Using the {guilabel}`➕ (plus)` icon makes it easy to add multiple rules based on the same +filter. +::: + +In the second field of the new rule, select {guilabel}`is between` from the drop-down menu. This +creates a set time frame during which the expected closing date must occur for leads to be included +in the results. + +Click in each date field, one at a time, and use the calendar popover window to add both a start and +end date to the rule. This is usually the beginning and ending of the current month, or fiscal +quarter. + +(expected-revenue-report-unassigned-leads)= + +#### Exclude unassigned leads + +After filtering for the expected closing date, add a {guilabel}`New Rule`. Then, click into the new +rule's first field, and type `Salesperson` in the {guilabel}`Search...` bar, or scroll through the +list to select it. Click in the rule's second field and select {guilabel}`is set` from the drop-down +menu. This excludes any results without an assigned salesperson. + +(expected-revenue-report-sales-team)= + +#### Add a filter for sales teams + +:::{note} +This filter is optional. To view results for the entire company, do **not** add this filter, and +continue to {ref}`View results `. +::: + +To limit the results of the report to one or more sales teams, click {guilabel}`New Rule`. Next, +click the first field for the new rule, and type `Sales Team` in the {guilabel}`Search...` bar, or +scroll to search through the list to locate it. + +In the rule's second field, select {guilabel}`is in` from the drop-down menu. Selecting this +operator limits results to the sales teams indicated in the next field. + +Lastly, click into the third field, and either: make a selection from the complete list revealed in +the popover menu, or type the first few characters of the specific sales team's title to quickly +find and select it as a parameter. + +:::{tip} +Multiple teams can be added to the `Sales Team` rule, where each parameter is treated with an +"or" (e.g. "any") operator in the search logic. +::: + +```{image} expected_revenue_report/custom-filters.png +:align: center +:alt: |- +: Add Custom Filters pop-up window with custom filters configured for expected revenue +: report. +``` + +(expected-revenue-report-view-results)= + +## View results + +At the top of the {guilabel}`Add Custom Filter` form, there is an option to match {guilabel}`any` or +{guilabel}`all` of the rules. In order to properly run the report, only records that match **all** +of the following filters should be included. Before adding the filters, make sure {guilabel}`all` is +selected in this field. + +```{image} expected_revenue_report/match-all-filters.png +:align: center +:alt: Emphasis on the match all filters option on the Add Custom Filter pop-up window. +``` + +At the bottom of the {guilabel}`Add Custom Filter` form, click {guilabel}`Add`. + +### View options + +The expected revenue report benefits from utilizing multiple views. The default graph view can be +used to identify which salespeople are expected to bring in the most revenue, while the list view +and pivot view provide more detail on specific deals. + +```{eval-rst} +.. tabs:: + + .. tab:: Graph view + + The *graph view* is used to visualize data, and is beneficial in identifying patterns and + trends. + + *Bar charts* are used to show the distribution of data across several categories or among + several salespeople. + + *Line charts* are useful to show changing trends over a period of time. + + *Pie charts* are useful to show the distribution, or comparison, of data among a small number + of categories or salespeople, specifically how they form the meaningful part of a whole + picture. + + The default view for the expected revenue report is the bar chart, stacked. To change to a + different graph view, click one of the icons at the top-left of the report. While both the + line chart and bar chart are available in stacked view, the pie chart is not. + + .. figure:: expected_revenue_report/graph-view-icons.png + :align: center + :alt: Close up view of the graph icons on the Pipeline analysis report in the CRM app. + + Graph view icons in order: bar chart, line chart, pie chart, stacked. + + .. tab:: List view + + The *list view* provides a list of all leads that are expected to close by the designated + date. Clicking on a lead in list view opens the record for detailed analysis, but many + insights can be gleaned from the basic view. + + To switch to the list view, click the :guilabel:`≣ (list)` icon at the top-right of the + report. + + .. image:: expected_revenue_report/list-icon.png + :align: center + :alt: Close up of the list view icon in the CRM app. + + To add additional metrics to the report, click the *additional options menu* indicated by the + :guilabel:`toggle` icon at the top-right of the list. + + .. figure:: expected_revenue_report/toggle-icon.png + :align: center + :alt: Close up of the toggle icon in the CRM app. + + Clicking the toggle icon in *list view* opens the *additional options menu*. + + Select any additional metrics from the drop-down menu to add them to the list view. Some + options that may be useful are :guilabel:`Expected Closing` and :guilabel:`Probability`. + + .. tab:: Pivot view + + The *pivot view* arranges all leads that are expected to close by the designated date into a + dynamic table. + + To switch to the pivot view, click the :guilabel:`Pivot` icon at the top-right of the report. + + .. image:: expected_revenue_report/pivot-view-icon.png + :align: center + :alt: Close up of the pivot view icon in the CRM app. + + When the pivot view is selected for this report, the X-axis lists the stages in + the pipeline, while the Y-axis defaults to group the results by their creation date. To switch + these groupings, click the flip access icon (:guilabel:`⇄`) at the top of the report. + + To add additional measures to the report, click the :guilabel:`Measures` button at the + top-left of the report. Select any additional metrics from the drop-down menu. + + To add a group to a row or column to the pivot view, click the :guilabel:`➕ (plus sign)` next + to :guilabel:`Total`, and then select one of the groups. To remove one, click the + :guilabel:`➖ (minus sign)` and de-select the appropriate option. + + Click :guilabel:`Insert in Spreadsheet` to add the pivot view into an editable spreadsheet + format within the *Dashboards* app. If the Odoo *Documents* app is installed, the report can + be inserted into a blank or existing spreadsheet, and exported. +``` + diff --git a/content/applications/sales/crm/performance/forecast_report.md b/content/applications/sales/crm/performance/forecast_report.md new file mode 100644 index 000000000..4853c6df8 --- /dev/null +++ b/content/applications/sales/crm/performance/forecast_report.md @@ -0,0 +1,116 @@ +--- +substitutions: + caret: '{icon}`fa-caret-down` {guilabel}`(down)` icon' + list: '{icon}`oi-view-list` {guilabel}`(list)` icon' + pivot: '{icon}`oi-view-pivot` {guilabel}`(pivot)` icon' +--- + +# Forecast report + +The *Forecast* report in the *CRM* app allows users to view upcoming opportunities and build a +forecast of potential sales. Opportunities are grouped by the month of their expected closing date, +and can be dragged-and-dropped to adjust the deadline. + +To access the *Forecast* report, navigate to {menuselection}`CRM app --> Reporting --> Forecast`. + +## Navigate the forecast report + +The default {guilabel}`Forecast` report includes opportunities assigned to the current user's +pipeline, and are expected to close within four months. It also shows opportunities without an +assigned expected closing date. The opportunities are grouped by month in a {icon}`oi-view-kanban` +{guilabel}`(Kanban)` view. + +```{image} forecast_report/sample-report.png +:align: center +:alt: A sample version of the Forecast report in the CRM app. +``` + +### Expected closing date + +Opportunities are grouped by the date assigned in the *Expected Closing* field on an opportunity +form. To change this date directly from the {guilabel}`Forecast` page, select the Kanban card for +the desired opportunity, then click and drag the card to the desired column. + +:::{note} +The default time frame for the forecast is *month*. This can be changed by clicking the {{ caret }} +next to the {guilabel}`Search...` bar at the top of the report. Under the {guilabel}`Group By` +heading in the resulting drop-down menu, click {guilabel}`Expected Closing` to expand the list of +available options, and select a desired amount of time from the list. +::: + +After an opportunity is added to a new month, the *Expected Closing* field on the opportunity form +is updated to the *last* date of the new month. + +:::{tip} +The *Expected Closing* field can also be manually updated on the opportunity card. To do that, +click on the Kanban card for an opportunity on the {guilabel}`Forecast` page to open the +opportunity's detail form. Click in the {guilabel}`Expected Closing` field, and use the calendar +popover to select a new closing date. +::: + +### Prorated revenue + +At the top of the column for each month on the {guilabel}`Forecast` reporting page, to the right of +the progress bar, is a sum of the prorated revenue for that time frame. + +The prorated revenue is calculated using the formula below: + +$$ +\text{Expected Revenue} \times \text{Probability} = \text{Prorated Revenue} +$$ + +As opportunities are moved from one column to another, the column's revenue is automatically updated +to reflect the change. + +```{eval-rst} +.. example:: + A forecast report for June includes two opportunities: + + The first opportunity, `Global Solutions`, has an expected revenue of `$3,800`, and a probability + of `90%`. This results in a prorated revenue of `$3,420`. + + The second opportunity, `Quote for 600 Chairs`, has an expected revenue of `$22,500`, and a + probability of `20%`. This results in a prorated revenue of `$4,500`. + + The combined prorated revenue of the opportunities is `$7,920`, which is listed at the top of the + column for the month. + + .. image:: forecast_report/example-revenue.png + :align: center + :alt: An example of the prorated revenue for one month of the forecast report. +``` + +:::{seealso} +For more information on how probability is assigned to opportunities, see +{doc}`../track_leads/lead_scoring` +::: + +## View results + +Click the {icon}`fa-area-chart` {guilabel}`(area chart)` icon to change to graph view. Then, click +the corresponding icon at the top of the report to switch to a {icon}`fa-bar-chart` {guilabel}`(bar +chart)`, {icon}`fa-line-chart` {guilabel}`(line chart)`, or {icon}`fa-pie-chart` {guilabel}`(pie +chart)`. + +```{image} forecast_report/pie-chart-view.png +:align: center +:alt: A pie chart view of the Forecast report. +``` + +Click the {{ pivot }} to change to the pivot view, or the {{ list }} to change to the list view. + +:::{tip} +The {ref}`pivot view ` can be used to view and analyze data in a more +in-depth manner. Multiple measures can be selected, and data can be viewed by month, and by +opportunity stage. + +```{image} forecast_report/pivot-view.png +:align: center +:alt: A sample of the forecast report in the pivot view. +``` +::: + +:::{seealso} +To save this report as a *favorite*, see {ref}`search/favorites`. +::: + diff --git a/content/applications/sales/crm/performance/win_loss.md b/content/applications/sales/crm/performance/win_loss.md new file mode 100644 index 000000000..27fe07e7a --- /dev/null +++ b/content/applications/sales/crm/performance/win_loss.md @@ -0,0 +1,682 @@ +# Pipeline Analysis + +The *CRM* app manages the sales pipeline as leads/opportunities move from stage to stage, +origination to sale (**Won**) or archival (**Lost**). + +After organizing the pipeline, use the search options and reports available on the *Pipeline +Analysis* page to gain insight into the effectiveness of the pipeline and its users. + +To access the *Pipeline Analysis* page, go to {menuselection}`CRM app --> Reporting --> Pipeline`. + +```{image} win_loss/reporting-tab-and-pipeline-view.png +:align: center +:alt: Open the CRM app and click on the Reporting tab along the top, then click Pipeline. +``` + +(win-loss-pipeline)= + +## Navigate the pipeline analysis page + +Upon accessing the {guilabel}`Pipeline Analysis` page, a bar graph showcasing the leads from the +past year automatically populates. The bars represent the number of leads in each stage of the sales +pipeline, color-coded to show the month the lead reached that stage. + +```{image} win_loss/pipeline-analysis-page.png +:align: center +:alt: The default state of the Pipeline Analysis page is a graph, with many options +: to change it. +``` + +The interactive elements of the {guilabel}`Pipeline Analysis` page manipulate the graph to report +different metrics in several views. From left-to-right, top-to-bottom, the elements include: + +- {guilabel}`Actions`: represented by the {guilabel}`⚙️ (gear)` icon, located next to the + {guilabel}`Pipeline Analysis` page title. When clicked, a drop-down menu appears with three + options, each with their own sub-menu: {guilabel}`Knowledge`, {guilabel}`Dashboard`, + {guilabel}`Spreadsheet`. (See {ref}`Save and share reports ` for more + information) + + - The {guilabel}`Knowledge` option is for linking to or inserting the graph in a *Knowledge* app + article. + - The {guilabel}`Dashboard` option is for adding the graph to a dashboard in the *Dashboards* app. + - The {guilabel}`Spreadsheet` option is for linking the graph in a spreadsheet in the *Documents* + app. + +- {guilabel}`Search...` bar: shows the filters and groupings currently being applied to the graph. + To add new filters/groups, type them into the search bar, or click the {guilabel}`⬇️ (down arrow)` + icon, at the end of the bar, to open a drop-down menu of options. (See {ref}`Search Options + ` for more information) + +In the upper-right corner, there are view options represented by different icons. (See {ref}`View +Options ` for more information) + +- {guilabel}`Graph` view: displays the data in a bar graph. This is the default view. +- {guilabel}`Pivot` view: displays the data in a customizable, categorized metrics table. +- {guilabel}`Cohort` view: displays and organizes the data, based on their {guilabel}`Created on` + and {guilabel}`Closed Date` week (default), day, month, or year. +- {guilabel}`List` view: displays the data in a list. + +Located on the far-left side of the page, beneath the {guilabel}`Pipeline Analysis` page title, +there are more configurable filter and view options. + +- {guilabel}`Measures`: opens a drop-down menu of different measurement options that can be seen in + the graph, pivot, or cohort view. The {guilabel}`Measure` drop-down menu is not available in the + list view. (See {ref}`Measurement Options ` for more information) +- {guilabel}`Insert in Spreadsheet`: opens a pop-up window with options for adding a graph or pivot + table to a spreadsheet in the *Documents* app or a dashboard in the *Dashboards* app. This option + is not available in the cohort or list view. + +With the graph view selected, the following options are available: + +- {guilabel}`Bar Chart`: switches the graph to a bar chart. +- {guilabel}`Line Chart`: switches the graph to a line chart. +- {guilabel}`Pie Chart`: switches the graph to a pie chart. +- {guilabel}`Stacked`: when selected, the results of each stage of the graph are stacked on top of + each other. When not selected, the results in each stage are shown as individual bars. +- {guilabel}`Descending`: re-orders the stages in the graph in descending order from left-to-right. + Click the icon a second time to deselect it. Depending on the search criteria, this option may not + be available. +- {guilabel}`Ascending`: re-orders the stages in the graph in ascending order from left-to-right. + Click the icon a second time to deselect it. Depending on the search criteria, this option may not + be available. + +With the pivot view selected, the following options are available: + +- {guilabel}`Flip Axis`: flips the X and Y axis for the entire table. +- {guilabel}`Expand All`: when additional groupings are selected using the {guilabel}`➕ (plus + sign)` icons, this button opens those groupings under every row. +- {guilabel}`Download xlsx`: downloads the table as an Excel file. + +(win-loss-search)= + +### Search options + +The {guilabel}`Pipeline Analysis` page can be customized with various filters and grouping options. + +To add new search criteria, type the desired criteria into the search bar, or click the +{guilabel}`⬇️ (down arrow)` icon, next to the search bar, to open a drop-down menu of all options. +See the sections below for more information on what each option does. + +```{image} win_loss/search-panel-filters-and-group-by-options.png +:align: center +:alt: Clicking on the down arrow next to the search bar opens a menu of filters for +: the analysis. +``` + +```{eval-rst} +.. tabs:: + + .. tab:: Filters + + The :guilabel:`Filters` section allows users to add pre-made and custom filters to the search + criteria. Multiple filters can be added to a single search. + + - :guilabel:`My Pipeline`: show leads assigned to the current user. + - :guilabel:`Opportunities`: show leads that have been qualified as opportunities. + - :guilabel:`Leads`: show leads that have yet to be qualified as opportunities. + - :guilabel:`Active`: show active leads. + - :guilabel:`Inactive`: show inactive leads. + - :guilabel:`Won`: show leads that have been marked **Won**. + - :guilabel:`Lost`: show leads that have been marked **Lost**. + - :guilabel:`Created On`: show leads that were created during a specific period of time. By + default, this is the past year, but it can be adjusted as needed, or removed entirely. + - :guilabel:`Expected Closing`: show leads that are expected to close (marked **Won**) during + a specific period of time. + - :guilabel:`Date Closed`: show leads that were closed (marked **Won**) during a specific + period of time. + - :guilabel:`Archived`: show leads that have been archived (marked **Lost**). + - :guilabel:`Add Custom Filter`: allows the user to create a custom filter with numerous + options. (See :ref:`Add Custom Filters and Groups ` for more + information) + + .. tab:: Group By + + The :guilabel:`Group By` section allows users to add pre-made and custom groupings to the + search results. Multiple groupings can be added to split results into more manageable chunks. + + .. important:: + The order that groupings are added affects how the final results are displayed. Try + selecting the same combinations in a different order to see what works best for each use + case. + + - :guilabel:`Salesperson`: groups the results by the Salesperson to whom a lead is assigned. + - :guilabel:`Sales Team`: groups the results by the Sales Team to whom a lead is assigned. + - :guilabel:`City`: groups the results by the city from which a lead originated. + - :guilabel:`Country`: groups the results by the country from which a lead originated. + - :guilabel:`Company`: groups the results by the company to which a lead belongs (if multiple + companies are activated in the database). + - :guilabel:`Stage`: groups the results by the stages of the sales pipeline. + - :guilabel:`Campaign`: groups the results by the marketing campaign from which a lead + originated. + - :guilabel:`Medium`: groups the results by the medium (Email, Google Adwords, Website, etc.) + from which a lead originated. + - :guilabel:`Source`: groups the results by the source (Search engine, Lead Recall, + Newsletter, etc.) from which a lead originated. + - :guilabel:`Creation Date`: groups the results by the date a lead was added to the database. + - :guilabel:`Conversion Date`: groups the results by the date a lead was converted to an + opportunity. + - :guilabel:`Expected Closing`: groups the results by the date a lead is expected to close + (marked "Won"). + - :guilabel:`Closed Date`: groups the results by the date a lead was closed(marked "Won"). + - :guilabel:`Lost Reason`: groups the results by the reason selected when a lead was marked + "Lost." + - :guilabel:`Add Custom Group`: allows the user to create a custom group with numerous + options. (See :ref:`Adding Custom Filters and Groups ` for more + information) + + .. tab:: Comparison + + The :guilabel:`Comparison` section allows users to add comparisons to the same search criteria + over another period of time. + + This option is only available if the search includes time-based filters, such as + :guilabel:`Created On`, :guilabel:`Expected Closing`, or :guilabel:`Date Closed`. While + multiple time-based filters can be added at once, only one comparison can be selected at a + time. + + - :guilabel:`Previous Period`: adds a comparison to the same search criteria from the previous + period. + - :guilabel:`Previous Year`: adds a comparison to the same search criteria from the previous + year. + + .. tab:: Favorites + + The :guilabel:`Favorites` section allows users to save a search for later, so it does not need + to be recreated every time. + + Multiple searches can be saved, shared with others, or even set as the default for whenever + the :guilabel:`Pipeline Analysis` page is opened. + + - :guilabel:`Save current search`: save the current search criteria for later. + + - :guilabel:`Default filter`: when saving a search, check this box to make it the default + search filter when the :guilabel:`Pipeline Analysis` page is opened. + - :guilabel:`Shared`: when saving a search, check this box to make it available to other + users. +``` + +(win-loss-custom-filters)= + +#### Add custom filters and groups + +In addition to the pre-made options in the search bar, the {guilabel}`Pipeline Analysis` page can +also utilize custom filters and groups. + +Custom filters are complex rules that further customize the search results, while custom groups +display the information in a more organized fashion. + +**To add a custom filter:** + +1. On the {guilabel}`Pipeline Analysis` page, click the {guilabel}`down arrow` icon next to the + {guilabel}`Search...` bar. + +2. In the drop-down menu, click {guilabel}`Add Custom Filter`. + +3. The {guilabel}`Add Custom Filter` pop-up window appears with a default rule ({guilabel}`Country + is in _____`) comprised of three unique fields. These fields can be edited to make a custom rule, + and multiple rules can be added to a single custom filter. + +4. To edit a rule, start by clicking the first field ({guilabel}`Country`), and select an option + from the drop-down menu. The first field determines the primary subject of the rule. + +5. Next, click the second field, and select an option from the drop-down menu. The second field + determines the relationship of the first and third fields, and is usually an **is** or **is not** + statement, but can also be **greater than or less than** statements, and more. + +6. Finally, click the third field, and select an option from the drop-down menu. The third field + determines the secondary subject of the rule. + +7. With all three fields selected, the rule is complete. + + - **To add more rules:** click {guilabel}`New Rule` and repeat steps 4-7, as needed. + - **To delete a rule:** click the {guilabel}`🗑️ (trash)` icon to the right of the rule. + - **To duplicate an existing rule:** click the {guilabel}`➕ (plus sign)` icon to the right of + the rule. + - **To create more complex rules:** click the {guilabel}`Add branch` icon to the right of the + rule. This adds another modifier below the rule for adding an "all of" or "any of" statement. + +```{image} win_loss/custom-filter-add-branch.png +:align: center +:alt: The add branch feature allows the creation of more complex all or any statements +: for rules. +``` + +8. Once all rules have been added, click {guilabel}`Add` to add the custom filter to the search + criteria. + + - **To remove a custom filter:** click the {guilabel}`✖️ (x)` icon beside the filter in the + search bar. + +**To add a custom group:** + +1. On the {guilabel}`Pipeline Analysis` page, click the {guilabel}`down arrow` icon next to the + search bar. + +2. In the drop-down menu that appears, click {guilabel}`Add Custom Group`. + +3. Scroll through the options in the drop-down menu, and select one or more groups. + + - **To remove a custom group:** click the {guilabel}`✖️ (x)` icon beside the custom group in the + search bar. + +(win-loss-measure)= + +### Measurement options + +By default, the {guilabel}`Pipeline Analysis` page measures the total {guilabel}`Count` of leads +that match the search criteria, but can be changed to measure other items of interest. + +To change the selected measurement, click the {guilabel}`Measures` button on the top-left of the +page, and select one of the following options from the drop-down menu: + +- {guilabel}`Days to Assign`: measures the number of days it took a lead to be assigned after + creation. +- {guilabel}`Days to Close`: measures the number of days it took a lead to be closed (marked + **Won**). +- {guilabel}`Days to Convert`: measures the number of days it took a lead to be converted to an + opportunity. +- {guilabel}`Exceeded Closing Days`: measures the number of days by which a lead exceeded its + Expected Closing date. +- {guilabel}`Expected MRR`: measures the Expected Recurring Revenue of a lead. +- {guilabel}`Expected Revenue`: measures the Expected Revenue of a lead. +- {guilabel}`Prorated MRR`: measures the Prorated Monthly Recurring Revenue of a lead. +- {guilabel}`Prorated Recurring Revenues`: measures the Prorated Recurring Revenues of a lead. +- {guilabel}`Prorated Revenue`: measures the Prorated Revenue of a lead. +- {guilabel}`Recurring Revenues`: measures the Recurring Revenue of a lead. +- {guilabel}`Count`: measures the total amount of leads that match the search criteria. + +(win-loss-view)= + +### View options + +After configuring filters, groupings, and measurements, the {guilabel}`Pipeline Analysis` page can +display the data in a variety of ways. By default, the page uses the graph view, but can be changed +to a pivot view, cohort view, or list view. + +To change the pipeline to a different view, click one of the four view icons, located in the +top-right of the {guilabel}`Pipeline Analysis` page. + +```{eval-rst} +.. tabs:: + + .. tab:: Graph View + + The graph view is the default selection for the :guilabel:`Pipeline Analysis` page. It + displays the analysis as either a: bar chart, line chart, or pie chart. + + This view option is useful for quickly visualizing and comparing simple relationships, like + the :guilabel:`Count` of leads in each stage, or the leads assigned to each + :guilabel:`Salesperson`. + + By default, the graph measures the :guilabel:`Count` of leads in each group, but this can be + changed by clicking the :guilabel:`Measures` button, and :ref:`selecting another option + ` from the resulting drop-down menu. + + .. image:: win_loss/graph-view.png + :align: center + :alt: The Graph View displays the analysis as a Bar Chart, Line Chart, or Pie Chart. + + .. tip:: + When using a bar chart in this view, consider deselecting the :guilabel:`Stacked` option, + in order to make the breakdown of results more legible. + + .. tab:: Pivot View + + The pivot view displays the results of the analysis as a table. By default, the table groups + the results by the stages of the sales pipeline, and measures :guilabel:`Expected Revenue`. + + The pivot view is useful for analyzing more detailed numbers than the graph view can handle, + or for adding the data to a spreadsheet, where custom formulas can be set up, like in an Excel + file. + + .. image:: win_loss/pivot-view.png + :align: center + :alt: The Pivot View displays the analysis as a table. + + The three icons at the top-left of the page perform the following functions: + + - :guilabel:`Flip Axis`: flips the X and Y axis for the entire table. + - :guilabel:`Expand All`: when additional groupings are selected using the :guilabel:`➕ (plus + sign)` icons, this button opens those groupings under every row. + - :guilabel:`Download xlsx`: downloads the table as an Excel file. + + .. note:: + The :guilabel:`Stage` grouping cannot be removed, but the measurement can be changed by + clicking the :guilabel:`Measures` button, and selecting another option. + + .. tab:: Cohort View + + The cohort view displays the analysis as periods of time (cohorts) that can be set to days, + weeks, months, or years. By default, :guilabel:`Week` is selected. + + This view option is useful specifically for comparing how long it has taken to close leads. + + .. image:: win_loss/cohort-view.png + :align: center + :alt: The Cohort View displays the analysis as individual weeks of the year. + + From left-to-right, top-to-bottom, the columns in the chart represent the following: + + - :guilabel:`Created On`: rows in this column represent the weeks of the year, in which + records matching the search criteria exist. + + - When set to :guilabel:`Week`, a row with the label :guilabel:`W52 2023` means the results + occurred in: Week 52 of the Year 2023. + - :guilabel:`Measures`: the second column in the chart is the measurement of the results. By + default, it is set to :guilabel:`Count`, but can be changed by clicking the + :guilabel:`Measures` button, and selecting an option from the drop-down menu. + - :guilabel:`Closed Date - By Day/Week/Month/Year`: this column looks at what percentage of + the measured results were closed in subsequent days/weeks/months/years. + - :guilabel:`Average`: this row provides the average of all other rows in the column. + + The cohort view can also be downloaded as an Excel file, by clicking the :guilabel:`Download` + icon in the top-left of the page. + + .. tab:: List View + + The list view displays a single list of all leads matching the search criteria. Clicking a + lead opens the record for closer review. Additional details such as :guilabel:`Country`, + :guilabel:`Medium`, and more can be added to the list, by clicking the :guilabel:`Filters` + icon in the top-right of the list. + + This view option is useful for reviewing many records at once. + + .. image:: win_loss/list-view.png + :align: center + :alt: The List View displays a single list of all records matching the search criteria. + + Clicking the :guilabel:`⚙️ (gear)` icon opens the Actions drop-down menu, with options for the + following: + + - :guilabel:`Import records`: opens a page for uploading a spreadsheet of data, as well as a + template spreadsheet to easily format that data. + - :guilabel:`Export All`: downloads the list as an xlsx file for Excel. + - :guilabel:`Knowledge`: inserts a view of, or link to, the list in an article in the + *Knowledge* app. + - :guilabel:`Dashboard`: adds the list to *My Dashboard* in the *Dashboards* app. + - :guilabel:`Spreadsheet`: links to, or inserts, the list in a spreadsheet in the *Documents* + app. + + .. note:: + On the list view, clicking :guilabel:`New` closes the list, and opens the *New Quotation* + page. Clicking :guilabel:`Generate Leads` opens a pop-up window for lead generation. + Neither feature is intended to manipulate the list view. +``` + +(win-loss-reports)= + +## Create reports + +After understanding how to {ref}`navigate the pipeline analysis page `, the +{guilabel}`Pipeline Analysis` page can be used to create and share different reports. Between the +pre-made options and custom filter and groupings, almost any combination is possible. + +Once created, reports can be {ref}`saved to favorites, shared with other users, and/or added to +dashboards and spreadsheets `. + +A few common reports that can be created using the {guilabel}`Pipeline Analysis` page are detailed +below. + +(win-loss-win-loss)= + +### Win/Loss reports + +Win/Loss is a calculation of active or previously active leads in a pipeline that were either marked +as **Won** or **Lost** over a specific period of time. By calculating opportunities won over +opportunities lost, teams can clarify key performance indicators (KPIs) that are converting leads +into sales, such as specific teams or team members, certain marketing mediums or campaigns, and so +on. + +$$ +\begin{equation} Win/Loss Ratio = \frac{Opportunities Won}{Opportunities Lost} \end{equation} +$$ + +A win/loss report filters the leads from the past year, whether won or lost, and groups the results +by their stage in the pipeline. Creating this report requires a custom filter, and grouping the +results by {guilabel}`Stage`. + +```{image} win_loss/search-criteria-for-basic-win-loss.png +:align: center +:alt: The search criteria for win/loss reports is Created On, Stage, and Active is +: in true false. +``` + +Follow the steps below to create a win/loss report: + +1. Navigate to {menuselection}`CRM app --> Reporting --> Pipeline`. + +2. On the {guilabel}`Pipeline Analysis` page, click the {guilabel}`⬇️ (down arrow)` icon, next to + the search bar, to open a drop-down menu of filters and groupings. + + ```{image} win_loss/filters-for-basic-win-loss-report.png + :align: center + :alt: The Search menu containing the filters for a basic win/loss report. + ``` + +3. In drop-down menu that appears, under the {guilabel}`Group By` heading, click {guilabel}`Stage`. + +4. Under the {guilabel}`Filters` heading, click {guilabel}`Add Custom Filter` to open another pop-up + menu. + +5. In the {guilabel}`Add Custom Filter` pop-up menu, click on the first field in the + {guilabel}`Match any of the following rules:` section. By default, this field displays + {guilabel}`Country`. + +6. Clicking that first field reveals a sub-menu with numerous options to choose from. From this + sub-menu, locate and select the {guilabel}`Active` option. Doing so automatically populates the + remaining fields. + + The first field reads: {guilabel}`Active`. The second field reads: {guilabel}`is`. And lastly, + the third field reads: {guilabel}`set`. + + In total, the rule reads: {guilabel}`Active is set`. + +7. Click {guilabel}`New Rule`, change the first field to {guilabel}`Active`, and the last field to + {guilabel}`not set`. In total, the rule reads {guilabel}`Active is not set`. + +8. Click {guilabel}`Add`. + +```{image} win_loss/add-custom-active-filter.png +:align: center +:alt: 'The Add Custom Filter menu showing two rules: (1) Active is set, and (2) Active +: is not set.' +``` + +The report now displays the total {guilabel}`Count` of leads, whether "Won" or "Lost," grouped by +their stage in the CRM pipeline. Hover over a section of the report to see the number of leads in +that stage. + +```{image} win_loss/basic-win-loss-report.png +:align: center +:alt: A basic win/loss report showing all leads whether won or lost grouped by stage. +``` + +#### Customize win/loss reports + +After {ref}`creating a win/loss report `, consider using the options below to +customize the report for different needs. + +```{eval-rst} +.. example:: + A sales manager might group wins and losses by salesperson, or sales team, to see who has the + best conversion rate. Or, a marketing team might group by sources, or medium, to determine where + their advertising has been most successful. +``` + +```{eval-rst} +.. tabs:: + + .. tab:: Filters and groups + + To add more filters and groups, click the :guilabel:`⬇️ (down arrow)` icon, next to the search + bar, and select one or more options from the drop-down menu. + + Some useful options include: + + - :guilabel:`Created on`: adjusting this filter to a different period of time, such as the + last 30 days, or the last quarter, can provide more timely results. + - :guilabel:`Add Custom Filter`: clicking this option, and scrolling through the numerous + options in the drop-down menu, opens up additional search criteria, like :guilabel:`Last + Stage Update` or :guilabel:`Lost Reason`. + - :guilabel:`Add Custom Group > Active`: Clicking :menuselection:`Add Custom Group --> Active` + separates the results into **Won** (:guilabel:`true`) or **Lost** (:guilabel:`false`). This + shows at what stage leads are being marked **Won** or **Lost**. + - :guilabel:`Multiple Groupings`: add multiple :guilabel:`Group By` selections to split + results into more relevant and manageable chunks. + + - Adding :guilabel:`Salesperson` or :guilabel:`Sales Team` breaks up the total count of + leads in each :guilabel:`Stage`. + - Adding :guilabel:`Medium` or :guilabel:`Source` can reveal what marketing avenues generate + more sales. + + .. image:: win_loss/search-panel-filters-and-group-by-options.png + :align: center + :alt: The Search menu open and the Won and Lost filters highlighted. + + .. tab:: Pivot View + + By default, pivot view groups win/loss reports by :guilabel:`Stage` and measures + :guilabel:`Expected Revenue`. + + To flesh out the table: + + 1. Click the :guilabel:`⬇️ (down arrow)` next to the search bar. + 2. In the pop-up menu, replace the :guilabel:`Stage` grouping with something like + :guilabel:`Salesperson` or :guilabel:`Medium`. + 3. Click the :guilabel:`Measures` button and click :guilabel:`Count` to add the number of + leads back into the report. + + - Other useful measures for pivot view include :guilabel:`Days to Assign` and + :guilabel:`Days to Close`. + + .. image:: win_loss/win-loss-pivot-view.png + :align: center + :alt: A win/loss report in Pivot View displays the data in table form. + + .. important:: + In pivot view, the :guilabel:`Insert In Spreadsheet` button may be greyed out due to the + report containing :guilabel:`duplicate group bys`. To fix this, replace the + :guilabel:`Stage` grouping in the search bar with another option. + + .. tab:: List View + + In list view, a win/loss report displays all leads on a single page. + + To better organize the list, click the :guilabel:`⬇️ (down arrow)` next to the search bar, and + add more relevant groupings or re-organize the existing ones. To re-order the nesting, remove + all :guilabel:`Group By` options and re-add them in the desired order. + + To add more columns to the list: + + 1. Click the :guilabel:`Filters` icon in the top-right of the page. + 2. Select options from the resulting drop-down menu. Some useful filters include: + + - **Campaign**: Shows the marketing campaign that originated each lead. + - **Medium**: Shows the marketing medium (Banner, Direct, Email, Google Adwords, Phone, + Website, etc.) that originated each lead. + - **Source**: Shows the source of each lead (Newsletter, Lead Recall, Search Engine, etc.). + + .. image:: win_loss/win-loss-list-view.png + :align: center + :alt: A win/loss report in List View displays all leads in an easy-to-read list. +``` + +(win-loss-save-reports)= + +## Save and share reports + +After {ref}`creating a report `, the search criteria can be saved, so the report +does not need to be created again in the future. Saved searches automatically update their results +every time the report is opened. + +Additionally, reports can be shared with others, or added to spreadsheets/dashboards for greater +customization and easier access. + +```{eval-rst} +.. tabs:: + + .. tab:: Save to Favorites + + To save a report for later: + + 1. On the :guilabel:`Pipeline Analysis` page, click the :guilabel:`⬇️ (down arrow)` icon, next + to the search bar. + 2. In the drop-down menu that appears, under the :guilabel:`Favorites` heading, click + :guilabel:`Save current search`. + 3. In the next drop-down menu that appears, enter a name for the report. + + - Checking the :guilabel:`Default filter` box sets this report as the default analysis when + the :guilabel:`Pipeline Analysis` page is accessed. + - Checking the :guilabel:`Shared` box makes this report available to other users. + + 4. Finally, click :guilabel:`Save`. The report is now saved under the :guilabel:`Favorites` + heading. + + .. image:: win_loss/save-to-favorites.png + :align: center + :alt: Under the Favorites heading, click Save current search and save the report for later. + + .. tab:: Add to a Spreadsheet + + Inserting a report into a spreadsheet not only saves a copy of the report, it allows users to + add charts and formulas like in an Excel file. + + To save a report as a spreadsheet: + + - **In Graph or Pivot View**: + + 1. Click the :guilabel:`Insert in spreadsheet` button. + 2. In the pop-up menu that appears, click :guilabel:`Confirm`. + + - **In Cohort or List View**: + + 1. Click the :guilabel:`⚙️ (gear)` icon. + 2. In the drop-down menu that appears, hover over :guilabel:`Spreadsheet`. + 3. In the next drop-down menu, click either :guilabel:`Insert in spreadsheet` or + :guilabel:`Link in spreadsheet`. + + Saved reports are viewable in the *Documents* app. + + .. image:: win_loss/pivot-view-in-spreadsheet.png + :align: center + :alt: Pivot View reports especially benefit from being inserted in spreadsheets. + + .. tip:: + After modifying a spreadsheet and adding additional formulas, consider then adding the + entire spreadsheet to a dashboard. Using this method, the spreadsheet can be added to a + public dashboard instead of only :guilabel:`My Dashboard`. + + 1. Click :menuselection:`File --> Add to dashboard`. + 2. In the pop-up menu that appears, name the spreadsheet and select a :guilabel:`Dashboard + Section` to house the report. + 3. Click :guilabel:`Create`. + + .. tab:: Add to a Dashboard + + Adding a report to a dashboard saves it for later and makes it easy to view alongside the rest + of :guilabel:`My Dashboard`. + + To add a report to :guilabel:`My dashboard`: + + 1. On the :guilabel:`Pipeline Analysis` page, click the :guilabel:`⚙️ (gear)` icon. + 2. In the drop-down menu that appears, hover over :guilabel:`Dashboard`. + 3. In the :guilabel:`Add to my dashboard` drop-down menu, enter a name for the report (by + default, it is named :guilabel:`Pipeline`). + 4. Click :guilabel:`Add`. + + To view a saved report: + + 1. Return to the main apps page, and navigate to :menuselection:`Dashboards app --> My + Dashboard`. + + .. image:: win_loss/add-to-dashboard.png + :align: center + :alt: To access the saved report, open the Dashboard app and click My Dashboard. +``` + +:::{seealso} +- {doc}`../acquire_leads/convert` +- {doc}`../acquire_leads/send_quotes` +- {doc}`../pipeline/lost_opportunities` +::: + diff --git a/content/applications/sales/crm/pipeline.md b/content/applications/sales/crm/pipeline.md new file mode 100644 index 000000000..d2687986b --- /dev/null +++ b/content/applications/sales/crm/pipeline.md @@ -0,0 +1,14 @@ +--- +nosearch: true +--- + +# Organize the pipeline + +```{toctree} +:titlesonly: true + +pipeline/lost_opportunities +pipeline/merge_similar +pipeline/manage_sales_teams +``` + diff --git a/content/applications/sales/crm/pipeline/lost_opportunities.md b/content/applications/sales/crm/pipeline/lost_opportunities.md new file mode 100644 index 000000000..bba1a68f1 --- /dev/null +++ b/content/applications/sales/crm/pipeline/lost_opportunities.md @@ -0,0 +1,229 @@ +# Manage lost opportunities + +Not every opportunity results in a successful sale. To keep the pipeline up-to-date, *lost* +opportunities need to be identified. Specifying why an opportunity was lost provides additional +insight that can prove useful for future opportunities. + +## Mark an opportunity as lost + +To mark an opportunity as lost, first open the {menuselection}`CRM app`, and select an opportunity +from the pipeline, by clicking on its corresponding Kanban card. Doing so reveals that opportunity's +detail form. + +Then, click {guilabel}`Lost`, located at the top of the opportunity's detail form. + +```{image} lost_opportunities/lost-opps-lost-button.png +:align: center +:alt: Buttons from the top of an opportunity record with the lost button emphasized. +``` + +This opens the {guilabel}`Mark Lost` pop-up window. From the {guilabel}`Lost Reason` drop-down menu, +choose an existing lost reason. If no applicable reason is available, create a new one by entering +it into the {guilabel}`Lost Reason` field, and clicking {guilabel}`Create`. + +Additional notes and comments can be added below the lost reason in the designated +{guilabel}`Closing Note` field. + +:::{tip} +Neither the {guilabel}`Lost Reason` field, nor the {guilabel}`Closing Note` field, on the +{guilabel}`Mark Lost` pop-up window are required. However, it is recommended to include this +information for the sake of traceability, accountability, and reporting purposes. +::: + +When all the desired information has been entered in the {guilabel}`Mark Lost` pop-up window, click +{guilabel}`Mark as Lost`. + +```{image} lost_opportunities/lost-opps-lost-reason.png +:align: center +:alt: Lost reasons popup with sample reasons. +``` + +After clicking {guilabel}`Mark as Lost`, a red {guilabel}`Lost` banner is added to the upper-right +corner of the opportunity. + +```{image} lost_opportunities/lost-banner.png +:align: center +:alt: A lost opportunity with the lost banner added. +``` + +:::{note} +To mark an *inactive* (archived) opportunity as lost, set the {guilabel}`Probability` field to +`0` percent. +::: + +(crm-lost-reasons)= + +## Create/edit lost reasons + +To create a new lost reason, or edit an existing one, navigate to {menuselection}`CRM app --> +Configuration --> Lost Reasons`. + +To edit an existing lost reason: + +1. Click on the reason to be edited to highlight it. +2. Change the selected lost reason by editing the {guilabel}`Description` field. +3. When finished, click {guilabel}`Save` in the upper-left corner. + +To create a new lost reason: + +1. Click {guilabel}`New` in the upper-left corner of the {guilabel}`Lost Reasons` page. +2. In the new blank line, click in the {guilabel}`Description` field, then type the new lost reason. +3. When finished, click {guilabel}`Save`. + +## View lost opportunities + +To retrieve lost opportunities in Odoo *CRM*, open the {menuselection}`CRM app`. On the main +{guilabel}`Pipeline` dashboard, click into the {guilabel}`Search...` bar at the top of the page, and +remove all of the default filters. + +```{image} lost_opportunities/lost-opps-lost-filter.png +:align: center +:alt: Search bar with lost filter emphasized. +``` + +Open the {guilabel}`Filters` drop-down menu, by clicking the {guilabel}`🔻(triangle pointed down)` +icon to the right of the {guilabel}`Search...` bar to open the drop-down menu containing +{guilabel}`Filters`, {guilabel}`Group By`, and {guilabel}`Favorites` options, designated into +respective columns. + +Select the {guilabel}`Lost` option from the {guilabel}`Filters` section. Upon selecting +{guilabel}`Lost`, only the opportunities marked as `Lost` appear on the {guilabel}`Pipeline` page. + +### Sort opportunities by lost reason + +To filter opportunities by a specific lost reason, click the {guilabel}`🔻(triangle pointed down)` +icon to the right of the {guilabel}`Search...` bar again to open the drop-down menu. In addition to +the {guilabel}`Lost` filter, under the {guilabel}`Filters` column, click {guilabel}`Add Custom +Filter`, which opens an {guilabel}`Add Custom Filter` pop-up window. + +On the {guilabel}`Add Custom Filter` pop-up window, click in the first field, and type `Lost Reason` +in the {guilabel}`Search...` bar, or scroll to search through the list to locate it. Then, click +into the next field, and select {guilabel}`=` from the drop-down menu. Click into the third field, +and select a lost reason from the drop-down menu. Finally, click {guilabel}`Add`. + +```{image} lost_opportunities/lost-opps-lost-custom-filter.png +:align: center +:alt: Search bar with custom filter added for lost reason. +``` + +:::{tip} +To view results for more than one lost reason, select the operator {guilabel}`is in` in the +second field of the custom filter in the {guilabel}`Add Custom Filter` pop-up window. Choosing +this operator makes it possible to choose multiple lost reasons in the third field. + +```{image} lost_opportunities/multiple-lost-reasons.png +:align: center +:alt: Add Custom Filter pop-up with multiple lost reasons selected. +``` +::: + +## Restore lost opportunities + +To restore a lost opportunity, open the {menuselection}`CRM app` to reveal the {guilabel}`Pipeline` +dashboard. Or, navigate to {menuselection}`CRM app --> Sales --> My Pipeline`. From here, click the +{guilabel}`🔻(triangle pointed down)` icon to the right of the {guilabel}`Search...` bar to open the +drop-down menu that contains {guilabel}`Filters`, {guilabel}`Group By`, and {guilabel}`Favorites` +columns. + +Under the {guilabel}`Filters` column, select {guilabel}`Lost`. Doing so reveals all the lost +opportunities on the {guilabel}`Pipeline` page. + +:::{tip} +To see all opportunities in the database, remove the default {guilabel}`My Pipeline` filter from +the {guilabel}`Search...` bar. +::: + +Then, click on the Kanban card of the desired lost opportunity to restore, which opens that +opportunity's detail form. + +From the lost opportunity's detail form, click {guilabel}`Restore` in the upper-left corner. Doing +so removes the red {guilabel}`Lost` banner from the opportunity form, signifying the opportunity has +been restored. + +```{image} lost_opportunities/lost-opps-restore.png +:align: center +:alt: Lost opportunity with emphasis on the Restore button. +``` + +### Restore multiple opportunities at once + +To restore multiple opportunities at once, navigate to the main {guilabel}`Pipeline` dashboard in +the *CRM* app, open the {guilabel}`Filters` drop-down menu, and select the {guilabel}`Lost` option. + +Next, select the list view option, represented by the {guilabel}`≣ (list)` icon in the upper-right +corner. Doing so places all the opportunities from the {guilabel}`Pipeline` page in a list view. +With the list view chosen, select the checkbox to the left of each opportunity to be restored. + +Once the desired opportunities have been selected, click the {guilabel}`⚙️ Actions` drop-down menu +at the top of the {guilabel}`Pipeline` page. From the {guilabel}`⚙️ Actions` drop-down menu, select +{guilabel}`Unarchive`. + +Doing so removes those selected opportunities from the {guilabel}`Pipeline` page because they no +longer fit the {guilabel}`Lost` filter criteria. Delete the {guilabel}`Lost` filter from the search +bar to reveal these newly-restored opportunities. + +```{image} lost_opportunities/lost-opps-unarchive.png +:align: center +:alt: Action button from list view with the Unarchive option emphasized. +``` + +## Manage lost leads + +If *Leads* are enabled on a database, they can be marked as *lost* in the same manner as +opportunities. Leads use the same {ref}`lost reasons ` as opportunities. + +:::{note} +To enable leads, navigate to {menuselection}`CRM app --> Configuration --> Settings` and check +the {guilabel}`Leads` checkbox. Then, click {guilabel}`Save`. This adds a new {guilabel}`Leads` +menu to the header menu bar at the top of the page. +::: + +### Mark a lead as lost + +To mark a lead as lost, navigate to {menuselection}`CRM app --> Leads`, and select a lead from the +list. Doing so reveals that lead's detail form. + +Then, click {guilabel}`Lost`, located at the top of the lead's detail form. + +This opens the {guilabel}`Mark Lost` pop-up window. From the {guilabel}`Lost Reason` drop-down menu, +choose an existing lost reason. If no applicable reason is available, create a new one by entering +it into the {guilabel}`Lost Reason` field, and clicking {guilabel}`Create`. + +Additional notes and comments can be added below the lost reason designated in the +{guilabel}`Closing Note` field. + +When all the desired information has been entered in the {guilabel}`Mark Lost` pop-up window, click +{guilabel}`Mark as Lost`. + +### Restore lost leads + +To restore a lost lead, navigate to {menuselection}`CRM app --> Leads`, then click the {guilabel}`🔻 +(triangle pointed down)` icon to the right of the {guilabel}`Search...` bar to open the drop-down +menu that contains the {guilabel}`Filters`, {guilabel}`Group By`, and {guilabel}`Favorites` columns. + +Under the {guilabel}`Filters` column, select {guilabel}`Lost`. Doing so reveals all the lost leads +on the {guilabel}`Leads` page. + +Then, click on the desired lost lead to restore, which opens that lead's detail form. + +From the lost lead's detail form, click {guilabel}`Restore` in the upper-left corner. Doing so +removes the red {guilabel}`Lost` banner from the lead form, signifying the lead has been restored. + +### Restore multiple leads at once + +To restore multiple leads at once, navigate to {menuselection}`CRM app --> Leads`, open the +{guilabel}`Filters` drop-down menu, and select the {guilabel}`Lost` option. Select the checkbox to +the left of each lead to be restored. + +Once the desired leads have been selected, click the {guilabel}`⚙️ Actions` drop-down menu at the +top of the {guilabel}`Leads` page. From the {guilabel}`⚙️ Actions` drop-down menu, select +{guilabel}`Unarchive`. + +Doing so removes those selected leads from the {guilabel}`Leads` page because they no longer fit the +{guilabel}`Lost` filter criteria. Delete the {guilabel}`Lost` filter from the {guilabel}`Search...` +bar to reveal these newly-restored leads. + +:::{seealso} +{doc}`../performance/win_loss` +::: + diff --git a/content/applications/sales/crm/pipeline/manage_sales_teams.md b/content/applications/sales/crm/pipeline/manage_sales_teams.md new file mode 100644 index 000000000..0a5e35e50 --- /dev/null +++ b/content/applications/sales/crm/pipeline/manage_sales_teams.md @@ -0,0 +1,114 @@ +# Manage sales teams + +The *Sales Teams* feature within Odoo's *CRM* app allows for the creation and management of multiple +sales teams, each with their own assignment rules, invoicing targets, and roster of salespeople. + +## Create a sales team + +To create a new sales team, go to {menuselection}`CRM app --> Configuration --> Sales Teams`, then +click {guilabel}`New`. + +On the blank sales team form, enter a name in the {guilabel}`Sales Team` field. + +Next, select a {guilabel}`Team Leader` from the drop-down list. + +Set an {guilabel}`Email Alias` to automatically generate a lead/opportunity for this sales team +whenever a message is sent to that unique email address. Choose whether to accept emails from +{guilabel}`Everyone`, {guilabel}`Authenticated Partners`, {guilabel}`Followers Only`, or +{guilabel}`Authenticated Employees`. + +Select a {guilabel}`Company` from the drop-down menu to assign this team to. + +:::{note} +The {guilabel}`Company` field is only visible in multi-company databases, and is not required. +::: + +```{image} manage_sales_teams/sales-team-creation.png +:align: center +:alt: The settings page for a new sales team. +``` + +:::{note} +If the *Sales* app is installed on the database, an {guilabel}`Invoicing Target` field appears on +the sales team form. This is the revenue target for the current month. The amount entered in this +field is used to populate the invoicing progress bar on the {ref}`sales team dashboard +`. +::: + +### Add sales team members + +To add team members, click {guilabel}`Add` under the {guilabel}`Members` tab when editing the sales +team's configuration page. This opens a {guilabel}`Create Sales Team Members` pop-up window. + +:::{note} +If the {guilabel}`Rule-Based Assignment` feature has **not** been enabled on the *CRM* app's +*Settings* page, clicking {guilabel}`Add` under the {guilabel}`Members` tab opens an +{guilabel}`Add: Salespersons` pop-up window. Tick the checkbox to the far-left of the +salesperson to be added to the team, then click {guilabel}`Select`. + +```{image} manage_sales_teams/add-salespersons.png +:align: center +:alt: 'The Add: Salespersons pop-up window on a new sales team.' +``` +::: + +Select a user from the {guilabel}`Salesperson` drop-down list to add them to the team. To prevent +this salesperson from being automatically assigned leads, tick the {guilabel}`Skip auto assignment` +checkbox. If this feature is activated, the salesperson can still be assigned leads manually. + +```{image} manage_sales_teams/create-sales-team-members.png +:align: center +:alt: The Create Sales Team Members pop-up window. +``` + +The {guilabel}`Leads (30 days)` field tracks how many leads the salesperson has been assigned in the +past thirty days for this team, and the maximum number of leads they should be assigned. To edit the +maximum number of leads this salesperson can be assigned, enter that amount in the {guilabel}`Leads +(30 days)` field. + +:::{tip} +{doc}`Assignment rules <../track_leads/lead_scoring>` can be configured for individual +salespeople using the {guilabel}`Domain` section. +::: + +Click {guilabel}`Save & Close` when finished, or {guilabel}`Save & New` to add additional members. + +## Enable multi teams + +To allow salespeople to be assigned to more than one sales team, the *Multi Teams* setting needs to +be enabled. First, navigate to {menuselection}`CRM app --> Configuration --> Settings`. Under the +{guilabel}`CRM` section, tick the checkbox labeled {guilabel}`Multi Teams`. Then, click +{guilabel}`Save` at the top-left of the page. + +```{image} manage_sales_teams/enable-multi-teams.png +:align: center +:alt: The settings page of the CRM app with the Multi Teams setting enabled. +``` + +(crm-sales-team-dashboard)= + +## Sales team dashboard + +To view the sales team dashboard, go to {menuselection}`CRM app --> Sales --> Teams`. Any team the +user is a member of appears in the dashboard. + +```{image} manage_sales_teams/sales-teams-dashboard.png +:align: center +:alt: The sales team dashboard in the CRM app. +``` + +Each Kanban card gives an overview of the sales team's open opportunities, quotations, sales orders, +and expected revenue, as well as a bar graph of new opportunities per week, and an invoicing +progress bar. + +Click the {guilabel}`Pipeline` button to go directly to that team's *CRM* pipeline. + +Click on the {icon}`fa-ellipsis-v` {guilabel}`(vertical ellipsis)` icon in the top-right corner of +the Kanban card to open a drop-down menu. Then, to view or edit the team's settings, click +{guilabel}`Configuration`. + +:::{seealso} +- {doc}`../optimize/utilize_activities` +- {doc}`../track_leads/lead_scoring` +::: + diff --git a/content/applications/sales/crm/pipeline/merge_similar.md b/content/applications/sales/crm/pipeline/merge_similar.md new file mode 100644 index 000000000..9ba6c7a8a --- /dev/null +++ b/content/applications/sales/crm/pipeline/merge_similar.md @@ -0,0 +1,115 @@ +# Merge similar leads and opportunities + +Odoo automatically detects similar *leads* and *opportunities* within the *CRM* app. Identifying +these duplicated records allows them to be merged without losing any information in the process. +Not only does this help keep the *pipeline* organized, but it also prevents customers from being +contacted by more than one salesperson. + +:::{note} +When merging opportunities, no information is lost. Data from the other opportunity is logged in +the chatter, and the information fields, for reference. +::: + +## Identify similar leads and opportunities + +Similar leads and opportunities are identified by comparing the *email address* and *phone number* +of the associated contact. If a similar lead/opportunity is found, a *Similar Leads* smart button +appears at the top of the lead (or opportunity) record. + +```{image} merge_similar/similar-smart-button.png +:align: center +:alt: An opportunity record with emphasis on the Similar Leads smart button. +``` + +### Comparing similar leads and opportunities + +To compare the details of similar leads/opportunities, navigate to {menuselection}`CRM app --> +Pipeline` or {menuselection}`CRM app --> Leads`. Open a lead or opportunity, and click the +{guilabel}`Similar Leads` smart button. Doing so opens a Kanban view that only displays similar +leads/opportunities. Click on a card to view the details for the lead/opportunity, and confirm if +they should be merged. + +## Merging similar leads and opportunities + +:::{important} +When merging, Odoo gives priority to whichever lead/opportunity was created in the system first, +merging the information into the first created lead/opportunity. However, if a lead and an +opportunity are being merged, the resulting record is referred to as an opportunity, regardless +of which record was created first. +::: + +After confirming that the leads/opportunities should be merged, return to the Kanban view using the +breadcrumb link, or by clicking the {guilabel}`Similar Leads` smart button. Click the +{icon}`oi-view-list` {guilabel}`(list)` icon to change to list view. + +Check the box on the left of the page for the leads/opportunities to be merged. Then, click the +{icon}`fa-cog` {guilabel}`Actions` icon at the top of the page, to reveal a drop-down menu. From +that drop-down menu, select the {guilabel}`Merge` option to merge the selected opportunities or +leads. + +When {guilabel}`Merge` is selected from the {icon}`fa-cog` {guilabel}`Actions` drop-down menu, a +{guilabel}`Merge` pop-up modal appears. In that pop-up modal, under the {guilabel}`Assign +opportunities to` heading, select a {guilabel}`Salesperson` and {guilabel}`Sales Team` from the +appropriate drop-down menus. + +Below those fields, the leads/opportunities to merge are listed, along with their related +information. To merge those selected leads/opportunities, click {guilabel}`Merge`. + +```{image} merge_similar/select-merge.png +:align: center +:alt: List of similar leads and opportunities selected for merge in the CRM app. +``` + +:::{danger} +Merging is an irreversible action. Do **not** merge leads/opportunities unless absolutely certain +they should be combined. +::: + +## When leads/opportunities should not be merged + +There may be instances where a similar lead or opportunity is identified, but should *not* be +merged. These circumstances vary, based on the processes of the sales team and organization. Some +potential scenarios are listed below. + +### Lost leads + +If a lead/opportunity has been marked as {doc}`lost `, it can still be merged +with an active lead or opportunity. The resulting lead/opportunity is marked active, and added to +the pipeline. + +### Different contact within an organization + +Leads/opportunities from the same organization, but with different points of contact, may not have +the same needs. In this case, it is beneficial to *not* merge these records, though assigning the +same salesperson, or sales team, can prevent duplicated work and miscommunication. + +### Existing duplicates with more than one salesperson + +If more than one lead/opportunity exists in the database, there may be multiple salespeople assigned +to them, who are actively working on them independently. While these leads/opportunities may need +to be managed separately, it is recommended that any affected salespeople be tagged in an internal +note for visibility. + +### Contact information is similar but not exact + +Similar leads and opportunities are identified by comparing the email addresses and phone numbers of +the associated contacts. However, if the email address is *similar*, but not *exact*, they may need +to remain independent. + +```{eval-rst} +.. example:: + Three different leads were added to the pipeline and assigned to different salespeople. They + were identified as *Similar Leads* due to the email addresses of the contacts. + + Two of the leads appear to come from the same individual, `Robin`, and have identical email + addresses. These leads should be merged. + + The third lead has the same email domain, but the address is different, as is the contact name. + While this lead is most likely from the same organization, it is from a different contact, and + should **not** be merged. + + .. image:: merge_similar/contact-info-example.png + :align: center + :alt: List of similar leads with emphasis on the contact information in the CRM app. +``` + diff --git a/content/applications/sales/crm/track_leads.md b/content/applications/sales/crm/track_leads.md new file mode 100644 index 000000000..fded87ba2 --- /dev/null +++ b/content/applications/sales/crm/track_leads.md @@ -0,0 +1,17 @@ +--- +nosearch: true +--- + +# Assign and track leads + +```{toctree} +:titlesonly: true + +track_leads/lead_scoring +track_leads/unattended_leads_report +track_leads/quality_leads_report +track_leads/resellers +track_leads/marketing_attribution +track_leads/lead_distribution_report +``` + diff --git a/content/applications/sales/crm/track_leads/lead_distribution_report.md b/content/applications/sales/crm/track_leads/lead_distribution_report.md new file mode 100644 index 000000000..c26bbf4a5 --- /dev/null +++ b/content/applications/sales/crm/track_leads/lead_distribution_report.md @@ -0,0 +1,195 @@ +# Lead distribution report + +A *lead distribution report* can be used to see if active leads are being assigned equitably +across sales members. It can also be used to view the distribution of good or {doc}`quality leads +`, and see how frequently each salesperson is receiving (and keeping) leads. + +Lead distribution reports can be run each week to help keep salespeople on track, while +providing them with ample good leads. These reports can also be used to see whether sales members +are staying productive, if good leads are being lost too often by one salesperson, and what +percentage of good leads are being retained overall. + +## Create lead distribution reports + +To create a lead distribution report, first navigate to {menuselection}`CRM app --> Reporting --> +Pipeline`, which reveals the {guilabel}`Pipeline Analysis` dashboard. + +Remove all the default filters in the search bar at the top of the page. Doing so +displays data related to *all* leads. + +{ref}`Custom filters ` can now be added by clicking the {icon}`fa-caret-down` +{guilabel}`(down caret)` icon, to the right of the search bar, to reveal a drop-down menu of search +and filter options. + +Three columns are displayed: {ref}`Filters `, {ref}`Group By `, and +{ref}`Favorites `. To begin, navigate to the bottom of the {guilabel}`Filters` +column, and click {guilabel}`Add Custom Filter`. This opens an {guilabel}`Add Custom Filter` pop-up +window, where the essential filters can be added one at a time. + +(crm-track-leads-essential-filters)= + +### Essential filters + +The following filter conditions are used to create a basic lead distribution report. Together they +gather all leads created within a certain timespan that have an associated contact method and have +been assigned to a sales team. + +#### Lead creation date + +Click the first field, under {guilabel}`Match any of the following rules:`, that has the value +{guilabel}`Country` in it. In the popover that appears, type `Created on` in the search bar, or +scroll to search through the list to locate and select it. + +Then, in the second field of that row, select {guilabel}`>=` from the drop-down menu. This operator +**only** includes values greater than (or equal to) the value in the third, rightmost field. + +The third field on the {guilabel}`Add Custom Filter` pop-up window should contain the earliest date +leads are selected from. + +For example, setting `01/01/2024 00:00:00` only includes leads created from, and including, the +first day of 2024. + +```{image} lead_distribution_report/created-on.png +:align: center +:alt: Add a Created On rule for the start of the year onward. +``` + +(crm-track-leads-sales-team)= + +#### Sales team + +Click {guilabel}`New rule` to add another row to the form, and choose {guilabel}`Sales Team` for +this rule's parameter. Then, click the second field of the new rule, and select {guilabel}`contains` +from the drop-down menu. Selecting this operator filters for any records that contain the words in +the third, rightmost field. + +:::{tip} +For certain pre-determined, limited choices like a sales team, the {guilabel}`is in` operator +helps make for an easier and more accurate selection, via a drop-down menu in the third field, +instead of risking a typo or incorrect value in the text box field that accompanies the +{guilabel}`contains` operator. +::: + +In this third field, enter the name of the desired sales team(s) that are to be included in the +report. It is important for all {guilabel}`contains` argument values to be specific enough and +spelled correctly as they exist in Odoo, otherwise this risks returning multiple (or zero) values. + +```{image} lead_distribution_report/sales-team-location.png +:align: center +:alt: Use Sales Team to filter the location the lead is associated with. +``` + +:::{important} +By adding more than one rule to the form, a new option emerges at the top of the pop-up window +above all the filters, to specify whether {guilabel}`any` {icon}`fa-caret-down` or +{guilabel}`all` {icon}`fa-caret-down` of the conditions should match. This distinction is +important to set correctly, as it impacts the driving logic of how the filters return data. +::: + +Click the default {guilabel}`any` {icon}`fa-caret-down` menu item and be sure the {guilabel}`all` +{icon}`fa-caret-down` option is chosen instead. This setting will **only** show records that match +*all* the rules contained inside the form. + +(crm-track-leads-phone-number)= + +#### Contact method + +:::{note} +The instruction below is not necessary, however, it's highly recommended to add a set contact +value to the report's search criteria. A lot of spam, duplicate, or low quality leads can easily +be screened out of the report simply by adding either a set {guilabel}`Phone` or +{guilabel}`Email` rule. +::: + +Add another {guilabel}`New rule` to the form and set the first field to the first field to +{guilabel}`Phone`. Then, select {guilabel}`is set` from the drop-down menu in the second field. +Selecting this operator **only** filters for records that have a phone number associated with the +lead. + +Alternatively (or in addition to the above rule), click {guilabel}`New rule` and set the first field +to {guilabel}`Email`. Then, select {guilabel}`is set` from the drop-down menu in the second field. + +These rules add only leads with an associated contact method to the report. + +(crm-track-leads-active-status)= + +#### Active status + +Click the {icon}`fa-sitemap` {guilabel}`(Add branch)` icon to the right of the `Phone is set` line, +to add a new rule that branches from the rules above. + +Two horizontal sets of fields appear below a line showing {guilabel}`any` {icon}`fa-caret-down` +{guilabel}`of:` option. This setting filters for records that match **any** of the rules contained +inside. This uses the same logic as an OR (`|`) logical operator. + +Set the first field to {guilabel}`Active`. Then, select {guilabel}`is set` in the next field. + +Next, click the {icon}`fa-plus` {guilabel}`(Add New Rule)` button next to {guilabel}`Active is set` +to create a new line of fields beneath it. + +Set the first field to {guilabel}`Active`. Then, select {guilabel}`is not set` in the next field. + +```{image} lead_distribution_report/active-set.png +:align: center +:alt: Use Active to include active status in the report. +``` + +This rule adds the activity status of the lead to the report. + +:::{note} +Active status is an important filter to include when creating a lead distribution report because +it includes **all** leads regardless of won/lost or active/inactive status in the report. This +provides a comprehensive view of all the leads assigned to each sales member. +::: + +#### Group by + +Once all filters are set, click the {guilabel}`Add` button to add these filters to the search bar. +To have the report grouped appropriately, click the {icon}`fa-caret-down` {guilabel}`(down caret)` +icon, to the right of the search bar, and click {guilabel}`Salesperson` in the {guilabel}`Group +By` section. All results are now grouped by the salesperson assigned to each lead. + +Once the rules for the filter are set, click the purple {guilabel}`Confirm` button at the bottom of +the pop-up menu to save the custom filter and close the pop-up menu. + +The {guilabel}`Pipeline Analysis` dashboard is now displayed again with each filter rule in the +search bar. + +Click the {icon}`fa-area-chart` {guilabel}`(Graph)` icon, to the right of the search bar, to view +the report as a bar chart. Alternatively, click the {icon}`oi-view-list` {guilabel}`(List)` icon to +view leads in a grouped list. + +:::{tip} +To save the filter so it can easily be re-applied, click the {guilabel}`Save current search` +button in the {guilabel}`Favorites` section of the search bar drop-down menu. + +Next, type a name for the filter in the text box below. Check the {guilabel}`Shared` checkbox to +have the filter shared with any user with access to the pipeline. Finally, click the purple +{guilabel}`Save` button below to save the filter. + +The filter will now appear with the name it was given under the {guilabel}`Favorites` section of +the drop-down menu and can be re-applied by clicking on it. +::: + +### Filter for quality leads + +The following additional conditions are provided as an example of a *good*, but *not comprehensive*, +set of rules for finding quality leads. These filters should be applied on top of the +{ref}`crm/track_leads/essential-filters` in the order specified to achieve a heavily-detailed +filter. + +- **Referred-by:** Filter for referrals, such as by appointment or sales member. +- **Source:** Filter for specific source UTMs, such as Facebook or LinkedIn. +- **Notes:** Filter for internal notes. +- **Tags:** Filter for categorical tags. +- **Email:** Filter for specific email domains, such as gmail.com or yahoo.com. +- **Salesperson:** Filter for leads associated with certain sales members. + +These conditions can be added, removed, or modified to best fit the desired information in the +report. + +:::{seealso} +- {ref}`quality_leads_report/add-quality-rules` +- {doc}`../../../essentials/search` +::: + diff --git a/content/applications/sales/crm/track_leads/lead_scoring.md b/content/applications/sales/crm/track_leads/lead_scoring.md new file mode 100644 index 000000000..428dd35bd --- /dev/null +++ b/content/applications/sales/crm/track_leads/lead_scoring.md @@ -0,0 +1,188 @@ +# Assign leads with predictive lead scoring + +The Odoo *CRM* app can automatically assign leads/opportunities to sales teams and salespeople. A +standard practice is to assign leads based on the probability of winning each lead. Companies can +prioritize the leads that are more likely to result in successful deals by quickly assigning them +to the appropriate salespeople. + +Odoo automatically calculates the probability of winning each lead using a method called *predictive +lead scoring*. + +## Predictive lead scoring + +Predictive lead scoring is a machine-learning model that uses historical data from Odoo *CRM* to +score open leads/opportunities. + +As a company processes opportunities through the CRM pipeline, Odoo collects data on which +opportunities are won and lost. Predictive lead scoring uses this data to predict the probability +of winning each new lead or opportunity. + +The more opportunities that are sent through the CRM pipeline, the more data Odoo collects, +resulting in more accurate probabilities. + +Specifically, Odoo's predictive lead scoring uses the *naive Bayes* probability model: + +$$ +\begin{equation} P(A | B) = \frac{P(A) \times P(B | A)}{P(B)} \end{equation} +$$ + +Breaking down the equation: + +- P(A|B) = The probability of a successful lead *in this case* +- P(A) = The overall probability of a lead being successful regardless of the conditions +- P(B|A) = The probability of this being the case given a lead is successful +- P(B) = The probability of this being the case + +The term *in this case* refers to the variables that can affect a lead being successful in Odoo. +This can include variables such as the assigned Salesperson, the source of the lead, the language of +the lead, and other historical and demographic data. + +Which variables are considered in this calculation can be {ref}`configured +` to tailor the calculation to each business's needs. + +The probability of success of each opportunity is displayed on the opportunity form, and it updates +automatically as the opportunity progresses through the CRM pipeline. + +```{image} lead_scoring/probability-opportunity-form.png +:align: center +:alt: The probability of success displayed on the opportunity form. +``` + +When an opportunity moves to the next stage, its probability of success automatically increases +according to the predictive lead scoring algorithm. + +(lead-scoring-configuration)= + +### Configuration + +Predictive lead scoring is always active in Odoo *CRM*. However, the variables used to calculate the +probability of success can be customized in the settings. + +To customize the variables used by predictive lead scoring, go to {menuselection}`CRM --> +Configuration --> Settings`. Under {guilabel}`Predictive Lead Scoring`, click on the +{guilabel}`Update Probabilities` button. + +Then, click on the drop-down menu to choose which variables the predictive lead scoring feature +will take into account. + +```{image} lead_scoring/update-probabilities.png +:align: center +:alt: The Update Probabilities window in the Predictive Lead Scoring settings. +``` + +Any number of the following variables can be activated: + +- {guilabel}`State`: the geographical state from which the opportunity originates +- {guilabel}`Country`: the geographical country from which the opportunity originates +- {guilabel}`Phone Quality`: whether or not a phone number is listed for the opportunity +- {guilabel}`Email Quality`: whether or not an email address is listed for the opportunity +- {guilabel}`Source`: the source of an opportunity (e.g. search engine, social media) +- {guilabel}`Language`: the spoken language specified on the opportunity +- {guilabel}`Tags`: the tags placed on the opportunity + +:::{note} +The variables `Stage` and `Team` are always in effect. `Stage` refers to the CRM pipeline stage +that an opportunity is in. `Team` refers to the sales team that is assigned to an opportunity. +Predictive lead scoring *always* takes into account these two variables, regardless of which +optional variables are selected. +::: + +Next, click on the date field next to the option {guilabel}`Consider leads created as of the:` to +select the date from which predictive lead scoring will begin its calculations. + +Lastly, click {guilabel}`Confirm` to save changes. + +### Change the probability manually + +An opportunity's probability of success can be changed manually on the opportunity form. Click on +the probability number to edit it. + +:::{important} +Manually changing the probability removes the automatic probability updates for that +opportunity. The probability will no longer update automatically as the opportunity moves +through each stage of the pipeline. +::: + +To reactivate automatic probability, click on the gear icon next to the probability percentage. + +```{image} lead_scoring/probability-gear-icon.png +:align: center +:alt: The gear icon used to reactivate automatic probability on an opportunity form. +``` + +## Assign leads based on probability + +Odoo *CRM* can assign leads/opportunities to sales teams and salespeople based on specified rules. +Create assignment rules based on the leads' probability of success to prioritize those that are +more likely to result in deals. + +### Configure rule-based assignment + +To activate *rule-based assignment*, navigate to {menuselection}`CRM --> Configuration --> +Settings`, and activate {guilabel}`Rule-Based Assignment`. + +The rule-based assignment feature can be set to run {guilabel}`Manually`, meaning an Odoo user must +manually trigger the assignment, or {guilabel}`Repeatedly`, meaning Odoo will automatically trigger +the assignment according to the chosen time period. + +To set up automatic lead assignment, select {guilabel}`Repeatedly` for the {guilabel}`Running` +section. Then, customize how often Odoo will trigger the automatic assignment in the +{guilabel}`Repeat every` section. + +```{image} lead_scoring/rule-based-assignment.png +:align: center +:alt: The Rule-Based Assignment setting in CRM settings. +``` + +If rule-based assignment is set to run {guilabel}`Repeatedly`, the assignment can still be +triggered manually using the circular arrow icon in the {guilabel}`Rule-Based Assignment` settings +(or using the {guilabel}`Assign Leads` button on the sales team configuration page). + +### Configure assignment rules + +Next, configure the *assignment rules* for each sales team and/or salesperson. These rules +determine which leads Odoo assigns to which people. To get started, navigate to {menuselection}`CRM +--> Configuration --> Sales Teams`, and select a sales team. + +On the sales team configuration form, under {guilabel}`Assignment Rules`, click on {guilabel}`Edit +Domain` to configure the rules that Odoo uses to determine lead assignment for this sales team. The +rules can include anything that may be relevant for this company or team, and any number of rules +can be added. + +Click {guilabel}`Add Filter` to start creating assignment rules. Click on the {guilabel}`+` sign on +the right of the assignment rule to add another line. Click on the {guilabel}`x` symbol to remove +the line. + +To create an assignment rule based on an opportunity's probability of success, click on the far +left drop-down menu of an assignment rule line, and select {guilabel}`Probability`. + +From the middle drop-down menu, select the desired equation symbol—most likely the symbol for +*greater than*, *less than*, *greater than or equal to*, or *less than or equal to*. + +In the far right space, enter the desired number value of the probability. Finally, click +{guilabel}`Save` to save changes. + +```{eval-rst} +.. example:: + To configure an assignment rule such that a sales team receives leads that have a probability of + success of 20% or greater, create a :guilabel:`Domain` line that reads: `Probability >= 20`. + + .. image:: lead_scoring/probability-domain.png + :align: center + :alt: Sales team domain set to probability greater than or equal to twenty percent. +``` + +Separate assignment rules can also be configured for individual team members. From the sales team +configuration page, click on a team member in the {guilabel}`Members` tab, then edit the +{guilabel}`Domain` section. Click {guilabel}`Save` to save changes. + +If automatic lead assignment is configured in the settings, both the sales team and individual team +members have the option to {guilabel}`Skip auto assignment`. Check this box to omit a particular +sales team or salesperson from being assigned leads automatically by Odoo's rule-based assignment +feature. If {guilabel}`Skip auto assignment` is activated, the sales team or salesperson can still +be assigned leads manually. + +To manually assign leads to this sales team, click on the {guilabel}`Assign Leads` button at the +top of the sales team configuration page. This will assign any leads that are currently unassigned +and match this team's specified domain. + diff --git a/content/applications/sales/crm/track_leads/marketing_attribution.md b/content/applications/sales/crm/track_leads/marketing_attribution.md new file mode 100644 index 000000000..43eebdd1d --- /dev/null +++ b/content/applications/sales/crm/track_leads/marketing_attribution.md @@ -0,0 +1,169 @@ +# Marketing attribution reports + +Use the Odoo *CRM* app to compile a *marketing attribution report*, which analyzes the source of +leads, and groups them in such a way as to calculate marketing's overall impact on lead generation, +attribution, won rate, and more. + +## Leads Analysis dashboard + +Begin by navigating to the {guilabel}`Leads Analysis` dashboard by going to {menuselection}`CRM app +--> Reporting --> Leads`. + +:::{tip} +Reports can also be run on the {menuselection}`CRM app --> Leads` dashboard, which is **only** +accessible if the *Leads* feature has been activated on the *Settings* page. + +If the *Leads* feature has **not** been activated, the {menuselection}`CRM app --> Sales --> My +Pipeline` dashboard can also be used to run reports. + +Both dashboards contain the necessary *Filters* and *Group By* criteria to run an attribution +report. +::: + +:::{seealso} +- {doc}`Convert leads into opportunities <../acquire_leads/convert>` +- {doc}`Create leads <../acquire_leads/email_manual>` +::: + +```{image} marketing_attribution/reporting-tab-and-leads.png +:align: center +:alt: Open the CRM app and click on the Reporting tab at the top of the page, then +: click Leads. +``` + +The {icon}`fa-area-chart` {guilabel}`(graph)` view is shown, by default, with {guilabel}`Active or +Inactive` and {guilabel}`Created on: [current year]` filters active in the {guilabel}`Search...` +bar. The graph visualization displays the number of leads generated, by month and by sales team, +with each sales team attributed to its own color per month shown. + +Switch the view to the {icon}`oi-view-list` {guilabel}`(list)` option, by clicking the respective +icon located at the top-right of the dashboard. This allows leads to easily be displayed in the +grouping set by the *Group By* parameters. + +```{image} marketing_attribution/list-view-button.png +:align: center +:alt: Click the button with four horizontal lines on the top right of the Leads Analysis +: page. +``` + +## Add UTM parameters + +*Urchin Tracking Modules (UTMs)* are snippets of text embedded in URLs that are used to track +visitor data. This includes parameters relating to how a visitor reached the link, such as the type +of website visited, and/or marketing campaign the visit came from. + +Odoo can use these UTMs as parameters in the marketing attribution report to track the metrics and +performance of marketing campaigns. + +### Create UTMs + +The {doc}`link tracker <../../../websites/website/reporting/link_tracker>` in Odoo can be used to +create and configure UTMs. + +UTMs can also be automatically generated by the {doc}`Email Marketing +<../../../marketing/email_marketing>` and {doc}`Marketing Automation +<../../../marketing/marketing_automation>` apps. + +The UTM parameters used in a marketing attribution report are *Medium*, *Source*, and *Campaign*, in +descending order of coverage. + +- *Medium* is the UTM with the widest coverage, and is used to identify the medium used to access + the link. This can include mediums such as social media, email, or cost per click (CPC). +- *Source* is more narrow, and is used to identify the source of traffic. For example, the name of + a website, search engine used, or a specific social media platform. +- *Campaign* is the most narrow, and can track specific marketing campaigns by name. This can + include a contest or product name, type of sale, etc. + +## Create reports + +To start creating a report, click the {icon}`fa-caret-down` {guilabel}`(down arrow)` to the right of +the {guilabel}`Search...` bar to see the list of filtering and grouping parameters. + +{guilabel}`Filters`, located in the left column of the search options, can be used to keep only the +results that fit the filter. For example, selecting the {guilabel}`Won` filter only shows leads that +have been won in the attribution report. + +{guilabel}`Group By`, found in the middle column, is used to organize the results into groups, and +can be used with or without filters. + +```{image} marketing_attribution/search-results-multiple-options.png +:align: center +:alt: Select any number of filters and groups in the search options. +``` + +:::{tip} +Setting multiple {guilabel}`Group By` options creates nested groups, according to which option +is selected first. For example, selecting {guilabel}`Medium`, followed by {guilabel}`Source`, +and then {guilabel}`Campaign`, in {guilabel}`Group By` column, sorts all results *first* by +medium, *then* by the specific sources in each medium, followed by the campaigns in each source. + +This can be verified by looking at the direction, and order, of the selections in the group tile +that appears in the {guilabel}`Search...` bar. + +```{image} marketing_attribution/group-by.png +:align: center +:alt: The text in the tile is `Country > City`, showing that city is a subgroup of +: country. +``` +::: + +```{eval-rst} +.. example:: + For a useful first report: + + #. From the :guilabel:`Filters` column, select the :guilabel:`Active` filter to view only leads + that are still marked as active. + #. From the :guilabel:`Group By` column, select (in this specific order) :guilabel:`Source`, + followed by the :guilabel:`City` or :guilabel:`Country`, depending on which grouping is more + relevant. + + .. image:: marketing_attribution/campaign-and-country-groups.png + :align: center + :alt: Each lead is now sorted by source, followed by city or country. + + This report contains all active leads, grouped first by the source of the lead, then by the + city or country each lead is from. This is useful to see the density of active opportunities + sorted by location. + + With this data, marketing campaigns, such as conferences or billboards, can be targeted to the + locations generating the largest amount of potential revenue. Similarly, more attention can be + put toward increasing outreach in locations where existing marketing campaigns are less + effective. +``` + +## Export reports + +To set the measures of the report, begin by navigating to the {icon}`oi-view-pivot` +{guilabel}`(pivot view)` on the {guilabel}`Leads Analysis` dashboard. + +Click the {guilabel}`Measures` button to view the available measures of +the report. Select the desired measures from the drop-down menu (multiple measures can be selected), +and verify the measures, filters, and groups are all displayed correctly in the pivot table. This +ensures the data is ready for export. + +To quickly export the data in a list, as a .xlsx file, navigate to the {icon}`oi-view-list` +{guilabel}`(list view)`. Click on the {guilabel}`Actions` {icon}`fa-cog` {guilabel}`(gear)` icon, +located to the right of {guilabel}`Lead Analysis` in the top-left of the page, and click +{icon}`fa-upload` {guilabel}`Export All`. The report downloads automatically as a .xlsx file. + +For more export options, the report can be exported to the Odoo *Documents* app. From the +{icon}`oi-view-list` {guilabel}`(list view)` of {guilabel}`Leads Analysis` page, begin by clicking +the {guilabel}`Actions` {icon}`fa-cog` {guilabel}`(gear)` icon again. Now, navigate to +{icon}`fa-table` {guilabel}`Spreadsheet`, and click {icon}`oi-view-list` {guilabel}`Insert list in +spreadsheet`. A pop-up window titled, {guilabel}`Select a spreadsheet to insert your list.` appears. + +The report can be renamed using the `Name of the list` field, if desired. The number of items on the +report can be set with the field labeled: `Insert the first _ records of the list`. Next, select +either a new {guilabel}`Blank spreadsheet`, or export into an existing spreadsheet. Finally, click +the {guilabel}`Confirm` button. + +```{image} marketing_attribution/documents-export.png +:align: center +:alt: Set the name, number of records, and location of the export in the option menu. +``` + +To export the report as a .xlsx file, for use in an external spreadsheets program, click the +{guilabel}`Actions` {icon}`fa-cog` {guilabel}`(gear)` icon, and select the {icon}`fa-upload` +{guilabel}`Export All` option. If prompted, choose a file location, name the file, then click +{guilabel}`Save`. + diff --git a/content/applications/sales/crm/track_leads/quality_leads_report.md b/content/applications/sales/crm/track_leads/quality_leads_report.md new file mode 100644 index 000000000..a494c84e7 --- /dev/null +++ b/content/applications/sales/crm/track_leads/quality_leads_report.md @@ -0,0 +1,223 @@ +# Quality leads report + +A *quality lead* is a lead that is likely to result in a sale. It should match the characteristics +most commonly believed to help salespeople close a deal, in addition to more precise criteria that +is specific to each organization. + +:::{note} +The specific criteria that defines a *quality lead* is different for every organization. For more +information, see {ref}`Define a quality lead `. +::: + +A quality leads *report* compares how many quality leads each salesperson has received over a +specific amount of time, such as within the past 30 days. Sales managers can use such a report to +make more informed decisions when assigning new leads to their team + +```{eval-rst} +.. example:: + A sales manager pulls a quality leads report using their company's criteria: + + - Leads must include a phone number and an email address. + - The email address must be from a professional domain. + - The source for the lead must be from a live chat conversation or an appointment with a + salesperson. + + After running the report, the manager can see that, although everyone's ability to close a deal + has varied, some members of the sales team have received a higher number of quality leads than + others. + + .. image:: quality_leads_report/example-report.png + :align: center + :alt: An example of a quality leads report in the Odoo CRM application. + + Using this information, the sales manager may decide to assign more quality leads to the sales + people currently on the lower end, to balance out the distribution of quality leads. +``` + +(track-links-create-quality-leads-report)= + +## Create a quality leads report + +To create a quality leads report, first navigate to {menuselection}`CRM app --> Reporting --> +Pipeline` to open the {guilabel}`Pipeline Analysis` dashboard. Click into the {guilabel}`Search...` +bar at the top of the page and remove any active filters. + +Click the {guilabel}`🔻(triangle pointed down)` icon to the right of the {guilabel}`Search...` bar +to open the drop-down mega menu that contains {guilabel}`Filters`, {guilabel}`Group By`, and +{guilabel}`Favorites` columns. Click {guilabel}`Add Custom Filter`. This opens a {guilabel}`Add +Custom Filter` pop-up window. + +The {guilabel}`Add Custom Filter` pop-up window allows for the creation of more specific filters. + +### Add custom filters + +In order to generate a quality leads report, filters need to be created for the following +conditions: + +- {ref}`Starting date `: limits results to those created within + a specific time frame. +- {ref}`Specific sales teams `: limits results to only include + leads for one or more sales teams. This filter is optional and should not be included if the is + intended for the entire company. +- {ref}`Exclude unassigned leads `: excludes leads without an + assigned salesperson. +- {ref}`Include archived leads `: ensures that both active and + inactive leads are included in the results. +- {ref}`Add rules for quality leads `: includes or excludes + results based on criteria that is specific to a company or sales team. + +:::{figure} quality_leads_report/configured-custom-rules.png +:align: center +:alt: An example of the Custom Filter pop-up window with all of the rules configured. + +An example of the *Custom Filter* pop-up window with all of the default rules configured. +::: + +(quality-leads-report-starting-date)= + +#### Add a starting date filter + +Begin by first defining the rule's parameter with a date range, by clicking into the first field, on +the left of the row, and typing `Created On` in the {guilabel}`Search...` bar, or by scrolling +through the menu's list to locate it. + +In the rule's operator drop-down menu, define the parameter further by selecting either: + +- {guilabel}`>= (greater than or equal to)` to specify a start date and include all entries *after* + that start date (as well as the initial value itself); or +- {guilabel}`is between` to more sharply define a time frame with a clear start and end date. All + matching entries that fit within the defined start and end dates are included in the report. + +With either option, use the pop-up calendar's day and time pickers, in the far right field, to +define the respective date range. Setting these values concludes the creation of the first rule. + +(quality-leads-report-sales-team)= + +#### Add a sales team filter + +:::{note} +This filter is optional. To view results for the entire company, do **not** add this filter. +::: + +To limit the results of the report to one or more sales teams, click {guilabel}`New Rule`. Next, +click the first field for the new rule, and type `Sales Team` in the {guilabel}`Search...` bar, or +scroll to search through the list to locate it. + +In the rule's second field, select {guilabel}`is in` from the drop-down menu. Selecting this +operator limits results to the sales teams selected in the next field. + +Lastly, in the third field, select the desired sales team from the drop-down menu. Multiple teams +can be added in this field, where each parameter is treated with an "or" (e.g. "any") operator in +the search logic. + +(quality-leads-report-unassigned-leads)= + +#### Exclude unassigned leads + +Next, add a {guilabel}`New Rule`. Then, click into the first field for the new rule, and type +`Salesperson` in the {guilabel}`Search...` bar, or scroll to search through the list to locate it. + +In the rule's second field, select {guilabel}`is set` from the drop-down menu. Selecting this +operator excludes any leads not assigned to a specific salesperson. + +(quality-leads-report-archived-leads)= + +#### Include archived leads + +:::{tip} +This filter is also optional, as it adds archived (inactive) leads to the report, however it is +recommended to include this since it pulls *all* assigned leads, regardless of status, into the +report. This ensures a more accurate representation of assigned leads is captured. However, to +pull a report that only includes active leads, do **not** activate this feature. +::: + +Next, in the upper-right corner of the {guilabel}`Add Custom filter` pop-up window, move the +{guilabel}`Include archived` toggle to active. + +```{image} quality_leads_report/include-archived.png +:align: center +:alt: The Add Custom Filter pop-up with emphasis on the Include Archived toggle. +``` + +Enabling this feature adds archived (inactive) leads to the report. + +(quality-leads-report-add-quality-rules)= + +#### Add rules for quality leads + +The filters added in this step vary, based on how an organization defines a *quality lead*. + +(track-links-define-a-lead)= + +##### Define a quality lead + +As defined earlier, a *quality lead* is a lead that is likely to result in a won opportunity. +Although the exact criteria for a quality lead varies from organization to organization, it is often +a combination of factors commonly attributed to positive sales outcomes, in addition to factors +valued by the specific organization. + +In addition to the basic filters and grouping options outlined in the general {ref}`Quality leads +report `, consider the following filters when defining a +quality lead: + +- {guilabel}`Email` or {guilabel}`Phone`: the information in these fields can help determine whether + or not a lead is a professional contact. +- {guilabel}`Source`: this field links to the marketing and lead generation efforts from other Odoo + applications, including *Live Chat*, *Social Marketing*, and *Email Marketing*. +- {guilabel}`Stage`: this filter can be used to eliminate or target leads that have reached specific + stages. +- {guilabel}`Medium`: a lead's source can indicate its quality level, as various channels have + different won rates and expected revenues. +- {guilabel}`Campaign`: adding this filter helps track of the success of different marketing efforts + to capture high quality leads. +- {guilabel}`Lost Reason`: exclude leads that may appear to be quality based on various criteria, + but have been marked as *lost* for specified reasons. +- {guilabel}`Tags`: include or exclude results based on one or more customized tags. + +:::{tip} +When adding rules to a custom filter, keep the statements preceding each rule in mind. The +statement above a rule determines whether the search results must match **all** of the rules +below the statement, or **any** of the rules below the statement. + +```{image} quality_leads_report/match-all-match-any.png +:align: center +:alt: Close up of the match rule options on a add custom filter pop-up window. +``` +::: + +## View the report + +:::{important} +At the top of the {guilabel}`Add Custom Filter` form, there is an option to match {guilabel}`any` +or {guilabel}`all` of the rules. In order to properly run the report, only records that match +**all** of the following filters should be included. Before adding the filters, make sure +{guilabel}`all` is selected in this field. + +```{image} quality_leads_report/match-all-rules.png +:align: center +:alt: Close up on the match all rules option on the add a custom filter pop-up window. +``` +::: + +After the filters are configured, click {guilabel}`Add`. The default display for the report is a bar +graph, where the leads are grouped by *stage*. + +To group the results by salesperson, click the {guilabel}`🔻(triangle pointed down)` icon to the +right of the {guilabel}`Search...` bar to open the drop-down mega menu. Under the {guilabel}`Group +By` heading, select {guilabel}`Salesperson`. In the same column, under the {guilabel}`Group By` +heading, click {guilabel}`Add a Custom Group`, then select {guilabel}`Active` on the resulting +drop-down menu to layer in lead *status*, under the parent {guilabel}`Salesperson` grouping. + +The report now displays the total count of *quality leads* each salesperson has received in the +designated time period. Because there are layered {guilabel}`Group By` filters, the grouped leads +are also color-coded to identify whether they are *active* or *marked as lost*. + +:::{tip} +To save this search for later, click the {guilabel}`🔻(triangle pointed down)` icon next to the +{guilabel}`Search...` bar to open the drop-down menu. Under the {guilabel}`Favorites` heading, +click {guilabel}`Save current search`. + +In the drop-down menu, rename the report from the default `Pipeline` label to `Quality Leads`, +and click {guilabel}`Save`. +::: + diff --git a/content/applications/sales/crm/track_leads/resellers.md b/content/applications/sales/crm/track_leads/resellers.md new file mode 100644 index 000000000..dfd299737 --- /dev/null +++ b/content/applications/sales/crm/track_leads/resellers.md @@ -0,0 +1,130 @@ +# Resellers + +Within Odoo's *CRM* app, leads can be forwarded to resellers (or partners). Leads can be manually +assigned, or automatically assigned, based on the resellers' designated *level* and location. + +## Configuration + +To utilize the reseller features, the *Resellers* module first needs to be installed. Navigate to +the {menuselection}`Apps application`, and remove the {guilabel}`Apps` filter from the +{guilabel}`Search...` bar. Then, search for `Resellers`. + +```{image} resellers/resellers-module.png +:align: center +:alt: The resellers module in Odoo. +``` + +Click {guilabel}`Activate` on the {guilabel}`Resellers` module card that appears. Doing so installs +the module, and returns to the main Odoo dashboard. + +After the module is installed, navigate to the {menuselection}`CRM app`. Under the +{menuselection}`Configuration` menu is a new section, titled {guilabel}`Resellers`, with three +options beneath it: {guilabel}`Partner Levels`, {guilabel}`Partner Activations`, and +{guilabel}`Commission Plans`. + +(crm-partner-levels)= + +## Partner levels + +Partner *levels* are used to differentiate between various resellers. To view the partner levels, +navigate to {menuselection}`CRM app --> Configuration --> Resellers: Partner Levels`. + +On the {guilabel}`Partner Levels` page that appears, there are three default levels: + +- {guilabel}`Gold` +- {guilabel}`Silver` +- {guilabel}`Bronze` + +New levels can be added, as needed, by clicking {guilabel}`New`, and filling out the resulting level +form. + +Existing levels can also be edited and renamed, if desired, as well. To modify a level, select it +from the list, and proceed to make any desired changes from the level form page that appears. + +Level weight is used to decide the probability a partner to be assigned a lead or opportunity. On +the level form, assign a numerical value (greater than zero) to the {guilabel}`Level Weight` field. +If the weight is zero, no leads are assigned. + +:::{tip} +*Level Weight* can be assigned on an individual contact record. The weight assigned on the +individual record overwrites the default weight assigned on the level configuration form. +::: + +(crm-partner-activations)= + +## Partner activations + +Partner *activations* are used to identify the status of a partner. Activations are assigned on an +individual contact record, and can be used to group or filter the *Partnership Analysis* report +({menuselection}`CRM app --> Reporting --> Partnerships`). + +To view the partner levels, navigate to {menuselection}`CRM app --> Configuration --> Partner +Activations`. + +Three activation types are created by default in the *CRM* app: + +- {guilabel}`Fully Operational` +- {guilabel}`Ramp-up` +- {guilabel}`First Contact` + +New partner activations can be added, as needed, by clicking {guilabel}`New`, and entering a +{guilabel}`Name` on the new line that appears. Then, select the desired status in the +{guilabel}`Active` column. + +Existing partner activations can also be edited and renamed, if desired. To rename a status, click +the {guilabel}`Name` field of a desired level, and enter a new name. + +To change the active status of an activation, slide the toggle in the {guilabel}`Active` column of +the desired activation to the *inactive* position. + +:::{figure} resellers/activations-toggle.png +:align: center +:alt: The list of default partner activations in the CRM app. + +The list of default Partner Activations in the CRM app. The toggle for First Contact is in the +inactive position, while the rest are active. +::: + +## Partner assignments + +After {ref}`partner levels ` and {ref}`partner activations +` configured. + +To update an individual partner record, navigate to {menuselection}`CRM app --> Sales --> +Customers`, and click the Kanban card for the desired partner to open the customer record. + +On the customer record, click the {guilabel}`Partner Assignment` tab. + +Click the {guilabel}`Partner Level` field, and select an option from the drop-down menu to assign a +level. Click the {guilabel}`Activation` field, and select a partner activation type from the +drop-down list, if desired. Then, click the {guilabel}`Level Weight` field to assign a different +level weight, if necessary. + +## Publish partners + +With the Odoo *Website* and *Resellers* apps installed, a new webpage (`/partners`) is created to +display a list of all active partners from the *CRM* app. + +Next, return to {menuselection}`CRM app --> Sales --> Customers`, and click the Kanban card for a +partner. From that partner's contact form, click the {guilabel}`Go to Website` smart button at the +top of the page to open that partner's webpage. + +Next, click {guilabel}`Edit` at the top-right of the partner's webpage, and use the {doc}`building +blocks <../../../websites/website/web_design/building_blocks>` to add any additional design +elements, or information about the partner. + +:::{tip} +A company summary is a useful addition to this page. +::: + +After making any necessary changes to the page, click {guilabel}`Save`. At the top of the page, +slide the {guilabel}`Unpublished` toggle to the active, {guilabel}`Published` position, if needed. + +Repeat these steps for all partners. + +```{image} resellers/partners-webpage.png +:align: center +:alt: An example of the partners webpage, displaying available partners by level and +: location. +``` + diff --git a/content/applications/sales/crm/track_leads/unattended_leads_report.md b/content/applications/sales/crm/track_leads/unattended_leads_report.md new file mode 100644 index 000000000..455a2385c --- /dev/null +++ b/content/applications/sales/crm/track_leads/unattended_leads_report.md @@ -0,0 +1,192 @@ +# Unattended leads report + +*Unattended leads* are leads that have scheduled activities that are either due or past due. +Whenever an activity is scheduled, Odoo tracks the due date, and sends email reminders to the users +the activity is assigned to. + +An *unattended leads report* compiles all active leads in the pipeline with due or past due +activities, allowing a sales manager to identify which opportunities require immediate attention. + +By pulling a daily unattended leads report, sales managers can remind their teams to address +outstanding activities before they become past due, helping avoid neglected leads and reinforcing +proactive behaviors in their salespeople. + +```{eval-rst} +.. example:: + + A sales manager starts their day by pulling an unattended leads report, and upon switching to + list view, they see the following: + + .. image:: unattended_leads_report/unattended-leads-example.png + :align: center + :alt: List view of a sample Unattended Leads report with the activities emphasized. + + Their team member, Mitchell, has two leads in the *Proposition* stage with activities that are + due. + + The yellow :guilabel:`📞 (phone)` icon indicates that the `Modern Open Space` lead has a phone + call activity scheduled for today. The red :guilabel:`✉️ (envelope)` icon indicates that the `5 VP + Chairs` lead has an email activity scheduled that is past due. + + Clicking on the `5 VP Chairs` lead, the sales manager opens the record of the lead and reviews the + chatter. They see that the email was scheduled to be sent two days ago, but Mitchell never marked + this activity as done. + + .. image:: unattended_leads_report/overdue-activities-email.png + :align: center + :alt: Example of overdue activities notification in the chatter of a lead. +``` + +:::{important} +In order to pull a unattended leads report, sales teams **must** be regularly utilizing activity +in the *CRM* pipeline, on individual lead and opportunity cards. + +It is **not** possible to compile a complete report if the sales people are not using the +*Activities* feature in the *chatter* + +For more information, refer to {doc}`Activities <../../../essentials/activities>` +::: + +## Create an unattended leads report + +To create an unattended leads report, first navigate to {menuselection}`CRM app --> Reporting --> +Pipeline` to open the {guilabel}`Pipeline Analysis` dashboard. Click into the {guilabel}`Search...` +bar at the top of the page, and remove all of the default filters. + +:::{note} +The {guilabel}`Created on` filter can remain active, as this variable may be useful to include in +the report. +::: + +Next, add custom filters by clicking the {guilabel}`🔻(triangle pointed down)` icon to the right of +the {guilabel}`Search...` bar to open the drop-down menu that contains {guilabel}`Filters`, +{guilabel}`Group By`, and {guilabel}`Favorites` columns. Under the {guilabel}`Filters` column, +click {guilabel}`Add Custom Filter`, which opens an {guilabel}`Add Custom Filter` pop-up window. + +The {guilabel}`Add Custom Filter` pop-up window allows for the creation of more specific filters. + +### Add custom filters + +In order to generate an unattended leads report, filters need to be created for the following +conditions: + +> - {ref}`Past due activities `: limits the results to only include +> leads with an assigned activity where the due date has past. This can be altered to include +> activities due to occur on the date the report is generated as well. +> - {ref}`Unassigned leads `: excludes leads without an +> assigned salesperson. +> - {ref}`Specific sales teams `: limits results to only include +> leads assigned to one or more sales teams. This filter is optional and should not be included if +> the report is intended for the entire company. + +(unattended-leads-report-past-due)= + +#### Add filter for past due activities + +Click the first field for the new rule, and type `Activities` in the {guilabel}`Search...` bar, or +scroll to search through the list to locate it. Then, next to {guilabel}`Activities`, click the +{guilabel}`> (greater than sign)` to open a new drop-down menu with secondary conditions. + +Type `Due Date` in the {guilabel}`Search...` bar, or scroll to search through the list. Click +{guilabel}`Due Date` to add it to the rule. + +> ```{image} unattended_leads_report/activities-due.png +> :align: center +> :alt: Custom filter pop-up with emphasis on the options for activities and due date. +> ``` + +Then, click into then next field and select {guilabel}`<=` from the drop-down menu. Selecting this +operator includes all activities with a due date up to, and including, the date selected in the next +field. + +The third field can be left as today's date, or adjusted as needed. + +(unattended-leads-report-exclude-unassigned)= + +#### Exclude unassigned leads + +After filtering for activities, add a {guilabel}`New Rule`. Then, click into the first field for the +new rule, and type `Salesperson` in the {guilabel}`Search...` bar, or scroll to search through the +list to locate it. + +In the rule's second field, select {guilabel}`is set` from the drop-down menu. Selecting this +operator excludes any leads not assigned to a specific salesperson. + +(unattended-leads-report-sales-team)= + +#### Add a Sales team + +:::{note} +This filter is optional. To view results for the entire company, do **not** add this filter, and +continue to {ref}`View results ` +::: + +To limit the results of the report to one or more sales teams, click {guilabel}`New Rule`. Next, +click the first field for the new rule, and type `Sales Team` in the {guilabel}`Search...` bar, or +scroll to search through the list to locate it. + +In the rule's second field, select {guilabel}`is in` from the drop-down menu. Selecting this +operator limits results to the sales teams selected in the next field. + +Lastly, in the third field, select the desired sales team from the drop-down menu. Multiple teams +can be added in this field, where each parameter is treated with an "or" (e.g. "any") operator in +the search logic. + +:::{figure} unattended_leads_report/configured-custom-rules.png +:align: center +:alt: An example of the Custom Filter pop-up window with all of the rules configured. + +An example of the **Add Custom Filter** pop-up window with all of the rules configured. +::: + +(unattended-leads-report-view-results)= + +## View results + +At the top of the {guilabel}`Add Custom Filter` form, there is an option to match {guilabel}`any` or +{guilabel}`all` of the rules. In order to properly run the report, only records that match **all** +of the following filters should be included. Before adding the filters, make sure {guilabel}`all` is +selected in this field. + +```{image} unattended_leads_report/all-custom-filter.png +:align: center +:alt: Example of overdue activities notification in the chatter of a lead. +``` + +After the filters are configured, click {guilabel}`Add`. The resulting report displays all leads +assigned to a salesperson where an activity is past due, or is due on the current date. The default +display is a bar graph, where the leads are grouped by *stage*. + +To group the results by salesperson, click the {guilabel}`🔻(triangle pointed down)` icon to the +right of the {guilabel}`Search...` bar to open the drop-down menu that contains {guilabel}`Filters`, +{guilabel}`Group By`, and {guilabel}`Favorites` columns. Under the {guilabel}`Group By` heading, +select {guilabel}`Salesperson`. + +:::{note} +The option to group by {guilabel}`Sales Team` is also available under the {guilabel}`Group By` +heading. +::: + +To change to a *list* view, click the {guilabel}`≣ (list)` icon in the top-right corner of the +screen. + +:::{tip} +> Clicking the {guilabel}`(toggle) icon` opens a drop-down menu of additional columns that can be +> added to the report. +> +> Some options that are beneficial for this report include: +> +> - {guilabel}`Activities`: the summary of the latest activity for this lead. +> - {guilabel}`Expected Closing`: the estimated date on which the lead will be won. +> - {guilabel}`Probability`: estimated success rate based on the stage. + +```{image} unattended_leads_report/additional-options.png +:align: center +:alt: Custom filter pop-up with emphasis on the options for activities and due date. +``` +::: + +:::{seealso} +{doc}`Activities <../../../essentials/activities>` +::: + diff --git a/content/applications/sales/members.md b/content/applications/sales/members.md new file mode 100644 index 000000000..a15685cdf --- /dev/null +++ b/content/applications/sales/members.md @@ -0,0 +1,93 @@ +--- +show-content: true +--- + +# Members + +The *Members* application is where all operations related to memberships can be configured and +managed. The *Members* app integrates with the *Sales* and *Accounting* applications to sell and +invoice memberships directly to customers. + +## Membership products + +To create a new membership product, navigate to {menuselection}`Members app --> Configuration --> +Membership Products`, and click {guilabel}`New` to open a blank product record. + +Complete the blank form with the necessary information, including the {guilabel}`Membership +Duration`. + +:::{note} +Membership products require a start and end date, as they are used to determine {ref}`membership +status `. Membership products can be sold *before* their active start +date. +::: + +```{image} members/membership-product.png +:align: center +:alt: A new membership product in the members app. +``` + +Membership products can be added to a sales order, and invoiced as regular products or +subscriptions. + +## Activate a membership + +To activate a membership from the *Contacts* application, navigate to {menuselection}`Contacts app`, +and click on a contact to open that specific contact's detail form. + +From the resulting contact form, open the {guilabel}`Membership` tab, and click {guilabel}`Buy +Membership`. + +On the {guilabel}`Join Membership` pop-up window that appears, select a {guilabel}`Membership` from +the drop-down menu. Then, configure a {guilabel}`Member Price`. + +Click {guilabel}`Invoice Membership` when both fields are filled in. Doing so reveals a +{guilabel}`Membership Invoices` page, wherein invoices can be confirmed and completed. + +Alternatively, to offer a free membership, tick the {guilabel}`Free Member` checkbox, in the +{guilabel}`Membership` tab of a contact form. + +(sales-membership-status)= + +## Membership status + +The {guilabel}`Current Membership Status` is listed on the {guilabel}`Membership` tab of each +contact record: + +- {guilabel}`Non Member`: a partner who has **not** applied for membership. +- {guilabel}`Cancelled Member`: a member who has cancelled their membership. +- {guilabel}`Old Member`: a member whose membership end date has passed. +- {guilabel}`Waiting Member`: a member who has applied for membership, but whose invoice has not + yet been created. +- {guilabel}`Invoiced Member`: a member whose invoice has been created, but has not been paid. +- {guilabel}`Paid Member`: a member who has paid the membership fee. + +## Publish members directory + +To publish a list of active members on the website, the *Online Members Directory* application must +first be {ref}`installed `. After installing the module, add the `/members` page to +the website's menu by {doc}`editing the website menu <../websites/website/pages/menus>`. + +```{image} members/membership-directory-app.png +:align: center +:alt: The Online Members directory module in Odoo. +``` + +### Publish individual members + +Return to {menuselection}`CRM app --> Sales --> Customers`, and click the Kanban card for a member. +From the resulting customer form that appears, click the {guilabel}`Go to Website` smart button at +the top of the page to open the member's webpage. + +Click the {icon}`fa-pencil` {guilabel}`Edit` button to reveal a sidebar of editing tools. After +making any necessary changes to the page, click {guilabel}`Save`. At the top of the page, slide the +{guilabel}`Unpublished` toggle to the active, {guilabel}`Published` position. + +Repeat these steps for all desired members. + +```{toctree} +:titlesonly: true + +members/members_analysis +``` + diff --git a/content/applications/sales/members/members_analysis.md b/content/applications/sales/members/members_analysis.md new file mode 100644 index 000000000..2e212ff3b --- /dev/null +++ b/content/applications/sales/members/members_analysis.md @@ -0,0 +1,58 @@ +--- +substitutions: + caret: '{icon}`fa-caret-down` {guilabel}`(down)` icon' + list: '{icon}`oi-view-list` {guilabel}`(list)` icon' + pivot: '{icon}`oi-view-pivot` {guilabel}`(pivot)` icon' +--- + +# Members analysis + +The *Members Analysis* report provides a detailed overview of all memberships sold and managed +within the *Members* application. + +To access the *Memberships Analysis* report, navigate to {menuselection}`Members app --> Reporting`. + +## Navigate the report + +The default *Members Analysis* report displays a bar chart, measuring the {guilabel}`Quantity` of +memberships against the amount of {guilabel}`Revenue Done`. The data is grouped by the assigned +salesperson, then by the month the membership begins. + +```{image} members_analysis/example-report.png +:align: center +:alt: A sample of the members analysis report. +``` + +Additional {ref}`Group By ` options include the following: + +- {guilabel}`Salesperson`: the internal user in charge of the contact. This information is managed + in the *Salesperson* field on the *Sales & Purchase* tab on the contact's record. +- {guilabel}`Associated Partner`: the contact listed as the *Associated Member* on the *Membership* + tab on the contact's record. +- {guilabel}`Membership Product`: the type of membership assigned to a contact. This includes both + purchased memberships and free memberships. +- {guilabel}`Current Membership State`: the status of the membership. +- {guilabel}`Company`: the company the membership is purchased through. This option only appears in + multi-company databases. +- {guilabel}`Month`: the month the membership began. + +## View results + +Click the {icon}`fa-area-chart` {guilabel}`(graph)` icon to change to graph view. Then, click the +corresponding icon at the top of the report to switch to a {icon}`fa-bar-chart` {guilabel}`(bar +chart)`, {icon}`fa-line-chart` {guilabel}`(line chart)`, or {icon}`fa-pie-chart` {guilabel}`(pie +chart)`. + +Click the {{ pivot }} to change to the pivot view. + +:::{tip} +The {ref}`pivot view ` can be used to view and analyze data in a more +in-depth manner. Multiple measures can be selected, and data can be viewed by month, and by +opportunity stage. +::: + +:::{seealso} +- {ref}`search/custom-filters` +- {ref}`search/favorites` +::: + diff --git a/content/applications/sales/point_of_sale.md b/content/applications/sales/point_of_sale.md new file mode 100644 index 000000000..56d9d6fb5 --- /dev/null +++ b/content/applications/sales/point_of_sale.md @@ -0,0 +1,202 @@ +--- +show-content: true +show-toc: true +--- + +# Point of Sale + +With **Odoo Point of Sale**, run your shops and restaurants easily. The app works on any device with +a web browser, even if you are temporarily offline. Product moves are automatically registered in +your stock, you get real-time statistics, and your data is consolidated across all shops. + +:::{seealso} +- [Odoo Tutorials: Point of Sale Tutorials](https://www.odoo.com/slides/point-of-sale-28) +- {doc}`IoT Boxes Documentations ` +::: + +(pos-session-start)= + +## Start a session + +From the **POS dashboard**, click {guilabel}`New Session`, and at the {guilabel}`Opening Cash +Control` screen, click {guilabel}`Open Session` to start a POS session, or click {guilabel}`Continue +Selling` if the session is already opened. + +:::{note} +{doc}`Multiple users ` can be logged into the same session at the +same time. However, the session can only be opened once on the same browser. +::: + +(pos-sell)= + +## Sell products + +Click on products to add them to the cart. To change the **quantity**, click {guilabel}`Qty` and +enter the number of products using the keypad. To add a **discount** or modify the product +**price**, click respectively {guilabel}`% Disc` or {guilabel}`Price` and enter the amounts. + +Once an order is completed, proceed to checkout by clicking {guilabel}`Payment`. Select the +**payment method**, enter the received amount, and click {guilabel}`Validate`. Click +{guilabel}`New Order` to move on to the next customer. + +```{image} point_of_sale/pos-interface.png +:alt: POS session interface. +``` + +:::{tip} +- You can use both `,` and `.` on your keyboard as decimal separators. +- **Cash** is selected by default if you enter the amount without choosing a payment method. +::: + +:::{note} +The system can only load a limited number of products for effective opening. Click +{guilabel}`Search more` if the desired product is not loaded automatically. +::: + +(pos-customers)= + +## Set customers + +Registering your customer is necessary to {doc}`collect their loyalty points and grant them rewards +`, automatically apply the {doc}`attributed pricelist +`, or {ref}`generate and print an invoice +`. + +You can create customers from an {ref}`open POS session ` by clicking +{menuselection}`Customer --> Create`, and filling in the contact information. You can also create +customers from the backend by going to {menuselection}`Point of Sale --> Orders --> Customers` and +clicking {guilabel}`New`. Then, fill in the information and save. + +To set a customer during an order, access the list of customers by clicking {guilabel}`Customer` on +the POS interface. You can also set a customer at the payment screen by clicking +{guilabel}`Customer`. + +(pos-customer-notes)= + +## Customer notes + +You can add **customer notes** about specific products directly from an open {ref}`POS session +`. For instance, to provide cleaning and maintenance tips. They can also be used +to track a customer's particular request, such as not wanting the product to be assembled for them. + +To do so, select a product and click {guilabel}`Customer Note` on the pad. Doing so opens a pop-up +window in which you can add or modify content for the note. + +:::{note} +Product notes from an {doc}`imported SO ` are displayed +identically in the cart. +::: + +```{image} point_of_sale/customer-notes.png +:alt: Customer note button and notes (SO and POS session) on products in the cart +``` + +Customer notes appear on customers' receipts and invoices similarly to how they appear in the cart, +under the related product. + +```{image} point_of_sale/notes-receipt.png +:alt: Customer receipt with notes from an SO and from the customer note feature +``` + +(pos-refund)= + +## Return and refund products + +To return and refund a product, + +1. {ref}`start a session ` from the **POS dashboard**; +2. click {guilabel}`Refund` and select the corresponding order; +3. select the product and the quantity to refund using the keypad; +4. click {guilabel}`Refund` to go back to the previous screen; +5. once the order is completed, click {guilabel}`Payment` to proceed to the refund; +6. click {guilabel}`Validate` and {guilabel}`New Order` to move on to the next customer. + +```{image} point_of_sale/refund.png +:alt: refund view from a POS +``` + +:::{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. +::: + +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. + +(pos-cash-register)= + +## Manage the cash register + +To add or take out cash from the register, click the **menu icon** in the upper right corner of your +screen and {guilabel}`Cash In/Out`. + +```{image} point_of_sale/menu-button.png +:alt: |- +: Dropdown menu to close a POS session, reach the backend, add or take cash out or check +: orders +``` + +Doing so opens a pop-up window on which you can select {guilabel}`Cash In` or {guilabel}`Cash Out`, +enter the amount and the reason, and click {guilabel}`Confirm`. + +(pos-session-close)= + +## Close the POS session + +To close your session, click the **menu icon** in the upper right corner of your screen and +{guilabel}`Close Session`. + +Doing so opens the {guilabel}`Closing Control` pop-up screen. From this screen, you can retrieve +various information: + +- the number of orders made and the total amount made during the session; +- the expected amounts grouped by payment method. + +Before closing this window, count your cash using the calculator icon. Doing so opens a pop-up +window that computes the total amount in the cash drawer depending on the coins and bills counted +and added manually. Then, click {guilabel}`Confirm` or {guilabel}`Discard` to close the window. The +computed amount is set in the {guilabel}`Counted` column, and the {guilabel}`Money Details` are +specified in the **Notes** section. + +```{image} point_of_sale/closing-control.png +:alt: How to close a POS session. +``` + +Once you are done controlling the amounts, click {guilabel}`Close Session` to close and go back to +the **POS dashboard**. + +:::{note} +- To reach the backend without closing the session, click {guilabel}`Backend` on the dropdown + menu. +- To abort, click {guilabel}`Discard` on the pop-up window. +- Depending on your setup, you might only be allowed to close a session if the expected cash + revenue equals the counted cash. To close it anyway, click {guilabel}`Ok` on the + {guilabel}`Payments Difference` screen. +::: + +:::{tip} +- It is strongly advised to close your POS session at the end of each day. +- To look at all your previous sessions, go to {menuselection}`Point of Sale --> Orders --> + Sessions`. +::: + +```{toctree} +:titlesonly: true + +point_of_sale/configuration +point_of_sale/employee_login +point_of_sale/receipts_invoices +point_of_sale/preparation +point_of_sale/combos +point_of_sale/shop +point_of_sale/restaurant +point_of_sale/pricing +point_of_sale/payment_methods +point_of_sale/pos_based_marketing +point_of_sale/online_food_delivery +point_of_sale/reporting +``` + diff --git a/content/applications/sales/point_of_sale/combos.md b/content/applications/sales/point_of_sale/combos.md new file mode 100644 index 000000000..f6830c7b4 --- /dev/null +++ b/content/applications/sales/point_of_sale/combos.md @@ -0,0 +1,64 @@ +# Product combos + +The **Product Combos** feature allows users to define and manage combination options for a single +product. + +In the context of a restaurant, the feature enables users to create multiple-choice menus. For +example, a user can define a main dish and specify various options for sides, drinks, or desserts +that customers can combine with the main dish. + +In retail, this feature allows you to create a product set with multiple products to choose from and +combine. + +## Configuration + +First, you need to create combination choices. To do so: + +1. Go to {menuselection}`Point of Sale --> Products --> Product Combos` and click {guilabel}`New`. +2. Name your combo and add the products you want customers to choose from by clicking {guilabel}`Add + a line`. You can also include an extra price for each option in the {guilabel}`Extra Price` + column. + +:::{note} +As a reference, the selected product's original price is displayed in the {guilabel}`Original +Price` column. +::: + +```{image} combos/combo-form.png +:scale: 75% +``` + +Second, you need to create a specific product to gather combo choices. To do this: + +1. Go to {menuselection}`Point of Sale --> Products --> Products` and click {guilabel}`New`. + +2. Set the {guilabel}`Product Type` to {guilabel}`Combo` and fill in the {guilabel}`General + Information` tab. + + :::{note} + The sales price of the combo product is fixed and does not vary based on the individual prices + of included items or the quantity of items in the combo. The combo product price is only + affected by the extra price optionally defined at the combo choice creation or if a variant of + one of the items has a specified extra price. + ::: + +3. Go to the {guilabel}`Combo Choices` tab, click {guilabel}`Add a line`, and select the + combinations to add. You can also create a new combination at this step by clicking + {guilabel}`New` on the popup window. + +```{image} combos/combo-product-form.png +:scale: 75% +``` + +Once you have created and added the combo choices into a product, you can sell combos in your retail +store or restaurant. + +## Practical application + +{ref}`Open a POS session ` and select the combo product. Choose the options and +click {guilabel}`Add to order`. As a reminder, the extra price appears under the related choices. + +```{image} combos/combo-select.png +:scale: 75% +``` + diff --git a/content/applications/sales/point_of_sale/configuration.md b/content/applications/sales/point_of_sale/configuration.md new file mode 100644 index 000000000..887dbd1d2 --- /dev/null +++ b/content/applications/sales/point_of_sale/configuration.md @@ -0,0 +1,101 @@ +--- +show-content: true +show-toc: true +--- + +# Configuration + +(configuration-settings)= + +## Access the POS settings + +To access the general POS settings, go to {menuselection}`Point of Sale --> Configuration --> +Settings`. Then, open the dropdown menu in the {guilabel}`Point of Sale` field and select the POS to +configure. + +```{image} configuration/select-pos-dropdown.png +:alt: Dropdown menu to select the POS in the app settings +``` + +:::{note} +These settings are available to users with the {doc}`access rights ` +{guilabel}`Administration` set as {guilabel}`Settings`. +::: + +You can also configure some settings from the dashboard by clicking the vertical ellipsis button +({guilabel}`⋮`) on a POS card. Doing so opens a popup window, from which you can: + +- {doc}`Enable multiple employees to log in. ` +- {doc}`Connect and set up an IoT sytem. ` +- {doc}`Connect and set up an ePOS printer. ` + +```{image} configuration/toggle-settings.png +:alt: popup window to access quick settings in POS +``` + +:::{note} +These settings are available to users with the {doc}`access rights ` +{guilabel}`Point of Sale` set as {guilabel}`Administrator`. +::: + +## Make products available + +To make products available for sale, + +1. Go to {menuselection}`Point of Sale --> Products --> Products`. +2. Select a product to open the product form. +3. Tick the {guilabel}`Point of Sale` checkbox at the top of the form. + +```{image} configuration/pos-available.png +:alt: Making a product available in your POS. +``` + +## PoS product categories + +### Configuration + +POS product categories allow users to categorize products and get a more structured and clean +POS interface. + +To manage PoS categories, go to {menuselection}`Point of Sale --> Configuration --> PoS Product +Categories`. To add a new category, click {guilabel}`Create`. Then, name it in the +{guilabel}`Category Name` field. + +To associate a category with a parent category, fill in the {guilabel}`Parent Category` field. A +parent category groups one or more child categories. + +```{eval-rst} +.. example:: + .. image:: configuration/parent-categories.png + :alt: The PoS product categories grouped by parent categories +``` + +### Assign PoS product categories + +Go to {menuselection}`Point of Sale --> Products --> Products` and open a product form. Then, go to +the {guilabel}`Point of Sale` tab and fill in the {guilabel}`Category` field under the +{guilabel}`Point of Sale` section with one or multiple PoS categories. + +```{image} configuration/form-pos-category.png +:alt: Point of Sale tab of a product form to add a PoS product category +``` + +### Restrict categories + +You can limit the categories displayed on your POS interface. To achieve this, go to your {ref}`POS +settings ` and choose the specific categories to display in the +{guilabel}`Restrict Categories` field within the {guilabel}`Product & PoS categories` section. + +```{image} configuration/restrict-category.png +:alt: Setting to set up the restrict category feature +``` + +```{toctree} +:titlesonly: true + +configuration/pos_iot +configuration/epos_printers +configuration/https +configuration/epos_ssc +``` + diff --git a/content/applications/sales/point_of_sale/configuration/epos_printers.md b/content/applications/sales/point_of_sale/configuration/epos_printers.md new file mode 100644 index 000000000..3a27dd884 --- /dev/null +++ b/content/applications/sales/point_of_sale/configuration/epos_printers.md @@ -0,0 +1,67 @@ +# ePOS printers + +ePOS printers are designed to work seamlessly with Point of Sale systems. Once connected, these +devices automatically share information, allowing for direct printing of tickets from the POS system +to the ePOS printer. + +## Configuration + +To use an ePos printer in Point of Sale: + +1. {ref}`Access the POS settings `. +2. Activate the {guilabel}`ePos Printer` feature. +3. Fill in the field with your ePos IP address. + +```{image} epos_printers/setting.png +:alt: setting to enable the ePos printer feature +``` + +:::{note} +When the printer connects to a network, it automatically prints a ticket with its IP address. +::: + +## Directly supported ePOS printers + +The following ePOS printers are directly compatible with Odoo without needing an {doc}`IoT system +`. + +- Epson TM-m30 i/ii/iii (Wi-Fi/Ethernet models only; Recommended) +- Epson TM-H6000IV-DT (Receipt printer only) +- Epson TM-T70II-DT +- Epson TM-T88V-DT +- Epson TM-L90-i +- Epson TM-T70-i +- Epson TM-T82II-i +- Epson TM-T83II-i +- Epson TM-U220-i +- Epson TM-m10 +- Epson TM-P20 (Wi-Fi® model) +- Epson TM-P60II (Receipt: Wi-Fi® model) +- Epson TM-P60II (Peeler: Wi-Fi® model) +- Epson TM-P80 (Wi-Fi® model) + +## ePOS printers with IoT system integration + +The following printers require an {doc}`IoT system ` to +be compatible with Odoo: + +- Epson TM-T20 family (incompatible ePOS software) +- Epson TM-T88 family (incompatible ePOS software) +- Epson TM-U220 family (incompatible ePOS software) + +:::{important} +- Epson printers using Wi-Fi/Ethernet connections and following the [EPOS SDK Javascript protocol](https://download4.epson.biz/sec_pubs/pos/reference_en/technology/epson_epos_sdk.html) are + compatible with Odoo **without** needing an {doc}`IoT system + `. +- Thermal printers using ESC/POS are compatible **with** an {doc}`IoT system + `. +- Epson printers using only USB connections are compatible **with** an {doc}`IoT system + `. +- Epson printers that connect via Bluetooth are **not compatible**. +::: + +:::{seealso} +- {doc}`https` +- {doc}`epos_ssc` +::: + diff --git a/content/applications/sales/point_of_sale/configuration/epos_ssc.md b/content/applications/sales/point_of_sale/configuration/epos_ssc.md new file mode 100644 index 000000000..5f8e98473 --- /dev/null +++ b/content/applications/sales/point_of_sale/configuration/epos_ssc.md @@ -0,0 +1,287 @@ +(epos-ssc-epos-printers)= + +# Self-signed certificate for ePOS printers + +To work with Odoo, some printer models that can be used without an +{doc}`IoT system ` may require {doc}`the HTTPS protocol ` to +establish a secure connection between the browser and the printer. However, trying to reach the +printer's IP address using HTTPS leads to a warning page on most web browsers. In that case, you can +temporarily {ref}`force the connection `, which allows you to reach the page +in HTTPS and use the ePOS printer in Odoo as long as the browser window stays open. + +:::{warning} +The connection is lost after closing the browser window. Therefore, this method should only be +used as a **workaround** or as a pre-requisite for the {ref}`following instructions +`. +::: + +(epos-ssc-instructions)= + +## Generate, export, and import self-signed certificates + +For a long-term solution, you must generate a **self-signed certificate**. Then, export and import +it into your browser. + +:::{important} +**Generating** an SSL certificate should only be done **once**. If you create another +certificate, devices using the previous one will lose HTTPS access. +::: + +```{eval-rst} +.. tabs:: + + .. tab:: Windows 10 & Linux OS + + .. tabs:: + + .. tab:: Generate a self-signed certificate + + Navigate to the ePOS' IP address (e.g., `https://192.168.1.25`) and force the + connection by clicking :guilabel:`Advanced` and :guilabel:`Proceed to [IP address] + (unsafe)`. + + .. figure:: epos_ssc/browser-https-insecure.png + :scale: 75% + :alt: warning page about the connection privacy on Google Chrome + + Warning page on Google Chrome, Windows 10 + + Then, sign in using your printer credentials to access the ePOS printer settings. To + sign in, enter `epson` in the :guilabel:`ID` field and your printer serial number in the + :guilabel:`Password` field. + + Click :guilabel:`Certificate List` in the :guilabel:`Authentication` section, and click + :guilabel:`create` to generate a new **Self-Signed Certificate**. The :guilabel:`Common + Name` should be automatically filled out. If not, fill it in with the printer IP address + number. Select the years the certificate will be valid in the :guilabel:`Validity + Period` field, click :guilabel:`Create`, and :guilabel:`Reset` or manually restart the + printer. + + The self-signed certificate is generated. Reload the page and click :guilabel:`SSL/TLS` + in the :guilabel:`Security` section to ensure **Selfsigned Certificate** is correctly + selected in the :guilabel:`Server Certificate` section. + + .. tab:: Export a self-signed certificate + + The export process is heavily dependent on the :abbr:`OS (Operating System)` and the + browser. Start by accessing your ePOS printer settings on your web browser by navigating + to its IP address (e.g., `https://192.168.1.25`). Then, force the connection as + explained in the **Generate a self-signed certificate tab**. + + If you are using **Google Chrome**, + + #. click :guilabel:`Not secure` next to the search bar, and :guilabel:`Certificate is + not valid`; + + .. image:: epos_ssc/browser-warning.png + :alt: Connection to the printer not secure button in Google Chrome browser. + + #. go to the :guilabel:`Details` tab and click :guilabel:`Export`; + #. add `.crt` at the end of the file name to ensure it has the correct extension; + #. select :guilabel:`Base64-encoded ASCII, single certificate`, at the bottom of the + pop-up window; + #. save, and the certificate is exported. + + .. warning:: + Make sure that the certificate ends with the extension `.crt`. Otherwise, some + browsers might not see the file during the import process. + + If you are using **Mozilla Firefox**, + + #. click the **lock-shaped** icon on the left of the address bar; + #. go to :menuselection:`Connection not secure --> More information --> Security tab + --> View certificate`; + + .. image:: epos_ssc/mozilla-not-secure.png + :alt: Connection is not secure button in Mozilla Firefox browser + + #. scroll down to the :guilabel:`Miscellaneous` section; + #. click :guilabel:`PEM (cert)` in the :guilabel:`Download` section; + #. save, and the certificate is exported. + + .. tab:: Import a self-signed certificate + + The import process is heavily dependent on the :abbr:`OS (Operating System)` and the + browser. + + .. tabs:: + + .. tab:: Windows 10 + + Windows 10 manages certificates, which means that self-signed certificates must be + imported from the certification file rather than the browser. To do so, + + #. open the Windows File Explorer and locate the downloaded certification file; + #. right-click on the certification file and click :guilabel:`Install + Certificate`; + #. select where to install the certificate and for whom - either for the + :guilabel:`Current User` or all users (:guilabel:`Local Machine`). Then, click + :guilabel:`Next`; + #. on the `Certificate Store` screen, tick :guilabel:`Place all certificates in + the following store`, click :guilabel:`Browse...`, and select + :guilabel:`Trusted Root Certification Authorities`; + + .. image:: epos_ssc/win-cert-wizard-store.png + + #. click :guilabel:`Finish`, accept the pop-up security window; + #. restart the computer to make sure that the changes are applied. + + .. tab:: Linux + + If you are using **Google Chrome**, + + #. open Chrome; + #. go to :menuselection:`Settings --> Privacy and security --> Security --> + Manage certificates`; + #. go to the :guilabel:`Authorities` tab, click :guilabel:`Import`, and select + the exported certification file; + #. accept all warnings; + #. click :guilabel:`ok`; + #. restart your browser. + + + If you are using **Mozilla Firefox**, + + #. open Firefox; + #. go to :menuselection:`Settings --> Privacy & Security --> Security --> View + Certificates... --> Import`; + #. select the exported certification file; + #. tick the checkboxes and validate; + #. restart your browser. + + .. tab:: Mac OS + + On Mac OS, you can secure the connection for all browsers by following these steps: + + #. open Safari and navigate to your printer's IP address. Doing so leads to a warning page; + #. on the warning page, go to :menuselection:`Show Details --> visit this website --> Visit + Website`, validate; + #. reboot the printer so you can use it with any other browser. + + To generate and export an SSL certificate and send it to IOS devices, open **Google Chrome** + or **Mozilla Firefox**. Then, + + .. tabs:: + + .. tab:: Generate a self-signed certificate + + Navigate to the ePOS' IP address (e.g., `https://192.168.1.25`) and force the + connection by clicking :guilabel:`Advanced` and :guilabel:`Proceed to [IP address] + (unsafe)`. + + .. figure:: epos_ssc/browser-https-insecure.png + :scale: 75% + :alt: Warning page about the connection privacy on Google Chrome + + Warning page on Google Chrome, Windows 10 + + Then, sign in using your printer credentials to access the ePOS printer settings. To + sign in, enter `epson` in the :guilabel:`ID` field and your printer serial number in the + :guilabel:`Password` field. + + Click :guilabel:`Certificate List` in the :guilabel:`Authentication` section, and click + :guilabel:`create` to generate a new **Self-Signed Certificate**. The :guilabel:`Common + Name` should be automatically filled out. If not, fill it in with the printer IP address + number. Select the years the certificate will be valid in the :guilabel:`Validity + Period` field, click :guilabel:`Create`, and :guilabel:`Reset` or manually restart the + printer. + + The self-signed certificate is generated. Reload the page and click :guilabel:`SSL/TLS` + in the :guilabel:`Security` section to ensure **Selfsigned Certificate** is correctly + selected in the :guilabel:`Server Certificate` section. + + .. tab:: Export a self-signed certificate + + The export process is heavily dependent on the :abbr:`OS (Operating System)` and the + browser. Start by accessing your ePOS printer settings on your web browser by navigating + to its IP address (e.g., `https://192.168.1.25`). Then, force the connection as + explained in the **Generate a self-signed certificate tab**. + + If you are using **Google Chrome**, + + #. click :guilabel:`Not secure` next to the search bar, and :guilabel:`Certificate is + not valid`; + + .. image:: epos_ssc/browser-warning.png + :alt: Connection to the printer not secure button in Google Chrome + + #. go to the :guilabel:`Details` tab and click :guilabel:`Export`; + #. add `.crt` at the end of the file name to ensure it has the correct extension; + #. select :guilabel:`Base64-encoded ASCII, single certificate`, at the bottom of the + pop-up window; + #. save, and the certificate is exported. + + .. warning:: + Make sure that the certificate ends with the extension `.crt`. Otherwise, some + browsers might not find the file during the import process. + + If you are using **Mozilla Firefox**, + + #. click the **lock-shaped** icon on the left of the address bar; + #. go to :menuselection:`Connection not secure --> More information --> Security tab + --> View certificate`; + + .. image:: epos_ssc/mozilla-not-secure.png + :alt: Connection is not secure button in Mozilla Firefox + + #. scroll down to the :guilabel:`Miscellaneous` section; + #. click :guilabel:`PEM (cert)` in the :guilabel:`Download` section; + #. save, and the certificate is exported. + + .. tab:: Android OS + + To import an SSL certificate into an Android device, first create and export it from a + computer. Next, transfer the `.crt` file to the device using email, Bluetooth, or USB. Once + the file is on the device, + + #. open the settings and search for `certificate`; + #. click :guilabel:`Certificate AC` (Install from device storage); + #. select the certificate file to install it on the device. + + .. Note:: + The specific steps for installing a certificate may vary depending on the version of + Android and the device manufacturer. + + .. tab:: iOS + + To import an SSL certificate into an iOS device, first create and export it from a computer. + Then, transfer the `.crt` file to the device using email, Bluetooth, or any file-sharing + service. + + Downloading this file triggers a warning pop-up window. Click :guilabel:`Allow` to download + the configuration profile, and close the second pop-up window. Then, + + #. go to the **Settings App** on the iOS device; + #. click :guilabel:`Profile Downloaded` under the user's details box; + #. locate the downloaded `.crt` file and select it; + #. click :guilabel:`Install` on the top right of the screen; + #. if a passcode is set on the device, enter the passcode; + #. click :guilabel:`Install` on the top right of the certificate warning screen and the pop-up + window; + #. click :guilabel:`Done`. + + .. image:: epos_ssc/ssl-ios-verified.png + + The certificate is installed, but it still needs to be authenticated. To do so, + + #. go to :menuselection:`Settings --> General --> About > Certificate Trust Settings`; + #. enable the installed certificate using the **slide button**; + #. click :guilabel:`Continue` on the pop-up window. +``` + +:::{important} +- If you need to export SSL certificates from an operating system or web browser that has not + been mentioned, search for `export SSL certificate` + `the name of your browser or operating + system` in your preferred search engine. +- Similarly, to import SSL certificates from an unmentioned OS or browser, search for `import SSL + certificate root authority` + `the name of your browser or operating system` in your preferred + search engine. +::: + +## Check if the certificate was imported correctly + +To confirm your printer's connection is secure, connect to its IP address using HTTPS. For example, +navigate to `https://192.168.1.25` in your browser. If the SSL certificate has been applied +correctly, you should no longer see a warning page, and the address bar should display a padlock +icon, indicating that the connection is secure. + diff --git a/content/applications/sales/point_of_sale/configuration/https.md b/content/applications/sales/point_of_sale/configuration/https.md new file mode 100644 index 000000000..7e46b8ca0 --- /dev/null +++ b/content/applications/sales/point_of_sale/configuration/https.md @@ -0,0 +1,21 @@ +# Secure connection (HTTPS) + +If **Direct Devices** is enabled in a Point of Sale settings (for example, if you use an {doc}`ePos +printer `), HTTP becomes the default protocol. + +## Force your Point of Sale to use a secure connection (HTTPS) + +Add a new **key** in the **System Parameters** to force your Point of Sale to use a secure +connection with the HTTPS protocol. + +To do so, activate the {ref}`developer mode `, go to {menuselection}`Settings --> +Technical --> Parameters --> System Parameters`, then create a new parameter, add the following +values and click on *Save*. + +- **Key**: `point_of_sale.enforce_https` +- **Value**: `True` + +:::{seealso} +- {doc}`epos_ssc` +::: + diff --git a/content/applications/sales/point_of_sale/configuration/pos_iot.md b/content/applications/sales/point_of_sale/configuration/pos_iot.md new file mode 100644 index 000000000..1745c3ce2 --- /dev/null +++ b/content/applications/sales/point_of_sale/configuration/pos_iot.md @@ -0,0 +1,63 @@ +# IoT system connection + +To connect the POS with an {doc}`IoT system `: + +1. Make sure both the Point of Sale and Internet of Things (IoT) apps are installed on your + database. + +2. Set up the {doc}`/applications/general/iot/iot_box` or + {doc}`/applications/general/iot/windows_iot`. + +3. Connect the peripheral devices to the IoT system: + + ```{eval-rst} + .. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - Device + - 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`. + * - Cash drawer + - The cash drawer should be connected to the printer with an RJ25 cable. + * - Barcode scanner + - The barcode scanner must end barcodes with an `ENTER` character (keycode 28) in order for + the barcode scanner to be compatible. This is most likely the barcode scanner's default + configuration. + * - Scale + - Connect the scale and power it on. Refer to :doc:`/applications/general/iot/devices/scale`. + * - Customer display + - Connect a screen to the :abbr:`IoT (Internet of Things)` box to display the :abbr:`PoS + (Point of Sale)` order. Refer to :doc:`/applications/general/iot/devices/screen`. + * - Payment terminal + - The connection process depends on the terminal. Refer to the :doc:`payment terminals + documentation `. + ``` + +4. {doc}`Connect the IoT system to your Odoo database `. + +5. {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, enable {guilabel}`IoT Box`, then select the devices + to be used for the POS. Click {guilabel}`Save`. + +:::{tip} +Click {guilabel}`IoT Devices` to access the list of {doc}`/applications/general/iot/devices` for +your POS and view their connection status. Click a card to access the device's form. +::: + +:::{seealso} +- [List of supported hardware](https://www.odoo.com/page/point-of-sale-hardware). +- {doc}`IoT documentation ` +::: + +(pos-pos-iot-connect-schema)= + +## Setup example + +```{image} pos_iot/pos-connections.png +:alt: A suggested configuration for a point of sale system. +``` + diff --git a/content/applications/sales/point_of_sale/employee_login.md b/content/applications/sales/point_of_sale/employee_login.md new file mode 100644 index 000000000..3d8160039 --- /dev/null +++ b/content/applications/sales/point_of_sale/employee_login.md @@ -0,0 +1,74 @@ +# Multi-employee management + +Odoo Point of Sale allows you to manage access to a specific POS by enabling the **Multi Employees +per Session** feature. When activated, {ref}`you can select which users can log into the POS +` and {ref}`keep track of the employees involved in each order +`. + +(employee-login-configuration)= + +## Configuration + +{ref}`Access the POS settings ` and select your POS, or click the vertical +ellipsis button ({guilabel}`⋮`) on a POS card and click {guilabel}`Edit`. Then, enable +{guilabel}`Multi Employees per Session`, and add the allowed employees in the {guilabel}`Allowed +Employees` field. + +```{image} employee_login/setting.png +:alt: setting to enable multiple cashiers in POS +``` + +(employee-login-use)= + +## Practical application + +Once the feature is activated, cashiers can log in {ref}`by scanning their badge +` or selecting their name from the list of allowed employees to {ref}`open the +session `. + +```{image} employee_login/open-session.png +:alt: window to open a session when the multiple cashiers feature is enabled +``` + +To switch to another user {ref}`from an open session `, click the employee name +at the top-right of the screen and select the employee to swap with from the list. + +```{image} employee_login/switch-user.png +:alt: button to switch from one cashier to another. +``` + +You can also require your employees to enter a pin code every time they log into a POS to prevent +them from logging in as someone else. To define the code, go to the **Employees** app, open the +employee form, and click the {guilabel}`HR settings` tab. Then, enter a pin code of your choice in +the {guilabel}`PIN Code` field of the {guilabel}`Attendance/Point of Sale` category. + +```{image} employee_login/pin-and-badgeid.png +:alt: setting on the employee form to assign a badge ID and a PIN code. +``` + +(employee-login-badge)= + +### Log in using badges + +For your employees to be able to log in by scanning their badge, they must have a badge ID assigned. +To do so, go to the **Employees** app, open the employee form, and click the {guilabel}`HR settings` +tab. Then, enter the badge ID of your choice in the {guilabel}`Badge ID` field of the +{guilabel}`Attendance/Point of Sale` category or click {guilabel}`Generate`. + +To switch to another user, lock the session by clicking the lock-shaped icon ({guilabel}`🔓`) at the +top-right of the screen and scan your badge. + +(employee-login-analytics)= + +## Analytics + +Once you close and post the POS session, access the comprehensive report to review all session +activities, including who initiated the session and who handled specific orders. To access the +session's report, click the vertical ellipsis button ({guilabel}`⋮`) on the POS card and select +{guilabel}`Sessions` from the {guilabel}`View` section. Then, select a specific session for more +detailed information, and click the {guilabel}`Orders` button to view a list of all orders placed +during that session. + +To get an overview of all orders, regardless of the session, click the vertical ellipsis button +({guilabel}`⋮`) on the POS card and select {guilabel}`Orders` from the {guilabel}`View` section. + diff --git a/content/applications/sales/point_of_sale/online_food_delivery.md b/content/applications/sales/point_of_sale/online_food_delivery.md new file mode 100644 index 000000000..53b597304 --- /dev/null +++ b/content/applications/sales/point_of_sale/online_food_delivery.md @@ -0,0 +1,228 @@ +# Online food delivery + +**UrbanPiper** is an order management system that integrates with multiple food delivery platforms. +It consolidates orders from all connected platforms into a single interface, simplifying the +delivery process. + +Supported providers: + +- [Careem](https://www.careem.com) +- [Cari](https://getcari.com/) +- [ChowNow](https://www.chownow.com) +- [Deliveroo](https://deliveroo.co.uk/) +- [DoorDash](https://www.doordash.com) +- [EatEasy](https://www.eateasy.ae/dubai) +- [Glovo](https://glovoapp.com) +- [Grubhub](https://www.grubhub.com) +- [HungryPanda](https://www.hungrypanda.co) +- [HungerStation](https://hungerstation.com) +- [Jahez](https://www.jahez.net/) +- [Just Eat](https://www.just-eat.ie/) +- [Mrsool](https://mrsool.co) +- [Ninja](https://ananinja.com/) +- [NoonFood](https://www.noon.com) +- [Postmates](https://www.postmates.com) +- [Rafeeq](https://www.gorafeeq.com/en) +- [SkipTheDishes](https://www.skipthedishes.com/) +- [Swiggy](https://www.swiggy.com) +- [Talabat](https://www.talabat.com) +- [UberEats](https://www.ubereats.com) +- [Zomato](https://www.zomato.com) + +## Configuration + +(online-food-delivery-credentials)= + +### UrbanPiper credentials + +1. Get your Atlas credentials: + + 1. Go to the {ref}`POS settings `. + 2. Scroll down to the {guilabel}`Food Delivery Connector` section. + 3. Click {guilabel}`Fill this form to get Username & Api key` and fill out the survey. + +2. [Go to your Atlas account](https://atlas.urbanpiper.com) and retrieve your API key and username + by navigating to {menuselection}`Settings --> API Access`. + +```{image} online_food_delivery/urban-piper-api.png +:alt: Atlas API access +``` + +### Point of Sale + +1. Enable the {guilabel}`Urban Piper` setting: + + 1. Go to the {ref}`POS settings `. + 2. Scroll down to the {guilabel}`Food Delivery Connector` section. + 3. Check the {guilabel}`Urban Piper` setting. + +2. Set up UrbanPiper: + + 1. Fill in the {guilabel}`Username` and {guilabel}`Api Key` fields with your {ref}`UrbanPiper + credentials `. + 2. Select the desired delivery providers in the {guilabel}`Food Delivery Platforms` field under + the {guilabel}`Urban Piper Location` section (i.e., Zomato, Uber Eats). + +3. Save the settings. + +4. Click the {guilabel}`+ Create Store` button. Doing so creates a new location on the UrbanPiper + Atlas platform. + +:::{note} +- The {guilabel}`Pricelist` and {guilabel}`Fiscal Position` fields are automatically selected + after saving. +- A successful store creation triggers a notification. +- The store creation process may take 2–3 minutes to reflect changes on the UrbanPiper Atlas + platform. +- The store is automatically named after your point of sale name. +::: + +```{image} online_food_delivery/create-store.png +:alt: Food delivery connector settings +``` + +### Products + +To make products available individually, + +1. Go to {menuselection}`Point of Sale --> Products --> Products`. + +2. Select any product to open its product form. + +3. Go to the {guilabel}`Point of Sale` tab. + +4. Complete the {guilabel}`Urban Piper` section: + + - Fill in the {guilabel}`Available on Food Delivery` with the desired POS. + - Optionally, set up the {guilabel}`Meal Type` field and enable the {guilabel}`Is Recommended` + and {guilabel}`Is Alcoholic` buttons. + +```{image} online_food_delivery/product-form.png +:alt: where to make a single product available for delivery +``` + +To make multiple products available for food delivery at once, + +1. Go to {menuselection}`Point of Sale --> Products --> Products`. +2. Click the list icon ({icon}`oi-view-list`) to switch to the list view. +3. Select the products. +4. Enter the desired POS in the {guilabel}`Available on Food Delivery` column. + +```{image} online_food_delivery/product-list.png +:alt: Product list +``` + +:::{note} +- Currently, UrbanPiper does not support combo products. +- As a workaround, create a product and define combo choices as {doc}`Attributes & Variants + <../sales/products_prices/products/variants>`. +::: + +### Synchronization + +To make products available on food delivery platforms, synchronize with your UrbanPiper account: + +1. Go to the {ref}`POS settings `. + +2. Scroll down the {guilabel}`Food Delivery Connector` section. + +3. Click the {guilabel}`Sync Menu` button. + + - The {guilabel}`Last Sync on` timestamp below the {guilabel}`Create Store` and {guilabel}`Sync + Menu` buttons updates. + +:::{note} +- A successful synchronization triggers a notification. +- The synchronization process may take 2–3 minutes to reflect changes on the UrbanPiper Atlas + platform. +::: + +### Go live + +1. [Go to the Locations tab](https://atlas.urbanpiper.com/locations) of your Atlas account. + +2. Select the location to activate, then click {guilabel}`Request to go Live`. + + ```{image} online_food_delivery/go-live.png + :alt: Request to go live button in the locations tab of the Atlas account + ``` + +3. In the popup window: + + 1. Select the platform(s) to activate and click {guilabel}`Next`. + 2. Enter the {guilabel}`Platform ID` and {guilabel}`Platform URL` in the corresponding fields to + establish the connection between the platform and UrbanPiper. + 3. Click the {guilabel}`Request to Go Live` button. + + ```{image} online_food_delivery/go-live-parameters.png + :alt: Go live parameters + ``` + + :::{note} + To find the location's {guilabel}`Platform ID` and {guilabel}`Platform URL`, + + 1. Click the location to open its setup form. + 2. The location's parameters are available in the {guilabel}`HUB` tab. + ::: + +4. Verify that your location is live: + + 1. [Go to the Locations tab](https://atlas.urbanpiper.com/locations) of your Atlas account. + 2. Select any provider in the {guilabel}`Assoc. platform(s)` column to review the status of that + platform for this location. + +## Order flow + +An order placed via the configured delivery platform triggers a notification. To manage these +orders, open the orders' list view by: + +1. Clicking {guilabel}`Review Orders` on the notification popup. + +2. Clicking the bag-shaped icon for online orders and {guilabel}`New`. + + ```{image} online_food_delivery/cart-button.png + :alt: Cart button + ``` + + :::{note} + - Clicking this icon displays the number of orders at each stage: {guilabel}`New`, + {guilabel}`Ongoing`, and {guilabel}`Done`. + - The {guilabel}`New` button indicates newly placed orders, {guilabel}`Ongoing` is for + accepted orders, and {guilabel}`Done` is for orders ready to be delivered. + ::: + +Then, + +1. Select the desired order. +2. Click the {guilabel}`Accept` button. +3. When an order is accepted, its {guilabel}`Order Status` switches from {guilabel}`Placed` to + {guilabel}`Acknowledged` and is automatically displayed on the preparation display. + +When the order is ready, + +1. Open the orders' list view. +2. Select the order. +3. Click the {guilabel}`Mark as ready` button. Its {guilabel}`Order Status` switches from + {guilabel}`Acknowledged` to {guilabel}`Food Ready`, and its {guilabel}`Status` switches from + {guilabel}`Ongoing` to {guilabel}`Paid`. + +### Order rejection + +Sometimes, the shop or restaurant may want to **reject** an order. In this case, open the orders' +list view, + +1. Select the desired order. +2. Click the {guilabel}`Reject` button. +3. Select one of the reasons from the popup window. + +```{image} online_food_delivery/reject-order.png +:alt: Reject order pop-up +``` + +:::{important} +**Swiggy** orders cannot be directly rejected. Attempting to reject one prompts Swiggy customer +support to contact the restaurant. Similarly, **Deliveroo**, **JustEat**, and **HungerStation** +do not allow order rejection. Always follow the respective provider's guidelines for handling +such cases. +::: + diff --git a/content/applications/sales/point_of_sale/payment_methods.md b/content/applications/sales/point_of_sale/payment_methods.md new file mode 100644 index 000000000..71278dc58 --- /dev/null +++ b/content/applications/sales/point_of_sale/payment_methods.md @@ -0,0 +1,38 @@ +--- +show-content: true +--- + +# Payment methods + +To add a payment method, you first need to create it. Go to {menuselection}`Point of Sale --> +Configuration --> Payment Methods --> New`, and set a name. Check {guilabel}`Identify Customer` to +allow this payment method *exclusively* for registered customers. + +Then, select the {guilabel}`Journal`. Choose {guilabel}`Cash` to use this payment method for cash +payments, or {guilabel}`Bank` to use it for card payments. + +```{image} payment_methods/payment-method.png +:alt: Creating a new payment method for a POS. +``` + +:::{note} +Selecting a {guilabel}`bank` journal automatically adds the {guilabel}`Use a Payment Terminal` +field in which you can add your {doc}`payment terminal's information +`. +::: + +:::{seealso} +{doc}`payment_methods/terminals`. +::: + +Once the payment method is created, you can select it in your POS settings. To do so, go to the +{ref}`POS' settings `, click {guilabel}`Edit`, and add the payment method +under the {guilabel}`Payments` section. + +```{toctree} +:titlesonly: true + +payment_methods/qr_code_payment +payment_methods/terminals +``` + diff --git a/content/applications/sales/point_of_sale/payment_methods/qr_code_payment.md b/content/applications/sales/point_of_sale/payment_methods/qr_code_payment.md new file mode 100644 index 000000000..575e5516c --- /dev/null +++ b/content/applications/sales/point_of_sale/payment_methods/qr_code_payment.md @@ -0,0 +1,112 @@ +# QR code payments + +QR code payments allow users to generate a code that customers can scan with their mobile banking +app to initiate a bank transfer or pay instantly. + +## Configuration + +### Activate and set up QR code payments + +Go to {menuselection}`Accounting --> Configuration --> Settings`, and + +1. Activate or upgrade your country's fiscal localization package under the {guilabel}`Fiscal + Localization` section to access all country-specific accounting features. +2. Activate {guilabel}`QR codes` under the {guilabel}`Customer Payments` section. + +Then, as the QR code type differs depending on your country, follow the corresponding documentation +page from the following table to set them up. + +```{eval-rst} +.. list-table:: + :widths: 20 20 20 40 + :header-rows: 1 + + * - QR code types + - Module name + - Technical name + - Description + * - Pix + - :doc:`Brazilian - Accounting<../../../finance/fiscal_localizations/brazil>` + - `l10n_br` + - The base module to manage the accounting chart and localization for Brazil. + * - FPS + - :doc:`Hong Kong - Accounting<../../../finance/fiscal_localizations/hong_kong>` + - `l10n_hk` + - The base module to manage the accounting chart and localization for Hong Kong. + * - QRIS + - :doc:`Indonesian - Accounting<../../../finance/fiscal_localizations/indonesia>` + - `l10n_id` + - The base module to manage the accounting chart and localization for Indonesia. + * - PayNow + - :doc:`Singapore - Accounting<../../../finance/fiscal_localizations/singapore>` + - `l10n_sg` + - The base module to manage the accounting chart and localization for Singapore. + * - QR-bill + - :doc:`Switzerland - Accounting<../../../finance/fiscal_localizations/switzerland>` + - `l10n_ch` + - The base module to manage the accounting chart and localization for Switzerland. + * - PromptPay + - :doc:`Thailand - Accounting<../../../finance/fiscal_localizations/thailand>` + - `l10n_th` + - The base module to manage the accounting chart and localization for Thailand. + * - VietQR + - :doc:`Vietnam - Accounting<../../../finance/fiscal_localizations/vietnam>` + - `l10n_vn` + - The base module to manage the accounting chart and localization for Vietnam. + * - EPC + - :doc:`Account SEPA QR Code<../../../finance/accounting/customer_invoices/epc_qr_code>` + - `account_qr_code_sepa` + - This module adds support for SEPA Credit Transfer QR-code generation. +``` + +### Create the payment method + +1. Open the Point of Sale application. + +2. Go to {menuselection}`Configuration --> Payment Methods` and create a payment method. + +3. Set a bank-type journal. + +4. Select {guilabel}`Bank App (QR Code)` under the {guilabel}`Integration` section. + +5. Select the {guilabel}`QR Code Format` from the dropdown menu. + + - Select {guilabel}`SEPA Credit Transfer QR` if you are part of the Single Euro Payments Area + (SEPA). + - Select {guilabel}`EMV Merchant-Presented QR-code` for other QR code types. + +```{image} qr_code_payment/qr-payment-methods-setting.png +:alt: QR code payment method configuration +:scale: 85 % +``` + +:::{important} +At least one bank account must be defined in the journal to allow QR code payments to be +registered with bank apps. +::: + +Once the payment method is created, go to the {ref}`POS' settings ` and add +the payment method to your POS under the {guilabel}`Payment` section. + +```{image} qr_code_payment/qr-configuration-setting.png +:alt: Enable QR code payment method +:scale: 85 % +``` + +## Register payments using QR codes + +When processing a payment, select the payment method for QR code payments. A QR code is generated +and displayed on the screen for the customer to scan and pay with their mobile banking app. + +```{image} qr_code_payment/qr-payment-example.png +:alt: QR code payment example +:scale: 75 % +``` + +Hit {guilabel}`Confirm Payment` to validate the transaction. + +:::{important} +Odoo does **not** check the bank payment. It is recommended that users verify payments for +validity before confirming them on the POS register. +::: + diff --git a/content/applications/sales/point_of_sale/payment_methods/terminals.md b/content/applications/sales/point_of_sale/payment_methods/terminals.md new file mode 100644 index 000000000..512f1fabf --- /dev/null +++ b/content/applications/sales/point_of_sale/payment_methods/terminals.md @@ -0,0 +1,63 @@ +--- +show-content: true +--- + +# 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. + +(terminals-configuration)= + +## Configuration + +Go to the {ref}`application settings `, scroll down to the +{guilabel}`Payment Terminals` section, and tick your terminal's checkbox. + +```{image} terminals/payment-terminals.png +:alt: checkbox in the settings to enable a payment terminal +``` + +Then, follow the corresponding documentation to configure your device: + +- {doc}`Adyen configuration ` +- {doc}`Ingenico configuration ` +- {doc}`Mercado Pago configuration ` +- {doc}`Razorpay configuration ` +- {doc}`SIX configuration ` +- {doc}`Stripe configuration ` +- {doc}`Viva Wallet configuration ` +- {doc}`Worldline configuration ` + +Once the terminal is configured, you can {doc}`create the corresponding payment method and add it to +the POS <../payment_methods>`. + +## Pay with a payment terminal + +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`. + +:::{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`. +::: + +```{toctree} +:titlesonly: true + +terminals/adyen +terminals/ingenico +terminals/mercado_pago +terminals/razorpay +terminals/six +terminals/stripe +terminals/viva_wallet +terminals/worldline +``` + diff --git a/content/applications/sales/point_of_sale/payment_methods/terminals/adyen.md b/content/applications/sales/point_of_sale/payment_methods/terminals/adyen.md new file mode 100644 index 000000000..b7b896ba1 --- /dev/null +++ b/content/applications/sales/point_of_sale/payment_methods/terminals/adyen.md @@ -0,0 +1,84 @@ +# Adyen + +Connecting an **Adyen payment terminal** allows you to offer a fluid payment flow to your customers +and ease the work of your cashiers. + +:::{important} +- Adyen payment terminals do not require an {doc}`IoT Box `. +- Adyen terminals can be used in many countries, but not worldwide. Check the [List of countries + supported by Adyen](https://docs.adyen.com/point-of-sale/what-we-support/supported-languages/). +- Adyen works only with businesses processing more than **\$10 million annually** or invoicing a + minimum of **1,000 transactions per month**. +::: + +:::{seealso} +- [List of payment methods supported by Adyen](https://docs.adyen.com/point-of-sale/what-we-support/payment-methods/) +- [List of Adyen terminals](https://docs.adyen.com/point-of-sale/what-we-support/select-your-terminals/) +::: + +## Configuration + +Start by creating your Adyen account on [Adyen's website](https://www.adyen.com/). Then, board +your terminal following the steps described on your terminal's screen. + +:::{seealso} +[Adyen Docs - Payment terminal quickstart guides](https://docs.adyen.com/point-of-sale/user-manuals) +::: + +(adyen-api)= + +### Generate an Adyen API key + +The **Adyen API key** is used to authenticate requests from your Adyen terminal. To generate an API +key, go to your {menuselection}`Adyen account --> Developers --> API credentials`, and **create** +new credentials or select **existing** ones. Click {guilabel}`Generate an API key` and save the key +to paste it into the Odoo {guilabel}`Adyen API key` field at {ref}`the payment method creation +`. + +:::{seealso} +- [Adyen Docs - API credentials](https://docs.adyen.com/development-resources/api-credentials#generate-api-key). +::: + +(adyen-identifier)= + +### Locate the Adyen terminal identifier + +The **Adyen Terminal Identifier** is the terminal's serial number, which is used to identify the +hardware. + +To find this number, go to your {menuselection}`Adyen account --> Point of Sale --> Terminals`, +select the terminal to link with, and save its serial number to paste it into the Odoo +{guilabel}`Adyen Terminal Identifier` field at {ref}`the payment method creation +`. + +### Set the Event URLs + +For Odoo to know when a payment is made, you must configure the terminal **Event URLs**. To do so, + +1. Log in to [Adyen's website](https://www.adyen.com/); +2. Go to {menuselection}`Adyen's dashboard --> Point of Sale --> Terminals` and select the connected + terminal; +3. From the terminal settings, click {guilabel}`Integrations`; +4. Set the {guilabel}`Switch to decrypted mode to edit this setting` field as {guilabel}`Decrypted`; +5. Click the **pencil icon** button and enter your server address, followed by + `/pos_adyen/notification` in the {guilabel}`Event URLs` field; +6. Click {guilabel}`Save` at the bottom of the screen to save changes. + +(adyen-method-creation)= + +### Configure the payment method + +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}`Adyen` in the {guilabel}`Use a Payment Terminal` field. + +Finally, fill in the mandatory fields with your {ref}`Adyen API key `, {ref}`Adyen +Terminal Identifier `, and {guilabel}`Adyen Merchant Account`. + +```{image} adyen/payment-method.png +``` + +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. + diff --git a/content/applications/sales/point_of_sale/payment_methods/terminals/ingenico.md b/content/applications/sales/point_of_sale/payment_methods/terminals/ingenico.md new file mode 100644 index 000000000..f68226642 --- /dev/null +++ b/content/applications/sales/point_of_sale/payment_methods/terminals/ingenico.md @@ -0,0 +1,50 @@ +# Ingenico + +Connecting a payment terminal allows you to offer a fluid payment flow to your customers and ease +the work of your cashiers. + +:::{important} +- Ingenico payment terminals require an {doc}`IoT system `. +- Ingenico is currently only available in Belgium, the Netherlands and Luxembourg. +- Odoo works with the Ingenico Lane/, Desk/, and Move/ payment terminals as they support the TLV + communication protocol through TCP/IP. +::: + +## Configuration + +### Connect an IoT system + +Connecting an Ingenico payment terminal to Odoo is a feature that requires an IoT system. For more +information on how to connect an IoT system to your database, please refer to the {doc}`IoT +documentation `. + +### Configure the Lane/Desk/Move 5000 terminals for Ingenico BENELUX + +1. Press the function button ({guilabel}`F` on Lane/5000, {guilabel}`⦿` on Desk/5000 and + Move/5000). +2. Go to {menuselection}`Kassa menu --> Settings Menu` and enter the settings password. +3. Select {guilabel}`Change Connection` and press {guilabel}`OK` on the next screen. +4. Select {guilabel}`TCP/IP` and {guilabel}`IP-address`. +5. On the next screen, enter the IP address of your IoT system. +6. Enter `9000` as port number and press {guilabel}`OK` on the next screen. + +At this point, the terminal restarts and should be displayed on the IoT system's form in Odoo. + +```{image} ingenico/payment_terminal_02.png +:align: center +``` + +### Configure the payment method + +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}`Ingenico` in the {guilabel}`Use a Payment Terminal` field. +Then, select your terminal device in the {guilabel}`Payment Terminal Device` field. + +```{image} ingenico/payment-method.png +``` + +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. + diff --git a/content/applications/sales/point_of_sale/payment_methods/terminals/mercado_pago.md b/content/applications/sales/point_of_sale/payment_methods/terminals/mercado_pago.md new file mode 100644 index 000000000..dd5f92ca4 --- /dev/null +++ b/content/applications/sales/point_of_sale/payment_methods/terminals/mercado_pago.md @@ -0,0 +1,107 @@ +# Mercado Pago + +Connecting a payment terminal allows you to offer a fluid payment flow to your customers and ease +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](https://www.mercadopago.com.mx/herramientas-para-vender/lectores-point). +::: + +:::{seealso} +[Mercado Pago online payments](https://www.mercadopago.com.mx/herramientas-para-vender/check-out#benefits-checkout) +::: + +(pos-mercado-pago-configuration)= + +## Configuration + +1. Create a [Mercado Pago account](https://www.mercadopago.com.mx/). + +2. Associate your Point Smart terminal with a {guilabel}`store` and a {guilabel}`cash drawer` by + following [Mercado Pago's documentation](https://vendedores.mercadolibre.com.ar/nota/locales-una-herramienta-para-mejorar-la-gestion-de-tus-puntos-de-venta/). + + :::{note} + All purchased terminals are automatically displayed on your Mercado dashboard. + ::: + +3. Set your Point Smart terminal to the {guilabel}`Point of Sale` operation mode. + + :::{warning} + Odoo does not support the {guilabel}`Standalone` operation mode. + ::: + +4. {ref}`Create a Point Smart application `. + +5. {ref}`Generate your credentials `. + +6. {ref}`Create and configure the related payment method `. + +(pos-mercado-pago-application)= + +### Point Smart application + +Create a new application from Mercado Pago's [developer panel](https://www.mercadopago.com/developers) by following [Mercado Pago's applications documentation](https://www.mercadopago.com.mx/ayuda/20152), making sure you select {guilabel}`In +person Payments`. + +(pos-mercado-pago-credentials)= + +### Credentials + +Once the Point Smart application is created, three credentials are required: + +- An access token that Odoo uses to call Mercado Pago. +- A webhook secret key that Odoo uses to authenticate notifications sent by Mercado Pago. +- The **terminal serial number** at the back of your Point Smart terminal. + +Retrieve the access token and webhook secret key by following [Mercado Pago's credentials +documentation](https://www.mercadopago.com.mx/developers/en/docs/your-integrations/credentials). +Then, copy and paste them into Odoo when creating the payment method. + +:::{important} +For the webhooks configuration, add the URL of your Odoo database (e.g., +`https://mycompany.odoo.com`) followed by `/pos_mercado_pago/notification` (e.g., +`https://mycompany.odoo.com/pos_mercado_pago/notification`). + +```{image} mercado_pago/webhooks.png +:alt: Webhooks configuration on Mercado Pago. +``` +::: + +(pos-mercado-pago-method)= + +### Payment method + +1. Go to {menuselection}`Point of Sale --> Configuration --> Settings` and enable {guilabel}`Mercado + Pago` under the {guilabel}`Payment Terminals` section. + +2. {doc}`Create the related payment method <../../payment_methods>` by going to + {menuselection}`Point of Sale --> Configuration --> Payment Methods`. + +3. Set the journal type as {guilabel}`Bank` + +4. Select {guilabel}`Mercado Pago` in the {guilabel}`Use a Payment Terminal` field. + +5. Fill in the mandatory fields with the {ref}`previously generated credentials + `: + + - Fill in the {guilabel}`Production user token` field using the access token. + - Fill in the {guilabel}`Production secret key` field using the webhook secret key. + - Fill in the {guilabel}`Terminal S/N` field using the terminal serial number. You can find it at + the back of your terminal. + - Click the {guilabel}`Force PDV` button to activate the Point of Sale mode. + +```{image} mercado_pago/payment-method.png +:alt: Form to create a new payment method. +``` + +Select the payment method by going to the {ref}`POS' settings ` and adding +it to the payment method under the {guilabel}`Payment Methods` field of the {guilabel}`Payment` +section. + +:::{important} +Any action made on the terminal should trigger a notification on the POS interface. Ensure the +{ref}`webhook secret key ` is correctly configured if you are not +notified. +::: + diff --git a/content/applications/sales/point_of_sale/payment_methods/terminals/razorpay.md b/content/applications/sales/point_of_sale/payment_methods/terminals/razorpay.md new file mode 100644 index 000000000..7cf0d3127 --- /dev/null +++ b/content/applications/sales/point_of_sale/payment_methods/terminals/razorpay.md @@ -0,0 +1,57 @@ +# Razorpay + +Connecting a Razorpay payment terminal allows you to offer a fluid payment flow to your customers +and ease the work of your cashiers. + +:::{seealso} +{doc}`Use Razorpay as apayment provider. <../../../../finance/payment_providers/razorpay>` +::: + +## Configuration + +(razorpay-credentials)= + +### Locate your Razorpay credentials + +[Create a Razorpay account](https://razorpay.com/docs/payments/easy-create-account/) and set it up +on their website. + +You need the following credentials to set up the payment method in Odoo: + +- [API key](https://razorpay.com/docs/payments/dashboard/account-settings/api-keys/) +- Razorpay username +- Razorpay device serial number, which can be found underneath the device or on [Razorpay's + dashboard](https://dashboard.razorpay.com/). + +### Configure the payment method + +1. {doc}`Activate the POS Razorpay module <../../../../general/apps_modules>` to enable the + payment terminal. + +2. {doc}`Create the related payment method <../../payment_methods>` by going to + {menuselection}`Point of Sale --> Configuration --> Payment Methods`. + + 1. Set the {guilabel}`Journal` type as {guilabel}`Bank`. + 2. Select {guilabel}`Razorpay` in the {guilabel}`Use a Payment Terminal` field. + 3. Enter your username in the {guilabel}`Razorpay Username` field and your device's serial number + in the {guilabel}`Razorpay Device Serial No` field. + 4. Fill in the {guilabel}`Razorpay API Key` field with the {ref}`Razorpay API key + `. + 5. Set the {guilabel}`Razorpay Allowed Payment Modes` according to your needs. + + ```{image} razorpay/create-method-razorpay.png + :alt: Razorpay connection form + ``` + + :::{note} + You can enable the {guilabel}`Razorpay Test Mode` field while testing or keep it unchecked for + production. + ::: + +Once the payment method is created, you can enable it for your POS. To do so, go to the {ref}`POS' +settings ` and add the payment method under the {guilabel}`Payment` section. + +:::{note} +The terminal must have at least a 10% battery level to use it. +::: + diff --git a/content/applications/sales/point_of_sale/payment_methods/terminals/six.md b/content/applications/sales/point_of_sale/payment_methods/terminals/six.md new file mode 100644 index 000000000..d9308e6d8 --- /dev/null +++ b/content/applications/sales/point_of_sale/payment_methods/terminals/six.md @@ -0,0 +1,60 @@ +# SIX + +Connecting a SIX payment terminal allows you to offer a fluid payment flow to your customers and +ease the work of your cashiers. + +:::{warning} +Even though Worldline has recently acquired SIX Payment Services and both companies use Yomani +payment terminals, the firmware they run is different. Terminals received from Worldline are +therefore not compatible with this integration. +::: + +## Configuration + +### Install the POS IoT Six module + +To activate the POS IoT Six module, go to {guilabel}`Apps`, remove the {guilabel}`Apps` filter, and +search for **POS IoT Six**. This module adds the necessary driver and interface to your database to +detect Six terminals. + +:::{note} +This module replaces the **POS Six** module. +::: + +### Connect an IoT system + +Connecting a Six payment terminal to Odoo is requires {doc}`using an IoT system +`. + +### Configure the terminal ID + +Navigate to the IoT system's homepage, where you can find the {guilabel}`Six payment terminal` +field once your database server is connected to the IoT system. Click {guilabel}`Configure`, fill +in the {guilabel}`Terminal ID` field with the ID received from Six, and click {guilabel}`Connect`. +Your Six terminal ID should appear in the {guilabel}`Current Terminal Id` section. + +```{image} six/terminal-id.png +:alt: Setting the Six terminal ID +``` + +Odoo automatically restarts the IoT system when the Six terminal ID is configured. If your Six +terminal is online, it will be automatically detected and connected to the database. Check the IoT +system's homepage under the {guilabel}`Payments` section to confirm the connection. + +```{image} six/id-configured.png +:alt: Confirming the connection to the Six payment terminal +``` + +(six-configure)= + +### Configure the payment method + +Enable the payment terminal {ref}`in the application settings ` and +{doc}`create the related payment method <../../payment_methods>`. Set the journal type as +{guilabel}`Bank` and select {guilabel}`SIX IOT` in the {guilabel}`Use a Payment Terminal` field. +Then, select your terminal device in the {guilabel}`Payment Terminal Device` field. + +```{image} six/new-payment-method.png +:alt: Creating a new payment method for the SIX payment terminal +``` + diff --git a/content/applications/sales/point_of_sale/payment_methods/terminals/stripe.md b/content/applications/sales/point_of_sale/payment_methods/terminals/stripe.md new file mode 100644 index 000000000..eecca8b87 --- /dev/null +++ b/content/applications/sales/point_of_sale/payment_methods/terminals/stripe.md @@ -0,0 +1,107 @@ +# Stripe + +Connecting a payment terminal allows you to offer a fluid payment flow to your customers and ease +the work of your cashiers. + +:::{important} +- Stripe payment terminals do not require an {doc}`IoT Box ` +- Stripe terminals can be used in many countries, but not worldwide. Check the [global + availability for Stripe Terminal](https://support.stripe.com/questions/global-availability-for-stripe-terminal). +- Stripe's integration works with [Stripe Terminal smart readers](https://docs.stripe.com/terminal/smart-readers) +::: + +:::{seealso} +- {doc}`Stripe as payment provider <../../../../finance/payment_providers/stripe>` +- [List of payment methods supported by Stripe](https://stripe.com/payments/payment-methods) +::: + +## Configuration + +### Configure the payment method + +Activate **Stripe** in the settings by going to {menuselection}`Point of Sale --> Configuration --> +Settings --> Payment Terminals` and enabling {guilabel}`Stripe`. + +Then, create the payment method: + +- Go to {menuselection}`Point of Sale --> Configuration --> Payment Methods`, click + {guilabel}`Create`, and complete the {guilabel}`Method` field with your payment method's name; +- Set the {guilabel}`Journal` field as {guilabel}`Bank` and the {guilabel}`Use a Payment Terminal` + field as {guilabel}`Stripe`; +- Enter your payment terminal serial number in the {guilabel}`Stripe Serial Number` field; +- Click {guilabel}`Don't forget to complete Stripe connect before using this payment method.` + +```{image} stripe/create-method-stripe.png +:align: center +:alt: payment method creation form +``` + +:::{note} +- Click {guilabel}`Identify Customer` to allow this payment method **exclusively** for identified + customers. For any unidentified customers to be able to pay with Stripe, leave the + {guilabel}`Identify Customer` field unchecked. +- The {guilabel}`Outstanding Account` and the {guilabel}`Intermediary Account` can stay empty to + use the default accounts. +- Find your payment terminal serial number under the device or on [Stripe's dashboard](https://dashboard.stripe.com). +::: + +### Connect Stripe to Odoo + +Click {guilabel}`Connect Stripe`. Doing so redirects you automatically to a configuration page. +Fill in all the information to create your Stripe account and link it with Odoo. Once the forms are +completed, the API keys ({guilabel}`Publishable Key` and {guilabel}`Secret Key`) can be retrieved on +**Stripe's** website. To do so, click {guilabel}`Get your Secret and Publishable keys`, +click the keys to copy them, and paste them into the corresponding fields in Odoo. Your terminal is +ready to be configured in a POS. + +```{image} stripe/stripe-connect.png +:align: center +:alt: stripe connection form +``` + +:::{note} +- When you use **Stripe** exclusively in Point of Sale, you only need the **Secret Key** to use + your terminal. +- When you use Stripe as **payment provider**, the {guilabel}`State` can stay set as + {guilabel}`Disabled`. +- For databases hosted **On-Premise**, the {guilabel}`Connect Stripe` button does not work. To + retrieve the API keys manually, log in to your [Stripe dashboard](https://dashboard.stripe.com), type `API` in the search bar, and click + {guilabel}`Developers > API`. +::: + +### Configure the payment terminal + +Swipe right on your payment terminal, click {guilabel}`Settings`, enter the admin PIN code, validate +and select your network. + +:::{note} +- The user's device and the terminal must share the same network. +- In case of a Wi-Fi connection, the network must be secured. +- You must enter the admin PIN code to access your payment terminal settings. By default, this + code is `07139`. +::: + +### Link the payment method to a POS + +To add a **payment method** to your point of sale, go to {menuselection}`Point of Sale --> +Configuration --> Settings`. Select the POS, scroll down to the {guilabel}`Payments` section, and +add your payment method for **Stripe** in the {guilabel}`Payment Methods` field. + +## Troubleshooting + +### Payment terminal unavailable in your Stripe account + +If the payment terminal is unavailable in your Stripe account, you must add it manually: + +1. Log into your [Stripe's dashboard](https://dashboard.stripe.com) and go to + {menuselection}`Stripe dashboard --> Payments --> Readers --> Locations`; +2. Add a location by clicking the {guilabel}`+ New` button or selecting an already created location; +3. Click the {guilabel}`+ New` button in the {guilabel}`Readers` box and fill in the required + information. + +:::{note} +You must provide a **registration code**. To retrieve that code, swipe right on your device, +enter the admin PIN code (by default: `07139`), validate, and click {guilabel}`Generate a +registration code`. +::: + diff --git a/content/applications/sales/point_of_sale/payment_methods/terminals/viva_wallet.md b/content/applications/sales/point_of_sale/payment_methods/terminals/viva_wallet.md new file mode 100644 index 000000000..5b088820b --- /dev/null +++ b/content/applications/sales/point_of_sale/payment_methods/terminals/viva_wallet.md @@ -0,0 +1,120 @@ +# Viva Wallet + +Connecting a **Viva Wallet** {doc}`payment terminal <../terminals>` allows you to offer a fluid +payment flow to your customers and ease the work of your cashiers. + +:::{note} +Viva Wallet lets you turn your phone into a mobile card reader: [Tap On Phone](https://www.vivawallet.com/gb_en/blog-tap-on-phone-gb). +::: + +## Configuration + +Start by creating your Viva Wallet account on [Viva Wallet's website](https://www.vivawallet.com). + +### Locate your Viva Wallet credentials + +When configuring Viva Wallet in Point of Sale, you need to use specific credentials that are +available in your Viva Wallet account. These credentials include your {ref}`Merchant ID +`, {ref}`API key `, {ref}`POS API credentials +`, and {ref}`Terminal ID ` number. + +(viva-wallet-id-key)= + +#### Merchant ID and API key + +Locate your [Merchant ID and API key following the Viva documentation](https://developer.vivawallet.com/getting-started/find-your-account-credentials/merchant-id-and-api-key/). +Then, save the keys and paste them into the Odoo {guilabel}`Merchant ID` and {guilabel}`API Key` +fields {ref}`when creating the payment method `. + +```{image} viva_wallet/access-cred.png +:alt: merchant ID and API key fields +``` + +:::{note} +These credentials are used for APIs that authenticate with Basic Auth. +::: + +(viva-wallet-pos-api)= + +#### POS API credentials + +Locate and generate your [POS API credentials following the Viva documentation](https://developer.vivawallet.com/getting-started/find-your-account-credentials/pos-api-credentials/). +Then, save the keys and paste them in the Odoo {guilabel}`Client secret` and {guilabel}`Client ID` +fields {ref}`when creating the payment method `. + +:::{warning} +These credentials are only displayed once. Ensure you keep a copy to secure them. +::: + +```{image} viva_wallet/api-cred.png +:alt: Client secret and client ID fields +``` + +:::{note} +These credentials are used for Android and iOS POS Activation requests, as well as the Cloud +Terminal API. +::: + +(viva-wallet-identifier)= + +#### Terminal ID + +Your terminal ID number is used to identify your terminal. To find it: + +1. Go to your Viva Wallet account and select the relevant account. +2. Go to {menuselection}`Sales --> Physical payments --> Card terminals` in the navigation menu. + +The terminal ID number is located under the {guilabel}`Terminal ID (TID)` column. Save it to paste +it into the {guilabel}`Terminal ID` field {ref}`when creating the payment method +`. + +```{image} viva_wallet/terminal-id.png +:alt: Viva terminal ID +``` + +(viva-wallet-method-creation)= + +### Configure the payment method + +1. {doc}`Activate the POS Viva Wallet module <../../../../general/apps_modules>` to enable the + payment terminal. + +2. {doc}`Create the related payment method <../../payment_methods>` by going to + {menuselection}`Point of Sale --> Configuration --> Payment Methods` and clicking + {guilabel}`New`. + +3. Set the journal type as {guilabel}`Bank`. + +4. Select {guilabel}`Viva Wallet` in the {guilabel}`Use a Payment Terminal` field. + +5. Fill in the mandatory fields with your: + + - {ref}`Merchant ID and API key ` + - {ref}`Client ID and Client secret ` + - {ref}`Terminal ID ` + +6. Save the form and copy the generated webhook URL from the {guilabel}`Viva Wallet Webhook + Endpoint` field. This URL is necessary {ref}`when configuring the webhook `. + +```{image} viva_wallet/create-method-viva-wallet.png +:alt: payment method creation form +:scale: 75% +``` + +(viva-wallet-webhook)= + +### Configure the webhook + +Webhooks allow you to receive real-time notifications whenever a transaction occurs within your Viva +Wallet account. Set them up for [payment transactions following the Viva documentation](https://developer.vivawallet.com/webhooks-for-payments/transaction-payment-created/). + +:::{seealso} +[Setting up webhooks](https://developer.viva.com/webhooks-for-payments/#setting-up-webhooks) +::: + +### Link the payment method to a POS + +You can select the payment method in your POS settings once the payment method is created. To do so, +go to the {ref}`POS' settings ` and add the payment method under the +{guilabel}`Payment methods` field of the {guilabel}`Payment` section. + diff --git a/content/applications/sales/point_of_sale/payment_methods/terminals/worldline.md b/content/applications/sales/point_of_sale/payment_methods/terminals/worldline.md new file mode 100644 index 000000000..5f224f274 --- /dev/null +++ b/content/applications/sales/point_of_sale/payment_methods/terminals/worldline.md @@ -0,0 +1,101 @@ +# Worldline + +Connecting a payment terminal allows you to offer a fluid payment flow to your customers and ease +the work of your cashiers. + +:::{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. +::: + +## 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. + +```{eval-rst} +.. 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`. +``` + +:::{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 `. +::: + +### Configure the payment method + +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. + +```{image} worldline/worldline-payment-terminals.png +``` + +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. + +(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. +::: + diff --git a/content/applications/sales/point_of_sale/pos_based_marketing.md b/content/applications/sales/point_of_sale/pos_based_marketing.md new file mode 100644 index 000000000..677773cde --- /dev/null +++ b/content/applications/sales/point_of_sale/pos_based_marketing.md @@ -0,0 +1,132 @@ +# Marketing features + +Use your POS system to engage with customers directly by sending them promotional offers via email +or WhatsApp. + +## Storing contact details + +This feature requires your customer's contact details, either their email address or phone number. + +- **Email addresses**: automatically collected and saved in POS orders when sending a receipt by + email. + +- **Phone numbers**: to store phone numbers when sending receipts on WhatsApp or by SMS, + + 1. Go to {menuselection}`Configuration --> Settings` and scroll to the {guilabel}`Bills & + Receipts` section; + 2. Activate the {guilabel}`WhatsApp Enabled` or {guilabel}`SMS Enabled` option(s). + +```{image} pos_based_marketing/sms-whatsapp-enabled.png +:alt: setting to enable to store phone numbers when sending receipts +``` + +If a customer’s contact information is missing, it will be automatically saved in POS orders when +the receipt is sent via email, SMS, or WhatsApp. + +:::{tip} +From a POS order form, navigate to the {guilabel}`Contact Info` category under the +{guilabel}`Extra Info` tab, then click the email icon or whatsapp icon to send standalone +marketing messages. + +```{image} pos_based_marketing/standalone-marketing-from-pos.png +:alt: pos orders form's standalone marketing message option +``` +::: + +## Email marketing + +To send marketing emails to your customers from POS orders, + +1. Go to {menuselection}`Point of Sale --> Orders --> Orders`; +2. Select the orders; +3. Click {guilabel}`Actions`, then {guilabel}`Send Email` from the dropdown menu. + +Doing so opens an email composing form. Fill it in and hit {guilabel}`Send`. + +```{image} pos_based_marketing/mail-composer.png +:alt: mail composer view +:scale: 50 % +``` + +:::{tip} +- Save some time by saving your content as a template. Click the vertical ellipsis button and + select your template under the {guilabel}`Insert Template` section. +- You can also save your content as template for later use. Click the vertical ellipsis button + and select {guilabel}`Save as Template`. +::: + +:::{note} +- Fill in the {guilabel}`Mass Mailing Name` field to create a mass mailing and track its results + in the {doc}`Email Marketing app <../../marketing/email_marketing>`. +- If an email address is not related to an existing customer, a new customer is automatically + created when sending marketing emails. +::: + +:::{seealso} +{doc}`Use the email marketing app for more advanced marketing features +<../../marketing/email_marketing>`. +::: + +## Whatsapp marketing + +(pos-based-marketing-whatsapp-config)= + +### Configuration + +You first need to enable the related server action to send WhatsApp marketing messages from your POS +using the phone numbers collected from POS orders. To do so, + +1. Go to the WhatsApp application; + +2. Create a new {ref}`WhatsApp template `; + +3. Configure the fields: + + - {guilabel}`Applies to` field set to {guilabel}`Point of Sale Orders`; + - {guilabel}`Category` field to {guilabel}`Marketing`; + - {guilabel}`Phone Field` to either {guilabel}`Mobile` or {guilabel}`Customer > Phone`. + +4. Click {guilabel}`Submit for Approval`; + +5. Once approved, click the {guilabel}`Allow Multi` button to create a server action in the POS + orders list view. + +```{image} pos_based_marketing/whatsapp-template.png +:alt: approved and configured for marketing uses whatsapp template +``` + +:::{warning} +If you modify the template's content, you must request for approval again, as its status returns +to the {guilabel}`Draft` state. +::: + +:::{seealso} +{doc}`WhatsApp configuration <../../productivity/whatsapp>` +::: + +### Send WhatsApp marketing messages + +1. Go to {menuselection}`Point of Sale --> Orders --> Orders`; +2. Select the orders; +3. Click {guilabel}`Actions`, then {guilabel}`WhatsApp Message` from the dropdown menu. + +Doing so opens a WhatsApp message composing form. Select the desired marketing template in the +{guilabel}`Template` field and hit {guilabel}`Send Message`. + +```{image} pos_based_marketing/whatsapp-composer.png +:alt: whatsapp composer view +``` + +:::{note} +- To use WhatsApp marketing in the Point of Sale, approved marketing templates must have the + {guilabel}`Allow Multi` option enabled and {guilabel}`Point of Sale Orders` selected in the + {guilabel}`Applies to` field. +- If the server action is displayed without a properly configured template, an error message + appears. Click {guilabel}`Configure Templates` and complete the {ref}`WhatsApp setup + ` steps. +::: + +:::{seealso} +{doc}`../../productivity/whatsapp` +::: + diff --git a/content/applications/sales/point_of_sale/preparation.md b/content/applications/sales/point_of_sale/preparation.md new file mode 100644 index 000000000..c048a98dd --- /dev/null +++ b/content/applications/sales/point_of_sale/preparation.md @@ -0,0 +1,119 @@ +# Preparation display + +The preparation display feature allows you to handle POS orders requiring preparation. Concretely, + +- **For retail**: The preparation team is notified after a payment is completed at the POS to + gather the purchased items for customer pickup. +- **For restaurants**: POS orders inform the kitchen of the meals to be prepared. + +## Configuration + +To enable the preparation display feature, + +1. Go to the {ref}`POS settings `. +2. Scroll down to the {guilabel}`Preparation` section. +3. Check the {guilabel}`Preparation Display` option. + +```{image} preparation/preparation-setting.png +:alt: Setting to enable the preparation display feature +:scale: 90 % +``` + +To create and set up a preparation display, + +1. Go to {menuselection}`Point of Sale --> Orders --> Preparation Display` + +2. Click {guilabel}`New`. + +3. Give the display a descriptive {guilabel}`Name` (e.g., `Main Kitchen`, `Bar`) + +4. Set it up: + + 1. {guilabel}`Point of Sale`: Select the POS that sends orders to this display. + + 2. {guilabel}`Product categories`: Specify the POS {guilabel}`Product categories` sent to this + display. + + 3. {guilabel}`Stages`: Define the steps required for the orders to be ready. + + - Click {guilabel}`Add a line` to add a stage. + - Assign specific colors to each stage for clarity (optional). + - Define an {guilabel}`Alert timer (min)` for each stage to indicate the expected processing + time. + +```{image} preparation/display-form.png +:alt: preparation display set-up form +:scale: 85 % +``` + +:::{note} +To edit a pre-existing preparation display, click the vertical ellipsis button +({icon}`fa-ellipsis-v`) on the display's card and select {guilabel}`Configure`. +::: + +## Practical application + +Go to {menuselection}`Point of Sale --> Orders --> Preparation Display` to get an overview of all +your displays. + +```{image} preparation/display-card.png +:alt: Kanban view of the preparation display +:scale: 85 % +``` + +The display card shows: + +- The configured stages. +- The number of orders currently {guilabel}`In progress`. +- The {guilabel}`Average time` employees usually take to complete an order. + +:::{tip} +Click the {guilabel}`Kitchen Display` app icon on your Odoo Dashboard for quicker access. +::: + +### Using the preparation display + +To access the preparation display, click {guilabel}`Preparation Screen`. This interface, designed +for employees, shows: + +- **Stages and order count**: Displays the progress of orders across stages such as `To prepare`, + `Ready`, and `Completed`, along with the number of orders in each stage. + +- **Ordered products by category**: Lists all items in progress, grouped by POS categories (e.g., + `Drinks`, `Food`). + +- **Order cards**: Summarizes individual orders, including: + + - Associated tables and order numbers. + - Status, such as `Ready`, highlighted with the defined colors. + - Waiting time, with visual indicators. + +:::{note} +The duration indicator turns red if the elapsed time exceeds the predefined alert time. +::: + +```{image} preparation/preparation-display.png +:alt: the preparation display interface with orders to process. +:scale: 80 % +``` + +To update order progress: + +- Click items on the order card to cross them off individually. +- Click the order card itself to mark all items at once. +- The card automatically moves to the next stage once every item is crossed off. +- Click {icon}`fa-undo` {guilabel}`Recall` to move an order back to the previous stage if you + mistakenly sent it to the next stage. + +### Customer display + +In parallel, click {guilabel}`Order Status Screen` to open the customer interface. This interface, +designed for customers, provides an overview of orders that are: + +- {guilabel}`Ready` for pickup. +- {guilabel}`Almost there`, indicating they are taken care of. + +:::{note} +The order number can be found at the top of the customer's receipt. +::: + diff --git a/content/applications/sales/point_of_sale/pricing.md b/content/applications/sales/point_of_sale/pricing.md new file mode 100644 index 000000000..098a788f7 --- /dev/null +++ b/content/applications/sales/point_of_sale/pricing.md @@ -0,0 +1,18 @@ +--- +nosearch: true +--- + +# Pricing features + +```{toctree} +:titlesonly: true + +pricing/discounts +pricing/discount_tags +pricing/loyalty +pricing/pricelists +pricing/fiscal_position +pricing/cash_rounding +pricing/electronic_labels +``` + diff --git a/content/applications/sales/point_of_sale/pricing/cash_rounding.md b/content/applications/sales/point_of_sale/pricing/cash_rounding.md new file mode 100644 index 000000000..6492517dd --- /dev/null +++ b/content/applications/sales/point_of_sale/pricing/cash_rounding.md @@ -0,0 +1,48 @@ +# Cash rounding + +**Cash rounding** is required when the lowest physical denomination +of currency, or the smallest coin, is higher than the minimum unit +of account. + +For example, some countries require their companies to round up or +down the total amount of an invoice to the nearest five cents, when +the payment is made in cash. + +Each point of sale in Odoo can be configured to apply cash rounding +to the totals of its bills or receipts. + +## Configuration + +Go to {menuselection}`Point of Sale --> Configuration --> Settings` +and enable *Cash Rounding*, then click on *Save*. + +```{image} cash_rounding/cash_rounding01.png +:align: center +``` + +Go to {menuselection}`Point of Sale --> Configuration --> Point of +Sale`, open the point of sale you want to configure, and enable the +*Cash Rounding* option. + +To define the **Rounding Method**, open the drop-down list and click +on *Create and Edit...*. + +Define here your *Rounding Precision*, *Profit Account*, and +*Loss Account*, then save both the Rounding Method and your Point +of Sale settings. + +```{image} cash_rounding/cash_rounding02.png +:align: center +``` + +All total amounts of this point of sale now add a line to apply the +rounding according to your settings. + +```{image} cash_rounding/cash_rounding03.png +:align: center +``` + +:::{note} +Odoo Point of Sale only supports the {guilabel}`Add a rounding line` rounding strategy. +::: + diff --git a/content/applications/sales/point_of_sale/pricing/discount_tags.md b/content/applications/sales/point_of_sale/pricing/discount_tags.md new file mode 100644 index 000000000..b4d94cd97 --- /dev/null +++ b/content/applications/sales/point_of_sale/pricing/discount_tags.md @@ -0,0 +1,56 @@ +# Discount tags (barcode scanner) + +If you want to sell your products with a discount, for a product getting +close to its expiration date for example, you can use discount tags. +They allow you to scan discount barcodes. + +:::{note} +To use discount tags you will need to use a barcode scanner. +::: + +## Barcode Nomenclature + +To use discounts tags, we need to learn about barcode nomenclature. + +Let's say you want to have a discount for the product with the following +barcode: + +```{image} discount_tags/discount_tags01.png +:align: center +``` + +You can find the *Default Nomenclature* under the settings of your PoS +interface. + +```{image} discount_tags/discount_tags02.png +:align: center +``` + +```{image} discount_tags/discount_tags03.png +:align: center +``` + +Let's say you want 50% discount on a product you have to start your +barcode with 22 (for the discount barcode nomenclature) and then 50 (for +the %) before adding the product barcode. In our example, the barcode would +be: + +```{image} discount_tags/discount_tags04.png +:align: center +``` + +## Scan the products & tags + +You first have to scan the desired product (in our case, a lemon). + +```{image} discount_tags/discount_tags05.png +:align: center +``` + +And then scan the discount tag. The discount will be applied and you can +finish the transaction. + +```{image} discount_tags/discount_tags06.png +:align: center +``` + diff --git a/content/applications/sales/point_of_sale/pricing/discounts.md b/content/applications/sales/point_of_sale/pricing/discounts.md new file mode 100644 index 000000000..ec2c7d769 --- /dev/null +++ b/content/applications/sales/point_of_sale/pricing/discounts.md @@ -0,0 +1,102 @@ +# Discounts + +By offering discounts, you can entice your customers and drastically +increase your revenue. It is vital to offer discounts, whether they are +time-limited, seasonal or manually given. + +To manage discounts, Odoo has powerful features that help set up a +pricing strategy tailored to every business. + +## Apply manual discounts + +If you seldom use discounts, applying manual ones might be the easiest +solution for your Point of Sale. + +You can either apply a discount on the whole order or on specific +products inside an order. + +### Apply a discount on a product + +From your PoS session interface, use the *Disc* button. + +```{image} discounts/discounts_01.png +:align: center +:alt: View of the discount button for manual discount +``` + +Then, you can input a discount over the product that is currently +selected. + +### 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. + +Once on your PoS form, select *Global Discounts*, under the *Pricing* category. + +```{image} discounts/discounts_02.png +:align: center +:alt: View of the feature to enable for global discount +``` + +Now, you have a new *Discount* button appearing on your PoS interface. + +```{image} discounts/discounts_03.png +:align: center +:alt: View of the button to use for global discount via the pos interface +``` + +Click on it and enter the wanted discount. + +```{image} discounts/discounts_04.png +:align: center +:alt: View of the discount offered in the payment summary +``` + +:::{note} +On this example, there is a global discount of 50% as well as a specific +50% discount on oranges. +::: + +## Apply time-limited discounts + +To activate time-limited discounts, you must activate the *Pricelists* +feature. To do so, go to {menuselection}`Point of Sales --> +Configuration --> Point of Sale` and open your PoS. Then, enable the +pricelist feature. + +```{image} discounts/discounts_05.png +:align: center +:alt: View of the pricelist feature +``` + +Once activated, you must choose the pricelists you want to make +available in the PoS and define a default one. + +### Create a pricelist + +By default, Odoo has a *Public Pricelist* configured. To create more, +go to {menuselection}`Point of Sale --> Products --> Pricelists`. Then +click on create. + +When creating a pricelist, you can set several criteria to use a +specific price: period, min. quantity, etc. You can also decide to apply +that pricelist on specific products or on the whole range. + +```{image} discounts/discounts_06.png +:align: center +:alt: View of a time-limited pricelist for two products +``` + +### Using a pricelist with the PoS interface + +On the PoS interface, a new button appears. Use it to select a +pricelist. + +```{image} discounts/discounts_07.png +: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. + diff --git a/content/applications/sales/point_of_sale/pricing/electronic_labels.md b/content/applications/sales/point_of_sale/pricing/electronic_labels.md new file mode 100644 index 000000000..b3657bdb3 --- /dev/null +++ b/content/applications/sales/point_of_sale/pricing/electronic_labels.md @@ -0,0 +1,199 @@ +# Electronic shelf labels + +Electronic shelf labels allow you to display product information like prices and barcodes on store +shelves and to synchronize them remotely from the backend. This removes the need to print new labels +when product information changes. + +```{image} electronic_labels/electronic-label.png +:alt: electronic label from Pricer +``` + +:::{note} +Odoo uses electronic labels from [Pricer](https://www.pricer.com/). +::: + +## Configuration + +### Pricer setup + +1. [Get in touch with Pricer](https://www.pricer.com/contact) to create and configure your Pricer + account. + +2. Create your stores: one pricer store equates to one physical store. + +3. Link as many transceivers as needed to the Pricer store(s). + +4. Create the following variables to share product information between your Odoo database system and + Pricer. These variables act like placeholders on the label template. + + - `itemId`: this holds the unique internal identifier assigned to each product + - `itemName`: the actual name of the product + - `price`: the selling price of the product, including any applicable taxes + - `presentation`: the template name used in Pricer for displaying the product information on the + label + - `currency`: the currency of your company (e.g., USD, EUR) + - `barcode`: the barcode number associated with each product + + :::{important} + The names for these variables must be **identical** in your Pricer database. + ::: + +5. Create a template named `NORMAL`. This template is used to display information on your digital + tags. + +Once your account, stores, variables, and template are configured on Pricer, you can proceed with +the setup of your Odoo database. + +:::{important} +The account associated with your Pricer store must have access to send API requests to Pricer. +::: + +### Odoo setup + +As a pre-requisite, {ref}`activate ` the {guilabel}`POS Pricer` module *(technical +name: pos_pricer)* to have all the required features to use Pricer electronic tags. + +```{image} electronic_labels/pricer-module.png +:alt: Installing POS Pricer module from Apps +``` + +Once the module is activated, configure your {ref}`pricer stores ` and associate +{ref}`Pricer tags ` with your products. + +(pricer-tags-stores)= + +#### Pricer stores + +Similarly to the configuration in Pricer, you need to create one pricer store per physical location. +To do so, go to {menuselection}`Point of Sale --> Configuration --> Pricer Stores`, click +{guilabel}`New`, and fill in the line with the required information: + +- {guilabel}`Store Name`: you can put any name of your liking. +- {guilabel}`Pricer Tenant Name`: the name of your company account in Pricer, usually followed by + `-country_code`. This value is provided by Pricer. +- {guilabel}`Pricer Login`: the login of your Pricer account. +- {guilabel}`Pricer Password`: the password of your Pricer account. +- {guilabel}`Pricer Store ID`: the ID of the related Pricer store as defined on your Pricer + database. + +```{image} electronic_labels/pricer-stores-setup.png +:alt: Configuring a Pricer Store +``` + +:::{note} +- The {guilabel}`Pricer Tags` column is updated automatically when a label is linked to a + product. +- The {guilabel}`Last Update` and {guilabel}`Last Update Status` columns are updated + automatically when the tags are updated. +::: + +(pricer-tags-tags)= + +#### Pricer tags + +For a label to display specific product information, the label needs to be associated with the +product. To do so: + +1. Open the product form by going to {menuselection}`Point of Sale --> Products --> Products` and + clicking {guilabel}`New` or selecting an existing product. + + :::{note} + If you are creating a new product, configure and save it before associating any Pricer tags. + ::: + +2. Go to the {guilabel}`Sales` tab, scroll to the {guilabel}`Pricer` section, and select the + corresponding {guilabel}`Pricer Store`. + + ```{image} electronic_labels/pricer-product.png + :alt: Linking Pricer tags to products + :scale: 75% + ``` + +3. Fill in the {guilabel}`Pricer tags ids` field by copying the label's ID from the label itself or + scanning its barcode. + + :::{note} + Pricer tag IDs are composed of a letter followed by 16 digits. + ::: + +:::{tip} +- We recommended using a barcode scanner to speed up the encoding process. +- When setting up Pricer with Odoo for the first time, it is recommended that you configure only + one product first. Before configuring more products, ensure you can display their information + on a Pricer tag. +::: + +Now that you have a product associated with a Pricer tag, we can send its information to Pricer. + +### Practical application + +Odoo automatically sends requests to Pricer to synchronize the tags every 12 hours if you make any +modifications to: + +> - Product name, price, barcode, or customer taxes +> - Currency +> - Associated Pricer store or Pricer tags + +To force the update, activate the {ref}`developer mode `. Then: + +1. Go to {menuselection}`Point of Sale --> Configuration --> Pricer Store`. + +2. Select the desired store(s). + +3. Click {guilabel}`Update tags` to update all tags affected by changes to: + + - Product name, price, barcode, or customer taxes + - Currency + - Associated Pricer store or Pricer tags + +Alternatively, click {guilabel}`Update all tags` to force the update of every tag, regardless of +whether changes were made. + +```{image} electronic_labels/update-all.png +:alt: Update all Pricer tags +``` + +If Pricer has processed and accepted the request, the status field shows {guilabel}`Update +successfully sent to Pricer`. If there is any issue, the system displays an error message. + +:::{warning} +If a request sent to Pricer fails, Odoo still considers that the product has been updated. In +that case, we recommend forcing the update of all tags. +::: + +### Discount labels + +To display a discount label on a Pricer Tag, you need to link a {doc}`pricelist ` to the +product variant associated with the tag. + +To do so, open the product variant form: + +1. Go to {menuselection}`Point of Sale --> Products --> Product Variants`. +2. Select the product you want to apply a discount to. + +Then, set the desired pricelist: + +1. Go to the {guilabel}`General Information` tab. +2. Select a pricelist in the {guilabel}`Pricer Sales Pricelist` field. + +Once a pricelist is set, the {guilabel}`On Sale Price` field appears, showing the {guilabel}`Sales +Price` with the discount applied. + +```{image} electronic_labels/pricer-sales-pricelist.png +:alt: Linking a pricelist to a product variant +``` + +After updating your electronic labels, a `PROMO` tag should appear on the electronic label, +displaying both the old, crossed-out price and the discounted price. + +:::{note} +- Currently, pricelists that offer discounts for purchasing multiple units or derive their prices + from other pricelists are not supported. +- Assigning a pricelist to a product variant only affects the electronic label display. Scanning + the product at the point of sale does not automatically apply the discount. +::: + +:::{seealso} +{doc}`discounts` +::: + diff --git a/content/applications/sales/point_of_sale/pricing/fiscal_position.md b/content/applications/sales/point_of_sale/pricing/fiscal_position.md new file mode 100644 index 000000000..abe608db1 --- /dev/null +++ b/content/applications/sales/point_of_sale/pricing/fiscal_position.md @@ -0,0 +1,54 @@ +# Flexible taxes (fiscal positions) + +When running a business, you may need to apply different taxes and record transactions on various +accounts based on the location and type of business of your customers and providers. + +The **fiscal positions** feature enables you to establish rules that automatically select the right +taxes and accounts used for each transaction. + +:::{seealso} +- {doc}`../../../finance/accounting/taxes/fiscal_positions` +- {doc}`../../../finance/accounting/taxes` +::: + +## Configuration + +To enable the feature, go to {menuselection}`Point of Sale --> Configuration --> Settings`, scroll +down to the {guilabel}`Accounting` section, and enable {guilabel}`Flexible Taxes`. + +Then, set a default fiscal position that should be applied to all sales in the selected POS in the +{guilabel}`Default` field. You can also add more fiscal positions to choose from in the +{guilabel}`Allowed` field. + +```{image} fiscal_position/flexible-taxes-setting.png +:align: center +``` + +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 `. + +:::{note} +If you do not set a fiscal position, the tax remains as defined in the **customer taxes** field +on the product form. +::: + +## Use fiscal positions + +Open a {ref}`POS session ` to use one of the allowed fiscal positions. Then, +click the {guilabel}`Tax` button next to the **book-shaped** icon and select a fiscal position from +the list. Doing so applies the defined rules automatically to all the products subject to the chosen +fiscal position's regulations. + +```{image} fiscal_position/set-tax.png +:align: center +``` + +:::{note} +If a default fiscal position is set, the tax button displays the name of the fiscal position. +::: + +:::{seealso} +{doc}`../../../finance/accounting/taxes/fiscal_positions` +::: + diff --git a/content/applications/sales/point_of_sale/pricing/loyalty.md b/content/applications/sales/point_of_sale/pricing/loyalty.md new file mode 100644 index 000000000..a2b85cff2 --- /dev/null +++ b/content/applications/sales/point_of_sale/pricing/loyalty.md @@ -0,0 +1,46 @@ +# Loyalty programs + +Encourage your customers to continue to shop at your point of sale with +a *Loyalty Program*. + +## Configuration + +To activate the *Loyalty Program* feature, go to +{menuselection}`Point of Sale --> Configuration --> Point of sale` and +select your PoS interface. Under the Pricing features, select *Loyalty +Program* + +```{image} loyalty/loyalty01.png +:align: center +``` + +From there you can create and edit your loyalty programs. + +```{image} loyalty/loyalty02.png +:align: center +``` + +You can decide what type of program you wish to use, if the reward is a +discount or a gift, make it specific to some products or cover your +whole range. Apply rules so that it is only valid in specific situation +and everything in between. + +## Use the loyalty program in your PoS interface + +When a customer is set, you will now see the points they will get for +the transaction and they will accumulate until they are spent. They are +spent using the button *Rewards* when they have enough points +according to the rules defined in the loyalty program. + +```{image} loyalty/loyalty03.png +:align: center +``` + +You can see the price is instantly updated to reflect the pricelist. You +can finalize the order in your usual way. + +:::{note} +If you select a customer with a default pricelist, it will be +applied. You can of course change it. +::: + diff --git a/content/applications/sales/point_of_sale/pricing/pricelists.md b/content/applications/sales/point_of_sale/pricing/pricelists.md new file mode 100644 index 000000000..a7884cac2 --- /dev/null +++ b/content/applications/sales/point_of_sale/pricing/pricelists.md @@ -0,0 +1,140 @@ +# Pricelists + +Pricelists allow you to adjust product prices depending on various criteria automatically. For +example, you can set POS-specific prices, create temporary discount periods, reward specific +customers, or offer discounts when set quantities are ordered. + +(pricelists-configuration)= + +## Configuration + +Navigate to the {ref}`general POS app settings ` and ensure +{guilabel}`Flexible Pricelists` are enabled under the {guilabel}`Pricing` section. + +{ref}`Multiple prices per product ` is the default pricelist option for setting +simple fixed price rules per product. Select {ref}`Advanced price rules (discounts, formulas) +` to apply price rules to multiple products at once and to compute prices +dynamically using percentage discounts or more complex formulas in addition to setting fixed prices. + +```{image} pricelists/settings.png +:alt: Enabling pricelists in the general P0S settings +``` + +:::{note} +The selected pricelist type applies to the entire database, including the {doc}`Sales +<../../sales/products_prices/prices/pricing>` and {ref}`eCommerce ` +apps. +::: + +(pricelists-create)= + +### Create pricelists + +Go to {menuselection}`Point of Sale --> Products --> Pricelists` and click {guilabel}`New` or +select an existing pricelist. The pricelist setup differs depending on the {ref}`selected pricelist +option `. + +(pricelists-simple)= + +#### Multiple prices per product + +When pricelists are configured to use the {guilabel}`Multiple prices per product` option, it is +possible to use multiple fixed prices for different products or their variants depending, if +necessary, on one or several conditions. To add a new price rule to a pricelist: + +1. Click {guilabel}`Add a line`, and select a **product** and its **variant** if needed. + +2. Add the condition(s): + + - a product quantity to be reached by using the {guilabel}`Min. Quantity` column; + - a determined period during which the pricelist is applied by using the {guilabel}`Start Date` + and {guilabel}`End Date` columns. + +3. Add the {guilabel}`Price` to be applied when the conditions are met (if any). + +```{image} pricelists/multiple-prices.png +:alt: Setup form of a multiple prices pricelist +``` + +(pricelists-advanced)= + +#### Advanced price rules + +When pricelists are configured to use the {guilabel}`Advanced price rules (discounts, formulas)` +option, it is possible to use percentage discounts/mark-ups and formulas in addition to using fixed +prices. To add a new price rule to a pricelist, click {guilabel}`Add a line`. In the pop-up windows: + +1. Select a {guilabel}`Computation` method: + + - {guilabel}`Fixed Price` to set a new fixed price (similarly to the {guilabel}`Multiple prices + per product` option). + + - {guilabel}`Discount` to compute a percentage discount (e.g., `10.00` %) or mark-up (e.g., + `-10.00` %). + + - {guilabel}`Formula` to compute the price according to a formula. It is required to define what + the calculation is **based on** ({guilabel}`Sales Price`, {guilabel}`Cost`, or {guilabel}`Other + Pricelist`). You can then: + + - Apply a percentage {guilabel}`Discount` or mark-up. + + - Add an {guilabel}`Extra Fee` (e.g., \$ `5.00`) or subtract a fixed amount (e.g., \$ `-5.00`). + + - Define a {doc}`Rounding Method ` by forcing the price after + {guilabel}`Discount` to be a multiple of the value set. The {guilabel}`Extra Fee` is applied + afterward. + + ```{eval-rst} + .. example:: + To have the final price end with `.99`, set the :guilabel:`Rounding Method` to `1.00` and + the :guilabel:`Extra Fee` to `-0.01`. + ``` + + - Specify the minimum (e.g., \$ `20.00` ) and maximum (e.g., \$ `50.00` ) profit + {guilabel}`Margins` for computations based on {guilabel}`Cost`. + +2. Select on which product(s) the price rule should be **applied**: + + - {guilabel}`All Products` + - a {guilabel}`Product Category` + - a {guilabel}`Product` + - a {guilabel}`Product Variant` + +3. Add conditions, such as a specific quantity to reach for the price to change by using the + {guilabel}`Min. Quantity` field or a specific period during which the pricelist should be + applied by using the {guilabel}`Validity` fields. + +```{image} pricelists/price-rules.png +:alt: Setup form to configure an advanced pricelist +``` + +### Select pricelists + +Go to the {ref}`specific POS settings ` and add all the available +pricelists in the {guilabel}`Available` field. Then, set its **default pricelist** in the +{guilabel}`Default` field. + +When you {ref}`open a POS session `, click the **pricelists** button, and select +the desired pricelist from the list. + +```{image} pricelists/pricelist-button.png +:alt: Button to select a pricelist on the POS frontend +``` + +:::{note} +- Multiple pricelists must be selected for the **pricelist button** to be displayed. +- If a pricelist is selected on a POS order while its conditions are **not** met, the price will + **not** be adjusted. +::: + +:::{tip} +You can also set a pricelist to be selected automatically once a specific {ref}`customer is set +`. To do so, go to the customer form and switch to the preferred pricelist in the +{guilabel}`Pricelist` field of the {guilabel}`Sales & Purchase` tab. +::: + +:::{seealso} +- {doc}`../../sales/products_prices/prices/pricing` +- {ref}`How to use pricelists in an ecommerce environment ` +::: + diff --git a/content/applications/sales/point_of_sale/receipts_invoices.md b/content/applications/sales/point_of_sale/receipts_invoices.md new file mode 100644 index 000000000..fb0453554 --- /dev/null +++ b/content/applications/sales/point_of_sale/receipts_invoices.md @@ -0,0 +1,112 @@ +# Receipts and invoices + +## Receipts + +Set up receipts by going to {menuselection}`Point of Sale --> Configuration --> Point of Sale`, +selecting a POS, and scrolling down to the {guilabel}`Bills & Receipts` section. + +To **customize** the **header** and **footer**, activate {guilabel}`Header & Footer` and fill in +both fields with the information to be printed on the receipts. + +To **print receipts** automatically once the payment is registered, enable the {guilabel}`Automatic +Receipt Printing` setting. + +```{image} receipts_invoices/receipt.png +:alt: POS receipt +:scale: 75% +``` + +:::{seealso} +- {doc}`restaurant/bill_printing` +- {doc}`configuration/epos_printers` +::: + +### Reprint a receipt + +From the POS interface, click {guilabel}`Orders`, open the dropdown selection menu next to the +search bar, and change the default {guilabel}`All active orders` filter to {guilabel}`Paid`. Then, +select the corresponding order and click {guilabel}`Print Receipt`. + +```{image} receipts_invoices/print-receipt.png +:alt: Print receipt button from the backend +``` + +:::{note} +You can filter the list of orders using the search bar. Type in your reference and click +{guilabel}`Receipt Number`, {guilabel}`Date`, or {guilabel}`Customer`. +::: + +(receipts-invoices-invoices)= + +## Invoices + +Point of Sale allows you to issue and print invoices for {ref}`registered customers ` +upon payment and retrieve all past invoiced orders. + +:::{note} +An invoice created in a POS creates an entry into the corresponding {ref}`accounting journal +`, previously {ref}`set up `. +::: + +(receipts-invoices-invoice-configuration)= + +### Configuration + +To define what journals will be used for a specific POS, go to the {ref}`POS' settings +` and scroll down to the accounting section. Then, you can determine the +accounting journals used by default for orders and invoices in the {guilabel}`Default Journals` +section. + +```{image} receipts_invoices/invoice-config.png +:alt: accounting section in the POS settings +``` + +### Invoice a customer + +Upon processing a payment, click {guilabel}`Invoice` underneath the customer's name to issue an +invoice for that order. + +Select the payment method and click {guilabel}`Validate`. The **invoice** is automatically issued +and ready to be downloaded and/or printed. + +:::{note} +To be able to issue an invoice, a {ref}`customer ` must be selected. +::: + +### Retrieve invoices + +To retrieve invoices from the **POS dashboard**, + +1. access all orders made through your POS by going to {menuselection}`Point of Sale --> Orders --> + Orders`; +2. to access an order's invoice, open the **order form** by selecting the order, then click + {guilabel}`Invoice`. + +```{image} receipts_invoices/invoice-smart-button.png +:alt: invoice smart button from an order form +``` + +:::{note} +- **Invoiced orders** can be identified by the {guilabel}`Invoiced` status in the + {guilabel}`Status` column. +- You can filter the list of orders to invoiced orders by clicking {guilabel}`Filters` and + {guilabel}`Invoiced`. +::: + +### QR codes to generate invoices + +Customers can also request an invoice by scanning the **QR code** printed on their receipt. Upon +scanning, they must fill in a form with their billing information and click {guilabel}`Get my +invoice`. On the one hand, doing so generates an invoice available for download. On the other hand, +the order status goes from {guilabel}`Paid` or {guilabel}`Posted` to {guilabel}`Invoiced` in the +Odoo backend. + +```{image} receipts_invoices/order-status.png +:alt: order status change +``` + +To use this feature, you have to enable QR codes on receipts by going to {menuselection}`Point of +Sale --> Configuration --> Settings`. Then, select the POS in the {guilabel}`Point of Sale` field, +scroll down to the {guilabel}`Bills & Receipts` section and enable {guilabel}`Use QR code on +ticket`. + diff --git a/content/applications/sales/point_of_sale/reporting.md b/content/applications/sales/point_of_sale/reporting.md new file mode 100644 index 000000000..22f0ee91d --- /dev/null +++ b/content/applications/sales/point_of_sale/reporting.md @@ -0,0 +1,11 @@ +# Reporting + +## View statistics + +To access your statistics, go to {menuselection}`Point of Sale --> Reporting --> Orders`. Or, from +the **POS dashboard**, click the vertical ellipsis ({guilabel}`⋮`) button, {guilabel}`Reporting`, +and {guilabel}`Orders`. + +These statistics are available in a graph or pivot view that you can filter or group depending on +your needs. + diff --git a/content/applications/sales/point_of_sale/restaurant.md b/content/applications/sales/point_of_sale/restaurant.md new file mode 100644 index 000000000..cc7c53d89 --- /dev/null +++ b/content/applications/sales/point_of_sale/restaurant.md @@ -0,0 +1,57 @@ +--- +show-content: true +--- + +# 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. + +Once the POS is set to be used in a restaurant or a bar, you can: + +- {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 `. + +(restaurant-configuration)= + +## 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`. + +These features are displayed in the {guilabel}`Restaurant & Bar` section. + +```{image} restaurant/restaurant-bar-section.png +:align: center +:alt: restaurant and bar-specific features +``` + +(restaurant-orders)= + +## Take orders + +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. + +Once you have taken an order, click {guilabel}`Change table` to return to the floor plan view. + +:::{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. +::: + +```{toctree} +:titlesonly: true + +restaurant/floors_tables +restaurant/kitchen_printing +restaurant/bill_printing +restaurant/tips +``` + diff --git a/content/applications/sales/point_of_sale/restaurant/bill_printing.md b/content/applications/sales/point_of_sale/restaurant/bill_printing.md new file mode 100644 index 000000000..5c1e2fb63 --- /dev/null +++ b/content/applications/sales/point_of_sale/restaurant/bill_printing.md @@ -0,0 +1,41 @@ +# 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/floors_tables.md b/content/applications/sales/point_of_sale/restaurant/floors_tables.md new file mode 100644 index 000000000..11d1aee7e --- /dev/null +++ b/content/applications/sales/point_of_sale/restaurant/floors_tables.md @@ -0,0 +1,93 @@ +# 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. + +```{eval-rst} +.. example:: + + .. image:: floors_tables/plan-understand.png + :alt: example of a floor plan view with visual keys to understand it. + + - Table 1: An order has been placed and sent to the kitchen. + - Table 3: An order of four items has been placed and needs to be sent to the kitchen. + - Tables 2, 4, and 5: These tables are available. + - Tables 2, 4, and 5: These tables' total capacity is, respectively, 2, 4, and 8 people. + - Table 1: The table of two is full. + - Table 3: The table of four is taken by one person. + - Table 5: "Famous Joe" has a reservation for 8 people at 12:00. +``` + +## 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. Name it, select the related point(s) +of sales, and click {guilabel}`Add a line` to create a table. Name the table and assign a number of +seats. You can also link it to an appointment resource to make the table bookable. Once done, +click {guilabel}`Save & Close` or {guilabel}`Save & New` to confirm. + +```{image} floors_tables/table-creation-backend.png +:alt: window to create a table in the POS backend +:scale: 75% +``` + +:::{note} +The POS must be opened and {ref}`edited from the frontend ` to create a +map of your restaurant or bar reflecting your actual floor plan. +::: + +:::{tip} +Create floors on the spot: {ref}`access your POS settings `, type your +floor name in the {guilabel}`Floor` field of the {guilabel}`Floors & Tables Map` category, and +press *enter*. + +```{image} floors_tables/floor-creation-backend.png +:alt: setting to create floors from the POS settings +:scale: 75% +``` +::: + +(floors-tables-frontend)= + +### From the POS frontend + +To create floors and tables from the frontend, {ref}`open a POS session `, click +the hamburger menu icon {guilabel}`≡` in the upper right corner, then {guilabel}`Edit Plan` to enter +the **edit mode**. + +Click {guilabel}`+ Add Floor` to add a floor, then enter a name in the pop-up window. + +Once a floor is created, add a table by clicking {guilabel}`+ TABLE`. To move it, select it and drag +and drop it as desired. You can also modify the attributes of the selected table, such as the number +of seats by clicking {guilabel}`SEATS`, the table shape using {guilabel}`SHAPE`, the table color +using {guilabel}`FILL`, or the table name by clicking {guilabel}`RENAME`. To duplicate an existing +table, select it and click {guilabel}`COPY`. You can also remove the table by clicking +{guilabel}`DELETE`. + +After making all the necessary modifications, click {guilabel}`CLOSE` to save. + +```{image} floors_tables/floor-map.png +:alt: the floor plan view in edit mode. +``` + +:::{note} +If no table is selected, the modifications are applied to the floor. +::: + +:::{warning} +Removing a table or a floor cannot be undone. +::: + +(floors-tables-transfer)= + +## Table transfer + +To move customers from one table to another, select a table and click {guilabel}`→ Transfer` on the +POS interface. This redirects you to the floor plan view, where you can choose the new table to +which you want to transfer the customers. + +When you transfer customers, all of the orders they have placed and that are linked to the original +table are also transferred. + diff --git a/content/applications/sales/point_of_sale/restaurant/kitchen_printing.md b/content/applications/sales/point_of_sale/restaurant/kitchen_printing.md new file mode 100644 index 000000000..96a133608 --- /dev/null +++ b/content/applications/sales/point_of_sale/restaurant/kitchen_printing.md @@ -0,0 +1,66 @@ +# Orders printing + +Integrating printers in a restaurant or bar's workflow can enhance communication and collaboration +between the front-of-house and back-of-house teams, leading to a more streamlined and efficient +service. + +## Configuration + +(kitchen-printing-enable)= + +### Enable and create printers + +To enable sending orders to a kitchen or bar printer, go to {menuselection}`Point of Sale --> +Configuration --> Settings`, scroll down to the {guilabel}`Restaurant & Bar` section, and enable +{guilabel}`Kitchen Printers`. Type in a name for the printer in the {guilabel}`Printers` field and +click {guilabel}`Create and edit...` to open a setup form. + +To get a list of all the printers already created or to modify an already created printer, click +{guilabel}`--> Printers` and select the desired printer to open the setup form. + +```{image} kitchen_printing/printers-settings.png +:align: center +:alt: settings to enable the kitchen printers +``` + +(kitchen-printing-setup-form)= + +### Setup form + +From the {ref}`setup form `, select the {guilabel}`Printer Type` according +to your installation: + +- If your printer is connected to an IoT system, select {guilabel}`Use a printer connected to the + IoT Box` and select the device in the {guilabel}`IoT Device` field. +- If you use an Epson printer that does not require an IoT system, select {guilabel}`Use an Epson + printer` and enter the printer's IP address in the {guilabel}`Epson Printer IP Address` field. + +:::{seealso} +- {doc}`/applications/general/iot/connect` +- {doc}`/applications/general/iot/devices/printer` +- {doc}`../configuration/epos_ssc` +::: + +Set your printer to print specific products based on their POS category. To do so, click +{guilabel}`Add a line` in the {guilabel}`Printed Product Categories` field. If you leave this field +empty, all products are sent to the printer regardless of their POS category. + +```{image} kitchen_printing/printer-setup.png +:align: center +:alt: setup form to configure a kitchen printer +``` + +## Print orders + +From an open session, start taking an order and click {guilabel}`Order` to send it to the bar or the +kitchen. + +```{image} kitchen_printing/order-button.png +:align: center +:alt: order button from the POS UI to send orders to a kitchen or a bar +``` + +:::{note} +When products can be printed, they appear in green in the cart, and the order button turns green. +::: + diff --git a/content/applications/sales/point_of_sale/restaurant/tips.md b/content/applications/sales/point_of_sale/restaurant/tips.md new file mode 100644 index 000000000..e95824411 --- /dev/null +++ b/content/applications/sales/point_of_sale/restaurant/tips.md @@ -0,0 +1,90 @@ +# 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/shop.md b/content/applications/sales/point_of_sale/shop.md new file mode 100644 index 000000000..093ecac2a --- /dev/null +++ b/content/applications/sales/point_of_sale/shop.md @@ -0,0 +1,16 @@ +--- +nosearch: true +--- + +# Shop features + +```{toctree} +:titlesonly: true + +shop/sales_order +shop/barcode +shop/serial_numbers +shop/ship_later +shop/customer_display +``` + diff --git a/content/applications/sales/point_of_sale/shop/barcode.md b/content/applications/sales/point_of_sale/shop/barcode.md new file mode 100644 index 000000000..802d2030a --- /dev/null +++ b/content/applications/sales/point_of_sale/shop/barcode.md @@ -0,0 +1,56 @@ +# Barcodes + +Using a barcode scanner to process point-of-sale orders improves your efficiency in providing +quicker customer service. Barcode scanners can be used both to scan products or to log employees +into a POS session. + +## Configuration + +To use a barcode scanner, you must enable the feature in the Inventory app. Go to +{menuselection}`Inventory --> Configuration --> Settings`, in the {guilabel}`Barcode` section, tick +{guilabel}`Barcode Scanner` and save. + +```{image} barcode/barcode-inventory.png +:align: center +:alt: barcode setting in the Inventory application +``` + +:::{seealso} +- {doc}`Set up a barcode scanner ` +- {doc}`Activate barcode scanners ` +::: + +Once enabled in **Inventory**, you can use the barcode feature in **Point of Sale** with products +that have a barcode number assigned. + +## Assign barcodes + +### To your products + +To use this feature in POS, your products must have barcodes assigned. To do so, go to +{menuselection}`Point of Sale --> Products --> Products` and open a **product form**. Add a barcode +number in the {guilabel}`Barcode` field in the {guilabel}`General Information` tab. + +### To your employees + +To add an identification number to an employee, go to the **Employees** app and open an **employee +form**. Choose an identification number for your employee and fill in the {guilabel}`PIN Code` +field in the {guilabel}`HR Settings` tab. + +## Use barcodes + +### Scan products + +Scan a product's barcode using a barcode scanner. Doing so adds it directly to the cart. To change +the quantity, scan a product as many times as needed, or click {guilabel}`Qty` and enter the number +of products using the keypad. + +You can also enter the barcode number manually in the search bar to look for the product. Then, +click it to add it to the cart. + +### Log employees + +You can also use a barcode scanner to log your employees. To do so, {ref}`restrict access +` to the POS and {ref}`use barcodes to log your employees in +` your POS. + diff --git a/content/applications/sales/point_of_sale/shop/customer_display.md b/content/applications/sales/point_of_sale/shop/customer_display.md new file mode 100644 index 000000000..bde67c3fe --- /dev/null +++ b/content/applications/sales/point_of_sale/shop/customer_display.md @@ -0,0 +1,62 @@ +# Customer display + +The **customer display** feature provides customers with real-time checkout updates on a secondary +display. + +```{image} customer_display/display.png +:alt: customer screen +``` + +## Configuration + +Depending on your POS setup, the feature can be displayed {ref}`locally on a secondary screen +`, {ref}`remotely on another device `, or +{ref}`another monitor connected to an IoT Box `. + +To activate the feature, go to the POS settings, scroll down to the {guilabel}`Connected Devices` +section, and tick the {guilabel}`Customer Display` checkbox. + +```{image} customer_display/feature-setting.png +:alt: customer display setting checkbox +``` + +(customer-display-local)= + +### Local + +Connect a second screen to your POS and {ref}`open a POS session `. Then, click +{guilabel}`Customer Screen` to open a new window to drag and drop onto the second screen. + +(customer-display-remote)= + +### Remote + +Access your database from another device (any computer, tablet, or smartphone), go to the POS +application, click the vertical ellipsis button ({guilabel}`⋮`) on a POS card, and then +{guilabel}`Customer Display` to open the display remotely. + +:::{note} +The two devices are not required to share the same network. +::: + +(customer-display-iot)= + +### IoT system + +Connect an IoT box to your database and the second screen to the IoT box. Then, go to +{menuselection}`Point of Sale --> Configuration --> Settings`, scroll down to the +{guilabel}`Connected Devices` section, tick the {guilabel}`IoT Box` checkbox, and select the second +monitor in the {guilabel}`Customer Display` field. + +```{image} customer_display/iot-setting.png +:alt: iot setting to connect a customer display +``` + +:::{note} +Both devices need to be connected to the same local network. +::: + +:::{seealso} +{doc}`../configuration/pos_iot` +::: + diff --git a/content/applications/sales/point_of_sale/shop/sales_order.md b/content/applications/sales/point_of_sale/shop/sales_order.md new file mode 100644 index 000000000..72461cf10 --- /dev/null +++ b/content/applications/sales/point_of_sale/shop/sales_order.md @@ -0,0 +1,49 @@ +# Sales orders + +When working in retail, you might need to order products directly from your Point of sale. +Fortunately, Odoo Point of Sale is fully integrated with Odoo Sales, meaning that you can create a +sales order and pay for it directly from your point of sale. + +## Select a sales order + +From the **Point of Sale** application, open a new session. Then, click on +{guilabel}`Quotations/Orders` to get the complete list of quotations and sales orders created on the +sales application. + +```{image} sales_order/pos-interface.png +:align: center +:alt: Quotations and sales order button on the Point of Sale interface +``` + +:::{note} +To ease finding the right sales order, you can filter that list on the **customer** or on the +**order reference**. You can also set the customer before clicking on +{guilabel}`Quotations/Orders` to reduce the list to one particular customer. +::: + +## Apply a down payment or settle the order + +From the list of sales order, select one to make a payment. + +```{image} sales_order/list-of-so.png +:align: center +:alt: list view of sales orders and quotations +``` + +You can either: + +- Settle the order **partially**: after clicking on {guilabel}`Apply a down payment`, enter the + percentage of down payment you want the customer to pay. Then, click on {guilabel}`ok` and proceed + with the order. +- Settle the order **completely**: click on {guilabel}`Settle the order` to pay for the total of the + sales order. + +:::{note} +Once you settle a sales order, the applied down payment is automatically deducted from the total +amount. +::: + +:::{Seealso} +- {doc}`/applications/sales/sales/invoicing/down_payment` +::: + diff --git a/content/applications/sales/point_of_sale/shop/serial_numbers.md b/content/applications/sales/point_of_sale/shop/serial_numbers.md new file mode 100644 index 000000000..ef2d32a2a --- /dev/null +++ b/content/applications/sales/point_of_sale/shop/serial_numbers.md @@ -0,0 +1,64 @@ +# Serial numbers and lots + +Working with **serial numbers** and **lots** allows tracking your products' movements. When products +are tracked, the system identifies their location based on their last movement. + +To enable traceability, go to {menuselection}`Point of Sale --> Products --> Products`. Then, +select a product and check the {guilabel}`Tracking By Unique Serial Number` or the +{guilabel}`Tracking By Lots` box in the {guilabel}`Inventory` tab. + +```{image} serial_numbers/product-form-traceability.png +:align: center +:alt: Enable traceability settings +``` + +## Serial numbers and lots importation + +You can import serial numbers in Point of Sale. To do so, select a **sales order** or a +**quotation** containing tracked products. Then, agree to load the **Lots or Serial Numbers** linked +to the {abbr}`SO (sales order)`. + +```{image} serial_numbers/importing-sn.png +:align: center +:alt: Pop-up window for serial number import +:width: 480 +``` + +The imported tracking numbers appear below the tracked products. You can modify them by clicking on +the list-view button next to the products. + +```{image} serial_numbers/pos-sn-imported.png +:align: center +:alt: Pop-up window for serial number import +:width: 480 +``` + +:::{seealso} +- {doc}`../shop/sales_order` +::: + +## Serial numbers and lots creation + +If a tracked product is available in your POS, adding the product to the cart opens a pop-up window +where you can type or scan the product's serial or lot numbers. To add more than one of the same +tracked products, click on **enter** to validate and start a new line. + +```{image} serial_numbers/create-change-sn.png +:align: center +:alt: adding new serial and lots numbers +:width: 480 +``` + +:::{note} +- Changing a tracked product's quantity using the numpad turns the list-view button red. Click on + it to add the missing lot and serial numbers. +- {guilabel}`Lot & Serial Number(s)` are {guilabel}`required` on tracked products but not + mandatory. Meaning that not attributing some or any does **not** prevent from completing the + sale. +::: + +:::{seealso} +- {doc}`/applications/inventory_and_mrp/inventory/product_management/product_tracking/serial_numbers` +- {doc}`/applications/inventory_and_mrp/inventory/product_management/product_tracking/lots` +::: + diff --git a/content/applications/sales/point_of_sale/shop/ship_later.md b/content/applications/sales/point_of_sale/shop/ship_later.md new file mode 100644 index 000000000..14c13191f --- /dev/null +++ b/content/applications/sales/point_of_sale/shop/ship_later.md @@ -0,0 +1,46 @@ +# Ship later + +The **Ship Later** feature allows you to sell products and schedule delivery at a later date. It is +useful, for example, when a product is out of stock or so voluminous that it requires to be shipped, +or if, for any reason, the customer needs their order to be shipped later, etc. + +## Configuration + +{ref}`Go to the POS settings `, scroll down to the {guilabel}`Inventory` +section, and enable {guilabel}`Allow Ship Later`. + +```{image} ship_later/settings.png +:alt: settings to enable and configure the ship later feature +:scale: 85% +``` + +Once activated, you can: + +- Choose the location from where the products are shipped by selecting a {guilabel}`Warehouse`. +- Define a {guilabel}`Specific route`, or leave this field empty to use the default route. +- Define the {guilabel}`Shipping Policy`; select {guilabel}`As soon as possible` if the products + can be delivered separately or {guilabel}`When all products are ready` to ship all the products at + once. + +:::{seealso} +- {doc}`../../../inventory_and_mrp/inventory/shipping_receiving/setup_configuration` +- {doc}`../../../inventory_and_mrp/inventory/warehouses_storage/inventory_management/warehouses` +::: + +## Practical application + +1. {ref}`Open a session ` and make a sale. +2. On the payment screen, set a customer and select {guilabel}`Ship Later`. +3. On the popup window, set a shipping date and click {guilabel}`Confirm` to proceed to payment. + +```{image} ship_later/payment.png +:alt: selecting ship later at checkout. +:scale: 75% +``` + +The system instantly creates a delivery order from the warehouse to the shipping address. + +:::{Note} +The selected customer must have referenced an address in the system for products to be shipped. +::: + diff --git a/content/applications/sales/rental.md b/content/applications/sales/rental.md new file mode 100644 index 000000000..b7b7a3654 --- /dev/null +++ b/content/applications/sales/rental.md @@ -0,0 +1,292 @@ +# Rental + +The Odoo *Rental* application provides comprehensive solutions to configure and manage rentals. + +Send quotations, confirm orders, schedule rentals, register products when they are picked up and +returned, and invoice customers from this single platform. + +:::{seealso} +- [Odoo Rental: product page](https://www.odoo.com/app/rental) +- [Odoo Tutorials: Rental](https://www.odoo.com/slides/rental-48) +::: + +(rental-pricing)= + +## Dashboard + +Upon opening the *Rental* application, the {guilabel}`Rental Orders` dashboard is revealed. + +```{image} rental/rental-orders-dashboard.png +:align: center +:alt: Example of the Rental Orders dashboard available in the Odoo Rental application. +``` + +In the default kanban view, all rentals are visible. Each rental card displays the customer name, +the price of the rental, the related sales order number, along with the status of the rental. + +:::{note} +Rental kanban cards that do **not** display a rental status means those rentals have confirmed +quotations, but have not been picked up yet. +::: + +On the left sidebar, the {guilabel}`Rental Status` for each rental can be found. Beneath that, the +{guilabel}`Invoice Status` of the rentals is accessible. Clicking any option in the left sidebar +filters the displayed rentals on the dashboard. + +## Settings + +To configure additional rental delay costs, availability of rental items, or minimum time of rental, +navigate to {menuselection}`Rental app --> Configuration --> Settings`. + +```{image} rental/rental-settings.png +:align: center +:alt: How the Settings page appears in the Odoo Rental application. +``` + +In the {guilabel}`Rental` section, there are options to configure {guilabel}`Default Delay Costs` +and {guilabel}`Default Padding Time`. There is also the option to activate {guilabel}`Rental +Transfers` and {guilabel}`Digital Documents`. + +- {guilabel}`Default Delay Costs` are additional costs for late returns. +- {guilabel}`Default Padding Time` represents the minimum amount of time between two rentals. +- {guilabel}`Rental Transfers` means stock deliveries and receipts can be used for rental orders. +- {guilabel}`Digital Documents` allows users to upload documents for customers to sign prior to + : confirming their rental. + +In the {guilabel}`Rent Online` section, there are options to configure a {guilabel}`Minimal Rental +Duration` and designate {guilabel}`Unavailability days`, or days during which pickup and return are +not possible. + +## Rental products + +To view all products that can rented in the database, navigate to {menuselection}`Rentals app --> +Products`. By default, the {guilabel}`Can be Rented` search filter appears in the search bar. + +Each product kanban card displays that product's name, rental price, and product image (if +applicable). + +## Rental pricing + +To adjust the rental pricing on a product, go to the {guilabel}`Products` page in the *Rental* app, +then select the desired product or click {guilabel}`New` to create a new product from scratch. + +On the product form, ensure the {guilabel}`Can be Rented` checkbox is ticked. Then, open the +{guilabel}`Rental prices` tab. + +```{image} rental/rental-prices-tab.png +:align: center +:alt: How the Settings page appears in the Odoo Rental application. +``` + +:::{note} +If creating a rental product outside of the *Rental* app, just ensure the {guilabel}`Can be +Rented` checkbox is ticked on the product form. By default, this checkbox is ticked whenever a +product is created directly in the *Rental* application. +::: + +### Pricing + +Under the {guilabel}`Pricing` section of the {guilabel}`Rental prices` tab, designate custom rental +prices and rental periods for the product. + +To add pricing for a rental, click {guilabel}`Add a price`. Then, choose a *pricing period* +({dfn}`the unit of duration of the rental`) in the {guilabel}`Period` column, or create a new +pricing period by typing in the name and clicking {guilabel}`Create`. + +Next, decide whether or not to apply this custom rental price to a specific {guilabel}`Pricelist`. + +Lastly, enter the desired {guilabel}`Price` for that specific {guilabel}`Period`. + +:::{note} +There is no limit to how many pricing lines can be added. Multiple pricing options for rental +products are typically used to give discounts for customers who agree to longer rental durations. +::: + +To delete any rental pricing option, click the {guilabel}`🗑️ (trash)` icon, and that row is +deleted. + +### Reservations + +Under the {guilabel}`Reservations` section of the {guilabel}`Rental prices` tab, there is the option +to configure additional fines for any {guilabel}`Extra Hour` or {guilabel}`Extra Day` that the +customer takes to return a rental. + +There is also the option to set a {guilabel}`Security Time`, expressed in hours, to make the rental +product temporarily unavailable between two rental orders. Such a feature may prove useful if +maintenance or cleaning is required between rentals. + +### Price computing + +Odoo always uses two rules to compute the price of a product when a rental order is created: + +1. Only one price line is used. +2. The cheapest line is selected. + +```{eval-rst} +.. exercise:: + Consider the following rental pricing configuration for a product: + + - 1 day: $100 + - 3 days: $250 + - 1 week: $500 + + A customer wants to rent this product for eight days. What price will they pay? + + After an order is created, Odoo selects the second line as this is the cheapest option. The + customer has to pay three times '3 days' to cover the rental's eight days, for a total of $750. +``` + +(rental-customer-signature)= + +## Rental orders + +To create a rental order in the *Rental* app, navigate to {menuselection}`Rental app --> Orders --> +Orders`, and click {guilabel}`New`. Doing so reveals a blank rental order form to be filled in +accordingly. + +```{image} rental/rental-order.png +:align: center +:alt: Sample of a filled out rental order available in the Odoo Rental application. +``` + +Start by adding a {guilabel}`Customer`, then configure the desired duration of the rental in the +{guilabel}`Rental period` field. + +To adjust the rental duration, click the first date in the {guilabel}`Rental period` field, and +select the range of dates to represent the rental duration from the pop-up calendar form that +appears. + +```{image} rental/rental-period-field-popup.png +:align: center +:alt: Sample of a rental period calendar pop-up window in the Odoo Rental application. +``` + +Once complete, click {guilabel}`Apply` in the calendar pop-up form. Following that, the pop-up form +disappears, and the designated time period of the rental is represented in the {guilabel}`Duration` +field. + +Next, add a rental product in the {guilabel}`Order Lines` tab, by clicking {guilabel}`Add a +product`, and selecting the desired rental product to add to the form. + +:::{note} +If a rental product is added *before* the {guilabel}`Rental period` field has been properly +configured, the user can *still* adjust the {guilabel}`Rental period` field accordingly. + +Simply select the desired range of dates to represent the duration of the rental, then click +{guilabel}`Update Rental Prices` in the {guilabel}`Duration` field. + +```{image} rental/rental-update-rental-prices.png +:align: center +:alt: The update rental prices option that appears in the Odoo Rental application. +``` + +Doing so reveals a {guilabel}`Confirmation` pop-up window. If everything is correct, click +{guilabel}`Ok`, and Odoo recalculates the rental price accordingly. +::: + +Once all the information has been entered correctly on the rental order form, click the +{guilabel}`Send by Email` button to send the quotation to the customer, or click the +{guilabel}`Confirm` button to confirm the order. + +## Customer signature + +Upon confirming a rental order, the {guilabel}`Sign Documents` button appears. This gives the +ability to request the customer sign a rental agreement, outlining the arrangement between the +company and customer, *before* they pick up the rental product(s). + +Such documents can ensure everything is returned on-time and in its original condition. + +:::{important} +The {guilabel}`Sign Documents` button/option **only** appears if the {guilabel}`Digital +Documents` feature has been activated in the *Rental* application settings. To do so, navigate to +{menuselection}`Rental app --> Configuration --> Settings`, activate {guilabel}`Digital +Documents`, and click {guilabel}`Save`. +::: + +:::{note} +This feature also requires the {doc}`Sign <../productivity/sign>` app. If necessary, Odoo +automatically installs it after activating the {guilabel}`Digital Documents` setting. +::: + +To request a customer signature on a rental agreement, select a confirmed rental order, and click +the {guilabel}`Sign Documents` button to reveal a {guilabel}`Sign Documents` pop-up window. + +```{image} rental/sign-documents-popup.png +:align: center +:alt: The Sign Documents pop-up window that appears in the Odoo Rental application. +``` + +From here, select the desired document from the {guilabel}`Document Template` field. Then, click +{guilabel}`Sign Document`. Doing so reveals a {guilabel}`New Signature Request` pop-up window. + +```{image} rental/new-signature-request-form.png +:align: center +:alt: The New Signature Request pop-up window that appears in the Odoo Rental application. +``` + +Upon confirming the information in the {guilabel}`New Signature Request` pop-up form, click +{guilabel}`Sign Now` to initiate the signing process. + +A separate page is then revealed, showcasing the document to be signed, which is accessible to the +customer via the customer portal. + +Odoo guides the customer through the signing process with clear, clickable indicators, and allows +them to create electronic signatures to quickly complete the form. + +```{image} rental/adopt-signature-popup.png +:align: center +:alt: The adopt your signature pop-up window that appears in the Odoo Rental application. +``` + +Once the document has been signed and completed, click the {guilabel}`Validate & Send Completed +Document` button at the bottom of the document. + +```{image} rental/validate-send-doc-button.png +:align: center +:alt: The validate and send completed document button in the Odoo Rental application. +``` + +Upon clicking the {guilabel}`Validate & Send Completed Document` button, Odoo presents the option to +download the signed document for record-keeping purposes, if necessary. + +:::{seealso} +[Odoo Tutorials: Sign](https://www.odoo.com/slides/sign-61) +::: + +(rental-pickup-return)= + +## Pickup products + +When a customer picks up the product(s), navigate to the appropriate rental order, click the +{guilabel}`Pickup` button, and then click {guilabel}`Validate` in the {guilabel}`Validate a pickup` +pop-up form that appears. + +Doing so places a {guilabel}`Picked-up` status banner on the rental order. + +## Return products + +When a customer returns the product(s), navigate to the appropriate rental order, click the +{guilabel}`Return` button, and validate the return by clicking {guilabel}`Validate` in the +{guilabel}`Validate a return` pop-up form that appears. + +Doing so places a {guilabel}`Returned` status banner on the rental order. + +## Print pickup and return receipts + +Pickup and return receipts can be printed for customers when they pick up and/or return rental +products. + +To print pickup and/or return receipts, navigate to the appropriate rental order, click the +{guilabel}`⚙️ (gear)` icon to reveal a drop-down menu. + +```{image} rental/print-pickup-return-receipt.png +:align: center +:alt: The pickup and return receipt print option in the Odoo Rental application. +``` + +From this drop-down menu, hover over the {guilabel}`Print` option to reveal a sub-menu. Then select +{guilabel}`Pickup and Return Receipt`. + +Odoo generates and downloads a PDF, detailing all information about the current status of the rented +item(s). + diff --git a/content/applications/sales/sales.md b/content/applications/sales/sales.md new file mode 100644 index 000000000..713cb095c --- /dev/null +++ b/content/applications/sales/sales.md @@ -0,0 +1,27 @@ +--- +hide-page-toc: true +nosearch: true +show-content: true +show-toc: true +--- + +# Sales + +**Odoo Sales** is the application to run your sales process (from quotation to sales order) and +deliver and invoice what has been sold. + +:::{seealso} +- [Odoo Tutorials: Sales Tutorials](https://www.odoo.com/slides/sales-17) +::: + +```{toctree} +:titlesonly: true + +sales/send_quotations +sales/invoicing +sales/products_prices +sales/amazon_connector +sales/shopee_connector +sales/gelato +``` + diff --git a/content/applications/sales/sales/amazon_connector.md b/content/applications/sales/sales/amazon_connector.md new file mode 100644 index 000000000..50dd27ecb --- /dev/null +++ b/content/applications/sales/sales/amazon_connector.md @@ -0,0 +1,14 @@ +--- +nosearch: true +--- + +# Amazon Connector + +```{toctree} +:titlesonly: true + +amazon_connector/features +amazon_connector/setup +amazon_connector/manage +``` + diff --git a/content/applications/sales/sales/amazon_connector/features.md b/content/applications/sales/sales/amazon_connector/features.md new file mode 100644 index 000000000..335cad6c0 --- /dev/null +++ b/content/applications/sales/sales/amazon_connector/features.md @@ -0,0 +1,119 @@ +# Amazon Connector features + +The *Amazon Connector* synchronizes orders between Amazon and Odoo, which considerably reduces the +amount of time spent manually entering Amazon orders (from the Amazon Seller account) into Odoo. It +also allows users to accurately keep track of Amazon sales in Odoo. + +## Supported features + +The Amazon Connector is able to: + +- Synchronize (Amazon to Odoo) all confirmed orders (both FBA and FBM), and their order items, which + include: + + - product name, description, and quantity + - shipping costs for the product + - gift wrapping charges + +- Create any missing partner related to an order in Odoo (contact types supported: contact and + delivery address). + +- Notify Amazon of confirmed shipment in Odoo (FBM) to get paid. + +- Synchronize (Odoo to Amazon) all available quantities of your products (FBM). + +- Support multiple seller accounts. + +- Support multiple marketplaces per seller account. + +The following table lists capabilities provided by Odoo when using the Amazon Connector: + +```{eval-rst} ++---------------------------+----------------------------+-------------------------------------+ +| | Fulfilled By Amazon (FBA) | Fulfilled By Merchant (FBM) | ++===========================+============================+=====================================+ +| **Orders** | Synchronize shipped and | Synchronize unshipped and cancelled | +| | cancelled orders. | orders. | ++---------------------------+----------------------------+-------------------------------------+ +| **Shipping** | Shipping cost is computed | Shipping cost is computed by Amazon | +| | by Amazon, and included in | and included in the synchronized | +| | the synchronized order. | orders. | +| +----------------------------+-------------------------------------+ +| | Shipping done by Amazon. | A delivery order is automatically | +| | | created in Odoo for each new order. | +| | | Once it has been processed in Odoo, | +| | | the status is then synchronized in | +| | | Amazon. | ++---------------------------+----------------------------+-------------------------------------+ +| **Gift Wrapping** | Handled by Amazon. | Cost is computed by Amazon, and | +| | | included in the synchronized order. | +| | | Gift message is added on a line of | +| | | the order and on the delivery order.| +| | | Then it is up to the user. | ++---------------------------+----------------------------+-------------------------------------+ +| **Stock Management** | Managed by Amazon, and | Managed in Odoo Inventory app, and | +| | synchronized with a virtual| synchronized with Amazon. | +| | location to follow it in | | +| | Odoo. | | ++---------------------------+----------------------------+-------------------------------------+ +| **Delivery Notifications**| Handled by Amazon. | Send by Amazon, based on delivery | +| | | status synchronized from Odoo. | ++---------------------------+----------------------------+-------------------------------------+ +``` + +:::{note} +The Amazon Connector is designed to synchronize the data of sales orders. Other actions, such as +downloading monthly fees reports, handling disputes, or issuing refunds, **must** be managed from +the *Amazon Seller Central*, as usual. +::: + +:::{warning} +As of February 19, 2024, in North American marketplaces, {abbr}`FBA (Fulfilled by Amazon)` orders +created with the *Amazon Connector*, do not get the customer's name passed onto the +sales/delivery order in Odoo. This is due to the fact that Amazon now calculates, and remits, +sales tax on behalf of sellers. In other words, personally identifiable customer information is +not transmitted to the seller any longer, after a {abbr}`FBA (Fulfilled by Amazon)` order. +::: + +(amazon-supported-marketplaces)= + +## Supported marketplaces + +If a marketplace is not listed in your Amazon marketplaces, it's possible to {ref}`add a new +marketplace `. + +```{eval-rst} ++-------------------------------+ +| **North America region** | ++===============+===============+ +| Canada | Amazon.ca | ++---------------+---------------+ +| Mexico | Amazon.com.mx | ++---------------+---------------+ +| US | Amazon.com | ++---------------+---------------+ +``` + +```{eval-rst} ++-------------------------------+ +| **Europe region** | ++===============+===============+ +| Germany | Amazon.de | ++---------------+---------------+ +| Spain | Amazon.es | ++---------------+---------------+ +| France | Amazon.fr | ++---------------+---------------+ +| UK | Amazon.co.uk | ++---------------+---------------+ +| Italy | Amazon.it | ++---------------+---------------+ +| Netherlands | Amazon.nl | ++---------------+---------------+ +``` + +:::{seealso} +- {doc}`setup` +- {doc}`manage` +::: + diff --git a/content/applications/sales/sales/amazon_connector/manage.md b/content/applications/sales/sales/amazon_connector/manage.md new file mode 100644 index 000000000..56a397db5 --- /dev/null +++ b/content/applications/sales/sales/amazon_connector/manage.md @@ -0,0 +1,200 @@ +# Amazon order management + +## Order synchronization + +Orders are automatically fetched from Amazon, and synchronized in Odoo, at regular intervals. + +The synchronization is based on the Amazon status: only orders whose status has changed since the +last synchronization are fetched from Amazon. This includes changes on either end (Amazon or Odoo). + +For *FBA* (Fulfilled by Amazon), only *Shipped* and *Cancelled* orders are fetched. + +For *FBM* (Fulfilled by Merchant), the same is done for *Unshipped* and *Cancelled* orders. For each +synchronized order, a sales order and customer are created in Odoo (if the customer is not already +registered in the database). + +:::{important} +The stock synchronization does **not** currently support selling the same product as {abbr}`FBM +(Fulfilled By Merchant)` *and* {abbr}`FBA (Fulfilled By Amazon)`. + +At times, when stock is sent for all products, it triggers a stock problem with Amazon, where +Amazon incorrectly thinks the {abbr}`FBM (Fulfilled By Merchant)` product has some quantity in +{abbr}`FBM (Fulfilled By Merchant)`. + +As a result, Amazon then sells it as {abbr}`FBM (Fulfilled By Merchant)`, instead of taking from +their own warehouse. Odoo developers are currently working on resolving this issue to avoid +future discrepancies. +::: + +:::{note} +When an order is cancelled in Amazon, and was already synchronized in Odoo, the corresponding +sales order is automatically cancelled in Odoo. +::: + +## Force synchronization + +In order to force the synchronization of an order, whose status has **not** changed since the +previous synchronization, start by activating the {ref}`developer mode `. This +includes changes on either end (Amazon or Odoo). + +Then, navigate to the Amazon account in Odoo ({menuselection}`Sales app --> Configuration --> +Settings --> Connectors --> Amazon Sync --> Amazon Accounts`), and modify the date under +{menuselection}`Orders Follow-up --> Last Order Sync`. + +Be sure to pick a date that occurs prior to the last status change of the desired order to +synchronize and save. This will ensure synchronization occurs correctly. + +:::{tip} +To immediately synchronize the orders of an Amazon account, switch to {ref}`developer mode +`, head to the Amazon account in Odoo, and click {guilabel}`Sync Orders`. The +same can be done with pickings by clicking {guilabel}`Sync Pickings`. +::: + +## Manage deliveries in FBM + +Whenever an FBM (Fulfilled by Merchant) order is synchronized in Odoo, a picking is instantly +created in the *Inventory* app, along with a sales order and customer record. Then, decide to either +ship all the ordered products to the customer at once, or ship products partially using backorders. + +When a picking related to the order is confirmed, a notification is then sent to Amazon, who, in +turn, notifies the customer that the order (or a part of it) is on its way. + +:::{important} +Amazon requires users to provide a tracking reference with each delivery. This is needed to +assign a carrier. + +If the carrier doesn't automatically provide a tracking reference, one must be set manually. This +rule applies to all Amazon marketplaces. +::: + +:::{tip} +If the chosen carrier isn't supported by Odoo, a carrier with the same name can still be created +(e.g. create a carrier named `easyship`). The name used is **not** case sensitive, but be mindful +to avoid typos. If there are typos, Amazon will **not** recognize them. Next, create a delivery +carrier named `Self Delivery` to inform Amazon that the user will make the deliveries. Even with +this route, a tracking reference still **must** be entered. Remember, the customer is notified by +email about the delivery, and the carrier, along with the tracking reference, are displayed in +the email to the customer. +::: + +:::{seealso} +{doc}`../../../inventory_and_mrp/inventory/shipping_receiving/setup_configuration/third_party_shipper` +::: + +(manage-manage-delivery-errors)= + +### Manage errors when synchronizing deliveries + +Sometimes, Amazon can fail to correctly process all the information sent by Odoo. In this case, Odoo +sends an email listing all the shipments that failed and the errors Amazon sent with them. In +addition, these shipments are flagged with a {guilabel}`Synchronization with Amazon failed` tag. + +Usually, the error can be corrected directly in the Amazon backend or in Odoo. If the problem is +corrected in Odoo, synchronize the shipment again using the {guilabel}`Retry Amazon Sync` button. + +:::{note} +It might happen that Odoo receives a notification from Amazon saying that some delivery +information was not processed, but without specifying which shipments were affected. In that +case, all the shipments in an unknown state will be treated as if they failed to synchronize. +Once Odoo receives a notification from Amazon saying that a shipment was processed, its tag will +change to {guilabel}`Synchronized with Amazon`. To speed up this process, on your Amazon account, +click on {guilabel}`Sync Orders` to manually synchronize these orders, or click on +{guilabel}`Recover Order` and enter the relevant Amazon Order Reference. +::: + +## Follow deliveries in FBA + +When an FBA (Fulfilled by Amazon) order is synchronized in Odoo, a stock move is recorded in the +*Inventory* app for each sales order item. That way, it's saved in the system. + +Inventory managers can access these stock moves by navigating to {menuselection}`Inventory app --> +Reporting --> Moves History`. + +For FBA orders, the stock move is automatically created in Odoo by the Amazon connector, thanks to +the shipping status of Amazon. When sending new products to Amazon, the user should manually create +a picking (delivery order) to transfer these products from their warehouse to the Amazon location. + +:::{tip} +To follow *Amazon (FBA)* stock in Odoo, make an inventory adjustment after replenishing stock. An +automated replenishment from reordering rules can also be triggered on the Amazon location. +::: + +The Amazon location is configurable by accessing the Amazon account managed in Odoo. To access +Amazon accounts in Odoo navigate to {menuselection}`Sales app --> Configuration --> Settings --> +Connectors --> Amazon Sync --> Amazon Accounts`. + +All accounts of the same company use the same Amazon location, by default. However, it is possible +to follow the stock filtered by marketplace. + +To do that, first remove the marketplace, where the desired stock to follow separately can be found, +from the list of synchronized marketplaces, which can be found by navigating to +{menuselection}`Sales app --> Configuration --> Settings --> Connectors --> Amazon Sync --> Amazon +Accounts`. + +Next, create another registration for this account, and remove all marketplaces--- **except** the +marketplace this is desired to be isolated from the others. + +Lastly, assign another stock location to the second registration of the account. + +## Invoice and register payments + +### Issue invoices + +Due to Amazon's policy of not sharing customer email addresses, it is **not** possible to send +invoices directly to Amazon customers from Odoo. However, it **is** possible to manually upload the +generated invoices from Odoo to the Amazon back-end. + +Additionally, for B2B clients, it is currently required to manually retrieve VAT numbers from the +Amazon back-end **before** creating an invoice in Odoo. + +### Register payments + +Since customers pay Amazon as an intermediary, creating a dedicated *Bank* journal (e.g. named +`Amazon Payments`), with a dedicated *Bank and Cash* intermediary account is recommended. + +Additionally, as Amazon makes a single monthly payment, selecting all the invoices linked to a +single payment is necessary when registering payments. + +To do that, use the appropriate {guilabel}`Journal` dedicated to Amazon payments, and select +{guilabel}`Batch Deposit` as the {guilabel}`Payment Method`. + +Then, select all the generated payments, and click {menuselection}`Actions --> Create batch payment +--> Validate`. + +:::{tip} +This same action can be performed with vendor bills from Amazon dedicated to commissions. + +When the balance is received in the bank account at the end of the month, and the bank statements +are recorded, credit the Amazon intermediary account by the amount received. +::: + +## Follow Amazon sales in sales reporting + +On the Amazon account profile in Odoo, a sales team is set under the {guilabel}`Order Follow-up` +tab. + +This gives quick access to important metrics related to sales reporting. By default, the Amazon +account's sales team is shared between all of the company's accounts. + +If desired, the sales team on the account can be changed for another, in order to perform a separate +reporting for the sales of this account. + +:::{tip} +It is also possible to perform reporting on a per-marketplace basis. + +First, remove the desired marketplace from the list of synchronized marketplaces. + +To access the list of synchronized marketplaces in Odoo, navigate to {menuselection}`Sales app +--> Configuration --> Settings --> Connectors --> Amazon Sync --> Amazon Accounts`. + +Then, create another registration for this account, and remove all other marketplaces **except** +the one to isolate. + +Lastly, assign another sales team to one of the two registrations of the account. +::: + +:::{seealso} +- {doc}`features` +- {doc}`setup` +::: + diff --git a/content/applications/sales/sales/amazon_connector/setup.md b/content/applications/sales/sales/amazon_connector/setup.md new file mode 100644 index 000000000..920c02792 --- /dev/null +++ b/content/applications/sales/sales/amazon_connector/setup.md @@ -0,0 +1,158 @@ +# Amazon Connector configuration + +Odoo allows users to register an Amazon seller account in the database, but the user **must** have +a paid Amazon Seller account prior to completing the configuration. + +Set up a paid Seller account on Amazon by first logging into the Amazon platform, and navigating to +{menuselection}`Account \& Lists --> Start a Selling Account` from the drop-down menu located in +the header section. + +Then on the {guilabel}`Sell with Amazon` page, follow the sign-up process and finally proceed to +follow the instructions below to register and link that Amazon Seller account in Odoo. + +:::{seealso} +[Sell with Amazon](https://www.amazon.com/b/?node=12766669011) +::: + +## Connect Amazon Seller account to Odoo + +(amazon-setup)= + +To connect an Amazon Seller account in Odoo, navigate to {menuselection}`Sales app --> +Configuration --> Settings --> Connectors section`, activate the {guilabel}`Amazon Sync` feature, +and click {guilabel}`Save`. + +Then, return to {menuselection}`Sales app --> Configuration --> Settings --> Connectors section`, +and click on the {guilabel}`Amazon Accounts` link under the {guilabel}`Amazon Sync` setting. + +```{image} setup/amazon-accounts-link-setting.png +:align: center +:alt: The Amazon Accounts link beneath the Amazon Sync settings in Odoo Sales. +``` + +Doing so reveals a separate {guilabel}`Amazon Accounts` page. From here, click {guilabel}`New` to +create and link a new Amazon account. + +On the blank {guilabel}`Amazon Account` form page, start by choosing a name for the account (e.g. +`American Marketplace`). Then, in the {guilabel}`Credentials` tab, select the marketplace on which +the seller account was initially created from the {guilabel}`Home Marketplace` drop-down menu. + +```{image} setup/amazon-accounts-form-page.png +:align: center +:alt: A typical Amazon Account form page in the Odoo Sales application. +``` + +After saving, the field in the {guilabel}`Credentials` tab is replaced by a {guilabel}`Link with +Amazon` button. + +```{image} setup/amazon-accounts-form-link-button.png +:align: center +:alt: A typical Amazon Account form page and Link with Amazon button in Odoo Sales. +``` + +Clicking that button redirects to either the Amazon login page, or directly to the required consent +page, if the user is already logged in to Amazon. + +On the login page, log in to the desired Amazon seller account. + +On the consent page, confirm that Amazon is allowed to give Odoo access to the account and related +data. + +Upon confirmation, Amazon returns the user to Odoo, and the account has been registered. + +With the Amazon account successfully registered, the marketplaces available to this specific account +are synchronized with Odoo and listed under the {guilabel}`Marketplaces` tab. + +If desired, remove items from the list of synchronized marketplaces to disable synchronization. + +## Amazon orders in Odoo + +When an Amazon order is synchronized, up to three line items are created on the sales order in Odoo. +Each one represents a product sold on Amazon: one for the product that was sold on Amazon +Marketplace, one for the shipping charges (if any), and one for the gift wrapping charges (if any). + +(amazon-matching)= + +The selection of a database product for a sales order item is done by matching its +{guilabel}`Internal Reference` (a customizable product reference idenifier in Odoo, like `FURN001`) +with the Amazon *SKU* for marketplace items, the Amazon *Shipping Code* for delivery charges, and +the Amazon *Gift Wrapping* code for gift wrapping charges. + +For marketplace products, pairings are saved as *Amazon Offers*, which are listed under the +{guilabel}`Offers` smart button on the account form. + +```{image} setup/amazon-offers-button.png +:align: center +:alt: The Amazon Offers smart button on the account form in Odoo Sales. +``` + +Offers are automatically created when the pairing is established, and they're used for subsequent +orders to lookup SKUs. If no offer with a matching SKU is found, {ref}`the internal reference is +used instead `. + +:::{tip} +It's possible to force the pairing of a marketplace item with a specific product, by changing +either the product or the SKU of an offer to ensure they match. The offer can be manually created +if it was not automatically done yet. + +This is useful if the internal reference is not used as the SKU, or if the product sells under +different conditions. +::: + +If no database product with a matching internal reference is found for a given Amazon SKU or gift +wrapping code, then a default database product, *Amazon Sale*, is used. The same is done with the +default product *Amazon Shipping* if no database product is found for a given Amazon shipping code. + +:::{note} +To modify default products, activate the {ref}`developer mode `, and navigate to +{menuselection}`Sales app --> Configuration --> Settings --> Connectors --> Amazon Sync --> +Default Products`. +::: + +## Product tax configuration + +To allow for tax reporting of Amazon sales with Odoo, the taxes applied to the sales order items are +those set on the product, or determined by the fiscal position. + +Make sure to have the correct taxes set on your products in Odoo, or have it done by a fiscal +position, to avoid discrepancies in the subtotals between *Amazon Seller Central* and Odoo. + +:::{note} +As Amazon does not necessarily apply the same taxes as those configured in Odoo, it may happen +that order totals differ by a few cents between Odoo and *Amazon Seller Central*. Those +differences can be resolved with a write-off when reconciling the payments in Odoo. +::: + +(amazon-add-new-marketplace)= + +## Add a new marketplace + +All marketplaces are supported by the Amazon Connector. To add a new marketplace, proceed as +follows: + +1. Activate the {ref}`developer mode `. +2. Go to {menuselection}`Sales app --> Configuration --> Settings --> Connectors --> Amazon Sync --> + Amazon Marketplaces`. +3. Click {guilabel}`New` to create a new marketplace record. +4. Enter the Marketplace ID in the {guilabel}`API Idenifier` field, and select the {guilabel}`Amazon + Region` for your marketplace as described in the [Amazon Documentation for marketplace IDs and + regions](https://developer-docs.amazon.com/sp-api/docs/marketplace-ids), and the + {guilabel}`Seller Central URL` as described in the [Amazon Documentation for seller central URLs](https://developer-docs.amazon.com/sp-api/docs/seller-central-urls). +5. Set the {guilabel}`Name` of the record to `Amazon.` to easily retrieve it (e.g. + `Amazon.se`). The {guilabel}`API Identifier`, the {guilabel}`Region` and the {guilabel}`Seller + Central URL` fields should respectively hold the *Marketplace ID*, the selected Amazon region, + and the *Seller Central URL* values from the Amazon Documentation. +6. Once the marketplace is saved, update the Amazon Account configuration by going to + {menuselection}`Sales app --> Configuration --> Settings --> Connectors --> Amazon Sync --> + Amazon Accounts`. +7. Select the account on which to use the new marketplace, go to the {guilabel}`Marketplaces` tab, + and click on {guilabel}`Update available marketplaces`. An animation should confirm the success + of the operation. Newly added marketplaces are automatically added to the list of synchronized + marketplaces. If the new marketplace is not added to the list, it means that it is either + incompatible or unavailable for the seller account. + +:::{seealso} +- {doc}`features` +- {doc}`manage` +::: + diff --git a/content/applications/sales/sales/gelato.md b/content/applications/sales/sales/gelato.md new file mode 100644 index 000000000..77f101fdd --- /dev/null +++ b/content/applications/sales/sales/gelato.md @@ -0,0 +1,170 @@ +# Gelato + +Gelato is a global print-on-demand platform that integrates with Odoo to sync product catalogs and +automate order fulfillment. + +Connecting Gelato's services with Odoo's **Sales** and **eCommerce** apps enables the following: + +- Sync Odoo sales orders with Gelato for automated order fulfillment +- Create and manage Gelato products within Odoo; supports product variant and image sync +- Configure delivery options in Odoo and receive order updates via webhooks. + +## Configuration + +:::{important} +The company information (*Company name* and *Billing address*) in the Gelato account *must* match +the company information in the Odoo database in order for sales orders to be confirmed and sent +to Gelato for fulfillment. + +```{image} gelato/gelato-company.png +:alt: Company information in Gelato. +``` + +```{image} gelato/odoo-company.png +:alt: Company information in Odoo. +``` +::: + +### Configure API keys and webhooks in Gelato + +Before configuring the Gelato connector in Odoo, first obtain API credentials and webhooks from the +Gelato account. + +API connectors enable Odoo **Sales** to send and receive data from Gelato for order processing, +while webhooks provide real-time updates on order status and shipment tracking. + +#### API Key + +An API Key is a unique authentication token that allows Odoo to securely communicate with Gelato's +API, enabling order transmission, status updates, and data synchronization. + +After logging into Gelato, click {icon}`fa-code` {guilabel}`Developer` in the left menu bar. From +here, click on {guilabel}`API keys`. In the new page, click the {guilabel}`Add API Key` button to +open a new API key form. Type in a name, then click {guilabel}`Create Key`. + +Copy the generated API key using {guilabel}`Copy to Clipboard`. + +```{image} gelato/gelato-api-key.png +:alt: Newly generated API key in the Gelato platform. +``` + +:::{important} +Copy the API key and store it somewhere safe and secure before leaving this page. Once the page +is refreshed or exited, the key will not be available to copy. + +If the key cannot be copied or is lost, return to the {guilabel}`API key` page and start over, +creating a new API key. +::: + +#### Webhook + +A webhook is an automated notification system that instantly updates Odoo when Gelato processes, +ships, or delivers an order, ensuring real-time tracking and minimal manual intervention. + +To create a webhook, go to {menuselection}`Developer --> Webhooks` under the {guilabel}`Developer` +drop-down menu in the left menu bar. In the new page, click {guilabel}`Add Webhook` to open a +{guilabel}`Create Webhook` form. + +The webhook form requires several specific configurations: + +- {guilabel}`URL`: This tells Gelato where to send the order updates in Odoo. Copy and paste the + Odoo database URL with the additional suffix `/gelato/webhook`. + + ```{eval-rst} + .. example:: + `https://stealthywood.odoo.com/gelato/webhook` + ``` + +- {guilabel}`Events`: Click into the field and select {guilabel}`order_status_updated`. Selecting + {guilabel}`order_status_updated` ensures Odoo receives order changes automatically. + +- {guilabel}`Method`: Click into the field and select the {guilabel}`HTTP Post` option, as this is + the request method used to send data from Gelato to Odoo. + +- Tick the checkbox next to {guilabel}`I want to take Authorization to this webhook`. + +- {guilabel}`Header Name`: In this field, type in `signature` to match the field in Odoo. + +- Click {guilabel}`Generate Key` to generate a {guilabel}`Header Value`. + +- Click {guilabel}`Create` to complete this webhook configuration. + +```{image} gelato/gelato-webhook.png +:alt: Newly configured webhook in the Gelato platform. +``` + +:::{tip} +Copy and paste the API key and webhook on a notepad before tabbing out of the Gelato webpage as +backup. +::: + +### Configure Gelato connector in Odoo + +In Odoo, navigate to {menuselection}`Sales app --> Configuration --> Settings`, then scroll to the +{guilabel}`Connectors` section. Enable the {guilabel}`Gelato` connector by ticking the checkbox. +Next, paste the newly generated API keys and webhook secret key into their respective fields. Once +saved, Gelato is available in Odoo **Sales** and **eCommerce** products. + +## Synchronizing Gelato products with Odoo Sales + +It is recommended to have products already configured in Gelato before configuring them in Odoo. To +get the product ID in Gelato, navigate to the {guilabel}`Templates` page from the side bar menu. +Select which product to synchronize in Odoo, then hover over the product card to reveal the +{icon}`fa-ellipsis-v` {guilabel}`(vertical ellipsis)` menu icon. Click the menu icon, then click +{guilabel}`Copy Template ID` to copy the product template ID to the clipboard. + +:::{seealso} +[Start selling products with Gelato: Quick & easy setup](https://www.gelato.com/blog/get-started-with-gelato-creating-products) +::: + +### Odoo Sales product + +To create a product in Odoo that matches the Gelato product, navigate to {menuselection}`Sales app +--> Products --> Products`, select {guilabel}`New` to create a new product form. Type in the product +{guilabel}`Name`, then navigate to the {guilabel}`Sales` tab. Find the {guilabel}`Gelato` section, +then click into the {guilabel}`Template Reference` field and paste the copied template ID from the +Gelato product. Finally, click {guilabel}`Synchronize`. + +Successful synchronization pulls the Gelato product variant options into the newly configured Odoo +product. + +In the new {guilabel}`Print Images` field, click the {guilabel}`default` marker to set a default +product image. Click the {icon}`fa-pencil` {guilabel}`(edit)` icon and select the product image file +to upload, then {guilabel}`Save & Close`. + +:::{important} +The {guilabel}`Print Images` field *must* be configured on all Gelato products and their +respective product variations before they can be ordered. +::: + +### Product variants + +To view and edit the newly synchronized product variants, navigate to the {guilabel}`Attributes & +Variants` tab, which will have the variants pulled from the Gelato product configuration. Click the +{guilabel}`Configure` button to edit and configure the variant images, delivery methods, additional +pricing, etc. + +### Order a Gelato product from Odoo + +Once synchronized, Gelato products are available to order in Odoo through {doc}`sales quotations +` or on the **eCommerce** store. Gelato delivery options are automatically +synchronized upon API and webhook configuration. + +To add Gelato delivery, click {guilabel}`Add shipping` on the sales order. Select +{guilabel}`Standard Delivery` or {guilabel}`Express Delivery` in the {guilabel}`Shipping Method` +field, then click {guilabel}`Get rate`. + +Once the quotation is confirmed, it becomes an active sales order, and the order is sent to Gelato +for fulfillment. Once a sales order is sent from Odoo to Gelato, Gelato processes the order, +produces the product at the nearest fulfillment center, and ships it directly to the end-customer. + +:::{seealso} +{doc}`send_quotations/create_quotations` +::: + +:::{important} +When creating a sales order for Gelato products in the database, only Gelato products can be +added to the same sales order. Multivendor orders are not available with the Gelato connector at +this time. +::: + diff --git a/content/applications/sales/sales/invoicing.md b/content/applications/sales/sales/invoicing.md new file mode 100644 index 000000000..ce762d9e7 --- /dev/null +++ b/content/applications/sales/sales/invoicing.md @@ -0,0 +1,17 @@ +--- +nosearch: true +--- + +# Invoicing Method + +```{toctree} +:titlesonly: true + +invoicing/invoicing_policy +invoicing/down_payment +invoicing/proforma +invoicing/time_materials +invoicing/milestone +invoicing/expense +``` + diff --git a/content/applications/sales/sales/invoicing/down_payment.md b/content/applications/sales/sales/invoicing/down_payment.md new file mode 100644 index 000000000..9f7a37275 --- /dev/null +++ b/content/applications/sales/sales/invoicing/down_payment.md @@ -0,0 +1,331 @@ +# Down payments + +A down payment is an initial, up-front payment made during the confirmation of a sales transaction. +Down payments reduce the risk for both parties (the seller and the buyer) as they indicate a mutual +commitment to complete the sales transaction. + +With a down payment, the buyer pays a portion of the total amount owed while agreeing to pay the +remaining amount at a later date. In turn, the seller provides goods or services to the buyer upon +or after accepting the down payment, trusting that the remaining amount will be paid later on. + +In the Odoo **Sales** app, down payments can be customized to fit the needs of each individual sales +transaction. + +## Create invoices + +When a sales order is confirmed, the option to create an invoice becomes available, via the +{guilabel}`Create Invoice` button. When clicked, a {guilabel}`Create invoice(s)` pop-up appears. + +```{image} down_payment/create-invoices-popup-form.png +:align: center +:alt: Create invoices pop-up form that appears in Odoo Sales. +``` + +:::{note} +Invoices are automatically created as drafts, so they can be reviewed before validation. +::: + +On the {guilabel}`Create invoices` pop-up, there are 3 options to choose from in the +{guilabel}`Create Invoice` field: + +- {guilabel}`Regular invoice` +- {guilabel}`Down payment (percentage)` +- {guilabel}`Down payment (fixed amount)` + +:::{note} +If {guilabel}`Regular Invoice` is selected, the other fields disappear, as they only pertain to +down payment configurations. +::: + +## Initial down payment request + +On the {guilabel}`Create invoice(s)` pop-up window, the down payment options are: + +- {guilabel}`Down payment (percentage)` +- {guilabel}`Down payment (fixed amount)` + +Select the desired down payment option, then designate the desired amount, either as a percentage or +a fixed amount, in the {guilabel}`Down Payment Amount` field. + +Once all fields are filled in, click the {guilabel}`Create Draft` button. Upon clicking this button, +Odoo reveals the {guilabel}`Customer Invoice Draft`. + +:::{important} +If an {guilabel}`Invalid Operation` error appears, double-check that the +{doc}`invoicing policy ` is configured correctly. In some cases, for example, +the invoicing policy is configured to require delivery before invoicing. +::: + +In the {guilabel}`Invoice Lines` tab of the {guilabel}`Customer Invoice Draft`, the down payment +that was just configured in the {guilabel}`Create invoices` pop-up form appears as a +{guilabel}`Product`. + +(sales-invoicing-50-percent-down-payments)= + +## Example: request 50% down payment + +:::{note} +The following example involves a 50% amount down payment on a product ({guilabel}`Cabinet with +Doors`) with {guilabel}`Ordered quantities` as the {guilabel}`Invoicing Policy`. + +```{image} down_payment/cabinet-product-details.png +:align: center +:alt: Cabinet with doors product form showcasing various details and fields. +``` +::: + +:::{seealso} +{doc}`invoicing_policy` +::: + +First, navigate to {menuselection}`Sales app --> New`, and add a {guilabel}`Customer` to the +quotation. + +Then, click {guilabel}`Add a product` in the {guilabel}`Order Lines` tab, and select the +{guilabel}`Cabinet with Doors` product. + +When the order is confirmed (via the {guilabel}`Confirm` button), the quotation turns into a sales +order. Once this occurs, create and view the invoice by clicking {guilabel}`Create Invoice`. + +```{image} down_payment/cabinet-sales-orders-confirmed.png +:align: center +:alt: Cabinet with doors sales order that's been confirmed in the Odoo Sales application. +``` + +Next, on the {guilabel}`Create invoices` pop-up window that appears, select {guilabel}`Down payment +(percentage)`, and type `50` in the {guilabel}`Down Payment Amount` field. + +:::{note} +The {guilabel}`Income Account` and {guilabel}`Customer Taxes` fields are *not* required fields, +and they will *not* appear if they've already been preconfigured in previous down payment +requests. + +For more information, check out the documentation on {ref}`customer taxes modification on down +payments ` and {ref}`income account +modification on down payments `. +::: + +Lastly, click {guilabel}`Create Draft Invoice` to create and view the invoice draft. + +Clicking {guilabel}`Create Draft Invoice` reveals the draft invoice, which includes the down +payment as a {guilabel}`Product` in the {guilabel}`Invoice Lines` tab. + +From there, the invoice can be confirmed and posted by clicking {guilabel}`Confirm`. Confirming the +invoice changes the status from {guilabel}`Draft` to {guilabel}`Posted`. It also reveals a new +series of buttons at the top of the page. + +```{image} down_payment/draft-invoice-sample.png +:align: center +:alt: A sample draft invoice with down payment mentioned in Odoo Sales. +``` + +From those buttons, the payment can be registered by clicking {guilabel}`Register Payment`. + +```{image} down_payment/register-payment-button.png +:align: center +:alt: Showcase of the Register Payment button on a confirmed customer invoice. +``` + +Doing so reveals a {guilabel}`Register Payment` pop-up form, which is auto-populated with the +necessary information. Confirm the information provided is correct, and make any necessary +adjustments. When ready, click the {guilabel}`Create Payment` button. + +```{image} down_payment/register-payment-pop-up-window.png +:align: center +:alt: Showcase of the Register Payment pop-up window with create payment button. +``` + +After clicking {guilabel}`Create Payment`, Odoo reveals the customer invoice, now with a green +{guilabel}`In Payment` banner in the upper-right corner. + +```{image} down_payment/customer-invoice-green-payment-banner.png +:align: center +:alt: Customer Invoice with a green In Payment banner located in the upper-right corner. +``` + +Now, when the customer wants to pay the remaining amount of the order, another invoice must be +created. To do that, return to the sales order, via the breadcrumb links. + +Back on the sales order, a new {guilabel}`Down Payments` section is present in the {guilabel}`Order +Lines` tab, along with the down payment that was just invoiced and posted. + +```{image} down_payment/down-payments-section-order-lines.png +:align: center +:alt: The down payments section in the order lines tab of a sales order. +``` + +Next, click the {guilabel}`Create Invoice` button. + +On the {guilabel}`Create invoices` pop-up window that appears, there are two new fields: +{guilabel}`Already invoiced` and {guilabel}`Amount to invoice`. + +```{image} down_payment/create-invoices-pop-up-already-invoiced.png +:align: center +:alt: The deduct down payment option on the create invoices pop up in Odoo Sales. +``` + +If the remaining amount is ready to be paid, select the {guilabel}`Regular Invoice` option. Odoo +will create an invoice for the exact amount needed to complete the total payment, as indicated in +the {guilabel}`Amount to invoice` field. + +Once ready, click {guilabel}`Create Draft Invoice`. + +Doing so reveals another {guilabel}`Customer Invoice Draft` page, listing *all* the invoices for +that specific sales order in the {guilabel}`Invoice Lines` tab. Each invoice line item displays all +the necessary information related to each invoice. + +To complete the flow, click {guilabel}`Confirm`, which changes the status of the invoice from +{guilabel}`Draft` to {guilabel}`Posted`. Then, click {guilabel}`Register Payment`. + +Once again, the {guilabel}`Register Payment` appears, with all fields auto-populated with the +necessary information, including the remaining amount left to be paid on the order. + +```{image} down_payment/second-register-payment-popup.png +:align: center +:alt: The second register payment pop-up form in Odoo sales. +``` + +After confirming that information, click {guilabel}`Create Payment`. Doing so reveals the final +{guilabel}`Customer Invoice` with a green {guilabel}`In Payment` banner in the upper-right corner. +Also, both down payments are present in the {guilabel}`Invoice Lines` tab. + +```{image} down_payment/second-down-payment-in-payment-invoice.png +:align: center +:alt: The second down payment invoice with in payment banner in Odoo Sales. +``` + +At this point, the flow is now complete. + +:::{note} +This flow is also possible with the {guilabel}`Fixed amount` down payment option. +::: + +:::{important} +If a down payment is used with a product that has a {guilabel}`Delivered quantities` invoicing +policy, and the cost of the product *exceeds* the 50% down payment (as in most cases), a regular +invoice is created. + +However, for products that cost *less* than the 50% down payment, the down payments will **not** +be able to be deducted when it comes time to invoice the customer. + +This is because the product(s) would have to be delivered *before* creating the final invoice due +to Odoo not allowing negative totals for invoices. + +If nothing has been delivered, a {guilabel}`Credit Note` is created, which cancels the draft +invoice that was created after the down payment. + +To utilize the {guilabel}`Credit Note` option, the *Inventory* application must be installed, in +order to confirm the delivery. Otherwise, the delivered quantity can be entered manually directly +on the sales order. +::: + +(sales-invoicing-100-percent-down-payments)= + +## Example: request 100% down payment + +The process of requesting a 100% down payment is similar to the process of setting up a {ref}`50% +down payment `, but with fewer steps. + +:::{note} +A 100% down payment is **not** the same as a full payment of the sales order. + +A sales order paid through the regular invoice process will not allow any additional invoices to +be generated, and **will not** display the *Create Invoice* button on the Sales Order. + +Following this example **will** cause the *Create Invoice* button to be displayed on the Sales +Order. This is because Odoo expects another invoice to be created after the down payment to +complete payment of the sales order. +::: + +The *Solar Panel Installation* product is being used in this example. + +To configure a 100% down payment, begin by navigating to {menuselection}`Sales app --> New`, and add +a {guilabel}`Customer` to the quote. + +Next, click {guilabel}`Add a product` in the {guilabel}`Order Lines` tab, and select the +`Solar Panel Installation` product. + +Upon clicking the {guilabel}`Confirm` button, the quotation turns into a sales order. At that point, +an invoice can now be created by clicking {guilabel}`Create Invoice` in the top-left corner. + +On the {guilabel}`Create invoices` pop-up window that appears, select {guilabel}`Down payment +(percentage)`, and type `100` in the {guilabel}`Down Payment Amount` field. Then, if desired, select +an {guilabel}`Income Account` and {guilabel}`Customer Taxes` in their respective fields. + +:::{note} +The {guilabel}`Income Account` and {guilabel}`Customer Taxes` fields are *not* required fields, +and they will *not* appear if they've already been preconfigured in previous down payment +requests. + +For more information, check out the documentation on {ref}`customer taxes modification on down +payments ` and {ref}`income account +modification on down payments `. +::: + +```{image} down_payment/100p-down-payment-percentage.png +:align: center +:alt: The Down payment (percentage) option selected with 100% set as the Down Payment. +``` + +Next, click {guilabel}`Create Draft Invoice` to create an invoice draft. This will also bring the +draft invoice into view, which includes the {guilabel}`Down payment` as a {guilabel}`Product` in the +{guilabel}`Invoice Lines` tab. + +The invoice can now be confirmed and posted by clicking {guilabel}`Confirm`. Confirming the invoice +changes the status from {guilabel}`Draft` to {guilabel}`Posted`. It also reveals a new series of +buttons at the top of the page. + +The payment can be registered by clicking the {guilabel}`Register Payment` button. + +Doing so reveals a {guilabel}`Register Payment` pop-up form, which is auto-populated with the +necessary information. Confirm the information provided is correct and make any necessary +adjustments. When ready, click the {guilabel}`Create Payment` button. + +After clicking {guilabel}`Create Payment`, Odoo reveals the customer invoice, now with a green +{guilabel}`In Payment` banner in the upper-right corner. + +```{image} down_payment/100p-invoice.png +:align: center +:alt: Customer Invoice with a green In Payment banner located in the upper-right corner. +``` + +The process is now complete, and the 100% down payment has been successfully applied. + +(sales-invoicing-customer-tax-modification-down-payments)= + +## Customer taxes modification on down payments + +To adjust the income account and customer taxes attached to a down payment, navigate to the +{guilabel}`Products` page ({menuselection}`Sales app --> Products --> Products`), search for the +`Down Payment` product in the search bar, and select it to reveal the product detail page. + +On the {guilabel}`Down Payment` product page, in the {guilabel}`General Information` tab, the +customer taxes can be modified in the {guilabel}`Customer Taxes` field. + +```{image} down_payment/customer-taxes-field.png +:align: center +:alt: How to modify the income account link to down payments. +``` + +(sales-invoicing-income-account-modification)= + +## Income account modification on down payments + +To change or adjust the income account attached to the {guilabel}`Down Payment` product page, the +*Accounting* app **must** be installed. + +With the *Accounting* app installed, the {guilabel}`Accounting` tab becomes available on the product +page. That tab will **not** be accessible without the *Accounting* app installed. + +In the {guilabel}`Accounting` tab, the income account can be changed in the {guilabel}`Income +Account` field, located in the {guilabel}`Receivables` section. + +```{image} down_payment/income-account.png +:align: center +:alt: How to modify the income account link to down payments. +``` + +:::{seealso} +{doc}`invoicing_policy` +::: + diff --git a/content/applications/sales/sales/invoicing/expense.md b/content/applications/sales/sales/invoicing/expense.md new file mode 100644 index 000000000..2179b976a --- /dev/null +++ b/content/applications/sales/sales/invoicing/expense.md @@ -0,0 +1,278 @@ +# Reinvoice expenses to customers + +While working on a project for a client, employees often have to spend their own money on various +expenses related to the project. + +For example, an employee may need to use their own money to pay for a hotel, while they provide an +on-site service for a client. As a company, this expense should be reinvoiced to the customer. With +Odoo, these kinds of expenses can quickly be reinvoiced to the customer related to the project. + +## Expenses application + +To be able to reinvoice a customer for an expense, the *Expenses* application **must** be installed. + +To install the *Expenses* application, navigate to {menuselection}`main Odoo dashboard --> Apps`, +and click {guilabel}`Install` on the *Expenses* application block. When clicked, Odoo installs the +application, refreshes the page, and returns to the main Odoo dashboard. + +## Add expenses to sales orders + +To begin, have a sales order confirmed in the *Sales* app to which a reinvoiced expense can be +added. Or, create a new sales order from scratch. To do that, navigate to the {menuselection}`Sales +app --> New`. Doing so reveals a blank quotation form. + +Then, add a {guilabel}`Customer`, and add a product to the {guilabel}`Order Lines` tab, by clicking +{guilabel}`Add a product`. Next, select a product from the drop-down menu. + +Lastly, click {guilabel}`Confirm` to confirm the sales order. + +```{image} expense/confirmed-sales-order.png +:align: center +:alt: This is how a confirmed sales order looks in the Odoo Sales application. +``` + +With the sales order confirmed, it's time to create an expense. + +To do that, navigate to the *Expenses* application, by going to {menuselection}`main Odoo dashboard +--> Expenses`. + +Then, from the *Expenses* dashboard, click {guilabel}`New` to reveal a blank expenses form. + +```{image} expense/blank-expenses-form.png +:align: center +:alt: A blank expenses form in the Odoo Expenses application. +``` + +On the expenses form, add a {guilabel}`Description` to easily reference the expense. + +Then, in the {guilabel}`Category` field, select one of the following options from the drop-down +menu: + +- {guilabel}`Communication`: any form of communication related to a project/order. +- {guilabel}`Others`: expense that doesn't fit into any other categories. +- {guilabel}`Meals`: any form of meal costs related to a project/order. +- {guilabel}`Gifts`: any form of gift costs related to a project/order. +- {guilabel}`Mileage`: any form of mileage (gas) costs related to project/order. +- {guilabel}`Travel \& Accommodation`: any travel or accommodation costs related to a project/order. + +:::{tip} +New expense categories can be created from an expense form, by clicking the {guilabel}`Category` +field drop-down menu, selecting {guilabel}`View All`, and clicking {guilabel}`New` from the +{guilabel}`Search:Category` pop-up window. + +```{image} expense/expense-category-pop-up.png +:align: center +:alt: The Search:Category expenses pop-up window from a blank expenses form in Odoo +: Expenses. +``` +::: + +For this sample workflow, which will reinvoice a customer for a brief hotel stay, the +{guilabel}`Category` for this example is {guilabel}`[TRANS \& ACC] Travel \& Accommodation`. + +:::{note} +The following example requires the *Sales*, *Accounting*, and *Expense* apps to view/modify all +the fields mentioned during the workflow. +::: + +Beneath the {guilabel}`Category` field, enter in the amount to be expensed in the {guilabel}`Total` +field. + +Next, designate if there are any {guilabel}`Included taxes` in the {guilabel}`Total`. If a +preconfigured tax amount is selected from the {guilabel}`Included taxes` field, Odoo auto-calculates +the taxed amount, based on the amount entered in the {guilabel}`Total` field. + +Then, choose which {guilabel}`Employee` was responsible for the expense, and choose an option in the +{guilabel}`Paid By` field: {guilabel}`Employee (to reimburse)` or {guilabel}`Company`. + +In this case, our employee paid for the hotel with their own money, so the {guilabel}`Employee (to +reimburse)` option is chosen. + +On the right-hand side of the expenses form, the option to add a {guilabel}`Bill Reference` is +available. Beneath that, the auto-populated {guilabel}`Expense Date` and {guilabel}`Account` fields +are available. + +:::{note} +The {guilabel}`Expense Date` and {guilabel}`Account` field can be modified, if needed. +::: + +Next, in the {guilabel}`Customer to Reinvoice` field, click the blank field to reveal a drop-down +menu. From this drop-down menu, select the appropriate sales order to which this expense should be +attached. This field **must** be filled, in order to reinvoice a customer for an expense. + +Lastly, the option to modify the {guilabel}`Analytic Distribution` and {guilabel}`Company` fields +are available. These fields are *not* required to complete a reinvoiced expense to a customer, but +are available to modify, if needed. + +Also, at the bottom of the expense form, there is a {guilabel}`Notes...` section, wherein any notes +related to this expense can be added, if needed. + +```{image} expense/filled-in-expense-form.png +:align: center +:alt: A filled out expenses form in the Odoo Expenses application. +``` + +At the top of the expense form, there are buttons to {guilabel}`Attach Receipt`, {guilabel}`Create +Report`, and {guilabel}`Split Expense`. + +If there is a physical or digital receipt that should be attached to the expense, click +{guilabel}`Attach Receipt`. + +If the cost of this expense needs to be split, click {guilabel}`Split Expense`. This feature can be +used for a number of reasons (spitting expense with another employee, to accommodate different tax +rates, etc.). + +If neither of these options are necessary, click {guilabel}`Create Report` to lock in the expense +report that was just configured. + +Doing so reveals an {guilabel}`Expense Report Summary` for the new expense. + +```{image} expense/expense-report-summary-form.png +:align: center +:alt: An expense report summary in the Odoo Expenses application. +``` + +Here, once the details related to the expense have been confirmed, click {guilabel}`Submit to +Manager`. This sends the expense report to the approving manager, who will review the expense. + +The manager in charge of reviewing and approving the expense will inspect the details related to +the expense, and if there are no issues, they will click the {guilabel}`Approve` button — which +*only* appears on the manager's view of the {guilabel}`Expense Report Summary` that's been submitted +to the manager by the employee. + +```{image} expense/expense-report-summary-manager-approve.png +:align: center +:alt: An expense report summary that a manager will approve with an Approve button. +``` + +Once approved, the buttons at the top of the {guilabel}`Expense Report Summary` change once again. +At this point, the buttons at the top of the {guilabel}`Expense Report Summary` are: {guilabel}`Post +Journal Entries`, {guilabel}`Report in Next Payslip`, {guilabel}`Refuse`, and {guilabel}`Reset to +Draft`. + +```{image} expense/expense-report-summary-manager-post-journal.png +:align: center +:alt: An expense report summary with post journal entries button at the top of the +: form. +``` + +When the manager is satisfied with the {guilabel}`Expense Report Summary`, they'll click +{guilabel}`Post Journal Entries`. + +Upon clicking {guilabel}`Post Journal Entries`, that button disappears, and the {guilabel}`Analytic +Distribution` column in the {guilabel}`Expense` tab is filled with the sales order that was +initially configured to the expense in the {guilabel}`Customer to Reinvoice` field. + +:::{important} +By default, the {guilabel}`Customer to Reinvoice` field is enabled for the {guilabel}`[TRANS & +ACC] Travel & Accommodation`, {guilabel}`[COMM] Communication`, {guilabel}`[FOOD] Meals`, and +{guilabel}`[MIL] Mileage` expense category. + +It should be noted that **not** all of the default expense categories that come installed with +the *Expenses* application have reinvoicing policies activated. The setting may have to be +manually activated. + +To do that, navigate to {menuselection}`Expenses app --> Configuration --> Expenses Categories` +to view a list of all expense categories in the database. + +Look in the {guilabel}`Re-Invoice Expenses` column to see which selections have been made for +each expense category. + +```{image} expense/expense-categories-page.png +:align: center +:alt: The Re-Invoice Expenses column on the Expense Categories page in the Odoo Expenses +: app. +``` + +To modify an expense category, click the {icon}`fa-arrow-right` {guilabel}`(right arrow)` in the +{guilabel}`Category` field, to reveal that specific expense from. + +Under the {guilabel}`Invoicing` section, in the {guilabel}`Re-Invoice Expenses` field, select +either {guilabel}`At cost` or {guilabel}`Sales price`. + +```{image} expense/reinvoice-expenses-field.png +:align: center +:alt: The Re-Invoice Expenses field on an Expense Category form in the Odoo Expenses +: app. +``` +::: + +## Reinvoice expense + +With those steps completed, it's time to return to the sales order to complete the reinvoice of the +expense to the customer. + +To do that, navigate to {menuselection}`main Odoo dashboard --> Sales app`, and select the +appropriate sales order that should be reinvoiced for the expense. + +On the sales form, the newly-configured expense is now in the {guilabel}`Order Lines` tab, with its +{guilabel}`Delivered` column filled in, and ready to be invoiced. + +```{image} expense/sales-order-with-expense-order-lines.png +:align: center +:alt: A sales order with the configured expense ready to be invoiced in the Order Lines +: tab. +``` + +After confirming the details of the expense, click {guilabel}`Create Invoice` at the top of the +sales order. When clicked, a {guilabel}`Create invoices` pop-up window appears. + +```{image} expense/create-invoices-popup.png +:align: center +:alt: A create invoices pop-up window that appears when the Create Invoice is clicked. +``` + +From this pop-up window, leave the {guilabel}`Create Invoice` field on the default +{guilabel}`Regular invoice` option, and click {guilabel}`Create Draft Invoice`. + +Doing so reveals a {guilabel}`Customer Invoice Draft` showing *only* the expense in the +{guilabel}`Invoice Lines` tab. + +```{image} expense/customer-invoice-draft-with-expense.png +:align: center +:alt: A customer invoice draft with the expense in the Invoice Lines tab of the form. +``` + +If all the information related to the expense is correct, click {guilabel}`Confirm` to confirm the +invoice. Doing so moves the status of the invoice from {guilabel}`Draft` to {guilabel}`Posted`. + +To send the invoice to the customer, click {guilabel}`Send \& Print`. Doing so reveals a +{guilabel}`Send` pop-up window, with a preconfigured message and PDF invoice in the body of the +message. The message can be reviewed and modified, if needed. + +Once ready, click {guilabel}`Send \& Print` to send the invoice to the customer. When clicked, the +pop-up window disappears, and Odoo sends the message/invoice to the customer. Additionally, a PDF of +the invoice is automatically downloaded for record-keeping and/or printing purposes. + +Back on the {guilabel}`Customer Invoice`, click the {guilabel}`Register Payment` button when the +customer pays for the invoiced expense. + +```{image} expense/customer-invoice-register-payment.png +:align: center +:alt: A customer invoice with the register payment button ready to be clicked. +``` + +When {guilabel}`Register Payment` is clicked, a {guilabel}`Register Payment` pop-up window appears. +In this pop-up window, the necessary fields are auto-populated with the correct information. After +reviewing the information, click {guilabel}`Create Payment`. + +```{image} expense/register-payment-popup.png +:align: center +:alt: A register payment pop-up window on a customer invoice in Odoo Sales. +``` + +Once {guilabel}`Create Payment` is clicked, the pop-up window disappears, and a green {guilabel}`In +Payment` banner is in the upper-right corner of the invoice, signifying this invoice is paid for in +full. Thus, completing the workflow. + +```{image} expense/expense-invoice-in-payment-banner.png +:align: center +:alt: A register payment pop-up window on a customer invoice in Odoo Sales. +``` + +:::{seealso} +- {doc}`invoicing_policy` +- {doc}`time_materials` +- {doc}`milestone` +::: + diff --git a/content/applications/sales/sales/invoicing/invoicing_policy.md b/content/applications/sales/sales/invoicing/invoicing_policy.md new file mode 100644 index 000000000..efa37988c --- /dev/null +++ b/content/applications/sales/sales/invoicing/invoicing_policy.md @@ -0,0 +1,90 @@ +# Invoice based on delivered or ordered quantities + +Different business policies might require different options for invoicing: + +- The *Invoice what is ordered* rule is used as the default mode in Odoo *Sales*, which means + customers are invoiced once the sales order is confirmed. +- The *Invoice what is delivered* rule invoices customers once the delivery is done. This rule is + often used for businesses that sell materials, liquids, or food in large quantities. In these + cases, the ordered quantity may differ slightly from the delivered quantity, making it preferable + to invoice the quantity actually delivered. + +Being able to have different invoicing options provides more flexibility. + +## Invoicing policy features + +To activate the necessary invoicing policy features, go to {menuselection}`Sales app --> +Configuration --> Settings`, and under the {guilabel}`Invoicing` heading, select an +{guilabel}`Invoicing Policy` rule: {guilabel}`Invoice what is ordered` or {guilabel}`Invoice what is +delivered`. + +```{image} invoicing_policy/invoicing-policy-setting.png +:align: center +:alt: Choosing an invoicing policy on Odoo Sales. +``` + +:::{important} +If the {guilabel}`Invoice what is delivered` rule is chosen, it is **not** possible to activate +the {guilabel}`Automatic Invoice` feature, which automatically generates invoices when an online +payment is confirmed. +::: + +## Invoicing policy on product form + +On any product page, via the {menuselection}`Sales app --> Products --> Products dashboard`, locate +the {guilabel}`Invoicing Policy` option located under the {guilabel}`General Information` tab. It +can be changed manually using the drop-down menu. + +```{image} invoicing_policy/invoicing-policy-general-info-tab.png +:align: center +:alt: How to change your invoicing policy on a product form on Odoo Sales. +``` + +## Impact on sales flow + +In Odoo *Sales*, the basic sales flow starts with the creation of a quotation. Then, that quotation +is sent to a customer. Next, it needs to be confirmed, which turns the quotation into a sales order. +This, in turn, creates an invoice. + +The following is a breakdown of how invoicing policy rules impact the aforementioned sales flow: + +- {guilabel}`Invoice what is ordered`: No impact on the basic sales flow. An invoice is created as + soon as a sale is confirmed. +- {guilabel}`Invoice what is delivered`: Minor impact on sales flow, because the delivered quantity + needs to be manually entered on the sales order. Or, the *Inventory* app can be installed and used + to confirm the delivered quantity before creating an invoice with the *Sales* app. + +:::{warning} +If a user attempts to create an invoice without validating the delivered quantity, the following +error message appears: {guilabel}`There is no invoiceable line. If a product has a Delivered +quantities invoicing policy, please make sure that a quantity has been delivered.` + +```{image} invoicing_policy/invoicing-policy-error-message.png +:align: center +:alt: If Delivered Quantities invoicing policy is chosen, ensure a quantity has been +: delivered. +``` +::: + +:::{note} +Once a quotation is confirmed, and the status changes from {guilabel}`Quotation sent` to +{guilabel}`Sales order`, the delivered and invoiced quantities are available to view, directly +from the sales order. This is true for both invoicing policy rule options. + +```{image} invoicing_policy/invoicing-policy-order-lines.png +:align: center +:alt: How to see your delivered and invoiced quantities on Odoo Sales. +``` + +Odoo automatically adds the quantities to the invoice, both {guilabel}`Delivered` and +{guilabel}`Invoiced`, even if it's a partial delivery, when the quotation is confirmed. +::: + +Finally, there are a few different options to create an invoice: {guilabel}`Regular invoice`, +{guilabel}`Down payment (percentage)` or {guilabel}`Down payment (fixed amount)`. + +:::{seealso} +Be sure to check out the documentation explaining down payment options to learn more: +{doc}`/applications/sales/sales/invoicing/down_payment` +::: + diff --git a/content/applications/sales/sales/invoicing/milestone.md b/content/applications/sales/sales/invoicing/milestone.md new file mode 100644 index 000000000..4a43fe25e --- /dev/null +++ b/content/applications/sales/sales/invoicing/milestone.md @@ -0,0 +1,261 @@ +# Invoice project milestones + +Invoicing based on project milestones can be used for expensive or large-scale projects. The series +of milestones in a project represent a clear sequence of work that will inevitably result in the +completion of a project and/or contract. + +This method of invoicing ensures the company gets a consistent flow of money throughout the lifetime +of the project. Customers can closely monitor every phase of the project's development as it +happens, in addition to paying a large bill in several installments, instead of all at once. + +## Create milestone products + +In Odoo, each milestone of a project is considered as an individual product. + +To create and/or configure products to work like this, first navigate to {menuselection}`Sales app +--> Products --> Products`. Then, click on a product, or create a new one by clicking +{guilabel}`New`. + +The option to invoice based on milestones is only available for certain product types. + +On the product form, under the {guilabel}`General Information` tab, the {guilabel}`Product Type` +field *must* be set on any of the following options: {guilabel}`Service`, {guilabel}`Event Ticket`, +{guilabel}`Event Booth`, or {guilabel}`Course`. + +```{image} milestone/product-type-field.png +:align: center +:alt: The invoicing policy field drop-down menu with options on product form. +``` + +With any of those {guilabel}`Product Type` options selected, choose {guilabel}`Based on Milestones` +from the {guilabel}`Invoicing Policy` drop-down menu. + +```{image} milestone/invoicing-policy-field.png +:align: center +:alt: The invoicing policy field drop-down menu with options on product form. +``` + +Beneath that is the {guilabel}`Create on Order` field. + +To ensure workflows are as seamless as possible, it is recommended that an option in the +{guilabel}`Create on Order` field is selected. + +:::{note} +Leaving it on the default {guilabel}`Nothing` option won't negatively affect the desired +workflow. However, a project *must* then be created directly from a sales order form with that +specific product. Once a project is created *then* milestones and tasks can be created and +configured. +::: + +When the {guilabel}`Create on Order` default option of {guilabel}`Nothing` is clicked, a drop-down +menu is revealed with the following options: + +- {guilabel}`Task`: Odoo creates a task related to this milestone product in the *Projects* app when + this specific product is ordered. +- {guilabel}`Project \& Task`: Odoo creates a project and task related to this milestone product in + the *Projects* app when this specific product is ordered. +- {guilabel}`Project`: Odoo creates a project related to this milestone product in the *Projects* + app when this specific product is ordered. + +When {guilabel}`Task` is selected, a {guilabel}`Project` field appears. In this field, select to +which existing project in the *Projects* app this created task should be connected. + +```{image} milestone/task-option-project-field.png +:align: center +:alt: The Project field appears when the Task option is selected in Create on Order +: field. +``` + +When {guilabel}`Project \& Task` or {guilabel}`Project` is selected, two new fields appear: +{guilabel}`Project Template` and {guilabel}`Workspace Template`. + +```{image} milestone/project-task-option-project-workspace-fields.png +:align: center +:alt: The Project template and workspace template fields that appear on milestone product. +``` + +The {guilabel}`Project Template` field provides template options to use for the project that will be +created when this specific product is ordered. + +The {guilabel}`Workspace Template` field provides template options to use for the workspace (for the +*Documents* app, not the *Projects* app) that will be automatically generated for the project when +this specific product is ordered. + +:::{tip} +For organizational purposes, click the {guilabel}`Sales` tab on the product form, and enter a +custom 'Milestone' related descriptor in the {guilabel}`Sales Description` field. This +information appears in the {guilabel}`Description` column on the {guilabel}`Order Lines` tab of +the sales order. + +Or, directly edit/modify the {guilabel}`Description` field on the {guilabel}`Order Lines` tab of +the sales order. + +This is *not* a requirement. +::: + +## Invoice milestones + +:::{note} +The following flow features a trio of milestone products that have {guilabel}`Service` set as +their {guilabel}`Product Type`, and {guilabel}`Task` set on their {guilabel}`Create on Order` +field. + +> ```{image} milestone/settings-for-workflow.png +> :align: center +> :alt: Product with Service "Product Type" and "Task" in the Create on Order field on +> : form. +> ``` + +Those tasks are then attached to a pre-existing {guilabel}`Project`, which, in this case, is +titled, {guilabel}`Rebranding Projects`. +::: + +To invoice milestones, create a sales order with the milestone product(s). To do that, go to +{menuselection}`Sales app --> New`. Doing so reveals a blank quotation form. + +From this quotation form, add a {guilabel}`Customer`. Then, click {guilabel}`Add a product` in the +{guilabel}`Order Lines` tab. Next, add the milestone product(s) to the {guilabel}`Order Lines` tab. + +Once the corresponding milestone product(s) have been added, click {guilabel}`Confirm` to confirm +the order, which turns the quotation into a sales order. + +When the order is confirmed, new smart buttons appear at the top of the sales order based on what +was selected in the {guilabel}`Create on Order` field on the product form. + +From the sales order, click the {guilabel}`Milestones` smart button. Doing so reveals a blank +{guilabel}`Milestones` page. Click {guilabel}`New` to add milestones. + +```{image} milestone/adding-milestones.png +:align: center +:alt: Adding milestones to a sales order with milestone products. +``` + +Enter a {guilabel}`Name` for the milestone. Next, apply it to the corresponding {guilabel}`Sales +Order Item`. Lastly, assign a {guilabel}`Deadline` to the milestone, if desired. + +Repeat that process for all milestone sales order items. + +Then, return to the sales order, via the breadcrumbs. From the sales order, click the +{guilabel}`Tasks` smart button. Doing so reveals a {guilabel}`Tasks` page with a task for each sales +order item with that option designated in the {guilabel}`Create on Order` field. + +```{image} milestone/tasks-page.png +:align: center +:alt: Sample tasks page accessed via the smart button from a sales order with milestone +: products. +``` + +To manually assign a configured milestone to a task, click the desired task, which reveals the task +form. On the task form, select the appropriate milestone to which this task should be connected, in +the {guilabel}`Milestone` field. + +```{image} milestone/milestone-field-on-task-form.png +:align: center +:alt: The milestone field on the task form when dealing with milestone products in +: Odoo Sales. +``` + +Repeat this process for all milestone tasks. + +With those tasks properly configured, employees log in their progress as they work on the task, in +addition to adding any notes related to the task. + +Then, when that task is complete, that means that milestone has been reached. At that point, it is +time to invoice that milestone. + +To invoice a milestone, first return to the sales order — either via the breadcrumb links, or by +navigating to {menuselection}`Sales app --> Orders --> Orders` and picking the appropriate sales +order. + +Back on the sales order form, click the {guilabel}`Milestones` smart button, and check the box in +the {guilabel}`Reached` column for that particular task. + +```{image} milestone/reached-milestone.png +:align: center +:alt: What it looks like to mark a milestone as reached via the milestone smart button. +``` + +Next, return to the sales order — either by clicking {guilabel}`View Sales Order` on the +{guilabel}`Milestones` page, or via the breadcrumb links. + +Back on the sales order, the line item for the milestone that's been reached has its +{guilabel}`Delivered` column filled. That's because the milestone has been reached, and therefore +delivered. + +```{image} milestone/delivered-milestone-product-sales-order.png +:align: center +:alt: A milestone product that's been reached marked as delivered on the sales order +: in Odoo. +``` + +Click {guilabel}`Create Invoice` in the upper-left corner. Doing so reveals a {guilabel}`Create +invoices` pop-up window. + +```{image} milestone/create-invoices-pop-up.png +:align: center +:alt: The create invoices pop-up window that appears when create invoice button is +: clicked. +``` + +On the {guilabel}`Create invoices` pop-up window, leave the {guilabel}`Create Invoice` option on the +default {guilabel}`Regular Invoice` selection, and click the {guilabel}`Create Draft Invoice` +button. + +Upon clicking {guilabel}`Create Draft Invoice`, Odoo reveals the {guilabel}`Customer Invoice Draft`, +*only* showing that reached milestone in the {guilabel}`Invoice Lines` tab. + +```{image} milestone/invoice-draft-milestone.png +:align: center +:alt: A customer invoice draft showing only the milestone product that's been reached. +``` + +From this invoice page, click the {guilabel}`Confirm` button to confirm the invoice. Then, when the +customer has paid for this milestone, click {guilabel}`Register Payment`. + +When {guilabel}`Register Payment` is clicked, a {guilabel}`Register Payment` pop-up window appears. + +```{image} milestone/register-payment-pop-up.png +:align: center +:alt: The Register Payment pop-up window that appears when Register Payment is clicked. +``` + +On this pop-up window, confirm the accuracy of the auto-populated fields, then click +{guilabel}`Create Payment`. + +When clicked, the pop-up window disappears, and Odoo returns to the invoice for that milestone, +which now has a green {guilabel}`In Payment` banner in the upper-right corner. This banner signifies +the invoice has been paid. + +```{image} milestone/in-payment-invoice.png +:align: center +:alt: An invoice with a milestone product that has been paid with an In Payment banner. +``` + +Then, return to the sales order, via the breadcrumb links. Back on the sales order, in the +{guilabel}`Order Lines` tab, the reached milestone that's been invoiced and paid for, now has its +{guilabel}`Invoiced` column filled. + +```{image} milestone/invoiced-column-filled-milestone.png +:align: center +:alt: The Invoiced column of a milestone product that's been paid for is filled. +``` + +There is also a new {guilabel}`Invoices` smart button at the top of the sales order. Clicking that +reveals all the invoices that are connected to this sales order. + +```{image} milestone/invoices-smart-button.png +:align: center +:alt: The invoices smart button that appears at the top of a sales order with milestones. +``` + +Simply repeat the above process for each milestone as it is worked on, and subsequently, completed. + +Continue that process until the entire project has been completed, each milestone has been invoiced, +and the entire order has been paid for in full. + +:::{seealso} +- {doc}`time_materials` +- {doc}`proforma` +- {doc}`invoicing_policy` +::: + diff --git a/content/applications/sales/sales/invoicing/proforma.md b/content/applications/sales/sales/invoicing/proforma.md new file mode 100644 index 000000000..469845aa9 --- /dev/null +++ b/content/applications/sales/sales/invoicing/proforma.md @@ -0,0 +1,76 @@ +# Pro-forma invoices + +A *pro-forma invoice* is an abridged or estimated invoice sent in advance of a delivery of goods. It +notes the kind and quantity of goods, their value, and other important information, such as weight +and transportation charges. + +Pro-forma invoices are commonly used as preliminary invoices with a quotation. They are also used +during importation for customs purposes. They differ from a normal invoice, in that they are *not* a +demand (or request) for payment. + +## Configuration + +In order to utilize pro-forma invoices, the *Pro-Forma Invoice* feature **must** be activated. + +To enable this feature, navigate to {menuselection}`Sales app --> Configuration --> Settings`, and +in the {guilabel}`Quotations \& Orders` section, click the checkbox next to {guilabel}`Pro-Forma +Invoice`. Then, click {guilabel}`Save` to save all changes. + +```{image} proforma/pro-forma-setting.png +:align: center +:alt: The Pro-Forma Invoice feature setting in the Odoo Sales application. +``` + +## Send pro-forma invoice + +With the {guilabel}`Pro-Forma Invoice` feature activated, the option to send a pro-forma invoice is +now available on any quotation or sales order, via the {guilabel}`Send Pro-Forma Invoice` button. + +```{image} proforma/send-pro-forma-invoice-button.png +:align: center +:alt: The Send Pro-Forma Invoice button on a typical sales order in Odoo Sales. +``` + +:::{note} +Pro-forma invoices can **not** be sent for a sales order or quotation if an invoice for a down +payment has already been sent, or for a recurring subscription. + +In either case, the {guilabel}`Send Pro-Froma Invoice` button does **not** appear. + +However, pro-forma invoices **can** be sent for services, event registrations, courses, and/or +new subscriptions. Pro-forma invoices are not limited to physical, consumable, or storable goods. +::: + +When the {guilabel}`Send Pro-Forma Invoice` button is clicked, a pop-up window appears, from which +an email can be sent. + +In the pop-up window, the {guilabel}`Recipients` field is auto-populated with the customer from the +sales order or quotation. The {guilabel}`Subject` field and the body of the email can be modified, +if necessary. + +The pro-forma invoice is automatically added as an attachment to the email. + +When ready, click {guilabel}`Send`, and Odoo instantly sends the email, with the attached pro-forma +invoice, to the customer. + +```{image} proforma/pro-forma-email-message-pop-up.png +:align: center +:alt: The email pop-up window that appears with pro-forma invoice attached in Odoo +: Sales. +``` + +:::{tip} +To preview what the pro-forma invoice looks like, click on the PDF at the bottom of the email +pop-up window *before* clicking {guilabel}`Send`. When clicked, the pro-forma invoice is +downloaded instantly. Open that PDF to view (and review) the pro-forma invoice. + +```{image} proforma/pro-forma-pdf.png +:align: center +:alt: Sample pro-forma invoice PDF from Odoo Sales. +``` +::: + +:::{seealso} +{doc}`invoicing_policy` +::: + diff --git a/content/applications/sales/sales/invoicing/time_materials.md b/content/applications/sales/sales/invoicing/time_materials.md new file mode 100644 index 000000000..20e299d19 --- /dev/null +++ b/content/applications/sales/sales/invoicing/time_materials.md @@ -0,0 +1,388 @@ +# Invoicing based on time and materials + +Invoicing based on time and/or materials is typically used when accurately estimating the size of a +project isn't possible, or when the requirements of a project may change. + +This is different from a fixed-price contract, when a customer agrees to pay a specified total for +the fulfillment of the contract---no matter what needs to be paid to the employees, sub-contractors, +vendors, suppliers, and so on. + +The Odoo *Sales* app can invoice for time and various other expenses (e.g. transport, lodging), as +well as purchases needed to fulfill an order. + +## App and settings configuration + +First, in order to accurately keep track of the progress of a project, the Odoo *Project* and +*Accounting* apps **must** be installed. + +To install the *Project* app, navigate to {menuselection}`Odoo main dashboard --> Apps`. Then, on +the {guilabel}`Apps` page, locate the {guilabel}`Project` app block, and click {guilabel}`Activate`. +The page automatically refreshes and returns to the main Odoo dashboard, where the *Project* app is +now available to access. + +Repeat the same process to install the *Accounting* application. + +After installation, click the {guilabel}`Accounting` app icon from the main Odoo dashboard, and +navigate to {menuselection}`Configuration --> Settings`. On the {guilabel}`Settings` page, scroll +down to the {guilabel}`Analytics` section, and ensure the box next to {guilabel}`Analytic +Accounting` is checked. + +```{image} time_materials/analytic-accounting-setting.png +:align: center +:alt: How it looks to activate the Analytic Accounting setting in Odoo Accounting Setting +: page. +``` + +Then, click {guilabel}`Save` to save all changes. + +Then, navigate to {menuselection}`Odoo main dashboard --> Project app --> Configuration --> +Settings`. On the {guilabel}`Settings` page, in the {guilabel}`Time Management` section, ensure the +box beside the {guilabel}`Timesheets` feature is checked. + +Then, click {guilabel}`Save` to save all changes. + +```{image} time_materials/timesheets-feature.png +:align: center +:alt: What the Timesheets feature looks like on the Odoo Project settings page. +``` + +(sales-invoicing-configured-service-product)= + +## Service product configuration + +With the *Timesheets* feature activated in the *Project* app, it is now possible to invoice for time +spent on a project, but **only** when the following product configurations have been made. + +:::{important} +Invoicing for time spent on a project is **only** possible with products that have *Service* set +as the *Product Type* on their product form. +::: + +To configure a service product, first navigate to {menuselection}`Sales app --> Products --> +Products`. On the {guilabel}`Products` page, select the desired service product to be configured, or +click {guilabel}`New` to create a new product. + +From the product form, in the {guilabel}`General Information` tab, set the {guilabel}`Product Type` +to {guilabel}`Service`. Then, open the drop-down menu in the {guilabel}`Invoicing Policy` field, and +select {guilabel}`Based on Timesheets`. + +Next, from the {guilabel}`Create on Order` drop-down menu, select {guilabel}`Project \& Task`. That +setting indicates that, when a sales order is created with this specific service product, a new +project and task is created in the *Project* app. + +```{image} time_materials/service-product-general-settings.png +:align: center +:alt: The correct settings for Invoicing Policy and Create on Order fields for service +: product. +``` + +:::{note} +The option {guilabel}`Task` can be chosen instead from the {guilabel}`Create on Order` drop-down +menu. If {guilabel}`Task` is chosen, select an existing project that the task will appear in from +{guilabel}`Project` field, which only appears if {guilabel}`Task` is chosen in the +{guilabel}`Create on Order` field. +::: + +## Add time spent to sales order + +After properly configuring a service product with the correct *Invoicing Policy* and *Create on +Order* options, it is possible to add time spent to a sales order. + +To see that in action, navigate to {menuselection}`Sales app --> New` to open a blank quotation +form. Then, proceed to add a {guilabel}`Customer`, and in the {guilabel}`Order Lines` tab, click +{guilabel}`Add a product`, and select the properly {ref}`configured service product +` from the drop-down menu. + +Next, click {guilabel}`Confirm` to confirm the order. + +After confirming the sales order, two smart buttons appear at the top of the order form: +{guilabel}`Projects` and {guilabel}`Tasks`. + +```{image} time_materials/projects-tasks-smart-buttons.png +:align: center +:alt: How the Projects and Tasks smart buttons look on a Sales Order in Odoo Sales. +``` + +If the {guilabel}`Projects` smart button is clicked, it reveals the specific project related to this +sales order. If the {guilabel}`Tasks` smart button is clicked, it reveals the specific project task +related to this sales order. Both are also accessible in the *Project* app. + +In order to add time spent on a sales order, click the {guilabel}`Tasks` smart button. + +On the task form, select the {guilabel}`Timesheets` tab. From the {guilabel}`Timesheets` tab, +employees can be assigned to work on the project, and the time they spend working on the task can be +added by the employees or by the person who created the sales order. + +To add an employee, and the time spent working on the task, click {guilabel}`Add a line` in the +{guilabel}`Timesheets` tab. Then, select the appropriate {guilabel}`Date` and {guilabel}`Employee`. +There is also the option to add a brief description of the work done during this time in the +{guilabel}`Description` column, but it's not required. + +Lastly, enter the amount of time worked on the task in the {guilabel}`Hours Spent` column, and click +away to complete that line in the {guilabel}`Timesheets` tab. + +:::{note} +The time entered in the {guilabel}`Hours Spent` column is immediately reflected in the +{guilabel}`Allocated Time` field (located near the top of the task form) as a percentage, which +reflects how much of the total allocated work hours have been done so far. + +That same information is found as numerical hours in the {guilabel}`Hours Spent` and +{guilabel}`Remaining Hours` fields, located at the bottom of the {guilabel}`Timesheets` tab. + +```{image} time_materials/timesheets-tab-on-task.png +:align: center +:alt: How the Timesheets tab appears on a task form in Odoo Sales and Odoo Project. +``` +::: + +Repeat this process for however many employees and hours have been worked on the project. + +## Invoice time spent + +Once all the necessary employees and time spent have been added to the project task, return to the +sales order to invoice the customer for those hours. To do that, either click the {guilabel}`Sales +Order` smart button at the top of the task form, or return to the sales order via the breadcrumb +links, located in the upper-left of the screen. + +Back on the sales order form, the time that was added to the task is reflected in the +{guilabel}`Order Lines` tab (in the {guilabel}`Delivered` column) and in the new {guilabel}`Recorded +Hours` smart button at the top of the sales order. + +To invoice the customer for time spent on the project, click {guilabel}`Create Invoice`, and select +{guilabel}`Regular invoice` from the {guilabel}`Create invoices` pop-up window. Then, click +{guilabel}`Create Draft Invoice`. + +Doing so reveals a {guilabel}`Customer Invoice Draft`, clearly showing all the work that's been done +in the {guilabel}`Invoice Lines` tab. + +:::{tip} +Pay attention to the {guilabel}`Analytic Distribution` column in the {guilabel}`Customer +Invoice`, as that information is necessary to ensure other time/material invoicing tasks are +completed properly and accurately. + +```{image} time_materials/invoice-lines-time.png +:align: center +:alt: Invoice draft showing time spent on sales order in Odoo Sales. +``` +::: + +Click {guilabel}`Confirm` to confirm the invoice and continue with the invoicing process. + +:::{seealso} +{doc}`invoicing_policy` +::: + +## Expenses configuration + +In order to track and invoice expenses related to a sales order, the Odoo *Expenses* app **must** be +installed. + +To install the *Expenses* app, navigate to {menuselection}`Odoo main dashboard --> Apps`. Then, on +the {guilabel}`Apps` page, locate the {guilabel}`Expenses` app block, and click +{guilabel}`Activate`. + +The page automatically refreshes and returns to the main Odoo dashboard, where the +{guilabel}`Expenses` app is now available to access. + +(sales-invoicing-add-expenses-sales-order)= + +## Add expenses to sales order + +To add an expense to a sales order, first navigate to the {menuselection}`Expenses` app. Then, from +the main *Expenses* dashboard, click {guilabel}`New`, which reveals a blank expense form. + +On the expense form, add a {guilabel}`Description` of the expense (e.g. `Hotel Stay`, `Plane +Ticket`). Next, in the {guilabel}`Category` field, select the appropriate option from the drop-down +menu (e.g. {guilabel}`Meals`, {guilabel}`Miles`, {guilabel}`Travel \& Accommodation`). + +:::{note} +Expense categories can be added and modified by navigating to {menuselection}`Expenses app --> +Configuration --> Expense Categories`. +::: + +Then, enter the total amount of the expense in the {guilabel}`Total` field, as well as any +{guilabel}`Included Taxes` that may apply. Next, ensure that the correct {guilabel}`Employee` is +selected, and designate who paid for the expense in the {guilabel}`Paid By` field: the +{guilabel}`Employee (to reimburse)` or the {guilabel}`Company`. + +Next, in the {guilabel}`Customer to Reinvoice` field, select the appropriate sales order from the +drop-down menu. Then, select that same sales order information from the {guilabel}`Analytic +Distribution` field, as well. + +:::{note} +The {guilabel}`Analytic Distribution` field will **only** have the corresponding sales order as +an option if the sales order contains a service product that is billed based on *Timesheets*, +*Milestones*, or *Delivered Quantities*. +::: + +```{image} time_materials/expense-detail-form.png +:align: center +:alt: How to properly fill out an expense form that's attached to a sales order in +: Odoo. +``` + +If there are any receipts that should be uploaded and attached to the expense, click the +{guilabel}`Attach Receipt` button, and upload the necessary documents to the expense. This is +**not** required, but it may affect whether or not an expense is approved. + +When all the information has been entered, click {guilabel}`Create Report` to create an expense +report detailing all the expense information that was just entered. + +```{image} time_materials/expense-report-summary.png +:align: center +:alt: How an Expense Report Summary looks in Odoo Expenses. +``` + +Then, there's the option to {guilabel}`Submit to Manager` for approval. Once approved, the +{guilabel}`Report in Next Payslip` appears. + +To showcase a complete flow in this example, select {guilabel}`Submit to Manager`. Then, the manager +would click {guilabel}`Approve` to approve this expense, and click {guilabel}`Post Journal Entries` +to post this expense to the accounting journal. + +## Invoice expenses + +To invoice a customer for an {ref}`expense on a sales order +`, navigate to the related sales order, either from the +{menuselection}`Sales` app or from the expense report in the {menuselection}`Expenses` app. From the +expense report, click the {guilabel}`Sales Orders` smart button at the top of the page. + +If the expense report was linked to the sales order, the newly-configured expense now has its own +line in the {guilabel}`Order Lines` tab, and can be invoiced to the customer. + +```{image} time_materials/invoice-expense-from-sales-order.png +:align: center +:alt: An expense appearing on Order Lines tab of a Sales Order in Odoo Sales application. +``` + +To invoice the customer for the expense on the sales order, click {guilabel}`Create Invoice`, select +{guilabel}`Regular Invoice` from the {guilabel}`Create invoices` pop-up window, then click +{guilabel}`Create Draft Invoice`. + +Doing so reveals a {guilabel}`Customer Invoice Draft` for the expense. Then, the invoicing process +can be completed as usual. + +```{image} time_materials/customer-invoice-for-expense.png +:align: center +:alt: Sample customer invoice for an expense generated from a sales order in Odoo Sales. +``` + +## Purchase configuration + +In order to invoice a customer for purchases made on a sales order, the *Purchase* application +**must** be installed. + +To install the *Purchase* application, navigate to {menuselection}`Odoo main dashboard --> Apps`. +Then, on the {guilabel}`Apps` page, locate the {guilabel}`Purchase` app block, and click +{guilabel}`Activate`. The page automatically refreshes and returns to the main Odoo dashboard, where +the {guilabel}`Purchase` app is now available to access. + +(sales-invoicing-add-purchase-to-sales-order)= + +## Add purchase to sales order + +To add a purchase to a sales order, a purchase order must first be created. To create a purchase +order, navigate to {menuselection}`Purchase app --> New` to reveal a blank purchase order form. + +First, add a {guilabel}`Vendor` to the purchase order. Then, under the {guilabel}`Products` tab, +click the {guilabel}`extra column options` drop-down menu, represented by two horizontal lines with +dots on them, located to the far-right of the column headers. From that drop-down menu, select +{guilabel}`Analytic Distribution`. + +```{image} time_materials/extra-column-analytic-distribution-option.png +:align: center +:alt: How to add analytic distribution column on purchase order form in Odoo Purchase. +``` + +After adding the {guilabel}`Analytic Distribution` column to the headers on the {guilabel}`Products` +tab of the purchase order form, proceed to add the product(s) to the purchase order. To do that, +click {guilabel}`Add a product`, and select the desired product from the drop-down menu. Repeat for +all the products to add. + +:::{important} +In order for a purchase to be properly invoiced on a sales order, the product on the purchase +order **must** be marked as {guilabel}`Can be Expensed`, have an {guilabel}`Invoicing Policy` set +to {guilabel}`Delivered quantities`, and have the {guilabel}`At cost` option selected in the +{guilabel}`Re-Invoice Expenses` field on its product form. + +```{image} time_materials/product-form-settings-invoice-purchase.png +:align: center +:alt: Product settings for a purchase order to be invoiced on a sales order in Odoo. +``` +::: + +Then, select the appropriate {guilabel}`Analytic Distribution` associated with the sales order to +which this purchase order is related. To do that, click the empty {guilabel}`Analytic Distribution` +field to reveal an {guilabel}`Analytic` pop-up window. + +Then, from the {guilabel}`Departments` drop-down menu, select the analytic distribution associated +with the desired sales order to be invoiced for the purchase. + +```{image} time_materials/analytic-drop-down-distribution.png +:align: center +:alt: How to select the Analytic Distribution department from a purchase order in Odoo. +``` + +Once all the information is entered in the {guilabel}`Products` tab of the purchase order, confirm +the order by clicking {guilabel}`Confirm Order`. Then, click {guilabel}`Receive Products` when the +products have been received. This creates a receipt form. + +:::{note} +If any serial/lot numbers must be entered before validating the receipt of products, then on the +receipt form, click the {guilabel}`details` icon represented by four horizontal lines located to +the far-right of the product line. + +This reveals a {guilabel}`Detailed Operations` tab, in which the necessary {guilabel}`Lot/Serial +Number(s)` and {guilabel}`Done` quantity can be added. When ready, click {guilabel}`Confirm` to +confirm the data. +::: + +Then, click {guilabel}`Validate` to validate the purchase order. + +Next, return to the purchase order, via the breadcrumb links at the top of the page, and click +{guilabel}`Create Bill` to create a vendor bill that can be invoiced to the customer on the attached +sales order. + +```{image} time_materials/vendor-bill-draft.png +:align: center +:alt: Vendor bill draft for a purchase order to be invoiced to a customer in Odoo. +``` + +:::{note} +Make sure to enter a {guilabel}`Bill Date` on the {guilabel}`Vendor Bill Draft` before +confirming. If a {guilabel}`Bill Date` is *not* entered, an error window appears, requesting that +information to be entered before confirmation can occur. +::: + +Then, click {guilabel}`Confirm` to confirm the vendor bill, which is then automatically added to the +sales order, where it can be invoiced directly to the customer attached to it. + +## Invoice purchase + +To invoice a customer for a purchase on a sales order, first {ref}`add the purchase to the sales +order `, then navigate to the desired sales order in +the {menuselection}`Sales` app. + +On the sales order that was attached to the purchase order, the purchased product now has its own +product line under the {guilabel}`Order Lines` tab, and it is ready to be invoiced. + +```{image} time_materials/purchase-order-on-sales-order.png +:align: center +:alt: Purchase order product on sales order to be invoiced to customer via Odoo Sales. +``` + +To invoice the customer for the purchase, simply click {guilabel}`Create Invoice`, select +{guilabel}`Regular Invoice` from the {guilabel}`Create invoices` pop-up window, then click +{guilabel}`Create Draft Invoice`. + +Doing so reveals a {guilabel}`Customer Invoice Draft` with the newly-added purchase order product in +the {guilabel}`Invoice Lines` tab. + +```{image} time_materials/draft-invoice-with-purchase-product.png +:align: center +:alt: Customer invoice draft with purchase product attached to sales order in Odoo. +``` + +To complete the invoicing process, click {guilabel}`Confirm` to confirm the invoice, and then click +{guilabel}`Register Payment` in the {guilabel}`Register Payment` pop-up form. + diff --git a/content/applications/sales/sales/products_prices.md b/content/applications/sales/sales/products_prices.md new file mode 100644 index 000000000..dd3f69d87 --- /dev/null +++ b/content/applications/sales/sales/products_prices.md @@ -0,0 +1,16 @@ +--- +nosearch: true +--- + +# Products & Prices + +```{toctree} +:titlesonly: true + +products_prices/products +products_prices/prices +products_prices/returns +products_prices/ewallets_giftcards +products_prices/loyalty_discount +``` + diff --git a/content/applications/sales/sales/products_prices/ewallets_giftcards.md b/content/applications/sales/sales/products_prices/ewallets_giftcards.md new file mode 100644 index 000000000..198db3046 --- /dev/null +++ b/content/applications/sales/sales/products_prices/ewallets_giftcards.md @@ -0,0 +1,148 @@ +# Use eWallets and gift cards + +With Odoo, customers can use **eWallets** and **gift cards** for online and in-store shopping. + +To enable eWallets and gift cards for eCommerce and Point of Sale (PoS), first enable +{guilabel}`Discounts, Loyalty & Gift Card` under {menuselection}`Sales app --> Configuration --> +Settings --> Pricing section`. Once enabled, go to {menuselection}`Sales app --> Products --> Gift +cards & eWallet` and {guilabel}`Create` a new eWallet or gift card program. + +## eWallets + +eWallets allow customers to save credits on their online account and use these credits as a payment +method when buying items in an online store or a brick-and-mortar store. eWallets can also be used +to centralize multiple {ref}`gift cards `. + +Before creating an eWallet program, it is necessary to create an eWallet **top-up** product. Top-ups +are pre-defined digital credit values added to an eWallet in exchange for its equivalent in real +currency. These credits can then be used as a payment method in the eCommerce shop or {abbr}`PoS +(Point of Sale)`. Top-up values can be of different amounts. + +```{eval-rst} +.. example:: + A $50 top-up can be bought for $50, and adds that same amount of credits to the eWallet. +``` + +To create a top-up product, go to {menuselection}`Sales app --> Products --> Products` and +{guilabel}`Create` a new product. On the product template, configure the options as follows: + +- {guilabel}`Product Name`: enter a name for the top-up product (for example, `$50 Top-Up`) +- {guilabel}`Can be Sold`: enabled +- {guilabel}`Product Type`: select {guilabel}`Service` +- {guilabel}`Invoicing Policy`: select {guilabel}`Prepaid/Fixed Price` +- {guilabel}`Create on Order`: select {guilabel}`Nothing` +- {guilabel}`Sales Price`: enter the amount of the top-up + +:::{note} +In order to have eWallet top-ups of different amounts, create multiple top-up products and +modify the {guilabel}`Sales Price` accordingly. +::: + +Once the top-up is created, go to {menuselection}`Sales app --> Products --> Gift cards & eWallet` +to {guilabel}`Create` an eWallet program. The following configuration options are available: + +- {guilabel}`Program Name`: enter a name for the eWallet program +- {guilabel}`Program Type`: select {guilabel}`eWallet` +- {guilabel}`eWallet Products`: select the eWallet top-up created earlier. Repeat the process if + you created top-ups of different amounts. +- {guilabel}`Email template`: select the email template used for the email sent to the customer. To + create a new template, click on the field, select {guilabel}`Search More`, and then click + {guilabel}`Create`. +- {guilabel}`Currency`: select the currency to use for the eWallet program +- {guilabel}`Company`: select the company for which the program is valid and available +- {guilabel}`Available On`: select the applications on which the program is valid and available +- {guilabel}`Website`: select the website on which the program is valid and available. Leave this + field empty to include all websites. +- {guilabel}`Point of Sale`: select the {abbr}`PoS (Point of Sale)` in which the program is valid + and available. Leave this field empty to include all {abbr}`PoS (Point of Sale)`. + +```{image} ewallets_giftcards/ewallet-configuration.png +:align: center +:alt: eWallet program configuration page +``` + +Once the program is configured, click the {guilabel}`Generate eWallet` button in the upper-left +corner to generate eWallets. eWallets can be generated based on {guilabel}`Customers` and/or +{guilabel}`Customer Tags`. The quantity is automatically adapted according to the +{guilabel}`Customers` and {guilabel}`Customer Tags` selected. Then, set the {guilabel}`eWallet +value`. Finally, set the {guilabel}`Valid Until` period if applicable. + +Generated eWallets can be accessed through the {guilabel}`eWallets` smart button in the upper-right +corner. From there, {guilabel}`Send` or {guilabel}`Share` the eWallets via email or a URL link. + +```{image} ewallets_giftcards/ewallet-share.png +:align: center +:alt: eWallets send and share buttons +``` + +Click on an eWallet to change the {guilabel}`Expiration Date`, {guilabel}`Partner`, or +{guilabel}`Balance`. The {guilabel}`Code` of an eWallet *cannot* be changed, deleted, or duplicated. + +(ewallet-gift-gift-cards)= + +## Gift cards + +Gift cards can be purchased by customers, and in turn used as a payment method upon checkout at an +eCommerce shop or {abbr}`PoS (Point of Sale)`. + +Before creating a new gift card program, it is necessary to first create gift cards as products. To +do so, go to {menuselection}`Sales app --> Products --> Products` and {guilabel}`Create` a product. +On the product template, configure the options as follows: + +- {guilabel}`Product Name`: enter a name for the gift card product +- {guilabel}`Can be Sold`: enabled +- {guilabel}`Product Type`: select {guilabel}`Service` +- {guilabel}`Invoicing Policy`: select {guilabel}`Prepaid/Fixed Price` +- {guilabel}`Create on Order`: select {guilabel}`Nothing` +- {guilabel}`Sales Price`: enter the amount of the gift card + +:::{note} +In order to have gift cards of different amounts, create multiple gift card products and modify +the {guilabel}`Sales Price` accordingly. +::: + +Once the gift card product is created, go to {menuselection}`Sales app --> Products --> Gift cards +& eWallet` to {guilabel}`Create` a gift card program. The following configuration options are +available: + +- {guilabel}`Program Name`: enter a name for the gift card program +- {guilabel}`Program Type`: select {guilabel}`Gift Card` +- {guilabel}`Gift Card Products`: select the gift card product created earlier. Repeat the process + if you created gift card products of different amounts. +- {guilabel}`Email template`: select the default {guilabel}`Gift Card: Gift Card Information` + template, or create a new template by clicking on the field, selecting {guilabel}`Search More`, + and then clicking {guilabel}`Create`. +- {guilabel}`Print Report`: select {guilabel}`Gift Card` +- {guilabel}`Currency`: select the currency to use for the gift card program +- {guilabel}`Company`: select the company for which the program is valid and available +- {guilabel}`Available On`: select the applications on which the program is valid and available +- {guilabel}`Website`: select the website on which the program is valid and available. Leave this + field empty to include all websites. +- {guilabel}`Point of Sale`: select the {abbr}`PoS (Point of Sale)` in which the program is valid + and available. Leave this field empty to include all {abbr}`PoS (Point of Sale)`. + +```{image} ewallets_giftcards/giftcard-configuration.png +:align: center +:alt: Gift card program configuration page +``` + +Once the program is configured, click the {guilabel}`Generate Gift Cards` button in the upper-left +corner to generate gift cards. Gift cards can be generated either for {guilabel}`Anonymous +Customers` or {guilabel}`Selected Customers`. Set the {guilabel}`Quantity to generate` for +{guilabel}`Anonymous Customers`, or select the {guilabel}`Customers` and/or {guilabel}`Customer +Tags` for {guilabel}`Selected Customers`. Then, set the {guilabel}`Gift Card value`. Finally, set +the {guilabel}`Valid Until` period if applicable. + +Generated gift cards can be accessed through the {guilabel}`Gift Cards` smart button in the +upper-right corner. From there, {guilabel}`Send` or {guilabel}`Share` the gift cards via email or a +URL link. + +```{image} ewallets_giftcards/giftcard-share.png +:align: center +:alt: Gift cards send and share buttons +``` + +Click on a gift card to change the {guilabel}`Expiration Date`, {guilabel}`Partner`, or +{guilabel}`Balance`. The {guilabel}`Code` of a gift card *cannot* be changed, deleted, or +duplicated. + diff --git a/content/applications/sales/sales/products_prices/loyalty_discount.md b/content/applications/sales/sales/products_prices/loyalty_discount.md new file mode 100644 index 000000000..51a4f9d3a --- /dev/null +++ b/content/applications/sales/sales/products_prices/loyalty_discount.md @@ -0,0 +1,214 @@ +# Discount and loyalty programs + +The Odoo *Sales*, *eCommerce*, and *Point of Sale* applications allow users to create discount and +loyalty programs that customers can use for online and in-store shopping. These programs offer more +varied, public, and time-sensitive pricing options than {doc}`pricelists +`. + +## Configure the settings + +To begin using discount and loyalty programs, navigate to {menuselection}`Sales --> Configuration +--> Settings`. Under the {guilabel}`Pricing` heading, activate the {guilabel}`Discounts, Loyalty & +Gift Card` setting by checking the box next to the feature. Finally, click {guilabel}`Save` to save +the changes. + +## Configure discount and loyalty programs + +To create discount and loyalty programs, go to {menuselection}`Sales --> Products --> Discount & +Loyalty`. + +If no discount or loyalty programs have been created yet, Odoo provides a choice of templates to +help create the first program. Choose one of the template cards, or click {guilabel}`New` to create +a new program from scratch. + +Or, if there are already existing programs, select an existing program to edit it. + +```{image} loyalty_discount/price-discount-loyalty.png +:align: center +:alt: Discount and loyalty program template cards. +``` + +:::{note} +Templates **only** appear when no programs have been created, and they disappear once the first +program is created. +::: + +Creating or editing a program opens the program form. + +```{image} loyalty_discount/price-programs.png +:align: center +:alt: Program options on the loyalty program form. +``` + +The program form contains the following fields: + +- {guilabel}`Program Name`: Enter the name of the program in this field. The program name is **not** + visible to the customer. +- {guilabel}`Program Type`: Select the desired {ref}`program type + ` from the drop-down menu. +- {guilabel}`Currency`: Select the currency used for the program. +- {guilabel}`Pricelist`: If desired, select a pricelist from the drop-down menu to have this loyalty + program applied to a specific pricelist (and customers attached to the pricelist). More than one + pricelist can be selected in this field. When a single loyalty program is linked to several + pricelists, it makes it viable for different customer segments to have different pricelists, but + the *same* loyalty programs. If this field is left blank, the program applies to everyone, + regardless of pricelist. +- {guilabel}`Points Unit`: Enter the name of the points used for the {guilabel}`Loyalty Cards` + program (e.g. `Loyalty Points`). The points unit name *is* visible to the customer. This field is + **only** available when the {guilabel}`Program Type` is set to {guilabel}`Loyalty Cards`. +- {guilabel}`Start Date`: Select the date on which the program becomes valid. Leave this field blank + if the program should always be valid and not expire. +- {guilabel}`End Date`: Select the date on which the program stops being valid. Leave this field + blank if the program should always be valid and not expire. +- {guilabel}`Limit Usage`: If desired, tick this checkbox, and enter a number of {guilabel}`usages` + to limit the number of times the program can be used during the validity period. +- {guilabel}`Company`: If working in a multi-company database, choose the one company for which the + program is available. If left blank, the program is available to all companies in the database. +- {guilabel}`Available On`: Select the apps on which the program is available. +- {guilabel}`Website`: Select a website on which the program is available. Leave this field blank to + make it available on all websites. +- {guilabel}`Point of Sale`: Select the point(s) of sale at which the program is available. Leave + this field blank to make it available at all {abbr}`PoS (Point of Sale)`. + +:::{note} +The options available on the program form vary depending on the {ref}`Program Type +` selected. +::: + +All of the existing cards, codes, coupons, etc. that have been generated for the program are +accessible through the smart button located at the top of the form. + +```{image} loyalty_discount/price-programs-items.png +:align: center +:alt: Program items smart button on the loyalty program form. +``` + +:::{note} +In Odoo 17 (and later), when a loyalty card or coupon is associated with a contact in the +database, a {guilabel}`Loyalty Cards` smart button conditionally appears on the contact form. + +```{image} loyalty_discount/loyalty-cards-smart-button.png +:align: center +:alt: The Loyalty Card smart button as it appears on a contact form in Odoo 17. +``` + +This smart button **only** appears if a loyalty card or coupon is associated with the contact. +::: + +(sales-pricing-management-program-types)= + +### Program types + +The different {guilabel}`Program Types` available on the program form are: + +- {guilabel}`Coupons`: Generate and share single-use coupon codes that grant immediate access to + rewards. +- {guilabel}`Loyalty Cards`: When making purchases, the customer accumulates points to exchange for + rewards on current and/or future orders. +- {guilabel}`Promotions`: Set conditional rules for ordering products, which, when fulfilled, grant + access to rewards for the customer. +- {guilabel}`Discount Code`: Set codes which, when entered upon checkout, grant discounts to the + customer. +- {guilabel}`Buy X Get Y`: for every (X) item bought, the customer is granted 1 credit. After + accumulating a specified amount of credits, the customer can trade them in to receive (Y) item. +- {guilabel}`Next Order Coupons`: Generate and share single-use coupon codes that grant access to + rewards on the customer's next order. + +### Conditional rules + +Next, configure the {guilabel}`Conditional rules` that determine when the program applies to a +customer's order. + +In the {guilabel}`Rules & Rewards` tab, click {guilabel}`Add` next to {guilabel}`Conditional rules` +to add *conditions* to the program. This reveals a {guilabel}`Create Conditional rules` pop-up +window. + +```{image} loyalty_discount/price-conditional-rewards.png +:align: center +:alt: Rules & Rewards tab of the loyalty program form. +``` + +:::{note} +The options for {guilabel}`Conditional rules` vary depending on the selected {ref}`Program Type +`. +::: + +The following options are available for configuring conditional rules: + +- {guilabel}`Discount Code`: Enter a custom code to be used for the {guilabel}`Discount Code` + program, or use the default one generated by Odoo. This field is only available when the + {guilabel}`Program Type` is set to {guilabel}`Discount Code`. +- {guilabel}`Minimum Quantity`: Enter the minimum number of products that must be purchased in order + to access the reward. Set the minimum quantity to at least `1` to ensure that the customer must + make a purchase in order to access the reward. +- {guilabel}`Minimum Purchase`: Enter the minimum amount (in currency), with {guilabel}`tax + Included` or {guilabel}`tax Excluded`, that must be spent in order to access the reward. If both a + minimum quantity *and* minimum purchase amount are entered, then the customer's order must meet + both conditions. +- {guilabel}`Products`: Select the specific product(s) for which the program applies. Leave this + field blank to apply it to all products. +- {guilabel}`Categories`: Select the category of products for which the program applies. Choose + {guilabel}`All` to apply it to all product categories. +- {guilabel}`Product Tag:` Select a tag to apply the program to products with that specific tag. +- {guilabel}`Grant`: Enter the number of points the customer earns {guilabel}`per order`, + {guilabel}`per currency spent`, or {guilabel}`per unit paid` (for the {guilabel}`Loyalty Cards` + and {guilabel}`Buy X Get Y` programs). + +```{image} loyalty_discount/price-conditions.png +:align: center +:alt: Conditional rules configuration window for a discount or loyalty program. +``` + +Click {guilabel}`Save & Close` to save the rule and close the pop-up window, or click +{guilabel}`Save & New` to save the rule and immediately create a new one. + +### Rewards + +In the {guilabel}`Rules & Rewards` tab of the program form, click {guilabel}`Add` next to +{guilabel}`Rewards` to add *rewards* to the program. This reveals a {guilabel}`Create Rewards` +pop-up window. + +:::{note} +The options for {guilabel}`Rewards` vary depending on the selected {ref}`Program Type +`. +::: + +The following options are available for configuring rewards: + +- {guilabel}`Reward Type`: Select the reward type among {guilabel}`Free Product`, + {guilabel}`Discount`, and {guilabel}`Free Shipping`. The other options for reward configuration + depend on the {guilabel}`Reward Type` selected. + + - {guilabel}`Free Product`: + + - {guilabel}`Quantity Rewarded`: Select the number of free products rewarded to the customer. + - {guilabel}`Product`: Select the product given for free as a reward. Only one product can be + selected. + - {guilabel}`Product Tag`: Select a tag to further specify the free product eligible for the + reward. + + - {guilabel}`Discount`: + + - {guilabel}`Discount`: Enter the discounted amount in either {guilabel}`percentage`, + {guilabel}`currency per point`, or {guilabel}`currency per order`. Then, select whether the + discount applies to the entire {guilabel}`Order`, only the {guilabel}`Cheapest Product` on the + order, or only {guilabel}`Specific Products`. + - {guilabel}`Max Discount`: Enter the maximum amount (in currency) that this reward may grant as + a discount. Leave this field at `0` for no limit. + + - {guilabel}`Free Shipping`: + + - {guilabel}`Max Discount`: Enter the maximum amount (in currency) that this reward may grant as + a discount. Leave this field at `0` for no limit. + +- {guilabel}`In exchange of`: Enter the number of points required to exchange for the reward (for + the {guilabel}`Loyalty Cards` and {guilabel}`Buy X Get Y` programs). + +- {guilabel}`Description on order`: Enter the description of the reward, which is displayed to the + customer upon checkout. + +```{image} loyalty_discount/price-rewards.png +:align: center +:alt: Rewards configuration window for a discount or loyalty program. +``` + diff --git a/content/applications/sales/sales/products_prices/prices.md b/content/applications/sales/sales/products_prices/prices.md new file mode 100644 index 000000000..7503f5f4f --- /dev/null +++ b/content/applications/sales/sales/products_prices/prices.md @@ -0,0 +1,14 @@ +--- +nosearch: true +--- + +# Manage your pricing + +```{toctree} +:titlesonly: true + +prices/pricing +prices/currencies +prices/discounts +``` + diff --git a/content/applications/sales/sales/products_prices/prices/currencies.md b/content/applications/sales/sales/products_prices/prices/currencies.md new file mode 100644 index 000000000..7ba8060a9 --- /dev/null +++ b/content/applications/sales/sales/products_prices/prices/currencies.md @@ -0,0 +1,237 @@ +# Foreign currencies + +With Odoo, pricelists can be used to manage prices in a number of foreign currencies. Specifically, +Odoo has the ability to work with 167 total currencies. + +:::{note} +In order to use multiple currencies in Odoo *Sales*, the *Accounting* application **must** be +installed. +::: + +## Settings + +Once the *Accounting* app has been installed, foreign currencies can be added to the database. +Navigate to {menuselection}`Accounting app --> Configuration --> Settings`, scroll to the +{guilabel}`Currencies` section, and locate the {guilabel}`Main Currency` setting. + +```{image} currencies/main-currency-setting-page.png +:align: center +:alt: How the main currency feature appears on settings page in Odoo Accounting. +``` + +Odoo automatically sets the main currency as the currency of the country the company is based in. + +To change the main currency of the company, select the drop-down menu in the {guilabel}`Currency` +field, select the desired currency, and be sure to {guilabel}`Save` the changes. + +:::{tip} +To ensure currency rates are updated automatically, enable the *automatic currency rates* feature +on the *Accounting* settings page ({menuselection}`Accounting app --> Configuration --> Settings +--> Currencies section`). + +```{image} currencies/automatic-currency-rates.png +:align: center +:alt: How the main currency feature appears on settings page in Odoo Accounting. +``` + +Click the checkbox beside the {guilabel}`Automatic Currency Rates` feature, choose a designated +bank to get the currency rates from in the {guilabel}`Service` field drop-down menu, and select +an {guilabel}`Interval` of time for the updates to take place. Then determine when the date of +the {guilabel}`Next Run` should be. + +To instantly update the currency rates, click the {guilabel}`🔁 (circular arrows)` icon, located +to the right of the {guilabel}`Next Run` field. + +When all configurations are complete, be sure to {guilabel}`Save` all changes. +::: + +:::{note} +All payment methods **must** be in the same currency as the sales journal, or the company +currency, if the company currency is not set. If it is not the same, a {guilabel}`Validation +Error` message appears. +::: + +## View, edit, and add currencies + +To view, edit, and add currencies to the database, making them available on pricelists and on the +{guilabel}`Main Currency` drop-down menu, click the {guilabel}`Currencies` link, located beneath the +{guilabel}`Currency` field on the {menuselection}`Accounting app --> Settings` page. + +When the {guilabel}`Currencies` link is clicked, a separate {guilabel}`Currencies` page is revealed. + +```{image} currencies/main-currencies-page.png +:align: center +:alt: How the main currencies page appears in Odoo Accounting. +``` + +On this page, Odoo provides a master list of 167 global currencies. Each row shows the corresponding +{guilabel}`Currency`, {guilabel}`Symbol`, {guilabel}`Name`, date of the {guilabel}`Last Update`, and +{guilabel}`Current Rate` (compared to the default currency of the country in which the company is +based). + +To the far right, there are two columns, which can be toggled on or off: + +- {guilabel}`Active`: this currency is activated, which means it can be added to a pricelist, or + used as the main currency of the company, if desired (via {menuselection}`Accounting app --> + Configuration --> Settings --> Currencies section`). + +:::{note} +By default, all the {guilabel}`Active` currency options are at the top of the list. +::: + +:::{tip} +It is recommended that *at least* one pricelist is created per {guilabel}`Active` currency. See +{doc}`./pricing` to learn more about pricelist configuration. +::: + +To toggle options on/off, click the toggle switch in the row for the corresponding column. When *on* +the color of the switch is green. When *off*, the color of the switch is grey. + +### Currency detail form + +To edit any currency on the {guilabel}`Currencies` page, click the desired currency to reveal the +detail form for that specific currency, and proceed to make any necessary changes. + +```{image} currencies/currency-detail-form.png +:align: center +:alt: How a currency detail form looks in Odoo Accounting. +``` + +On the currency detail form, the relevant currency code appears in the {guilabel}`Currency` field. +Beneath that, the name for the currency is in the {guilabel}`Name` field. + +Then, toggle the currency's availability with the {guilabel}`Active` toggle: *on* is indicated with +a green switch, and *off* is indicated with a grey switch. + +On the right of the currency detail form, the appropriate {guilabel}`Currency Unit` (e.g. `Dollars`) +and {guilabel}`Currency Subunit` (e.g. `Cents`) can be found. + +Next, under the {guilabel}`Rates` tab, the various conversion rates can be viewed, added, or +deleted. Each row shows the {guilabel}`Date` of that specific rate, the {guilabel}`Company` to which +it is connected, followed by the {guilabel}`Unit per...` and {guilabel}`...per Unit`. + +:::{note} +The *...* in each of the last two columns represents the main currency set for the company. For +example, if the main currency is set to `USD`, the columns are titled {guilabel}`Unit per USD` +and {guilabel}`USD per Unit`. +::: + +To add a new rate, click {guilabel}`Add a line` in the {guilabel}`Rates` tab, and proceed to fill in +the necessary information in the aforementioned columns. + +### Main currency detail form + +If the selected currency is the main currency of the company, a blue banner appears at the top of +the currency detail form with the message: {guilabel}`This is your company's currency.`. + +```{image} currencies/main-currency-detail-form.png +:align: center +:alt: How a main currency detail form looks in Odoo Accounting. +``` + +All the fields are the same as a typical currency detail form, but there will **not** be a +{guilabel}`Rates` tab because all other currency rates are based off the main currency of the +company. + +## Create new currency + +If a desired currency isn't on the {guilabel}`Currencies` page, click the {guilabel}`New` button to +open a blank currency template form. + +:::{tip} +The same {guilabel}`New` button is located in the upper-right corner of any currency detail form. +::: + +```{image} currencies/blank-currency-detail-form.png +:align: center +:alt: How a blank currency detail form looks in Odoo Accounting. +``` + +On the blank currency detail form, proceed to enter the desired currency code in the +{guilabel}`Currency` field. Beneath that, enter the name for the currency in the {guilabel}`Name` +field. + +Then, toggle the currency's availability with the {guilabel}`Active` toggle switch. + +On the right of the currency detail form, enter the appropriate {guilabel}`Currency Unit` (e.g. +`Dollars`) and appropriate {guilabel}`Currency Subunit` (e.g. `Cents`). + +Next, under the {guilabel}`Rates` tab, add a new rate by clicking {guilabel}`Add a line`. Then, +proceed to confirm and adjust the {guilabel}`Date`, {guilabel}`Company`, {guilabel}`Unit per...`, +and {guilabel}`...per Unit` fields to ensure all the auto-populated information is accurate. + +:::{note} +The *...* in each of the last two columns represents the main currency set for the company. For +example, if the main currency is set to `USD`, the columns are titled {guilabel}`Unit per USD` +and {guilabel}`USD per Unit`. +::: + +## Currency-specific pricelists + +It is recommended that *at least* one pricelist is created per active currency in the database. To +create (or assign) a pricelist to a specific currency, start by navigating to {menuselection}`Sales +app --> Products --> Pricelists`. + +From the {guilabel}`Pricelists` page, either select an existing pricelist to edit, or click +{guilabel}`New` to create a new pricelist. + +On the pricelist detail form, for either a new or existing pricelist, adjust the +{guilabel}`Currency` field as desired. + +:::{seealso} +{doc}`./pricing` to learn more about pricelist configuration. +::: + +## Auto-conversion from public price + +It should be noted that the public price seen on products is directly related to the main currency +the company has set, which is configured by navigating to {menuselection}`Accounting app --> +Configuration --> Settings --> Currencies section --> Main Currency --> Currency drop-down menu`. + +The sales price automatically updates if the pricelist is changed to a different pricelist that has +a different currency than the company's main currency. The change in price is directly related to +the updated conversion rate for that currency. + +## Set product prices + +In order to have product prices set in place to avoid any changes in currency rates, start by +navigating to {menuselection}`Sales app --> Products --> Products`. + +From the {guilabel}`Products` page, select the desired product to modify. Or, create a new product +by clicking the {guilabel}`New` button. + +Then, on the product detail form, click the {guilabel}`Extra Prices` smart button, located in the +upper-left corner. Doing so reveals a separate {guilabel}`Price Rules` page, specific to that +particular product. + +```{image} currencies/price-rules-currencies.png +:align: center +:alt: How to set product prices based on foreign currency pricelists in Odoo Sales. +``` + +Click {guilabel}`New`, and select the desired pricelist from the drop-down menu in the +{guilabel}`Pricelist` column. + +The {guilabel}`Applied On` field is auto-populated with the product, so proceed to enter in the +desired figures in the {guilabel}`Min. Quantity` and {guilabel}`Price` fields. + +:::{note} +The figure in the {guilabel}`Min. Quantity` field means the {guilabel}`Price` being set will +**only** trigger if at least that amount of product is purchased. +::: + +If necessary, configure a {guilabel}`Start Date` and {guilabel}`End Date` for the set prices. +Leaving those columns blank ensures the set price will remain valid, regardless of the date of sale. + +If working in a multi-company environment, designate to which company this price rule should be +applied in the {guilabel}`Company` field. Leaving that field blank ensures the price rule applies to +all companies in the database. + +With those configurations complete, regardless of any changes/updates in conversion, whenever those +designated pricelists are applied to a customer trying to purchase this specific product, these +pre-determined set prices appear. + +:::{seealso} +{doc}`./pricing` +::: + diff --git a/content/applications/sales/sales/products_prices/prices/discounts.md b/content/applications/sales/sales/products_prices/prices/discounts.md new file mode 100644 index 000000000..5710366f6 --- /dev/null +++ b/content/applications/sales/sales/products_prices/prices/discounts.md @@ -0,0 +1,94 @@ +# Discounts + +The *Discounts* feature allows users to decrease or increase the price on item lines in a sales +quotation or order. This is calculated as a percentage of the products' sales price. + +To access discounts in the **Sales** app, navigate to {menuselection}`Sales app --> Configuration +--> Settings`. In the {guilabel}`Pricing` section, tick the {guilabel}`Discounts` checkbox, then +click {guilabel}`Save`. + +After the setting has been activated, navigate to the desired quotation by going to +{menuselection}`Sales app --> Orders --> Quotations` at the top of the page. Once there, click on +the desired quote from the list. + +## Discounts on product lines + +In the {guilabel}`Order Lines` tab of the quotation form, a new column heading appears labeled +{guilabel}`Disc.%`. This column is used to set discounts on individual line items. Enter the desired +discount for each product line and the new price is automatically calculated in the +{guilabel}`Total` at the bottom of the page. + +:::{tip} +A discount can also be added directly to a sales order in the same way. Navigate to +{menuselection}`Sales app --> Orders --> Orders`, click the desired sales order, and add the +discount to {guilabel}`Disc.%` field as described above. +::: + +```{image} discounts/discount-on-sales-order.png +:alt: The Dis.% heading will now appear in Order Lines. +``` + +:::{note} +Positive values for {guilabel}`Disc.%` will apply a *discount*, while negative values can be +used to *increase* the price. +::: + +:::{important} +Positive values, or price decreases, will be visible to the customer, while negative values, or +price increases, will *not* be visible to the customer. Instead of a discount column, the +negative discount will change the product's unit price. +::: + +## Discount button + +With the *Discounts* settings enabled, a {guilabel}`Discount` button appears at the bottom of sales +orders. + +```{image} discounts/discount-button-sales-order.png +:alt: The discount button located at the bottom of a sales order form in the Odoo Sales +: app. +``` + +Clicking the {guilabel}`Discount` button on a sales order opens a pop-up window, where the +{guilabel}`Discount` percentage, and options are configured: + +- {guilabel}`On All Order Lines`: Add the specified discount percentage (configured in the + {guilabel}`Discount` field of the pop-up window) on all existing order lines of the sales order. + +- {guilabel}`Global Discount`: Add a discount product line to the order, which has the cumulative + value equivalent to the specified discount percentage. + + ```{eval-rst} + .. example:: + A global discount of 10% is added in the last line of a sales order with a subtotal of $4,200 + by adding a discount line with a -$420 value (which is 10% of $4,200). + + .. image:: discounts/global-discount-option.png + :alt: The sales order with the applied global discount option in the Odoo Sales application. + ``` + + :::{important} + Any product added (or removed) *after* the global discount line is added does **not** affect + the discount value on the discount line. To include new products or amend current products in + the global discount, delete the current global discount line and repeat the steps. + ::: + +- {guilabel}`Fixed Amount`: Add a monetary amount to the {guilabel}`Discount` field. Once applied, + this amount is added to the order as a product line, with the monetary value subtracted from the + order total. + + ```{eval-rst} + .. example:: + A fixed discount of $20 appears as a product line, with a negative :guilabel:`Unit Price`. + + .. image:: discounts/fixed-discount-on-sales-order.png + :alt: The sales order with the applied fixed discount option in the Odoo Sales application. + ``` + +:::{note} +It is more beneficial to add a {guilabel}`Fixed Amount` discount after **all** desired products +have been added to a sales order. If there are changes made to the sales order *after* the +discount is added, adjust the value on the {guilabel}`Discount` line, or remove the line and add +the discount again, as needed. +::: + diff --git a/content/applications/sales/sales/products_prices/prices/pricing.md b/content/applications/sales/sales/products_prices/prices/pricing.md new file mode 100644 index 000000000..3686b0856 --- /dev/null +++ b/content/applications/sales/sales/products_prices/prices/pricing.md @@ -0,0 +1,302 @@ +# Pricelists + +A *pricelist* is a method of dynamic pricing that applies a list of prices (or price rules) to +adjust sales prices. This adjustment can apply to specific customers, customer groups, sales orders, +time periods, etc., and is useful for creating pricing strategies and optimizing sales margins. + +Odoo **Sales** has a useful pricelist feature that can be tailored to fit any unique pricing +strategy. Pricelists suggest certain prices, but they can always be overridden on the sales order. + +## Pricelists configuration + +To enable pricelists in the Odoo **Sales** app, first navigate to {menuselection}`Sales app --> +Configuration --> Settings`. In the {guilabel}`Pricing` section, tick the checkbox next to the +{guilabel}`Pricelists` feature, and click {guilabel}`Save` to save all changes. + +```{image} pricing/pricelist-feature-setting.png +:alt: How the pricelist feature setting looks in Odoo Sales. +``` + +After activating and saving the {guilabel}`Pricelists` feature, the {guilabel}`Settings` page +reloads. From here, either select the {icon}`oi-arrow-right` {guilabel}`Pricelists` link (beneath +the {guilabel}`Pricelists` feature on the {guilabel}`Settings` page), or navigate to +{menuselection}`Sales app --> Products --> Pricelists`. + +Either option reveals the {guilabel}`Pricelists` page, in which pricelists can be created and/or +modified at any time. + +```{image} pricing/18-sales-pricelist-page.png +:alt: How the pricelists page looks in Odoo Sales. +``` + +:::{important} +If there is no specific pricelist configured on a sales quotation, the {guilabel}`Default` +pricelist is applied. +::: + +:::{note} +The {guilabel}`Selectable` column is only applicable to Odoo **eCommerce**. This option allows +website visitors to choose a pricelist when shopping in your **eCommerce** website. +::: + +:::{note} +In Odoo 17 (and above), you are *not required* to enter a pricelist in the {guilabel}`Pricelist` +field on a sales quotation form in order to confirm it (i.e. turn it into a sales order). + +The chatter section is available on pricelist forms, which allows you to add notes and +communications on each pricelist page. +::: + +### Creating and editing pricelists + +From the {guilabel}`Pricelists` page, either select the pricelist to edit, or click {guilabel}`New` +to create a new pricelist, which reveals a blank pricelist form that can be configured in a number +of different ways. + +```{image} pricing/18-sales-new-pricelist-form.png +:alt: How the pricelist detail form looks in Odoo Sales. +``` + +When creating a new pricelist, start by adding a name for the pricelist at the blank field at top of +the form. Next, select which {guilabel}`Currency` should be used. + +If working in a multi-company environment, select which company this pricelist should apply to in +the {guilabel}`Company` field. If this field is left blank, the pricelist is automatically applied +to all companies in the database. + +If working in a multinational company, select the countries where this pricelist will apply under +the {guilabel}`Country Groups` column. + +### Price Rules tab + +In the {guilabel}`Price Rules` tab, each line creates a new record that will implement customized +pricing to the sales order where the pricelist is applied. To create a new price rule, click on +{guilabel}`Add a line`, which opens a new pricelist rules form. + +Then, select whether to apply this set of rules to a {guilabel}`Product` or {guilabel}`Category`. + +From here, there are several configuration options: + +- {guilabel}`Product`: If selected in the {guilabel}`Apply To` field, use this field to choose one + or more products to which this pricelist will apply. + +- {guilabel}`Category`: Select one or more product categories to which this pricelist will apply. + +- {guilabel}`Price Type`: Select whether the specialized pricing will fall under + {guilabel}`Discount`, {guilabel}`Formula`, or {guilabel}`Fixed Price`. Depending on the price + type, there will be additional configurations on how to apply the pricelist. + + - {guilabel}`Discount`: Enter the percentage to be discounted. A mark-up can be configured by + using a negative value in this field. + + :::{important} + If a pricelist is applied to a sales quotation with the discount {guilabel}`Price Type` set + as {guilabel}`Discount`, the discount will visible to the customer. + + ```{image} pricing/sales-pricelist-pricerule-discount.png + :alt: 'A pricelist rule using Price Type: Discount to create a discount.' + ``` + + ```{image} pricing/sales-pricelist-pricerule-discount-customer.png + :alt: 'How a pricelist rule using Price Type: Discount appears on customer preview.' + ``` + ::: + + - {guilabel}`Formula`: Calculate the pricelist rules based the following configuration: + + - {guilabel}`Discount`: Percentage discount to be applied. Negative values can be entered to + increase prices. + + :::{important} + If a pricelist is applied to a sales quotation with the discount {guilabel}`Price Type` set + as {guilabel}`Formula`, the discount will *not* be visible to the customer. + ::: + + - {guilabel}`Round off to`: Numerical value to act as round-off multiple, to be applied after + discount. The rounding method sets the price so that it is a multiple of the value in this + field. + + :::{note} + Rounding is applied *after* the discount and *before* the extra fee. + + - {guilabel}`Extra Fee`: Fixed amount to be added or subtracted once {guilabel}`Discount` + and {guilabel}`Round off to` have been applied. + - {guilabel}`Fixed Price`: Enter fixed price for this pricelist. When applied, all product + lines in the quotation form will be updated to this price. + ::: + +- {guilabel}`Min Qty`: Specify the minimum quantity of selected products for this pricelist to + apply. + +- {guilabel}`Validity Period`: Specify the start and end date during which this pricelist can be + applied to quotations. + +```{eval-rst} +.. example:: + To formulate a 100% markup (or two times the price of the product), with a $5 minimum margin, set + the :guilabel:`Based price` field to :guilabel:`Sales Price` and the :guilabel:`Discount` to + `-100`. This is often seen in retail situations. + + .. image:: pricing/formula-markup-cost-example.png + :alt: How it looks to formulate a markup cost with 5 dollar minimum margin in Odoo Sales. +``` + +```{eval-rst} +.. example:: + To apply 20% discounts, with prices rounded up to 9.99, set the :guilabel:`Based on` field to + :guilabel:`Sales Price`, the :guilabel:`Discount` field to `20`, the :guilabel:`Extra Fee` field + to `-0.01`, and the :guilabel:`Rounding Method` field to `10`. + + .. image:: pricing/formula-discount-example.png + :alt: Example of a 20% discount with prices rounded to 9.99 in Odoo Sales. +``` + +:::{tip} +To have prices that end in 9.99, set the {guilabel}`Rounding Method` to `10` and the +{guilabel}`Extra Fee` to `-0.01`. +::: + +### Recurring Prices tab + +Recurring prices are specifically used with {doc}`subscription products +<../../../subscriptions/products>`. When configuring price rules in this tab, keep in mind that +they will only apply to subscription products, or products with recurring prices enabled. + +In the {guilabel}`Recurring Prices` tab, pricelists are configured with the same options as in the +{guilabel}`Price Rules` tab, with additional columns for {guilabel}`Product Variants` add +{guilabel}`Recurring Plan`. + +{guilabel}`Product Variants` are configured under products that have one or more values, such as +color, size, etc. Once a product has been selected under the {guilabel}`Products Tab`, if +applicable, select the desired product variants to be included in the price rule. + +Then, select the blank field in the {guilabel}`Recurring Plan` column to reveal a drop-down menu of +pre-designated recurrence periods (e.g. `Monthly`, `Quarterly`, `Weekly`, etc.). + +```{image} pricing/sales-pricelist-recurringprices.png +:alt: The recurring prices tab in a pricelist configuration form. +``` + +New recurrence periods can also be created from this column. To do so, type in the name for the new +{guilabel}`Recurring Plan`, then select {guilabel}`Create` from the resulting drop-down menu to +create the time period, which can be edited later. Alternatively, select {guilabel}`Create and +edit...` to reveal a {guilabel}`Create Recurring Plan` pop-up form. From this pop-up form, the new +recurrence period can be configured, with specific {guilabel}`Details`, {guilabel}`Self-Service`, +and {guilabel}`Pricing` options. When the configurations are complete, click the {guilabel}`Save & +Close` button. + +```{image} pricing/time-period-popup.png +:align: center +:alt: Custom time period pop-up form in Odoo Sales. +``` + +Lastly, add the desired price for this recurring price rule in the {guilabel}`Recurring Price` +column. + +:::{seealso} +{doc}`../../../subscriptions` +::: + +### Rental rules tab + +Price rules can be configured for {doc}`rental products <../../../rental>` under the +{guilabel}`Rental rules` tab, using the same methodology as the {guilabel}`Price Rules` and +{guilabel}`Recurring Prices` tabs. + +To add a rental rule, click {guilabel}`Add a line`, and select a desired product in the +{guilabel}`Products` column. Then, select any specific {guilabel}`Variants`, if necessary. + +Next, designate a {guilabel}`Period` of time for the rental rule (e.g. `Daily`, `Hourly`, etc.). + +Lastly, configure a {guilabel}`Price` for the rental rule in the respective column. + +```{image} pricing/sales-pricelist-rental.png +:alt: The rental tab in a pricelist configuration form. +``` + +### Ecommerce Tab + +Under the {guilabel}`Ecommerce` tab, price rules can be configured for products sold on an +{doc}`Ecommerce website <../../../../websites/ecommerce/products>`. + +To enable the pricelist to be visible, select the target website in the {guilabel}`Website` field. + +The {guilabel}`Selectable` can be enabled to allow the customer to choose this pricelist. + +Finally, promotional and loyalty codes can be added to the {guilabel}`E-commerce Promotional Code` +field. + +```{image} pricing/sales-pricelist-ecommerce.png +:alt: The Ecommerce tab in a pricelist configuration form. +``` + +## Customer pricelist application + +While the default pricelist applied to any customer is the {guilabel}`Public Pricelist`, Odoo +provides the opportunity to directly apply a different pricelist to customers on their contact form. + +To do that, open the desired customer's contact form, either by navigating to {menuselection}`Sales +app --> Orders --> Customers` and selecting the customer from the main {guilabel}`Customers` page, +or by clicking on the customer's name on a sales order. + +```{image} pricing/customer-detail-form.png +:align: center +:alt: Sample customer detail form in Odoo Sales. +``` + +On the desired customer's contact form, under the {guilabel}`Sales & Purchase` tab, in the +{guilabel}`Sales` section, designate what pricelist should be applied to this specific customer from +the drop-down menu in the {guilabel}`Pricelist` field. + +```{image} pricing/customer-form-pricelist-field.png +:align: center +:alt: The pricelist field in a customer detail form in Odoo Sales. +``` + +:::{note} +When a customer is added to the database, the default pricelist is automatically applied to them. +There is **no way** to have a blank *Pricelist* field on a contact form. Even if that field is +left blank, the default pricelist appears when that contact form is opened again. + +However, when that contact is added to a quotation, and the *Pricelist* field is auto-populated +(based on the information from their contact form), that predetermined pricelist can be removed +from the *Pricelist* field, and the quotation can still be confirmed, and subsequently, turned +into a sales order. +::: + +### Conditions + +At the bottom of the {guilabel}`Create Pricelist Rules` pop-up form is the {guilabel}`Conditions` +section. + +Here, start by selecting one of the options in the {guilabel}`Apply On` field: + +- {guilabel}`All Products`: the advanced pricelist rule will be applied to all products. +- {guilabel}`Product Category`: the advanced pricelist rule will be applied to a specific category + of products. +- {guilabel}`Product`: the advanced pricelist rule will be applied to a specific product. +- {guilabel}`Product Variant`: the advanced pricelist rule will be applied to a specific product + variant. + +If any of those options, apart from {guilabel}`All Products`, are selected, a new option-specific +field appears, in which the specific {guilabel}`Product Category`, {guilabel}`Product`, or +{guilabel}`Product Variant` must be chosen. + +Then, select a minimum quantity to be applied to the advanced pricelist rule in the {guilabel}`Min. +Quantity` field. Lastly, select a range of dates for the pricelist item validation in the +{guilabel}`Validity` field. + +Once all configurations are complete, either click {guilabel}`Save & Close` to save the advanced +pricelist rule, or click {guilabel}`Save & New` to immediately create another advanced pricelist +rule on a fresh form. + +:::{note} +If a price rule is set for a particular product, and another one for its product category, Odoo +takes the rule of the product itself. +::: + +:::{seealso} +- {doc}`/applications/sales/sales/products_prices/prices/currencies` +- {doc}`/applications/websites/ecommerce/products/price_management` +::: + diff --git a/content/applications/sales/sales/products_prices/products.md b/content/applications/sales/sales/products_prices/products.md new file mode 100644 index 000000000..6d7259ae4 --- /dev/null +++ b/content/applications/sales/sales/products_prices/products.md @@ -0,0 +1,14 @@ +--- +nosearch: true +--- + +# Manage your products + +```{toctree} +:titlesonly: true + +products/import +products/variants +products/product_images +``` + diff --git a/content/applications/sales/sales/products_prices/products/import.md b/content/applications/sales/sales/products_prices/products/import.md new file mode 100644 index 000000000..a1a4667d3 --- /dev/null +++ b/content/applications/sales/sales/products_prices/products/import.md @@ -0,0 +1,273 @@ +# Import products + +Odoo *Sales* provides a template for importing products with categories and variants, which can be +opened and edited with any spreadsheet software (Microsoft Excel, OpenOffice, Google Sheets, etc.). + +When this spreadsheet is filled out properly, it can be quickly uploaded to the Odoo database. When +uploaded, those products are instantly added, accessible, and editable in the product catalog. + +## Import template + +In order to import products with categories and variants, the *Import Template for Products* +**must** be downloaded. Once downloaded, the template can be adjusted and customized, and then +uploaded back into the Odoo database. + +To download the necessary import template, navigate to {menuselection}`Sales app --> Products --> +Products`. On the {guilabel}`Products` page, click the {guilabel}`⚙️ (gear)` icon in the upper-left +corner. Doing so reveals a drop-down menu. + +From this drop-down menu, select the {guilabel}`Import records` option. + +```{image} import/gear-import-records-option.png +:align: center +:alt: The Import records option selectable from the gear icon on the Products page +: in Odoo Sales. +``` + +Selecting {guilabel}`Import records` reveals a separate page with a link to download the +{guilabel}`Import Template for Products`. Click that link to download the template. + +```{image} import/import-template-products.png +:align: center +:alt: The Import records option selectable from the gear icon on the Products page +: in Odoo Sales. +``` + +Once the template download is complete, open the spreadsheet file to customize it. + +## Customize product import template + +When the import template has been downloaded and opened, it's time to modify its contents. However, +before any changes are made, there are a few elements to keep in mind during the process: + +- Feel free to remove any columns that aren't deemed necessary. But, it is *strongly* advised that + the {guilabel}`Internal Reference` column remains. + + While it's not mandatory, having a unique identifier (e.g. `FURN_001`) in the {guilabel}`Internal + Reference` column for each product can be helpful in many cases. This can even be from previous + software spreadsheets to ease the transition into Odoo. + + For example, when updating imported products, the same file can be imported several times without + creating duplicates, thus enhancing the efficiency and simplicity of imported product management. + +- Do **not** change the labels of columns that are meant to be imported. Otherwise, Odoo won't + recognize them, forcing the user to map them on the import screen manually. + +- Feel free to add new columns to the template spreadsheet, if desired. However, to be added, those + fields **must** exist in Odoo. If Odoo can't match the column name with a field, it can be matched + manually during the import process. + + During the import process of the completed template, Odoo reveals a page showcasing all the + elements of the newly-configured product template spreadsheet, separated by {guilabel}`File + Column`, {guilabel}`Odoo Field`, and {guilabel}`Comments`. + + To manually match a column name with a field in Odoo, click the {guilabel}`Odoo Field` drop-down + menu next to the {guilabel}`File Column` that needs a manual adjustment, and select the + appropriate field from that drop-down menu. + + ```{image} import/odoo-field-dropdown-menu.png + :align: center + :alt: The Odoo Field drop-down menu next to a Field Column that needs to be manually + : adjusted. + ``` + +## Import product template spreadsheet + +After customizing the product template spreadsheet, return to the Odoo product import page, where +the template download link is found, and click the {guilabel}`Upload File` button in the upper-left +corner. + +```{image} import/upload-file-button.png +:align: center +:alt: The upload file button on the import products template download page in Odoo +: Sales. +``` + +Then, a pop-up window appears, in which the completed product template spreadsheet file should be +selected and uploaded to Odoo. + +After that, Odoo reveals a page showcasing all the elements of the newly-configured product template +spreadsheet, separated by {guilabel}`File Column`, {guilabel}`Odoo Field`, and {guilabel}`Comments`. + +```{image} import/import-a-file-page.png +:align: center +:alt: The import a file page in Odoo Sales after a product template has been uploaded. +``` + +From here, the {guilabel}`File Column` can be manually assigned to an {guilabel}`Odoo Field`, if +necessary. + +To make sure everything is appropriate, and all the columns and fields are lined up accurately, +click the {guilabel}`Test` button in the upper-left corner. + +If everything is lined up and applied correctly, Odoo reveals a blue banner at the top of the page, +informing the user that {guilabel}`Everything seems valid`. + +```{image} import/everything-seems-valid-message.png +:align: center +:alt: The everything seems valid message that appears if file columns are entered correctly. +``` + +If there are any errors, Odoo reveals a red banner at the top of the page, with instructions of +where to locate the specific issues, and how to fix them. + +```{image} import/import-error-message.png +:align: center +:alt: The import error message that appears if file columns don't match an Odoo Field. +``` + +Once those errors are fixed, click {guilabel}`Test` again to ensure all necessary issues have been +remedied appropriately. + +If additional product template spreadsheets need to be uploaded, click the {guilabel}`Load File` +button, select the desired product template spreadsheet, and repeat the process. + +When everything is ready, click the {guilabel}`Import` button. + +When clicked, Odoo instantly imports those products, and reveals the main {guilabel}`Products` page, +with a pop-up message in the upper-right corner. This pop-up message informs the user how many +products were successfully imported. + +```{image} import/successful-import-popup.png +:align: center +:alt: The pop-up window that appears after a successful product import process in Odoo +: Sales. +``` + +At this point, all the newly-imported products are accessible and editable via the +{guilabel}`Products` page. + +## Import relation fields, attributes, and variants + +It's important to note that an Odoo object is always related to many other objects. For example, a +product is linked to product categories, attributes, vendors, and things of this nature. These +links/connections are known as relations. + +:::{note} +In order to import product relations, the records of the related object **must** be imported +*first* from their own list menu. +::: + +### Relation fields + +On product forms in Odoo, there are a number of fields that can be modified and customized at any +time. These fields are found under every tab on a product form. While these fields are easily +editable directly on the product form, they can also be modified via a product import. + +As mentioned, relation fields of this nature can **only** be imported for products if they already +exist in the database. For example, if a user attempts to import a product with a *Product Type*, it +can only be one of the preconfigured product types existing in the database (e.g. *Storable +Product*, *Consumable*, etc.). + +To import information for a relation field on a product import template spreadsheet, add the name of +the field as a column name/title on the spreadsheet. Then, on the appropriate product line, add the +desired relation field option. + +When all desired relation field information has been entered, save the spreadsheet, and import it +to the database, per the process mentioned above ({menuselection}`Sales app --> Products --> +Products --> ⚙️ (gear) icon --> Import records --> Upload File`). + +Once the spreadsheet with the newly-configured relation field information has been uploaded, click +{guilabel}`Import`, and Odoo returns to the {guilabel}`Products` page. + +When the newly-changed/modified products, complete with the new relation field information, has been +imported and uploaded, that new information can be found on the {guilabel}`Products` page. + +### Attributes and values + +Odoo also allows users to import product attributes and values that can be used for products that +already exist in the database, and/or with imported products. + +To import attributes and values, a separate spreadsheet or CSV file dedicated to attributes and +values **must** be imported and uploaded before they can be used for other products. + +The column names/titles of the attributes and values spreadsheet should be as follows: +{guilabel}`Attribute`, {guilabel}`Display Type`, {guilabel}`Variant Creation Mode`, and +{guilabel}`Values / Value`. + +```{image} import/attributes-and-values-spreadsheet.png +:align: center +:alt: An attributes and values spreadsheet template for imports. +``` + +- {guilabel}`Attribute`: name of the attribute (e.g. `Size`). + +- {guilabel}`Display Type`: display type used in the product configurator. There are three display + type options: + + - {guilabel}`Radio`: values displayed as radio buttons + - {guilabel}`Selection`: values displayed in a selection list + - {guilabel}`Color`: values denoted as a color selection + +- {guilabel}`Variant Creation Mode`: how the variants are created when applied to a product. There + are three variant creation mode options: + + - {guilabel}`Instantly`: all possible variants are created as soon as the attribute, and its + values, are added to a product + + - {guilabel}`Dynamically`: each variant is created **only** when its corresponding attributes and + values are added to a sales order + + - {guilabel}`Never`: variants are **never** created for the attribute + + :::{note} + The {guilabel}`Variants Creation Mode` **cannot** be changed once the attribute is used on at + least one product. + ::: + +- {guilabel}`Values/Value`: values pertaining to the corresponding attribute. If there are multiple + values for the same attribute, the values need to be in individual lines on the spreadsheet. + +Once the desired attributes and values have been entered and saved in the spreadsheet, it's time to +import and upload it into Odoo. To do that, navigate to {menuselection}`Sales app --> Configuration +--> Attributes --> ⚙️ (gear) icon --> Import records --> Upload File`. + +Once the spreadsheet with the newly-configured attributes and values has been uploaded, click +{guilabel}`Import`, and Odoo returns to the {guilabel}`Attributes` page. That's where those +newly-added attributes and values can be found and edited, if necessary. + +As mentioned previously, when attributes and values have been added to the Odoo database, they can +be used for existing or imported products. + +### Product variants + +When product attributes and values are configured in the database, they can be used on product +import spreadsheets to add more information and detail to products being imported. + +To import products with product attributes and values, the product import template spreadsheet must +be configured with specific {guilabel}`Product Attributes / Attribute`, {guilabel}`Product +Attributes / Values`, and {guilabel}`Name` columns. + +There can be other columns, as well, but these columns are **required** in order to properly import +products with specific variants. + +```{image} import/product-attribute-spreadsheet-import.png +:align: center +:alt: Product variants spreadsheet with product attributes and variants for import +: purposes. +``` + +- {guilabel}`Name`: product name +- {guilabel}`Product Attributes / Attribute`: name of attribute +- {guilabel}`Product Attributes / Values`: values pertaining to the corresponding attribute + +:::{tip} +To import multiple values, separate them by *just* a comma, **not** a comma followed by a space, +in the product import template spreadsheet (e.g. `furniture,couch,home`). +::: + +When the desired products and product variants have been entered and saved in the spreadsheet, it's +time to import and upload them into Odoo. To do that, navigate to {menuselection}`Sales app --> +Products --> Products --> ⚙️ (gear) icon --> Import records --> Upload File`. + +Once the spreadsheet with the newly-configured products and product variants has been uploaded, +click {guilabel}`Import`, and Odoo returns to the {guilabel}`Products` page. That's where the +newly-added products can be found. + +To view and modify the attributes and variants on any products, select the desired product from the +{guilabel}`Products` page, and click the {guilabel}`Attributes \& Variants` tab. + +:::{seealso} +{doc}`variants` +::: + diff --git a/content/applications/sales/sales/products_prices/products/product_images.md b/content/applications/sales/sales/products_prices/products/product_images.md new file mode 100644 index 000000000..c790a5e45 --- /dev/null +++ b/content/applications/sales/sales/products_prices/products/product_images.md @@ -0,0 +1,179 @@ +# Product images with Google Images + +Having appropriate product images in Odoo is useful for a number of reasons. However, if a lot of +products need images, assigning them can become incredibly time-consuming. + +Fortunately, by configuring the *Google Custom Search* API within an Odoo database, finding product +images for products (based on their barcode) is extremely efficient. + +(product-images-configuration)= + +## Configuration + +In order to utilize *Google Custom Search* within an Odoo database, both the database and the Google +API must be properly configured. + +:::{note} +Free Google accounts allow users to select up to 100 free images per day. If a higher amount is +needed, a billing upgrade is required. +::: + +(product-images-google-api-dashboard)= + +### Google API dashboard + +1. Go to the [Google Cloud Platform API & Services](https://console.developers.google.com/) page + to generate Google Custom Search API credentials. Then, log in with a Google account. Next, agree + to their {guilabel}`Terms of Service` by checking the box, and clicking {guilabel}`Agree and + Continue`. + +2. From here, select (or create) an API project to store the credentials. Start by giving it a + memorable {guilabel}`Project Name`, select a {guilabel}`Location` (if any), then click + {guilabel}`Create`. + +3. With the {guilabel}`Credentials` option selected in the left sidebar, click {guilabel}`Create + Credentials`, and select {guilabel}`API key` from the drop-down menu. + + ```{image} product_images/credentials-api-key.png + :align: center + :alt: API & Services page on Google Cloud Platform. + ``` + +4. Doing so reveals an {guilabel}`API key created` pop-up window, containing a custom {guilabel}`API + key`. Copy and save {guilabel}`Your API key` in the pop-up window -- it will be used later. Once + the key is copied (and saved for later use), click {guilabel}`Close` to remove the pop-up window. + + ```{image} product_images/api-key-pop-up.png + :align: center + :alt: The API key created pop-up window that appears. + ``` + +5. On this page, search for `Custom Search API`, and select it. + + ```{image} product_images/custom-search-api-search-bar.png + :align: center + :alt: Search bar containing "Custom Search API" on Google Cloud Platform. + ``` + +6. From the {guilabel}`Custom Search API` page, enable the API by clicking {guilabel}`Enable`. + + ```{image} product_images/gcp-custom-search-api-page.png + :align: center + :alt: '"Custom Search API" page with Enable button highlighted on Google Cloud Platform.' + ``` + +(product-images-google-pse-dashboard)= + +### Google Programmable Search dashboard + +1. Next, go to [Google Programmable Search Engine](https://programmablesearchengine.google.com/), + and click either of the {guilabel}`Get started` buttons. Log in with a Google account, if not + already logged in. + + ```{image} product_images/google-pse-get-started.png + :align: center + :alt: Google Programmable Search Engine page with the Get Started buttons. + ``` + +2. On the {guilabel}`Create a new search engine` form, fill out the name of the search engine, along + with what the engine should search, and be sure to enable {guilabel}`Image Search` and + {guilabel}`SafeSearch`. + + ```{image} product_images/create-new-search.png + :align: center + :alt: Create new search engine form that appears with search engine configurations. + ``` + +3. Validate the form by clicking {guilabel}`Create`. + +4. Doing so reveals a new page with the heading: {guilabel}`Your new search engine has been + created`. + + ```{image} product_images/new-search-engine-has-been-created.png + :align: center + :alt: The Your New Search Engine Has Been Created page that appears with copy code. + ``` + +5. From this page, click {guilabel}`Customize` to open the {menuselection}`Overview --> Basic` page. + Then, copy the ID in the {guilabel}`Search engine ID` field. This ID is needed for the Odoo + configuration. + + ```{image} product_images/basic-overview-search-engine-id.png + :align: center + :alt: Basic overview page with search engine ID field. + ``` + +(product-images-setup-in-odoo)= + +### Odoo + +1. In the Odoo database, go to the {menuselection}`Settings app` and scroll to the + {guilabel}`Integrations` section. From here, check the box beside {guilabel}`Google Images`. + Then, click {guilabel}`Save`. + + ```{image} product_images/google-images-setting.png + :align: center + :alt: The Google Images setting in the Odoo Settings app page. + ``` + +2. Next, return to the {menuselection}`Settings app`, and scroll to the {guilabel}`Integrations` + section. Then, enter the {guilabel}`API Key` and {guilabel}`Search Engine ID` in the fields + beneath the {guilabel}`Google Images` feature. + +3. Click {guilabel}`Save`. + +(product-images-get-product-images)= + +## Product images in Odoo with Google Custom Search API + +Adding images to products in Odoo can be done on any product or product variant. This process can be +completed in any Odoo application that provides access to product pages (e.g. *Sales* app, +*Inventory* app, etc.). + +Below is a step-by-step guide detailing how to utilize the *Google Custom Search API* to assign +images to products in Odoo using the Odoo *Sales* application: + +1. Navigate to the {guilabel}`Products` page in the *Sales* app ({menuselection}`Sales app --> + Products --> Products`). Or, navigate to the {guilabel}`Product Variants` page in the *Sales* app + ({menuselection}`Sales app --> Products --> Product Variants`). + +2. Select the desired product that needs an image. + + :::{note} + Only products (or product variants) that have a barcode, but **not** an image, are processed. + + If a product with one or more variants is selected, each variant that matches the + aforementioned criteria is processed. + ::: + +3. Click the {guilabel}`Action ⚙️ (gear)` icon on the product page, and select {guilabel}`Get + Pictures from Google Images` from the menu that pops up. + + ```{image} product_images/get-pictures-from-google-action.png + :align: center + :alt: The Get Pictures from Google Images option from the Action drop-down menu in + : Odoo. + ``` + +4. On the pop-up window that appears, click {guilabel}`Get Pictures`. + + ```{image} product_images/click-get-picture-from-pop-up.png + :align: center + :alt: The pop-up that appears in which the user should click Get Picture in Odoo Sales. + ``` + +5. Once clicked, the image(s) will appear incrementally. + + :::{note} + Only the first 10 images are fetched immediately. If you selected more than 10, the rest are + fetched as a background job. + + The background job processes about 100 images in a minute. If the quota authorized by Google + (either with a free or a paid plan) is reached, the background job puts itself on hold for 24 + hours. Then, it will continue where it stopped the day before. + ::: + +:::{seealso} +[Create, modify, or close your Google Cloud Billing account](https://cloud.google.com/billing/docs/how-to/manage-billing-account) +::: + diff --git a/content/applications/sales/sales/products_prices/products/variants.md b/content/applications/sales/sales/products_prices/products/variants.md new file mode 100644 index 000000000..edd0aefff --- /dev/null +++ b/content/applications/sales/sales/products_prices/products/variants.md @@ -0,0 +1,322 @@ +# Product variants + +Product variants are used to give single products a variety of different characteristics and options +for customers to choose from, such as size, style, or color, just to name a few. + +Products variants can be managed via their individual product template, or by navigating to either +the {guilabel}`Product Variants` or {guilabel}`Attributes` page. All of these options are located +within the Odoo *Sales* application. + +```{eval-rst} +.. example:: + An apparel company has the following variant breakdown for one their best-selling t-shirts: + + - Unisex Classic Tee + + - Color: Blue, Red, White, Black + - Size: S, M, L, XL, XXL + + Here, the **T-shirt** is the product template, and **T-shirt: Blue, S** is a specific product + variant. + + **Color** and **Size** are *attributes*, and the corresponding options (like **Blue** and **S**) + are *values*. + + In this instance, there is a total of twenty different product variants: four **Color** options + multiplied by five **Size** options. Each variant has its own inventory count, sales totals, and + other similar records in Odoo. +``` + +:::{seealso} +{ref}`ecommerce/products/product-variants` +::: + +## Configuration + +To use product variants, the *Variants* setting **must** be activated in the Odoo *Sales* +application. + +To do that, go to {menuselection}`Sales app --> Configuration --> Settings`, and locate the +{guilabel}`Product Catalog` section at the top of the page. + +In that section, check the box to enable the {guilabel}`Variants` feature. + +```{image} variants/activating-variants-setting.png +:align: center +:alt: Activating product variants on the Settings page of the Odoo Sales application. +``` + +Then, click {guilabel}`Save` at the top of the {guilabel}`Settings` page. + +## Attributes + +Before product variants can be set up, attributes **must** be created. To create, manage, and modify +attributes, navigate to {menuselection}`Sales app --> Configuration --> Attributes`. + +:::{note} +The order of attributes on the {guilabel}`Attributes` page dictates how they appear on the +*Product Configurator*, *Point of Sale* dashboard, and *eCommerce* pages. +::: + +To create a new attribute from the {guilabel}`Attributes` page, click {guilabel}`New`. Doing so +reveals a blank attributes form that can be customized and configured in a number of ways. + +```{image} variants/attribute-creation.png +:align: center +:alt: A blank attribute creation form in the Odoo Sales application. +``` + +First, create an {guilabel}`Attribute Name`, such as `Color` or `Size`. + +Next, select one of the options from the {guilabel}`Display Type` field. The {guilabel}`Display +Type` determines how this product is shown on the online store, *Point of Sale* dashboard, and +*Product Configurator*. + +The {guilabel}`Display Type` options are: + +- {guilabel}`Pills`: options appear as selectable buttons on the product page of the online store. +- {guilabel}`Color`: options appear as small, colored squares, which reflect any HTML color codes +- {guilabel}`Radio`: options appear in a bullet-style list on the product page of the online store. +- {guilabel}`Select`: options appear in a drop-down menu on the product page of the online store. + set, on the product page of the online store. +- {guilabel}`Multi-checkbox (option)`: options appear as selectable checkboxes on the product page + of the online store. + +```{image} variants/display-types.png +:align: center +:alt: Display Types on Product Configurator on the online store in Odoo. +``` + +The {guilabel}`Variant Creation Mode` field informs Odoo when to automatically create a new variant +once an attribute is added to a product. + +:::{note} +The {guilabel}`Variant Creation Mode` field **must** be set to {guilabel}`Never (option)` in +order for the {guilabel}`Multi-checkbox (option)` to work properly as the {guilabel}`Display +Type`. +::: + +- {guilabel}`Instantly`: creates all possible variants as soon as attributes and values are added + to a product template. +- {guilabel}`Dynamically`: creates variants **only** when corresponding attributes and values are + added to a sales order. +- {guilabel}`Never (option)`: never automatically creates variants. + +:::{warning} +Once added to a product, an attribute's {guilabel}`Variants Creation Mode` cannot be edited. +::: + +The {guilabel}`eCommerce Filter Visibility` field determines whether or not these attribute options +are visible to the customer on the front-end, as they shop on the online store. + +- {guilabel}`Visible`: the attribute values are visible to customers on the front-end. +- {guilabel}`Hidden`: the attribute values are hidden from customers on the front-end. + +Lastly, in the optional {guilabel}`eCommerce Category` field, select a category from a drop-down +menu to group similar attributes under the same section for added specificity and organization. + +:::{note} +To view the details related to the attribute category selected, click the internal link +{icon}`fa-arrow-right` {guilabel}`(right arrow)` icon to the far-right of the +{guilabel}`eCommerce Category` field, once an option has been selected. Doing so reveals that +attribute category's detail form. + +```{image} variants/attribute-category-internal-link.png +:align: center +:alt: A standard attribute category detail page accessible via its internal link arrow +: icon. +``` + +Here, the {guilabel}`Category Name` and {guilabel}`Sequence` is displayed at the top. Followed by +{guilabel}`Related Attributes` associated with the category. These attributes can be +dragged-and-dropped into a desirable order of priority. + +Attributes can be directly added to the category, as well, by clicking {guilabel}`Add a line`. +::: + +:::{tip} +To create an attribute category directly from this field, start typing the name of the new +category, then select either {guilabel}`Create` or {guilabel}`Create and edit...` from the +drop-down menu that appears. + +Clicking {guilabel}`Create` creates the category, which can be modified later. Clicking +{guilabel}`Create and edit...` creates the category and reveals a {guilabel}`Create Category` +pop-up window, in which the new attribute category can be configured and customized. +::: + +### Attribute values + +Attribute values should be added to the {guilabel}`Attribute Values` tab. Values can be added to an +attribute at any time, if needed. + +To add a value, click {guilabel}`Add a line` in the {guilabel}`Attribute Values` tab. + +Then, enter the name of the value in the {guilabel}`Value` column. Next, check the box in the +{guilabel}`Is custom value` column, if the value is custom (i.e. the customer gets to provide unique +specifications that are specific to this particular value). + +:::{note} +If the {guilabel}`Display Type` - {guilabel}`Color` option is selected, the option to add an HTML +color code will appear to the far-right of the value line, to make it easier for salespeople and +customers to know exactly what color option they're choosing. + +```{image} variants/attribute-value-add-a-line.png +:align: center +:alt: Attribute values tab when add a line is clicked, showing the custom columns. +``` + +To choose a color, click the blank circle in the {guilabel}`Color` column, which reveals an HTML +color selector pop-up window. + +```{image} variants/picking-a-color.png +:align: center +:alt: Selecting a color from the HTML color pop-up window that appears on attribute +: form. +``` + +In this pop-up window, select a specific color by dragging the color slider to a particular hue, +and clicking on the color portion directly on the color gradient window. + +Or, choose a specific color by clicking the *dropper* icon, and selecting a desired color that's +currently clickable on the screen. +::: + +:::{tip} +Attributes can also be created directly from the product template by adding a new line and +typing the name into the {guilabel}`Variants` tab. +::: + +Once an attribute is added to a product, that product is listed and accessible, via the attribute's +{guilabel}`Related Products` smart button. That button lists every product in the database currently +using that attribute. + +## Product variants + +Once an attribute is created, use the attribute (and its values) to create a product variant. To do +that, go to {menuselection}`Sales app --> Products --> Products`, and select an existing product to +view that desired product's form. Or, click {guilabel}`Create` to create a new product, to which a +product variant can be added. + +On the product form, click the {guilabel}`Attributes \& Variants` tab to view, manage, and modify +attributes and values for the product. + +```{image} variants/attributes-values-tab.png +:align: center +:alt: The attributes and values tab on a typical product form in Odoo Sales. +``` + +To add an attribute to a product, and subsequent attribute values, click {guilabel}`Add a line` in +the {guilabel}`Attributes \& Variants` tab. Then, choose the desired attribute from the drop-down +menu that appears. + +:::{tip} +Attributes can be created directly from the {guilabel}`Attributes \& Variants` tab of a product +form. To do that, start typing the name of the new attribute in the blank field, and select +either {guilabel}`Create` or {guilabel}`Create and edit...` from the mini drop-down menu that +appears. + +Clicking {guilabel}`Create` creates the attribute, which can be customized later. Clicking +{guilabel}`Create and edit...` creates the attribute, and a {guilabel}`Create Attribute` pop-up +form appears. In the pop-up form, proceed to modify the attribute in a number of ways. +::: + +Once an attribute is selected in the {guilabel}`Attribute` column, proceed to select the specific +attribute values to apply to the product, via the drop-down menu available in the {guilabel}`Values` +column. + +:::{note} +There is no limit to how many values can be added. +::: + +:::{tip} +Similar product variant creation processes are accessible through the Purchase, Inventory, and +eCommerce applications. +::: + +### Configure variants + +To the far-right of the attribute line is a {guilabel}`Configure` button. When clicked, Odoo reveals +a separate page showcasing those specific {guilabel}`Product Variant Values`. + +```{image} variants/product-variant-values.png +:align: center +:alt: The Product Variant Values page accessible via the Configure button on a product +: form. +``` + +Here, the specific {guilabel}`Value` name, {guilabel}`HTML Color Index` (if applicable), and +{guilabel}`Value Price Extra` are viewable. + +:::{note} +The {guilabel}`Value Price Extra` represents the increase in the sales price if the attribute is +selected. +::: + +When a value is clicked on the {guilabel}`Product Variant Values` page, Odoo reveals a separate +page, detailing that value's related details. + +```{image} variants/product-variant-value-page.png +:align: center +:alt: A Product Variant Values page accessible via the Product Variants Values general +: page. +``` + +On the specific product variant detail page, the {guilabel}`Value` and {guilabel}`Value Price Extra` +fields can be found, along with an {guilabel}`Exclude for` field. + +In the {guilabel}`Exclude for` field, different {guilabel}`Product Templates` and specific +{guilabel}`Attribute Values` can be added. When added, this specific attribute value will be +excluded from those specific products. + +### Variants smart button + +When a product has attributes and variants configured in its {guilabel}`Attributes \& Variants` tab, +a {guilabel}`Variants` smart button appears at the top of the product form. The {guilabel}`Variants` +smart button indicates how many variants are currently configured for that specific product. + +```{image} variants/variants-smart-button.png +:align: center +:alt: The variants smart button at the top of the product form in Odoo Sales. +``` + +When the {guilabel}`Variants` smart button is clicked, Odoo reveals a separate page showcasing all +the specific product variant combinations configured for that specific product. + +```{image} variants/variants-page.png +:align: center +:alt: The variants page accessible via the variants smart button on the product form +: in Odoo. +``` + +## Impact of variants + +In addition to offering more detailed product options to customers, product variants have their own +impacts that can be taken advantage of throughout the Odoo database. + +- {guilabel}`Barcode`: barcodes are associated with each variant, instead of the product template. + Each individual variant can have its own unique barcode/SKU. + +- {guilabel}`Price`: every product variant has its own public price, which is the sum of the + product template price *and* any extra charges for particular attributes. + + ```{eval-rst} + .. example:: + A red shirt's sales price is $23 -- because the shirt's template price is $20, plus an additional + $3 for the red color variant. Pricelist rules can be configured to apply to the product template, + or to the variant. + ``` + +- {guilabel}`Inventory`: inventory is counted for each individual product variant. On the product + template form, the inventory reflects the sum of all variants, but the actual inventory is + computed by individual variants. + +- {guilabel}`Picture`: each product variant can have its own specific picture. + +:::{note} +Changes to the product template automatically apply to every variant of that product. +::: + +:::{seealso} +{doc}`import` +::: + diff --git a/content/applications/sales/sales/products_prices/returns.md b/content/applications/sales/sales/products_prices/returns.md new file mode 100644 index 000000000..3242387a7 --- /dev/null +++ b/content/applications/sales/sales/products_prices/returns.md @@ -0,0 +1,124 @@ +# Returns and refunds + +The Odoo *Sales* app provides two different ways to process returns. The method used depends on +whether or not an invoice has been sent. + +## Before invoicing + +Returns are completed using *Reverse Transfers* when a customer decides to return a product +**before** an invoice has been sent or validated. + +:::{note} +In order to use *Reverse Transfers*, the *Inventory* app **must** be installed. +::: + +To start a return before invoicing, navigate to the {menuselection}`Sales` app, select the desired +sales order, and click on the {guilabel}`Delivery` smart button to open the associated delivery +order. + +```{image} returns/sales-order-delivery-smart-button.png +:align: center +:alt: A typical sales order with a highlighted delivery smart button in Odoo Sales. +``` + +On the validated delivery order, click {guilabel}`Return`. + +```{image} returns/validated-delivery-order-return-button.png +:align: center +:alt: A validated delivery order with a highlighted Return button in Odoo Sales. +``` + +This opens a {guilabel}`Reverse Transfer` pop-up window. + +By default, the {guilabel}`Quantity` matches the validated quantities from the delivery order. +Update the quantities, if necessary. Click on the {guilabel}`🗑️ (trash)` icon next to a line item +to remove it from the return. + +```{image} returns/reverse-transfer-popup.png +:align: center +:alt: The "Reverse Transfer" pop-up window, to make a return before invoicing the customer. +``` + +Next, click {guilabel}`Return` to confirm the return. This generates a new warehouse operation for +the incoming returned product(s). + +```{image} returns/warehouse-operation-confirmed-return.png +:align: center +:alt: Warehouse operation after a return has been confirmed in Odoo Sales. +``` + +Upon receiving the return, the warehouse team validates the warehouse operation by clicking +{guilabel}`Validate`. Then, on the original sales order, the {guilabel}`Delivered` quantity updates +to reflect the difference between the initial validated quantities and the returned quantities. + +```{image} returns/updated-sales-quantities.png +:align: center +:alt: The updated "Delivered" quantity on the sales order after the reverse transfer. +``` + +When an invoice is created, the customer receives an invoice **only** for the products they are +keeping, if any. + +## After invoicing + +Sometimes, customers return an item after they receive and/or pay for their invoice. In these +cases, a return using only *Reverse Transfers* is insufficient since validated, or sent, invoices +cannot be changed. + +However, *Reverse Transfers* can be used in conjunction with *Credit Notes* to complete the +customer's return. + +To start a return after invoicing, navigate to the relevant sales order in the +{menuselection}`Sales` app. + +If there is a payment registered on the sales order, the payment details appear in the chatter, and +the invoice (accessible through the {guilabel}`Invoices` smart button) has a green {guilabel}`In +Payment` banner. + +```{image} returns/green-in-payment-banner.png +:align: center +:alt: Sample of a green in payment banner in Odoo Sales. +``` + +From the sales order, click on the {guilabel}`Delivery` smart button to view the validated delivery +order. Then, click {guilabel}`Return` to open the {guilabel}`Reverse Transfer` pop-up window. + +Next, edit the {guilabel}`Product` and/or {guilabel}`Quantity`, as needed for the return. Then, +click {guilabel}`Return`. This generates a new warehouse operation for the incoming returned +product(s), which is validated by the warehouse team once the return is received by clicking +{guilabel}`Validate`. + +Then, on the sales order, the {guilabel}`Delivered` quantity updates to reflect the difference +between the initial validated quantities and the returned quantities. + +To process a refund, navigate to the relevant invoice (from the sales order, click on the +{guilabel}`Invoices` smart button). Then, click the {guilabel}`Credit Note` button at the top of the +validated invoice. + +```{image} returns/credit-note-button.png +:align: center +:alt: A typical customer invoice with a Credit Note button highlighted in Odoo Sales. +``` + +Doing so reveals a {guilabel}`Credit Note` pop-up form. + +```{image} returns/credit-note-pop-up-form.png +:align: center +:alt: Typical credit note pop-up form that appears in Odoo Sales. +``` + +Start by entering a {guilabel}`Reason displayed on Credit Note` and a specific {guilabel}`Journal` +to process the credit. Then, select a specific {guilabel}`Reversal Date`. + +After the information is filled in, click {guilabel}`Reverse` or {guilabel}`Reverse and Create +Invoice`. Then, edit the draft, if needed. + +Lastly, click {guilabel}`Confirm` to confirm the credit note. + +When complete, a blue banner reading: {guilabel}`You have outstanding credits for this customer. You +can allocate them to mark this invoice as paid.` appears at the top of the page. + +:::{seealso} +{doc}`../../../finance/accounting/customer_invoices/credit_notes` +::: + diff --git a/content/applications/sales/sales/send_quotations.md b/content/applications/sales/sales/send_quotations.md new file mode 100644 index 000000000..3e14a802c --- /dev/null +++ b/content/applications/sales/sales/send_quotations.md @@ -0,0 +1,20 @@ +--- +nosearch: true +--- + +# Send Quotations + +```{toctree} +:titlesonly: true + +send_quotations/create_quotations +send_quotations/quote_template +send_quotations/optional_products +send_quotations/get_signature_to_validate +send_quotations/get_paid_to_validate +send_quotations/deadline +send_quotations/different_addresses +send_quotations/orders_and_variants +send_quotations/pdf_quote_builder +``` + diff --git a/content/applications/sales/sales/send_quotations/create_quotations.md b/content/applications/sales/sales/send_quotations/create_quotations.md new file mode 100644 index 000000000..eb5df0600 --- /dev/null +++ b/content/applications/sales/sales/send_quotations/create_quotations.md @@ -0,0 +1,339 @@ +# Create quotations + +In Odoo **Sales**, quotations can be created and sent to customers. Once a quotation has been +confirmed, it officially turns into a *sales order*, which can then be invoiced and paid for. + +(sales-quotation-settings)= + +## Quotation settings + +To access these setting options, navigate to {menuselection}`Sales app --> Configuration --> +Settings`, and scroll to the {guilabel}`Quotations & Orders` section. + +```{image} create_quotations/quotations-orders-section.png +:align: center +:alt: The Quotations and Orders section on the Odoo Sales app Settings page. +``` + +- {guilabel}`Quotation Templates`: Enable this option to create quotation templates featuring + standard product offers, which are then selectable on quotation forms. When this checkbox is + ticked, an additional field, {guilabel}`Default Template`, appears, along with a link to the + {guilabel}`Quotation Templates` page. +- {guilabel}`Online Signature`: Request an online signature to confirm orders. +- {guilabel}`Online Payment`: Request an online prepayment from customers to confirm orders. Request + a full or partial payment (via down payment). When this checkbox is ticked, an additional field, + {guilabel}`Prepayment amount (%)`, appears. There is also a link to the {guilabel}`Payment + Providers` page. +- {guilabel}`Default Quotation Validity`: Determine a set amount (in {guilabel}`days`) that + quotations can remain valid for. +- {guilabel}`Default Recurrence`: Select a default period from the drop-down menu to use as a + recurrence period for a new quotation. +- {guilabel}`Sale Warnings`: Get warning messages about orders that include specific products or + customers. +- {guilabel}`PDF Quote builder`: Customize the look of quotations with header pages, product + descriptions, footer pages, and more. +- {guilabel}`Lock Confirmed Sales`: Ensure no further edits can be made to confirmed orders. +- {guilabel}`Pro-Forma Invoice`: Send pro-forma invoices to customers. + +To activate any of these settings, tick the checkbox beside the desired option(s). Then, click +{guilabel}`Save`. + +## Quotations dashboard + +The *Quotations* dashboard is the page that appears when the {menuselection}`Sales app` is opened. + +By default, the {guilabel}`Quotations` dashboard displays all quotations in the database related to +the current user, as indicated by the default {guilabel}`My Quotations` filter present in the search +bar. + +```{image} create_quotations/quotations-dashboard.png +:align: center +:alt: The Quotations dashboard present in the Odoo Sales application. +``` + +:::{note} +To view *all* quotations in the database, remove the {guilabel}`My Quotations` filter from the +search bar. +::: + +Quotations on this page appear in a default list view, but can also be viewed in a +{icon}`oi-view-kanban` {guilabel}`Kanban` view, {icon}`fa-calendar` {guilabel}`Calendar`, +{icon}`oi-view-pivot` {guilabel}`Pivot` table, {icon}`fa-area-chart` {guilabel}`Graph`, or +{icon}`fa-clock-o` {guilabel}`Activity` view. + +To view and/or modify any listed quotation from the {guilabel}`Quotations` dashboard, click on the +desired quotation line from the list, and Odoo reveals the specific form for that selected +quotation. + +## Create quotation + +To create a quotation, open the {menuselection}`Sales app`, and click the {guilabel}`New` button, +located in the upper-left corner of the main {guilabel}`Quotations` dashboard. + +:::{important} +The {guilabel}`New` button is **only** present if the {guilabel}`Quotations` dashboard is in list +or Kanban view. +::: + +Clicking the {guilabel}`New` button reveals a blank quotation form, with various fields and tabs to +configure. + +```{image} create_quotations/quotation-form.png +:align: center +:alt: A typical quotation form in the Odoo Sales application. +``` + +Begin by entering the customer's name in the {guilabel}`Customer` field at the top of the form. This +is a **required** field. + +If the customer's information is already in the database, the {guilabel}`Invoice Address` and +{guilabel}`Delivery Address` fields auto-populate with the saved information for those respective +fields, based on the data from that customer's contact record (found in the **Contacts** +application). + +If the customer was referred by another customer or contact, enter their name in the +{guilabel}`Referrer` field. + +If a {guilabel}`Referrer` is selected, a new field, {guilabel}`Commission Plan` appears, in which a +commission can be selected from the drop-down menu. This commission is rewarded to the contact +selected in the {guilabel}`Referrer` field. + +Next, if they have not already been auto-populated with the customer's information, enter the +appropriate addresses in the {guilabel}`Invoice Address` and {guilabel}`Delivery Address` fields. +Both of these fields are **required**. + +Then, if desired, choose a {guilabel}`Quotation Template` from the drop-down field to apply to this +quotation. It should be noted that some additional fields may appear, depending on the template +selected. + +The default date that appears in the {guilabel}`Expiration` field is based on the number configured +in the {ref}`Default Quotation Validity setting ` (in +{menuselection}`Sales app --> Configuration --> Settings`). + +:::{tip} +When using a quotation template, the date in the {guilabel}`Expiration` field is based off the +{guilabel}`Quotation Validity` figure on the template form. +::: + +If the quotation is for a recurring product or subscription, select the desired {guilabel}`Recurring +Plan` from that specific drop-down menu. + +If desired, select a specific {guilabel}`Pricelist` to be applied to this quotation. + +Lastly, select any specific {guilabel}`Payment Terms` to be used for this quotation. + +### Order Lines tab + +The first tab on the quotation form is the {guilabel}`Order Lines` tab. + +In this tab, select products, and quantities of those products, to add them to the quotation. + +There are two ways to add products to the quotation from this tab. + +Click {guilabel}`Add a product`, select the desired item from the {guilabel}`Product` drop-down +field, and proceed to adjust the quantity of that selected product, if necessary. + +Or, click {guilabel}`Catalog` to reveal a separate page, showcasing every item (and every potential +product variant) in an organized catalog display, with items organizable by {guilabel}`Product +Category` and {guilabel}`Attributes`. + +```{image} create_quotations/product-catalog.png +:align: center +:alt: A product catalog accessible via a quotation in the Odoo Sales application. +``` + +From here, simply locate the desired items, click the {icon}`fa-shopping-cart` {guilabel}`Add` +button on the product card, and adjust the quantity, if needed. When complete, click the +{guilabel}`Back to Quotation` button in the upper-left corner to return to the quotation, where the +newly-selected catalog items can be found in the {guilabel}`Order Lines` tab. + +If multiple items should be presented in a more organized way on the quotation, click {guilabel}`Add +a section`, enter a name for the section, and drag-and-drop that section heading in the desired +location amongst the items in the {guilabel}`Order Lines` tab. The section heading appears in bold. + +If needed, click {guilabel}`Add a note` beneath a certain product line to add a custom note about +that specific product. The note appears in italics. Then, if needed, proceed to drag-and-drop the +note beneath the desired product line. + +Beneath the product lines, there are buttons that can be clicked to apply any of the following: +{guilabel}`Coupon Code`, {guilabel}`Promotions`, {guilabel}`Discount`, and/or {guilabel}`Add +shipping`. + +:::{seealso} +- {doc}`../products_prices/ewallets_giftcards` +- {doc}`../products_prices/loyalty_discount` +- {doc}`../products_prices/prices/pricing` +::: + +### Optional Products tab + +Open the {guilabel}`Optional Products` tab to select related products that can be presented to the +customer, which may result in an increased sale. + +For example, if the customer wants to buy a car, an optional product that could be offered is a +*Trailer Hitch*. + +:::{seealso} +{doc}`optional_products` +::: + +### Other Info tab + +In the {guilabel}`Other Info` tab, there are various quotation-related configurations separated into +four different sections: {guilabel}`Sales`, {guilabel}`Delivery`, {guilabel}`Invoicing`, and +{guilabel}`Tracking`. + +:::{note} +Some fields **only** appear if specific settings and options have been configured. +::: + +#### Sales section + +In the {guilabel}`Sales` section of the {guilabel}`Other Info` tab, there are sales specific fields +that can be configured. + +```{image} create_quotations/other-info-sales.png +:align: center +:alt: The Sales section of the Other Info tab of a quotation form in Odoo Sales. +``` + +- {guilabel}`Salesperson`: Assign a salesperson from the drop-down menu to be associated with this + quotation. The user who originally created the quotation is selected in this field, by default. +- {guilabel}`Sales Team`: Assign a specific sales team to this quotation. If the selected + {guilabel}`Salesperson` is a member of a sales team, that team is auto-populated in the field. +- {guilabel}`Company`: Select a company from the drop-down menu this quotation should be associated + with. This field only appears when working in a multi-company environment. +- {guilabel}`Online signature`: Tick this checkbox to request an online signature from the customer + to confirm the order. This field only appears if the *Online Signature* setting has been enabled. +- {guilabel}`Online payment`: Tick this checkbox, and enter a desired percentage in the adjacent + field, to request an online payment from the customer (for that designated percentage of the total + amount) to confirm the order. This field only appears if the *Online Payment* setting has been + enabled. +- {guilabel}`Customer Reference`: Enter a custom reference ID for this customer. The entered + reference ID can contain letters, numbers, or a mix of both. +- {guilabel}`Tags`: Add specific tags to the quotation for added organization and enhanced + searchability in the Odoo **Sales** application. Multiple tags can be added, if necessary. + +#### Delivery section + +In the {guilabel}`Delivery` section of the {guilabel}`Other Info` tab, there are delivery-specific +fields that can be configured. + +```{image} create_quotations/other-info-delivery.png +:align: center +:alt: The Delivery section of the Other Info tab of a quotation form in Odoo Sales. +``` + +- {guilabel}`Shipping Weight`: Displays the weight of the items being shipped. This field is not + modifiable. Product weight is configured on individual product forms. +- {guilabel}`Incoterm`: Select an Incoterm (International Commerical Term) to use as predefined + commerical terms for international transactions. +- {guilabel}`Incoterm Location`: If an Incoterm is being used, enter the international location in + this field. +- {guilabel}`Shipping Policy`: Select a desired shipping policy from the drop-down menu. If all + products are delivered at once, the delivery order is scheduled, based on the greatest product + lead time. Otherwise, it is based on the shortest lead time. The available options are: + {guilabel}`As soon as possible` or {guilabel}`When all products are ready`. +- {guilabel}`Delivery Date`: Click into the empty field to reveal a calendar popover, from which a + customer delivery date can be selected. If no custom date is required, refer to the + {guilabel}`Expected` date listed to the right of that field. + +#### Invoicing section + +In the {guilabel}`Invoicing` section of the {guilabel}`Other Info` tab, there are invoicing specific +fields that can be configured. + +```{image} create_quotations/other-info-invoicing.png +:align: center +:alt: The Invoicing section of the Other Info tab of a quotation form in Odoo Sales. +``` + +- {guilabel}`Fiscal Position`: Select a fiscal position to be used to adapt taxes and accounts for + particular customers or sales orders/invoices. The default value comes from the customer. If a + selection is made in this field, an {icon}`fa-refresh` {guilabel}`Update Taxes` clickable link and + icon appear. When clicked, the taxes for this partiuclar customer and quotation are updated. A + confirmation window appears, as well. +- {guilabel}`Analytic Account`: Select an analytic account to apply to this customer/quotation. + +#### Tracking section + +In the {guilabel}`Tracking` section of the {guilabel}`Other Info` tab, there are tracking specific +fields that can be configured. + +```{image} create_quotations/other-info-tracking.png +:align: center +:alt: The Tracking section of the Other Info tab of a quotation form in Odoo Sales. +``` + +- {guilabel}`Source Document`: Enter the reference of the document that generated the + quotation/sales order, if applicable. +- {guilabel}`Opportunity`: Select the specific opportunity (from the **CRM** app) related to this + quotation, if applicable. +- {guilabel}`Campaign`: Select the marketing campaign related to this quotation, if applicable. +- {guilabel}`Medium`: Select the method by which this quotation originated (e.g. *Email*), if + applicable. +- {guilabel}`Source`: Select the source of the link used to generate this quotation (e.g. + *Facebook*), if applicable. + +:::{seealso} +{doc}`../../../websites/website/reporting/link_tracker` +::: + +### Notes tab + +In the {guilabel}`Notes` tab of the quotation form, enter any specific internal notes about the +quotation and/or customer, if desired. + +## Sending and confirming quotations + +Once all the necessary fields and tabs have been configured, it is time to send the quotation to the +customer for confirmation. Upon confirmation, the quotation turns into an official sales order. + +At the top of the form, there is a series of buttons: + +- {guilabel}`Send by Email`: When clicked, a pop-up window appears with the customer's name and + email address in the {guilabel}`Recipients` field, the quotation (and reference ID) in the + {guilabel}`Subject` field, and a brief default message in the body of the email, which can be + modified, if needed. + + Below that, a PDF copy of the quotation is attached. When ready, click {guilabel}`Send` to send + the quotation, via email, to the customer, so they can review and confirm it. + +- {guilabel}`Send PRO-FORMA Invoice`: This button **only** appears if the *Pro-Forma Invoice* + setting has been enabled. When clicked, a pop-up window appears with the customer's name and email + address in the {guilabel}`Recipients` field, the *Proforma* invoice (and reference ID) in the + {guilabel}`Subject` field, and a brief default message in the body of the email, which can be + modified, if needed. + + Below that, a PDF copy of the quotation is attached. When ready, click {guilabel}`Send` to send + the quotation, via email, to the customer, so they can review and confirm it. + +- {guilabel}`Confirm`: When clicked, the quotation is confirmed, and the status changes to + {guilabel}`Sales Order`. + +- {guilabel}`Preview`: When clicked, Odoo reveals a preview of the quotation the customer sees when + they log into their customer portal. Click the {icon}`fa-arrow-right` {guilabel}`Back to edit + mode` link at the top of the preview page, in the blue banner, to return to the quotation form. + +- {guilabel}`Cancel`: When clicked, the quotation is canceled. + +:::{note} +If the *Lock Confirmed Sales* setting is enabled, the sales order becomes {guilabel}`Locked`, and +is indicated as such on the sales order form. +::: + +At this point, the quotation has been confirmed, turned into a sales order, and is now ready to be +invoiced and paid for. + +For more information about invoicing, refer to the {doc}`Invoice based on delivered or ordered +quantities <../invoicing/invoicing_policy>` + +:::{seealso} +- {doc}`quote_template` +- {doc}`deadline` +- {doc}`get_signature_to_validate` +- {doc}`get_paid_to_validate` +- {doc}`pdf_quote_builder` +- {doc}`../invoicing/proforma` +::: + diff --git a/content/applications/sales/sales/send_quotations/deadline.md b/content/applications/sales/sales/send_quotations/deadline.md new file mode 100644 index 000000000..d56bd9756 --- /dev/null +++ b/content/applications/sales/sales/send_quotations/deadline.md @@ -0,0 +1,58 @@ +# Quotation deadlines + +In the Odoo *Sales* application, it is possible to set deadlines on sales quotations. Doing so +encourages customers to act quickly during sales negotiations, for they might fear for missing out +on a good deal. As well, deadlines also can also act as protection for a company in case an order +has to be fulfilled at a price that is no longer profitable for the business. + +## Quotation expiration + +In Odoo *Sales*, there's the option to add an expiration date to a quotation. + +To add an expiration date to a quotation, navigate to {menuselection}`Sales app`, and select a +desired quotation, or create a new one by clicking {guilabel}`New`. + +On the quotation form, click the {guilabel}`Expiration` field to reveal a pop-up calendar. From this +pop-up calendar, select the desired month and date as the expiration date for the quotation. + +```{image} deadline/quotation-deadlines-expiration-field.png +:align: center +:alt: The expiration field on a standard quotation form in Odoo Sales. +``` + +:::{tip} +By clicking the {guilabel}`Preview` button on a quotation, Odoo clearly displays when that +specific offer expires. + +```{image} deadline/quotation-deadlines-preview.png +:align: center +:alt: How customers will see deadlines on Odoo Sales. +``` +::: + +## Quotation template expiration + +The Odoo *Sales* application also makes it possible to add a deadline expiration date to quotation +templates. + +To add a deadline expiration date to a quotation template, navigate to {menuselection}`Sales app --> +Configuration --> Quotation Templates`, and either select the desired quotation template to which a +deadline should be added, or click {guilabel}`New` to build a new quotation template from scratch. + +On the quotation template form, add a specific number of days to the {guilabel}`Quotation expires +after` field, located beneath the quotation template name. The number of days represents how long +the quotation will be valid for, before it expires. + +```{image} deadline/quotation-deadlines-expires-after.png +:align: center +:alt: The quotation expires after field on a quotation template form in Odoo Sales. +``` + +Then, whenever that specific quotation template is used in a quote, an expiration date is +automatically calculated, based on the number of days designated above. However, this date can be +overwritten before sending the quotation to the customer. + +:::{seealso} +{doc}`/applications/sales/sales/send_quotations/quote_template` +::: + diff --git a/content/applications/sales/sales/send_quotations/different_addresses.md b/content/applications/sales/sales/send_quotations/different_addresses.md new file mode 100644 index 000000000..fe34bd2b4 --- /dev/null +++ b/content/applications/sales/sales/send_quotations/different_addresses.md @@ -0,0 +1,82 @@ +# Deliveries and invoices to different addresses + +People and businesses often use separate addresses for billing (invoicing) and shipping (delivery) +purposes. With the Odoo *Sales* app, contacts can have different specified addresses for delivery +and invoicing. + +## Settings + +To properly utilize multiple addresses in Odoo, go to {menuselection}`Accounting app --> +Configuration --> Settings`, and scroll down to the {guilabel}`Customer Invoices` heading. Then, +tick the checkbox. + +```{image} different_addresses/customer-addresses-setting.png +:align: center +:alt: Activate the Customer Addresses setting. +``` + +(sales-send-quotations-contact-form-config)= + +## Contact form configuration + +To add multiple addresses to a contact, go to {menuselection}`Sales app --> Orders --> Customers`, +and clear any default filters from the search bar. Then, click on the desired customer to open their +contact form. + +:::{tip} +Contact forms can be accessed in the *Contacts* application, as well. +::: + +From the contact form, click {guilabel}`Edit`, and then select {guilabel}`Add`, which is located +under the {guilabel}`Contacts & Addresses` tab. Doing so reveals a {guilabel}`Create Contact` pop-up +form, in which additional addresses can be configured. + +```{image} different_addresses/contact-form-add-address.png +:align: center +:alt: Add a contact/address to the contact form. +``` + +On the {guilabel}`Create Contact` pop-up form, start by clicking the default {guilabel}`Other +Address` field to reveal a drop-down menu of address-related options. + +Select any of the following options: + +- {guilabel}`Contact`: adds another contact to the existing contact form. +- {guilabel}`Invoice Address`: adds a specific invoice address to the existing contact form. +- {guilabel}`Delivery Address`: adds a specific delivery address to the existing contact form. +- {guilabel}`Other Address`: adds an alternate address to the existing contact form. +- {guilabel}`Private Address`: adds a private address to the existing contact form. + +Once an option is selected, proceed to enter the corresponding contact information that should be +used for the specified address type. + +```{image} different_addresses/create-contact-window.png +:align: center +:alt: Create a new contact/address on a contact form. +``` + +Then, click {guilabel}`Save & Close` to save the address and close the {guilabel}`Create Contact` +window. Or, click {guilabel}`Save & New` to save the address and immediately input another one. + +## Address added to quotations + +When a customer is added to a quotation, the {guilabel}`Invoice Address` and {guilabel}`Delivery +Address` fields autopopulate with the corresponding addresses specified on the customer's contact +form. + +```{image} different_addresses/quotation-address-autopopulate.png +:align: center +:alt: Invoice and Delivery Addresses autopopulate on a quotation. +``` + +The {guilabel}`Invoice Address` and {guilabel}`Delivery Address` can also be edited directly from +the quotation by clicking the {guilabel}`Edit` button, and then clicking the {guilabel}`➡️ (right +arrow)` internal link buttons next to each address line. + +These addresses can be updated at any time to ensure accurate invoicing and delivery. + +:::{tip} +If any changes are made on a form in Odoo, include *Contacts* forms, remember to click +{guilabel}`Save` to save the changes to the database. +::: + diff --git a/content/applications/sales/sales/send_quotations/get_paid_to_validate.md b/content/applications/sales/sales/send_quotations/get_paid_to_validate.md new file mode 100644 index 000000000..df68f8899 --- /dev/null +++ b/content/applications/sales/sales/send_quotations/get_paid_to_validate.md @@ -0,0 +1,98 @@ +# Online payment order confirmation + +The Odoo *Sales* application provides customers with the ability to confirm orders, via an online +payment, directly on a sales order. Once the sales order is electronically paid for by the customer, +the salesperson attached to the sales order is instantly notified that the order is confirmed. + +## Activate online payments + +In order to have customers confirm orders with an online payment, the *Online Payment* setting +**must** be activated. + +To activate the *Online Payment* feature, go to {menuselection}`Sales app --> Configuration --> +Settings`, scroll to the {guilabel}`Quotations \& Orders` heading, check the box next to the +{guilabel}`Online Payment` feature, and click {guilabel}`Save`. + +```{image} get_paid_to_validate/online-payment-setting.png +:align: center +:alt: The online payment setting in the Odoo Sales application. +``` + +Beneath the {guilabel}`Online Payment` option on the *Sales* {guilabel}`Settings` page, there's a +{guilabel}`Default Quotation Validity` field. In this field, there's the option to add a specific +number of days for quotations to remain valid by default. + +To enable this feature on a standard quotation, click the checkbox for the {guilabel}`Payment` +feature option, located in the {guilabel}`Online confirmation` field, on the {guilabel}`Other Info` +tab. + +```{image} get_paid_to_validate/online-payment-option-quotation.png +:align: center +:alt: The online payment setting on a standard quotation in Odoo Sales. +``` + +To enable this feature on a quotation template, click the checkbox for the {guilabel}`Payment` +feature option, located in the {guilabel}`Online confirmation` field of the quotation template form. + +```{image} get_paid_to_validate/online-payment-option-quotation-template.png +:align: center +:alt: The online payment setting on quotation template forms in Odoo Sales. +``` + +## Payment providers + +After activating the {guilabel}`Online Payment` feature, a link to configure {guilabel}`Payment +Providers` appears beneath it. + +Clicking that link reveals a separate {guilabel}`Payment Providers` page, in which a large variety +of payment providers can be enabled, customized, and published. + +```{image} get_paid_to_validate/payment-providers-page.png +:align: center +:alt: Payment providers page in Odoo Sales. +``` + +:::{seealso} +{doc}`../../../finance/payment_providers` +::: + +## Register a payment + +After opening quotations in their customer portal, customers can click {guilabel}`Accept \& Pay` to +confirm their order with an online payment. + +```{image} get_paid_to_validate/accept-and-pay-button.png +:align: center +:alt: The accept and pay button on an online quotation in Odoo Sales. +``` + +After clicking {guilabel}`Accept \& Pay`, customers are presented with {guilabel}`Validate Order` +pop-up window containing different options for them to make online payments, in the {guilabel}`Pay +with` section. + +```{image} get_paid_to_validate/validate-order-pay-with.png +:align: center +:alt: How to register a payment on a validate order pop-up window in Odoo Sales. +``` + +:::{note} +Odoo will **only** offer payment options on the {guilabel}`Validate Order` pop-up window that +have been published and configured on the {guilabel}`Payment Providers` page. +::: + +Once the customer selects their desired method of payment, they will click the {guilabel}`Pay` +button on the pop-up window to confirm the order. Odoo instantly notifies the assigned salesperson +upon order confirmation with an online payment. + +```{image} get_paid_to_validate/payment-confirmation-notification-chatter.png +:align: center +:alt: Sample of notification that appears in the chatter when an online payment is +: made. +``` + +:::{seealso} +- {doc}`quote_template` +- {doc}`get_signature_to_validate` +- {doc}`../../../finance/payment_providers` +::: + diff --git a/content/applications/sales/sales/send_quotations/get_signature_to_validate.md b/content/applications/sales/sales/send_quotations/get_signature_to_validate.md new file mode 100644 index 000000000..9ab44abb7 --- /dev/null +++ b/content/applications/sales/sales/send_quotations/get_signature_to_validate.md @@ -0,0 +1,84 @@ +# Online signatures for order confirmations + +The Odoo *Sales* application provides customers with the ability to confirm orders, via an online +signature, directly on the sales order. Once the sales order is electronically signed by the +customer, the salesperson attached to the sales order is instantly notified that the order is +confirmed. + +## Activate online signatures + +In order to have customers confirm orders with an online signature, the *Online Signature* feature +**must** be activated. + +To activate the *Online Signature* feature, go to {menuselection}`Sales app --> Configuration --> +Settings`, scroll to the {guilabel}`Quotations \& Orders` heading, and activate the +{guilabel}`Online Signature` feature by checking the box beside it. + +```{image} get_signature_to_validate/signature-setting.png +:align: center +:alt: The Online Signature feature option in the Settings of the Odoo Sales application. +``` + +Then, click the {guilabel}`Save` button in the top-left corner. + +:::{note} +When making a quotation template, the online signature feature is the {guilabel}`Signature` +option, located in the {guilabel}`Online confirmation` field of the quotation template form. + +```{image} get_signature_to_validate/signature-feature-quotation-template.png +:align: center +:alt: The Online confirmation signature option found on every quotation template in +: Odoo. +``` + +On standard quotations, the online signature feature is the {guilabel}`Signature` option, located +under the {guilabel}`Other Info` tab of the quotation form. + +```{image} get_signature_to_validate/signature-other-info-tab.png +:align: center +:alt: The online signature feature option in the Other Info tab of a quotation form +: in Odoo. +``` +::: + +## Order confirmations with online signatures + +When clients access quotations online through their customer portal, there's a {guilabel}`Sign \& +Pay` button directly on the quotation. + +```{image} get_signature_to_validate/sign-and-pay-button.png +:align: center +:alt: The Sign and Pay button present on online quotations in Odoo Sales. +``` + +When clicked, a {guilabel}`Validate Order` pop-up window appears. In this pop-up window, the +{guilabel}`Full Name` field is auto-populated, based on the contact information in the database. + +```{image} get_signature_to_validate/validate-order-popup.png +:align: center +:alt: The Validate Order pop-up window for online signatures in Odoo Sales. +``` + +Then, customers have the option to enter an online signature with any of the following options: +{guilabel}`Auto`, {guilabel}`Draw`, or {guilabel}`Load`. + +{guilabel}`Auto` lets Odoo automatically generate an online signature based on the information in +the {guilabel}`Full Name` field. {guilabel}`Draw` lets the customer use the cursor to create a +custom signature directly on the pop-up window. And {guilabel}`Load` lets the customer upload a +previously-created signature file from their computer. + +After the customer has chosen any of the three previously mentioned signature options +({guilabel}`Auto`, {guilabel}`Draw`, or {guilabel}`Load`), they will click the {guilabel}`Accept \& +Sign` button. + +When {guilabel}`Accept \& Sign` is clicked, the various payment method options become available for +them to choose from (if the *online payment* option applies to this quotation). + +Then, when the quotation is paid and confirmed, a delivery order is automatically created (if the +Odoo *Inventory* app is installed). + +:::{seealso} +- {doc}`quote_template` +- {doc}`get_paid_to_validate` +::: + diff --git a/content/applications/sales/sales/send_quotations/optional_products.md b/content/applications/sales/sales/send_quotations/optional_products.md new file mode 100644 index 000000000..88ecd348f --- /dev/null +++ b/content/applications/sales/sales/send_quotations/optional_products.md @@ -0,0 +1,105 @@ +# Optional products + +The use of optional products is a marketing strategy that involves the cross-selling of products +along with a core product. The aim is to offer useful and related products to customers, which may +result in an increased sale. + +For instance, if a customer wants to buy a car, they have the choice to order massaging seats, as +well, or ignore the offer and simply buy the car. Presenting the choice to purchase optional +products enhances the customer experience. + +## Optional products on quotations + +With the Odoo *Sales* application, it is possible to add or modify optional products directly on +quotations by navigating to the {guilabel}`Optional Products` tab on a quotation form. + +```{image} optional_products/optional-products-tab.png +:align: center +:alt: How to add optional products to your quotations on Odoo Sales. +``` + +To add an optional product(s) to a quotation, click {guilabel}`Add a product` in the +{guilabel}`Optional Products` tab of a quotation. Doing so reveals a blank field in the +{guilabel}`Product` column. + +When clicked, a drop-down menu with products from the database appear. Select the desired product +from the drop-down menu to add it as an optional product to the quotation template. + +:::{tip} +If the desired product isn't readily visible, type the name of the desired product in the field, +and the option appears in the drop-down menu. Then, select that desired product to add it to the +quotation. +::: + +:::{note} +When a product is added, the default {guilabel}`Quantity` is `1`, but that can be edited at any +time. +::: + +To delete any line item from the {guilabel}`Optional Products` tab, click the {guilabel}`🗑️ (trash +can)` icon. + +Click the {guilabel}`Preview` button, located in the upper-left corner of the quotation, to reveal a +preview of the quotation customers would receive, via email, along with the optional products they +can potentially add to their order, located in the {guilabel}`Options` section. + +```{image} optional_products/optional-products-checkout.png +:align: center +:alt: Preview your quotations on Odoo Sales. +``` + +Customers are able to add different optional products to an order by clicking the {guilabel}`🛒 +(shopping cart)` icon, located to the right of the optional product line. + +If a customer selects optional products, these are automatically added to the quotation managed by +the salesperson. + +When the customer adds an optional product(s) to an order, the salesperson is instantly notified +about the change, along with any other change the customer makes to an order. This allows +salespeople to stay up-to-date with everything related to an order in the backend of the *Sales* +application. + +## Optional products on quotation templates + +:::{note} +Be sure to review the {doc}`quote_template` documentation to better understand how quotation +templates work before reading the following information. +::: + +For quotation templates, just like a typical quotation form, there is also an {guilabel}`Optional +Products` tab, wherein related products or services can be added to a quotation template. + +To add optional products to a quotation template, navigate to {menuselection}`Sales app --> +Configuration --> Quotation Templates`. Then, either select an existing quotation template to edit, +or create a new one by clicking {guilabel}`New`. + +On the quotation template form, click the {guilabel}`Optional Products` tab. Under the +{guilabel}`Optional Products` tab, click {guilabel}`Add a line`, and select the desired product to +add as an optional product to the quotation template. + +```{image} optional_products/optional-products-tab-quotation-template.png +:align: center +:alt: Preview your quotations on Odoo Sales. +``` + +The products added in the {guilabel}`Optional Products` tab are present in the quotation, by +default, whenever that particular quotation template is used. These products can be removed, and +additional products can be added, before the quotation is sent to a customer. + +:::{tip} +It's best to offer optional products that would encourage a customer to add additional items to +their order, or entice them to purchase a more expensive version of their initially selected +product. + +For example, if a customer purchases a wooden chair, some optional products could be: a warranty +on that chair and/or a wooden chair with leather seats. +::: + +:::{note} +There is no limit to how many optional products can be added to a quotation template. +::: + +:::{seealso} +{doc}`quote_template` +::: + diff --git a/content/applications/sales/sales/send_quotations/orders_and_variants.md b/content/applications/sales/sales/send_quotations/orders_and_variants.md new file mode 100644 index 000000000..45fd850e1 --- /dev/null +++ b/content/applications/sales/sales/send_quotations/orders_and_variants.md @@ -0,0 +1,122 @@ +# Product variants on quotations and sales orders + +Before getting into detail about how to use product variants on quotations and sales orders, it's +recommended to learn about {doc}`../products_prices/products/variants` in Odoo. + +Once familiarized with the basics surrounding product variants, the following covers how product +variants can be added to quotations and sales orders using the *product configurator* or *order grid +entry*. + +:::{note} +It should be noted that the setting is titled, *Variant Grid Entry* on the *Sales* app settings +page, and titled, *Order Grid Entry* on product forms. So, be sure to keep that in mind. +::: + +## Settings + +When working with product variants, Odoo uses the product configurator, by default. To add the +variant grid entry option, that feature **must** be enabled in the Odoo *Sales* application. The +variant grid entry option provides a pop-up window on the quotation/sales order to simplify the +variant selection process. + +To enable that setting, go to {menuselection}`Sales app --> Configuration --> Settings`, and scroll +to the {guilabel}`Product Catalog` section. Then, check the box next to the {guilabel}`Variant Grid +Entry` option, and click {guilabel}`Save`. + +```{image} orders_and_variants/order-grid-entry-setting.png +:align: center +:alt: The variant grid entry setting in the Odoo Sales application. +``` + +:::{note} +Of course, the {guilabel}`Variants` feature **must** also be activated, in order to use product +variants on quotations and sales orders. +::: + +## Product configuration + +Once the {guilabel}`Variant Grid Entry` setting is enabled, both options (*Product Configurator* and +*Order Grid Entry*) become available on every product form. + +To configure a product form to use either a product configurator or variant grid entry, start by +navigating to {menuselection}`Sales app --> Products --> Products` to view all the products in the +database. + +Then, select the desired product to configure, or click {guilabel}`New`, to create a new product +from scratch. Once on the product form, click into the {guilabel}`Attributes \& Variants` tab, where +product variants can be viewed, modified, and added. + +At the bottom of the {guilabel}`Attributes \& Variants` tab, there is a {guilabel}`Sales Variant +Selection` section with two options: {guilabel}`Product Configurator` and {guilabel}`Order Grid +Entry`. + +:::{note} +It should be noted that these options **only** appear if at least two values of an attribute have +been added to the record. +::: + +```{image} orders_and_variants/attributes-variants-tab-selection-options.png +:align: center +:alt: Sales variant selection options on the attributes and variants tab on product +: form. +``` + +These options determine which method is used when adding product variants to quotations or sales +orders. + +The {guilabel}`Product Configurator` provides a pop-up window that neatly displays all the available +product variants for that particular product when it's added to a quotation. However, only one +variant can be selected/added at a time. + +The {guilabel}`Order Grid Entry` provides the same information as the {guilabel}`Product +Configurator` in a table layout, allowing the user to select larger numbers of unique product +variants, and add them to a quotation/sales order, in a single view. + +## Product configurator + +The product configurator feature appears as a {guilabel}`Configure` pop-up window, as soon as a +product with (at least two) variants is added to a quotation or sales order, but **only** if the +{guilabel}`Product Configurator` option is selected on its product form. + +```{image} orders_and_variants/product-configurator-window.png +:align: center +:alt: The product configurator pop-up window that appears on a quotation or sales order. +``` + +:::{note} +This {guilabel}`Configure` pop-up window also appears if the {guilabel}`Order Grid Entry` setting +is **not** activated, as it is the default option Odoo uses when dealing with product variants on +quotations and/or sales orders. +::: + +The {guilabel}`Product Configurator` option lets salespeople choose exactly which product variant to +add to the quotation or sales order using a format similar to online shopping. + +## Order grid entry + +The order grid entry feature appears as a {guilabel}`Choose Product Variants` pop-up window, as soon +as a product with (at least two) variants is added to a quotation or sales order, but **only** if +the {guilabel}`Order Grid Entry` option is selected on its product form. + +```{image} orders_and_variants/choose-product-variants-popup.png +:align: center +:alt: The choose product variants pop-up window that appears on a quotation in Odoo. +``` + +The {guilabel}`Choose Product Variants` pop-up window features all the variant options for that +particular product. From this pop-up window, the salesperson can designate how many of each variant +they'd like to add to the quotation/sales order at once. + +When all the desired quantities and variants have been selected, the salesperson simply clicks +{guilabel}`Confirm`, and those orders are instantly added to the quotation/sales order in the +{guilabel}`Order Lines` tab. + +```{image} orders_and_variants/order-grid-entry-order-lines-tab.png +:align: center +:alt: Populated order lines tab after order grid entry has been chosen to select products. +``` + +:::{seealso} +{doc}`../products_prices/products/variants` +::: + diff --git a/content/applications/sales/sales/send_quotations/pdf_quote_builder.md b/content/applications/sales/sales/send_quotations/pdf_quote_builder.md new file mode 100644 index 000000000..f39f44193 --- /dev/null +++ b/content/applications/sales/sales/send_quotations/pdf_quote_builder.md @@ -0,0 +1,286 @@ +# PDF quote builder + +The *PDF Quote Builder* in Odoo *Sales* provides the opportunity to send customers a fully +customized PDF file for quotes, showcasing the company and products, with various information and +design elements, instead of just showing the price and total. + +The PDF Quote Builder groups header pages, product descriptions, the price(s), and footer pages to +create a detailed quote. It can also inject dynamic texts or custom notes in the PDF to personalize +the offer for the customer. + +Having a customized PDF in quotes provides a heightened conclusion to the shopping experience for +customers, and adds an elegant level of professionalism to a company. + +:::{seealso} +[Odoo Quick Tips - Create a PDF quote [video]](https://www.youtube.com/watch?v=tQNydBZt-VI) +::: + +:::{note} +It is recommended to edit PDF forms with Adobe software. The form fields on the header and footer +PDF templates are necessary to get dynamic values with Odoo. +::: + +## Configuration + +In order to add custom PDF files for quotes, the {guilabel}`PDF Quote builder` feature *must* be +configured. + +To do that, navigate to {menuselection}`Sales app --> Configuration --> Settings`. Then, on the +{guilabel}`Settings` page, scroll to the {guilabel}`Quotations & Orders` section, and locate the +{guilabel}`PDF Quote builder` feature. + +## Add PDF as Header/Footer + +In Odoo *Sales*, it's possible to add a custom PDF that can be used either as a header or a footer. +When the PDF quote builder is activated in a quotation, you can then select as many headers and +footers as you wish to use, these PDF will then also be inserted in the final PDF. + +To add a custom PDF as header or footer, start by navigating to +{menuselection}`Sales app --> Configuration --> Headers/Footers`. From this page, either click +{guilabel}`New` or {guilabel}`Upload`. + +Clicking {guilabel}`Upload` instantly provides the opportunity to upload the desired document. Then, +the document can be further configured on the document card, or by clicking the three dots icon in +the top right corner of the document card, and then clicking {guilabel}`Edit`. + +Clicking {guilabel}`New` reveals a blank documents form, in which the desired PDF can be uploaded +via the {guilabel}`Upload your file` button on the form, located in the {guilabel}`File Content` +field. + +Various information and configurations related to the uploaded document can be modified here. + +The first field on the documents form is for the {guilabel}`Name` of the document, and it is +grayed-out (not clickable) until a document is uploaded. Once a PDF has been uploaded, the +{guilabel}`Name` field is auto-populated with the name of the PDF, and it can then be edited. + +Then, in the {guilabel}`Document Type` field, click the drop-down menu, and select either: +{guilabel}`Header`, or {guilabel}`Footer` to define whether these files would be selectable to be at +the beginning or at the end of your quote. + +Under this, in the {guilabel}`Quotation Templates` section, you can restrict this PDF to some quotation +templates only. + +:::{note} +Alternatively, you can also navigate to +{menuselection}`Sales app --> Configuration --> Quotation Templates`, select a template and +directly {guilabel}`Add` or {guilabel}`Upload` a PDF to it in the {guilabel}`Quote Builder` tab. +::: + +Lastly, beside the {guilabel}`File Content` field, you have the possibility to +{guilabel}`Configure dynamic fields`. + +## Dynamic text in PDFs + +While creating custom PDFs for quotes, use *dynamic text* for Odoo to auto-fill the PDF content with +information related to the quote from the Odoo database, like names, prices, etc. + +Dynamic text values are form components (text inputs) that can be added in a PDF file, and Odoo +automatically fills those values in with information related to the quote. + +### Dynamic text values + +Below are common dynamic text values used in custom PDFs that are already mapped to the correct +fields, and what they represent. + +For headers and footers PDF: + +- {guilabel}`name`: Sales Order Reference +- {guilabel}`partner_id__name`: Customer Name +- {guilabel}`user_id__name`: Salesperson Name +- {guilabel}`amount_untaxed`: Untaxed Amount +- {guilabel}`amount_total`: Total Amount +- {guilabel}`delivery_date`: Delivery Date +- {guilabel}`validity_date`: Expiration Date +- {guilabel}`client_order_ref`: Customer Reference + +For product PDF: + +- {guilabel}`description`: Product Description +- {guilabel}`quantity`: Quantity +- {guilabel}`uom`: Unit of Measure (UoM) +- {guilabel}`price_unit`: Price Unit +- {guilabel}`discount`: Discount +- {guilabel}`product_sale_price`: Product List Price +- {guilabel}`taxes`: Taxes name joined by a comma (`,`) +- {guilabel}`tax_excl_price`: Tax Excluded Price +- {guilabel}`tax_incl_price`: Tax Included Price + +After uploading a PDF, you can then {guilabel}`Configure dynamic fields`. This will allow you to map +any field name found in your PDF to the field you want to show by writing down any existing path. +Headers and footers starts from the current {guilabel}`sale_order` model, whereas product document +follows their path from their {guilabel}`sale_order_line`. +Leaving that path empty allows you to fill a custom notes, directly from the specific quote that +requires it. + +```{eval-rst} +.. example:: + When a PDF is built, it's best practice to use common dynamic text values (:guilabel:`name` and + :guilabel:`partner_id_name`). When uploaded into the database, Odoo auto-populates those fields + with the information from their respective fields. + + In this case, Odoo would auto-populate the Sales Order Reference in the :guilabel:`name` dynamic + text field, and the Customer Name in the :guilabel:`partner_id_name` field. + + .. image:: pdf_quote_builder/pdf-quote-builder-sample.png + :align: center + :alt: PDF quote being built using common dynamic placeholders. +``` + +Once the PDF file(s) are complete, save them to the computer's hard drive, and proceed to upload +them to Odoo via {menuselection}`Sales app --> Configuration --> Headers/Footers`. + +```{eval-rst} +.. example:: + When uploading PDF containing the form field :guilabel:`invoice_partner_country`, which is an + information available in the sales order, configure the :guilabel:`path` of the + :guilabel:`Form Field Name` to: + - :guilabel:`partner_invoice_id.country_id.name` for a header or footer document + - :guilabel:`order_id.partner_invoice_id.country_id.name` for a product document + fills the form with the invoice partner country's name when the PDF is built. +``` + +```{eval-rst} +.. example:: + When uploading any PDF containing the form field :guilabel:`custom_note`, leaving the + :guilabel:`path` empty allows the seller to write down any note where that form field is in that + document and shown when the PDF is built. +``` + +## Add PDF to product + +In Odoo *Sales*, it's also possible to add a custom PDF to a product form. When a PDF is added to a +product, and that product is used in a quotation, that PDF is also inserted in the final PDF. + +To add a custom PDF to a product, start by navigating to {menuselection}`Sales app --> Products --> +Products`, and select the desired product to which a custom PDF should be added. + +:::{note} +A document could also be added to a product variant, instead of a product. If there are documents +on a product *and* on its variant, **only** the documents in the variant are shown. + +To add a custom document to a product variant, navigate to {menuselection}`Sales app --> Products +--> Product Variants`. Select the desired variant, click the {guilabel}`Documents` smart button, +and proceed to upload the custom document(s) to the specific product variant. +::: + +On the product page, click the {guilabel}`Documents` smart button at the top of the page. + +```{image} pdf_quote_builder/documents-smart-button.png +:align: center +:alt: The Documents smart button on a product form in Odoo Sales. +``` + +Doing so reveals a separate {guilabel}`Documents` page for that product, wherein files related to +that product can be uploaded. From this page, either click {guilabel}`New` or {guilabel}`Upload`. + +Clicking {guilabel}`Upload` instantly provides the opportunity to upload the desired document. Then, +the document can be further configured on the document card, or by clicking the three dots icon in +the top right corner of the document card, and then clicking {guilabel}`Edit`. + +Clicking {guilabel}`New` reveals a blank documents form, in which the desired PDF can be uploaded +via the {guilabel}`Upload your file` button on the form, located in the {guilabel}`File Content` +field. + +```{image} pdf_quote_builder/blank-document-form.png +:align: center +:alt: A standard document form with various fields for a specific product in Odoo Sales. +``` + +Various information and configurations related to the uploaded document can be modified here. + +The first field on the documents form is for the {guilabel}`Name` of the document, and it is +grayed-out (not clickable) until a document is uploaded. Once a PDF has been uploaded, the +{guilabel}`Name` field is auto-populated with the name of the PDF, and it can then be edited. + +Prior to uploading a document, there's the option to designate whether the document is a +{guilabel}`File` or {guilabel}`URL` from the {guilabel}`Type` drop-down field menu. + +```{image} pdf_quote_builder/document-form-uploaded-pdf.png +:align: center +:alt: A standard document form with an uploaded pdf in Odoo Sales. +``` + +:::{note} +If a PDF is uploaded, the {guilabel}`Type` field is auto-populated to {guilabel}`File`, and it +cannot be modified. +::: + +Then, in the {guilabel}`Sales` section, in the {guilabel}`Visible at` field, click the drop-down +menu, and select either: {guilabel}`Quotation`, {guilabel}`Confirmed order`, or {guilabel}`Inside +quote`. + +- {guilabel}`Quotation`: the document is sent to (and accessible by) customers at any time. +- {guilabel}`Confirmed order`: the document is sent to customers upon the confirmation of an order. + This is best for user manuals and other supplemental documents. +- {guilabel}`Inside quote`: the document is included in the PDF of the quotation, between the header + pages and the {guilabel}`Pricing` section of the quote. + +```{eval-rst} +.. example:: + When the :guilabel:`Inside quote` option for the :guilabel:`Visible at` field is chosen, and the + custom PDF file, `Sample Builder.pdf` is uploaded, the PDF is visible on the quotation the in the + *customer portal* under the :guilabel:`Documents` field. + + .. image:: pdf_quote_builder/pdf-inside-quote-sample.png + :align: center + :alt: Sample of an uploaded pdf with the inside quote option chosen in Odoo Sales. +``` + +Beside the {guilabel}`File Content` field, you have the possibility to +{guilabel}`Configure dynamic fields`. When doing so, remember that the starting model is the +{guilabel}`sale_order_line`, unlike for headers and footers that start from the +{guilabel}`sale_order`. + +Lastly, in the {guilabel}`E-Commerce` section, decide whether or not to {guilabel}`Show on product +page` on the front-end (in the online store). + +```{eval-rst} +.. example:: + When the :guilabel:`Show on product page` option is enabled, a link to the uploaded document, + `Sample Builder.pdf`, appears on the product's page, located on the frontend in the online store. + + It appears beneath a :guilabel:`Documents` heading, with a link showcasing the name of the + uploaded document. + + .. image:: pdf_quote_builder/show-product-page.png + :align: center + :alt: Showing a link to an uploaded document on a product page using Odoo Sales. +``` + +## PDF quote + +On a {guilabel}`Sales Order`, in the {guilabel}`Quote Builder` tab, select any document you want to +be merged within the final PDF. If this document has custom fields, you'll then be able to write +same notes to fill the PDF. + +You can add as many headers, product documents and footers you want to customize your quote to the +needs of your customers. + +Once a quote with a pre-configured PDF has been confirmed, Odoo provides the option to print the +confirmed quote to check for errors, or to keep for records. + +To print the PDF quote, navigate to the confirmed quote, and click the {guilabel}`⚙️ (gear)` icon to +reveal a drop-down menu. From this drop-down menu, select {guilabel}`Print`, then select +{guilabel}`PDF Quote`. + +```{image} pdf_quote_builder/drop-down-print-pdf.png +:align: center +:alt: Print pdf quote option on drop-down menu located on confirmed sales order in +: Odoo Sales. +``` + +Doing so instantly downloads the PDF quote. When opened, the PDF quote, along with the configured +product PDF that was set to be visible inside the quote, can be viewed and printed. + +:::{note} +Download these {download}`PDF quote builder examples +` or download +{download}`sample quotation +` +for added reference. +::: + +:::{seealso} +- {doc}`/applications/sales/sales/send_quotations/quote_template` +::: + diff --git a/content/applications/sales/sales/send_quotations/quote_template.md b/content/applications/sales/sales/send_quotations/quote_template.md new file mode 100644 index 000000000..83730fb4d --- /dev/null +++ b/content/applications/sales/sales/send_quotations/quote_template.md @@ -0,0 +1,274 @@ +# Quotation templates + +Reusable quotation templates can be made in Odoo's **Sales** app for common products or services. + +By using these templates, quotations can be tailored and sent to customers at a quicker pace, +without having to create new quotations from scratch every time a sales negotiation occurs. + +(sales-send-quotations-templates)= + +## Configuration + +To use quotation templates, begin by activating the setting in {menuselection}`Sales app --> +Configuration --> Settings`, and scroll to the {guilabel}`Quotations &_Orders` heading. + +Under the heading, tick the {guilabel}`Quotation Templates` checkbox. Doing so reveals a new +{guilabel}`Default Template` field, in which a default quotation template can be chosen from the +drop-down menu. + +```{image} quote_template/quotations-templates-setting.png +:alt: How to enable quotation templates on Odoo Sales. +``` + +Upon activating the {guilabel}`Quotation Template` feature, an internal {icon}`fa-arrow-right` +{guilabel}`Quotation Templates` link appears beneath the {guilabel}`Default Template` field. + +Clicking this link reveals the {guilabel}`Quotation Templates` page, from which templates can be +created, viewed, and edited. + +Before leaving the {guilabel}`Settings` page, do not forget to click the {guilabel}`Save` button to +save all changes made during the session. + +(sales-send-quotations-create-templates)= + +## Create quotation templates + +To create a quotation template, click the {guilabel}`Quotation Templates` link on the +{guilabel}`Settings` page once {guilabel}`Quotation templates` are enabled, or navigate to +{menuselection}`Sales app --> Configuration --> Quotation Templates`. Both options reveal the +{guilabel}`Quotation Templates` page, where quotation templates can be created, viewed, and edited. + +```{image} quote_template/quotation-templates-page.png +:alt: Quotation templates page in the Odoo Sales application. +``` + +To create a new quotation template, click the {guilabel}`New` button, located in the upper-left +corner. Doing so reveals a blank quotation template form that can be customized. + +```{image} quote_template/blank-quotation-form.png +:alt: Create a new quotation template on Odoo Sales. +``` + +Start by entering a name for the template in the {guilabel}`Quotation Template` field. + +Then, in the {guilabel}`Quotation Validity` field, designate how many days the quotation template +will remain valid for, or leave the field on the default `0` to keep the template valid +indefinitely. + +Next, in the {guilabel}`Confirmation Mail` field, click the blank drop-down menu to select a +preconfigured email template to be sent to customers upon confirmation of an order. + +:::{tip} +To create a new email template directly from the {guilabel}`Confirmation Mail` field, start +typing the name of the new email template in the field, and select either: {guilabel}`Create` or +{guilabel}`Create and edit...` from the drop-down menu that appears. + +Selecting {guilabel}`Create` creates the email template, which can be edited later. + +Selecting {guilabel}`Create and edit...` creates the email template, and a {guilabel}`Create +Confirmation Mail` pop-up window appears, in which the email template can be customized and +configured immediately. + +```{image} quote_template/create-confirmation-mail-popup.png +:alt: Create confirmation mail pop-up window from the quotation template form in Odoo +: Sales. +``` + +When all modifications are complete, click {guilabel}`Save & Close` to save the email template +and return to the quotation form. +::: + +If working in a multi-company environment, use the {guilabel}`Company` field to designate to which +company this quotation template applies. + +If a journal is set in the {guilabel}`Invoicing Journal` field, all sales orders with this template +will invoice in that specified journal. If no journal is set in this field, the sales journal with +the lowest sequence is used. + +If the {guilabel}`Online Signature` and/or {guilabel}`Online Payment` features are activated in the +{guilabel}`Settings` ({menuselection}`Sales app --> Configuration --> Settings`), those options are +available on quotation template forms. + +Check the box beside {guilabel}`Online Signature` to request an online signature from the customer +to confirm an order. + +Check the box beside {guilabel}`Online Payment` to request an online payment from the customer to +confirm an order. When {guilabel}`Online Payment` is checked, a new percentage field appears, in +which a specific percentage of payment can be entered. + +Both options, {guilabel}`Online Signature` and {guilabel}`Online Payment` can be enabled +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 + +In the {guilabel}`Lines` tab, products can be added to the quotation template by clicking +{guilabel}`Add a product`, organized by clicking {guilabel}`Add a section` (and dragging/dropping +section headers), and further explained with discretionary information (such as warranty details, +terms, etc.) by clicking {guilabel}`Add a note`. + +To add a product to a quotation template, click {guilabel}`Add a product` in the {guilabel}`Lines` +tab of a quotation template form. Doing so reveals a blank field in the {guilabel}`Product` column. + +When clicked, a drop-down menu with existing products in the database appears. Select the desired +product from the drop-down menu to add it to the quotation template. + +If the desired product is not readily visible, type the name of the desired product in the +{guilabel}`Product` field, and the option appears in the drop-down menu. Products can also be found +by clicking {guilabel}`Search More...` from the drop-down menu. + +:::{tip} +It is possible to add event-related products (booths and registrations) to quotation templates. +To do so, click the {guilabel}`Product` field, type in `Event`, and select the desired +event-related product from the resulting drop-down menu. +::: + +:::{note} +When a product is added to a quotation template, the default {guilabel}`Quantity` is `1`, but +that can be edited at any time. +::: + +Then, drag and drop the product to the desired position, via the {guilabel}`six squares` icon, +located to the left of each line item. + +To add a *section*, which serves as a header to organize the lines of a sales order, click +{guilabel}`Add a section` in the {guilabel}`Lines` tab. When clicked, a blank field appears, in +which the desired name of the section can be typed. When the name has been entered, click away to +secure the section name. + +Then, drag and drop the section name to the desired position, via the {icon}`oi-apps` +{guilabel}`(six squares)` icon, located to the left of each line item. + +To add a note, which appears as a piece of text for the customer on the quotation, click +{guilabel}`Add a note` in the {guilabel}`Lines` tab. When clicked, a blank field appears, in which +the desired note can be typed. When the note has been entered, click away to secure the note. + +Then, drag and drop the note to the desired position, via the {icon}`oi-apps` +{guilabel}`(six squares)` icon. + +To delete any line item from the {guilabel}`Lines` tab (product, section, and/or note), click the +{icon}`fa-trash` {guilabel}`(remove record)` icon on the far-right side of the line. + +### Optional Products tab + +Using *optional products* is a marketing strategy that involves the cross-selling of products along +with a core product. The aim is to offer useful and related products to customers, which may result +in an increased sale. + +```{eval-rst} +.. example:: + If a customer wants to buy a car, they have the choice to order massaging seats as + an additional product that compliments the car, or ignore the offer and buy the car alone. +``` + +Optional products appear as a section on the bottom of sales orders and eCommerce pages. Customers +can immediately add them to their online sales orders themselves, if desired. + +```{image} quote_template/optional-products-on-sales-order.png +:alt: Optional products appearing on a typical sales order with Odoo Sales. +``` + +In the {guilabel}`Optional Products` tab, {guilabel}`Add a line` for each cross-selling product +related to the original items in the {guilabel}`Lines` tab, if applicable. + +Clicking {guilabel}`Add a line` reveals a blank field in the {guilabel}`Product` column. + +When clicked, a drop-down menu with products from the database appear. Select the desired product +from the drop-down menu to add it as an optional product to the quotation template. + +To delete any line item from the {guilabel}`Optional Products` tab, click the {icon}`fa-trash` +{guilabel}`(remove record)` icon. + +:::{note} +Optional products are **not** required to create a quotation template. +::: + +### Terms & Conditions tab + +The {guilabel}`Terms & Conditions` tab provides the opportunity to add terms and conditions to the +quotation template. To add terms and conditions, type the desired terms and conditions in this tab. + +:::{seealso} +{doc}`../../../finance/accounting/customer_invoices/terms_conditions` +::: + +:::{note} +Terms and conditions are **not** required to create a quotation template. +::: + +## Use quotation templates + +When creating a quotation ({menuselection}`Sales app --> New`), choose a preconfigured template in +the {guilabel}`Quotation Template` field. + +:::{note} +The order of the templates in the {guilabel}`Quotation Template` field is determined by the order +of the templates in the Quotation Templates form. The order of the quotations in the Quotation +Templates form does **not** affect anything else. +::: + +To view what the customer will see, click the {guilabel}`Preview` button at the top of the page to +see how the quotation template appears on the front-end of the website through Odoo's customer +portal. + +```{image} quote_template/quotations-templates-preview.png +:alt: Customer preview of a quotation template in Odoo Sales. +``` + +When all blocks and customizations are complete, click the {guilabel}`Save` button to save the +configuration. + +The blue banner located at the top of the quotation template preview can be used to quickly return +{icon}`fa-arrow-right` {guilabel}`Back to edit mode`. When clicked, Odoo returns to the quotation +form in the back-end of the *Sales* application. + +## Mass cancel quotations/sales orders + +Cancel multiple quotations (or sales orders) by navigating to the {menuselection}`Sales app --> +Orders --> Quotations` dashboard, landing, by default, in the list view. Then, on the left side of +the table, tick the checkboxes for the quotations to be canceled. + +:::{tip} +Select all records in the table by selecting the checkbox column header at the top-left of the +table; the total number of selected items are displayed at the top of the page. +::: + +Then, with the desired quotations (or sales orders) selected from the list view on the +{guilabel}`Quotations` page, click the {icon}`fa-cog` {guilabel}`Actions` button to reveal a +drop-down menu. + +From this drop-down menu, select {guilabel}`Cancel quotations`. + +```{image} quote_template/cancel-quotations.png +:alt: The Cancel quotations option on the Actions drop-down menu in the Odoo Sales +: application. +``` + +:::{note} +This action can be performed for quotations in *any* stage, even if it is confirmed as a sales +order. +::: + +Upon selecting the {guilabel}`Cancel quotations` option, a {guilabel}`Cancel quotations` +confirmation pop-up window appears. To complete the cancellation, click the {guilabel}`Cancel +quotations` button. + +:::{note} +An error pop-up message appears when attempting to cancel an order for an ongoing subscription +that has an invoice. +::: + +:::{seealso} +- {doc}`get_signature_to_validate` +- {doc}`get_paid_to_validate` +::: + diff --git a/content/applications/sales/sales/shopee_connector.md b/content/applications/sales/sales/shopee_connector.md new file mode 100644 index 000000000..fc0e648ee --- /dev/null +++ b/content/applications/sales/sales/shopee_connector.md @@ -0,0 +1,81 @@ +--- +show-content: true +--- + +# Shopee Connector + +The **Shopee Connector** synchronizes orders between Shopee and Odoo, which considerably reduces the +amount of time spent manually entering Shopee orders (from the Shopee Seller account) into Odoo. It +also allows users to accurately keep track of Shopee sales in Odoo. + +## Supported features + +The **Shopee Connector** is able to: + +- Synchronize (Shopee to Odoo) all confirmed orders, and their order items, which include: + + - Product name + - SKU reference + - Quantity + +- Synchronize (Odoo to Shopee) all available quantities of your products ({abbr}`FBM (Fulfilled by + Merchant)`). + +- Support multiple seller accounts. + +- Support multiple Shopee marketplaces (shops) per seller account. + +:::{note} +The **Shopee Connector** is designed to synchronize sales orders data. Other actions, such as +downloading weekly/monthly income/fees reports, handling disputes, or issuing refunds, **must** +be managed from the *Shopee Seller Central*, as usual. +::: + +## Shopee supported marketplaces + +```{eval-rst} ++-------------------------------+ +| **APAC region** | ++===============+===============+ +| Indonesia | Shopee.co.id | ++---------------+---------------+ +| Taiwan | Shopee.tw | ++---------------+---------------+ +| Vietnam | Shopee.vn | ++---------------+---------------+ +| Thailand | Shopee.co.th | ++---------------+---------------+ +| Philippines | Shopee.ph | ++---------------+---------------+ +| Malaysia | Shopee.com.my | ++---------------+---------------+ +| Singapore | Shopee.sg | ++---------------+---------------+ +``` + +```{eval-rst} ++-------------------------------+ +| **South America region** | ++===============+===============+ +| Brazil | Shopee.com.br | ++---------------+---------------+ +| Chile | Shopee.cl | ++---------------+---------------+ +| Colombia | Shopee.com.co | ++---------------+---------------+ +| Mexico | Shopee.com.mx | ++---------------+---------------+ +``` + +:::{seealso} +- {doc}`shopee_connector/setup` +- {doc}`shopee_connector/manage` +::: + +```{toctree} +:titlesonly: true + +shopee_connector/setup +shopee_connector/manage +``` + diff --git a/content/applications/sales/sales/shopee_connector/manage.md b/content/applications/sales/sales/shopee_connector/manage.md new file mode 100644 index 000000000..b02c4513c --- /dev/null +++ b/content/applications/sales/sales/shopee_connector/manage.md @@ -0,0 +1,193 @@ +# Shopee order management + +## Product catalog mapping + +### New Odoo customers with no existing products + +If you are starting a new Odoo database and your products are only on Shopee, you can import your +Shopee product catalog into Odoo. + +1. **Export Shopee catalog:** Use the *Mass Function* drop-down to export the product catalog from + Shopee, ensuring it includes the Shopee SKUs. + + ```{image} manage/shopee-seller-centre-product-extract.png + :alt: Mass Function drop-down in Shopee. + ``` + +2. **Import into Odoo:** {doc}`Import <../../../essentials/export_import_data>` the exported catalog + into Odoo. During the import process, it is *crucial* to map the Shopee SKU to the + *Internal Reference* field in Odoo. This field will serve as the link between your Shopee and + Odoo products. + +### Existing Odoo customers with products already in Odoo + +If you already have products in your Odoo database, you'll need to map your Shopee listings to your +existing Odoo products. + +1. **Export Shopee catalogs:** Use the *Mass Function* drop-down to export the product catalog from Shopee + (including Shopee SKUs) and {doc}`export <../../../essentials/export_import_data>` your product + catalog from Odoo (including *Internal References*). +2. **Map in a spreadsheet:** Use a spreadsheet to map the products. Match the Shopee SKU from the + Shopee export with the corresponding *Internal Reference* from the Odoo export. Create a column + that links the Shopee SKU with the Odoo *Internal Reference*. +3. **Update Odoo products:** Import the updated spreadsheet back into Odoo. Use the mapping you + created in the spreadsheet to update the *Internal Reference* field of your existing Odoo + products with the corresponding Shopee SKU. This establishes the link between your Odoo and + Shopee products. + +:::{important} +Product catalog synchronization between Odoo and Shopee is **not automatic**. It is a +**manual operation** that you must initiate. The process differs depending on whether your +products already exist in Odoo. +::: + +## Order synchronization + +Orders are automatically fetched from Shopee, and synchronized in Odoo, at **regular intervals**. + +The synchronization is based on the Shopee orders status: only orders whose status has changed +since the last synchronization are fetched from Shopee. This includes changes on Shopee only. + +When an order is canceled on Shopee, it will update the order's status in Odoo. On the other hand, +if an order is canceled on Odoo, the change won't be reflected on Shopee. + +For every synchronized order, Odoo creates a sales order and a customer (contact), as long as the +customer hasn't been previously imported from Shopee or doesn't already exist in the database. + +:::{note} +The principal of the synchronization is to *only fetch orders that needs to be shipped* +(i.e., `SHIPPED`, `CANCEL`, `UNPAID`, `COMPLETED`). +::: + +## Force synchronization + +In order to force the synchronization of an order, whose status has **not** changed since the +previous synchronization: + +Then, navigate to the Shopee account in Odoo {menuselection}`Sales app --> Configuration --> Shopee +--> Account --> Shop`. Modify the date for {guilabel}`Last Order Sync` under {guilabel}`Orders +Follow-up`. + +Be sure to pick a date that occurs prior to the last status change of the desired order to +synchronize and save. This will ensure synchronization occurs correctly. + +## Manage deliveries in {abbr}`FBM (Fulfilled by Merchant)` + +Whenever an FBM (Fulfilled by Merchant) order is synchronized in Odoo, a picking is instantly +created in the **Inventory** app, along with a sales order and customer record. + +When a picking related to the order is confirmed, you also have to click on {guilabel}`Arrange +Shipment` in your Shopee Seller Account in order to be able to generate and fetch the +{guilabel}`Shipping Label` and {guilabel}`Tracking Number`. + +### Shopee delivery statuses + +Understanding the different Shopee delivery statuses is crucial for managing your orders +effectively. Here's a breakdown: + +- **Ready to ship:** The seller can now arrange shipment for this order. +- **Shipment arranged:** The seller has arranged shipment online and received a tracking number + from the third-party logistics (3PL) provider. +- **Shipped:** The parcel has been dropped off at the 3PL location or picked up by the 3PL + provider. +- **Cancelled:** The order has been canceled. +- **Pickup failed:** The 3PL parcel pickup attempt failed. The seller needs to rearrange shipment, + and the rest of the order fulfillment content. + +```{image} manage/shopee-delivery-orders-status.png +:alt: Shopee delivery status in Odoo. +``` + +:::{important} +Unsupported for Non-Shopee Supported Logistics (NSSL) + +This feature is not available for {abbr}`NSSL (Non-Shopee Supported Logistics)`, you have to +manually create shipping label and tracking number via the logistics provider's website/app. +Check your region for list of supported logistics (e.g. [Malaysia](https://seller.shopee.com.my/edu/article/388)). + +Shopee requires users to provide a tracking reference with each delivery. This is needed to +assign a carrier. + +If the carrier doesn't automatically provide a tracking reference, one must be set manually. +This rule applies to all Shopee marketplaces. +::: + +## Follow deliveries in Odoo + +For {abbr}`FBM (Fulfilled by Merchant)` orders, the stock move is automatically created in Odoo by +the Shopee connector, thanks to the shipping status of Shopee. + +```{image} manage/shopee-wh-out.png +:alt: Stock move created for Shopee order in Odoo. +``` + +### Order fulfillment process + +This section describes the process of fulfilling Shopee orders within Odoo, from order creation to +inventory updates. + +1. **New order creation:** When a new order is placed on Shopee, it is automatically created in + Odoo. +2. **Arrange shipment on Shopee:** Before the order can be shipped, you **must** arrange the + shipment through the Shopee platform itself. This usually involves selecting a shipping + provider, generating a shipping label, and scheduling pickup or drop-off. Odoo does *not* + handle the physical shipping arrangements; this is managed entirely within Shopee. +3. **Fetch Shopee shipping label (delivery note):** Once the shipment is arranged on Shopee, + Odoo fetches the generated shipping label (which serves as the delivery note). This label + contains crucial information like the tracking number and is essential for printing and + attaching to the package. The shipping label is imported into Odoo and associated with the + corresponding sales order. +4. **Validate stock out in Odoo:** After the shipping label is retrieved, you need to validate the + stock movement in Odoo. This confirms that the ordered items have left your warehouse or + inventory. Validating the stock out will decrease the stock levels in Odoo. +5. **Inventory update on Shopee:** Finally, Odoo pushes the updated stock levels back to Shopee. + This ensures that your Shopee listings reflect the current inventory, preventing overselling and + keeping your product availability accurate. This synchronization keeps your Shopee storefront + up-to-date with your Odoo inventory. + +## Register payments + +Since customers pay Shopee as an intermediary, creating a dedicated *Bank* journal (e.g. named +`Shopee Payments`), with a dedicated *Bank and Cash* intermediary account is recommended. + +Additionally, as Shopee makes a single weekly or monthly payment, selecting all the invoices linked +to a single payment is necessary when registering payments. + +To do that, use the appropriate {guilabel}`Journal` dedicated to Shopee payments, and select +{guilabel}`Batch Deposit` as the {guilabel}`Payment Method`. + +Then, select all the generated payments, and click {menuselection}`Actions --> Create batch payment +--> Validate`. + +:::{tip} +This same action can be performed with vendor bills from Shopee dedicated to fees/commissions. + +When the balance is received in the bank account at the end of the week/month, and the bank +statements are recorded, credit the Shopee intermediary account by the amount received. +::: + +## Analyzing Shopee sales with Odoo's reporting + +Odoo's dashboard consolidates sales data from all your connected sales channels, providing a +comprehensive overview of your business performance. To specifically analyze your Shopee sales, you +will need to configure sales teams for your Shopee shops. This setup enables you to filter and +isolate Shopee sales data within the Odoo dashboard. + +### Setting up sales teams for Shopee reporting + +By default, the Shopee account's sales team is shared across all of your company's accounts. To +generate separate reports for specific Shopee shops or marketplaces, you'll need to assign dedicated +sales teams. + +1. **Assign a sales team to your Shopee shop:** Navigate to the Shopee account configuration + (typically found under {menuselection}`Sales --> Configuration --> Accounts`). Within the + account details, assign a specific sales team to your Shopee shop. +2. **Filtering Shopee sales on the dashboard:** Once sales teams are assigned, you can use the + dashboard filters to view sales data specifically for your Shopee shops. Select the appropriate + sales team to isolate and analyze your Shopee performance. + +:::{seealso} +- {doc}`Shopee supported features and marketplaces <../shopee_connector>` +- {doc}`setup` +::: + diff --git a/content/applications/sales/sales/shopee_connector/setup.md b/content/applications/sales/sales/shopee_connector/setup.md new file mode 100644 index 000000000..97f16dda6 --- /dev/null +++ b/content/applications/sales/sales/shopee_connector/setup.md @@ -0,0 +1,229 @@ +# Shopee Connector configuration + +Odoo allows users to synchronize with Shopee Seller account in the database, but users **must** +have a registered **Shopee Seller account** and a **Shopee Open account** prior to completing the +configuration. + +Set up an Open Shopee account by first going to the [Shopee Open Platform](https://open.shopee.com/), and click the {guilabel}`Get Access (Now)` button located in the +middle of the page. + +Use the [Open Shopee Developer Guide](https://open.shopee.com/developer-guide/12), and follow the +registration process. Once all done, proceed to follow the instructions below to register and link +the Open Shopee account in Odoo. + +:::{important} +Shopee Open Platform access and seller account requirements are **regionally specific**. This +means the rules, qualifications, and processes differ from country to country. Before proceeding +with Odoo's Shopee Connector setup, verify the requirements for *your* specific Shopee region. + +**Key Considerations:** + +- **Shopee Seller Status & Business Type:** You must have an active Shopee seller account + (Individual or Registered Business). Your eligibility depends on your region and business + registration. +- **Order Volume/Seller Tier (If Applicable):** Many regions require a minimum number of orders + within a specific time frame or a certain seller tier (e.g., Mall, Preferred, Managed) to + access the Open Platform. + +**Action Required:** + +1. Identify your Shopee region. +2. Locate the official Shopee documentation for your region. + [Open Shopee Developer Guide](https://open.shopee.com/developer-guide/12) +3. Carefully review the requirements for seller accounts and Open Platform access in your + region. +4. Ensure your Shopee account meets all the necessary criteria *before* proceeding with the + Odoo Shopee Connector configuration. +::: + +(shopee-setup)= + +## Connect Shopee seller account to Odoo + +{ref}`Install ` the {guilabel}`Shopee Connector` (`sale_shoppe`) by going to +{menuselection}`Apps`. + +Then connect your Shopee Open account by navigating to {menuselection}`Sales app --> Configuration +--> Shopee --> Accounts`. + +From here, click {guilabel}`New` to create to link a new Shopee account. + +Then, in the {guilabel}`Credentials` tab, select the appropriate {guilabel}`API Endpoint` from the +drop-down menu. + +:::{note} +Shopee offers several API endpoints for production and testing. Selecting the correct endpoint +is crucial for successful integration. Choose the endpoint that corresponds to your marketplace +location. + +- {guilabel}`Shopee Production Endpoint (Singapore)`: This is the primary endpoint for sellers in + most APAC countries. Select this option unless you are specifically operating within mainland + China or Brazil. +- {guilabel}`Shopee Production Endpoint (China)`: This endpoint is exclusively for sellers + operating within mainland China. It is designed to comply with local regulations and business + practices. +- {guilabel}`Shopee Production Endpoint (Brazil)`: This endpoint is dedicated to sellers + operating within Brazil. Select this option if your Shopee store is based in Brazil. +- {guilabel}`Shopee Testing Endpoint`: This endpoint is for development and testing purposes + only. Use it to simulate interactions with the Shopee API without affecting your live data. + **Do not use this endpoint for production.** +- {guilabel}`Shopee Testing Endpoint (China)`: Similar to the general testing endpoint, this one + is specifically for testing integrations related to the China-specific production endpoint. + **Do not use this endpoint for production.** +::: + +After selecting the correct API Endpoint in the {guilabel}`Credentials` form, input your Open +Shopee {guilabel}`Partner ID` and {guilabel}`Partner Key` in the corresponding fields. Then click +{guilabel}`Save And Authorize`. + +:::{important} +You'll need your Open Shopee {guilabel}`Partner ID` and {guilabel}`Partner Key` to complete this +step. Here's how to find them in the Shopee Open Platform: + +1. **Log in to the Shopee Open Platform:** [Log in](https://open.shopee.com/) with the + credentials you used to register your Open Shopee account. +2. **Navigate to App Management:** Go to the {guilabel}`App Management` section, then select + {guilabel}`App List`. +3. **Select your app:** Choose the specific app you want to synchronize with Odoo (either your + test app or your production app). +4. **Find your credentials:** Within the app details, you'll find your Partner ID and Partner + Key. These are the values you'll need to copy and paste into the corresponding fields in + Odoo. +::: + +:::{note} +- **Copy carefully:** Copy the Partner ID and Partner Key accurately, without any extra spaces + or characters. These are case-sensitive. +- **Keep your key secure:** Your Partner Key is sensitive information. Do not share it with + anyone. Treat it like a password. +::: + +## Authorization and account registration + +After entering connecting the {ref}`Shoppe Seller account to Odoo `, the authorization +process begins. + +### Shopee seller account selection/login + +Upon clicking {guilabel}`Save and Authorize`, Odoo redirects to the Shopee seller account selection +page. + +- **Already logged in:** If you are already logged in to a Shopee account, your email address or + username will be displayed. Click on your account to proceed. +- **Not logged in:** If you are not logged in, you will be prompted to enter the credentials + (email/username and password) of the Shopee seller account you wish to connect to Odoo. + +### Granting access to Odoo + +After selecting or logging into your Shopee seller account, you will be directed to the +authorization (or consent) page. Here, confirm that you allow Shopee to grant Odoo access to your +account and related data. This step is essential for the integration to function correctly. + +## Account registration and Shopee shop creation + +Upon confirming access, Shopee redirects you back to Odoo. An indicator appears, confirming that +your Shopee account has been successfully registered. + +### Post-synchronization configuration + +After the redirection, you should perform the following steps within Odoo: + +1. **Rename the Shopee Account (Optional):** The newly created Shopee account in Odoo will likely + have a default name. You can rename it to something more descriptive (e.g., the name of your + Shopee shop) for easier management. +2. **Set the Last Order Synchronization Date:** This setting determines the starting point for + fetching orders from Shopee. Choose a date from which you want Odoo to retrieve past orders. +3. **Configure Inventory Synchronization:** Decide whether you want to synchronize your product + inventory between Odoo and Shopee. Enable the {guilabel}`Synchronize Inventory` option to + automatically push stock updates from Odoo to Shopee. Disabling this option prevents automatic + inventory updates. +4. **Assign a Default Sales Team:** Assign a default sales team to your Shopee account in Odoo. + This helps with reporting and order management. + +With the Shopee account successfully registered, the marketplaces available with this specific +account can later be synchronized the exact same way, and listed under the {guilabel}`Shops` +button. + +## Shopee orders in Odoo + +When a Shopee order is synchronized, only lines for items are created on the sales order in Odoo. +Each one represents one for the product that was sold on Shopee. + +```{image} setup/shopee-sales-odoo.png +:alt: Shopee synchronized sale order in Odoo. +``` + +Any necessary price reconciliation related to shipping or income versus fees can be managed later +using Shopee's weekly / monthly financial reports, which can then be imported into the Odoo +**Accounting** app. + +The selection of a database product for a sales order item is done by matching its +{guilabel}`Internal Reference` (a customizable product reference identifier in Odoo, like `FURN001`) +with the Shopee *SKU*. + +If no database product with a matching internal reference is found for a given +{guilabel}`Shopee SKU`, then a default database product, *Shopee Item*. + +:::{note} +To modify default products, activate the {ref}`developer mode `, and navigate to +{menuselection}`Sales app --> Configuration --> Settings`. In the {guilabel}`Connectors` section, +under {guilabel}`Shopee Sync`, find the {guilabel}`Default Products`. +::: + +## Product tax configuration + +To allow for tax reporting of Shopee sales with Odoo, the taxes applied to the sales order items are +those set on the product, or determined by the {doc}`fiscal position +<../../../finance/fiscal_localizations>`. + +Make sure to have the correct taxes set on your products in Odoo, or have it done by a fiscal +position, to avoid discrepancies in the subtotals between *Shopee Seller Central* and Odoo. + +:::{note} +As shopee does not necessarily apply the same taxes as those configured in Odoo, it may happen +that order totals differ by a few cents between Odoo and *Shopee Seller Central*. Those +differences can be resolved with a write-off when reconciling the payments in Odoo. +::: + +(shopee-add-new-marketplace)= + +## Add a new marketplace + +To add a new marketplace, follow these steps: + +1. **Navigate to Shopee Accounts:** Go to {menuselection}`Sales --> Configuration --> Accounts`. +2. **Create a New Shopee Account:** Click {guilabel}`New` to create a new Shopee marketplace + account. +3. **Select the API Endpoint:** Choose the appropriate API endpoint for your local market. + (Typically, this will be {guilabel}`Shopee Production Endpoint (Singapore)` unless you are + operating in mainland China or Brazil. Refer to the documentation for details on endpoint + selection). +4. **Enter Credentials:** Your {guilabel}`Partner ID` and {guilabel}`Partner Key` are the same as + those linked to your unique Open Shopee account. Enter these values in the corresponding fields. +5. **Name Your Shop:** Give the new shop a descriptive name (e.g., `Shopee Philippines`) to identify + it later. +6. **Assign a Sales Team:** Assign a relevant sales team (e.g., `Shopee Sales Philippines`) to + enable advanced reporting capabilities. +7. **Synchronize Your Account:** If none of your existing marketplaces are listed, click + {guilabel}`Log in with another account` to synchronize a new one. This will initiate the Shopee + authorization process. + +### Automatic synchronization + +Newly added marketplaces are automatically added to the list of synchronized marketplaces. If a new +marketplace does *not* appear in the list after synchronization, it indicates that the marketplace +is either incompatible with the Shopee Open Platform or unavailable for your specific seller +account. Consult the Shopee Open Platform documentation or contact their support for further +assistance. + +:::{important} +While Odoo allows creating the same Shopee shop multiple times, only one instance will function +due to token limitations. To avoid order management issues, synchronize each shop only once. For +connection updates, manually fetch orders first before re-establishing the connection. +::: + +:::{seealso} +- {doc}`Shopee supported features and marketplaces <../shopee_connector>` +- {doc}`manage` +::: + diff --git a/content/applications/sales/subscriptions.md b/content/applications/sales/subscriptions.md new file mode 100644 index 000000000..3881069cb --- /dev/null +++ b/content/applications/sales/subscriptions.md @@ -0,0 +1,94 @@ +--- +show-content: true +--- + +# Subscriptions + +Odoo *Subscriptions* is used to run recurring businesses: {ref}`sell new contracts +`, {doc}`upsell customers `, +keep the churn under control, and {doc}`generate reports +` on the main {abbr}`KPIs (Key Performance Indicators)`: +{abbr}`MRR (Monthly Recurring Revenue)`, {abbr}`ARR (Annual Recurring Revenue)`, retention, churn, +etc. + +:::{seealso} +- [Odoo Tutorials: Subscriptions](https://www.odoo.com/slides/subscription-20) +- {doc}`/applications/sales/subscriptions/products` +- {doc}`/applications/sales/subscriptions/ecommerce` +- {doc}`/applications/sales/subscriptions/plans` +- {doc}`/applications/sales/subscriptions/upselling` +- {doc}`/applications/sales/subscriptions/renewals` +- {doc}`/applications/sales/subscriptions/closing` +- {doc}`/applications/sales/subscriptions/automatic_alerts` +- {doc}`/applications/sales/subscriptions/scheduled_actions` +- {doc}`/applications/sales/subscriptions/reports` +::: + +(subscriptions-quotations)= + +## Subscription quotations + +:::{important} +Sales orders with a defined recurrence become subscriptions. +::: + +To create a new subscription, click on {guilabel}`New` from the *Subscription* or the {doc}`Sales +` app. You can either: + +- Select a {doc}`subscription plan ` to prefill the + quotation instantly, or +- Fill out the quotation normally, making sure to select a recurrence and an end date if necessary + and adding {doc}`recurrent products `. + +:::{tip} +You can define different invoice and delivery addresses by enabling the {doc}`Customer Addresses +` feature. +::: + +(subscriptions-confirmation)= + +## Confirmation + +Send the quotation to the customer for confirmation by clicking on {guilabel}`Send by email`, or +confirm it immediately by clicking on {guilabel}`Confirm`. + +:::{tip} +Click on {guilabel}`Customer Preview` to preview the customer portal where the customer can view +their quotation, sign and pay it, and communicate with you. +::: + +(subscriptions-automatic-payments)= + +## Automatic payments + +You can require the customer to set an automatic payment method and pre-pay the subscription's first +occurrence before they can confirm their quotation. To do so, go to the {guilabel}`Other Info` tab +of the quotation and check the {guilabel}`Payment` option in the {guilabel}`Online confirmation` +field. + +If you leave {guilabel}`Payment` unchecked, the customer doesn't have to pre-pay to start the +subscription. This means that the payment is not automatic and that the customer must pay each +invoice manually. + +:::{important} +If the online confirmation requires a pre-payment, your customer can select only the +{ref}`payment providers ` that have the {ref}`tokenization +feature `. This ensures that the customer is automatically +charged at each new period. +::: + +```{toctree} +:titlesonly: true + +subscriptions/products +subscriptions/ecommerce +subscriptions/plans +subscriptions/upselling +subscriptions/renewals +subscriptions/closing +subscriptions/automatic_alerts +subscriptions/scheduled_actions +subscriptions/reports +subscriptions/payment_providers +``` + diff --git a/content/applications/sales/subscriptions/automatic_alerts.md b/content/applications/sales/subscriptions/automatic_alerts.md new file mode 100644 index 000000000..60a47cc4e --- /dev/null +++ b/content/applications/sales/subscriptions/automatic_alerts.md @@ -0,0 +1,173 @@ +# Automation rules + +With subscriptions up-and-running, it is important to stay up-to-date with customers. It is +efficient to use automation to avoid having to manually go through the list of subscribers to see +how things are going. That is where Odoo's *automation rules* feature comes into play. + +The Odoo *Subscriptions* application allows users to set up automatic emails, create tasks for +salespeople, and even send satisfaction surveys for subscribers to evaluate their experience. + +## Create automation rules + +To create an automated rule, start by navigating to {menuselection}`Subscriptions app --> +Configuration --> Automation Rules`. This is where all the automation rules for subscriptions can be +found. + +The {guilabel}`Automation Rules` page shows each rule's {guilabel}`Name`, {guilabel}`Action To Do`, +what the automated rule will {guilabel}`Trigger On`, and the {guilabel}`Company` to which the rule +applies. + +To view or modify any existing automation rule, simply click the desired rule from this page. + +:::{note} +When modifying an existing automation rule, Odoo "grays-out" the {guilabel}`Action` section of +the form, and provides the following warning: *Action data can not be updated to avoid unexpected +behaviors. Create a new action instead.* +::: + +To create a new automation rule, click {guilabel}`New`. + +```{image} automatic_alerts/automation-rules-page.png +:align: center +:alt: The Automation Rules page in the Odoo Subscriptions application. +``` + +Clicking {guilabel}`New` reveals a blank {guilabel}`Automation Rules` form with numerous fields to +configure. + +```{image} automatic_alerts/automation-rules-form.png +:align: center +:alt: A sample Automation Rules form in the Odoo Subscriptions application. +``` + +### Automation rule form fields + +- {guilabel}`Action Name`: title of the automated action rule. + +#### Apply On section + +The {guilabel}`Apply On` section dictates which subscription orders/customers this automated action +applies to. + +- {guilabel}`MRR Between`: designate a range of monthly recurring revenue to target. +- {guilabel}`MRR Change More`: designate a change of monthly recurring revenue to target, in either + percentage or unit of currency. +- {guilabel}`Over`: choose a period of time over which the designated KPIs (Key Performance + Indicators) are calculated. +- {guilabel}`Rating Satisfaction`: designate satisfaction as {guilabel}`greater than` or + {guilabel}`less than` a percentage. +- {guilabel}`Status`: select the status of the subscriptions to be included in this automation rule. + The options are: {guilabel}`Quotation`, {guilabel}`Quotation Sent`, {guilabel}`Sales Order`, and + {guilabel}`Cancelled`. +- {guilabel}`Stage goes from`: designate when the automation rule should be activated using two + fields that represent two different stages of the subscription. +- {guilabel}`Subscription Plans`: choose specific subscription plans to target with the automation + rule. +- {guilabel}`Products`: select specific product(s) to target with the automation rule. +- {guilabel}`Customers`: select specific customer(s) to target with the automation rule. +- {guilabel}`Company`: in a multi-company environment, select a specific company's subscription data + to target with the automation rule. +- {guilabel}`Sales Team`: select the data of specific sales team(s) to target with the automation + rule. + +:::{note} +If any field is left blank, the rule applies to every subscription without that specific +designation. +::: + +:::{tip} +The number of subscriptions that match the configured criteria of the customized automation rule +are displayed at the bottom of the {guilabel}`Apply On` field. + +If that green subscriptions link is clicked, Odoo reveals a separate page showcasing all the +subscriptions that meet that automation rule's criteria. +::: + +#### Action section + +The {guilabel}`Action` section dictates what action occurs when an automated rule is triggered. + +In the {guilabel}`Action To Do` field, choose the action that will occur once the automated rule is +triggered. When clicked, the following options become available on a drop-down menu: + +- {guilabel}`Create next activity`: creates the next activity to occur, which is configured in the + {guilabel}`Activity` section that appears at the bottom of the automation rule form. +- {guilabel}`Send an email to the customer`: sends an email to the customer(s) who fit the specified + criteria of the automation rule. +- {guilabel}`Send an SMS Text Message to the customer`: sends an SMS message to the customer(s) who + fit the specified criteria of the automation rule. +- {guilabel}`Set Contract Health value`: set the health value of the subscription contract. + +If {guilabel}`Send an email to the customer` is selected in the {guilabel}`Action To Do` field, the +following field appears: + +- {guilabel}`Email Template`: create (and edit) a new email template *or* select from a list of + pre-configured email templates to send to the customer(s). + +If {guilabel}`Send an SMS Text Message to the customer` is selected in the {guilabel}`Action To Do` +field, the following field appears: + +- {guilabel}`SMS Template`: create (and edit) a new SMS template *or* select from a list of + pre-configured SMS templates to send to the customer(s). + +If {guilabel}`Set Contract Health value` is selected in the {guilabel}`Action To Do` field, the +following field appears: + +- {guilabel}`Health`: designate the health of the subscription by choosing one of the following + options: {guilabel}`Neutral`, {guilabel}`Good`, or {guilabel}`Bad`. + +In the {guilabel}`Trigger On` field, decide whether the automated rule should be triggered on a +{guilabel}`Modification` or {guilabel}`Timed Condition`. + +:::{note} +A {guilabel}`Trigger Now` button appears at the top of the automation rule form *only* when a +trigger has been configured for the rule. +::: + +:::{warning} +When the {guilabel}`Trigger Now` button is clicked, Odoo will trigger the action on *all* linked +subscriptions, regardless of possible timed conditions. +::: + +:::{note} +Sending a SMS text message in Odoo requires In-App Purchase (IAP) credit or tokens. For more +information on {abbr}`IAP (In-App Purchase)`, visit {doc}`../../essentials/in_app_purchase`. +For more information on sending SMS messages, visit +{doc}`../../marketing/sms_marketing`. +::: + +If {guilabel}`Timed Condition` is selected in the {guilabel}`Trigger On` field, the following fields +appear: + +- {guilabel}`Trigger Date`: represents when the condition should be triggered. If left blank, the + action is created upon subscription creation *and* updates. +- {guilabel}`Delay After Trigger`: select a delayed amount of time ({guilabel}`Minutes`, + {guilabel}`Hours`, {guilabel}`Days`, or {guilabel}`Months`) for Odoo to wait before triggering the + configured action. If a negative number is entered, the "delay" will occur *before* the + {guilabel}`Trigger Date`. + +##### Activity section + +If {guilabel}`Create next activity` is selected in the {guilabel}`Action To Do` field, an +{guilabel}`Activity` section appears at the bottom of the {guilabel}`Automation Rules` form. + +- {guilabel}`Activity Type`: select an pre-configured activity type from the drop-down menu. +- {guilabel}`Title`: enter a custom title for the chosen activity. +- {guilabel}`Note`: leave a note for the employee to whom the activity is assigned. +- {guilabel}`Due Date In`: enter an amount of days within which the activity should be completed. +- {guilabel}`Assign To`: choose to assign the specified activity to either: {guilabel}`Subscription + Salesperson`, {guilabel}`Sales Team Leader`, or {guilabel}`Specific Users`. + +:::{note} +If {guilabel}`Specific Users` is selected as the {guilabel}`Assign To` option, a new +{guilabel}`Specific Users` field appears beneath it, where a specific employee(s) can be chosen +as the assignee(s) for the configured activity. +::: + +:::{seealso} +- {doc}`../subscriptions` +- {doc}`plans` +- {doc}`products` +- {doc}`../../essentials/in_app_purchase` +::: + diff --git a/content/applications/sales/subscriptions/closing.md b/content/applications/sales/subscriptions/closing.md new file mode 100644 index 000000000..5cef7b12e --- /dev/null +++ b/content/applications/sales/subscriptions/closing.md @@ -0,0 +1,113 @@ +# Close subscriptions + +Odoo *Subscriptions* provides flexibility for businesses to decide whether customers can self-manage +their subscriptions, or restrict that ability entirely. + +## Configuration + +Start by navigating to {menuselection}`Subscriptions app --> Configuration --> Recurring Plans`. +From there, either create a new plan by clicking {guilabel}`New` or select an existing one to modify +it. + +Once on the {guilabel}`Recurring Plans` form, enable the {guilabel}`Closable` option, in the +{guilabel}`Self-Service` section, to allow customers to close their own subscriptions using the +customer portal. + +```{image} closing/recurring-plans-closable-option.png +:align: center +:alt: The Closable option on a recurring plan form in Odoo Subscriptions. +``` + +:::{seealso} +{doc}`Configure recurring plans ` +::: + +## Close a subscription + +### Administrator view + +After a quotation for a subscription product has been confirmed, it becomes a sales order, and the +subscription status changes to {guilabel}`In Progress`. + +At that point, the ability to close the subscription becomes available, via the {guilabel}`Close` +button at the top of the subscription order, near the row that contains {guilabel}`In Progress` and +other stages. This option is also available after the order has been invoiced and the payment has +been registered. + +```{image} closing/close-subscriptions-administrator.png +:align: center +:alt: Close subscription from an administration point of view with Odoo Subscriptions. +``` + +Clicking the {guilabel}`Close` button prompts a {guilabel}`Close Reason` pop-up window to appear, +allowing administrators to input the reason for closing the subscription, or choose from the +drop-down menu of options in the {guilabel}`Reason` field. + +```{image} closing/close-reason-popup.png +:align: center +:alt: The Close Reason pop-up when the Close button is clicked in Odoo Subscriptions. +``` + +When the desired {guilabel}`Reason` is entered, click the {guilabel}`Submit` button. + +Clicking {guilabel}`Submit` on the {guilabel}`Close Reason` pop-up window updates the subscription +sales order to show {guilabel}`Churned` status tag, along with the specified {guilabel}`Close +Reason`. + +```{image} closing/churned-sales-order.png +:align: center +:alt: A churned sales order for a closed subscription in Odoo Subscriptions. +``` + +That same close reason can be found in the *Chatter* of the sales order, as well. + +```{image} closing/churned-sales-order-chatter.png +:align: center +:alt: The chatter of a churned sales order for a closed subscription in Odoo Subscriptions. +``` + +### Customer view + +:::{note} +As an administrator, the ability to visualize what customers see when managing their +subscriptions is accessible via the {guilabel}`Preview` button, located at the top of the +subscription sales order. +::: + +From the customer's point of view, in the customer portal, the {guilabel}`Close Subscription` button +is located on the left side of the sales order. + +```{image} closing/close-subscription-button-customer-view.png +:align: center +:alt: Close subscription button on a customer's view of a sales order in Odoo Subscriptions. +``` + +When the customer clicks the {guilabel}`Close Subscription` button, a {guilabel}`Close Subscription` +pop-up window appears, in which the customer has to choose from a select list of reasons why they +are choosing to close the subscription. + +```{image} closing/close-subscription-customer-pov.png +:align: center +:alt: The close subscription pop-up window customers see when closing a subscription. +``` + +:::{note} +Customers can *only* chose a pre-configured reason why the subscription is being closed. They can +*not* enter a custom reason from the customer portal. These selections can be adjusted by +navigating to {menuselection}`Subscriptions --> Configuration --> Close Reasons`. +::: + +Once the customer has chosen a close reason, they would click the {guilabel}`Submit` button on the +pop-up window. + +Upon closure, the subscription order in the customer portal is tagged as {guilabel}`Closed`. + +In addition, the specified {guilabel}`Close Reason` appears on the subscription order in the +*Subscriptions* app in the backend (Administrator's view). + +:::{seealso} +- {doc}`../subscriptions` +- {doc}`plans` +- {doc}`products` +::: + diff --git a/content/applications/sales/subscriptions/ecommerce.md b/content/applications/sales/subscriptions/ecommerce.md new file mode 100644 index 000000000..4c924085a --- /dev/null +++ b/content/applications/sales/subscriptions/ecommerce.md @@ -0,0 +1,25 @@ +# Subscriptions in the eCommerce shop + +Subscription products can be sold in the Odoo *eCommerce* shop just like regular sales products. + +:::{seealso} +- {doc}`Configure subscription products ` +::: + +## Selling eCommerce subscriptions + +{doc}`Configure the subscription product ` as a regular recurring sales product. To +start selling the subscription in the eCommerce shop, click the {guilabel}`Go to Website` smart +button to navigate to the product page. + +From here, review the subscription product and its recurring periods. Then, toggle the switch in the +upper-right corner from {guilabel}`Unpublished` to {guilabel}`Published`. + +The new subscription product is now available to purchase on the eCommerce website, with options +for the different recurring periods. + +```{image} ecommerce/subscription-product.png +:align: center +:alt: Subscription product on eCommerce website. +``` + diff --git a/content/applications/sales/subscriptions/payment_providers.md b/content/applications/sales/subscriptions/payment_providers.md new file mode 100644 index 000000000..3a6eaa579 --- /dev/null +++ b/content/applications/sales/subscriptions/payment_providers.md @@ -0,0 +1,12 @@ +--- +nosearch: true +--- + +# Payment providers + +```{toctree} +:titlesonly: true + +payment_providers/wire_transfer +``` + diff --git a/content/applications/sales/subscriptions/payment_providers/wire_transfer.md b/content/applications/sales/subscriptions/payment_providers/wire_transfer.md new file mode 100644 index 000000000..f79dd10ab --- /dev/null +++ b/content/applications/sales/subscriptions/payment_providers/wire_transfer.md @@ -0,0 +1,164 @@ +# Wire transfer + +The *wire transfer* payment method allows for payment instructions to be shared with a customer +after purchasing a product. With a subscription, these payment instructions are shared every time +the payment is renewed. + +:::{note} +The wire transfer payment method requires minimal setup, but in most cases, it is inefficient +compared to other online payment providers. It is recommended to use another payment provider +with subscriptions, due to wire transfers requiring manual confirmation for each payment. +::: + +(subscriptions-wire-transfer-configuration)= + +## Configuration + +To use the wire transfer payment method, first ensure the *Wire Transfer* payment method is enabled. + +To do so, begin by navigating to the *Payment Providers* page in either the **Accounting**, +**Website**, or **Sales** apps. + +For example, navigate to {menuselection}`Accounting app --> Configuration --> Online Payments: +Payment Providers`, then click the {guilabel}`Wire Transfer` card. + +:::{tip} +If the **Accounting** app is not installed, the *Payment Providers* page can also be reached by +navigating to {menuselection}`Website app --> Configuration --> eCommerce: Payment Providers`, or +{menuselection}`Sales app --> Configuration --> Online Payments: Payment Providers`. +::: + +Next, set the {guilabel}`State` to {guilabel}`Enabled` to enable wire transfers. Use the drop-down +menus next to the {guilabel}`Company` and {guilabel}`Website` fields to set where wire transfers can +be used. + +The options in the {guilabel}`Configuration` tab can be used to customize the wire transfer. +Optionally tick the checkbox next to {guilabel}`Enable QR Codes` to enable the use of QR codes when +paying by wire transfer, if desired. + +Use the drop-down menu next to the {guilabel}`Communication` field to select the communication type +used on sales orders. Choose {guilabel}`Based on Document Reference` to use the sales order (or +invoice number), or {guilabel}`Based on Customer ID` to use the customer identifier. With either +method selected, communication is given to the customer, once they choose the wire transfer payment +method. + +The configuration options listed under the {guilabel}`Availability` section are used to set payment +restrictions, and are optional. Use the {guilabel}`Maximum Amount` field to set a maximum payment +value, the {guilabel}`Currencies` field to restrict any currencies from being used for payment, and +the {guilabel}`Countries` field to restrict payment from any particular countries, if desired. + +In the {guilabel}`Messages` tab, use the {guilabel}`Pending Message` field to add a message +containing wire transfer information. This message is displayed to the customer after confirming +their order, as well as if the order is marked as pending after the payment is processed. + +If {doc}`a bank account <../../../finance/accounting/bank>` has already been defined, the account +number is automatically added to the default message generated by Odoo. A bank account can also be +added afterwards, and the message updates with the appropriate bank information by clicking +{icon}`fa-refresh` {guilabel}`Reload pending message`. + +Once all necessary configuration settings are complete, the {icon}`fa-eye-slash` +{guilabel}`Unpublished` smart button located at the top of the page automatically changes to +{icon}`fa-globe` {guilabel}`Published` to show the wire transfer payment option is now visible +to customers. Only keep the payment method published if payments are ready to be received. + +:::{tip} +It is possible to keep the payment method enabled, but **not** visible to customers, until +payments are ready to be received. To do that, set the smart button to {icon}`fa-eye-slash` +{guilabel}`Unpublished` after setting the {guilabel}`State` to {guilabel}`Enabled`. +::: + +```{image} wire_transfer/wire-transfer-published.png +:align: center +:alt: The wire transfer card enabled and published. +``` + +### Test mode + +The wire transfer payment method can be tested before it is accessed by customers by selecting the +{guilabel}`Test Mode` option in the {guilabel}`State` field on the form. Upon selecting +{guilabel}`Test Mode`, an orange {guilabel}`Test mode` banner appears in the upper-right corner of +the form. + +Next, enter the credentials for a bank account with accessible transactions in the +{guilabel}`Messages` tab. To re-enable normal function after testing, change the {guilabel}`State` +setting to {guilabel}`Enabled`. + +:::{note} +By default, the payment provider remains {guilabel}`Unpublished` in {guilabel}`Test Mode`, so it +is not visible to visitors. +::: + +:::{warning} +It is recommended to use the {guilabel}`Test Mode` setting on a duplicate (or test) database to +avoid potential issues with invoice numbering. +::: + +(subscriptions-wire-transfer-payment)= + +## Pay by wire transfer + +With wire transfers {ref}`enabled and published `, +customers see wire transfers as an available payment method at checkout when purchasing a product. + +When this method is selected by a customer, they are shown the *Pending Message* set in the +{ref}`wire transfer configuration page `, after +confirming their purchase. Once the purchase is confirmed, a sales order is created. + +```{image} wire_transfer/payment-instructions-checkout.png +:align: center +:alt: The wire transfer pending message shown to customers. +``` + +:::{important} +Online orders remain in the *Quotation sent* (i.e. unpaid order) stage until both the payment is +received, *and* the order is confirmed manually, using the {guilabel}`Confirm` button on the +sales order. +::: + +To begin processing the payment, navigate to {menuselection}`Sales app --> Orders --> Orders`, and +click the corresponding sales order. Ensure the sales order is correct, then click +{guilabel}`Confirm` to confirm the sales order. + +Next, click the new {guilabel}`Create Invoice` button, then choose {guilabel}`Regular invoice`, and +click {guilabel}`Create Draft Invoice`. A draft of the invoice appears. Click {guilabel}`Confirm` to +validate the invoice. + +To send this invoice to the customer, click the {guilabel}`Send & Print` button. A {guilabel}`Send` +pop-up window appears, with an email template configured, and a PDF invoice attached. + +Ensure the information is correct, then click {guilabel}`Send & Print`. The pop-up window +disappears, and the {guilabel}`Send & Print` button turns gray to show the invoice has been sent. + +:::{tip} +The default template for sending an invoice can be modified by navigating to +{menuselection}`Settings app --> Companies --> Email Templates --> Review All Templates --> +Invoice: Sending`. +::: + +Next, click the {guilabel}`Register payment` button on the invoice page. A pop-up window titled, +{guilabel}`Register Payment`, appears with options for selecting the type of payment. In the +{guilabel}`Journal` field, select {guilabel}`Bank` from the drop-down menu. Next, set the +{guilabel}`Payment Method` to {guilabel}`Manual`. Ensure the {guilabel}`Amount` and +{guilabel}`Payment Date` are correct, then click the {guilabel}`Create Payment` button. + +```{image} wire_transfer/register-payment.png +:align: center +:alt: The register payment pop-up window. +``` + +The customer invoice is revealed with a green {guilabel}`In Payment` banner in the upper-right +corner. At this point, the flow is now complete. + +```{image} wire_transfer/in-payment-banner.png +:align: center +:alt: The green in payment banner displayed on the invoice. +``` + +:::{note} +If payment has been received before sending the invoice, such as in cash, the payment can still +be registered in Odoo by clicking the {guilabel}`Register Payment` button, and creating the +payment *before* clicking {guilabel}`Send & Print`. Now, when an invoice is sent using the +{guilabel}`Send & Print` button, a new line is automatically added to the invoice message, +stating the invoice is already paid. +::: + diff --git a/content/applications/sales/subscriptions/plans.md b/content/applications/sales/subscriptions/plans.md new file mode 100644 index 000000000..acdffb96a --- /dev/null +++ b/content/applications/sales/subscriptions/plans.md @@ -0,0 +1,107 @@ +# Subscription plans + +*Subscription plans* are {doc}`quotation templates +` used to preconfigure quotations with +subscription products. Use subscription plans to quickly create subscription orders. + +## Configure subscription plans + +To configure subscription plans, go to {menuselection}`Subscriptions --> Configuration --> Plans`. +Then, click {guilabel}`New` to create a new plan, or select an existing plan to edit it. + +Since the Odoo *Subscriptions* app is integrated closely with the *Sales* app, subscription plans +use the same form as quotation templates. + +```{image} plans/subplan-quotation-template.png +:align: center +:alt: Subscription plan (quotation template) configuration form. +``` + +The subscription plan form contains the following options: + +- {guilabel}`Name`: Enter a name for the subscription plan at the top of the page. + +- {guilabel}`Quotation expires after`: Enter the number of days after which the quotation expires, + starting from the day the quotation is sent to the customer. Leave this field at zero for the + quotation to never expire. + +- {guilabel}`Online Confirmation`: Check the boxes next to {guilabel}`Signature` or + {guilabel}`Payment` to enable the customer to confirm their subscription order by signing or + paying for the quotation. Enable both to leave the choice to the customer. Enable neither to only + confirm the quotation in the backend. + +- {guilabel}`Confirmation Mail`: Select an {doc}`email template + ` for the confirmation email that is + automatically sent to the customer after the quotation is confirmed. Leave this field blank to + send nothing. + + - To create a new email template, enter a name for the template, then click {guilabel}`Create and + edit`. + - To edit an existing email template, select one from the drop-down menu, then click on the + {guilabel}`Internal link` arrow at the end of the line. + +- {guilabel}`Recurrence`: Select the recurrence period used for the plan. The recurrence periods + available here are the same ones that are configured in {menuselection}`Subscriptions --> + Configuration --> Recurrence Periods`. + +Selecting a {guilabel}`Recurrence` turns the quotation template into a subscription plan and enables +the following additional options: + +- {guilabel}`Duration`: Choose whether the subscription plan has no end date ({guilabel}`Forever`) + or a {guilabel}`Fixed` duration. + + - If the duration is {guilabel}`Forever`, then the subscription plan will continually renew until + either the customer or the company manually ends the subscription. + - If the duration is {guilabel}`Fixed`, then enter an {guilabel}`End After` date, which determines + the amount of time after which the subscription will automatically end. + +- {guilabel}`Self Closable`: Check this box to enable the customer to terminate their subscription + from the {doc}`customer portal + `. + +- {guilabel}`Automatic Closing`: Enter the number of days after which *unpaid* subscriptions *past* + the due date are automatically closed. + +- {guilabel}`Invoicing Journal`: Select the accounting journal in which invoices for this + subscription plan are recorded. Leave this field blank to use the sales journal with the lowest + sequence. + +```{image} plans/subplan-recurrence.png +:align: center +:alt: Subscription plan with Recurrence selected. +``` + +In the {guilabel}`Lines` tab, create the order lines for the quotation. Click {guilabel}`Add a +product`, select a product to include in the plan, and then enter the {guilabel}`Quantity` and +{guilabel}`Unit of Measure`. Add as many products as desired to the order lines. + +In the {guilabel}`Optional Products` tab, enter any optional products that the customer can add to +their quotation before confirming the order. + +If the subscription plan has unique {doc}`terms and conditions +`, add them in the +{guilabel}`Terms & Conditions` tab. If terms conditions are specified on a plan, these will be used +instead of the default terms and conditions set up in the *Sales* app settings. + +```{image} plans/subplan-terms-conditions.png +:align: center +:alt: Subscription plan Terms & Conditions tab. +``` + +## Use subscription plans on quotations + +Quotations for subscription products can be created in both the *Subscriptions* app and the *Sales* +app. + +From the {guilabel}`Subscriptions` dashboard, click {guilabel}`New` to create a new quotation. Then, +select a subscription plan in the {guilabel}`Subscription Plan` field. + +The {guilabel}`Recurrence`, products, and other information from the plan are automatically filled +in. The quotation can then be modified further as needed. + +From the {guilabel}`Sales` dashboard, click {guilabel}`New` to create a new quotation. Then, select +a subscription plan in the {guilabel}`Quotation Template` field. + +All subscription orders will appear on the {guilabel}`Subscriptions` dashboard regardless of whether +they were created in the *Subscriptions* app or the *Sales* app. + diff --git a/content/applications/sales/subscriptions/products.md b/content/applications/sales/subscriptions/products.md new file mode 100644 index 000000000..15cb066d9 --- /dev/null +++ b/content/applications/sales/subscriptions/products.md @@ -0,0 +1,168 @@ +# Subscription products + +By closely integrating with the Odoo *Sales* app, the *Subscriptions* app enables users to sell +subscription products alongside regular sales products. While regular products are sold on a +one-time basis, subscription products are sold on a renewing basis, generating recurring revenue. + +In Odoo, subscription products are also called *recurring* products. + +## Configure recurrence periods + +To get started with subscriptions, the *recurrence periods* must be properly configured, as needed. + +Recurrence periods are the time periods in which subscriptions renew. They designate how often the +customer pays for (and receives) subscription products. + +To configure recurrence periods, go to {menuselection}`Subscriptions app --> Configuration --> +Recurrence periods`. + +```{image} products/recurrence-periods-page.png +:align: center +:alt: The recurrence periods page in Odoo Subscriptions application. +``` + +The *Subscriptions* app comes with some basic recurrence periods already configured: + +- {guilabel}`Monthly` +- {guilabel}`Quarterly` +- {guilabel}`Weekly` +- {guilabel}`2 Weeks` +- {guilabel}`Yearly` +- {guilabel}`3 Years` +- {guilabel}`5 Years` + +New recurrence periods can be added and/or edited at any time. + +To create a new recurrence period, click {guilabel}`New` on the {guilabel}`Recurrence Periods` page. +Doing so reveals a blank recurrence period form. + +```{image} products/recurrence-period-form.png +:align: center +:alt: A recurrence period form in Odoo Subscriptions application. +``` + +Then, type in the {guilabel}`Name` and {guilabel}`Duration` of the recurrence period, and select the +{guilabel}`Unit` that defines the duration. + +:::{important} +The unit {guilabel}`Days` *cannot* be used as a recurrence period on subscriptions. The daily +recurrence is meant for rentals, and **cannot** be added on recurring subscription sales orders. + +This limitation is there to avoid sales orders that would generate daily invoices. +::: + +## Product form configuration + +To create a new subscription product, navigate to {menuselection}`Subscriptions app --> Products --> +Products`, and click {guilabel}`New`. + +Doing so reveals a blank product form, which can be configured and customized in a number of ways. + +:::{note} +By default, the {guilabel}`Recurring` option is already enabled, prompting Odoo to recognize it +as a subscription product. Be sure to leave the {guilabel}`Recurring` and {guilabel}`Can be Sold` +options enabled. + +The {guilabel}`Product Type` field is set to {guilabel}`Service` by default, as well. However, +subscription products *can* be set to other types, if needed. +::: + +:::{important} +When creating a physical subscription product in the Odoo **Sales** application, the +{guilabel}`Invoicing Policy` must be set to {guilabel}`Ordered quantities`. + +Setting it to {guilabel}`Delivered quantities` causes issues with invoice creation, and disrupts +the subscription process. + +Similarly, when creating a physical subscription product in the Odoo **Subscriptions** +application, the {guilabel}`Invoicing Policy` must **not** be set to {guilabel}`Based on +Delivered Quantity (Manual)` for the same reasons. +::: + +```{image} products/subscription-product-form.png +:align: center +:alt: A basic subscription product form in Odoo Subscriptions application. +``` + +### Time-based pricing + +Once the desired fields in the {guilabel}`General Information` tab have been entered, click the +{guilabel}`Time-based pricing` tab on the product form. + +```{image} products/time-based-pricing-tab.png +:align: center +:alt: The time-based pricing tab on a subscription product form in Odoo Subscriptions. +``` + +From here, click {guilabel}`Add a price` to begin defining recurring prices. + +In the {guilabel}`Period` column, select a desired recurrence period. In the {guilabel}`Pricelist` +column, select a pricelist, if needed. Then, in the {guilabel}`Price` column, enter the price for +that recurrence period. + +:::{note} +{guilabel}`Daily` and {guilabel}`Hourly` periods **cannot** be used on recurring products. + +```{image} products/validation-error-popup.png +:align: center +:alt: The validation error pop-up window that appears in Odoo Subscriptions. +``` +::: + +:::{note} +There is *no limit* to how many lines can be added to the {guilabel}`Time-based pricing` table. +::: + +:::{tip} +An existing product can be made into a subscription product, simply by marking it as +{guilabel}`Recurring`, and configuring {guilabel}`Time-based pricing` on the product form. +::: + +#### Pricelists + +{doc}`Pricelists <../sales/products_prices/prices/pricing>` can be used with subscription products +to give special pricing to customers included in pricelists. + +This can be configured either in the {guilabel}`Time-based pricing` tab of the product form, or on +the pricelist form in the *Sales* application. + +To create recurring price rules for specific pricelists in the {guilabel}`Time-based pricing` tab of +the product form, select a pricelist in the {guilabel}`Pricelist` column. + +```{image} products/pricelist-time-based-pricing.png +:align: center +:alt: Pricelists in the "Time-based pricing" tab of the product form. +``` + +When pricelists are added to the {guilabel}`Time-based pricing` tab, the pricelist form in the +*Sales* app is automatically updated. + +Time-based pricing rules can also be configured directly on the pricelist form. + +To do this, go to {menuselection}`Sales app --> Products --> Pricelists`, and select a pricelist (or +click {guilabel}`New` to create a new pricelist). + +:::{note} +Pricelists are also accessible through the Odoo *Subscriptions* app by following the same menu +steps. +::: + +Then, on the pricelist form, under the {guilabel}`Time-based rules` tab, click {guilabel}`Add a +line`. + +```{image} products/pricelist-form-time-based-rules-tab.png +:align: center +:alt: The time-based rules tab on a pricelist form in Odoo Sales. +``` + +Then, select a subscription product in the {guilabel}`Products` column, and select a recurrence +period in the {guilabel}`Period` column. Lastly, enter a {guilabel}`Price` for that particular +product and period. Add as many lines as needed. + +When {guilabel}`Time-based rules` are added to the pricelist form, the {guilabel}`Time-based +pricing` tab of the product form is automatically updated. + +:::{seealso} +{doc}`ecommerce` +::: + diff --git a/content/applications/sales/subscriptions/renewals.md b/content/applications/sales/subscriptions/renewals.md new file mode 100644 index 000000000..015637745 --- /dev/null +++ b/content/applications/sales/subscriptions/renewals.md @@ -0,0 +1,139 @@ +# Renew subscriptions + +The foundation of any subscription business model is recurring payments. This is when customers +reliably pay a regular amount at specific intervals, in exchange for access to a subscription +product or service. + +Subscription renewal is the process customers follow when they willingly choose to continue +participating in, and paying for, a subscription product or service. + +Subscribers experience the renewal process at different intervals -- weekly, monthly, annually, etc. +-- depending on the duration of the agreed-upon contract. + +Most companies that offer subscriptions prefer to automate the renewal process for customers. +However, manual subscription renewals are still used in some cases. + +With the Odoo **Subscriptions** application, a company can manage all of its subscriptions in one +place. Renewals can be processed automatically, or manually, include additional products or upsells +per renewal order, and be filtered in batch views to quickly locate customers who need to renew +their subscriptions. + +## Subscription renewals + +In order to renew a subscription, a quotation with a subscription product **must** be confirmed, +with a configured *Recurring Plan* selected. + +To open a subscription quotation, navigate to {menuselection}`Subscriptions app --> Subscriptions +--> Quotations`, and select the desired quotation from the list. Or, create a new one by clicking +{guilabel}`New` to open a new quotation form. + +:::{note} +- Only a singular product is required. +- A subscription service counts as a product, as it is considered a recurring product. +::: + +Subscription quotations **must** be confirmed, and payment from the customer for the +initial subscription **must** be invoiced and registered in order to successfully open a *Renewal +Quotation*. + +:::{seealso} +For more information on the above process of confirming quotations and invoicing payments, +see: +\- {doc}`../sales/send_quotations/create_quotations` +\- {doc}`../sales/send_quotations/get_paid_to_validate` +::: + +Once the payment from the subscription quotation is confirmed, the quotation turns into a sales +order. An {guilabel}`In Progress` tag is applied to the sales order form, and a series of buttons +also appear at the top of the sales order, including a {guilabel}`Renew` button. + +```{image} renewals/renew-button.png +:align: center +:alt: Renew button on subscription sales order with Odoo Subscriptions. +``` + +When the {guilabel}`Renew` button is clicked, Odoo instantly presents a new renewal quotation, +complete with a {guilabel}`Renewal Quotation` tag. + +```{image} renewals/renewal-quotation.png +:align: center +:alt: Renewal quotation in the Odoo Subscriptions application. +``` + +From here, a standard sales flow can occur to confirm the quotation. This typically begins +by clicking {guilabel}`Send by Email`, which sends a copy of the quotation to the customer, by +email, for them to confirm, and eventually, pay for. + +:::{note} +In the chatter of the {guilabel}`Renewal Quotation`, it is mentioned that this subscription is +the renewal of the subscription from the original sales order. +::: + +Once the {guilabel}`Renewal Quotation` is confirmed, it becomes a sales order, and a +{guilabel}`Sales History` smart button appears at the top of the page. + +```{image} renewals/sales-history-smart-button.png +:align: center +:alt: Sales History smart button in the Odoo Subscriptions application. +``` + +When that {guilabel}`Sales History` smart button is clicked, Odoo reveals a separate page, +showcasing the different sales orders attached to this subscription, along with their individual +{guilabel}`Subscription Status`. + +```{image} renewals/sales-history-page.png +:align: center +:alt: Renewal quotation in the Odoo Subscriptions application. +``` + +Additionally, once the {guilabel}`Renewal Quotation` is confirmed, an {guilabel}`MRR` smart button +also appears at the top of the sales order. + +```{image} renewals/mrr-smart-button.png +:align: center +:alt: MRR smart button in the Odoo Subscriptions application. +``` + +When clicked, Odoo reveals an {guilabel}`MRR Analysis` page, detailing the monthly recurring revenue +related to this specific subscription. + +::::{important} +On rare occasions, automatic payment can fail, which results in a *Payment Failure* tag on the +top-right of the sales order, if there is an error in the payment method. + +This is done to prevent the system from charging the customer again the next time a scheduled +action is run. Because the status of the payment is unknown, Odoo requests a manual operation to +check if the payment has been made, before the payment can be used again. + +To do this, navigate to {menuselection}`Subscriptions app --> Subscriptions --> Quotations`. +Click into the desired subscription, then check the *Chatter* to see if the payment was made. + +If the payment was **not** made, first enter {doc}`debug mode <../../general/developer_mode>`. +Then, click the {guilabel}`Other Info` tab, and untick the checkbox next to {guilabel}`Contract +in exception`. Reload the sales order, and the {guilabel}`Payment Failure` tag is gone. + +If the payment **was** made, a new invoice must be made and posted manually. This automatically +updates the next invoice date of the subscription. Once created, enter {doc}`debug mode +<../../general/developer_mode>`, and navigate to the new sales order. Click the {guilabel}`Other +Info` tab, and untick the checkbox next to {guilabel}`Contract in exception`. +Reload the sales order, and the {guilabel}`Payment Failure` tag is gone. + +:::{figure} renewals/contract-in-exception.png +:align: center +:alt: The "contract in exception" option selected with the "payment failure" tag shown. + +The {guilabel}`contract in exception`` option selected with the {guilabel}`payment failure` +tag shown. +::: + +In both cases, once the {guilabel}`Contract in exception` option is no longer selected, Odoo +handles renewals automatically again. If the subscription remains in *payment failure*, it is +skipped by Odoo until the sales order is closed. +:::: + +:::{seealso} +- {doc}`../subscriptions` +- {doc}`plans` +- {doc}`products` +::: + diff --git a/content/applications/sales/subscriptions/reports.md b/content/applications/sales/subscriptions/reports.md new file mode 100644 index 000000000..dc3a0f541 --- /dev/null +++ b/content/applications/sales/subscriptions/reports.md @@ -0,0 +1,418 @@ +--- +substitutions: + ARR: '{abbr}`ARR (Annual Recurring Revenue)`' + MRR: '{abbr}`MRR (Monthly Recurring Revenue)`' +--- + +# Subscription reports + +The Odoo **Subscriptions** app provides a series of reporting pages to help companies analyze how +subscriptions are performing. + +On the *Subscriptions Analysis* reporting page, users can view specific data related to recurring +subscriptions, quantity of subscriptions, in-progress or paused subscriptions, and more. + +The *Retention Analysis* reporting page provides an organized table of subscription retention +percentages over any period of time. + +The *MRR Breakdown* reporting page clearly divides {{ MRR }} and {{ ARR }} metrics for subscriptions into +various graphs, lists, and charts. + +And the *MRR Analysis* reporting page offers a time-based collection of analytics showcasing how +subscription {{ MRR }} and {{ ARR }} have changed over the course of any given period of time. + +## Reporting page elements + +All subscriptions-based reporting pages can be accessed via the {guilabel}`Reporting` header menu in +the **Subscriptions** app. + +The following sections describe elements found on each reporting page. + +### Filters and Group By + +*Filters* are used to narrow down metrics to show specific analytics, whereas groupings (via the +*Group By* option) are used to gather the data from specific sections into groups for more +organized analysis. + +This section refers to both filters and groupings, as a combination of the two can be saved in the +*Favorites* section. + +To modify the results being shown on any reporting page, click the {icon}`fa-caret-down` +{guilabel}`(down arrow)` icon to the right of the search bar. Doing so reveals a drop-down menu of +detailed filter and grouping options. + +If desired, a filter or grouping (or combination of filters and/or groupings) can be saved in the +{guilabel}`Favorites` section of that drop-down menu. To do so, click the {icon}`fa-caret-down` +{guilabel}`(down arrow)` icon beside {guilabel}`Save current search`, located beneath the +{guilabel}`Favorites` section. + +This reveals a field to assign a title to the favorite filter. Two options are also found beneath +the title field: {guilabel}`Default filter` and {guilabel}`Shared`. + +Ticking the checkbox beside {guilabel}`Default filter` makes the newly-favorited filter the default +option for that reporting page. + +Ticking the checkbox beside {guilabel}`Shared` makes the newly-favorited filter available to other +users in the database. + +:::{note} +The {guilabel}`Default filter` and {guilabel}`Shared` options are **not** required, and only +*one* of these options can be selected at a time. +::: + +To save the filter, click {guilabel}`Save` in the {guilabel}`Favorites` section of the drop-down +filter menu. + +When clicked, that saved filter appears beneath the {guilabel}`Favorites` column of the drop-down +filter menu, and a {icon}`fa-star` {guilabel}`(gold star)` icon appears beside the favorite filter's +name in the search bar. + +### Views + +On the {guilabel}`Subscription Analysis`, {guilabel}`MRR Breakdown`, and {guilabel}`MRR Analysis` +reporting pages, three different view options are located in the upper-right corner. + +:::{note} +There are *no* other view options available on the {guilabel}`Retention Analysis` reporting page. +::: + +The available view options, from left to right, are: + +- {guilabel}`Graph` +- {guilabel}`List` +- {guilabel}`Pivot` + +```{image} reports/subscriptions-analysis-page-view-options.png +:align: center +:alt: The different view options available on the Subscriptions Analysis page. +``` + +Each view has its own series of related view-specific visual options. + +#### Graph view + +With the graph view selected, the following options appear between the search bar and visual +representation of the data. These graph-specific options are located to the right of the +{guilabel}`Measures` and {guilabel}`Insert in Spreadsheet` buttons. + +```{image} reports/subscriptions-graph-specific-options.png +:align: center +:alt: The different graph view options in the Odoo Subscriptions app. +``` + +The first three options, from left to right, represent different graph-related views. The remaining +options represent different ways to organize and visualize that specific graph-related data. + +From left to right, the specific graph-related view options are: + +- {icon}`fa-bar-chart` {guilabel}`Bar Chart`: showcases the data in a bar chart format. +- {icon}`fa-line-chart` {guilabel}`Line Chart`: showcases the data in a line chart format. +- {icon}`fa-pie-chart` {guilabel}`Pie Chart`: showcases the data in a pie chart format. + +Each graph view option has its own series of specific visual options, which are represented by the +available buttons that appear to the right of the selected graph-related view option. + +When the {icon}`fa-bar-chart` {guilabel}`Bar Chart` graph view is selected, the following visual +options are available: + +- {icon}`fa-database` {guilabel}`Stacked`: showcases the data in a stacked visual format. +- {icon}`fa-sort-amount-desc` {guilabel}`Descending`: showcases the data in descending order. +- {icon}`fa-sort-amount-asc` {guilabel}`Ascending`: showcases the data in ascending order. + +When the {guilabel}`Line Chart` graph view is selected, the following visual options are available: + +- {icon}`fa-database` {guilabel}`Stacked`: showcases the data in a stacked visual format. +- {icon}`fa-signal` {guilabel}`Cumulative`: showcases the data in accumulated, increasing format. +- {icon}`fa-sort-amount-desc` {guilabel}`Descending`: showcases the data in descending order. +- {icon}`fa-sort-amount-asc` {guilabel}`Ascending`: showcases the data in ascending order. + +When the {guilabel}`Pie Chart` graph view is selected, there are no additional visual options. + +#### List view + +With the list view selected, the subscription metrics being analyzed are displayed in a simple list, +which can be fully customized by using any of the available filters or groupings in the drop-down +filter menu (accessible via the {icon}`fa-caret-down` {guilabel}`(down arrow)` icon to the right of +the search bar). + +:::{note} +With list view selected, the {guilabel}`Measures` drop-down menu and {guilabel}`Insert in +Spreadsheet` button are *not* available. +::: + +#### Pivot view + +With the pivot view selected, the subscription metrics are displayed in a data table, which can be +fully customized. + +The pivot data table can be customized using the options available in the {guilabel}`Measures` +drop-down menu, and/or the filter grouping options available in the filter drop-down menu +(accessible via the {icon}`fa-caret-down` {guilabel}`(down arrow)` icon to the right of the search +bar). + +Three pivot-specific options are available, located to the right of the {guilabel}`Measures` +drop-down menu and {guilabel}`Insert in Spreadsheet` button. + +```{image} reports/subscriptions-pivot-view-options.png +:align: center +:alt: The pivot-specific view options available in the Odoo Subscriptions app. +``` + +From left to right, those pivot-specific view options are: + +- {icon}`fa-exchange` {guilabel}`Flip axis`: the `x` and `y` axis of the pivot data table flip. +- {icon}`fa-arrows` {guilabel}`Expand all`: all the available rows and columns of the pivot data + table expand fully. +- {icon}`fa-download` {guilabel}`Download .xlsx`: the pivot data table is downloaded as an + {file}`.xlsx` file. + +### Measures + +The graph and pivot reporting pages have their own metric-specific {guilabel}`Measures` drop-down +menu of data-related options to choose from, located in the upper-left corner, above the visual +representation of metrics. + +```{image} reports/subscriptions-measures-drop-down.png +:align: center +:alt: The standard measures drop-down menu in the Odoo Subscriptions app. +``` + +When the {guilabel}`Measures` button is clicked, a series of selectable measures becomes available, +via a drop-down menu. When any of the options are selected from the {guilabel}`Measures` drop-down +menu, the chosen metrics related to that specific measure appear on the reporting page. + +:::{note} +For more information on the different measures that can be utilized on each reporting page, refer +to the {ref}`specific reporting page breakdowns ` found below in +this documentation. +::: + +### Insert in spreadsheet + +Beside the {guilabel}`Measures` drop-down menu, there is an {guilabel}`Insert in Spreadsheet` +button. + +When clicked, the ability to add the configured data currently being showcased on the reporting page +into a new or pre-existing spreadsheet or dashboard becomes available, via a pop-up window. + +```{image} reports/subscriptions-analysis-spreadsheet-popup.png +:align: center +:alt: The spreadsheet pop-up window of the Subscriptions Analysis page. +``` + +Select the desired option from this pop-up window, then click {guilabel}`Confirm`. + +(subscriptions-reports-reporting)= + +## Reporting pages + +In the Odoo **Subscriptions** app, there are four different reporting pages available. + +To access, analyze, and customize various reports related to subscriptions, navigate to +{menuselection}`Subscriptions app`, and click the {guilabel}`Reporting` drop-down menu in the +header to reveal the following reporting pages: + +- {guilabel}`Subscriptions` +- {guilabel}`Retention` +- {guilabel}`MRR Breakdown` +- {guilabel}`MRR Timeline` + +Clicking any of those options reveals a separate, fully-customizable reporting page focusing on that +particular aspect of subscription data. + +The following is a breakdown of those four specific reporting pages. + +### Subscriptions analysis + +To access the {guilabel}`Subscriptions Analysis` reporting page, navigate to +{menuselection}`Subscriptions app --> Reporting --> Subscriptions`. + +By default, the {guilabel}`Bar Chart` option, in the {guilabel}`Graph` view, is selected on the +{guilabel}`Subscriptions Analysis` reporting page. + +The following filters are also present in the search bar: {guilabel}`In Progress or Paused` and +{guilabel}`Recurring`. + +```{image} reports/subscriptions-analysis-page-default.png +:align: center +:alt: The default view of the Subscriptions Analysis reporting page in Odoo Subscriptions. +``` + +When the {guilabel}`Measures` button on the {guilabel}`Subscriptions Analysis` page is +clicked, a series of metric-related options becomes available as a drop-down menu. + +```{image} reports/subscriptions-analysis-measures.png +:align: center +:alt: The measures drop-down menu of the Subscriptions Analysis page. +``` + +The metric-related options in the {guilabel}`Measures` drop-down menu on the +{guilabel}`Subscriptions Analysis` page are: + +- {guilabel}`Monthly Recurring` +- {guilabel}`Quantity` +- {guilabel}`Recurring Revenue` +- {guilabel}`Untaxed Total` +- {guilabel}`Yearly Recurring` +- {guilabel}`Count` + +:::{note} +The {guilabel}`Monthly Recurring` measure option is selected by default. +::: + +When any of those available measures are clicked, Odoo displays that selected data on the reporting +page for further analysis. + +### Retention analysis + +To access the {guilabel}`Retention Analysis` reporting page, navigate to +{menuselection}`Subscriptions app --> Reporting --> Retention`. + +The {guilabel}`Retention Analysis` reporting page differs from the other **Subscriptions** app +reporting pages, in that it does **not** provide any additional view options. The data on this page +is only presented in a customizable data chart. + +```{image} reports/subscriptions-retention-analysis-page-default.png +:align: center +:alt: The default view of the Retention Analysis reporting page in Odoo Subscriptions. +``` + +When the {guilabel}`Measures` drop-down menu on the {guilabel}`Retention Analysis` reporting page is +clicked, a series of metric-related options become available. + +```{image} reports/subscriptions-retention-analysis-measures.png +:align: center +:alt: The measures drop-down menu of the Retention Analysis page. +``` + +The metric-related options in the {guilabel}`Measures` drop-down menu on the {guilabel}`Retention +Analysis` reporting page are: + +- {guilabel}`Amount to invoice` +- {guilabel}`Margin` +- {guilabel}`Margin (%)` +- {guilabel}`Prepayment percentage` +- {guilabel}`Shipping Weight` +- {guilabel}`Unpaid Amount` +- {guilabel}`Count` + +:::{note} +The {guilabel}`Count` measure option is selected by default. +::: + +To the right of the {guilabel}`Measures` drop-down menu on the {guilabel}`Retention Analysis` page +is an additional drop-down menu containing different time periods. The default time period is +{guilabel}`Month`. + +When clicked, a drop-down menu of various time period options become available. + +```{image} reports/subscriptions-retention-analysis-time-periods.png +:align: center +:alt: The time period drop-down menu of the Retention Analysis page. +``` + +The time period options are: + +- {guilabel}`Day` +- {guilabel}`Week` +- {guilabel}`Month` +- {guilabel}`Year` + +When a time period option from this drop-down menu is selected, the {guilabel}`Retention Analysis` +reporting page showcases data for the configured measures and filters within that time period. + +To the right of the time period drop-down menu, there is a download button, which allows the user to +download the data presented on the {guilabel}`Retention Analysis` page as an Excel file. + +### MRR breakdown + +To access the {guilabel}`MRR Breakdown` reporting page, navigate to {menuselection}`Subscriptions +app --> Reporting --> MRR Breakdown`. + +By default, the data displayed on the {guilabel}`MRR Breakdown` reporting page is in graph view, +with the {guilabel}`Bar Chart` option and {guilabel}`Stacked` option selected. + +A default filter is also available in the search bar for {guilabel}`Event Date: Month > Event Type`. + +```{image} reports/subscriptions-mrr-breakdown-default.png +:align: center +:alt: The default appearance of the MRR Breakdown reporting page in Odoo Subscriptions. +``` + +When the {guilabel}`Measures` drop-down menu on the {guilabel}`MRR Breakdown` reporting page is +clicked, a series of metric-related options become available. + +```{image} reports/subscriptions-mrr-breakdown-measures.png +:align: center +:alt: The default appearance of the MRR Breakdown reporting page in Odoo Subscriptions. +``` + +The metric-related options in the {guilabel}`Measures` drop-down menu on the {guilabel}`MRR +Breakdown` reporting page are: + +- {guilabel}`Active Subscriptions Change` +- {guilabel}`ARR Change` +- {guilabel}`MRR Change` +- {guilabel}`Count` + +:::{note} +The {guilabel}`MRR Change` measure option is selected by default. +::: + +:::{tip} +To make a different measure option the default, first, select the desired measure from the +{guilabel}`Measures` drop-down menu. Then, click the {icon}`fa-caret-down` {guilabel}`(down +arrow)` icon in the search bar to open the mega menu of filters and groupings. + +In the {guilabel}`Favorites` column, click the {icon}`fa-caret-down` {guilabel}`(down arrow)` +icon beside {guilabel}`Save current search` to reveal a field, where a title can be entered, +along with two checkboxes:{guilabel}`Default filter` and {guilabel}`Shared`. + +Tick the checkbox for {guilabel}`Default filter`, and click {guilabel}`Save`. + +That newly-chosen measure option is now the default option that appears when this reporting page +is accessed. +::: + +### MRR analysis + +To access the {guilabel}`MRR Analysis` reporting page, navigate to {menuselection}`Subscriptions +app --> Reporting --> MRR Timeline`. + +By default, the data displayed on the {guilabel}`MRR Analysis` reporting page is in graph view, with +the {guilabel}`Line Chart` option, {guilabel}`Stacked` option, and {guilabel}`Cumulative` option +selected. + +A default filter is also found in the search bar for {guilabel}`Event Date: Month`. + +```{image} reports/subscriptions-mrr-analysis-default.png +:align: center +:alt: The default appearance of the MRR Analysis reporting page in Odoo Subscriptions. +``` + +When the {guilabel}`Measures` drop-down menu on the {guilabel}`MRR Analysis` reporting page is +clicked, a series of metric-related options become available. + +```{image} reports/subscriptions-mrr-analysis-measures.png +:align: center +:alt: The default appearance of the MRR Analysis reporting page in Odoo Subscriptions. +``` + +The metric-related options in the {guilabel}`Measures` drop-down menu on the {guilabel}`MRR +Analysis` reporting page are: + +- {guilabel}`Active Subscriptions Change` +- {guilabel}`ARR Change` +- {guilabel}`MRR Change` +- {guilabel}`Count` + +:::{note} +The {guilabel}`MRR Change` measure option is selected by default. +::: + +:::{seealso} +- {doc}`../subscriptions` +- {doc}`plans` +- {doc}`products` +::: + diff --git a/content/applications/sales/subscriptions/scheduled_actions.md b/content/applications/sales/subscriptions/scheduled_actions.md new file mode 100644 index 000000000..907f62d76 --- /dev/null +++ b/content/applications/sales/subscriptions/scheduled_actions.md @@ -0,0 +1,200 @@ +# Scheduled actions + +*Scheduled actions* are pre-configured processes that allow users to automate certain tasks within a +database, based on a designated schedule or number of occurrences. These tasks can include sending +emails, generating invoices, data clean-up, and so much more. + +In Odoo, some scheduled actions are active, by default, to ensure that certain functions are +triggered automatically, however there are *also* many scheduled action options that appear in the +database that are **not** activated by default. + +In Odoo *Subscriptions*, there are two scheduled actions that initiate the billing process for +active recurring subscriptions, as well as when billing should stop due to subscription expiration. + +They are turned on, by default and can be deactivated at any time in order to manage subscriptions +manually. + +## Access scheduled actions + +:::{important} +In order to access scheduled actions, {ref}`developer mode ` **must** be +activated. +::: + +With developer mode activated, navigate to {menuselection}`Settings app --> Technical --> Scheduled +Actions`. + +```{image} scheduled_actions/scheduled-actions-technical-settings-page.png +:align: center +:alt: The scheduled actions option under the technical menu in the Odoo Settings application. +``` + +Doing so reveals a dedicated {guilabel}`Scheduled Actions` dashboard. On this page, there is a +complete list of scheduled actions for the entire database. + +From here, enter `Subscription` in the search bar. Doing so provides three subscription-specific +results. The following documentation focuses on the last two results in the list: + +- {guilabel}`Sale Subscription: generate recurring invoices and payments` +- {guilabel}`Sale Subscription: subscriptions expiration` + +```{image} scheduled_actions/scheduled-actions-page-subscription-results.png +:align: center +: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. + +If a scheduled action needs to be activated, click into the desired scheduled action from the list. + +```{image} scheduled_actions/scheduled-action-form.png +:alt: The scheduled action form in the Odoo Settings application. +``` + +Then, from the scheduled action form, toggle the switch in the {guilabel}`Active` field to the +right. Doing so turns the switch green, indicating that the scheduled action is now `Active`. + +The ability to set up how often the scheduled action runs is also available on the scheduled action +form, in the {guilabel}`Execute Every` field. + +:::{important} +The scheduled action does **not** function correctly if the execution time is less than five +minutes. This is a general rule for all scheduled actions. + +For more information, read the {doc}`Frequent Technical Questions +` documentation. +::: + +## Generate recurring invoices and payments + +In order for the {guilabel}`Sale Subscription: generate recurring invoices and payments` scheduled +action to properly generate recurring invoices and payments on subscriptions, the *Deferred Expense* +and *Deferred Revenue* accounts **must** be set up, in order for Odoo to process various invoices +and payments related to subscriptions. + +To set up *Deferred Expense* and *Deferred Revenue* accounts, navigate to {menuselection}`Accounting +app --> Configuration --> Settings`. Both accounts can be configured in the {guilabel}`Default +Accounts` section. + +```{image} scheduled_actions/deferred-settings-accounting.png +:align: center +:alt: The necessary deferred account settings in the Odoo Accounting app's settings +: page. +``` + +Once the correct accounts are entered in the {guilabel}`Deferred Expense` and {guilabel}`Deferred +Revenue` drop-down menu fields, click {guilabel}`Save` in the upper-left corner. + +### Create invoice + +Elements related to the {guilabel}`Sale Subscription: generate recurring invoices and payments` +scheduled action can be found on confirmed subscription sales orders. + +To examine these elements, open any confirmed sales order in the *Subscriptions* application to +reveal the subscription sales order form. + +On a confirmed subscription sales order form, focus on the {guilabel}`Recurring Plan` and +{guilabel}`Date of Next Invoice` fields. + +```{image} scheduled_actions/confirmed-subscription-sales-order-fields.png +:align: center +:alt: A confirmed subscription sales order in the Odoo Subscriptions application. +``` + +The scheduled action creates an invoice when today's date is the same date as the {guilabel}`Date of +Next Invoice`. + +Odoo uses the information in the {guilabel}`Recurring Plan` field to update the next invoice date +accordingly. + +:::{warning} +If the product invoicing policy is set to *Based on Delivered Quantities (Manual)*, and the +delivered quantity is `0`, Odoo does **not** create an invoice, and the customer is not charged. + +Instead, the subscription is processed as a free recurring product, and is reflected as such in +the *chatter* of the subscription sales order. + +When this occurs, the following message appears: `Automatic renewal succeeded. Free subscription. +Next invoice:[date]. No email sent.` +::: + +Once the invoice for the subscription sales order is created, the invoice can be viewed by clicking +the {guilabel}`Invoices` smart button that appears at the top of the subscription sales order. + +An email is sent to the customer notifying them of the recurring subscription charge, *if* there is +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. + +```{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. + +### Closing invoices + +The {guilabel}`Sale Subscription: generate recurring invoices and payments` scheduled action also +has the ability to close a subscription, if the following conditions are met: + +- If the subscription has no {guilabel}`Payment Token`, create and post the invoice. + +- If the subscription has a {guilabel}`Payment Token`, try to charge. + + > - If the charge is successful, create and post the invoice. + > + > - If the charge fails, send reminders periodically. + > + > > - Close the subscription if it continues to fail for more than fourteen days. + +## Subscriptions expiration + +The {guilabel}`Sale Subscription: subscriptions expiration` scheduled action checks for all other +conditions that may cause a subscription to close automatically. If certain conditions are met, the +scheduled action closes that subscription. + +First, the {guilabel}`Sale Subscription: subscriptions expiration` scheduled action checks to see if +the end date has passed, which is configured on the subscription sales order. + +```{image} scheduled_actions/subscription-expiration-date.png +:align: center +:alt: The expiration date on a subscription sales order in Odoo Subscriptions. +``` + +Then, the {guilabel}`Sale Subscription: subscriptions expiration` scheduled action checks if the +invoice has not been paid within the payment terms deadline. + +To access the invoices attached to a subscription, access the sales order for the subscription +product, and click the {guilabel}`Invoices` smart button. Then, look at the {guilabel}`Invoice Date` +column. + +```{image} scheduled_actions/invoices-invoice-date-column.png +:align: center +:alt: The Invoice Date column on subscriptions invoice page in Odoo Subscriptions app. +``` + +Unpaid subscriptions with an {guilabel}`Invoice Date` that are past the determined number of days in +the {guilabel}`Automatic Closing` field of a {guilabel}`Recurring Plan` are automatically closed by +the {guilabel}`Sale Subscription: subscriptions expiration` scheduled action. + +```{image} scheduled_actions/automatic-closing-field.png +:align: center +:alt: The Automatic Closing field on a Recurring Plan form in Odoo Subscriptions. +``` + +For example, if the next invoice date is July 1st, and the {guilabel}`Automatic Closing` is set to +'30 Days', the scheduled action would close the subscription on August 1st. + +:::{seealso} +- {doc}`../subscriptions` +- {doc}`plans` +- {doc}`products` +- {doc}`automatic_alerts` +::: + diff --git a/content/applications/sales/subscriptions/upselling.md b/content/applications/sales/subscriptions/upselling.md new file mode 100644 index 000000000..3e4211493 --- /dev/null +++ b/content/applications/sales/subscriptions/upselling.md @@ -0,0 +1,115 @@ +# Upsell subscriptions + +Subscriptions are recurrent, and go on indefinitely. As time passes, customers may want to modify +them. With that in mind, it's imperative to have the ability to adapt prices, or change quantities, +to accommodate any need. That's where the opportunity to upsell a subscription can come into play. + +Upselling may prove beneficial to the following customer types: + +1. *Loyal Customers* + These are customers who already trust the company/brand, and because they have established a + pattern of paying for products/services, there's more confidence behind the attempt to sell + them a more expensive product/service. +2. *New Customers* + For brand new customers unfamiliar with the company/brand, a new, attractive tactic must be + employed to entice them to purchase a more expensive product/service. + > In these instances, discounts can be useful. Typically, subscriptions end after a certain period + > of time. + > + > So, if these more expensive products/services are offered to new customers at a discount, it + > can result in a sale, while establishing a strong sense of trust between the customer and the + > company/brand. In turn, this can increase customer retention, as they'll grow more comfortable + > and trustworthy over time. + +## Discount configuration + +In order to have the ability to upsell a subscription to a new customer, with the aid of a discount, +the *Discounts* feature **must** be activated. + +To activate the *Discounts* feature, navigate to {menuselection}`Sales app --> Configuration --> +Settings`, scroll to the {guilabel}`Pricing` section, and tick the checkbox beside +{guilabel}`Discounts`. Then, click {guilabel}`Save`. + +```{image} upselling/configuration-to-upsell-a-subscription.png +:align: center +:alt: Activation of the discount option in Odoo Sales. +``` + +With that feature activated, the ability to grant discounts on sales order lines. + +### Upsell subscriptions + +Before upselling a subscription, check out our documentation on how to {doc}`Create a quotation +<../subscriptions>` using subscription products. + +When a quotation with a subscription is confirmed, it officially becomes a sales order, and a new +subscription is created in the Odoo *Subscriptions* application. + +:::{note} +The subscription sales order **must** be invoiced *before* an upsell can occur. +::: + +When the subscription sales order is opened, either in the *Sales* or *Subscriptions* application, +the ability to upsell that subscription is available, via the {guilabel}`Upsell` button at the top +of the sales order. + +```{image} upselling/upsell-your-subscription.png +:align: center +:alt: Upsell button for subscription sales orders with Odoo Subscriptions. +``` + +When the {guilabel}`Upsell` button is clicked, a new quotation form appears, with an +{guilabel}`Upsell` status banner in the upper-right corner. The initial subscription product is +already in the {guilabel}`Order Lines` tab. + +There is also a warning reminding the user that the recurring products are discounted, according to +the prorated period of time, located beneath the initial subscription product in the +{guilabel}`Order Lines` tab. + +:::{important} +The prorated amount is **only** applied to *Service* product types. It is **not** applied to +*Consumable* or *Storable* product types, even if the message appears. +::: + +From this new upsell quotation form, add new subscription products in the {guilabel}`Order Lines` +tab, by clicking {guilabel}`Add a product`, and selecting the desired subscription product. + +```{image} upselling/use-of-the-upsell-button-in-odoo-sales.png +:align: center +:alt: Adding products to your subscription via the upsell option in Odoo Subscriptions +``` + +Once the desired upsell subscription product(s) have been added, it can be sent to the customer for +approval by clicking the {guilabel}`Send by Email` button. + +:::{important} +When the quotation is confirmed by the customer, the upsell products are added to the initial +subscription. Quotation prices are then prorated to the remaining time of the current invoicing +period. +::: + +:::{note} +Before sending the new quotation to the customer, the unit price, taxes, and even discount can be +applied. +::: + +Once the customer approves, click the {guilabel}`Confirm` button on the quotation, making it a sales +order. When that's clicked, a {guilabel}`Sales History` smart button appears, displaying how many +sales orders are attached to this initial subscription order. + +When the {guilabel}`Sales History` smart button is clicked, Odoo reveals a separate page containing +a list of the related sales orders, clearly showcasing their individual {guilabel}`Subscription +Status`. + +```{image} upselling/sales-history-smartbutton.png +:align: center +:alt: The related sales order viewable from the Sales History smart button in Odoo +: Subscriptions. +``` + +:::{seealso} +- {doc}`../subscriptions` +- {doc}`plans` +- {doc}`products` +::: + diff --git a/content/applications/services.md b/content/applications/services.md new file mode 100644 index 000000000..bba5b17c7 --- /dev/null +++ b/content/applications/services.md @@ -0,0 +1,14 @@ +--- +nosearch: true +--- + +# Services + +```{toctree} +services/project +services/timesheets +services/planning +services/field_service +services/helpdesk +``` + diff --git a/content/applications/services/field_service.md b/content/applications/services/field_service.md new file mode 100644 index 000000000..42f084daa --- /dev/null +++ b/content/applications/services/field_service.md @@ -0,0 +1,22 @@ +--- +hide-page-toc: true +nosearch: true +show-content: true +show-toc: true +--- + +# Field Service + +:::{seealso} +- [Odoo Tutorials: Field Service](https://www.odoo.com/slides/field-service-49) +::: + +```{toctree} +:titlesonly: true + +field_service/creating_tasks +field_service/product_management +field_service/planning_itinerary +field_service/worksheets +``` + diff --git a/content/applications/services/field_service/creating_tasks.md b/content/applications/services/field_service/creating_tasks.md new file mode 100644 index 000000000..abb914e6a --- /dev/null +++ b/content/applications/services/field_service/creating_tasks.md @@ -0,0 +1,26 @@ +# Creating field service tasks + +Tasks in Odoo Field Service can be created manually or automatically, including from sales orders or +helpdesk tickets. + +## Manual task creation + +To create a new field service task: + +1. Open the Field service app and go to {menuselection}`Field Service --> All Tasks --> All Tasks`. +2. Click {guilabel}`New`. +3. Fill in the task title, {guilabel}`Customer` and any other {ref}`optional field `, + then save manually. + +## Task creation from a sales order + +This feature allows for field service tasks to be automatically created from a sales order. When you +create a quotation with the {ref}`service product ` +and confirm it, a task is automatically created in your Field Service project. Click the +{guilabel}`Tasks` smart button to access it from the sales order. + +## Task creation from a helpdesk ticket + +If you have the Helpdesk app installed, you can {ref}`create field service tasks from a helpdesk +ticket `. + diff --git a/content/applications/services/field_service/planning_itinerary.md b/content/applications/services/field_service/planning_itinerary.md new file mode 100644 index 000000000..4f8c0718a --- /dev/null +++ b/content/applications/services/field_service/planning_itinerary.md @@ -0,0 +1,36 @@ +# Planning an itinerary + +By default, **Odoo Field Service** shows a static map where all task locations for the day are +pinned. To make it more useful for the field service workers, it is possible to display an itinerary +on the map using MapBox. To do so, enable the **Map Routes** feature as follows: + +1. Create or sign in to a MapBox account using the following link: [https://www.mapbox.com/](https://www.mapbox.com/). +2. [Create a token](https://docs.mapbox.com/help/getting-started/access-tokens/#adding-url-restrictions-to-access-tokens). +3. Go to the [Access tokens page on Mapbox](https://account.mapbox.com/access-tokens/) and copy + your token. +4. In Odoo, go to the {guilabel}`Settings` app and scroll down to the {guilabel}`Integrations` + section. Paste your Mapbox access token in the {guilabel}`Token` field under + {guilabel}`Map Routes`, and click {guilabel}`Save`. + +## Displaying your itinerary on a map + +:::{important} +For a field service task to be featured on the map, a **valid address** must be provided for the +customer. +::: + +To display your tasks on a map, go to {menuselection}`Field Service --> My Tasks --> Map`. To create +your itinerary, Odoo sorts out your field service tasks based on their {guilabel}`Planned Date` to +show the way from one location to the next. + +To open your itinerary on the Google Maps website or app, click {guilabel}`View in Google Maps`. +Google Maps includes your current location as a starting point for your itinerary. + +:::{tip} +- By default, the map shows today’s tasks. Remove the {guilabel}`Today` filter in the search bar + to display all tasks. Your tasks are then sorted by date in the left column. +- Click your task in the left column or the map pin to display the task's details. From there, + you can {guilabel}`Open` the task or click {guilabel}`Navigate to` to get an itinerary from + your current location to this specific task's location. +::: + diff --git a/content/applications/services/field_service/product_management.md b/content/applications/services/field_service/product_management.md new file mode 100644 index 000000000..9f69cce3f --- /dev/null +++ b/content/applications/services/field_service/product_management.md @@ -0,0 +1,86 @@ +# Product management + +When field service workers perform tasks on-site, they commonly use products to complete their work. +Odoo Field Service allows them to record these products using the **product catalog** and **default +warehouse** features. Doing so keeps your inventory up-to-date in real-time and automatically adds +the products to the invoice. + +## Product catalog + +To activate the product catalog for Field Service, go to {menuselection}`Field Service --> +Configuration --> Settings` and enable the {guilabel}`Time and Material Invoicing` feature. + +To add products to a task, proceed as follows: + +1. Go to Field Service and open a task. +2. Click the {guilabel}`Products` smart button. +3. Click {guilabel}`Add` on a product card to add it to your task. +4. If needed, adjust the number of products using the {guilabel}`-` and {guilabel}`+` buttons. + +Going back to your task, the smart button now displays the amount of products you added and the +price. You can return to the product catalog at any time to edit the product selection. + +:::{tip} +- To create and edit products from Field Service, go to {menuselection}`Field Service --> + Configuration --> Products`. +- To find your products more easily, use the search bar and filter your products by + {guilabel}`Product Category` and {guilabel}`Attributes`. +::: + +## User default warehouse + +Setting up a **default warehouse** can be useful for field technicians who keep a supply on the go +in their van or those who always resupply from the same warehouse. It also allows field workers to +switch between warehouses from their profiles. + +Products in sales orders created during field interventions are always pulled from the default +warehouse, keeping the inventory accurate. + +:::{seealso} +{doc}`../../inventory_and_mrp/inventory` +::: + +## Configuration + +To set up a user default warehouse, the {doc}`storage locations +<../../inventory_and_mrp/inventory/warehouses_storage/inventory_management/use_locations>` +feature needs to be activated in the **Inventory** app. It is also necessary to have more than one +warehouse in your database. + +You can either set it up {ref}`for your profile `, or {ref}`for all +users `. + +:::{seealso} +{doc}`../../inventory_and_mrp/inventory/warehouses_storage/inventory_management/use_locations` +::: + +(default-warehouse-my-profile)= + +### For your profile + +To set up a default warehouse for yourself, click your **profile icon** in the upper right corner of +the screen, then, go to {menuselection}`My Profile --> Preferences --> Default Warehouse`. Select +the default warehouse from the drop-down menu. + +(default-warehouse-all-users)= + +### For all users + +To set up a default warehouse for a specific user, go to {menuselection}`Settings --> Users --> +Manage users`, select a user, then go to the {guilabel}`Preferences` tab. Scroll down to +{guilabel}`Inventory`, and select the default warehouse from the drop-down menu. + +```{image} product_management/user-default.png +:alt: Selection of a default warehouse on a user profile. +``` + +## Use in field service tasks + +Once a default warehouse has been configured for a user, the materials used for a sales order +related to a Field Service task are pulled from that specific warehouse. Open the related sales +order, go to the {guilabel}`Other Info` tab, then scroll down to {guilabel}`Delivery`. The default +warehouse is applied correctly. + +Once the Field Service task is marked as done, the stock of the default warehouse is automatically +updated. + diff --git a/content/applications/services/field_service/worksheets.md b/content/applications/services/field_service/worksheets.md new file mode 100644 index 000000000..c6ffe766a --- /dev/null +++ b/content/applications/services/field_service/worksheets.md @@ -0,0 +1,65 @@ +# Worksheets + +**Worksheets** help your field service workers perform and report their on-site tasks. They can +feature various information, such as instructions, to-do lists, etc. You can also format your +worksheet using checkboxes, bullet points, blank fields to fill in, HTML, and add files, images, +links, and more. + +It is common for businesses to have their workers perform the same type of field service +repeatedly. Making custom **worksheet templates** eliminates the need to recreate the same +worksheet each time you plan a similar field service task. + +## Configuration + +To use worksheets in Field Service, go to {menuselection}`Field Service --> Configuration --> +Settings`, enable the {guilabel}`Worksheets` feature, and click {guilabel}`Save`. + +:::{warning} +Worksheet templates are designed using **Studio**. Enabling the {guilabel}`Worksheets` +feature automatically installs the **Studio** app, which may impact your price plan. +::: + +### Create a worksheet template + +To create your **worksheet templates**, go to {menuselection}`Field Service --> Configuration --> +Worksheet Templates`. Click {guilabel}`New` and give your worksheet template a name. Manually save, +then click {guilabel}`Design Template` to open **Studio** and customize your worksheet template. + +In Studio, drag and drop the desired fields from the left column into your worksheet on the right. +To rearrange the fields on the worksheet, drag and drop them in the desired order. Click a field to +customize its {ref}`properties `. + +When your worksheet template is complete, click {guilabel}`Close` in the top right corner of the +page to leave **Studio**. + +:::{seealso} +{doc}`Fields and widgets in Studio <../../studio/fields>` +::: + +## Add a worksheet template to a field service task + +Go to your field service task, select a {guilabel}`Worksheet Template`, and click {guilabel}`Save`. + +By default, the {guilabel}`Default Worksheet` template is selected. To define another default +worksheet template, click the {guilabel}`➔` ({guilabel}`Internal link`) icon that appears when you +hover your mouse over the {guilabel}`Project` field on the task form. + +```{image} worksheets/template-default.png +:alt: Mouse on project name to setup default worksheet template +:scale: 75% +``` + +Then, in the {guilabel}`Settings` tab, scroll down to the {guilabel}`Field service` section and +select the {guilabel}`Worksheet Template` you want to set up as default. + +## Use worksheets on site + +To complete the worksheet on site, access the task and click the {guilabel}`Worksheet` smart button. + +:::{note} +- As soon as you save a worksheet, the label of the {guilabel}`Worksheet` smart button on + the task changes to {guilabel}`Worksheet Complete` instead, even if some fields are + left blank. +- Any field defined as {guilabel}`Required` has to be filled for a worksheet to be saved. +::: + diff --git a/content/applications/services/helpdesk.md b/content/applications/services/helpdesk.md new file mode 100644 index 000000000..82c5c06eb --- /dev/null +++ b/content/applications/services/helpdesk.md @@ -0,0 +1,199 @@ +--- +show-content: true +show-toc: true +--- + +# Helpdesk + +Odoo **Helpdesk** is a ticket-based customer support application. Multiple teams can be configured +and managed in one dashboard, each with their own pipeline for tickets submitted by customers. +Pipelines are organized in customizable stages that enable teams to track, prioritize, and solve +customer issues quickly and efficiently. + +## Create a Helpdesk team + +To view or modify **Helpdesk** teams, go to {menuselection}`Helpdesk app --> Configuration --> +Helpdesk Teams`. To create a new team, click the {guilabel}`New` button on the top-left of the +dashboard. + +```{image} helpdesk/helpdesk-teams-list.png +:alt: View of the Helpdesk teams page in Odoo Helpdesk. +``` + +On the blank Helpdesk team form, enter a {guilabel}`Name` for the new team. Then, enter a +description of the team in the field below the team name, if desired. To change the company this +team is assigned to, select it from the {guilabel}`Company` drop-down menu. + +:::{important} +The team description is published on the public facing {doc}`website form +`, where customers and portal users submit tickets. The +description included in this field should **not** include any information that is for internal +use only. + +```{image} helpdesk/team-description-webform.png +:alt: View of a Helpdesk team's website form displaying the team description. +``` +::: + +### Visibility & Assignment + +The *Visibility* settings alter which internal users and portal users have access to this team and +its tickets. The *Assignment* settings alter how users are assigned to handle each ticket. + +#### Determine team visibility + +Under the {guilabel}`Visibility` section, select one of the following options to determine who can +view this team and its tickets: + +- {guilabel}`Invited internal users (private)`: Internal users can access the team and the tickets + they are following. This access can be modified on each ticket individually by adding or removing + the user as a follower. Internal users are considered *invited* once they are added as followers + to an individual ticket, or {ref}`to the team itself `. +- {guilabel}`All internal users (company)`: All internal users can access the team and all of its + tickets. +- {guilabel}`Invited portal users and all internal users (public)`: All internal users can access + the team and all of its tickets. Portal users can only access the tickets they are following. + +```{eval-rst} +.. example:: + A `Customer Support` team, meant to handle general shipping and product issues, would have the + visibility set on :guilabel:`Invited portal users and all internal users`. + + At the same time, a `Financial Services` team handling tickets related to accounting or tax + information would only need to be visible to :guilabel:`Invited internal users`. +``` + +:::{warning} +A team's visibility can be altered after the initial configuration. However, if the team changes +from *Invited portal users and all internal users (public)* access to either *Invited internal +users (private)* or *All internal users (company)*-only access, portal users are removed as +followers from both the team, and from individual tickets. +::: + +(helpdesk-follow)= + +#### Follow all team's tickets + +If a user should be notified about any updates regarding tickets for this team, select their name +from the {guilabel}`Followers` drop-down menu, located in the {guilabel}`Follow All Team's Tickets` +field. Multiple users can be selected to follow a single team. + +:::{important} +External contacts can be selected in the {guilabel}`Followers` field. If the team's visibility is +set to {guilabel}`Invited internal users (private)`, followers are notified about updates to the +team's tickets, but are **not** able to view them in the portal. +::: + +#### Automatically assign new tickets + +When tickets are received, they need to be assigned to a member of the team. This is done either +manually on each individual ticket, or through {guilabel}`Automatic Assignment`. Check the +{guilabel}`Automatic Assignment` checkbox to enable this feature for the team. + +```{image} helpdesk/helpdesk-visibility-assignment.png +:alt: |- +: View of a Helpdesk team settings page emphasizing the automatic assignment features in Odoo +: Helpdesk. +``` + +Select one of the following assignment methods, based on how the workload should be allocated across +the team: + +- {guilabel}`Each user is assigned an equal number of tickets`: Tickets are assigned to team members + based on total ticket count, regardless of the number of open or closed tickets they are + currently assigned. +- {guilabel}`Each user has an equal number of open tickets`: Tickets are assigned to team members + based on how many open tickets they are currently assigned. + +:::{note} +When {guilabel}`Each user is assigned an equal number of tickets` is selected, the overall number +of tickets assigned to team members is the same, but it does **not** consider the current +workload. + +When {guilabel}`Each user has an equal number of open tickets` is selected, it ensures a balanced +workload among team members, as it takes the current number of active tickets into account. +::: + +Finally, add the {guilabel}`Team Members` who are to be assigned tickets for this team. Leave the +field empty to include all employees who have the proper assignments and access rights configured in +their user account settings. + +:::{important} +If an employee has time off scheduled in the **Time Off** application, they are **not** assigned +tickets during that time. If no employees are available, the system looks ahead until there is a +match. +::: + +:::{seealso} +- {ref}`Manage users ` +- {doc}`Access rights <../general/users/access_rights>` +::: + +## Merge tickets + +If duplicate tickets are found in **Helpdesk**, they can be combined into a single ticket using the +*merge* feature. + +:::{important} +The *merge* feature is **only** accessible if the {doc}`Data Cleaning +<../productivity/data_cleaning>` application is installed on the database. +::: + +To merge two or more tickets, navigate to {menuselection}`Helpdesk app --> Tickets --> All Tickets`. +Identify the tickets to be merged, and tick the checkbox at the far-left of each ticket to select +them. Then, click the {icon}`fa-cog` {guilabel}`Actions` icon, and select {guilabel}`Merge` from the +drop-down menu. Doing so opens a new page where the selected tickets are listed with their +{guilabel}`Similarity` rating. From here, click either {ref}`Merge ` to +combine the tickets, or {guilabel}`DISCARD`. + +## Convert tickets to opportunities + +Some tickets may be better handled by the sales team, rather than the support team. In this case, +tickets can be converted to *opportunities* and assigned to a sales team for follow-up. + +:::{important} +This feature is **only** available if the {doc}`CRM <../sales/crm>` app is installed. +::: + +To convert a ticket to an opportunity, first navigate to a ticket, either from a team's pipeline, +or by navigating to {menuselection}`Helpdesk app --> Tickets` and clicking a ticket to open it. + +At the top of the ticket, click the {guilabel}`Convert to Opportunity` button. + +:::{note} +If {doc}`leads <../sales/crm/acquire_leads/convert>` are enabled on the **CRM** app, tickets are +converted to *leads*, and the button reads {guilabel}`Convert to Lead`. +::: + +This opens the {guilabel}`Convert to Opportunity` pop-up. Fill in or select the following +information on the pop-up: + +- {guilabel}`Customer`: Select whether to {guilabel}`Create a new customer`, {guilabel}`Link to an + existing customer`, or {guilabel}`Do not link to a customer`. If {guilabel}`Link to a customer` is + chosen, select the appropriate customer name from the {guilabel}`Customer` drop-down. +- {guilabel}`Sales Team`: Specify which {guilabel}`Sales Team` and {guilabel}`Salesperson` this + created opportunity is assigned to. + +```{image} helpdesk/convert-to-opp.png +:alt: The convert to opportunity pop-up window. +``` + +After completing the form, click {guilabel}`Convert to Opportunity`. Doing so creates a new +opportunity in the **CRM** app. The original ticket is linked in the chatter of the new opportunity +for traceability. + +:::{note} +After the ticket is converted to an opportunity, the ticket is archived. +::: + +:::{seealso} +- [Odoo Tutorials: Helpdesk](https://www.odoo.com/slides/helpdesk-51) +::: + +```{toctree} +:titlesonly: true + +helpdesk/overview +helpdesk/advanced +``` + diff --git a/content/applications/services/helpdesk/advanced.md b/content/applications/services/helpdesk/advanced.md new file mode 100644 index 000000000..5bfe80d45 --- /dev/null +++ b/content/applications/services/helpdesk/advanced.md @@ -0,0 +1,14 @@ +--- +nosearch: true +--- + +# Advanced + +```{toctree} +:titlesonly: true + +advanced/after_sales +advanced/close_tickets +advanced/track_and_bill +``` + diff --git a/content/applications/services/helpdesk/advanced/after_sales.md b/content/applications/services/helpdesk/advanced/after_sales.md new file mode 100644 index 000000000..372dcb0d3 --- /dev/null +++ b/content/applications/services/helpdesk/advanced/after_sales.md @@ -0,0 +1,322 @@ +# After-Sales services + +*After-Sales* services can be configured in the *Helpdesk* application for individual teams. Once +enabled, users can {ref}`issue refunds `, {ref}`generate coupons +`, {ref}`process returns `, and {ref}`schedule repairs +` or {ref}`field service interventions ` directly from a ticket. + +## Set up after-sales services + +Start by enabling the after-sales services on a specific *Helpdesk* team, by going to +{menuselection}`Helpdesk app --> Configuration --> Helpdesk Teams` and click on the team the +services should be applied to. Then, scroll to the {guilabel}`After-Sales` section on the team's +settings page, and choose which of the following options to enable: + +- {guilabel}`Refunds`: issues credit notes to refund a customer, or adjust the remaining amount due. +- {guilabel}`Coupons`: offers discounts and free products through an existing coupon program. +- {guilabel}`Returns`: initiates a product return from a customer through a reverse transfer. +- {guilabel}`Repairs`: creates repair orders for broken or faulty products. +- {guilabel}`Field Service`: plans onsite intervention through the *Field Service* application. + +:::{figure} after_sales/after-sales-enable.png +:align: center + +The services that are enabled can vary based on the type of support a team provides. +::: + +:::{danger} +Since all the after-sales services in Odoo require integration with other applications, enabling +any of them may result in the installation of additional modules or applications. Installing a +new application on a One-App-Free database triggers a 15-day trial. At the end of the trial, if a +paid subscription has not been added to the database, it will no longer be accessible. +::: + +(helpdesk-refunds)= + +## Issue refund with credit note + +A *credit note* is a document issued to a customer informing them that they have been credited a +certain amount of money. They can be used to provide a full refund to a customer, or to adjust any +remaining amount due. While they are usually created through the *Accounting* or *Invoicing* +applications, they can be created through a *Helpdesk* ticket, as well. + +:::{important} +Invoices **must** be posted before a credit note can be generated. +::: + +To create a credit note, navigate to a ticket on the {menuselection}`Helpdesk app`, and click the +{guilabel}`Refund` button in the top-left corner of the ticket form. This opens a +{guilabel}`Refund` pop-up window. + +```{image} after_sales/after-sales-refund-details.png +:align: center +:alt: View of a refund creation page. +``` + +Fill out the fields with the necessary information: + +> - {guilabel}`Sales Order`: if a sales order was referenced on the original ticket, it automatically +> populates in this field. +> - {guilabel}`Product`: the product the ticket is about. If an item is selected in this field, only +> the sales orders, deliveries, and invoices including this product can be selected. +> - {guilabel}`Lot/Serial Number`: this field is **only** visible if the {guilabel}`Product` selected +> has associated lot or serial numbers. +> - {guilabel}`Invoices to Refund`: this field is **required**. If no invoices are available in the +> drop-down, it indicates this customer currently has no posted invoices, or the +> {guilabel}`Product` has no related invoices. +> - {guilabel}`Reason displayed on Credit Note`: this field automatically populates with the ticket +> number, though it can be edited with additional information. +> - {guilabel}`Journal`: the accounting journal where the credit note should be posted. After an +> invoice is selected, this field defaults to the journal listed on the original invoice, though it +> can be changed, if necessary. +> - {guilabel}`Reversal date`: when this field is clicked, use the pop-up calendar that appears to +> select a date for the credit note invoice. This field is **required**. + +After the necessary fields are filled in, click {guilabel}`Reverse` or {guilabel}`Reverse and Create +Invoice`. + +{guilabel}`Reverse` creates a credit note in a draft state that can be edited before it is posted. +This option can be used to provide a partial refund. + +{guilabel}`Reverse and Create Invoice` creates a credit note that is automatically posted as well as +an invoice in a draft state. The invoice contains the same information as the original invoice, +though this information can be altered. + +Once the credit note has been posted, a {guilabel}`Credit Notes` smart button is added to the +*Helpdesk* ticket. + +```{image} after_sales/after-sales-credit-note-smart-button.png +:align: center +:alt: View of smart buttons on a ticket focusing on the credit note button. +``` + +:::{seealso} +{doc}`../../../finance/accounting/customer_invoices/credit_notes` +::: + +(helpdesk-coupons)= + +## Generate coupons from a ticket + +Coupons can be used to alter the price of products or orders. Conditional rules define the usage +constraints of a coupon. *Coupon Programs* are configured in the *Sales*, *Point of Sale*, or +*Website* applications. + +:::{important} +The *eCommerce* module **must** be installed to create coupon codes from the *Website*. +::: + +To generate a coupon, open a *Helpdesk* ticket and click on the {guilabel}`Coupon` button in the +top-left corner. Select an option from the {guilabel}`Coupon Program` drop-down menu in the +{guilabel}`Generate a Coupon` pop-up window that appears. + +```{image} after_sales/after-sales-generate-coupon.png +:align: center +:alt: View of a coupon generation window. +``` + +:::{note} +> To create a new {guilabel}`Coupon Program`, navigate to {menuselection}`Sales app --> Products +> --> Discount & Loyalty` and click {guilabel}`New`. To make the program available to share with +> *Helpdesk* customers, the {guilabel}`Program Type` **must** be set to {guilabel}`Coupons`. This +> generates single-use coupon codes that grant immediate access to rewards and discounts. + +Coupon programs can also be created in the *Point of Sale* application or *Website* application. +Refer to {doc}`discount and loyalty programs +<../../../sales/sales/products_prices/loyalty_discount>` for more information. +::: + +Click on the {guilabel}`Valid Until` field, and use the pop-up calendar to select an expiration date +for this coupon code. If this field is left blank, the code does **not** expire. + +Click {guilabel}`Send by Email` to compose an email to send to the customer with the coupon code. + +:::{note} +When emailing a coupon code, **all** the followers of the ticket are added as recipients to the +email. Additional recipients can be added to the email as well, in the {guilabel}`Recipients` +field of the {guilabel}`Compose Email` pop-up window. If an expiration date was selected for the +code, it is included in the message template. + +```{image} after_sales/after-sales-coupon-email.png +:align: center +:alt: View of an email draft window with coupon code. +``` +::: + +Click {guilabel}`Get Share Link` to generate a link to send directly to the customer. Doing so opens +a {guilabel}`Share Coupons` pop-up window. Click the {guilabel}`Copy` button next to the +{guilabel}`Share Link` field and paste the results to any communication with the customer. When the +customer uses the link, the code is automatically applied to their cart. + +After a {guilabel}`Coupon Code` has been generated, a {guilabel}`Coupons` smart button is added to +the top of the ticket; click the smart button to view the coupon code, expiration date, and +additional information. + +```{image} after_sales/after-sales-coupon-smart-button.png +:align: center +:alt: View of the smart buttons on a ticket focusing on the coupon button. +``` + +:::{seealso} +- [Coupons](https://www.youtube.com/watch?v=KW5cZHg10jQ) +- {doc}`../../../sales/sales/products_prices/loyalty_discount` +::: + +(helpdesk-returns)= + +## Facilitate a product return with a reverse transfer + +Returns are completed through *reverse transfers*, which generate new warehouse operations for the +returning products. Click the {guilabel}`Return` button in the top-left corner of a ticket to open +the {guilabel}`Reverse Transfer` pop-up window. + +```{image} after_sales/after-sales-return-button.png +:align: center +:alt: View of a Helpdesk ticket with the return button highlighted. +``` + +:::{important} +The {guilabel}`Return` button **only** appears on a ticket if the customer has a recorded +delivery in the database. +::: + +Select a {guilabel}`Sales Order` or {guilabel}`Delivery to Return` to identify the products that +need to be returned. + +By default, the quantity matches the validated quantity from the delivery order. Update the +{guilabel}`Quantity` field, if necessary. To remove a line, click the {guilabel}`🗑️ (trash can)` +icon. + +Select a {guilabel}`Return Location` where the items should be directed after the return is +completed. + +```{image} after_sales/after-sales-reverse-transfer.png +:align: center +:alt: View of a reverse transfer creation page. +``` + +Click {guilabel}`Return` to confirm the return. This generates a new warehouse operation for the +incoming returned products. + +Use the breadcrumbs to return to the helpdesk ticket. A new {guilabel}`Return` smart button can now +be accessed at the top of the ticket. + +```{image} after_sales/after-sales-return-smart-button.png +:align: center +:alt: View of the return smart button on a helpdesk ticket. +``` + +:::{seealso} +{doc}`../../../sales/sales/products_prices/returns` +::: + +(helpdesk-repairs)= + +## Send products for repair from a ticket + +If the ticket is related to an issue with a faulty or broken product, a *repair order* can be +created from the *Helpdesk* ticket, and managed through the *Repairs* application. + +To create a new repair order, open a {menuselection}`Helpdesk` ticket and click on the +{guilabel}`Repair` button in the top-left corner. This opens a {guilabel}`Repair Reference` form. + +```{image} after_sales/after-sales-repair-reference.png +:align: center +:alt: View of a repair reference page. +``` + +Fill out the fields with the necessary information: + +> - {guilabel}`Customer`: this field carries over from the ticket, though a new contact can been +> selected from the drop-down menu. +> - {guilabel}`Product to Repair`: if a product was specified in the {guilabel}`Product` field on the +> ticket, it is added to this field automatically. If not, click into the field to select a product +> from the drop-down menu. +> - {guilabel}`Lot/Serial`: this field is **only** visible if the products being repaired are +> tracked, via lot or serial numbers. +> - {guilabel}`Return`: return order from which the product to be repaired comes from. +> - {guilabel}`Under Warranty`: if this box is checked, the sale price for all products from the +> repair order are set to zero. +> - {guilabel}`Scheduled Date`: this field defaults to the current date. To select a new date, click +> into the field and select a date using the drop-down calendar. +> - {guilabel}`Responsible`: assign a user from the drop-down menu to manage the repair. +> - {guilabel}`Tags`: click into this field to assign an existing tag or create a new one. Multiple +> tags can be assigned. + +If parts are required for the repair, they can be added in the {guilabel}`Parts` tab. Additional +information for the internal repair team can be added to the {guilabel}`Repair Notes` tab. + +Once the form is complete, click {guilabel}`Confirm Repair`. To create, edit, and send a quote for +this repair, click {guilabel}`Create Quotation`. + +A {guilabel}`Repairs` smart button is then added to the ticket, linking to the repair order. + +```{image} after_sales/after-sales-repair-smart-button.png +:align: center +:alt: View of smart buttons focusing on repair button. +``` + +:::{tip} +Once a user creates a repair order from a *Helpdesk* ticket, they can access it through the +ticket's {guilabel}`Repair` smart button, or from a link in the chatter, even if they do not have +access rights to the *Repair* application. +::: + +(helpdesk-field)= + +## Create field service task from a ticket + +On-site interventions can be planned from a ticket and managed through the *Field Service* +application. Customers with {doc}`portal access <../../../general/users/portal>` are able to track +the progress of a *Field Service* task just as they would a *Helpdesk* ticket. + +:::{tip} +To change the default *Field Service* project for the team, go to {menuselection}`Helpdesk app +--> Configuration --> Helpdesk Teams` to select a {guilabel}`Team`. Scroll to the +{guilabel}`After-Sales` section, and choose a project under {guilabel}`Field Service`. +::: + +To create a new *Field Service* task, navigate to a {menuselection}`Helpdesk` ticket. Click +{guilabel}`Plan Intervention` to open the {guilabel}`Create a Field Service task` pop-up window. + +```{image} after_sales/after-sales-field-service-create.png +:align: center +:alt: View of a Field Service task creation page. +``` + +Confirm or update the task {guilabel}`Title`. + +The {guilabel}`Project` field on the {guilabel}`Create a Field Service task` pop-up window defaults +to the same *Field Service* project that was identified on the team's settings page. To change the +project for this specific task, select one from the {guilabel}`Project` field. + +If applicable, select a {guilabel}`Worksheet Template` from the drop-down menu. + +:::{note} +*Field Service Worksheets* are reports that detail the work completed during an on-site task. +When work is completed, worksheets are signed by the customer to confirm the job is done and the +customer is satisfied. + +If the *Field Service* project assigned to the *Helpdesk* team has worksheets enabled, and has a +default template assigned, that template automatically appears in the {guilabel}`Worksheet +Template` drop-down field. Even so, the field can be edited, and another template can be +selected. + +If the *Field Service* project does **not** have worksheets enabled, the {guilabel}`Worksheet +Template` field does not appear on the {guilabel}`Create a Field Service task` pop-up window. +::: + +Click {guilabel}`Create Task` or {guilabel}`Create & View Task`. + +After the task is created, a {guilabel}`Tasks` smart button is added to the ticket, linking the +{guilabel}`Field Service` task to the ticket. + +```{image} after_sales/after-sales-field-service-smart-button.png +:align: center +:alt: View of ticket smart buttons focused on task. +``` + +:::{seealso} +[Field Service](https://www.odoo.com/slides/slide/advanced-settings-862?fullscreen=1) +::: + diff --git a/content/applications/services/helpdesk/advanced/close_tickets.md b/content/applications/services/helpdesk/advanced/close_tickets.md new file mode 100644 index 000000000..70e70340e --- /dev/null +++ b/content/applications/services/helpdesk/advanced/close_tickets.md @@ -0,0 +1,122 @@ +# Closing tickets + +Once work has been completed on a *Helpdesk* ticket in Odoo, there are several ways it can be +closed. Manually closing solved tickets keeps the pipeline up to date, while automatically closing +inactive tickets prevents unnecessary blocking issues. Allowing customers to close their own tickets +minimizes confusion around whether an issue is considered solved or not. This results in increased +operational capacity for support teams, and higher customer satisfaction. + +## Manually close solved tickets + +As work on a ticket progresses, it is moved along to the next stage in the pipeline. Once the issue +is solved, the ticket is moved to a *folded* stage. This marks the ticket as *closed*. + +To fold a stage, navigate to the {menuselection}`Helpdesk` dashboard and click on a team to open the +pipeline. Hover over a stage's heading, and then click the gear icon that appears in the top-right +corner of that stage's kanban column. + +```{image} close_tickets/closing-edit-stage-gear.png +:align: center +:alt: View of stage on Helpdesk pipeline with emphasis on gear icon and edit stage +: option. +``` + +:::{warning} +Clicking the gear icon also displays the option to {guilabel}`Fold` the stage. This setting folds +the stage *temporarily* to simplify the kanban view. This does *not* close the tickets in this +stage. It also does not permanently fold the stage. If a stage needs to be folded so the tickets +can be marked as closed, continue following the steps below. +::: + +From the menu that appears, select {guilabel}`Edit Stage`. This will open the stage's settings. +Check the box labeled {guilabel}`Folded in Kanban` towards the top of the window, and then +{guilabel}`Save & Close` to confirm the changes. Now, tickets that reach this stage will be +considered as *closed*. + +> ```{image} close_tickets/closing-folded-setting.png +> :align: center +> :alt: Stage settings page. +> ``` + +## Automatically close inactive tickets + +Tickets that are inactive for a set period of time can be automatically closed. At that point, they +will be moved to a folded stage. + +Go to the team's settings page by going to {menuselection}`Helpdesk --> Configuration --> Teams`. +Under the {guilabel}`Self-Service` section, enable {guilabel}`Automatic Closing`. + +If one of the team's stages is set to be folded in the kanban view, it will be the default selection +in the {guilabel}`Move to Stage` field. If the team has more than one folded stage, the stage that +occurs first in the pipeline will be the default. If no stage is folded, the default selection will +be the last stage in the pipeline. + +The {guilabel}`After days of inactivity` field defaults to `7`, but can be adjusted if necessary. + +:::{warning} +The {guilabel}`After days of inactivity` field does **not** take the working calendar into +account when tracking the amount of time a ticket has been inactive. +::: + +If only certain stages should be used to track days of inactivity, they can be added to the +{guilabel}`In Stages` field. + +```{eval-rst} +.. example:: + A team's pipeline is created with the following stages: + + - `New` + - `In Progress` + - `Customer Feedback` + - `Closed` + + Tickets can linger in the :guilabel:`Customer Feedback stage`, because once an issue is solved, + customers may not respond immediately. At that point, the tickets can be closed automatically. + However, tickets in the :guilabel:`New` and :guilabel:`In Progress` stages may remain inactive + due to assignment or workload issues. Closing these tickets automatically would result in issues + going unsolved. + + Therefore, the :guilabel:`Automatic Closing` settings would be configured as below\:\ + + - :guilabel:`Automatic Closing`: *checked* + - :guilabel:`Move to Stage`: `Solved` + - :guilabel:`After``7`:guilabel:`days of inactivity` + - :guilabel:`In Stages`: `Customer Feedback` + + .. image:: close_tickets/closing-automatic-settings-example.png + :align: center + :alt: Example of Automatic Closing settings. +``` + +## Allow customers to close their own tickets + +Enabling the {guilabel}`Closure by Customers` setting allows customers to close their own ticket(s) +when they determine that their issue has been resolved. + +Start by navigating to {menuselection}`Helpdesk --> Configuration --> Teams` and select a team. On +the team's settings page, scroll to the {guilabel}`Self-Service` section and check the box for +{guilabel}`Closure by Customers`. + +```{image} close_tickets/closing-by-customer-setting.png +:align: center +:alt: Customer closing setting in Odoo Helpdesk. +``` + +Once the ticket closing settings are enabled, a {guilabel}`Close Ticket` button will be available +for customers when they view their ticket through the customer portal. + +```{image} close_tickets/closing-customer-view.png +:align: center +:alt: Customer view of ticket closing in Odoo Helpdesk. +``` + +:::{note} +Customers are able to view their tickets by clicking the {guilabel}`View the ticket` link they +receive by email. The link is included in the {guilabel}`Request Acknowledgment` template, which +is added to the first stage of a team by default. This link does not require a customer to have +access to the portal to view or respond to their ticket. + +Customers with access to the portal will be able to view their tickets under {menuselection}`My +Account --> Tickets`. +::: + diff --git a/content/applications/services/helpdesk/advanced/track_and_bill.md b/content/applications/services/helpdesk/advanced/track_and_bill.md new file mode 100644 index 000000000..5eca961f0 --- /dev/null +++ b/content/applications/services/helpdesk/advanced/track_and_bill.md @@ -0,0 +1,257 @@ +# Track and bill time + +Odoo *Helpdesk* provides teams with the ability to track the amount of hours spent working on a +ticket, and to bill a customer for that time. Through integrations with the *Sales*, *Timesheets*, +*Project* and *Accounting* applications, customers can be charged once the work is completed, or +before it has even begun. + +:::{warning} +Since the *Track & Bill Time* features require integration with other applications, enabling them +may result in the installation of additional modules or applications. + +Installing a new application on a *One-App-Free* database triggers a 15-day trial. At the end of +the trial, if a paid subscription has not been added to the database, it will no longer be active +or accessible. +::: + +## Configure track and bill time features + +Before a customer can be invoiced for support services, the *Track & Bill Time* features **must** be +enabled on each *Helpdesk* team individually. + +### Enable track and bill time on a helpdesk team + +To view and enable the *Track & Bill Time* features on a *Helpdesk* team, first navigate to +{menuselection}`Helpdesk app --> Configuration --> Helpdesk Teams`. Then, select a team from the +list, or create a {doc}`new one <../../helpdesk>`. This reveals a team's settings page. + +On the team's settings page, scroll to the {guilabel}`Track & Bill Time` section. Check the boxes +labeled {guilabel}`Timesheets` and {guilabel}`Time Billing`. + +Once the {guilabel}`Timesheets` box is checked, a new field appears, labeled {guilabel}`Project`. + +:::{note} +If this is the first time this feature has been enabled on this database, the page may need to be +manually saved and refreshed before the {guilabel}`Project` field appears. +::: + +The project selected in this field represents where all the timesheets for this team's tickets are +recorded. Click into the {guilabel}`Project` drop-down menu to select a project. + +To create a new project where the timesheets are recorded, click into the {guilabel}`Project` +drop-down menu, type a name for the project, and then click {guilabel}`Create` from the drop-down +menu beneath. + +```{image} track_and_bill/track-bill-enable-settings.png +:align: center +:alt: View of a helpdesk team settings page emphasizing the track and bill time settings. +``` + +(helpdesk-configure-service-products)= + +#### Configure service products + +When the {guilabel}`Time Billing` feature is enabled, a new product is created in the *Sales* app +called *Service on Timesheets*. This product can be found under {menuselection}`Sales app--> +Products --> Products`. Then, search for `Service on Timesheets` in the {guilabel}`Search...` bar. +This is the product that is used when invoicing for *post-paid support services* **after** they have +been completed. + +Select {guilabel}`Service on Timesheets` from the product page. This reveals the product detail +form. The product is configured with the {guilabel}`Product Type` set to {guilabel}`Service` and the +{guilabel}`Invoicing Policy` set to {guilabel}`Based on Timesheets`. Make any necessary changes to +the product record, such as the {guilabel}`Cost` or {guilabel}`Sales Price`. + +```{image} track_and_bill/track-bill-product-based-on-timesheets.png +:align: center +:alt: View of a service product with the invoicing policy set to 'Based on timesheets'. +``` + +In order to invoice for support services **before** the work has been completed (also known as +*prepaid support services*), a separate product with a different invoicing policy must be created. + +To create a new service product, go to {menuselection}`Sales app --> Products --> Products`, and +click {guilabel}`New`. This reveals a blank product detail form. + +On the new product form, add a {guilabel}`Product Name`, and set the {guilabel}`Product Type` to +{guilabel}`Service`. Then, set the {guilabel}`Invoicing Policy` to {guilabel}`Prepaid/Fixed Price`. +This means an invoice can be generated and payment can be received for this product before any +timesheets entries have been recorded for these services. + +```{image} track_and_bill/track-bill-product-prepaid-fixed.png +:align: center +:alt: View of a service product with the invoicing policy set to 'prepaid/fixed'. +``` + +Finally, set the {guilabel}`Sales Price`, and confirm that the {guilabel}`Unit of Measure` is set to +{guilabel}`Hours`. + +## Invoice prepaid support services + +When support services are billed on a fixed price, an invoice can be created before any work is +completed on the issue. In this case, a service product with the *Invoicing Policy* set to +*Prepaid/Fixed Price* would be used, just like {ref}`the section above +`. + +### Create a sales order with prepaid product + +To invoice a customer for prepaid support services, first create a sales order (SO) with the support +services product. To do this, go to {menuselection}`Sales app --> Orders --> Quotations`. Then, +click {guilabel}`New` to reveal a blank quotation form. + +Then, fill out the quotation form with the customer information. + +Go to the {guilabel}`Order Lines` tab of the quotation and click {guilabel}`Add a Product`. Then, +select the *prepaid services product* configured in the steps above. Update the {guilabel}`Quantity` +field with the number of hours. + +After updating any other necessary information, {guilabel}`Confirm` the quotation. This converts the +quotation into an {abbr}`SO (sales order)`. + +### Create and send an invoice for prepaid services + +Once the {abbr}`SO (sales order)` has been confirmed, click the {guilabel}`Create Invoice` button. +This opens a {guilabel}`Create invoices` pop-up window. + +If no down payment is collected, the {guilabel}`Create Invoice` type can remain as +{guilabel}`Regular Invoice`. If a {doc}`down payment <../../../sales/sales/invoicing/down_payment>` +is collected, choose between either {guilabel}`Down payment (percentage)` or {guilabel}`Down payment +(fixed amount)`. + +When the necessary information has been entered, click {guilabel}`Create Draft Invoice`. + +The invoice can then be sent to the customer for payment. + +### Create helpdesk ticket for prepaid services + +To create a *Helpdesk* ticket for prepaid services, navigate to {menuselection}`Helpdesk` and click +the {guilabel}`Tickets` button to reveal a specific team's pipeline. Click {guilabel}`New` to create +a new ticket. + +On the blank ticket form, create a ticket {guilabel}`Title`, and enter the {guilabel}`Customer` +information. + +When the customer name is added, the {guilabel}`Sales Order Item` field automatically populates with +the most recent prepaid sales order item that has time remaining. + +### Track hours on helpdesk ticket + +Time spent working on a *Helpdesk* ticket is tracked on the *Timesheets* tab on the specific ticket. + +On the ticket detail form, click on the {guilabel}`Timesheets` tab and click {guilabel}`Add a line`. +Choose an {guilabel}`Employee`, add a {guilabel}`Description` of the task, and enter the number of +{guilabel}`Hours Spent`. + +As new lines are added to {guilabel}`Timesheets` tab, the {guilabel}`Remaining Hours on SO` field, +at the bottom-right of the tab, is automatically updated. + +```{image} track_and_bill/track-bill-remaining-hours-total.png +:align: center +:alt: View of the timesheets tab on a ticket with an emphasis on the remaining hours +: on an SO. +``` + +:::{note} +If the number of hours on the {guilabel}`Timesheets` tab exceeds the number of hours sold, the +{guilabel}`Remaining Hours of SO` turns red. +::: + +As hours are added to the {guilabel}`Timesheets` tab, they are automatically updated in the +{guilabel}`Delivered` field on the {abbr}`SO (sales order)`, as well. + +## Invoice post-paid support services + +When support services are billed based on the amount of time spent on an issue, an invoice cannot be +created before the total number of hours required to solve the problem have been entered on a +timesheet. In this case, a service product with the *Invoicing Policy* set to *Based on Timesheets* +would be used, like the one created in {ref}`the section above +`. + +### Create a sales order with a time-tracked product + +To invoice a customer for post-paid support services, first create a sales order (SO) with the +*support services product*. To do this, go to {menuselection}`Sales app --> Orders --> Quotations`. +Then, click {guilabel}`New` to reveal a blank quotation form. + +Fill out the quotation with the customer information. + +On the {guilabel}`Order Lines` tab, click {guilabel}`Add a Product`. Select the post-paid services +product configured in the steps above. After updating any other necessary information, +{guilabel}`Confirm` the quotation. + +:::{important} +Unlike with the prepaid services quotation, Odoo does **not** allow an invoice to be created at +this time. That is because no services have been performed; in other words, nothing has been +delivered, therefore, there is nothing to invoice. +::: + +### Create a helpdesk ticket for time-tracked services + +To record a *Timesheet* entry for time-tracker services, go to the {menuselection}`Helpdesk` app, +and select the appropriate team for which these services apply. + +If there is already an existing ticket for this issue, select it from the Kanban view. This opens +the ticket details form. If there is no existing ticket for this customer issue, click +{guilabel}`New` to create a new ticket and enter the necessary customer information on the blank +ticket details form. + +After selecting or creating a ticket, go to the {guilabel}`Sales Order Item` drop-down menu. Select +the {abbr}`SO (sales order)` created in the previous step. + +### Track support hours on a ticket + +In order to create an invoice for a product based on timesheets, hours need to be tracked and +recorded. At this point, the service is considered *delivered*. To record hours for this support +service, click on the {guilabel}`Timesheets` tab of the ticket. + +Click {guilabel}`Add a Line` to record a new entry. Select an {guilabel}`Employee` from the +drop-down menu, and record the time spent in the {guilabel}`Hours Spent` column. + +Repeat these steps as needed until all time spent on the issues has been recorded. + +```{image} track_and_bill/track-bill-record-timesheet-hours.png +:align: center +:alt: View of the timesheets tab on a helpdesk ticket. +``` + +### Create an invoice for hours tracked on a ticket + +After the customer's issue has been solved, and it is determined no new timesheet entries need to be +made, an invoice can be created, and the customer can be billed. + +To do this, return to the {abbr}`SO (sales order)` by clicking on the {guilabel}`Sales Order` smart +button at the top of the ticket. + +Before creating the invoice, confirm that the number in the {guilabel}`Delivered` column matches the +total number of {guilabel}`Hours Spent` listed in the {guilabel}`Timesheets` tab on the ticket. + +```{image} track_and_bill/track-bill-delivered-timesheet-hours.png +:align: center +:alt: View of a sales order with emphasis on the delivered column. +``` + +Then, click {guilabel}`Create Invoice`. This opens a {guilabel}`Create invoice(s)` pop-up window. + +If no down payment is collected, the {guilabel}`Create Invoice` type can remain as +{guilabel}`Regular Invoice`. If a down payment is collected, choose between either {guilabel}`Down +payment (percentage)` or {guilabel}`Down payment (fixed amount)`. + +:::{important} +Use the {guilabel}`Timesheets Period` field if this invoice should **only** include timesheets +from a certain time period. If this field is left blank, **all** applicable timesheets that have +not yet been invoiced will be included. +::: + +```{image} track_and_bill/track-bill-create-invoice-timesheets-period.png +:align: center +:alt: View of create invoices pop up showing timesheets period fields. +``` + +When the necessary information has been entered, click {guilabel}`Create Draft`. The invoice can +then be reviewed, edited, and sent to the customer for payment. + +:::{seealso} +- {doc}`../../../inventory_and_mrp/inventory/product_management/configure/uom` +- {doc}`../../../sales/sales/invoicing/down_payment` +::: + diff --git a/content/applications/services/helpdesk/overview.md b/content/applications/services/helpdesk/overview.md new file mode 100644 index 000000000..df85e4aa0 --- /dev/null +++ b/content/applications/services/helpdesk/overview.md @@ -0,0 +1,17 @@ +--- +nosearch: true +--- + +# Overview + +```{toctree} +:titlesonly: true + +overview/stages +overview/receiving_tickets +overview/help_center +overview/sla +overview/reports +overview/ratings +``` + diff --git a/content/applications/services/helpdesk/overview/help_center.md b/content/applications/services/helpdesk/overview/help_center.md new file mode 100644 index 000000000..d2710a97f --- /dev/null +++ b/content/applications/services/helpdesk/overview/help_center.md @@ -0,0 +1,365 @@ +--- +substitutions: + plus: '{icon}`fa-plus` {guilabel}`(plus)` icon' +--- + +# Help Center + +Odoo **Helpdesk** integrates with the **Forums**, **eLearning**, and **Knowledge** apps to create +the *Help Center*. The *Help Center* is a centralized location where teams and customers can search +for and share detailed information about products and services. + +```{image} help_center/help-center-enable-features.png +:alt: Overview of the settings page of a team emphasizing the Help Center features. +``` + +## Configuration + +To activate any of the *Help Center* features on a *Helpdesk* team, go to {menuselection}`Helpdesk +app --> Configuration --> Helpdesk Teams` and select a team, or create a {doc}`new one +<../../helpdesk>`. Verify the {guilabel}`Visibility` of the team is set to {guilabel}`Invited portal +users and all internal users (public)` in the {guilabel}`Visibility & Assignment` section. + +Additionally, the {guilabel}`Website Form` option on the **Helpdesk** team form **must** be enabled +to activate any of the *Help Center* features. When one or more of the *Help Center* features is +enabled, the {guilabel}`Website Form` is automatically enabled, as well. + +:::{danger} +Since all of the *Help Center* features require integration with other applications, enabling any +of them may result in the installation of additional modules or applications. + +Installing a new application on a *One-App-Free* database will trigger a 15-day trial. At the end +of the trial, if a [paid subscription](https://www.odoo.com/pricing) has **not** been added to +the database, it will no longer be active or accessible. +::: + +:::{seealso} +{doc}`Helpdesk Overview <../../helpdesk>` +::: + +## Knowledge + +Odoo's **Knowledge** application is a collaborative library, where users can store, edit, and share +information. The **Knowledge** app can be used to publish user guides and {abbr}`FAQs (Frequently +Asked Questions)` with customers externally, while also collaborating internally on shared +documents. + +The **Knowledge** app is accessible throughout the database by clicking on the {guilabel}`Knowledge +(bookmark)` icon. + +:::{figure} help_center/help-center-knowledge-bookmark-icon.png +:alt: View of a message in Helpdesk focusing on the Knowledge bookmark icon. + +The Knowledge app is represented by the bookmark icon. +::: + +### Enable Knowledge on a Helpdesk team + +To enable the **Knowledge** feature on a *Helpdesk* team, go to {menuselection}`Helpdesk app --> +Configuration --> Helpdesk Teams` and select a team, or create a {doc}`new one <../../helpdesk>`. + +When a team has been selected or created, Odoo displays that team's detail form. + +On the team's detail form, scroll down to the {guilabel}`Help Center` section. Then, click the box +next to {guilabel}`Knowledge` to activate the **Knowledge** feature. When clicked, a new field +labeled, {guilabel}`Article` appears. + +Clicking the {guilabel}`Article` field reveals a drop-down menu. At first, there is only one option +in the drop-down menu titled {guilabel}`Help`, which Odoo provides by default. Select +{guilabel}`Help` from the drop-down menu to choose this article. + +:::{tip} +To create a new article, go to the {menuselection}`Knowledge app`, then hover the cursor next to +the {guilabel}`Workspace` section heading, located in the left sidebar. Moving the cursor there +reveals a hidden {{ plus }}. + +Click the {{ plus }} to create a new article in the {guilabel}`Workspace`. Click the +{icon}`fa-share-alt` {guilabel}`Share` icon, and slide the {guilabel}`Share to Web` toggle switch +until it reads {guilabel}`Article Published`. It can then be added to a **Helpdesk** team. +::: + +Once an article has been created and assigned to a **Helpdesk** team, content can be added and +organized through the **Knowledge** app. + +:::{seealso} +{doc}`Editing Knowledge articles <../../../productivity/knowledge/articles_editing>` +::: + +### Search articles from a Helpdesk ticket + +When members of a **Helpdesk** team are trying to solve a ticket, they can search through the +content in the **Knowledge** app for more information on the issue. + +To search **Knowledge** articles, open a ticket — either from the **Helpdesk** app dashboard, or by +going to {menuselection}`Helpdesk app --> Tickets --> All Tickets`, then select a ticket from the +list. + +When a ticket is selected, Odoo reveals that ticket's detail form. + +Click the {guilabel}`Knowledge (bookmark)` icon, located at the top-right of the page, to open a +pop-up search window. + +```{image} help_center/help-center-knowledge-search.png +:alt: View of knowledge search window from a helpdesk ticket. +``` + +:::{tip} +**Knowledge** articles can also be searched by pressing {command}`Ctrl + K` to open the command +palette, then typing {kbd}`?`, followed by the name of the desired article. +::: + +When Odoo reveals the desired article, click it, or highlight the {guilabel}`Article` title, and +press {command}`Enter`. This will open the article in the {guilabel}`Knowledge` application. + +To open the article in a new tab, press {command}`Ctrl + Enter`. + +:::{tip} +If a more in-depth search is required, press {command}`Alt + B`. That reveals a separate page, in +which a more detailed search can occur. +::: + +#### Share an article to the Help Center + +To make a **Knowledge** article available to customers and website visitors, it **must** be +published. + +:::{important} +Even though the *Help* article has been enabled on a team, Odoo does **not** share all the nested +articles to the web. Individual articles intended for customers **must** be published for them to +be viewable on the website. +::: + +To publish an article, navigate to the desired article, by following the above steps, and click the +{icon}`fa-share-alt` {guilabel}`Share` icon. This reveals a menu. Slide the toggle button labeled +{guilabel}`Share to Web` to read {guilabel}`Article Published`. + +```{image} help_center/help-center-knowledge-sharing.png +:alt: View of a knowledge article focused on sharing and publishing options. +``` + +### Solve tickets with a clipboard box + +*Clipboard* boxes can be added to **Knowledge** articles to allow content to be reused, copied, sent +as messages, or added to the description on a ticket. This allows teams to maintain consistency when +answering customer tickets, and minimize the amount of time spent on responding to repeat questions. + +#### Add 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 +is then added to the page. Add any necessary content to this block. + +```{image} help_center/help-center-knowledge-clipboard-options.png +:alt: View of a clipboard in knowledge with focus on send and copy options. +``` + +:::{note} +Clipboard boxes only display the {guilabel}`Use as description` or {guilabel}`Send as Message` +options if they are accessed directly from the **Helpdesk**. +::: + +#### Use clipboard boxes in tickets + +Clipboard boxes can be used to respond directly to a **Helpdesk** ticket as a message, or to add +information to the ticket's description. + +To use clipboard boxes in a **Helpdesk** ticket, first, open a ticket, either from the +{guilabel}`Helpdesk` dashboard or by going to {menuselection}`Helpdesk app --> Tickets --> All +Tickets` and selecting a ticket from the list. + +Click on the {guilabel}`Knowledge (bookmark)` icon in the top-right corner. This opens a search +window. In this search window, select, or search, for the desired article. Doing so reveals that +article page in the Odoo **Knowledge** application. + +To use a clipboard box to respond to a ticket, click {guilabel}`Send as message` in the upper-right +corner of the clipboard box, located in the body of the article. + +Doing so opens a {guilabel}`Compose Email` pop-up window. In this window, select the recipients, +make any necessary additions or edits to the clipboard content, then click {guilabel}`Send`. + +:::{tip} +To use a clipboard box to add information to a ticket's description, click {guilabel}`Use as +description` in the upper-right corner of the clipboard box, located in the body of the article. +Doing so does **not** replace the existing text in a ticket's description. The content from the +clipboard box is added as additional text. +::: + +(helpdesk-forum)= + +## Community Forum + +A *Community Forum* provides a space for customers to answer each other's questions and share +information. By integrating a forum with a **Helpdesk** team, tickets submitted by customers can be +converted to posts and shared. + +### Enable forums on a Helpdesk team + +To enable {guilabel}`Community Forums` on a **Helpdesk** team, start by navigating to +{menuselection}`Helpdesk app --> Configuration --> Helpdesk Teams` and select a team, or create a +{doc}`new one <../../helpdesk>`. + +Selecting or creating a team reveals that team's detail form. Scroll down to the {guilabel}`Help +Center` section of features, and enable {guilabel}`Community Forum`, by checking the box beside it. + +When activated, a new field labeled {guilabel}`Forums` appears beneath. + +Click the empty {guilabel}`Forums` field to reveal a drop-down menu. By default, there is only one +option to begin with, labeled {guilabel}`Help`. That is the option Odoo automatically created when +the {guilabel}`Community Forums` feature was enabled. Select {guilabel}`Help` from the drop-down +menu to enable that forum. + +To create a new forum, type a name into the blank {guilabel}`Forums` field, then click the +{guilabel}`Create and Edit` option. Multiple forums can be selected in this field. + +:::{seealso} +{doc}`Forum documentation <../../../websites/forum>` +::: + +### Create a forum post from a Helpdesk ticket + +When a **Helpdesk** team has a *Forum* enabled, tickets submitted to that team can be converted to +forum posts. + +To do that, select a ticket, either from a team's pipeline or from {menuselection}`Tickets --> All +Tickets` in the {guilabel}`Helpdesk` application. + +At the top of the ticket detail form, click the {guilabel}`Share on Forum` button. + +```{image} help_center/help-center-share-on-forum.png +:alt: Overview of the Forums page of a website to show the available ones in Odoo Helpdesk. +``` + +When clicked, a pop-up window appears. Here, the {guilabel}`Forum` post and {guilabel}`Title` can be +edited to correct any typos, or modified to remove any proprietary or client information. + +{guilabel}`Tags` can also be added to help organize the post in the forum, making it easier for +users to locate during a search. When all adjustments have been made, click {guilabel}`Create and +View Post`. + +### Create a Helpdesk ticket from a forum post + +Forum posts submitted by portal users can be converted to **Helpdesk** tickets. + +To create a ticket, navigate to a forum post, and click the {icon}`fa-ellipsis-h` +{guilabel}`(ellipsis)` icon. Then, click {guilabel}`Create Ticket`. + +```{image} help_center/help-center-create-ticket.png +:alt: A forum post with the create ticket option visible. +``` + +This opens a {guilabel}`Create Ticket` pop-up. Make any necessary edits to the {guilabel}`Create +Ticket` field. Then, confirm the {guilabel}`Helpdesk Team` the ticket should be assigned to. + +Click {guilabel}`Create & View Ticket` or {guilabel}`Create Ticket`. + +:::{note} +The original forum post is linked in the chatter on the new ticket. +::: + +## eLearning + +Odoo **eLearning** courses offer customers additional training and content in the form of videos, +presentations, and certifications/quizzes. Providing additional training enables customers to work +through issues and find solutions on their own. They can also develop a deeper understanding of the +services and products they are using. + +### Enable eLearning courses on a Helpdesk team + +To enable **eLearning** courses on a **Helpdesk** team, go to {menuselection}`Helpdesk app --> +Configuration --> Helpdesk Teams` and select a team, or create a {doc}`new one <../../helpdesk>`. + +On the team's settings page, scroll to the {guilabel}`Help Center` section, and check the box next +to {guilabel}`eLearning`. A new field appears below, labeled {guilabel}`Courses`. + +Click the empty field next to {guilabel}`Courses` beneath the {guilabel}`eLearning` feature to +reveal a drop-down menu. Select an available course from the drop-down menu, or type a title into +the field, and click {guilabel}`Create and edit` to create a new course from this page. Multiple +courses can be assigned to a single team. + +### Create an eLearning course + +A new **eLearning** course can be created from the {guilabel}`Helpdesk` team's settings page, as in +the step above, or from the **eLearning** app. + +To create a course directly through the **eLearning** application, navigate to +{menuselection}`eLearning --> New`. This reveals a blank course template that can be customized and +modified as needed. + +On the course template page, add a {guilabel}`Course Title`, and below that, {guilabel}`Tags`. + +Click on the {guilabel}`Options` tab. + +Under {guilabel}`Access Rights`, select which users are able to view and enroll in the course. + +The {guilabel}`Show Course To` field defines who can access the courses. The {guilabel}`Enroll +Policy` field specifies how they can register for the course. + +Under {guilabel}`Display`, choose the preferred course {guilabel}`Type`. + +#### Add content to an eLearning course + +To add content to a course, click the {guilabel}`Content` tab and select {guilabel}`Add Content`. +Choose the {guilabel}`Content Type` from the drop-down menu and upload the file, or paste the link, +where instructed. Click {guilabel}`Save` when finished. Click {guilabel}`Add Section` to organize +the course in sections. + +```{image} help_center/help-center-elearning-course-contents-page.png +:alt: View of a course being published for Odoo Helpdesk. +``` + +:::{note} +In order to add a certification to a course, go to {menuselection}`eLearning --> Configuration +--> Settings`, check the box labeled {guilabel}`Certifications`, and {guilabel}`Save` to activate +the setting. +::: + +:::{seealso} +[Odoo Tutorials: eLearning](https://www.odoo.com/slides/elearning-56) +::: + +### Publish an eLearning course + +To allow customers to enroll in a course, both the course and the contents **must** be published. + +:::{tip} +If the course is published, but the contents of the course are **not** published, customers can +enroll in the course on the website, but they are **not** able to view any of the course content. +Knowing this, it may be beneficial to publish the course first, if the course contents are +intended to be released over time, such as classes with a weekly schedule. +::: + +To make the entire course available at once, each piece of course content must be published first, +then the course can be published. + +To publish a course, choose a course from the **eLearning** dashboard. On the course template page, +click the {guilabel}`Go to Website` smart button. + +This will reveal the front end of the course's web page. At the top of the course web page, move +the {guilabel}`Unpublished` toggle switch to {guilabel}`Published`. + +#### Publish eLearning course contents from the back-end + +To publish **eLearning** course content from the back-end, choose a course from the **eLearning** +dashboard. On the course template page, click the {guilabel}`Published Contents` smart button. + +Doing so reveals a separate page displaying all the published content related to that course. Remove +the default {guilabel}`Published` filter from the search bar in the upper-right corner, to reveal +all the content related to the course - even the non-published content. + +Click the {icon}`oi-view-list` {guilabel}`(list)` icon to switch to list view. + +While in list view, there is a checkbox on the far-left of the screen, above the listed courses, to +the left of the {guilabel}`Title` column title. When that checkbox is clicked, all the course +contents are selected at once. + +With all the course content selected, click any of the boxes in the {guilabel}`Is Published` column. +This reveals a pop-up window, asking for confirmation that all selected records are intended to be +published. Click {guilabel}`Confirm` to automatically publish all course content. + +```{image} help_center/help-center-elearning-publish-back-end.png +:alt: View of a course contents being published in Odoo Helpdesk back-end. +``` + diff --git a/content/applications/services/helpdesk/overview/ratings.md b/content/applications/services/helpdesk/overview/ratings.md new file mode 100644 index 000000000..f30eb87a8 --- /dev/null +++ b/content/applications/services/helpdesk/overview/ratings.md @@ -0,0 +1,121 @@ +# Customer ratings + +Asking customers to rate the support they received from a *Helpdesk* team provides an opportunity to +gauge team performance and track customer satisfaction. Ratings can be published on the portal, +providing customers with a general overview of the team's performance. + +(helpdesk-enable-ratings)= + +## Enable customer ratings on Helpdesk teams + +To enable *customer ratings* on a helpdesk team, navigate to {menuselection}`Helpdesk app --> +Configuration --> Helpdesk Teams`. Select a team from the list and click on it to open the settings +page. Scroll to the {guilabel}`Performance` section, and tick the {guilabel}`Customer Ratings` +checkbox. + +```{image} ratings/ratings-enable.png +:align: center +:alt: |- +: Overview of the settings page of a helpdesk team emphasizing the rating on ticket feature +: in Odoo Helpdesk. +``` + +## Set a ratings request email template on a stage + +To automatically request ratings from customers once their tickets have closed, an email template +should be added to the appropriate stage. + +After the {guilabel}`Customer Ratings` {ref}`setting has been enabled ` on +the team's settings page, click the {guilabel}`Set an Email Template on Stages` link. Select a stage +from the list, or click {guilabel}`New` to create a new stage. + +:::{important} +Customers should only be asked to rate tickets once an issue has been resolved and their ticket +is *closed*. Therefore, a *ratings request* email should **only** be added to a stage that is +folded in the Kanban, as tickets in a *folded stage* are considered closed. +::: + +On the stage's settings page, select the template, `Helpdesk: Ticket Rating Request` in the +{guilabel}`Email Template` field. This template has been preconfigured with ratings customers can +use to provide feedback. To view the template, click the arrow button to the right of the field. + +After the template is added to the stage, it automatically sends a message when a ticket is moved to +that stage. Customers are then asked to rate the support they received with colored icons. + +> - *Green smiling face* - Satisfied +> - *Yellow neutral face* - Okay +> - *Red frowning face* - Dissatisfied + +After selecting a rating, customers are taken to a webpage where they can provide specific written +feedback to support their rating. The rating is then submitted, and the rating, as well as any +additional comments, are added to the chatter on the ticket. + +:::{tip} +Customer ratings can also be viewed through the {guilabel}`Customer Ratings` report. To view +this report, go to {menuselection}`Helpdesk app --> Reporting --> Customer Ratings`. +::: + +:::{seealso} +{doc}`../../../general/companies/email_template` +::: + +## Publish ratings on the customer portal + +After enabling the {guilabel}`Customer Ratings` setting, an option to publish ratings on the team's +website appears. Enabling this setting provides portal users with an overview of the ratings the +team has received over the last thirty days. Specific written feedback will not be included; only +statistics of the team's performance will be visible. + +:::{important} +To display ratings on the customer portal, a team **must** have their visibility setting set to +{guilabel}`Invited portal users and all internal users (public)`. To enable this setting, +navigate to {menuselection}`Helpdesk app --> Configuration --> Helpdesk Teams`. Select a team +from the list and click on it to open the settings page. Scroll to the {guilabel}`Visibility & +Assignment` section, and tick the {guilabel}`Invited portal users and all internal users +(public)` checkbox. +::: + +Next, to publish the ratings, go to {menuselection}`Helpdesk app--> Configuration --> Helpdesk +Teams` and select a team. Scroll to {guilabel}`Performance` and tick the checkbox for +{guilabel}`Publish this team's ratings on your website`. + +To view the ratings for a team, a customer will log into the portal and navigate to one of their +tickets. After clicking on the team name in the {guilabel}`Managed By` field, they will be directed +to a page with the team's ratings over the past thirty days. + +```{image} ratings/ratings-portal-overview.png +:align: center +:alt: View of the ratings performance overview from the customer portal. +``` + +:::{seealso} +{doc}`Portal access <../../../general/users/portal>` +::: + +### Manually hide individual ratings + +Individual ratings can be manually hidden from the portal. This allows for specific ratings to be +kept out of the performance metrics shared with customers. + +To make a rating visible only to internal users, navigate to the page for a rating. This can be done +in one of the following ways: + +> - Go to {menuselection}`Helpdesk app --> Reporting --> Customer Ratings` and click on one of the +> Kanban cards for an individual rating. +> - Navigate to {menuselection}`Helpdesk app--> Tickets --> All Tickets` and remove the +> {guilabel}`Open` filter from the search bar. Then filter by {guilabel}`Satisfied`, +> {guilabel}`Okay` and/or {guilabel}`Dissatisfied`. Select a ticket from the results. Click the +> {guilabel}`Rating` smart button. + +Once on the rating details page, check the {guilabel}`Visible Internally Only` box. + +```{image} ratings/ratings-keep-internal.png +:align: center +:alt: View of the ratings performance overview from the customer portal. +``` + +:::{seealso} +- {doc}`../advanced/close_tickets` +- {doc}`reports` +::: + diff --git a/content/applications/services/helpdesk/overview/receiving_tickets.md b/content/applications/services/helpdesk/overview/receiving_tickets.md new file mode 100644 index 000000000..93c7720f1 --- /dev/null +++ b/content/applications/services/helpdesk/overview/receiving_tickets.md @@ -0,0 +1,350 @@ +# Receiving tickets + +Odoo's **Helpdesk** app offers multiple channels where customers can reach out for assistance, such +as email, live chat, and through a website's submission form. The variety of these contact options +provides customers with multiple opportunities to receive support quickly while also allowing the +support team to manage multi-channel support tickets from one central location. + +## Enable channel options to submit tickets + +Go to {menuselection}`Helpdesk app --> Configuration --> Helpdesk Teams`, and choose an existing +team, or click {guilabel}`New` to {doc}`create a new team <../../helpdesk>`. + +On the team's settings page, scroll down to the {guilabel}`Channels` and {guilabel}`Help Center` +sections. Enable one or more channels by checking the respective boxes. + +- {ref}`Email Alias ` +- {ref}`Live Chat ` +- {ref}`Website Form ` + +(helpdesk-receiving-tickets-email-alias)= + +### Email Alias + +The *Email Alias* setting creates tickets from messages sent to that team's specified email alias. + +:::{important} +The following steps are for **Odoo Online** and **Odoo.sh** databases. For **On-premise** +databases, external servers are required for email aliases. +::: + +When a new **Helpdesk** team is created, an email alias is created for it. This alias can be changed +on the team's settings page. + +To change a **Helpdesk** team's email alias, navigate to {menuselection}`Helpdesk app --> +Configuration --> Helpdesk Teams`, and click on a team name to open its settings page. + +Then, scroll to {menuselection}`Channels --> Email Alias`. In the {guilabel}`Alias` field, type the +desired name for the team's email alias. + +```{image} receiving_tickets/receiving-tickets-email-alias.png +:alt: |- +: View of the settings page of a Helpdesk team emphasizing the email alias feature in Odoo +: Helpdesk. +``` + +:::{note} +Custom email domains are **not** required in order to use an email alias, however, they can be +configured through the **Settings** app. + +If the database does not have a custom domain already configured, click {guilabel}`Set an Alias +Domain` to be redirected to the {guilabel}`Settings` page. From there, enable {guilabel}`Custom +Email Servers`. +::: + +When an email is received, the subject line becomes the title of a new **Helpdesk** ticket. The body +of the email is also added to the ticket, under the {guilabel}`Description` tab, and in the ticket's +chatter. + +(helpdesk-receiving-tickets-live-chat)= + +### Live Chat + +The **Live Chat** feature lets website visitors connect directly with a support agent or chatbot. +**Helpdesk** tickets can be instantly created during these conversations using the {doc}`response +command ` `/ticket`. + +To enable **Live Chat**, navigate to the {menuselection}`Helpdesk app --> Configuration --> Helpdesk +Teams` list view, select a team, and on the team's settings page, click the checkbox next to +{guilabel}`Live Chat`, under the {guilabel}`Channels` section. + +:::{note} +If this is the first time {doc}`Live Chat ` has been enabled on +the database, the page may need to be saved manually and refreshed before any further steps can +be taken. +::: + +After the {guilabel}`Live Chat` setting is enabled on a **Helpdesk** team, a new **Live Chat** +channel is created. Click on {guilabel}`Configure Live Chat Channel` to update the channel's +settings. + +#### Live Chat channel configuration + +On the channel's settings page, {guilabel}`Channel Name` can be edited, though, Odoo names the +channel to match the **Helpdesk** team name, by default. + +```{eval-rst} +.. example:: + If a **Helpdesk** team is named `Customer Care`, a **Live Chat** channel is created called + `Customer Care`. + + .. image:: receiving_tickets/receiving-tickets-live-chat-new-channel.png + :alt: View of the Kanban cards for the available Live Chat channels. +``` + +On the channel form, navigate through the tabs to complete the setup. + +##### Operators tab + +*Operators* are the users who act as agents and respond to live chat requests from customers. The +user who created the live chat channel is added by default. + +To add additional users, click on the {guilabel}`Operators` tab, then click {guilabel}`Add`. + +Click the checkbox next to the users to be added on the {guilabel}`Add: Operators` pop-up window +that appears, then click {guilabel}`Select`. + +Click {guilabel}`New` to create new operators, if needed. + +When the desired addition is complete, click {guilabel}`Save & Close`, or {guilabel}`Save & New` to +add multiple new operators. + +:::{danger} +Creating a new user can impact the status of an Odoo subscription, as the total number of users +in a database counts towards the billing rate. Proceed with caution before creating a new user. +If a user already exists, adding them as an operator will **not** alter the subscription or +billing rate for a database. +::: + +Additionally, current operators can be edited or removed by clicking on their respective boxes in +the {guilabel}`Operators` tab, and then adjusting their form values on the pop-up form that appears, +or by using one of the buttons located at the bottom of the form, such as {guilabel}`Remove`. + +:::{tip} +Users can add themselves as an operator by clicking the {guilabel}`Join Channel` button on a +**Live Chat** channel. + +```{image} receiving_tickets/receiving-tickets-join-live-chat.png +:alt: View of a live chat channel Kanban card with the join button emphasized. +``` +::: + +##### Options tab + +The {guilabel}`Options` tab contains the visual and text settings for the live chat window. + +```{image} receiving_tickets/receiving-tickets-options-tab.png +:alt: View of the options tab of a Live Chat channel's settings. +``` + +- {guilabel}`Notification Text`: This field updates the greeting displayed in the text bubble when + the live chat button appears on the website. +- {guilabel}`Livechat Button Color`: This field alters the color of the live chat button as it + appears on the website. To change the color, click on a color bubble to open the color selection + window, then click and drag the circle along the color gradient. Click out of the selection window + once complete. Click the refresh icon to the right of the color bubbles to reset the colors to the + default selection. +- {guilabel}`Show`: The chat button displays on the selected page. +- {guilabel}`Show with notification`: The chat button is displayed, with the addition of the + {guilabel}`Notification text` from the {guilabel}`Options` tab. +- {guilabel}`Open automatically`: The chat button is displayed, and automatically opens the chat + window after a designated amount of time. The amount of time is designated in the {guilabel}`Open + automatically timer` field, which appears only when this display option is selected. +- {guilabel}`Hide`: The chat button is hidden from display on the webpage. + +:::{tip} +Color selection, for the button or header, can be made manually, or through RGB, HSL, or HEX code +selection. Different options are available, depending on the operating system or browser. +::: + +##### Channel Rules tab + +The {guilabel}`Channel Rules` tab determines when the live chat window opens on the website by logic +of when a {guilabel}`URL Regex` action is triggered (e.g., a page visit). + +:::{tip} +A regex, or regular expression, is sometimes referred to as a rational expression. It is a +sequence of characters that specifies a match pattern in text. A match is made within the given +range of numbers or for the set of characters. +::: + +Edit existing rules by selecting them from the {guilabel}`Channel Rules` tab, or create a new rule +by clicking {guilabel}`Add a line`. + +Then, proceed to configure the details for how the rule should apply on the pop-up form that +appears. + +Choose how the *Live Chat Button* displays on the webpage. + +- {guilabel}`Show`: The chat button displays on the selected page. +- {guilabel}`Show with notification`: The chat button is displayed, with the addition of the + {guilabel}`Notification text` from the {guilabel}`Options` tab. +- {guilabel}`Open automatically`: The chat button is displayed, and automatically opens the chat + window after a designated amount of time. The amount of time is designated in the {guilabel}`Open + automatically timer` field, which appears only when this display option is selected. +- {guilabel}`Hide`: The chat button is hidden from display on the webpage. + +To include a {guilabel}`Chatbot` on this channel, select it from the drop-down menu. If the chatbot +should only be active when no operators are available, check the box labeled {guilabel}`Enabled only +if no operator`. + +:::{note} +If a {doc}`chatbot ` is added to a live chat channel, a +new {guilabel}`Chatbots` smart button appears on the channel settings form. Click here to create +and update the chatbot *script*. + +Each line in the script contains a {guilabel}`Message`, {guilabel}`Step Type`, +{guilabel}`Answers`, and conditional *Only If* logic that applies when certain pre-filled answers +are chosen. + +To create more steps in the script, click {guilabel}`Add a line`, and fill out the script steps +form, according to the desired logic. +::: + +Add the URLs for the pages where the channel should appear in the {guilabel}`URL Regex` field. Only +the path from the root domain is needed, not the full URL. + +If this channel should only be available to users in specific countries, add those countries to the +{guilabel}`Country` field. If this field is left blank, the channel is available to all site +visitors. + +```{image} receiving_tickets/receiving-tickets-channel-rules.png +:alt: View of the Kanban cards for the available Live Chat channels. +``` + +##### Widget tab + +The {guilabel}`Widget` tab on the live chat channel form offers a website widget that can be added +to third-party websites. Additionally, a URL is available, that can provide instant access to a live +chat window. + +The live chat {guilabel}`Widget` can be applied to websites created through Odoo by navigating to +the {menuselection}`Website app --> Configuration --> Settings --> Email & Marketing`. Then, scroll +to the {guilabel}`Live Chat` field, and select the channel to add to the site. Click +{guilabel}`Save` to apply. + +To add the widget to a website created on a third-party website, click the {guilabel}`Copy` button +next to the first listed code, and paste the code into the `` tag on the site. + +To send a live chat session to a customer or supplier, click the {guilabel}`Copy` button next to the +second listed code, and send the URL via email. + +#### Create a support ticket from a live chat session + +Operators who have joined a live chat channel are able to communicate with site visitors in +real-time. + +During the conversation, an operator can use the shortcut {doc}`command +` `/ticket` to create a ticket without leaving the chat +window. The transcript from the conversation is added to the new ticket, under the +{guilabel}`Description` tab. + +:::{tip} +**Helpdesk** tickets can also be created through the {doc}`WhatsApp +` app using the same `/ticket` command. +::: + +(helpdesk-receiving-tickets-website-form)= + +### Website Form + +Enabling the *Website Form* setting adds a new page to the website with a customizable form. A new +ticket is created once the required form fields are filled out and submitted. + +To activate the website form, navigate to a team's settings page under {menuselection}`Helpdesk app +--> Configuration --> Helpdesk Teams`, and selecting the desired team from the list. + +Then, locate the {guilabel}`Website Form` feature, under the {guilabel}`Help Center` section, and +check the box. + +If more than one website is active on the database, confirm the correct website is listed in the +{guilabel}`Website` field. If not, select the correct one from the drop-down list. + +After the feature is activated, click the {guilabel}`Go to Website` smart button at the top of the +{guilabel}`Teams` settings page to view and edit the new website form, which is created +automatically by Odoo. + +:::{note} +After enabling the {guilabel}`Website Form` setting, the team's settings page may need to be +refreshed before the {guilabel}`Go to Website` smart button appears. + +Additionally, if a *Help Center* is published, the smart button navigates there first. Simply +click the {guilabel}`Contact Us` button, at the bottom of the forum, to navigate to the ticket +submission form. +::: + +```{image} receiving_tickets/receiving-tickets-go-to-website.png +:alt: |- +: View of the settings page of a helpdesk team emphasizing the Go to Website button in +: Odoo Helpdesk. +``` + +#### Website ticket form customization + +To customize the default ticket submission form, while on the website, click the {guilabel}`Edit` +button in the upper-right corner of the page. This opens the editing sidebar on the right side. +Then, click on one of the fields in the form, on the body of the website, to edit it. + +To add a new field, go to the {guilabel}`Field` section of the sidebar, and click {guilabel}`+ +Field`. + +Click the {guilabel}`🗑️ (trash can)` icon to delete the field, if necessary. + +Edit the other options for the new field in the sidebar, as desired: + +- {guilabel}`Type`: matches an Odoo model value to the field (e.g. `Customer Name`). +- {guilabel}`Input Type`: determine what type of input the field should be, like `Text`, `Email`, + `Telephone`, or `URL`. +- {guilabel}`Label`: give the form field a label (e.g. `Full Name`, `Email Address`, etc.). Also + control the label position on the form by using the nested {guilabel}`Position` options. +- {guilabel}`Description`: determine whether or not to add an editable line under the input box to + provide additional contextual information related to the field. +- {guilabel}`Placeholder`: add a sample input value. +- {guilabel}`Default Value`: add common use case values that most customers would find valuable. + For example, this can include prompts of information customers should include to make it easier to + solve their issue, such as an account number, or product number. +- {guilabel}`Required`: determine whether or not to mark a field as required, in order for the form + to be submitted. Toggle the switch from gray to blue. +- {guilabel}`Visibility`: allow for absolute or conditional visibility of the field. Nested options, + such as, device visibility, appear when certain options are selected. +- {guilabel}`Animation`: choose whether or not the field should include animation. + +```{image} receiving_tickets/receiving-tickets-web-form.png +:align: center +:alt: View of the unpublished website form to submit a ticket for Odoo Helpdesk. +``` + +Once the form has been optimized, and is ready for public use, click {guilabel}`Save` to apply the +changes. Then, publish the form by toggling the {guilabel}`Unpublished` switch to +{guilabel}`Published` at the top of the page, if necessary. + +## Prioritizing tickets + +All tickets include a {guilabel}`Priority` field. The highest priority tickets appear at the top of +the Kanban and list views. + +```{image} receiving_tickets/receiving-tickets-priority.png +:alt: View of a team's Kanban view and the prioritized tasks in Odoo Helpdesk. +``` + +The priority levels are represented by stars: + +- 0 stars = *Low Priority* +- 1 star = *Medium Priority* +- 2 stars = *High Priority* +- 3 stars = *Urgent* + +Tickets are set to low priority (0 stars) by default. To change the priority level, select the +appropriate number of stars on the Kanban card, or on the ticket. + +:::{warning} +As priority levels can be used as criteria for assigning {doc}`SLAs `, changing the priority +level of a ticket can alter the {abbr}`SLA (Service Level Agreement)` deadline. +::: + +:::{seealso} +- {doc}`/applications/services/helpdesk/advanced/close_tickets` +- {doc}`../../../general/email_communication` +- {doc}`/applications/websites/livechat` +::: + diff --git a/content/applications/services/helpdesk/overview/reports.md b/content/applications/services/helpdesk/overview/reports.md new file mode 100644 index 000000000..ec93862f6 --- /dev/null +++ b/content/applications/services/helpdesk/overview/reports.md @@ -0,0 +1,224 @@ +--- +substitutions: + SLA: '{abbr}`SLA (Service Level Agreement)`' + SLAs: '{abbr}`SLAs (Service Level Agreements)`' +--- + +# Reporting + +Reports in Odoo *Helpdesk* provide the opportunity to manage employee workloads, identify areas for +improvement, and confirm if customer expectations are being met. + +## Available reports + +Details about the reports available in Odoo *Helpdesk* can be found below. To view the different +reports, go to {menuselection}`Helpdesk app --> Reporting`, and select one of the following: +{guilabel}`Tickets Analysis`, {guilabel}`SLA Status Analysis`, or {guilabel}`Customer Ratings`. + +### Tickets Analysis + +The *Tickets Analysis* report ({menuselection}`Helpdesk app --> Reporting --> Tickets Analysis`) +provides an overview of every customer support ticket in the database. + +This report is useful for identifying where teams are spending the most time, and helps determine if +there is an uneven workload distribution among the support staff. The default report counts the +number of tickets per team and groups them by stage. + +```{image} reports/tickets-default.png +:align: center +:alt: View of Ticket Analysis report default view. +``` + +Alternative measures can be selected to track where the most time is spent at different points in +the workflow. To change the measures used for the report that is currently displayed, or to add +more, click the {guilabel}`Measures` button, and select one or more options from the drop-down +menu: + +- {guilabel}`Average Hours to Respond`: average number of working hours between a message sent from + the customer and the response from the support team. *This does not include messages sent when + the ticket was in a folded stage.* +- {guilabel}`Hours Open`: number of hours between the date the ticket was created and the closed + date. If there is no closed date on the ticket, the current date is used. **This measure is not + specific to working hours.** +- {guilabel}`Hours Spent`: number of *Timesheet* hours logged on a ticket. *This + measure is only available if Timesheets are enabled on a team, and the current user has the access + rights to view them.* +- {guilabel}`Hours to Assign`: number of working hours between the date the ticket was created and + when it was assigned to a team member. +- {guilabel}`Hours to Close`: number of working hours between the date the ticket was created and + the date it was closed. +- {guilabel}`Hours to First Response`: number of working hours between the date the ticket was + received and the date on which the first message was sent. *This does not include email sent + automatically when a ticket reaches a stage.* +- {guilabel}`Hours until SLA Deadline`: number of working hours remaining to reach the last {{ SLA }} + deadline on a ticket. +- {guilabel}`Rating (/5)`: number out of five to represent customer feedback (Dissatisfied = 1, + Okay/Neutral = 3, Satisfied = 5). +- {guilabel}`Remaining Hours on SO`: hours remaining on a linked sales order. +- {guilabel}`Count`: number of tickets in total. + +:::{note} +*Working hours* are calculated based on the default working calendar. To view or change the +working calendar, go to the {menuselection}`Settings` application and select +{menuselection}`Employees --> Company Working Hours`. +::: + +### SLA Status Analysis + +The *SLA Status Analysis* report ({menuselection}`Helpdesk app --> Reporting --> SLA Status +Analysis`) {ref}`analyzes the performance ` of individual SLA +(Service Level Agreement) policies. + +By default, this report is filtered to show the number of {{ SLAs }} failed, in progress, and the number +that have been successful. The results are grouped by teams. + +```{image} reports/sla-status.png +:align: center +:alt: View of Group by options of Ticket Analysis report. +``` + +To change the measures used for the report that is currently displayed, or to add more, click the +{guilabel}`Measures` button, and select one or more options from the drop-down menu: + +- {guilabel}`Number of SLA Failed`: number of tickets that have failed at least one {{ SLA }}. +- {guilabel}`Rating (/5)`: number value representing customer feedback (Dissatisfied = 1, + Okay/Neutral = 3, Satisfied = 5). +- {guilabel}`Remaining Hours on SO`: hours remaining on a linked sales order. +- {guilabel}`Working Hours to Assign`: number of working hours between the date the ticket was + created and when it was assigned to a team member. +- {guilabel}`Working Hours to Close`: number of working hours between the date the ticket was + created and the date it was closed. +- {guilabel}`Working Hours to Reach SLA`: number of working hours between the date the ticket was + created and the date the {{ SLA }} was satisfied. +- {guilabel}`Count`: number of tickets in total. + +:::{seealso} +{doc}`Service Level Agreements (SLA) ` +::: + +### Customer Ratings + +The *Customer Ratings* report ({menuselection}`Helpdesk app--> Reporting --> Customer Ratings`) +displays an overview of the ratings received on individual support tickets, as well as any +additional comments submitted with the rating. + +```{image} reports/customer-ratings.png +:align: center +:alt: View of the Kanban display in the Customer Ratings report. +``` + +Click on an individual rating to see additional details about the rating submitted by the customer, +including a link to the original ticket. + +```{image} reports/ratings-details.png +:align: center +:alt: View of the details of an individual customer rating. +``` + +:::{tip} +On the rating's details page, tick the {guilabel}`Visible Internally Only` checkbox to hide the +rating from the customer portal. +::: + +The *Customer Ratings* report is displayed in a Kanban view by default, but can also be displayed +in graph, list, or pivot view. + +:::{seealso} +{doc}`Ratings ` +::: + +## View and filter options + +On any Odoo report, the view and filter options vary, depending on what data is being analyzed, +measured, and grouped. See below for additional information on the available views for the +*Helpdesk* reports. + +:::{note} +Only one measure may be selected at a time for graphs, but pivot tables can include multiple +measures. +::: + +### Pivot view + +The *pivot* view presents data in an interactive manner. All three *Helpdesk* reports are available +in pivot view. + +The pivot view can be accessed on any report by selecting the {icon}`oi-view-pivot` +{guilabel}`(pivot)` icon at the top-right of the screen. + +```{image} reports/pivot-view.png +:align: center +:alt: View of the SLA status analysis report in Odoo Helpdesk. +``` + +To add a group to a row or column to the pivot view, click the {icon}`fa-plus-square` +{guilabel}`(plus)` icon next to {guilabel}`Total`, and then select one of the groups. To remove one, +click the {icon}`fa-minus-square-o` {guilabel}`(minus)` icon, and de-select the appropriate option. + +### Graph view + +The *graph* view presents data in either a *bar*, *line*, or *pie* chart. + +Switch to the graph view by selecting the {icon}`fa-area-chart` {guilabel}`(area chart)` icon at the +top-right of the screen. To switch between the different charts, select the *related icon* at the +top-left of the chart, while in graph view. + +```{eval-rst} +.. tabs:: + + .. tab:: Bar chart + + .. image:: reports/bar-chart.png + :align: center + :alt: View of the SLA status analysis report in bar view. + + .. tab:: Line chart + + .. image:: reports/line-chart.png + :align: center + :alt: View of the Customer Ratings report in line view. + + .. tab:: Pie chart + + .. image:: reports/pie-chart.png + :align: center + :alt: View of the Ticket analysis report in pie chart view. +``` + +:::{tip} +Both the *bar chart* and *line chart* can utilize the *stacked* view option. This presents two +or more groups of data on top of each other, instead of next to each other, making it easier to +compare data. While viewing either a bar chart or line chart, click the {icon}`fa-database` +{guilabel}`(stacked)` icon to toggle the stacked view option on or off. +::: + +### Save and share a favorite search + +The *Favorites* feature found on *Helpdesk* reports allows users to save their most commonly used +filters, without having to reconstruct them every time they are needed. + +To create and save a new *Favorites* configuration on a report, follow the steps below: + +1. Set the necessary parameters using the {guilabel}`Filters`, {guilabel}`Group By` and + {guilabel}`Measures` options. +2. Click the {icon}`fa-caret-down` {guilabel}`(down)` icon next to the {guilabel}`Search...` bar to + open the drop-down menu. +3. Under the {guilabel}`Favorites` heading, click {guilabel}`Save current search`. +4. If desired, enter a new name for the report. +5. Tick the {guilabel}`Default Filter` checkbox to have these filter settings automatically + displayed when the report is opened. Otherwise, leave it blank. +6. Tick the {guilabel}`Shared` checkbox to make this filter configuration available to all other + database users. If this checkbox is not ticked, only the user who creates the filter can access + it. +7. Click {guilabel}`Save` to preserve the configuration for future use. + +```{image} reports/save-filters.png +:align: center +:alt: View of the save favorites option in Odoo Helpdesk. +``` + +:::{seealso} +- {doc}`Start receiving tickets ` +- {doc}`Odoo reporting <../../../essentials/reporting>` +::: + diff --git a/content/applications/services/helpdesk/overview/sla.md b/content/applications/services/helpdesk/overview/sla.md new file mode 100644 index 000000000..3fe2cdd58 --- /dev/null +++ b/content/applications/services/helpdesk/overview/sla.md @@ -0,0 +1,233 @@ +--- +substitutions: + SLA: '{abbr}`SLA (Service Level Agreements)`' + SLAs: '{abbr}`SLAs (Service Level Agreements)`' +--- + +# Service level agreements (SLA) + +A *service level agreement* (SLA) defines the level of support a customer can expect from a service +provider. {{ SLAs }} provide a timeline that tells customers when they can expect results and keeps the +support team on target. + +:::{note} +The *SLA Policies* feature is enabled by default on newly created **Helpdesk** teams. + +To turn off the feature, or edit the working hours, navigate to {menuselection}`Helpdesk app --> +Configuration --> Helpdesk Teams`. Click on a team to open that team's configuration page. + +From here, scroll to the {guilabel}`Performance` section. To turn off the {{ SLAs }} feature for the +team, clear the {guilabel}`SLA Policies` checkbox. + +```{image} sla/sla-enable.png +:alt: View of a team page in Helpdesk focusing on the SLA Policies setting. +``` +::: + +## Create a new SLA policy + +To create a new policy, go to {menuselection}`Helpdesk app --> Configuration --> SLA Policies`, and +click {guilabel}`New`. + +Alternatively, go to {menuselection}`Helpdesk app --> Configuration --> Helpdesk Teams`, and click +on a team. Then, click the {guilabel}`SLA Policies` smart button at the top of the team's settings +page, and click {guilabel}`New`. + +On the blank {{ SLA }} policy form, enter a {guilabel}`Title` and a {guilabel}`Description` for the new +policy, and proceed to fill out the form using the steps below. + +### Define the criteria for an SLA policy + +The {guilabel}`Criteria` section is used to identify which tickets this policy is applied to. + +Fill out the following fields to adjust the selection criteria: + +:::{note} +Unless otherwise indicated, multiple selections can be made for each field. +::: + +- {guilabel}`Helpdesk Team`: A policy can only be applied to one team. *This field is required.* +- {guilabel}`Priority`: The priority level for a ticket is identified by selecting one, two, or + three of the {icon}`fa-star-o` {guilabel}`(star)` icons, representing the priority level on the + Kanban card or on the ticket itself. The {{ SLA }} is **only** applied after the priority level has + been updated on the ticket to match the {{ SLA }} criteria. If no selection is made in this field, + this policy only applies to tickets marked as `Low Priority`, meaning those with zero + {icon}`fa-star-o` {guilabel}`(star)` icons. +- {guilabel}`Tags`: Tags are used to indicate what the ticket is about. Multiple tags can be applied + to a single ticket. +- {guilabel}`Customers`: Individual contacts or companies may be selected in this field. +- {guilabel}`Services`: This field is available only if a team has the **Timesheets** app enabled. + This allows the ticket to link directly to a specific line on a sales order, which must be + indicated on the ticket in the {guilabel}`Sales Order Items` field. + +```{eval-rst} +.. example:: + A support team needs to address urgent issues for VIP customers within one business day. + + The new policy, titled `8 Hours to close`, is assigned to the `VIP Support` team. It **only** + applies to tickets that are assigned three :icon:`fa-star-o` :guilabel:`(star)` icons, which + equates to an `Urgent` priority level. + + At the same time, the tickets can be related to multiple issues, so the policy applies to tickets + with `Repair`, `Service`, or `Emergency` tags. + + .. image:: sla/sla-create-new.png + :alt: View of a new SLA policy record with all the relevant information entered. +``` + +### Establish a target for an SLA policy + +A *target* is the stage a ticket needs to reach, and the time allotted to reach that stage, in order +to satisfy the {{ SLA }} policy. Any stage assigned to a team may be selected for the {guilabel}`Reach +Stage` field. + +Time spent in stages selected in the {guilabel}`Excluding Stages` field are **not** included in the +calculation of the {{ SLA }} deadline. + +```{eval-rst} +.. example:: + An |SLA| titled `8 Hours to Close` tracks the working time before + a ticket is completed, and would have `Solved` as the :guilabel:`Reach Stage`. Simultaneously, an + |SLA| titled `2 Days to Start` tracks the working time before + work on a ticket has begun, and would have `In Progress` as the :guilabel:`Reach Stage`. +``` + +## Meet SLA deadlines + +As soon as it is determined that a ticket fits the criteria of an {{ SLA }} policy, a deadline is +calculated. The deadline is based on the creation date of the ticket, as well as the targeted +working hours. + +:::{note} +The value indicated next to the {guilabel}`Working Hours` field of an {{ SLA }} policy is used to +determine the deadline. By default, this is determined by the value set in the {guilabel}`Company +Working Hours` field under {menuselection}`Settings app --> Employees --> Work Organization`. +::: + +The deadline is then added to the ticket, as well as a tag indicating the name of the {{ SLAs }} +applied. + +```{image} sla/sla-open-deadline.png +:alt: View of a ticket's form emphasizing an open SLA deadline on a ticket in Odoo +: Helpdesk. +``` + +When a ticket satisfies an {{ SLA }} policy, the {{ SLA }} tag turns green, and the deadline disappears +from view on the ticket. + +```{image} sla/sla-deadline.png +:alt: View of a ticket's form emphasizing a satisfied SLA in Odoo Helpdesk. +``` + +:::{important} +If a ticket fits the criteria for more than one {{ SLA }}, the earliest occurring deadline is +displayed on the ticket. After that deadline has passed, the next deadline is displayed. +::: + +If the {{ SLA }} deadline passes and the ticket has not moved to the {guilabel}`Reach Stage`, the {{ SLA }} +tag turns red. After the {{ SLA }} has failed, the red tag stays on the ticket, even after the ticket is +moved to the {guilabel}`Reach Stage`. + +```{image} sla/sla-passing-failing.png +:alt: View of a ticket's form with a failing and passing SLA in Odoo Helpdesk. +``` + +(helpdesk-analyze-sla-performance)= + +## Analyze SLA performance + +The {guilabel}`SLA Status Analysis` report tracks how quickly an {{ SLA }} is fulfilled, as well as the +performance of individual team members. Navigate to the report, and corresponding pivot table, by +going to {menuselection}`Helpdesk app --> Reporting --> SLA Status Analysis`. + +### Pivot view + +By default, the report displays in a {guilabel}`Pivot` view. Any {{ SLA }} policies in the database with +tickets that failed to fulfill a policy, are in progress, or have satisfied a policy are listed. By +default, they are grouped by team and ticket count. + +:::{figure} sla/sla-status-analysis.png +:alt: View of the SLA status analysis report in Odoo Helpdesk. + +The pivot view aggregates data, which can be manipulated by adding measures and filters. +::: + +To change the display, or add additional measurements, click the {guilabel}`Measures` button to +reveal a drop-down menu of reporting criteria, and choose from the options available. + +Whenever a measurement is picked, a {icon}`fa-check` {guilabel}`(check)` icon appears in the +drop-down menu to indicate that the measurement is included, and a corresponding new column emerges +in the pivot table to show the relevant calculations. + +```{image} sla/sla-pivot-measures.png +:alt: View of the available measures in the SLA status analysis report. +``` + +To add a group to a row or column, click the {icon}`fa-plus-square` {guilabel}`(plus)` icon next to +the policy name and then select one of the groups. To remove one, click the +{icon}`fa-minus-square-o` {guilabel}`(minus)` icon next to the policy name. + +```{image} sla/sla-pivot-groups.png +:alt: View of the available group by options in the SLA status analysis report. +``` + +### Graph view + +Switch to the graph view by selecting the {icon}`fa-area-chart` {guilabel}`(graph view)` icon at the +top of the screen. To switch between the different charts, select the *related icon* at the top of +the chart, while in graph view. + +```{eval-rst} +.. tabs:: + + .. tab:: Bar Chart + + .. figure:: sla/sla-report-bar.png + :alt: View of the SLA status analysis report in bar view. + + A bar chart can deal with larger data sets and compare data across several categories. + + .. tab:: Line Chart + + .. figure:: sla/sla-report-line.png + :alt: View of the SLA status analysis report in line view. + + A line chart can visualize data trends or changes over time. + + .. tab:: Pie Chart + + .. figure:: sla/sla-report-pie.png + :alt: View of the SLA status analysis report in pie chart view. + + A pie chart compares data among a small number of categories. +``` + +:::{tip} +Both the *bar chart* and *line chart* can utilize the *stacked* view option. This presents two +or more groups of data on top of each other, instead of next to each other, making it easier to +compare data. While viewing either a bar chart or line chart, click the {icon}`fa-database` +{guilabel}`(stacked)` icon to toggle the stacked view option on or off. + +```{image} sla/sla-report-stacked.png +:alt: View of the SLA status analysis report in bar view, stacked. +``` +::: + +### Cohort view + +The *cohort* view is used to track the changes in data over a period of time. To display the +{guilabel}`SLA Status Analysis` report in a cohort view, click the {icon}`oi-view-cohort` +{guilabel}`(cohort)` icon, next to the other view options. + +:::{figure} sla/sla-report-cohort.png +:alt: View of the SLA status analysis report in cohort view. + +The cohort view examines the life cycle of data over time. +::: + +:::{seealso} +- {ref}`Reporting views ` +- {doc}`Allow customers to close their tickets + ` +::: + diff --git a/content/applications/services/helpdesk/overview/stages.md b/content/applications/services/helpdesk/overview/stages.md new file mode 100644 index 000000000..ba1e69a86 --- /dev/null +++ b/content/applications/services/helpdesk/overview/stages.md @@ -0,0 +1,116 @@ +# Stages + +*Stages* are used to organize the **Helpdesk** pipeline and track the progress of tickets. Stages +are customizable, and can be renamed to fit the needs of each team. + +## Create or modify stages + +:::{important} +{ref}`Developer mode ` **must** be activated to access the stages menu. To +activate developer mode, go to {menuselection}`Settings app --> General Settings --> Developer +Tools`, and click {guilabel}`Activate the developer mode`. +::: + +To view or modify **Helpdesk** stages, go to {menuselection}`Helpdesk app --> Configuration --> +Stages`. + +The default list view on the {guilabel}`Stages` page displays the stages currently available in the +**Helpdesk** app. They are listed in the order they appear in the pipeline. + +To change the order of the stages, click the {icon}`oi-draggable` {guilabel}`(draggable)` icon, to +the left of the stage name, and drag it to the desired place on the list. + +```{image} stages/stages-list-buttons.png +:alt: |- +: View of the stage list page emphasizing the buttons used to change the order the stages +: appear in the list. +``` + +:::{tip} +Change the stage order on the Kanban view of a **Helpdesk** team's pipeline by dragging and +dropping individual columns. +::: + +To create a new stage, click the {guilabel}`New` button at the top-left of the stage list. Doing so +reveals a blank stage form. + +Choose a {guilabel}`Name` for the new stage. + +```{image} stages/new-stage-details.png +:alt: View of a stage's settings page in Odoo Helpdesk. +``` + +## Add email and SMS templates to stages + +When an {guilabel}`Email Template` is added to a stage, a preconfigured email is automatically sent +to the customer when a ticket reaches that specific stage in the pipeline. Likewise, adding an +{guilabel}`SMS Template` triggers a preconfigured SMS text message to send to the customer. + +:::{important} +SMS text messaging is an {doc}`In-App Purchase (IAP) ` +service that requires prepaid credits to work. Refer to [SMS Pricing FAQ](https://iap-services.odoo.com/iap/sms/pricing) for additional information. +::: + +To select an existing email template, select it from the {guilabel}`Email Template` field. After +choosing a template, click on the {icon}`oi-arrow-right` {guilabel}`(right arrow)` icon to the right +of the field to edit the chosen template. + +To create a new template from this form, click the field, and enter a title for the new template. +Then, select {guilabel}`Create and edit` from the drop-down menu that appears, and complete the form +details. + +Follow the same steps to select, edit, or create an {guilabel}`SMS Template`. + +```{image} stages/sms-template.png +:alt: View of an SMS template setup page in Odoo Helpdesk. +``` + +:::{seealso} +{doc}`/applications/general/companies/email_template` +::: + +## Fold a stage + +By default, stages are unfolded in the Kanban view of either tickets dashboard: {guilabel}`My +Tickets` ({menuselection}`Helpdesk app --> Tickets --> My Tickets`) or {guilabel}`All Tickets` +({menuselection}`Helpdesk app --> Tickets --> All Tickets`). + +Tickets in an unfolded stage are visible in the pipeline under the stage name, and are considered +*open*. + +Stages can be configured to be folded in the Kanban view of a tickets page. + +The name of the folded stages are still visible, but the tickets in the stage are hidden from view. + +To fold a stage, tick the {guilabel}`Folded in Kanban` checkbox on the {guilabel}`Stages` form. + +:::{warning} +Tickets that reach a *folded* stage are considered *closed*. Closing a ticket before the work is +completed can result in reporting and communication issues. This setting should **only** be +enabled for stages that are considered *closing* stages. +::: + +### Temporarily fold a stage + +Stages can be temporarily folded in the Kanban view of the tickets pipeline, as well. + +View a specific team's pipeline by navigating to {menuselection}`Helpdesk app`, and clicking the +team's Kanban card. + +Hover the cursor at the top of the desired stage to fold temporarily, then click the {icon}`fa-gear` +{guilabel}`(gear)` icon that appears, and select {guilabel}`Fold` from the drop-down menu. + +```{image} stages/fold-stage-kanban.png +:alt: Kanban view of a Helpdesk stage, with the temporary fold option emphasized. +``` + +:::{important} +Manually folding a stage from the Kanban view is temporary and does **not** close the tickets in +the stage. +::: + +## Assign stages to a team + +Make a selection in the {guilabel}`Helpdesk Teams` field on the {guilabel}`Stages` form. More than +one team may be selected, since the same stage can be assigned to multiple teams. + diff --git a/content/applications/services/planning.md b/content/applications/services/planning.md new file mode 100644 index 000000000..e8cc32b1a --- /dev/null +++ b/content/applications/services/planning.md @@ -0,0 +1,340 @@ +--- +show-content: true +--- + +# Planning + +**Odoo Planning** allows you to plan your team's schedule and manage shifts and resources. + +Handling your team's planning comes with specific requirements that may vary widely depending on +your business needs. The following concepts were introduced in Odoo Planning to meet those needs: + +**Shifts** are dispatched to **resources**, which can be either {ref}`human ` +(employees) or {ref}`material ` (e.g., equipment). The resources are assigned +{ref}`roles `, which allows for organization of work within the team. + +Once the initial configuration is done, {ref}`planning shifts ` can be done +manually or automated by using the {ref}`Auto Plan ` feature. + +An integration between the Planning and Sales apps allows the linking of sold services to roles and +shifts in Planning. Additionally, integration with {doc}`Project ` allows dedicating +shifts, and thus time and resources, to specific projects. + +:::{seealso} +[Odoo tutorials: Planning](https://www.odoo.com/slides/planning-60) +::: + +(planning-configuration)= + +## Configuration + +(planning-roles)= + +### Roles + +To define the roles your resources perform (e.g., chef, bartender, waiter), go to +{menuselection}`Planning --> Configuration --> Roles`, then click {guilabel}`New`, and fill in the +{guilabel}`Name` (e.g., assistant, receptionist, manager). Then, choose the {guilabel}`Resources` +that will perform this role. Resources can be either {ref}`Employees ` or +{ref}`Materials `. + +:::{note} +- If the Sales app is installed in your database, the {guilabel}`Services` field appears, + allowing you to specify which roles are needed to perform services so that the shifts are + dispatched to the right person. +- Roles are taken into account when using the {ref}`Auto Plan feature `. +::: + +#### Property fields and roles + +**Property fields** allow you to add custom fields to forms across several Odoo applications. +Planning includes the possibility of adding property fields linked to roles to shifts. + +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. + +```{image} planning/add-properties.png +:alt: Creating a new property field in Planning. +``` + +The property field is linked to the role and is included in the shift form of all shifts performed +by this role. + +```{eval-rst} +.. example:: + Some of the use cases of role property fields include: + + - **Accreditation**: for roles that require a specific permit (e.g., driving license) + - **Location**: in companies that operate in multiple locations (e.g., shops or restaurants) + - **Language**: in a multi-lingual environment (e.g., consulting company) +``` + +(planning-employees)= + +### Employees + +All employees can be included in the planning and assigned shifts. + +To adapt the employee's planning settings, go to {menuselection}`Planning --> Configuration --> +Employees`, and choose the employee for whom you want to edit the settings. Then, go to the +{guilabel}`Work Information` tab. + +```{image} planning/employee-tab.png +:alt: Employee profile and the work information tab. +``` + +:::{tip} +You can do the same from the **Employees** app, which is installed by default along with +Planning. +::: + +Two sections of the employee's {guilabel}`Work Information` tab have an impact on Planning: +{guilabel}`Schedule` (namely, the {guilabel}`Working Hours` field) and {guilabel}`Planning`. + +#### Working hours + +The {guilabel}`Working Hours` are taken into account when the {guilabel}`Allocated Time` and its +percentage is calculated for {ref}`shifts `. If the {guilabel}`Working Hours` +field is left blank, the employee is considered to be working flexible hours. + +To create individual {guilabel}`Working Hours`, for example, for employees working part-time, click +{guilabel}`Search more...`, then {guilabel}`New`. + +:::{note} +The {guilabel}`Working Hours` and the {guilabel}`Allocated Time` in Planning can impact +**Payroll**, if the employee's contract is configured to generate work entries based on shifts. +::: + +:::{seealso} +{ref}`Payroll documentation on working schedules ` +::: + +#### Planning roles + +Once an employee has one or more {guilabel}`Roles`: + +- When creating a shift for this employee, only the shift templates from the roles chosen in this + field are displayed. +- When a schedule is published, the employee is only notified of open shifts for the roles that are + assigned to them. +- When auto-assigning open shifts or planning sales orders, the employee is only assigned shifts for + the roles assigned to them. + +Additionally, when a {guilabel}`Default role` is defined: + +- When creating a shift for the employee, the default role is automatically selected. +- This role also has precedence over the other roles of the employee when auto-assigning open shifts + or planning sales orders. + +:::{note} +If the Planning roles fields are left empty, there are no restrictions in the shift templates and +open shifts shared with the employee. However, it’s not possible to use the **Auto Plan** feature +for employee with no roles. +::: + +(planning-materials)= + +### Materials + +**Materials** are resources that can be assigned shifts and working hours but are not employees. +For example, a construction company could use materials to create shifts for shared machines +(e.g., cranes, forklifts). + +Similarly to employees, materials can be assigned roles and working time. + +(planning-templates)= + +### Shift templates + +To create a shift template, click {guilabel}`New` on any schedule, then fill in the +{ref}`details of the shift `. In order for the shift to be saved as a +template, tick {guilabel}`Save as Template`. + +```{image} planning/save-template.png +:alt: Shift form with the option `save template` ticked. +``` + +Alternatively, you can go to {menuselection}`Planning --> Configuration --> Shift Templates`, then +click {guilabel}`New`. Fill in the {guilabel}`Start Hour` and {guilabel}`Shift Duration`. The +shift’s {guilabel}`End Time` is then calculated based on the {guilabel}`Working Hours`, taking into +account working time as well as breaks. + +```{eval-rst} +.. example:: + The employee's working hours are Monday to Friday, 8 am to 5 pm, with a break between 12 and 1 + pm. + + - Creating a shift template with a start hour of 9 am and a duration of 8 hours will result in + the end hour being 5 pm, based on the working hours and the 1-hour break. + - Creating a shift template with a start hour of 10 am and a duration of 10 hours will result in + the end hour of 10 am the following day, as the company is closed at 5 pm according to the + working hours. +``` + +Additionally, for each shift template, you can also configure: + +- {guilabel}`Role`: to link the shift to this specific role. +- {guilabel}`Project`: to keep track of shifts that are dedicated to work on a project. + +(planning-shifts)= + +## Planning shifts + +On opening the Planning app, the users see their own schedule. Users with admin roles can also see +{guilabel}`Schedule by Resource`, {guilabel}`Role`, {guilabel}`Project`, or {guilabel}`Sales Order`, +as well as reporting and configuration menus. + +:::{note} +The schedule is displayed in the Gantt view, which allows you to edit (with a drag and drop), +resize, split, and duplicate shifts without having to open them. +::: + +```{image} planning/schedule.png +:alt: A schedule displaying various visual elements. +``` + +The following visual elements are used on the shifts in the schedules: + +- **Full color**: shifts that are planned and published. +- **Diagonal stripes**: shifts that are planned but have yet to be published. +- **Grayed-out background**: employees that are on time off. +- **Progress bar**: currently ongoing shifts with timesheets linked to them. +- **Grayed-out shift**: when copying shifts, the copied shifts are shown in full color, whereas + previously existing shifts are temporarily greyed out. The color changes back to full color or + diagonal stripes on the next refresh of the page or by removing the filter. + +(planning-create-shift)= + +### Create a shift + +To create a shift, go to any schedule, then click {guilabel}`New`. In the pop-up window that opens, +fill in the following details: + +- **Templates**: If there is one or more templates existing in your database, they are + displayed in the upper section of the pop-up window. Once selected, a template prefills the + shift form accordingly. + +- {guilabel}`Resource`: Resources can be both employees or materials. If this field is left empty, + the shift is considered an {ref}`open shift `. + +- {guilabel}`Role`: Select the role that the resource assigned will be performing. This field is + used when {ref}`auto-planning ` shifts. Once you select a role, the shift + templates associated with it are displayed in the upper section of the pop-up window. + +- {guilabel}`Project`: If the Project app is installed in your database, this field allows you to + link the project to the shift is available, allowing you to plan and track shifts dedicated to + work on the selected project. + +- {guilabel}`Sales Order Item`: If the Sales app is installed in your database, this field allows + you to link a sales order to the shift. + +- {guilabel}`Repeat`: Tick the checkbox and configure the {guilabel}`Repeat Every` field according + to your needs. The following rules apply to recurring shifts: + + - All fields (e.g., {guilabel}`Resource`, {guilabel}`Role`, {guilabel}`Project`) are copied from + the original shift except for the date, which is adjusted according to the + {guilabel}`Repeat Every` field. + - Recurrences are planned but not published. + - By default, planned shifts are created six months in advance, after which they are created + gradually. To change the time frame, {ref}`activate the Developer mode `, then + go to {menuselection}`Planning --> Configuration --> Settings` and edit the + {guilabel}`Recurring Shifts`. + +- {guilabel}`Save as Template`: When this option is ticked, a shift template is created with the + same {guilabel}`Start and End hours`, {guilabel}`Allocated time`, {guilabel}`Role`, + and {guilabel}`Project`. + +- {guilabel}`Additional note sent to the employee`: Click on the field to add a note. + +- {guilabel}`Date`: Choose the date and time of your shift. This is the only mandatory field when + creating a shift. + +- {guilabel}`Allocated time`: Is calculated based on the date and the employee’s {guilabel}`Working + Schedule`. See more in {ref}`Shift Templates `. + +Click {guilabel}`Publish & Save` to confirm the shift and send the assigned employee their schedule +by email. + +:::{note} +The draft is visible on the admin planning view and can be identified by diagonal lines. The +employee is only notified of the shift once it's published. + +Two kinds of notifications are sent to the employees depending on their account configuration: + +- Employees without user accounts are redirected to a dedicated **Planning portal**. +- Employees with a user account are redirected to the {guilabel}`My Planning` view in the + backend view of Odoo. +::: + +(planning-open-shifts)= + +### Open shifts and auto planning + +The {guilabel}`Auto Plan` button allows you to assign **Open shifts** (shifts with no resource +assigned) and create and assign shifts linked to sales orders or project. + +The following features have an impact on auto planning: + +- **Roles**: Open shifts are only assigned to resources (employees or materials) that have the + corresponding role assigned. It is not possible to use the {guilabel}`Auto Plan` feature for + employee with no roles. +- **Default roles**: The default role assigned to a resource is given priority over the other roles + they have assigned to them. +- **Conflicts**: Employees or materials cannot be assigned multiple shifts at the same time. +- **Time off**: The employees’ time off is taken into account, as well as public holidays. +- **Company working hours**: Are taken into account when assigning shifts to employees or materials. +- **Contracts**: Employees without an active contract cannot be assigned shifts. + +Click {guilabel}`Publish` to confirm the schedule and notify the employees of their planning. + +(planning-switching-unassignment)= + +### Switching shifts and unassignment + +Two features are available to allow employees to make changes to their schedule: +**switching shifts** and **unassignment**. + +:::{note} +These features are mutually exclusive. Switching shifts is possible by default and cannot be +disabled. However, once the **Allow unassignment** feature is enabled, it replaces the option to +switch shifts. +::: + +#### Switching shifts + +Once shifts are planned and published, employees receive an email notification. If an employee +wishes to switch a shift, they can click the unwanted shift and click {guilabel}`Ask to switch`. + +The shift remains assigned to the original employee, but in the schedule, a notification +informing that the assigned employee would like to switch shifts is visible on the shift. + +The shift is then displayed to other employees who share the same role, and if they wish to assign +it to themselves, they can click the {guilabel}`I take it` button. + +:::{note} +The following rules apply: + +- Only the shifts matching the employee's roles are displayed as available to them. +- Switching shifts is only available for shifts that are in the future. +::: + +#### Unassignment + +To allow employees to unassign themselves from shifts, go to +{menuselection}`Planning --> Configuration --> Settings`, then tick the checkbox +{guilabel}`Allow Unassignment`. Then, specify the maximum number of days that the employees can +unassign themselves before the shift. + +Once shifts are planned and published, employees receive an email notification. If shift +unassignment is allowed, the employees can click the {guilabel}`I am unavailable` button, and the +shift reverts to an open shift. + +:::{note} +The following rules apply: + +- Only the shifts matching the employee's roles are displayed in their schedule. +- Switching shifts is only available for shifts that are in the future. +::: + diff --git a/content/applications/services/project.md b/content/applications/services/project.md new file mode 100644 index 000000000..47f42c52f --- /dev/null +++ b/content/applications/services/project.md @@ -0,0 +1,24 @@ +--- +hide-page-toc: true +nosearch: true +show-content: true +show-toc: true +--- + +# Project + +Odoo Project is a tool to manage your ongoing projects. Schedule tasks, assign activities to +coworkers, and keep track of each project's profitability. + +:::{seealso} +[Odoo Tutorials: Project and Timesheets](https://www.odoo.com/slides/project-and-timesheets-21) +::: + +```{toctree} +:titlesonly: true + +project/project_management +project/project_dashboard +project/tasks +``` + diff --git a/content/applications/services/project/project_dashboard.md b/content/applications/services/project/project_dashboard.md new file mode 100644 index 000000000..198918b69 --- /dev/null +++ b/content/applications/services/project/project_dashboard.md @@ -0,0 +1,118 @@ +# Project dashboard + +The project dashboard allows you to get a comprehensive overview of your project's status. It +displays information such as the total number of tasks, timesheets, and planned hours linked to the +project, as well as detailed information about project milestones and its costs and revenues. Within +the project dashboard, you can create {guilabel}`Project updates`, which allow you to take a +snapshot of the project's status at a certain point in time. As such, it is a crucial tool for +effective project management and ensuring that your project stays on track. + +## Using the project dashboard + +To access the project dashboard, open the **Project** app and hover over the desired project’s +card. Then, click the {icon}`fa-vertical-ellipsis` ({guilabel}`vertical ellipsis`) icon and +select {guilabel}`Dashboard`. Alternatively, you can access the project dashboard from the project’s +{ref}`top bar `. + +The left side of the dashboard displays a list of existing {ref}`project updates `, +and the right side provides {ref}`detailed information about records linked to the project +`, as well as {ref}`milestones `, +{ref}`profitability `, and {ref}`budgets +`. + +:::{note} +The information displayed on the project dashboard varies depending on the applications installed +on your database. For example, you will not see information about **Timesheets**, **Planning**, +or **Purchase Orders** if the corresponding applications are not installed. +::: + +(project-project-dashboard-smart-buttons)= + +### Totals smart buttons + +The following smart buttons are displayed on the top right of the project dashboard: + +> - {guilabel}`Tasks`: the number of completed (i.e., {guilabel}`Done` or {guilabel}`Canceled` +> {ref}`tasks `) and all tasks, in format +> completed/all, as well as the entire project's completion percentage estimation. +> - {guilabel}`Timesheets`: the number of hours or days (depending on the **Timesheets** app +> configuration) allocated in the project’s **settings**. This includes all +> {doc}`timesheets <../timesheets>`, whether or not they have been validated. +> - {guilabel}`Planned`: the number of hours that have been planned for shifts in the **Planning** +> app. This includes all {doc}`planned shifts <../planning>`, including past shifts and shifts that +> have not yet been published. +> - {guilabel}`Documents`: number of {doc}`documents <../../productivity/documents>` in the +> project’s workspace. +> - {guilabel}`Burndown Chart`: click the smart button to access a {doc}`report ` +> on the status of the project’s tasks over time. +> - {guilabel}`Timesheets and Planning`: click the smart button to access a {doc}`report ` +> on the project’s timesheets and shifts. This allows you to easily compare planned and effective +> hours of work on the project. +> - **Additional fields**, such as {guilabel}`Sales Orders`, {guilabel}`Sales Order Items`, +> {guilabel}`Purchase Orders`, and more, represent the number of records linked to the project. + +:::{tip} +Use the project dashboard smart buttons to update the project records easily. Click +{guilabel}`Timesheets` to validate timesheets, {guilabel}`Planned` to create project planning, +{guilabel}`Documents` to view and validate documents, etc. +::: + +(project-project-dashboard-milestones)= + +### Milestones + +This section is only visible if {doc}`milestones ` +have been enabled in the Project’s app settings. Click {guilabel}`Add Milestone` to create a new +milestone. Click a milestone in the checklist to edit it, enable its checkbox to mark it as +completed, or click the {icon}`fa-trash` ({guilabel}`trash`) icon to remove it. + +The milestones are displayed in red if they’re past their deadline, or in green if they are ready to +be marked as reached (i.e. tasks linked to the milestone that have been marked with {guilabel}`done` +or {guilabel}`canceled` {ref}`status `). + +(project-project-dashboard-profitability)= + +### Profitability + +This section provides a breakdown of project costs and revenues, which are impacted by all records +linked to the project and its {doc}`Analytic account `. + +:::{note} +The profitability report is only displayed for billable projects. +::: + +(project-project-dashboard-budgets)= + +### Budgets + +If a budget has been set for the project, its status and related details are displayed in this +section. Click {guilabel}`Add Budget` to create a new budget for the project. + +:::{note} +{doc}`Budgets ` must be enabled in your +database’s **Accounting** application in order for this section to be displayed. +::: + +(project-project-dashboard-updates)= + +## Project updates + +Project updates allow you to take a snapshot of the project’s overall status at a given point in +time, for example, during a periodic (weekly, bi-weekly, or monthly) review. This allows you to +compare specific data points, note any aspects of the project that need improvement, and estimate +if the project is on or off track. + +To create a new project update, go to the project dashboard, click {guilabel}`New`, and fill in the +following fields: + +> - {guilabel}`Status`: Choose between {guilabel}`On Track`, {guilabel}`At Risk`, {guilabel}`Off +> Track`, {guilabel}`On Hold`, and {guilabel}`Done`. Once the status is set, a color-coded dot is +> displayed on the project’s Kanban card, allowing the project manager to easily identify which +> projects need attention. +> - {guilabel}`Progress`: Manually input the completion percentage based on the project's progress. +> - {guilabel}`Date` and {guilabel}`Author`: These fields are automatically filled in with +> appropriate information based on the user who created the update and the current date. +> - {guilabel}`Description`: Use this rich-text field to gather notes. Depending on the project +> configuration (e.g., if the project is billable), this field may be pre-filled with current +> information on aspects such as profitability, budget, milestones, etc. + diff --git a/content/applications/services/project/project_management.md b/content/applications/services/project/project_management.md new file mode 100644 index 000000000..a57cb3c65 --- /dev/null +++ b/content/applications/services/project/project_management.md @@ -0,0 +1,112 @@ +# Project management + +Odoo Project uses the **Kanban** project management system. This means all projects are broken down +into tasks, which are categorized on a whiteboard according to what production phase they are in. + +:::{admonition} Did you know? +The word **Kanban** comes from Japanese and refers to the "visual board" management method. +::: + +:::{seealso} +[Odoo Tutorials: Kanban Project Management](https://www.odoo.com/slides/slide/kanban-project-management-1664) +::: + +(project-management-configuration)= + +## Configuration + +Open the **Project** app and click {guilabel}`Create` to start a new project. Enter a +{guilabel}`Name` for your project and click {guilabel}`Create Project`. + +You can customize your existing **projects** from the dashboard by clicking the drop-down toggle +button ({guilabel}`⋮`) on your project's **card**. + +```{image} project_management/project-settings.png +:align: center +:alt: Project card +``` + +This enables a new menu divided into four parts: + +- {guilabel}`View`: see an overview of your project's components, such as its {guilabel}`Tasks`, + {guilabel}`Milestones` and {guilabel}`Project Updates`. Depending on which apps you have + activated, more options may be available, such as {guilabel}`Documents`. All uploaded files can be + found under this menu, as well as in the **Documents** app, under {guilabel}`Projects`; + +- {guilabel}`Reporting`: analyze your project's progress and profitability through graphics and + statistics; + +- **Color**: make a line of color appear on the left side of the card so that your project is more + recognizable; + +- {guilabel}`Settings`: you can change the following: + + - the {guilabel}`Name` of the project; + - the {guilabel}`Name of the tasks` found under that project; + - the {guilabel}`Customer` for whom the project is intended; + - the {guilabel}`Tags` used for filtering; + - the {guilabel}`Company` responsible for the project; + - the employee designated as {guilabel}`Project Manager`; + - the {guilabel}`Planned Date` of the project; + - the total {guilabel}`Allocated Hours` for that project. + +Additionally, you can mark the project as {guilabel}`Favorite`, allowing you to find it using the +{guilabel}`My Favorites` filter on the Kanban view; + +```{image} project_management/project-settings-opened.png +:align: center +:alt: Project settings +``` + +:::{seealso} +[Odoo Tutorials: Customize projects](https://www.odoo.com/slides/slide/customize-projects-3615?fullscreen=1) +::: + +Further settings are available under the {guilabel}`Settings` tab. Most of them are *only* available +depending on the activated apps. + +## Scheduling activities + +You can schedule **activities** (ex. {guilabel}`Call`, {guilabel}`Meeting`, etc.) per project by +clicking on the **clock** icon on a project. Doing so opens a list with already scheduled activities +and allows planning **new** activities by clicking {guilabel}`+ Schedule an activity`. On the pop-up +window, select the {guilabel}`Activity Type`, enter a {guilabel}`Summary` for that activity, a +{guilabel}`Due Date`, and assign it to an employee. According to the {guilabel}`Activity Type`, you +may have **additional options** available. + +:::{note} +If an activity is **already** scheduled, the icon may change to a **phone**, **group of people**, +or other. +::: + +(project-project-management-top-bar)= + +## Top bar + +In project management, reviewing the various records and documents related to a project is often +necessary. Odoo Project’s **top bar** provides quick access to these essential resources. You can +customize each project's top bar to match its specific needs. + +To set up the top bar for a project, go to the {guilabel}`Project` app, click the project's card, +then click the top bar {icon}`fa-sliders` {guilabel}`(sliders)` button. In the bar that appears +above the search bar, click the {icon}`fa-sliders` {guilabel}`(sliders)` button to select the records +you want to display, such as timesheets, sales orders, invoices, documents, dashboards, etc. + +You can then click the buttons to access the related records without leaving the Project app. To +return to your project tasks' Kanban view, click the {guilabel}`Tasks` button in the top bar. + +```{image} project_management/top-bar.png +:alt: Top bar selection menu +``` + +### Custom top bar buttons + +You can also create your own buttons to access more specific views: + +1. Click an existing top bar button to access the view. +2. Customize the view with keywords, filters, and grouping options using the search bar. +3. Click the {icon}`fa-sliders` {guilabel}`(sliders)` button in the top bar and select + {guilabel}`Save View`. +4. Edit the default button name if necessary, then enable {guilabel}`Shared` if you want to share + the button with other users. + diff --git a/content/applications/services/project/tasks.md b/content/applications/services/project/tasks.md new file mode 100644 index 000000000..ff0106edc --- /dev/null +++ b/content/applications/services/project/tasks.md @@ -0,0 +1,16 @@ +--- +nosearch: true +--- + +# Task management + +```{toctree} +:titlesonly: true + +tasks/task_stages_statuses +tasks/task_creation +tasks/recurring_tasks +tasks/sub-tasks +tasks/task_dependencies +``` + diff --git a/content/applications/services/project/tasks/recurring_tasks.md b/content/applications/services/project/tasks/recurring_tasks.md new file mode 100644 index 000000000..a66937442 --- /dev/null +++ b/content/applications/services/project/tasks/recurring_tasks.md @@ -0,0 +1,46 @@ +# Recurring tasks + +When handling a project, the same task often needs to be performed several times: for example, +weekly meetings or status reports. The **recurring tasks** feature allows you to automate the +creation of those tasks. + +:::{seealso} +[Odoo Tutorials: Recurring tasks](https://www.odoo.com/slides/slide/recurring-tasks-1946) +::: + +## Configuration + +To enable recurring tasks, go to {menuselection}`Project --> Configuration --> Settings`, then +activate {guilabel}`Recurring Tasks`, and press {guilabel}`Save`. + +### Set up task recurrence + +In an existing task, click the {icon}`fa-repeat` ({guilabel}`Recurrent`) button next to the +{guilabel}`Deadline` field. Then, configure the {guilabel}`Repeat Every` field according to your +needs. + +A new task in recurrence will be created once the status of the previous task is set to +{guilabel}`Done` or {guilabel}`Canceled`. + +The new task is created on the project dashboard with the following configuration: + +- {guilabel}`Stage`: is set to the first stage of the project dashboard ({guilabel}`New` or + equivalent); +- {guilabel}`Name`, {guilabel}`Description`, {guilabel}`Project`, {guilabel}`Assignees`, + {guilabel}`Customer`, {guilabel}`Tags`: are copied from the original task; +- {guilabel}`Deadline`: is updated based on the {guilabel}`Repeat Every` field (e.g., if the task is + set to repeat once a week, 7 days will be added to the deadline); +- {guilabel}`Milestones`, {guilabel}`Timesheets`, {guilabel}`Chatter`, + {guilabel}`Activities`, {guilabel}`Subtasks`: are **not** copied from the original task. + +Once a recurrence is configured, a **smart button** on the task displays the total number of +existing recurrences. + +### Edit or stop task recurrence + +**To edit** the recurrence, open the last task in recurrence. Any changes made on the task will be +applied to the tasks that will be created in the future. + +**To stop** the recurrence, open the last task in recurrence and press the {guilabel}`Recurrent` +button next to the {guilabel}`Planned date`. + diff --git a/content/applications/services/project/tasks/sub-tasks.md b/content/applications/services/project/tasks/sub-tasks.md new file mode 100644 index 000000000..f8b1490cc --- /dev/null +++ b/content/applications/services/project/tasks/sub-tasks.md @@ -0,0 +1,50 @@ +# Sub-tasks + +When handling project tasks, you can often benefit from splitting the workload into smaller +**sub-tasks**, making it easier to track progress and manage the work. + +Odoo’s sub-task feature is particularly useful in some of the following cases: + +- The task workload is too big to handle in one record. +- There’s a clear sequence of steps to follow. +- Some parts of the workload fall under the scope of different projects and/or assignees. + +The original task to which sub-tasks are linked is referred to as the **parent task**. The sub-tasks +of the parent task are known as **child tasks**. + +## Creating sub-tasks + +To create a sub-task: + +1. Open the Project app, then go into your desired project. +2. Click the task where you want to add the sub-task, then click the {guilabel}`Sub-tasks` tab. +3. Click {guilabel}`Add a line`, then fill in the {guilabel}`Title`. +4. Click the {icon}`fa-cloud-upload` ({guilabel}`save`) icon to save the task manually. + +:::{tip} +You can edit several fields of a sub-task directly from the parent task’s sub-task tab without +opening the individual sub-task. By default, those are: {guilabel}`Title`, {guilabel}`Priority`, +{guilabel}`Status`, and {guilabel}`Assignees`. Use the {icon}`fa-sliders` ({guilabel}`sliders`) +icon to add or remove fields. +::: + +Once the new sub-task is created, the following changes occur in the parent task: + +- A **smart button** displays the total number of sub-tasks, as well as the number of closed + (**done** or **canceled**) sub-tasks. Click the smart button to access the list of the sub-tasks. +- The {guilabel}`Allocated time` displays the amount of time allocated to the parent task, as well + as time allocated to the sub-tasks. This can be used to ensure that the time allocated to + sub-tasks does not exceed time allocated to the parent task. +- The {guilabel}`Timesheets` tab includes a breakdown of time spent on the parent task as well as + sub-tasks. + +Click {guilabel}`View` to open the sub-task you created. The sub-task form is identical to the +{ref}`task form `. + +:::{tip} +- A **smart button** allows to navigate back to the {guilabel}`Parent task`. +- The {guilabel}`Sub-tasks` tab allows for further creation of sub-tasks. +- Selecting a {guilabel}`Project` will trigger this sub-task to be displayed in the Kanban view of + the selected project. +::: + diff --git a/content/applications/services/project/tasks/task_creation.md b/content/applications/services/project/tasks/task_creation.md new file mode 100644 index 000000000..50d3bc18a --- /dev/null +++ b/content/applications/services/project/tasks/task_creation.md @@ -0,0 +1,126 @@ +# Task creation + +Tasks in Odoo Project can be created manually or automatically, including from emails or website +forms. + +## Manual task creation + +Open the Project app and choose the desired project. Create a new task by doing one of the +following: + +> - Clicking the {icon}`fa-plus` ({guilabel}`plus`) button in the upper left corner. This creates +> a new task in the first stage of your Kanban view. +> - Pressing the {icon}`fa-plus` ({guilabel}`plus`) button next to the Kanban stage name. This +> creates a new task in this Kanban stage. + +Fill in the {guilabel}`Task Title` and add one or more {guilabel}`Assignees`, then click +{guilabel}`Add`. + +(task-creation-task-configuration)= + +### Task configuration + +Click the task to open it. The task form includes the following fields that you can fill in: + +> - {guilabel}`Task Title`: title of the task. +> - {icon}`fa-star-o` ({guilabel}`Star`): click the {icon}`fa-star-o` ({guilabel}`star`) icon to mark +> the task as high priority. The icon will turn yellow. Click it again to remove the high priority. +> - {guilabel}`Project`: the project that this task belongs to. +> - {guilabel}`Assignees`: the person(s) in charge of handling the work on this task. +> - {guilabel}`Tags`: custom labels allowing to categorize and filter your tasks. +> - {guilabel}`Customer`: the person or company that will be billed for this task. This field only +> appears in tasks that belong to billable projects. +> - {guilabel}`Sales Order Item`: this can be either the sales order that was used to create this +> task, or a sales order that was linked to this task manually. This field only appears in tasks +> linked to billable projects. +> - {guilabel}`Allocated Time`: the amount of time that the work on this task is expected to last, +> tracked by timesheets. +> - {guilabel}`Deadline`: the expected end date of the task. Once this field is filled in, you can +> also add a start date to designate the entire time frame of the tasks' duration. + +:::{tip} +- You can also create new tasks by switching to the list or Gantt view and clicking + {guilabel}`New`. + +- The following fields can also be edited directly from the Kanban view without opening the + individual task: {icon}`fa-star-o` (**priority**), {guilabel}`Allocated hours`, + {guilabel}`Assignees`, and **task status**. You can also **color code** or {guilabel}`Set a + Cover image` to your task by clicking the {icon}`fa-ellipsis-v` (**vertical ellipsis**). + +- You can use the following keyboard shortcuts in the task title to configure new tasks (modify + the values in the examples below according to your needs): + + - **30h**: to allocate 30 hours to the task. + - **#tags**: to add tags to the task. + - **@user**: to assign the task to a user. + - **!**: to star the task as high priority. + + Along with using the correct format, follow this order: the task's name, followed by the + allocated time, the tags, the assignee, and then the priority. + + For example, if you want to create a task named "Prepare workshop", allocate 5h hours to it, + add the "School" tag, assign it to Audrey and set its priority to {guilabel}`High`, enter the + following task title: Prepare workshop 5h #school @Audrey ! + + ```{image} task_creation/task-shortcuts.png + :alt: Using keyboard shortcuts to create a task in Project. + ``` +::: + +(task-creation-email-alias)= + +## Creating tasks from an email alias + +This feature allows for project tasks to be automatically created once an email is delivered to a +designated email address. + +To configure it, open the Project app, then click the {icon}`fa-ellipsis-v` ({guilabel}`vertical +ellipsis`) icon next to the desired project's name. Select {guilabel}`Settings`, then open the +{guilabel}`Settings` tab. + +Fill in the {guilabel}`Create tasks by sending an email to` field as follows: + +> - **Section of the alias before the @ symbol**: type the name of the email alias, e.g. `contact`, +> `help`, `jobs`. +> - **Domain**: in most cases, this is filled in by default with your {doc}`domain +> <../../../general/email_communication>`. +> - **Accept Emails From**: refine the senders whose emails will create tasks in the project. + +```{image} task_creation/email-configuration.png +:alt: View of the email alias chosen on the dashboard view in Odoo Project +``` + +Once configured, the email alias can be seen under the name of your project on the Kanban dashboard. + +When an email is sent to the alias, the email is automatically converted into a project task. The +following rules apply: + +- The email sender is displayed in the {guilabel}`Customer` field. +- The email subject is displayed in the {guilabel}`Task Title` field. +- The email body is displayed in the {guilabel}`Description` field. +- The whole content of the email is additionally displayed in the **chatter**. +- All the recipients of the email (To/Cc/Bcc) that are Odoo users are automatically added as + **followers** of the task. + +## 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. + +1. Go to the website page where you wish to add the the form and + {ref}`add the Form building block `. + +2. 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. + +3. {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>` +::: + diff --git a/content/applications/services/project/tasks/task_dependencies.md b/content/applications/services/project/tasks/task_dependencies.md new file mode 100644 index 000000000..908dc512b --- /dev/null +++ b/content/applications/services/project/tasks/task_dependencies.md @@ -0,0 +1,42 @@ +# Task dependencies + +Odoo Project allows you to break down projects into tasks and establish relationships between those +tasks to determine the order in which they are executed. Task dependencies ensure that certain tasks +begin only after the preceding tasks are completed. + +To enable task dependencies in projects, go to {menuselection}`Project --> Configuration --> +Settings`, enable {guilabel}`Task Dependencies`, and click {guilabel}`Save`. + +## Set task dependencies + +Task dependencies can be created from the task form or the project's Gantt view by linking the +successor task (i.e., the task blocked by other tasks) to its predecessor task(s) (i.e., the tasks +blocking the successor task). + +To create task dependencies from the task form, access the desired task and, in the +{guilabel}`Blocked by` tab, click {guilabel}`Add a line`. Click {guilabel}`View` to access the +predecessor task. To access the successor tasks from the predecessor task, click the +{guilabel}`Blocked Tasks` smart button. + +To create a task dependency from the Gantt view, hover your mouse over the predecessor task, then +click one of the dots that appear around it. Drag and drop the dot onto the successor task. An arrow +appears, indicating the dependency from the predecessor task to the successor. + +```{image} task_dependencies/task-dependency.png +:alt: Task dependency +:scale: 80% +``` + +Odoo automatically manages task progress based on their dependency. Successor tasks are assigned the +{guilabel}`Waiting` status and cannot be moved to {guilabel}`In Progress` until their predecessor +task(s) are marked as {guilabel}`Approved`, {guilabel}`Cancelled`, or {guilabel}`Done`. + +## Remove dependencies + +To remove a task dependency, proceed as follows: + +- From the task form, go to the **Blocked by** tab and click the {icon}`fa-times` + ({guilabel}`times`) button. +- From the Gantt view, click the red {icon}`fa-times` ({guilabel}`times`) button that appears at the + center of the arrow when you hover your mouse over it. + diff --git a/content/applications/services/project/tasks/task_stages_statuses.md b/content/applications/services/project/tasks/task_stages_statuses.md new file mode 100644 index 000000000..aad32e03f --- /dev/null +++ b/content/applications/services/project/tasks/task_stages_statuses.md @@ -0,0 +1,73 @@ +# Task stages and statuses + +## Task stages + +Task stages are displayed as columns in the project's Kanban view, and allow you to update the +progress of its tasks with a drag-and-drop. In most projects, the stages will be akin to **New**, +**In progress**, **Backlog**, etc. + +By default, task stages are project-specific but can be shared across multiple projects that follow +the same workflow. + +### Creating task stages + +Odoo Project doesn’t provide default stages but instead allows you to create custom stages tailored +to your specific business needs. You are prompted to do so immediately after {ref}`creating a new +project `. + +To create a stage, type its name into the {guilabel}`Stage...` field, then click {guilabel}`Add`. + +:::{tip} +Click {guilabel}`See examples` to find ideas for stage names applicable to your line of business. +::: + +### Editing task stages + +To edit the task stage, click the {icon}`fa-cog` ({guilabel}`cog`) icon next to its name. From +there, click one of the following: + +> - {guilabel}`Fold`: to hide the task stage and all of the tasks in this stage from the Kanban view. +> +> - {guilabel}`Edit`: +> +> - {guilabel}`Name`: to change the name of the stage. +> - {guilabel}`SMS/Email Template`: to automatically send an email or SMS notification to the +> customer when a task reaches this stage. +> - {guilabel}`Folded in Kanban`: to hide the task stage and all of the tasks in this stage from +> the Kanban view. +> - {guilabel}`Projects`: to share this task stage between several projects. +> - {guilabel}`Automations`: to create {doc}`custom rules that trigger automatic actions +> <../../../studio/automated_actions>` (e.g., creating activities, adding followers, or sending +> webhook notifications). Note that this will activate Studio in your database, which may impact +> your pricing plan. +> +> - {guilabel}`Delete`: to delete this stage. +> +> - {guilabel}`Archive/Unarchive all`: to archive or unarchive all of the tasks in this stage. + +(project-tasks-task-stages-statuses-statuses)= + +## Task statuses + +Task statuses are used to track the status of tasks within the Kanban stage, as well as to close the +task when it’s done or canceled. Unlike Kanban stages, they cannot be customized; five task statuses +exist in Odoo and are used as follows: + +> - {guilabel}`In Progress`: this is the default state of all tasks, meaning that work required for +> the task to move to the next Kanban stage is ongoing. +> - {guilabel}`Changes Requested`: to highlight that changes, either requested by the customer or +> internally, are needed before the task is moved to the next Kanban stage. +> - {guilabel}`Approved`: to highlight that the task is ready to be moved to the next stage. +> - {guilabel}`Canceled`: to cancel the task. +> - {guilabel}`Done`: to close the task once it's been completed. + +:::{note} +- The {guilabel}`Changes Requested` and {guilabel}`Approved` task statuses are cleared as soon as + the task is moved to another Kanban stage. The task status reverts to the default {guilabel}`In + Progress` status so that {guilabel}`Changes Requested` or {guilabel}`Approved` status can be + applied again once the necessary work has been completed in this Kanban stage. +- The {guilabel}`Done` and {guilabel}`Canceled` statuses are independent from the Kanban stage. + Once a task is marked as {guilabel}`Done` or {guilabel}`Canceled`, it is closed. If needed, it + can be reopened by changing its status. +::: + diff --git a/content/applications/services/timesheets.md b/content/applications/services/timesheets.md new file mode 100644 index 000000000..562cd21ae --- /dev/null +++ b/content/applications/services/timesheets.md @@ -0,0 +1,19 @@ +--- +hide-page-toc: true +nosearch: true +show-content: true +show-toc: true +--- + +# Timesheets + +:::{seealso} +- [Odoo Tutorials: Project and Timesheets](https://www.odoo.com/slides/project-and-timesheets-21) +::: + +```{toctree} +:titlesonly: true + +timesheets/overview +``` + diff --git a/content/applications/services/timesheets/overview.md b/content/applications/services/timesheets/overview.md new file mode 100644 index 000000000..191832147 --- /dev/null +++ b/content/applications/services/timesheets/overview.md @@ -0,0 +1,12 @@ +--- +nosearch: true +--- + +# Overview + +```{toctree} +:titlesonly: true + +overview/time_off +``` + diff --git a/content/applications/services/timesheets/overview/time_off.md b/content/applications/services/timesheets/overview/time_off.md new file mode 100644 index 000000000..6d9de5e4d --- /dev/null +++ b/content/applications/services/timesheets/overview/time_off.md @@ -0,0 +1,61 @@ +# Create Timesheets upon Time Off Validation + +Odoo automatically timesheets on project/tasks upon time off requests. This allows for better +overall control over the validation of timesheets, as it does not leave place for forgetfulness +and questions after hours that have not been timesheeted by the employee. + +Activate the {ref}`developer mode `, go to *Timesheets*, and change the *Project* +and *Task* set by default, if you like. + +```{image} time_off/record_time_off.png +:align: center +:alt: View of Timesheets setting enabling the feature record time off in Odoo Timesheets +``` + +Go to {menuselection}`Time Off --> Configuration --> Time Off Types`. Select or create the +needed type, and decide if you would like the requests to be validated or not. + +```{image} time_off/time_off_types.png +:align: center +:alt: |- +: View of a time off types form emphasizing the time off requests and timesheets section in +: Odoo Time Off +``` + +Now, once the employee has requested his time off and the request has been validated (or not, +depending on the setting chosen), the time is automatically allocated on + +*Timesheets* + +, under the +respective project and task. + +On the example below, the user requested + +*Paid Time off* + + from July 13th to 15th. + +```{image} time_off/time_off_request.png +:align: center +:alt: View of the time off request form in Odoo Time Off +``` + +Considering that validation is not required, the requested time off is automatically displayed in +*Timesheets*. If validation is necessary, the time is automatically allocated after the responsible +person for validating does it so. + +```{image} time_off/timesheets.png +:align: center +:alt: Video of timesheets emphasizing the requested time off from the employee in Odoo +: Timesheets +``` + +Click on the magnifying glass, hovering over the concerned cell, to access all the aggregated data +on that cell (day), and see details regarding the project/task. + +```{image} time_off/timesheet_description.png +:align: center +:alt: View of the details of a project/task in Odoo Timeheets +``` + diff --git a/content/applications/studio.md b/content/applications/studio.md new file mode 100644 index 000000000..f61c615b4 --- /dev/null +++ b/content/applications/studio.md @@ -0,0 +1,42 @@ +--- +hide-page-toc: true +show-content: true +--- + +# Studio + +```{toctree} +:titlesonly: true + +studio/fields +studio/views +studio/models_modules_apps +studio/automated_actions +studio/pdf_reports +studio/approval_rules +``` + +Studio is a toolbox that allows you to customize Odoo without coding knowledge. For example, you +can, in any app, add or modify: + +- {doc}`Fields ` +- {doc}`Views ` +- {doc}`Models ` +- {doc}`Automation rules ` +- {doc}`PDF reports ` +- {doc}`Approval rules ` +- Security rules + +You can also {doc}`build an app from scratch `. + +(studio-access)= + +To access Studio, navigate to the app and model you want to modify, then click the **Toggle Studio** +button, or vice versa. + +To close Studio, click {guilabel}`Close` in the upper right corner. + +:::{seealso} +[Odoo Tutorials: Studio](https://www.odoo.com/slides/studio-31) +::: + diff --git a/content/applications/studio/approval_rules.md b/content/applications/studio/approval_rules.md new file mode 100644 index 000000000..ebe8332a1 --- /dev/null +++ b/content/applications/studio/approval_rules.md @@ -0,0 +1,106 @@ +# Approval rules + +Approval rules are used to automate approval processes for actions. They allow you to define +the criteria for when an approval is required before an action can be performed using a button. + +## Configuration + +To add approval rules with Studio, proceed as follows: + +1. {ref}`Open Studio ` and switch to the required {doc}`view `. + +2. Select the button to which the rule should be applied. + +3. Click {icon}`fa-plus` {guilabel}`Add an approval step` in the {icon}`fa-server` + {guilabel}`Properties` tab. + +4. Specify which users are responsible for approving the action by using one of the following fields + or both: + + > - {guilabel}`Approvers` to specify one or several users; + > + > - {guilabel}`Approver Group` to specify one user group. + > + > :::{note} + > An activity is created for all users set as {guilabel}`Approvers` when their approval is + > requested. + > ::: + +5. (*optional*) Select the {guilabel}`Users to Notify` via an internal note when the action is + approved or rejected. + +6. (*optional*) Add a {guilabel}`Description` to be displayed on the button. + +:::{tip} +You can specify under which condition(s) an approval step should be applied by clicking the +{icon}`fa-filter` ({guilabel}`filter`) icon next to the {guilabel}`Approvers` field. +::: + +To add another approval step, click {icon}`fa-plus` {guilabel}`Add an approval step`. When there are +multiple steps, you can: + +- Enable {guilabel}`Exclusive Approval` on any step so that a user who approves a step cannot + approve another step for the same record. +- Change the {guilabel}`Approval Order` of the steps by selecting a number, `1` being the first + step, `2` the second step, and so on. A user responsible for a higher step can approve/reject + previous step(s) unless {guilabel}`Exclusive Approval` is selected. + +Click the {icon}`fa-trash` ({guilabel}`trash`) icon next to the {guilabel}`Approvers` field to +remove an approval step. + +:::{tip} +You can create {ref}`user groups ` specifically for approvals. +::: + +(approval-rules-use)= + +## Use + +Once an approval rule has been defined for a button, a **user avatar** icon is displayed next to the +button's label for each approval step. Clicking an icon reveals the step(s). + +```{image} approval_rules/approval-button.png +:alt: Confirm button with two approval steps +``` + +:::{note} +If an unauthorized user clicks the button, an error message is displayed and an activity is +created for the users specified in the {guilabel}`Approvers` field, if any. +::: + +Authorized users can: + +- Perform the action directly by clicking the button if it is the last/only approval step. + +- Approve the action and let another user perform it - or move it to the next approval step - by + clicking the **user avatar** icon next to the button's label, then clicking the {icon}`fa-check` + ({guilabel}`approve`). + +- Reject the action by clicking the **user avatar** icon next to the button's label and then the + {icon}`fa-times` ({guilabel}`reject`) button. + +- (only for users selected under the {guilabel}`Approvers` field) Delegate their approval rights to + one or several users for **all records** by: + + - Clicking the {icon}`oi-view-kanban` ({guilabel}`kanban view`) icon and then + {guilabel}`Delegate`. + + - Selecting one or several {guilabel}`Approvers`, {guilabel}`Until` when they will have approval + rights (forever if left empty), and, optionally, the user(s) who should be notified via an + internal note using the {guilabel}`Notify to` field. + + ```{image} approval_rules/delegate-dialog.png + :alt: Delegate to dialog + ``` + +:::{tip} +- A user who approves/rejects an action can revoke their decision by clicking the **user avatar** + icon next to the button's label and then the {icon}`fa-undo` ({guilabel}`revoke`) button. They + can also revoke the decision of other users for steps with a lower {guilabel}`Approval Order` + unless {guilabel}`Exclusive Approval` is enabled. +- Approvals are tracked in the record's chatter. An approval entry is also created every time + a Studio approval-related action is performed. To access approval entries, {doc}`activate the + developer mode ` and go to {menuselection}`Settings --> + Technical --> Studio Approval Entries`. +::: + diff --git a/content/applications/studio/automated_actions.md b/content/applications/studio/automated_actions.md new file mode 100644 index 000000000..314634d1d --- /dev/null +++ b/content/applications/studio/automated_actions.md @@ -0,0 +1,364 @@ +# Automation rules + +Automation rules are used to trigger automatic changes based on user actions (e.g., apply a +modification when a field is set to a specific value), email events, time conditions (e.g., archive +a record 7 days after its last update), or external events. + +To create an automation rule with Studio, proceed as follows: + +1. {ref}`Open Studio ` and click {guilabel}`Automations`, then {guilabel}`New`. +2. Select the {ref}`studio/automated-actions/trigger` and, if necessary, fill in the fields that + appear on the screen based on the chosen trigger. +3. Click {guilabel}`Add an action`, then select the {guilabel}`Type` of + {ref}`action ` and fill in the fields that appear on the screen + based on your selected action. +4. Click {guilabel}`Save & Close` or {guilabel}`Save & New`. + +```{eval-rst} +.. example:: + + .. image:: automated_actions/automation-rule-ex.png + :alt: Example of an automated action on the Subscription model +``` + +:::{tip} +- To modify the {doc}`model ` of the automation rule, switch models before + clicking {guilabel}`Automations` in Studio, or {ref}`activate the developer mode + `, create or edit an automation rule, and select the {guilabel}`Model` in the + {guilabel}`Automation Rules` form. + +- You can also create automation rules from any kanban stage by clicking the gear icon + ({guilabel}`⚙` ) next to the kanban stage name, then selecting {guilabel}`Automations`. In this + case, the {guilabel}`Trigger` is set to {guilabel}`Stage is set to` by default, but you can + change it if necessary. + + ```{image} automated_actions/automations-kanban.png + :alt: Create automations from a kanban stage + ``` +::: + +(studio-automated-actions-trigger)= + +## Trigger + +The {guilabel}`Trigger` is used to define when the automation rule should be applied. The available +triggers depend on the {doc}`model `. Five trigger categories are available +overall: + +- {ref}`studio/automated-actions/trigger/values-updated` +- {ref}`studio/automated-actions/trigger/email-events` +- {ref}`studio/automated-actions/trigger/values-timing-conditions` +- {ref}`studio/automated-actions/trigger/custom` +- {ref}`studio/automated-actions/trigger/external` + +:::{tip} +You can also define a {guilabel}`Before Update Domain` to specify the conditions that must be met +*before* the automation rule is triggered. In contrast, the conditions defined using the +{ref}`Extra Conditions ` and +{ref}`Apply on ` filters are checked *during* the +execution of the automation rule. + +To define a {guilabel}`Before Update Domain`, {ref}`activate the developer mode +`, create or edit an automation rule, click {guilabel}`Edit Domain`, then click +{guilabel}`New Rule`. + +For example, if you want the automated action to happen when an email address is set on a +contact that did not have an address before (in contrast to modifying their existing address), +define the {guilabel}`Before Update Domain` to {guilabel}`Email is not set`, and the +{guilabel}`Apply on` domain to {guilabel}`Email is set`. + +```{image} automated_actions/before-update-domain.png +:alt: Example of a trigger with a Before Update Domain +``` +::: + +(studio-automated-actions-trigger-values-updated)= + +### Values Updated + +The triggers available in this category depend on the model and are based on common field changes, +such as adding a specific tag (e.g., to a task) or setting the {guilabel}`User` field. Select the +trigger, then select a value if required. + +```{image} automated_actions/values-updated-trigger.png +:alt: Example of a Values Updated trigger +``` + +(studio-automated-actions-trigger-email-events)= + +### Email Events + +Trigger automated actions upon receiving or sending emails. + +(studio-automated-actions-trigger-values-timing-conditions)= + +### Timing Conditions + +Trigger automated actions based on a date field. The following triggers are available: + +- {guilabel}`Based on date field`: Select the field to be used next to the {guilabel}`Delay` field. +- {guilabel}`After creation`: The action is triggered when a record is created and saved. +- {guilabel}`After last update`: The action is triggered when an existing record is edited and + saved. + +You can then define: + +- a {guilabel}`Delay`: Specify the number of minutes, hours, days, or months. To trigger the action + before the trigger date, specify a negative number. If you selected the {guilabel}`Based on date + field` trigger, you must also select the date field to be used to determine the delay. +- {guilabel}`Extra Conditions`: Click {guilabel}`Add condition`, then specify the conditions to be + met to trigger the automation rule. Click {guilabel}`New Rule` to add another condition. + +The action is triggered when the delay is reached and the conditions are met. + +```{eval-rst} +.. example:: + If you want to send a reminder email 30 minutes before the start of a calendar event, select the + :guilabel:`Start (Calendar Event)` under :guilabel:`Trigger Date` and set the :guilabel:`Delay` + to **-30** :guilabel:`Minutes`. + + .. image:: automated_actions/timing-conditions-trigger.png + :alt: Example of a Based on date field trigger +``` + +:::{note} +By default, the scheduler checks for trigger dates every 4 hours, meaning lower granularity in +time-based automations may not always be honored. +::: + +(studio-automated-actions-trigger-custom)= + +### Custom + +Trigger automated actions: + +- {guilabel}`On save`: When the record is saved; +- {guilabel}`On deletion`: When a record is deleted; +- {guilabel}`On UI change`: When a field's value is changed on the {ref}`Form view + `, even before saving the record. + +For the {guilabel}`On save` and {guilabel}`On UI change` triggers, you **must** then select the +field(s) to be used to trigger the automation rule in the {guilabel}`When updating` field. + +:::{warning} +If no field is selected in the {guilabel}`When updating` field, the automated action may be +executed multiple times per record. +::: + +Optionally, you can also define additional conditions to be met to trigger the automation rule in +the {guilabel}`Apply on` field. + +:::{note} +The {guilabel}`On UI change` trigger can only be used with the +{ref}`studio/automated-actions/action/python-code` action and only works when a modification is +made manually. The action is not executed if the field is changed through another automation +rule. +::: + +(studio-automated-actions-trigger-external)= + +### External + +Trigger automated actions based on an external event using a webhook. A webhook is a method of +communication between two systems where the source system sends an HTTP(S) request to a destination +system based on a specific event. It usually includes a data payload containing information about +the event that occurred. + +To configure the {guilabel}`On webhook` trigger, copy the {guilabel}`URL` generated by Odoo into the +destination system (i.e., the system receiving the request). Then, in the {guilabel}`Target Record` +field, enter the code to run to define the record(s) to be updated using the automation rule. + +:::{warning} +The URL must be treated as **confidential**; sharing it online or without caution could +potentially expose your system to malicious parties. Click the {guilabel}`Rotate Secret` button +to change the URL's secret if necessary. +::: + +:::{note} +- The code defined by default in the {guilabel}`Target Record` field works for webhooks coming + from another Odoo database. It is used to determine the record(s) to be updated using the + information in the payload. +- If you wish to use the webhook's content for a purpose other than to find the record(s) (e.g., + *create* a record), your only option is to use an {ref}`studio/automated-actions/action/python-code` + action. In this case, the {guilabel}`Target record` field must contain any valid code, but its + result doesn't have any effect on the automated action itself. +- The webhook content is available in the server action context as a `payload` variable (i.e., a + dictionary that contains the GET parameters or POST JSON body of the incoming request). +::: + +You can also choose to {guilabel}`Log Calls` to record the payloads received, e.g., to make sure the +data sent by the source system matches the expected format and content. This also helps identify +and diagnose any issues that may arise. To access the logs, click the {guilabel}`Logs` smart +button at the top of the {guilabel}`Automation rules` form. + +(studio-automated-actions-action)= + +## Actions + +Once you have defined the automation rule's {ref}`trigger `, click +{guilabel}`Add an action` to define the action to be executed. + +:::{tip} +You can define multiple actions for the same trigger/automation rule. The actions are executed +in the order they are defined. This means, for example, that if you define an +{guilabel}`Update record` action and then a {guilabel}`Send email` action, the email uses the +updated values. However, if the {guilabel}`Send email` action is defined before the +{guilabel}`Update record` action, the email uses the values set *before* the update action is +run. +::: + +(studio-automated-actions-action-update-record)= + +### Update Record + +This action allows to update one of the record's (related) fields. Click the {guilabel}`Update` +field and, in the list that opens, select or search for the field to be updated; click the right +arrow next to the field name to access the list of related fields if needed. + +If you selected a {ref}`many2many field `, choose whether +the field must be updated by {guilabel}`Adding`, {guilabel}`Removing`, or {guilabel}`Setting it to` +the selected value or by {guilabel}`Clearing it`. + +```{eval-rst} +.. example:: + If you want the automated action to remove a tag from the customer record, set the + :guilabel:`Update` field to :guilabel:`Customer > Tags`, select :guilabel:`By Removing`, then + select the tag. + + .. image:: automated_actions/update-record-action.png + :alt: Example of an Update Record action +``` + +:::{tip} +Alternatively, you can also set a record's field dynamically using Python code. To do so, select +{guilabel}`Compute` instead of {guilabel}`Update`, then enter the code to be used for computing +the field's value. For example, if you want the automation rule to compute a custom +{ref}`datetime field ` when a task's priority is set to +`High` (by starring the task), you can define the trigger {guilabel}`Priority is set to` to +`High` and define the {guilabel}`Update Record` action as follows: + +```{image} automated_actions/update-record-compute.png +:alt: Compute a custom datetime field using a Python expression +``` +::: + +### Create Activity + +This action is used to schedule a new activity linked to the record. Select an {guilabel}`Activity +Type`, enter a {guilabel}`Title` and description, then specify when you want the activity to be +scheduled in the {guilabel}`Due Date In` field, and select a {guilabel}`User type`: + +- To always assign the activity to the same user, select {guilabel}`Specific User` and add the user + in the {guilabel}`Responsible` field; +- To target a user linked to the record dynamically, select {guilabel}`Dynamic User (based on + record)` and change the {guilabel}`User Field` if necessary. + +```{eval-rst} +.. example:: + After a lead is turned into an opportunity, you want the automated action to set up a call for + the user responsible for the lead. To do so, set the :guilabel:`Activity Type` to + :guilabel:`Call` and the :guilabel:`User Type` to :guilabel:`Dynamic User (based on record)`. + + .. image:: automated_actions/create-activity-action.png + :alt: Example of a Create Activity action +``` + +### Send Email and Send SMS + +These actions are used to send an email or a text message to a contact linked to a specific record. +To do so, select or create an {guilabel}`Email Template` or an {guilabel}`SMS Template`, then, in +the {guilabel}`Send Email As` or {guilabel}`Send SMS As` field, choose how you want to send the +email or text message: + +- {guilabel}`Email`: to send the message as an email to the recipients of the {guilabel}`Email + Template`. +- {guilabel}`Message`: to post the message on the record and notify the record's followers. +- {guilabel}`Note`: to send the message as an internal note visible to internal users in the + chatter. +- {guilabel}`SMS (without note)`: to send the message as a text message to the recipients of the + {guilabel}`SMS template`. +- {guilabel}`SMS (with note)`: to send the message as a text message to the recipients of the + {guilabel}`SMS template` and post it as an internal note in the chatter. +- {guilabel}`Note only`: to only post the message as an internal note in the chatter. + +(studio-automated-actions-action-send-whatsapp)= + +### Send WhatsApp + +:::{important} +To automate the sending of WhatsApp messages, one or more +{ref}`WhatsApp templates ` must be created. +::: + +This action is used to send a WhatsApp message to a contact linked to a specific record. +To do so, select the appropriate {guilabel}`WhatsApp Template` from the drop-down menu. + +(studio-automated-actions-action-add-followers)= + +### Add Followers and Remove Followers + +Use these actions to (un)subscribe existing contacts to/from the record. + +### Create Record + +This action is used to create a new record on any model. + +Select the required model in the {guilabel}`Record to Create` field; it contains the current model +by default. Specify a {guilabel}`Name` for the record, and then, if you want to create the record on +another model, select a field in the {guilabel}`Link Field` field to link the record that +triggered the creation of the new record. + +:::{note} +The dropdown list related to the {guilabel}`Link Field` field only contains {ref}`one2many fields +` existing on the current model that are linked to a +{ref}`many2one field ` on the target model. +::: + +:::{tip} +You can create another automation rule with {ref}`studio/automated-actions/action/update-record` +actions to update the fields of the new record if necessary. For example, you can use a +{guilabel}`Create Record` action to create a new project task and then assign it to a specific +user using an {guilabel}`Update Record` action. +::: + +(studio-automated-actions-action-python-code)= + +### Execute Code + +This action is used to execute Python code. You can write your code into the {guilabel}`Code` tab +using the following variables: + +- `env`: environment on which the action is triggered +- `model`: model of the record on which the action is triggered; is a void recordset +- `record`: record on which the action is triggered; may be void +- `records`: recordset of all records on which the action is triggered in multi-mode; this may be + left empty +- `time`, `datetime`, `dateutil`, `timezone`: useful Python libraries +- `float_compare`: utility function to compare floats based on specific precision +- `log(message, level='info')`: logging function to record debug information in ir.logging + table +- `_logger.info(message)`: logger to emit messages in server logs +- `UserError`: exception class for raising user-facing warning messages +- `Command`: x2many commands namespace +- `action = {...}`: to return an action + +:::{tip} +The available variables are described both in the {guilabel}`Code` and {guilabel}`Help` tabs. +::: + +### Send Webhook Notification + +This action allows to send a POST request with the values of the {guilabel}`Fields` to the URL +specified in the {guilabel}`URL` field. + +The {guilabel}`Sample Payload` provides a preview of the data included in the request using a random +record's data or dummy data if no record is available. + +(studio-automated-actions-action-several-actions)= + +### Execute Existing Actions + +The action is used to trigger multiple actions (linked to the current model) at the same time. To do +so, click on {guilabel}`Add a line`, then, in the {guilabel}`Add: Child Actions` pop-up, select an +existing action or click {guilabel}`New` to create a new one. + diff --git a/content/applications/studio/fields.md b/content/applications/studio/fields.md new file mode 100644 index 000000000..483752055 --- /dev/null +++ b/content/applications/studio/fields.md @@ -0,0 +1,536 @@ +# Fields and widgets + +Fields structure the models of a database. If you picture a model as a table or spreadsheet, fields +are the columns where data is stored in the records (i.e., the rows). Fields also define the type of +data that is stored within them. How the data is presented and formatted on the {abbr}`UI (User +Interface)` is defined by their widget. + +From a technical point of view, there are 15 field types in Odoo. However, you can choose from 20 +fields in Studio, as some field types are available more than once with a different default widget. + +:::{tip} +{guilabel}`New Fields` can only be added to the {ref}`studio/views/general/form` and +{ref}`studio/views/multiple-records/list` views. On other views, you can only add +{guilabel}`Existing Fields` {dfn}`(fields already on the model)`. +::: + +(studio-fields-simple-fields)= + +## Simple fields + +Simple fields contain basic values, such as text, numbers, files, etc. + +:::{note} +Non-default widgets, when available, are presented as bullet points below. +::: + +(studio-fields-simple-fields-text)= + +### Text (`char`) + +The {guilabel}`Text` field is used for short text containing any character. One text line is +displayed when filling out the field. + +- {guilabel}`Badge`: displays the value inside a rounded shape, similar to a tag. The value cannot + be edited on the UI, but a default value can be set. + +- {guilabel}`Copy to Clipboard`: users can copy the value by clicking a button. + +- {guilabel}`E-mail`: the value becomes a clickable *mailto* link. + +- {guilabel}`Image`: displays an image using a URL. The value cannot be edited manually, but a + default value can be set. + + :::{note} + This works differently than selecting the {ref}`Image field + ` directly, as the image is not stored in Odoo when using a + {guilabel}`Text` field with the {guilabel}`Image` widget. For example, it can be useful if you + want to save disk space. + ::: + +- {guilabel}`Phone`: the value becomes a clickable *tel* link. + + :::{tip} + Tick {guilabel}`Enable SMS` to add an option to send an SMS directly from Odoo next to the + field. + ::: + +- {guilabel}`URL`: the value becomes a clickable URL. + +```{eval-rst} +.. example:: + + .. image:: fields/text-examples.png + :align: center + :alt: Examples of Text fields with different widgets +``` + +(studio-fields-simple-fields-multiline-text)= + +### Multiline Text (`text`) + +The {guilabel}`Multiline Text` field is used for longer text containing any type of character. Two +text lines are displayed on the UI when filling out the field. + +- {guilabel}`Copy to Clipboard`: users can copy the value by clicking a button. + +```{eval-rst} +.. example:: + + .. image:: fields/multiline-text-examples.png + :align: center + :alt: Examples of Multiline Text fields with different widgets +``` + +(studio-fields-simple-fields-integer)= + +### Integer (`integer`) + +The {guilabel}`Integer` field is used for all integer numbers ({dfn}`positive, negative, or zero, +without a decimal`). + +- {guilabel}`Percentage Pie`: displays the value inside a percentage circle, usually for a computed + value. The value cannot be edited on the UI, but a default value can be set. +- {guilabel}`Progress Bar`: displays the value next to a percentage bar, usually for a computed + value. The field cannot be edited manually, but a default value can be set. +- {guilabel}`Handle`: displays a drag handle icon to order records manually in {ref}`List view + `. + +```{eval-rst} +.. example:: + + .. image:: fields/integer-examples.png + :align: center + :alt: Examples of Integer fields with different widgets +``` + +(studio-fields-simple-fields-decimal)= + +### Decimal (`float`) + +The {guilabel}`Decimal` field is used for all decimal numbers ({dfn}`positive, negative, or zero, +with a decimal`). + +:::{note} +Decimal numbers are displayed with two decimals after the decimal point on the UI, but they are +stored in the database with more precision. +::: + +- {guilabel}`Monetary`: it is similar to using the {ref}`Monetary field + `. It is recommended to use the later as it offers more + functionalities. +- {guilabel}`Percentage`: displays a percent character `%` after the value. +- {guilabel}`Percentage Pie`: displays the value inside a percentage circle, usually for a computed + value. The field cannot be edited manually, but a default value can be set. +- {guilabel}`Progress Bar`: displays the value next to a percentage bar, usually for a computed + value. The field cannot be edited manually, but a default value can be set. +- {guilabel}`Time`: the value must follow the *hh:mm* format, with a maximum of 59 minutes. + +```{eval-rst} +.. example:: + + .. image:: fields/decimal-examples.png + :align: center + :alt: Examples of Decimal fields with different widgets +``` + +(studio-fields-simple-fields-monetary)= + +### Monetary (`monetary`) + +The {guilabel}`Monetary` field is used for all monetary values. + +:::{note} +When you first add a {guilabel}`Monetary` field, you are prompted to add a {guilabel}`Currency` +field if none exists already on the model. Odoo offers to add the {guilabel}`Currency` field for +you. Once it is added, add the {guilabel}`Monetary` field again. +::: + +```{eval-rst} +.. example:: + + .. image:: fields/monetary-example.png + :align: center + :alt: Example of a Monetary field along with its Currency field +``` + +(studio-fields-simple-fields-html)= + +### Html (`html`) + +The {guilabel}`Html` field is used to add text that can be edited using the Odoo HTML editor. + +- {guilabel}`Multiline Text`: disables the Odoo HTML editor to allow editing raw HTML. + +```{eval-rst} +.. example:: + + .. image:: fields/html-example.png + :align: center + :alt: Examples of Html fields with different widgets +``` + +(studio-fields-simple-fields-date)= + +### Date (`date`) + +The {guilabel}`Date` field is used to select a date on a calendar. + +- {guilabel}`Remaining Days`: the remaining number of days before the selected date is displayed + (e.g., *In 5 days*), based on the current date. + +```{eval-rst} +.. example:: + + .. image:: fields/date-examples.png + :align: center + :alt: Examples of Date fields with different widgets +``` + +(studio-fields-simple-fields-date-time)= + +### Date & Time (`datetime`) + +The {guilabel}`Date & Time` field is used to select a date on a calendar and a time on a clock. The +user's current time is automatically used if no time is set. + +- {guilabel}`Date`: used to record the time without displaying it on the UI. +- {guilabel}`Remaining days`: displays the remaining number of days before the selected date (e.g., + *In 5 days*), based on the current date and time. + +```{eval-rst} +.. example:: + + .. image:: fields/date-time-examples.png + :align: center + :alt: Examples of Date & Time fields with different widgets +``` + +(studio-fields-simple-fields-checkbox)= + +### Checkbox (`boolean`) + +The {guilabel}`Checkbox` field is used when a value should only be true or false, indicated by +checking or unchecking a checkbox. + +- {guilabel}`Button`: displays a radio button. The widget works without switching to the edit mode. +- {guilabel}`Toggle`: displays a toggle button. The widget works without switching to the edit mode. + +```{eval-rst} +.. example:: + + .. image:: fields/checkbox-examples.png + :align: center + :alt: Examples of Checkbox fields with different widgets +``` + +(studio-fields-simple-fields-selection)= + +### Selection (`selection`) + +The {guilabel}`Selection` field is used when users should select a single value from a group of +predefined values. + +- {guilabel}`Badge`: displays the value inside a rounded shape, similar to a tag. The value cannot + be edited on the UI, but a default value can be set. + +- {guilabel}`Badges`: displays all selectable values simultaneously inside rectangular shapes, + organized horizontally. + +- {guilabel}`Priority`: displays star symbols instead of values, which can be used to indicate an + importance or satisfaction level, for example. This has the same effect as selecting the + {ref}`Priority field `, although, for the latter, four + priority values are already predefined. + +- {guilabel}`Radio`: displays all selectable values at the same time as radio buttons. + + :::{tip} + By default, radio buttons are organized vertically. Tick {guilabel}`display horizontally` to + switch the way they are displayed. + ::: + +```{eval-rst} +.. example:: + + .. image:: fields/selection-examples.png + :align: center + :alt: Examples of Selection fields with different widgets +``` + +(studio-fields-simple-fields-priority)= + +### Priority (`selection`) + +The {guilabel}`Priority` field is used to display a three-star rating system, which can be used to +indicate importance or satisfaction level. This field type is a {ref}`Selection field +` with the {guilabel}`Priority` widget selected by default +and four priority values predefined. Consequently, the {guilabel}`Badge`, {guilabel}`Badges`, +{guilabel}`Radio`, and {guilabel}`Selection` widgets have the same effects as described under +{ref}`Selection `. + +:::{tip} +To change the number of available stars by adding or removing values, click {guilabel}`Edit +Values`. Note that the first value is equal to 0 stars (i.e., when no selection is made), so +having four values results in a three-star rating system, for example. +::: + +```{eval-rst} +.. example:: + + .. image:: fields/priority-example.png + :align: center + :alt: Example of a Priority field +``` + +(studio-fields-simple-fields-file)= + +### File (`binary`) + +The {guilabel}`File` field is used to upload any type of file, or sign a form ({guilabel}`Sign` +widget). + +- {guilabel}`Image`: users can upload an image file, which is then displayed in {ref}`Form view + `. This has the same effect as using the {ref}`Image field + `. +- {guilabel}`PDF Viewer`: users can upload a PDF file, which can be then browsed from the + {ref}`Form view `. +- {guilabel}`Sign`: users can electronically sign the form. This has the same effect as selecting + the {ref}`Sign field `. + +```{eval-rst} +.. example:: + + .. image:: fields/file-examples.png + :align: center + :alt: Examples of File fields with different widgets +``` + +(studio-fields-simple-fields-image)= + +### Image (`binary`) + +The {guilabel}`Image` field is used to upload an image and display it in {ref}`Form view +`. This field type is a {ref}`File field +` with the {guilabel}`Image` widget selected by default. +Consequently, the {guilabel}`File`, {guilabel}`PDF Viewer`, and {guilabel}`Sign` widgets have the +same effects as described under {ref}`File `. + +:::{tip} +To change the display size of uploaded images, select {guilabel}`Small`, {guilabel}`Medium`, or +{guilabel}`Large` under the {guilabel}`Size` option. +::: + +(studio-fields-simple-fields-sign)= + +### Sign (`binary`) + +The {guilabel}`Sign` field is used to sign the form electronically. This field type is a {ref}`File +field ` with the {guilabel}`Sign` widget selected by default. +Consequently, the {guilabel}`File`, {guilabel}`Image`, and {guilabel}`PDF Viewer` widgets have the +same effects as described under {ref}`File `. + +:::{tip} +To give users the {guilabel}`Auto` option when having to draw their signature, select one of the +available {guilabel}`Auto-complete with` fields ({ref}`Text `, +{ref}`Many2One `, and {ref}`Related Field +` on the model only). The signature is +automatically generated using the data from the selected field. +::: + +(studio-fields-relational-fields)= + +## Relational fields + +Relational fields are used to link and display the data from records on another model. + +:::{note} +Non-default widgets, when available, are presented as bullet points below. +::: + +(studio-fields-relational-fields-many2one)= + +### Many2One (`many2one`) + +The {guilabel}`Many2One` field is used to link another record (from another model) to the record +being edited. The record's name from the other model is then displayed on the record being edited. + +```{eval-rst} +.. example:: + On the *Sales Order* model, the :guilabel:`Customer` field is a :guilabel:`Many2One` field + pointing at the *Contact* model. This allows **many** sales orders to be linked to **one** + contact (customer). + + .. image:: fields/many2one-diagram.png + :align: center + :alt: Diagram showing a many2one relationship +``` + +:::{tip} +- To prevent users from creating a new record in the linked model, tick {guilabel}`Disable + creation`. +- To prevent users from opening records in a pop-up window, tick {guilabel}`Disable opening`. +- To help users only select the right record, click on {guilabel}`Domain` to create a filter. +::: + +- {guilabel}`Badge`: displays the value inside a rounded shape, similar to a tag. The value cannot + be edited on the UI. +- {guilabel}`Radio`: displays all selectable values at the same time as radio buttons. + +(studio-fields-relational-fields-one2many)= + +### One2Many (`one2many`) + +The {guilabel}`One2Many` field is used to display the existing relations between a record on the +current model and multiple records from another model. + +```{eval-rst} +.. example:: + You could add a :guilabel:`One2Many` field on the *Contact* model to look at **one** customer's + **many** sales orders. + + .. image:: fields/one2many-diagram.png + :align: center + :alt: Diagram showing a one2many relationship +``` + +:::{note} +To use a {guilabel}`One2Many` field, the two models must have been linked already using a +{ref}`Many2One field `. One2Many relations do not exist +independently: a reverse-search of existing Many2One relations is performed. +::: + +(studio-fields-relational-fields-lines)= + +### Lines (`one2many`) + +The {guilabel}`Lines` field is used to create a table with rows and columns (e.g., the lines of +products on a sales order). + +:::{tip} +To modify the columns, click on the {guilabel}`Lines` field and then {guilabel}`Edit List View`. +To edit the form that pops up when a user clicks on {guilabel}`Add a line`, click on +{guilabel}`Edit Form View` instead. +::: + +```{eval-rst} +.. example:: + + .. image:: fields/lines-example.png + :align: center + :alt: Example of a Lines field +``` + +(studio-fields-relational-fields-many2many)= + +### Many2Many (`many2many`) + +The {guilabel}`Many2Many` field is used to link multiple records from another model to multiple +records on the current model. Many2Many fields can use {guilabel}`Disable creation`, +{guilabel}`Disable opening`, {guilabel}`Domain`, just like {ref}`Many2One fields +`. + +```{eval-rst} +.. example:: + On the *Task* model, the :guilabel:`Assignees` field is a :guilabel:`Many2Many` field pointing at + the *Contact* model. This allows a single user to be assigned to **many** tasks and **many** + users to be assigned to a single task. + + .. image:: fields/many2many-diagram.png + :align: center + :alt: Diagram showing many2many relationships +``` + +- {guilabel}`Checkboxes`: users can select several values using checkboxes. +- {guilabel}`Tags`: users can select several values appearing in rounded shapes, also known as + *tags*. This has the same effect as selecting the {ref}`Tags field + `. + +(studio-fields-relational-fields-tags)= + +### Tags (`many2many`) + +The {guilabel}`Tags` field is used to display several values from another model appearing in rounded +shapes, also known as *tags*. This field type is a {ref}`Many2Many field +` with the {guilabel}`Tags` widget selected by default. +Consequently, the {guilabel}`Checkboxes` and {guilabel}`Many2Many` widgets have the same effects as +described under {ref}`Many2Many `. + +:::{tip} +To display tags with different background colors, tick {guilabel}`Use colors`. +::: + +```{eval-rst} +.. example:: + + .. image:: fields/tags-example.png + :align: center + :alt: Example of a Tags field +``` + +(studio-fields-relational-fields-related-field)= + +### Related Field (`related`) + +A {guilabel}`Related Field` is not a relational field per se; no relationship is created between +models. It uses an existing relationship to fetch and display information from another record. + +```{eval-rst} +.. example:: + To display the email address of a customer on the *Sales Order* model, use the :guilabel:`Related + Field` `partner_id.email` by selecting :guilabel:`Customer` and then :guilabel:`Email`. +``` + +(studio-fields-properties)= + +## Properties + +- {guilabel}`Invisible`: When it is not necessary for users to view a field on the UI, tick + {guilabel}`Invisible`. It helps clear the UI by only showing the essential fields depending on a + specific situation. + + ```{eval-rst} + .. example:: + On the *Form* view of the *Contact* model, the :guilabel:`Title` field only appears when + :guilabel:`Individual` is selected, as that field would not be helpful for a + :guilabel:`Company` contact. + ``` + + :::{note} + The {guilabel}`Invisible` attribute also applies to Studio. To view hidden fields inside + Studio, click on a view's {guilabel}`View` tab and tick {guilabel}`Show Invisible + Elements`. + ::: + +- {guilabel}`Required`: If a field should always be completed by the user before being able to + proceed, tick {guilabel}`Required`. + +- {guilabel}`Read only`: If users should not be able to modify a field, tick {guilabel}`Read only`. + + :::{note} + You can choose to apply these three properties only for specific records by clicking on + {guilabel}`Conditional` and creating a filter. + ::: + +- {guilabel}`Label`: The {guilabel}`Label` is the field's name on the UI. + + :::{note} + This is not the same name as used in the PostgreSQL database. To view and change the latter, + activate the {ref}`Developer mode `, and edit the {guilabel}`Technical Name`. + ::: + +- {guilabel}`Help Tooltip`: To explain the purpose of a field, write a description under + {guilabel}`Help Tooltip`. It is displayed inside a tooltip box when hovering with your mouse over + the field's label. + +- {guilabel}`Placeholder`: To provide an example of how a field should be completed, write it under + {guilabel}`Placeholder`. It is displayed in light gray in lieu of the field's value. + +- {guilabel}`Widget`: To change the default appearance or functionality of a field, select one of + the available widgets. + +- {guilabel}`Default value`: To add a default value to a field when a record is created, use + {guilabel}`Default value`. + +- {guilabel}`Limit visibility to groups`: To limit which users can see the field, select a user + access group. + diff --git a/content/applications/studio/models_modules_apps.md b/content/applications/studio/models_modules_apps.md new file mode 100644 index 000000000..539b2bad4 --- /dev/null +++ b/content/applications/studio/models_modules_apps.md @@ -0,0 +1,227 @@ +# Models, modules, and apps + +Models determine the logical structure of a database and how data is stored, organized, and +manipulated. In other words, a model is a table of information that can be linked with other tables. +A model usually represents a business concept, such as a *sales order*, *contact*, or *product*. + +Modules and apps contain various elements, such as models, views, data files, web controllers, and +static web data. + +:::{note} +All apps are modules. Larger, standalone modules are typically referred to as apps, whereas other +modules usually serve as add-ons to said apps. +::: + +(studio-models-modules-apps-suggested-features)= + +## Suggested features + +When you create a new model or app with Studio, you can choose to add up to 14 features to speed +up the creation process. These features bundle fields, default settings, and views that are usually +used together to provide some standard functionality. Most of these features can be added later on, +but adding them from the start makes the model creation process much easier. Furthermore, these +features interact together in some cases to increase their usefulness. + +```{eval-rst} +.. example:: + Creating a model with the :ref:`studio/models-modules-apps/suggested-features/picture` and + :ref:`studio/models-modules-apps/suggested-features/pipeline-stages` features enabled adds the + image in the card layout of the :ref:`Kanban view `. + + .. image:: models_modules_apps/picture-pipeline-kanban.png + :align: center + :alt: Combination of the Picture and Pipeline stages features on the Kanban view +``` + +(studio-models-modules-apps-suggested-features-contact-details)= + +### Contact details + +Selecting {guilabel}`Contact details` adds to the {ref}`Form view ` a +{ref}`Many2One field ` linked to the *Contact* model and +two of its {ref}`Related Fields `: {guilabel}`Phone` +and {guilabel}`Email`. The {guilabel}`Contact` field is also added to the {ref}`List view +`, and the {ref}`Map view ` +is activated. + +```{eval-rst} +.. example:: + + .. image:: models_modules_apps/contact.png + :align: center + :alt: Contact details feature on the Form view +``` + +(studio-models-modules-apps-suggested-features-user-assignment)= + +### User assignment + +Selecting {guilabel}`User assignment` adds to the {ref}`Form view ` a +{ref}`Many2One field ` linked to the *Contact* model, with +the following {guilabel}`Domain`: `Share User is not set` to only allow the selection of *Internal +Users*. In addition, the {guilabel}`many2one_avatar_user` widget is used to display the user's +avatar. The {guilabel}`Responsible` field is also added to the {ref}`List view +`. + +```{eval-rst} +.. example:: + + .. image:: models_modules_apps/user-assignment.png + :align: center + :alt: User assignment feature on the Form view +``` + +(studio-models-modules-apps-suggested-features-date-calendar)= + +### Date & Calendar + +Selecting {guilabel}`Date & Calendar` adds to the {ref}`Form view ` a +{ref}`Date field ` and activates the {ref}`Calendar view +`. + +(studio-models-modules-apps-suggested-features-date-range-gantt)= + +### Date range & Gantt + +Selecting {guilabel}`Date range & Gantt` adds to the {ref}`Form view ` +two {ref}`Date fields ` next to each other: one to set a start +date, the other to set an end date, using the {guilabel}`daterange` widget, and activates the +{ref}`Gantt view `. + +(studio-models-modules-apps-suggested-features-pipeline-stages)= + +### Pipeline stages + +Selecting {guilabel}`Pipeline stages` activates the {ref}`Kanban view +`, adds several fields such as {ref}`Priority +` and {guilabel}`Kanban State`, and three stages: +{guilabel}`New`, {guilabel}`In Progress`, and {guilabel}`Done`. The {guilabel}`Pipeline status bar` +and the {guilabel}`Kanban State` field are added to the {ref}`Form view +`. The {guilabel}`Color` field is added to the {ref}`List view +`. + +:::{note} +The {guilabel}`Pipeline stages` feature can be added at a later stage. +::: + +(studio-models-modules-apps-suggested-features-tags)= + +### Tags + +Selecting {guilabel}`Tags` adds to the {ref}`studio/views/general/form` and +{ref}`studio/views/multiple-records/list` views a {ref}`Tags field +`, creating a *Tag* model with preconfigured access rights in +the process. + +(studio-models-modules-apps-suggested-features-picture)= + +### Picture + +Selecting {guilabel}`Picture` adds to the top-right of the {ref}`Form view +` an {ref}`Image field `. + +:::{note} +The {guilabel}`Picture` feature can be added at a later stage. +::: + +(studio-models-modules-apps-suggested-features-lines)= + +### Lines + +Selecting {guilabel}`Lines`: adds to the {ref}`Form view ` a {ref}`Lines +field ` inside a {guilabel}`Tab` component. + +(studio-models-modules-apps-suggested-features-notes)= + +### Notes + +Selecting {guilabel}`Notes` adds to the {ref}`Form view ` an {ref}`Html +field ` using the full width of the form. + +(studio-models-modules-apps-suggested-features-monetary-value)= + +### Monetary value + +Selecting {guilabel}`Monetary value` adds to the {ref}`studio/views/general/form` and +{ref}`studio/views/multiple-records/list` views a {ref}`Monetary field +`. The {ref}`studio/views/reporting/graph` and +{ref}`studio/views/reporting/pivot` views are also activated. + +:::{note} +A *Currency* field is added and hidden from the view. +::: + +(studio-models-modules-apps-suggested-features-company)= + +### Company + +Selecting {guilabel}`Company` adds to the {ref}`studio/views/general/form` and +{ref}`studio/views/multiple-records/list` views a {ref}`Many2One field +` linked to the *Company* model. + +:::{note} +This is only useful if you work in a multi-company environment. +::: + +(studio-models-modules-apps-suggested-features-custom-sorting)= + +### Custom Sorting + +Selecting {guilabel}`Custom Sorting` adds to the {ref}`List view +` a drag handle icon to manually reorder records. + +```{eval-rst} +.. example:: + + .. image:: views/list-drag-handle.png + :align: center + :alt: Custom Sorting feature on the List view +``` + +(studio-models-modules-apps-suggested-features-chatter)= + +### Chatter + +Selecting {guilabel}`Chatter` adds to the {ref}`Form view ` Chatter +functionalities (sending messages, logging notes, and scheduling activities). + +:::{note} +The {guilabel}`Chatter` feature can be added at a later stage. +::: + +```{eval-rst} +.. example:: + + .. image:: models_modules_apps/chatter.png + :align: center + :alt: Chatter feature on the Form view +``` + +(studio-models-modules-apps-suggested-features-archiving)= + +### Archiving + +Selecting {guilabel}`Archiving` adds to the {ref}`studio/views/general/form` and +{ref}`studio/views/multiple-records/list` views the {guilabel}`Archive` action and hides archived +records from searches and views by default. + +(studio-export-import)= + +## Export and import customizations + +When you do any customization with Studio, a new module named {guilabel}`Studio customizations` is +added to your database. + +To export these customizations, go to {menuselection}`Main dashboard --> Studio --> Customizations +--> Export` to download a ZIP file containing all customizations. + +To import and install these customizations in another database, connect to the destination database +and go to {menuselection}`Main dashboard --> Studio --> Customizations --> Import`, then upload +the exported ZIP file before clicking on the {guilabel}`Import` button. + +:::{warning} +Before importing, make sure the destination database contains the same apps and modules as the +source database. Studio does not add the underlying modules as dependencies of the exported +module. +::: + diff --git a/content/applications/studio/pdf_reports.md b/content/applications/studio/pdf_reports.md new file mode 100644 index 000000000..6a5c72af8 --- /dev/null +++ b/content/applications/studio/pdf_reports.md @@ -0,0 +1,582 @@ +# PDF reports + +With Studio, you can {ref}`edit existing PDF reports ` (e.g., invoices, +quotations, etc.) or {ref}`create new ones `. + +(studio-pdf-reports-default-layout)= + +## Default layout + +The default layout of reports is managed outside Studio. Go to {menuselection}`Settings`, then, in +the {guilabel}`Companies` section, click {guilabel}`Configure Document Layout`. Layout settings are +company-specific but apply to all reports. + +:::{tip} +You can see how the different settings affect the report layout in the report preview on the +right, or download a sample invoice PDF by clicking {guilabel}`Download PDF Preview`. +::: + +Use the following settings: + +(studio-pdf-reports-default-layout-layout)= + +- {guilabel}`Layout`: Four layouts are available: + + ```{eval-rst} + .. tabs:: + + .. tab:: Light + + .. image:: pdf_reports/layout-light.png + :alt: Light report layout sample + + .. tab:: Boxed + + .. image:: pdf_reports/layout-boxed.png + :alt: Boxed report layout sample + + .. tab:: Bold + + .. image:: pdf_reports/layout-bold.png + :alt: Bold report layout sample + + .. tab:: Striped + + .. image:: pdf_reports/layout-striped.png + :alt: Striped report layout sample + ``` + +(studio-pdf-reports-default-layout-font)= + +- {guilabel}`Font`: Seven fonts are available: Lato, Roboto, Open Sans, Montserrat, Oswald, Raleway, + and Tajawal (which supports Arabic and Latin scripts). Go to the + [Google Fonts website](https://fonts.google.com/) to preview them. + +(studio-pdf-reports-default-layout-logo)= + +- {guilabel}`Company logo`: Click the {guilabel}`Edit` button to upload or change the logo. This + adds the logo to the company’s record on the *Company* model, which you can access by going to + {menuselection}`Settings` and then clicking {guilabel}`Update Info` in the {guilabel}`Companies` + section. + +(studio-pdf-reports-default-layout-colors)= + +- {guilabel}`Colors`: Change the primary and secondary colors used to structure reports. The default + colors are automatically generated based on the colors of the logo. + +(studio-pdf-reports-default-layout-background)= + +- {guilabel}`Layout background`: The following backgrounds are available: + + - {guilabel}`Blank`: nothing is displayed. + - {guilabel}`Geometric`: an image featuring geometric shapes is displayed in the background. + - {guilabel}`Custom`: upload a custom background image. + +(studio-pdf-reports-default-layout-tagline)= + +- {guilabel}`Company tagline`: This is displayed in the header of {ref}`external reports + `. You can add multiple lines of text. + +(studio-pdf-reports-default-layout-details)= + +- {guilabel}`Company details`: These are displayed in the header of {ref}`external reports + `. You can add multiple lines of text. + +(studio-pdf-reports-default-layout-footer)= + +- {guilabel}`Footer`: This text is used in the footer of {ref}`external reports + `. You can add multiple lines of text. You can also + edit the footer using the {ref}`report editor `. + +(studio-pdf-reports-default-layout-paper)= + +- {guilabel}`Paper format`: to define the default paper size of reports. You can select + {guilabel}`A4` (21 cm x 29.7 cm), {guilabel}`US Letter` (21.59 cm x 27.54 cm), or + {guilabel}`QR codes page`. This can also be defined for individual reports in the + {guilabel}`Paper format` field in {ref}`Studio `. + +(studio-pdf-reports-create)= + +## Creating new PDF reports + +To create a new report for a model, access the model, click the **Toggle Studio** button, then click +{guilabel}`Reports`. Click {guilabel}`New` and, in the popup window that opens, select the type of +report. This is solely used to determine what is displayed in the header and footer: + +(studio-pdf-reports-header-footer-external)= + +- {guilabel}`External`: + + - The header displays the company's {ref}`logo `, + {ref}`tagline `, and + {ref}`details `. + - The footer displays the values set in the + {ref}`Footer ` field and the page number. + +- {guilabel}`Internal`: The header displays the user's current date and time, + {guilabel}`Company Name`, and page number. There is no footer. + +- {guilabel}`Blank`: There is neither a header nor a footer. Click in the upper left corner of the + page to edit the report. + +Once you have created the report, you can start {ref}`editing it `. + +(studio-pdf-reports-edit)= + +## Editing PDF reports + +To access the reports available for a model, access the model (e.g., sales orders), click the +**Toggle Studio** button, then click {guilabel}`Reports`. Select an existing report to open it or +{ref}`create a new one `. + +:::{tip} +Alternatively, you can also open Studio, click {guilabel}`Reports`, and search for a specific +report or model. +::: + +:::{important} +It is strongly recommended to **duplicate** the standard report and perform changes in the +duplicated version. To duplicate a report, hover the mouse pointer on the top right corner +of the report, click the vertical ellipsis icon ({guilabel}`⋮`), and then select +{guilabel}`Duplicate`. + +```{image} pdf_reports/duplicate-report.png +:alt: Duplicating a PDF report +``` +::: + +### Options + +Once you've selected or created a report, you can use the options in the left part of the screen to: + +- Change the {guilabel}`Report name`. The new name is applied everywhere (in Studio, under + the {guilabel}`Print` button, and in the PDF file name). +- Modify the {guilabel}`Paper format`. If no value is selected, the format defined in the + {ref}`default layout ` is used. +- {guilabel}`Show in print menu`: to add the report in the {guilabel}`Print` menu available from the + record. +- {guilabel}`Reload from attachment`: to save the report as an attachment on the record the first + time it is generated and reload the original version of the report any subsequent time. This is + legally required for invoices and is mainly used in this case. +- {guilabel}`Limit visibility to groups`: to limit the availability of the PDF report to specific + {doc}`user groups <../general/users/access_rights>`. +- {guilabel}`Edit sources`: to modify the report directly in the {ref}`XML file + `. +- {guilabel}`Reset report`: to discard all changes made to the report and reset it to its standard + version. +- {guilabel}`Print preview`: to generate and download a report preview. + +### Report editor + +The report editor allows you to modify the formatting and contents of the report. + +:::{tip} +- You can {guilabel}`Undo` or {guilabel}`Redo` changes using the related buttons or the shortcuts + `CTRL Z` and `CTRL Y`. +- Changes are saved automatically when you leave the report or manually using the + {guilabel}`Save` button. +- You can reset the report to its standard version by clicking the {guilabel}`Reset report` button + in the left part of the screen. +::: + +:::{important} +Editing the header and footer of a report impacts all standard and custom reports. +::: + +#### Conditional blocks + +The dashed rectangles represent **conditional blocks** (*if/else* statements). These are used to +show/hide content based on specific conditions. Click on the block to view the conditions. + +```{image} pdf_reports/conditional-block-if.png +:alt: View conditions applied to a block. +``` + +Select a value to preview its corresponding output and edit it if necessary. + +```{image} pdf_reports/conditional-block-else.png +:alt: Preview the output of another condition. +``` + +:::{note} +Conditions can only be edited in {ref}`XML `. +::: + +#### Other content + +There are two types of text content in reports: + +- Static text, i.e., the text that's not highlighted in blue, which can be modified directly in the + editor. +- Dynamic text, i.e., the text that's highlighted in blue, which is replaced by field values when + the report is generated, e.g., the SO number or the quotation date. + +You can add content (e.g., fields, lists, tables, images, banners, etc.) to the report using +commands. Type `/` to open the {ref}`powerbox `, then type the command's +name or select it from the list. + +To add static text to the report, type the text where you want it. + +For more advanced changes, you can {ref}`edit the report in the XML directly +`. + +(studio-pdf-reports-add-field)= + +##### Add a field + +To add a field, type `/` and select the {guilabel}`Field` command. In the list that opens, select +or search for the field; click the right arrow next to the field name to access the list of related +fields if needed. Then, specify the default value and press `Enter`. + +```{image} pdf_reports/powerbox-field.png +:alt: Select a related field. +``` + +##### Add a data table + +Data tables are used to display {ref}`relational fields `. To add +a data table, type `/`, select the {guilabel}`Dynamic Table` command, and select the relation to be +displayed in the table. + +:::{note} +Only relations of type `one2many` or `many2many` can be displayed as data tables. +::: + +Once the table has been added, you can add columns using the table tools. Position the cursor on top +of the column, then click the purple rectangle and select an option. + +```{image} pdf_reports/table-add-column.png +:alt: Add a column in a dynamic table. +``` + +You can then insert the {ref}`field of your choice +` in the columns. The dialog box that opens shows the source object +for the field (e.g., the *Tag* model) and the list of available fields. + +```{image} pdf_reports/dynamic-table.png +:alt: List of available fields for the Tag model. +``` + +:::{note} +- The default row automatically iterates over the field's content, generating a row on the report + for each field value (e.g., one row per tag). You can add static content rows above or below + the generated rows using the table tools. +- You can also add data tables by {ref}`modifying the report's XML `. +::: + +##### Formatting + +To format text in the report, select it, then format it using the options in the +{ref}`knowledge/text-editor`. + +> ```{image} pdf_reports/text-editor.png +> :alt: Format text using the text editor. +> ``` + +(studio-pdf-reports-xml-editing)= + +### Editing the report's XML + +:::{warning} +Modifying the XML directly may result in report issues during {doc}`upgrades +<../../../administration/upgrade>`. If this happens, simply copy your changes from the old +database into your upgraded database. +::: + +To edit the report's XML, click {guilabel}`Edit sources` in the left pane. + +#### Examples + +```{eval-rst} +.. spoiler:: Modify a non-compliant table + + Sometimes, tables are not properly recognized as such due to complex structures. In those cases, + you can still modify them manually in the report XML. For example, with a sales order, you can + find the following structure in the XML (simplified for documentation purposes): + + .. code-block:: xml + + + + + + + + + + + + + + + + + + + +
NamePrice
+ +
+ + To modify a table, you must ensure that each row has the same number of data cells. For example, + in the case above, you need to add a cell in the header section (with e.g., the column title) + and another one in the body section with the field content (usually, with a `t-out` or + `t-field` directive). + + .. code-block:: xml + :emphasize-lines: 6,13 + + + + + + + + + + + + + +
Name PriceCategory
+ + +
+ + .. note:: + Cells can span multiple rows or columns. For more information, go to the + `Mozilla Developer Network website `_. + + For example, you can modify the **Quotation/Order** report to add a column to display the + product category in the main table: + + .. code-block:: xml + :emphasize-lines: 6,13 + + + + + + + + + + [...] + + + +
DescriptionProduct CategoryQuantityUnit Price
Bacon Burger + + 3 + units + + + .. image:: pdf_reports/XML-SO-product-category.png + :alt: Add a Product Category column in a SO. +``` + +```{eval-rst} +.. spoiler:: Add a data table + + To add a table in XML, you need to know the names of the fields and objects you wish to access + and display. As an example, let's add a table that details the tags on a sales order: + + .. code-block:: xml + + + + + + + + + + + + + + + + + + + +
IDName
+ +
+ + .. image:: pdf_reports/XML-data-table.png + :alt: Add a data table in XML + + .. note:: + When adding tables manually, style them using `Bootstrap classes + `_, like the `table` class included in the + example above. +``` + +```{eval-rst} +.. spoiler:: Conditional blocks + + If you want to show/hide content based on specific conditions, you can manually add `if/else` + control statements in the report XML. + + For example, if you want to hide a custom data table if there are no tags, you can use the `t-if` + attribute to define the condition, which is then evaluated as `True` or `False`. The table will + not be displayed if there are no tags in the quotation. + + .. code-block:: xml + :emphasize-lines: 2 + + + + + + + + + + + + + + + + + + + +
IDName
+ +
+ + If you want to display another block in case the `t-if` statement is evaluated as `False`, you + can specify it using the `t-else` statement. The `t-else` block must directly follow the `t-if` + block in the document structure. There is no need to specify any condition in the `t-else` + attribute. As an example, let's show a quick message explaining that there are no tags on the + quotation: + + .. code-block:: xml + :emphasize-lines: 22 + + + + + + + + + + + + + + + + + + + +
IDName
+ +
+
No tag present on this document.
+ + By using the `t-if/t-else` notation, the report editor recognizes that these sections are + mutually exclusive and should be displayed as conditional blocks: + + .. image:: pdf_reports/XML-condition-if.png + :alt: Output preview if there are tags. + + You can switch conditions using the editor to preview their output: + + .. image:: pdf_reports/XML-condition-else.png + :alt: Output preview if there are no tags. + + If you wish to have multiple options, you can also use `t-elif` directives to add intermediary + conditions. For example, this is how the title of sales order reports changes based on the + condition of the underlying document. + + .. code-block:: xml + +

+ Pro-Forma Invoice # + Quotation # + Order # + SO0000 +

+ + The title *Pro-Forma Invoice* is used depending on some contextual conditions. If these + conditions are not met and the state of the document is either `draft` or `sent`, then + *Quotation* is used. If none of those conditions are met, the report's title is *Order*. +``` + +```{eval-rst} +.. spoiler:: Images + + Working with images in a report can be challenging, as precise control over image size and + behavior is not always obvious. You can insert image fields using the report editor + (:ref:`by using the /Field command `), but inserting them in XML + using the `t-field` directive and accompanying `t-options` attributes provides better sizing and + positioning control. + + For example, the following code outputs the field `image_128` of the line's product as a + 64px-wide image (with an automatic height based on the image's aspect ratio). + + .. code-block:: xml + + + + The following options are available for image widgets: + + - `width`: width of the image, usually in pixels or CSS length units (e.g., `rem`) (leave empty + for auto-width). + - `height`: height of the image, usually in pixels or CSS length units (e.g., `rem`) (leave empty + for auto-height). + - `class`: CSS classes applied on the `img` tag; `Bootstrap classes + `_ are available. + - `alt`: alternative text of the image + - `style`: style attribute; it allows you to override styles more freely than with + `Bootstrap classes `_. + + These attributes must contain strings, i.e., text enclosed within quotes within quotes, e.g., + `t-options-width="'64px'"` (or, alternatively, a valid Python expression). + + .. note:: + The image widget cannot be used on an `img` tag. Instead, set the `t-field` directive on a + `span` (for inline content) or `div` (for block content) node. + + For example, let's add a column with the product image in the quotation table: + + .. code-block:: xml + :emphasize-lines: 4,14-20 + + + + + + + + + + [...] + + + + + + + ` on mobile. + +```xml +
+
+
+
+ +
+
+
+
+``` + diff --git a/content/developer/howtos/website_themes/navigation.md b/content/developer/howtos/website_themes/navigation.md new file mode 100644 index 000000000..046ef43df --- /dev/null +++ b/content/developer/howtos/website_themes/navigation.md @@ -0,0 +1,215 @@ +# Navigation + +You can easily modify the navigation with the Website Builder to fit your needs. + +In this chapter, you will learn how to: + +- Delete and create menu items. +- Create a dropdown menu. +- Create a mega menu. + +## Default + +Odoo automatically generates some basic menu items depending on the apps you installed. For example, +the Website app adds two items to the main menu. These items are linked to pages, which are also +automatically created. + +Delete default menu items. + +```{code-block} xml +:caption: '``/website_airproof/data/menu.xml``' + + + + + + +``` + +## Menu item + +**Declaration** + +```{code-block} xml +:caption: '``/website_airproof/data/menu.xml``' + + + About us + /about-us + + 1 + 10 + +``` + +```{eval-rst} +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + :widths: 20 80 + + * - Field + - Description + * - name + - Link text + * - url + - Value of the href attribute + * - parent_id + - The menu in which the item will be added. + * - website_id + - The website on which the item will be added. + * - sequence + - Defines the link's position in the top menu. +``` + +### New window + +Open the link's URL in a new tab. + +```xml + + + +``` + +### External Links + +Add a link to an external website. + +```xml + + https://www.odoo.com + +``` + +### Anchor + +Link to a specific section of a page. + +```xml + + /about-us#our-team + +``` + +## Dropdown menu + +**Declaration** + +```{code-block} xml +:caption: '``/website_airproof/data/menu.xml``' + + + Services + 1 + + ... + +``` + +Add an item to a dropdown menu. + +```xml + + Item 1 + /dropdown/item-1 + 1 + + ... + +``` + +```{eval-rst} +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + :widths: 20 80 + + * - Field + - Description + * - parent_id + - The dropdown in which the item will be added. +``` + +## Mega menu + +A mega menu is a dropdown menu with additional possibilities and not just a list of links. In a +mega menu, you can use any kind of content (text, images, icons, ...). + +**Declaration** + +```{code-block} xml +:caption: '``/website_airproof/data/menu.xml``' + + + Mega Menu + /mega-menu + + 1 + .. + + ... + + + + +``` + +```{eval-rst} +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + :widths: 20 80 + + * - Field + - Description + * - is_mega_menu + - Enable the mega menu feature. + * - mega_menu_classes + - Custom classes to be added to the main element + * - mega_menu_content + - The default content of the mega menu +``` + +### Custom template + +Create your own template and add it to the list. + +**Layout** + +```{code-block} xml +:caption: '``/website_airproof/views/website_templates.xml``' + + +``` + +**Option** + +Use the following code to add an option for your new custom mega menu on the Website Builder. + +```{code-block} xml +:caption: '``/website_airproof/data/presets.xml``' + + +``` + diff --git a/content/developer/howtos/website_themes/pages.md b/content/developer/howtos/website_themes/pages.md new file mode 100644 index 000000000..48fb33a0f --- /dev/null +++ b/content/developer/howtos/website_themes/pages.md @@ -0,0 +1,323 @@ +# Pages + +In this chapter, you will learn how to declare static pages. + +## Default pages + +In Odoo, websites come with a few default static pages (Home, Contact us, 404, ...). They are built +the following way. + +```xml + +``` + +Define the meta title. + +```xml + +``` + +Define the meta description. + +```xml + +``` + +Add a CSS class to the page. + +```xml + +``` + +Hide the header. + +```xml + +``` + +Hide the footer. + +```xml + +``` + +If needed, deactivate default pages. + +```{code-block} xml +:caption: '``/website_airproof/data/pages/home.xml``' + + + + +``` + +```{code-block} xml +:caption: '``/website_airproof/data/pages/contactus.xml``' + + + + +``` + +Alternatively, replace the default content of these pages using XPath. + +```{code-block} xml +:caption: '``/website_airproof/data/pages/404.xml``' + + +``` + +:::{seealso} +- [Odoo eLearning: Search Engine Optimization (SEO)](https://www.odoo.com/slides/slide/search-engine-optimization-seo-648) +- {doc}`Documentation on SEO <../../../applications/websites/website/pages/seo>` +::: + +## Theme pages + +You can add as many pages as you want to your website. Instead of defining a `
ImageDescriptionProduct CategoryQuantityUnit Price
+ + Bacon Burger + + The `t-options-width` attribute restricts the image width to 64 pixels, and the Bootstrap classes + used in `t-options-class` create a thumbnail-like border with rounded corners and a shadow. + + .. image:: pdf_reports/XML-images.png + :alt: Add a column with the product image in the quotation table. +``` + diff --git a/content/applications/studio/views.md b/content/applications/studio/views.md new file mode 100644 index 000000000..6acbf6520 --- /dev/null +++ b/content/applications/studio/views.md @@ -0,0 +1,410 @@ +# Views + +Views are the interface that allows displaying the data contained in a {doc}`model +`. One model can have several views, which are simply different ways to show +the same data. In Studio, views are organized into four categories: {ref}`general +`, {ref}`multiple records `, {ref}`timeline +`, and {ref}`reporting `. + +::::{tip} +- To change the default view of a model, {ref}`access Studio `, go to + {guilabel}`Views`, click the {icon}`fa-ellipsis-v` ({guilabel}`ellipsis`) icon next to the + desired view, and click {guilabel}`Set as Default`. + +- You can modify views using the built-in XML editor: Activate the {ref}`Developer mode + `, go to the view you want to edit, select the {guilabel}`View` tab, and + click {guilabel}` XML`. + + :::{important} + If you are editing a view using the XML editor, avoid making changes directly to standard + and inherited views, as these would be reset and lost during updates or module upgrades. + Always make sure you select the right Studio inherited views: When you modify a + view in Studio by dragging and dropping a new field, for example, a specific Studio + inherited view and its corresponding XPath, which defines the modified part of the view, are + automatically generated. + ::: +:::: + +(studio-views-general)= + +## General views + +:::{note} +The settings described below are found under the view's {guilabel}`View` tab unless specified +otherwise. +::: + +(studio-views-general-form)= + +### Form + +The {guilabel}`Form` {icon}`fa-address-card` view is used when creating and editing records, such as +contacts, sales orders, products, etc. + +- To structure a form, drag and drop the {guilabel}`Tabs and Columns` element found under the + {guilabel}`+ Add` tab. + +- To prevent users from creating, editing, or deleting records, untick {guilabel}`Can Create`, + {guilabel}`Can Edit`, or {guilabel}`Can Delete`. + +- To add a button, click {guilabel}`Add a button` at the top of the form, enter a {guilabel}`Label`, + and select the button's action: + + - {guilabel}`Run a Server Action`: select the {ref}`server action ` to + be executed from the dropdown list; + - {guilabel}`Call a method`: specify an existing Python method already defined in Odoo. + +- To change a button's label or style, click the button and edit its {guilabel}`Label` or + {guilabel}`Class` (either `btn-primary` or `btn-secondary`) in the {guilabel}`Properties` tab. + +- To add a smart button, click the {icon}`fa-plus-square` ({guilabel}`plus`) icon in the top-right + corner of the form. Enter a {guilabel}`Label`, choose an {guilabel}`Icon`, and select a + {ref}`related field `. + +```{eval-rst} +.. example:: + + .. image:: views/form-sales-order.png + :alt: Sales order model's Form view +``` + +(studio-views-general-activity)= + +### Activity + +The {guilabel}`Activity` {icon}`fa-clock-o` view is used to schedule and have an overview of +activities (emails, calls, etc.) linked to records. + +:::{note} +This view can only be modified within Studio by editing the XML code. +::: + +```{eval-rst} +.. example:: + + .. image:: views/activity-lead-opportunity.png + :alt: Lead/Opportunity model's Activity view +``` + +(studio-views-general-search)= + +### Search + +The {guilabel}`Search` {icon}`oi-search` view is added on top of other views to filter, group, and +search records. + +- To add custom {guilabel}`Filters` and structure them using {guilabel}`Separators`, go to the + {guilabel}`+ Add` tab and drag and drop them under {guilabel}`Filters`. +- To add an existing field under the search dropdown menu, go to the {guilabel}`+ Add` tab and + drag and drop it under {guilabel}`Autocompletion Fields`. + +```{eval-rst} +.. example:: + + .. image:: views/search-project-kanban.png + :alt: Project model's Search view on the Kanban view +``` + +(studio-views-multiple-records)= + +## Multiple records views + +:::{note} +The settings described below are found under the view's {guilabel}`View` tab unless specified +otherwise. +::: + +(studio-views-multiple-records-kanban)= + +### Kanban + +The {guilabel}`Kanban` {icon}`oi-view-kanban` view is often used to support business flows by moving +records across stages or as an alternative way to display records inside *cards*. + +:::{note} +If the {guilabel}`Kanban` view exists, it is used by default to display data on mobile devices +instead of the {ref}`List view `. +::: + +- To prevent users from creating new records, untick {guilabel}`Can Create`. +- To create records directly within the view, in a minimalistic form, enable {guilabel}`Quick + Create`. +- To set a default grouping for records, select a field under {guilabel}`Default Group By`. + +```{eval-rst} +.. example:: + + .. image:: views/kanban-project.png + :alt: Project model's Kanban view +``` + +(studio-views-multiple-records-list)= + +### List + +The {guilabel}`List` {icon}`oi-view-list` view is used to overview many records at once, look for +records, and edit simple records. + +- To prevent users from creating, editing, or deleting records, untick {guilabel}`Can Create`, + {guilabel}`Can Edit`, or {guilabel}`Can Delete`. + +- To create and edit records directly within the view, select either {guilabel}`Add record at the + bottom`, {guilabel}`Add record on top` or {guilabel}`Open form view` under + {guilabel}`When Creating Record`. + + :::{note} + This prevents users from opening records in {ref}`Form view ` from the + {guilabel}`List` view. + ::: + +- To edit several records at once, tick {guilabel}`Enable Mass Editing`. + +- To change the way records are sorted by default, select a field under {guilabel}`Sort By`. + +- To set a default grouping for records, select a field under {guilabel}`Default Group By`. + +- To add a button, click {guilabel}`Add a button` at the top of the list, enter a {guilabel}`Label`, + and select the button's action: + + - {guilabel}`Run a Server Action`: select the {ref}`server action ` to + be executed from the dropdown list; + - {guilabel}`Call a method`: specify an existing Python method already defined in Odoo. + +:::{tip} +To add a {icon}`oi-draggable` ({guilabel}`drag handle`) icon to reorder records manually, add an +{ref}`Integer field ` with the {guilabel}`Handle` widget. + +```{image} views/list-drag-handle.png +:alt: Drag handle icon enabling to sort records manually in List view +``` +::: + +```{eval-rst} +.. example:: + + .. image:: views/list-sales-order.png + :alt: Sales order model's List view +``` + +(studio-views-multiple-records-map)= + +### Map + +The {guilabel}`Map` {icon}`fa-map-marker` view is used to display records on a map. For example, it +is used in the Field Service app to plan an itinerary between different tasks. + +:::{note} +A {ref}`Many2One field ` linked to the *Contact* model +is required to activate the view, as the contact address is used to position records on the map. +::: + +- To select which kind of contact should be used on the map, select it under {guilabel}`Contact + Field`. +- To hide the name or the address of the record, tick {guilabel}`Hide Name` or {guilabel}`Hide + Address`. +- To add information from other fields, select them under {guilabel}`Additional Fields`. +- To have a route suggested between the different records, tick {guilabel}`Enable Routing` and + select which field should be used to sort records for the routing. + +```{eval-rst} +.. example:: + + .. image:: views/map-task.png + :alt: Task model's Map view +``` + +(studio-views-timeline)= + +## Timeline views + +:::{note} +- When you first activate one of the timeline views, you need to select which {ref}`Date + ` or {ref}`Date & Time + ` fields on your model should be used to define when the + records start and stop in order to display them on the view. You can modify the + {guilabel}`Start Date Field` and {guilabel}`Stop Date Field` after activating the view. +- The settings described below are found under the view's {guilabel}`View` tab unless specified + otherwise. +::: + +(studio-views-timeline-calendar)= + +### Calendar + +The {guilabel}`Calendar` {icon}`fa-calendar` view is used to overview and manage records inside a +calendar. + +- To create records directly within the view instead of opening the {ref}`Form view + `, enable {guilabel}`Quick Create`. + + :::{note} + This only works on specific models that can be *quick-created* using only a *name*. However, + most models do not support quick creation and open the {guilabel}`Form` view to fill in the + required fields. + ::: + +- To color records on the calendar, select a field under {guilabel}`Color`. All the records sharing + the same value for that field are displayed using the same color. + + :::{note} + As the number of colors is limited, the same color can end up being assigned to different + values. + ::: + +- To display events lasting the whole day at the top of the calendar, select a {ref}`Checkbox field + ` that specifies if the event lasts the whole day. + +- To choose the default time scale used to display events, select {guilabel}`Day`, {guilabel}`Week`, + {guilabel}`Month`, or {guilabel}`Year` under {guilabel}`Default Display Mode`. + +:::{note} +You can also use a {guilabel}`Delay Field` to display the duration of the event in hours by +selecting a {ref}`Decimal ` or {ref}`Integer +` field on the model which specifies the duration of the +event. However, if you set an {guilabel}`End Date Field`, the {guilabel}`Delay Field` will not be +taken into account. +::: + +```{eval-rst} +.. example:: + + .. image:: views/calendar-event.png + :alt: Calendar Event model's Calendar view +``` + +(studio-views-timeline-cohort)= + +### Cohort + +The {guilabel}`Cohort` {icon}`oi-view-cohort` view is used to examine the life cycle of records over +a time period. For example, it is used in the Subscriptions app to view the subscriptions' retention +rate. + +- To display a measure (i.e., the aggregated value of a given field) by default on the view, select + a {guilabel}`Measure Field`. +- To choose which time interval is used by default to group results, select {guilabel}`Day`, + {guilabel}`Week`, {guilabel}`Month`, or {guilabel}`Year` under {guilabel}`Interval`. +- To change the cohort {guilabel}`Mode`, select either {guilabel}`Retention` {dfn}`the percentage + of records staying over a period of time, it starts at 100% and decreases with time` or + {guilabel}`Churn` {dfn}`the percentage of records moving out over a period of time - it starts at + 0% and increases with time`. +- To change the way the {guilabel}`Timeline` (i.e., the columns) progresses, select either + {guilabel}`Forward` (from 0 to +15) or {guilabel}`Backward` (from -15 to 0). For most purposes, + the {guilabel}`Forward` timeline is used. + +```{eval-rst} +.. example:: + + .. image:: views/cohort-subscription.png + :alt: Subscription model's Cohort view +``` + +(studio-views-timeline-gantt)= + +### Gantt + +The {guilabel}`Gantt` {icon}`fa-tasks` view is used to forecast and examine the overall progress of +records. Records are represented by a bar under a time scale. + +- To prevent users from creating or editing records, untick {guilabel}`Can Create` or {guilabel}`Can + Edit`. + +- To fill cells in gray whenever a record should not be created there (e.g., on weekends for + employees), tick {guilabel}`Display Unavailability`. + + :::{note} + The underlying model must support this feature, and support for it cannot be added using + Studio. It is supported for the Project, Time Off, Planning, and Manufacturing apps. + ::: + +- To show a total row at the bottom, tick {guilabel}`Display Total row`. + +- To collapse multiple records in a single row, tick {guilabel}`Collapse First Level`. + +- To choose which way records are grouped by default on rows (e.g., per employee or project), select + a field under {guilabel}`Default Group by`. + +- To define a default time scale to view records, select {guilabel}`Day`, {guilabel}`Week`, + {guilabel}`Month`, or {guilabel}`Year` under {guilabel}`Default Scale`. + +- To color records on the view, select a field under {guilabel}`Color`. All the records sharing the + same value for that field are displayed using the same color. + + :::{note} + As the number of colors is limited, the same color can be assigned to different values. + ::: + +- To specify with which degree of precision each time scale should be divided by, select + {guilabel}`Quarter Hour`, {guilabel}`Half Hour`, or {guilabel}`Hour` under {guilabel}`Day + Precision`, {guilabel}`Half Day` or {guilabel}`Day` under {guilabel}`Week Precision`, and + {guilabel}`Month Precision`. + +```{eval-rst} +.. example:: + + .. image:: views/gantt-planning.png + :alt: Planning Shift model's Gantt view +``` + +(studio-views-reporting)= + +## Reporting views + +:::{note} +The settings described below are found under the view's {guilabel}`View` tab unless specified +otherwise. +::: + +(studio-views-reporting-pivot)= + +### Pivot + +The {guilabel}`Pivot` {icon}`oi-view-pivot` view is used to explore and analyze the data contained +in records in an interactive manner. It is especially useful to aggregate numeric data, create +categories, and drill down the data by expanding and collapsing different levels of data. + +- To access all records whose data is aggregated under a cell, tick {guilabel}`Access records from + cell`. +- To divide the data into different categories, select field(s) under {guilabel}`Column grouping`, + {guilabel}`Row grouping - First level`, or {guilabel}`Row grouping - Second level`. +- To add different types of data to be measured using the view, select a field under + {guilabel}`Measures`. +- To display a count of records that made up the aggregated data in a cell, tick {guilabel}`Display + count`. + +```{eval-rst} +.. example:: + + .. image:: views/pivot-purchase-report.png + :alt: Purchase Report model's Pivot view +``` + +(studio-views-reporting-graph)= + +### Graph + +The {guilabel}`Graph` {icon}`fa-area-chart` view is used to showcase data from records in a bar, +line, or pie chart. + +- To change the default chart, select {guilabel}`Bar`, {guilabel}`Line`, or {guilabel}`Pie` under + {guilabel}`Type`. +- To choose a default data dimension (category), select a field under {guilabel}`First dimension` + and, if needed, another under {guilabel}`Second dimension`. +- To select a default type of data to be measured using the view, select a field under + {guilabel}`Measure`. +- *For Bar and Line charts only*: To sort the different data categories by their value, select + {guilabel}`Ascending` (from lowest to highest value) or {guilabel}`Descending` (from highest to + lowest) under {guilabel}`Sorting`. +- *For Bar and Pie charts only*: To access all records whose data is aggregated under a data + category on the chart, tick {guilabel}`Access records from graph`. +- *For Bar charts only*: When using two data dimensions (categories), display the two columns on top + of each other by default by ticking {guilabel}`Stacked graph`. + +```{eval-rst} +.. example:: + + .. image:: views/graph-sales-report.png + :alt: Sales Analysis Report model's Bar chart on Graph view + :scale: 75% +``` + diff --git a/content/applications/websites.md b/content/applications/websites.md new file mode 100644 index 000000000..c69f4a86c --- /dev/null +++ b/content/applications/websites.md @@ -0,0 +1,15 @@ +--- +nosearch: true +--- + +# Websites + +```{toctree} +websites/website +websites/ecommerce +websites/elearning +websites/forum +websites/blog +websites/livechat +``` + diff --git a/content/applications/websites/blog.md b/content/applications/websites/blog.md new file mode 100644 index 000000000..a20c92347 --- /dev/null +++ b/content/applications/websites/blog.md @@ -0,0 +1,131 @@ +# Blog + +**Odoo Blog** allows you to create and manage blog posts on your website to engage your audience and +build a community. + +:::{tip} +If the Blog module is not yet installed, click {guilabel}`+New` on the website builder, select +{guilabel}`Blog Post`, and click {guilabel}`Install`. +::: + +## Creating a blog + +To create or edit a blog, go to {menuselection}`Website --> Configuration --> Blogs: Blogs`. Click +{guilabel}`New`, and enter the {guilabel}`Blog Name` and the {guilabel}`Blog Subtitle`. + +The {guilabel}`Blog` menu item is added to your website's menu the first time you create a blog and +gathers all your blogs. + +## Adding a blog post + +Go to your website, click {guilabel}`+New` in the top-right corner, and select +{guilabel}`Blog Post`. In the pop-up, **select the blog** where the post should appear, write the +post's {guilabel}`Title`, and {guilabel}`Save`. You can then write the post's content and customize +the page using the website builder. + +:::{tip} +- Illustrate your articles with copyright-free images from {doc}`Unsplash + `. +- Type `/` in the text editor to format and add elements to your text. +::: + +:::{important} +Don't forget to toggle the {guilabel}`Unpublished` switch in the top-right corner to publish +your post. +::: + +## Using tags + +Tags let visitors filter all posts sharing the same tag. By default, they are displayed at the +bottom of posts, but can also be displayed on the blog's main page. To do so, click +{menuselection}`Edit --> Customize` and enable the {guilabel}`Sidebar`. By default, the sidebar's +{guilabel}`Tags List` is enabled. + +To create a tag, go to {menuselection}`Website --> Configuration --> Blogs: Tags` and click +{guilabel}`New`. Fill in the: + +- {guilabel}`Name` +- {guilabel}`Category`: tag categories let you group tags displayed on the sidebar by theme. +- {guilabel}`Used in`: to apply the tag to existing blog posts, click {guilabel}`Add a line`, + select the posts, and click {guilabel}`Select`. + +You can add and create tags directly from posts by clicking {menuselection}`Edit --> Customize` and +select the post's cover. Under {guilabel}`Tags`, click {guilabel}`Choose a record...`, and select +or create a tag. + +```{image} blog/create-tag.png +:alt: Adding a tag to a blog post +``` + +:::{note} +To manage tag categories, go to {menuselection}`Website --> Configuration --> Blogs: Tag +Categories`. +::: + +## Customizing blog homepages + +Customize the content of blog homepages by opening a blog homepage and clicking {menuselection}`Edit +--> Customize`. + +:::{note} +Settings apply to **all** blogs homepages. +::: + +{guilabel}`Top Banner`: {guilabel}`Name/Latest Post` displays the title of the latest post on the +top banner, while {guilabel}`Drop Zone for Building Blocks` removes the top banner and lets you use +any building block instead. + +{guilabel}`Layout`: organizes posts as a {guilabel}`Grid` or {guilabel}`List`. + +- {guilabel}`Cards`: adds a *card* effect. +- {guilabel}`Increase Readability`: improves the text's readability. + +{guilabel}`Sidebar`: displays a sidebar containing an {guilabel}`About us` section. + +- {guilabel}`Archives`: allows visitors to select a month and filter all posts created during that + month. +- {guilabel}`Follow Us`: displays links to your social media networks. They can be configured using + the Social Media building block somewhere on your website. +- {guilabel}`Tags List`: displays all tags related to a blog. Visitors can select a tag to filter + all related posts. + +{guilabel}`Posts List`: {guilabel}`Cover` displays the posts' images, and {guilabel}`No Cover` hides +them. + +- {guilabel}`Author`: displays the posts' authors. +- {guilabel}`Comments/Views Stats`: displays the posts' number of comments and views. +- {guilabel}`Teaser & Tags`: displays the posts' first sentences and tags. + +## Customizing blog posts + +Customize posts by opening a blog post and clicking {menuselection}`Edit --> Customize`. + +:::{note} +Settings apply to **all** posts. +::: + +{guilabel}`Layout`: {guilabel}`Title Inside Cover` displays the title inside the cover image, and +{guilabel}`Title above Cover` displays it above. + +- {guilabel}`Increase Readability`: increases the text's readability. + +{guilabel}`Sidebar`: displays the {guilabel}`Sidebar` and additional options: + +- {guilabel}`Archive`: allows visitors to select a month and filter all posts created during that + month. +- {guilabel}`Author`: displays the post's author and creation date. +- {guilabel}`Blog List`: displays links to all your blogs. +- {guilabel}`Share Links`: displays share buttons to several social networks. +- {guilabel}`Tags`: displays the post's tags. + +{guilabel}`Breadcrumb`: displays the path to the post. + +{guilabel}`Bottom`: {guilabel}`Next Article` displays the next post at the bottom, and +{guilabel}`Comments` enable visitors to comment on the post. + +{guilabel}`Select To Tweet`: visitors are offered to tweet the text they select. + +:::{tip} +Use {ref}`Plausible ` to keep track of the traffic on your blog. +::: + diff --git a/content/applications/websites/ecommerce.md b/content/applications/websites/ecommerce.md new file mode 100644 index 000000000..418cb24e8 --- /dev/null +++ b/content/applications/websites/ecommerce.md @@ -0,0 +1,32 @@ +--- +hide-page-toc: true +nosearch: true +show-content: true +show-toc: true +--- + +# eCommerce + +Run a modern open-source online store with Odoo eCommerce. Learn how to sell online, promote +products and increase your average cart sizes. + +:::{important} +Odoo offers a {ref}`free custom domain name ` to all Odoo Online databases +for one year. Visitors can then access your website with an address such as `www.example.com` +rather than the default `example.odoo.com`. +::: + +:::{seealso} +- {doc}`Website Documentation ` +- [Odoo Tutorials: Website](https://www.odoo.com/slides/website-25) +- [Odoo Tutorials: eCommerce](https://www.odoo.com/slides/ecommerce-26) +::: + +```{toctree} +:titlesonly: true + +ecommerce/products +ecommerce/checkout_payment_shipping +ecommerce/ecommerce_management +``` + diff --git a/content/applications/websites/ecommerce/checkout_payment_shipping.md b/content/applications/websites/ecommerce/checkout_payment_shipping.md new file mode 100644 index 000000000..426fde1bf --- /dev/null +++ b/content/applications/websites/ecommerce/checkout_payment_shipping.md @@ -0,0 +1,15 @@ +--- +nosearch: true +--- + +# Checkout, payment, and delivery + +```{toctree} +:titlesonly: true + +checkout_payment_shipping/cart +checkout_payment_shipping/checkout +checkout_payment_shipping/shipping +checkout_payment_shipping/payments +``` + diff --git a/content/applications/websites/ecommerce/checkout_payment_shipping/cart.md b/content/applications/websites/ecommerce/checkout_payment_shipping/cart.md new file mode 100644 index 000000000..a07932ffe --- /dev/null +++ b/content/applications/websites/ecommerce/checkout_payment_shipping/cart.md @@ -0,0 +1,115 @@ +# Add to cart + +The {guilabel}`Add to Cart` button can be customized in multiple ways. You can: + +- Choose on which page customers go after clicking the 'Add to Cart' button; +- Hide the 'Add to Cart' button to prevent sales; +- Add a 'Buy Now' button to skip the cart step and lead customers straight to checkout; +- Create additional 'Add to Cart / Buy Now' buttons; +- Add an 'Order Again' button to the customer portal. + +:::{seealso} +{doc}`checkout` +::: + +(ecommerce-cart-action-customization)= + +## 'Add to Cart' action customization + +When customers click on the {guilabel}`Add to Cart` button, the product is added to their cart, and +customers remain **by default** on the product's page. However, customers can either immediately be +**redirected** to their cart, or given the choice on what to do through a **dialog box**. + +To change the default behavior, go to {menuselection}`Website --> Configuration --> Settings`. Under +the {guilabel}`Shop - Checkout Process` section, look for {guilabel}`Add to Cart` and select one of +the options. + +:::{note} +If a product has {doc}`optional products <../products/cross_upselling>`, the **dialog +box** will always appear. +::: + +:::{seealso} +{doc}`../products/catalog` +::: + +(cart-prevent-sale)= + +## Replace 'Add to Cart' button by 'Contact Us' button + +You can replace the 'Add to Cart' button with a 'Contact Us' button which redirects users to the URL +of your choice. + +:::{note} +Hiding the {guilabel}`Add to Cart` button is often used by B2B eCommerces that need to restrict +purchases only to {ref}`customers with an account `, but still want to +display an online product catalog for those without. +::: + +To do so, go to {menuselection}`Website --> Configuration --> Settings --> Shop - Products` and tick +{guilabel}`Prevent Sale of Zero Priced Product`. This creates a new {guilabel}`Button url` field +where you can enter the **redirect URL** to be used. Then, set the price of the product to `0.00` +either from the **product's template**, or from a +{doc}`pricelist <../../../sales/sales/products_prices/prices/pricing>`. + +```{image} cart/cart-contactus.png +:align: center +:alt: Contact us button on product page +``` + +:::{note} +The 'Contact Us' button and '*Not Available For Sale*' text can both be modified using the +**website builder** on the product's page ({menuselection}`Edit --> Customize`) by clicking on +them. +::: + +## Customizable 'Add to Cart' button + +You can also create a customizable 'Add to Cart' button and link it to a specific product. The +**customized button** can be added on any page of the website as an **inner content** building +block, and is an *additional* button to the regular {guilabel}`Add to Cart` button. + +To add it, go on the {guilabel}`Shop` page of your choice, click {menuselection}`Edit --> Blocks` +and place the building block. Once placed, you have the following options: + +- {guilabel}`Product`: select the product to link the button with. Selecting a product renders the + {guilabel}`Action` field available; +- {guilabel}`Action`: choose if the button should {guilabel}`Add to Cart` or {guilabel}`Buy Now` + (instant checkout). + +```{image} cart/cart-add.png +:align: center +:alt: Customizable 'Add to Cart' button +``` + +(ecommerce-cart-buy-now)= + +## 'Buy Now' button + +You can enable the {guilabel}`Buy Now` button to take customers directly to the {ref}`review order +` step instead of adding the product to the +cart. This button is an *additional* option and does not replace the {guilabel}`Add to Cart` button. +To do so, go to {menuselection}`Website --> Configuration --> Settings`, scroll to the +{guilabel}`Shop—Checkout Process` section, enable {guilabel}`Buy Now`, and {guilabel}`Save`. + +:::{tip} +Alternatively, you can enable the {guilabel}`Buy Now` button directly from a product page by +clicking {guilabel}`Edit` and navigating to the {guilabel}`Customize` tab. +::: + +```{image} cart/cart-buy-now.png +:alt: Buy Now button +``` + +## Re-order from portal + +Customers have the possibility to **re-order** items from **previous sales orders** on the customer +portal. To do so, go to {menuselection}`Website --> Configuration --> Settings --> Shop - Checkout +Process` and enable {guilabel}`Re-order From Portal`. Customers can find the {guilabel}`Order Again` +button on their **sales order** from the **customer portal**. + +```{image} cart/cart-reorder.png +:align: center +:alt: Re-order button +``` + diff --git a/content/applications/websites/ecommerce/checkout_payment_shipping/checkout.md b/content/applications/websites/ecommerce/checkout_payment_shipping/checkout.md new file mode 100644 index 000000000..56a797baa --- /dev/null +++ b/content/applications/websites/ecommerce/checkout_payment_shipping/checkout.md @@ -0,0 +1,174 @@ +# Checkout + +Once customers have added their desired products to the cart, they can access it by clicking the +{icon}`fa-shopping-cart` button in the header to start the checkout process. In Odoo eCommerce, this +process consists of sequential {ref}`steps `, some of which support +additional features. The related checkout pages can be {ref}`customized +` using the website editor. + +(ecommerce-checkout-policy)= + +## Checkout policy + +To allow customers to checkout as guests or force them to sign in/create an account, go to +{menuselection}`Website --> Configuration --> Settings`, scroll down to the +{guilabel}`Shop - Checkout Process` section, and configure the {guilabel}`Sign in/up at checkout` +setting. The following options are available: + +- {guilabel}`Optional`: Customers can check out as guests and register later via the order + confirmation email to track their order. +- {guilabel}`Disabled (buy as guest)`: Customers can checkout as guests without creating an account. +- {guilabel}`Mandatory (no guest checkout)`: Customers must sign in or create an account at + the {ref}`Review Order ` step to complete their purchase. + +### B2B access management + +To restrict checkout to selected B2B customers, follow these steps: + +1. Go to {menuselection}`Website --> Configuration --> Settings`, and in the + {guilabel}`Shop - Checkout Process` section, enable the + {ref}`Mandatory (no guest checkout) ` option. +2. Scroll down to the {guilabel}`Privacy` section, go to {guilabel}`Customer Account`, and select + {guilabel}`On invitation`. +3. Go to {menuselection}`Website --> eCommerce --> Customers`, switch to the {guilabel}`List` view, + and select the customers you wish to grant access to your + {doc}`portal <../../../general/users/portal>`. +4. Click the {icon}`fa-cog` {guilabel}`Actions` button, then {guilabel}`Grant portal access`. +5. Review the selected customers in the {guilabel}`Portal Access Management` pop-up and click + {guilabel}`Grant Access`. + +Once done, the relevant customers receive an email confirming their account creation, including +instructions on setting a password and activating their account. + +:::{note} +- You can revoke access or re-invite a customer using the related buttons in the + {guilabel}`Portal Access Management` pop-up. +- Users can only have one {doc}`portal access <../../../general/users/portal>` per email. +- Settings are website-specific, so you could set up a B2C website that allows guest checkout and + B2B website with mandatory sign-in. +::: + +:::{seealso} +- {doc}`Customer accounts <../ecommerce_management/customer_accounts>` +- {doc}`Portal access <../../../general/users/portal>` +::: + +(ecommerce-checkout-steps)= + +## Checkout steps + +During the checkout process, customers are taken through the following steps: + +- {ref}`Review order ` +- {ref}`Delivery ` +- {ref}`Extra info (if enabled) ` +- {ref}`Payment ` +- {ref}`Order confirmation ` + +(ecommerce-checkout-customize-steps)= + +Each step can be customized using the website editor: Click {guilabel}`Edit` to add +{doc}`building blocks <../../website/web_design/building_blocks>` from the {guilabel}`Blocks` tab or +open to the {guilabel}`Customize` tab to enable various checkout options. + +:::{note} +Content added through building blocks is **specific** to each step. +::: + +(ecommerce-checkout-review-order)= + +### Review order + +The {guilabel}`Review Order` step allows customers to see the items they added to their cart, adjust +quantities, or {guilabel}`Remove` products. Information related to the product prices and taxes +applied are also displayed. Customers can then click the {guilabel}`Checkout` button to continue to +the {ref}`Delivery ` step. + +Open the website editor to {ref}`enable ` checkout options such +as: + +- {guilabel}`Suggested Accessories`: to showcase {ref}`accessory products + `; +- {guilabel}`Promo Code`: to allow customers to redeem {ref}`gift cards ` + or apply {doc}`discount codes <../../../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. + +:::{note} +- If a {doc}`fiscal position ` is detected automatically, + the product tax is determined based on the customer's IP address. +- If the installed {doc}`payment provider ` supports + {ref}`express checkout `, a dedicated button is displayed, + allowing customers to go straight from the cart to the confirmation page without filling out + the contact form. +::: + +(ecommerce-checkout-delivery)= + +### Delivery + +Once they have reviewed their order: + +- Unsigned-in customers are prompted to {guilabel}`Sign in` or enter their + {guilabel}`Email address`, along with their delivery address and phone details; +- Signed-in customers can select the appropriate {guilabel}`Delivery address`. + +They can then {doc}`choose a delivery method `, select or enter their {guilabel}`Billing +Address` (or toggle the {guilabel}`Same as delivery address` switch if the billing and delivery +addresses are identical), and click {guilabel}`Confirm` to proceed to the next step. + +:::{tip} +For B2B customers, you can also {ref}`enable ` optional +{guilabel}`VAT` and {guilabel}`Company name` fields by toggling the {guilabel}`Show B2B Fields` +option in the website editor. +::: + +(ecommerce-checkout-extra-step)= + +### Extra info + +You can add an {guilabel}`Extra Info` step in the checkout process to collect additional +customer information through an online form, which is then included in the {ref}`sales order +`. To do so {ref}`enable ` the {guilabel}`Extra +Step` option in the website editor. The form can be {ref}`customized ` +as needed. + +:::{tip} +Alternatively, go to {menuselection}`Website --> Configuration --> Settings`, scroll to the +{guilabel}`Shop - Checkout Process` section, enable {guilabel}`Extra Step During Checkout`, and +click {guilabel}`Save`. Click {icon}`fa-arrow-right` {guilabel}`Configure Form` to customize the +form. +::: + +(ecommerce-checkout-payment)= + +### Payment + +At the {guilabel}`Payment` step, customers {guilabel}`Choose a payment method`, enter their +payment details, and click {guilabel}`Pay now`. + +You can require customers to agree to your {doc}`terms and conditions +` before payment. To +{ref}`enable ` this option, go to the website editor and toggle +the {guilabel}`Accept Terms & Conditions` feature. + +:::{tip} +Enable the {ref}`developer mode ` and click the {icon}`fa-bug` {guilabel}`bug` +icon to display an {ref}`availability ` report for payment +providers and payment methods, which helps diagnose potential availability issues on the payment +form. +::: + +(ecommerce-checkout-order-confirmation)= + +### Order confirmation + +The final step of the checkout process is the {guilabel}`Order confirmation`, which provides a +summary of the customer's purchase details. + +:::{seealso} +{doc}`Order handling <../../ecommerce/ecommerce_management/order_handling>` +::: + diff --git a/content/applications/websites/ecommerce/checkout_payment_shipping/payments.md b/content/applications/websites/ecommerce/checkout_payment_shipping/payments.md new file mode 100644 index 000000000..838caa7af --- /dev/null +++ b/content/applications/websites/ecommerce/checkout_payment_shipping/payments.md @@ -0,0 +1,54 @@ +# Payment providers + +Odoo supports a multitude of online +{doc}`payment providers ` for your website, allowing your +customers to pay with their preferred payment methods. + +:::{seealso} +- {doc}`/applications/sales/sales/products_prices/ewallets_giftcards` +- {doc}`../checkout_payment_shipping/checkout` +::: + +## Configuration + +To set up payment providers on the eCommerce app, go to {menuselection}`Website --> Configuration +--> Payment Providers`. From here, {guilabel}`Activate` the payment providers you wish to have +available on your shop, and configure them according to your needs. + +Alternatively, you can access **payment providers** via {menuselection}`Website --> Configuration +--> Settings`. In the {guilabel}`Shop - Payment` section, you can {guilabel}`Configure SEPA Direct +Debit` if you wish to use it, as well as {guilabel}`View other providers`. If you use the +{guilabel}`Authorize.net` payment provider, the +{ref}`Payment Capture Method ` can be configured in that same menu. + +If you are using {doc}`/applications/finance/payment_providers/paypal`, you can also enable and +configure it here. + +### Checkout payment options + +Once activated, customers can choose the payment provider of their choice during the **checkout +process**, at the {guilabel}`Confirm Order` step. + +```{image} payments/payments-checkout.png +:align: center +:alt: Payment provider selection at checkout +``` + +## eWallets and gift cards + +When checking out, customers can pay with an eWallet or gift cards. To enable these, go to +{menuselection}`Website --> Configuration --> Settings`, and in the {guilabel}`Shop-Products` +section, enable {menuselection}`Discounts, Loyalty & Gift Card`. + +Once enabled, customers can enter their gift card **code** or pay with their eWallet at the checkout +step. + +```{image} payments/payments-ewallets-giftcards.png +:align: center +:alt: Enter gift card code to process checkout +``` + +:::{seealso} +{doc}`/applications/sales/sales/products_prices/ewallets_giftcards` +::: + diff --git a/content/applications/websites/ecommerce/checkout_payment_shipping/shipping.md b/content/applications/websites/ecommerce/checkout_payment_shipping/shipping.md new file mode 100644 index 000000000..b0f044369 --- /dev/null +++ b/content/applications/websites/ecommerce/checkout_payment_shipping/shipping.md @@ -0,0 +1,124 @@ +# Delivery + +Odoo eCommerce allows you to configure various delivery methods, enabling customers to choose +their preferred option at {doc}`checkout `. These methods include {ref}`external providers +`, {ref}`custom options ` +such as flat-rate or free shipping, local carriers via +{doc}`Sendcloud <../../../inventory_and_mrp/inventory/shipping_receiving/setup_configuration/sendcloud_shipping>` +or :{ref}`Based on Rules `, and +{ref}`in-store pickup `. + +(ecommerce-shipping-external-provider)= + +## External provider integration + +To handle product delivery, you can connect your database to {doc}`third-party shipping carriers +<../../../inventory_and_mrp/inventory/shipping_receiving/setup_configuration/third_party_shipper>` +like {doc}`FedEx <../../../inventory_and_mrp/inventory/shipping_receiving/setup_configuration/fedex>`, +{doc}`UPS <../../../inventory_and_mrp/inventory/shipping_receiving/setup_configuration/ups_credentials>`, +or {doc}`DHL <../../../inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dhl_credentials>`. +A shipping connector links to these providers, automating {doc}`tracking labels +<../../../inventory_and_mrp/inventory/shipping_receiving/setup_configuration/labels>` and shipping +processes. + +To enable a third-party delivery provider, go to {menuselection}`Website --> Configuration --> +Settings`, scroll to the {guilabel}`Delivery` section, select the desired delivery provider(s), +and {guilabel}`Save`. + +Go to {menuselection}`Website --> Configuration --> Delivery Methods` and select the delivery method +in the list to {ref}`configure it `. + +:::{seealso} +{doc}`Third-party shipping carriers +<../../../inventory_and_mrp/inventory/shipping_receiving/setup_configuration/third_party_shipper>` +::: + +:::{important} +The field used to define additional fees **must** be filled **in your third-party delivery +provider account**, even if you do not plan to charge customers any additional fee. If you do not +want to apply a fee, enter `0`. If the field is left empty, the delivery price cannot be +calculated, and an error message prompts the customer to select an alternative delivery method. +::: + +### Margin on delivery rate + +To add an additional fee to the base shipping rate (e.g., to cover extra costs), log into your +carrier account and set the desired fee in the related field. The shipping connector retrieves this +fee and includes it in the final price at checkout. Contact your carrier for further assistance +with this configuration. + +Alternatively, enter `0` in your third-party shipping provider account, then set the fee in Odoo. +To do so, access the desired {ref}`shipping method's form +` and enter the fee in the {guilabel}`Margin +on Rate` field to add a percentage to the shipping costs and/or the {guilabel}`Additional margin` +field to add a fixed amount. + +:::{important} +The field used to define additional fees cannot be left empty in your third-party shipping +provider account. +::: + +(ecommerce-shipping-custom-method)= + +## Custom delivery method + +Custom delivery methods must be created, for example: + +- to integrate delivery carriers through {doc}`Sendcloud + <../../../inventory_and_mrp/inventory/shipping_receiving/setup_configuration/sendcloud_shipping>`; +- to configure specific rules (e.g., to offer free shipping for orders above a specific amount) for + a specific provider; +- to configure {ref}`Fixed Price ` shipping, or shipping {ref}`Based on + Rules `. + +To create a custom delivery method, go to {menuselection}`Website --> Configuration --> Delivery +Methods`, click {guilabel}`New`, and fill in the {ref}`fields +`. + +In the {guilabel}`Provider` field, select {ref}`Based on Rules ` or +{ref}`Fixed Price `. + +:::{tip} +Upon {ref}`configuring ` a delivery +method, you can: + +- Restrict it {doc}`to a specific website <../../website/configuration/multi_website>` by + selecting it in the {guilabel}`Website` field; +- Click the {guilabel}`Test Environment` smart button to switch to the + {guilabel}`Production Environment`. Then, click {guilabel}`Unpublished` to {guilabel}`Publish` + the delivery method and make it available to website visitors; +- Use the {guilabel}`Availability` tab to define {ref}`conditions + ` for the delivery method based on the order's + content or destination. +::: + +(ecommerce-shipping-instore-pickup)= + +## Click & Collect + +To allow customers to reserve products online and pay for/collect them in-store, follow these steps: + +1. Go to {menuselection}`Website --> Configuration --> Settings`. +2. Scroll to the {guilabel}`Delivery` section, enable {guilabel}`Click & Collect`, and + {guilabel}`Save`. +3. Click {icon}`fa-arrow-right` {guilabel}`Configure Pickup Locations` to {ref}`configure + ` the delivery method and ensure the + {guilabel}`Provider` field is set to {guilabel}`Pick up in store`. +4. In the {guilabel}`Stores` tab, click {guilabel}`Add a line` and select the warehouse(s) where + customers can collect their orders. +5. Once your setup is complete, click the {guilabel}`Unpublish` button to change the status to + {guilabel}`Publish` and make the delivery method available to customers. + +:::{note} +- When the product is in stock, a location selector is displayed on the {doc}`product + <../products>` and {doc}`checkout ` pages. Customers cannot select a pickup location + if the product is out of stock at that location. The {ref}`Continue selling + ` option for out-of-stock products is not supported. +- If the {ref}`Show Available Qty ` option is enabled for a + product, customers can view the stock quantity available for each warehouse in the location + selector on the product page. +- Each warehouse must have a **complete address** to ensure its location is accurately displayed + to customers. Incomplete addresses prevent the warehouse from being shown. +- The Click & Collect option is not available for services. +::: + diff --git a/content/applications/websites/ecommerce/ecommerce_management.md b/content/applications/websites/ecommerce/ecommerce_management.md new file mode 100644 index 000000000..6558804d0 --- /dev/null +++ b/content/applications/websites/ecommerce/ecommerce_management.md @@ -0,0 +1,15 @@ +--- +nosearch: true +--- + +# eCommerce management + +```{toctree} +:titlesonly: true + +ecommerce_management/order_handling +ecommerce_management/customer_accounts +ecommerce_management/customer_interaction +ecommerce_management/performance +``` + diff --git a/content/applications/websites/ecommerce/ecommerce_management/customer_accounts.md b/content/applications/websites/ecommerce/ecommerce_management/customer_accounts.md new file mode 100644 index 000000000..8be78cb99 --- /dev/null +++ b/content/applications/websites/ecommerce/ecommerce_management/customer_accounts.md @@ -0,0 +1,45 @@ +# Customer accounts + +Having customer accounts on an eCommerce allows customers to access all their documents from a +single place. To access their account, customers must be **logged-in** on the eCommerce website, +click on their **username** in the top-right corner of the screen, and click {guilabel}`My Account`. +From there, customers can access their {guilabel}`quotations`, {guilabel}`orders`, +{guilabel}`invoices`, etc. + +```{image} customer_accounts/account-log.png +:align: center +:alt: Customer account log-in +``` + +:::{note} +Customers can only have an account if the +{ref}`sign in/up at checkout ` option allows for account creation. +::: + +:::{tip} +Similarly to the rest of the website, the customer account page can be customized with **content +blocks** and other features through the **website builder**. +::: + +:::{seealso} +{doc}`/applications/general/users/portal` +::: + +## Access restriction + +It is possible to allow or restrict the documents to which customers have access through the website +builder. Log in your **own** account with your Odoo database credentials, and go to +{menuselection}`Edit --> Customize`. From the website builder menu, enable or disable the documents +customers can have access to. + +```{image} customer_accounts/account-documents.png +:align: center +:alt: Documents to which customers have access to from their account +``` + +## Multi-website account + +If you own multiple websites, you can make customer accounts available across **all** websites. +Then, the customer only needs one account. To do so, go to {menuselection}`Website --> Configuration +--> Settings --> Privacy section`, and enable {guilabel}`Shared Customer Accounts`. + diff --git a/content/applications/websites/ecommerce/ecommerce_management/customer_interaction.md b/content/applications/websites/ecommerce/ecommerce_management/customer_interaction.md new file mode 100644 index 000000000..03b37b095 --- /dev/null +++ b/content/applications/websites/ecommerce/ecommerce_management/customer_interaction.md @@ -0,0 +1,119 @@ +# Customer interaction + +Odoo offers many ways to interact with customers and for customers to interact with your website. + +(product-reviews)= + +## Product reviews + +Customers can give a rating to your products. This is a great way to promote your products or +services since reviews can influence purchase processes. To activate the **rating** feature, from +your **shop page**, select a product, go to {menuselection}`Edit --> Customize` and enable +{guilabel}`Rating`. + +```{image} customer_interaction/interaction-rating.png +:align: center +:alt: Rating of a product on the product page +``` + +:::{note} +Only portal users which purchased the product or service can leave ratings. +::: + +:::{tip} +Customer reviews can be hidden by clicking the {guilabel}`Visible` button next to a published +review. +::: + +## Live chat + +A chatbot is available and can simulate a human-like conversation with website visitors via text +messages in a chat box. + +:::{seealso} +- {doc}`../../livechat` +- {doc}`../../livechat/ratings` +- {doc}`../../livechat/responses` +::: + +(contact-form)= + +## Contact forms + +### Helpdesk + +Customers may need support after purchasing a product or subscribing to a service. It is possible to +create a **contact form**, which, when fulfilled, automatically creates a new ticket for your +**support team**. + +```{image} customer_interaction/interaction-form.png +:align: center +:alt: Contact form to submit a ticket to the support team +``` + +To add a contact form, **create** a new page ({menuselection}`+ New --> Page`) if necessary, and +drag and drop a {guilabel}`Form` block from the {guilabel}`Dynamic Content` section onto the page. +Once placed, click on the form (while in {guilabel}`Edit` mode), and in the {guilabel}`Action` +field, select {guilabel}`Create a Ticket`. You can then select to which {guilabel}`Helpdesk team` +the ticket should be assigned. + +```{image} customer_interaction/interaction-ticket.png +:align: center +:alt: Action field to create a task upon submitting a form +``` + +### Contact us + +A 'Contact Us' page makes it easier for customers and prospects to contact your company and get in +touch. + +To have a 'Contact Us' page, create a new page ({menuselection}`+ New --> Page`) if necessary, and +click on {menuselection}`Edit --> Customize`. Then, drag and drop a {guilabel}`Form` block onto the +page. Select the form and define the action to be performed when submitted in the {guilabel}`Action` +field. + +When clicking on a field, or when adding a new field ({guilabel}`+ Field`), you can select its +{guilabel}`Type`. This enables different options, such as {guilabel}`Multiple Checkboxes`, which +customers can use to indicate the services they are interested in, for example. + +```{image} customer_interaction/interaction-tags.png +:align: center +:alt: Tags to be selected on the 'Contact Us' form +``` + +```{image} customer_interaction/interaction-checkboxes.png +:align: center +:alt: '''Checkboxes'' configuration settings' +``` + +## Newsletter + +Customers can get updates on your eCommerce activities by subscribing to a newsletter. Visitors +subscribing to the newsletter are automatically added to the mailing list of the **Email Marketing** +application. You can either choose a newsletter **block**, a newsletter **popup**, or both. + +- **Popup**: prompts up a newsletter box when visitors scroll down the page; +- **Block**: displays a field on the page where customers can sign up by entering their email. + +The newsletter **block** can be configured according to different {guilabel}`Templates`. To do so, +click the **block** while in {menuselection}`Edit --> Customize`, and select a {guilabel}`Template` +in the {guilabel}`Newsletter Block` section. There are **three** templates available: + +- {guilabel}`Email Subscription`: visitors can sign up by email to the newsletter, without any + choice to the content. The content is defined in {menuselection}`Edit --> Customize` in the + {guilabel}`Newsletter` field; +- {guilabel}`SMS Subscription`: is the same as {guilabel}`Email Subscription`, but by SMS; +- {guilabel}`Form Subscription`: allows adding several fields, as well as a checkbox for the visitor + to agree to the **GDPR policy** of your website. + +```{image} customer_interaction/interaction-news.png +:align: center +:alt: Form subscription configuration and settings +``` + +:::{tip} +Alternatively, you can select {guilabel}`Subscribe to Newsletter` as {guilabel}`Action` when +creating a {ref}`contact form `, allowing for the same level of customization. Make +sure to add a checkbox stating visitors agree to be added to the mailing list. +::: + diff --git a/content/applications/websites/ecommerce/ecommerce_management/order_handling.md b/content/applications/websites/ecommerce/ecommerce_management/order_handling.md new file mode 100644 index 000000000..440240a88 --- /dev/null +++ b/content/applications/websites/ecommerce/ecommerce_management/order_handling.md @@ -0,0 +1,110 @@ +# Order handling + +When a customer orders on your eCommerce, there are **three** record types required to be handle in +Odoo: + +- {ref}`Sales orders `; +- {ref}`Delivery orders `; +- {ref}`Invoices & legal requirements `. + +(handling-sales)= + +## Sales orders + +### Order and payment status + +The first step when a customer adds a product to his cart is the creation of a quotation. Orders can +be managed either from the **Website** or {doc}`Sales ` app. eCommerce +orders can automatically be assigned to a specific sales team by going to {menuselection}`Website +--> Configuration --> Settings`. In the **Shop - Checkout Process** section, select a +{guilabel}`Sales Team` or {guilabel}`Salesperson` to handle eCommerce orders. + +```{image} order_handling/handling-salesteam.png +:align: center +:alt: Assignment of online orders to a sales team or salesperson +``` + +Orders can be found under {menuselection}`Website --> eCommerce --> Orders/Unpaid Orders`. Each +order goes through a different status: + +- **Quotation**: a new product is added to the cart, but the customer has *not* gone through the + checkout process yet; +- **Quotation sent**: the customer has gone through the checkout process and confirmed the order, + but the payment is not yet confirmed; +- **Order**: the customer has gone through the checkout process, confirmed the order, and the + payment is received. + +```{image} order_handling/handling-status.png +:align: center +:alt: Statuses of eCommerce orders +``` + +### Abandoned cart + +An **abandoned cart** represents an order for which the customer did **not finish** the checkout +confirmation process. For these orders, it is possible to send an **email reminder** to the +customer automatically. To enable that feature, go to {menuselection}`Website --> Configuration --> +Settings` and in the {guilabel}`Email & Marketing` section, enable {guilabel}`Automatically send +abandoned checkout emails`. Once enabled, you can set the **time-lapse** after which the email is +sent and customize the **email template** used. + +:::{note} +For abandoned cart emails, the customer must either have entered their contact details during the +checkout process; or be logged-in when they added the product to their cart. +::: + +(handling-delivery)= + +## Delivery orders + +### Delivery flow + +Once a quotation has been confirmed, a delivery order is automatically created. The next step is to +process this delivery. + +Packing eCommerce orders usually requires picking the product, preparing the packaging, printing the +shipping label(s) and shipping to the customer. Depending on the number of orders, strategy, or +resources, those steps can be considered as one or multiple actions in Odoo. + +An automatic email can be sent to the customer when the transfer status in Odoo is “done”. To do so, +enable the feature in the settings of the +{doc}`Inventory ` app. + +:::{note} +If customers are allowed to pay when picking up their order in stores or by wire transfer, the +quotation is **not** be confirmed and the stock is **not** be reserved. Orders must be confirmed +manually to reserve products in stock. +::: + +:::{seealso} +- {doc}`../../../inventory_and_mrp/inventory/shipping_receiving/setup_configuration/invoicing` +- {doc}`../../../inventory_and_mrp/inventory/shipping_receiving/setup_configuration/labels` +- {doc}`../../../inventory_and_mrp/inventory/shipping_receiving/setup_configuration/multipack` +::: + +### Returns and refunds + +Customers can only return an order through an online form. It may not be possible to return products +depending on the return strategy or type of product. + +Full refunds can be directly sent to customers from within the order interface. A refund-compatible +payment provider needs to be enabled first. + +:::{seealso} +- {doc}`/applications/sales/sales/products_prices/returns` +- {doc}`/applications/services/helpdesk/advanced/after_sales` +- {doc}`/applications/finance/payment_providers` +::: + +(handling-legal)= + +## Invoice and legal requirements + +The final step of an ecommerce order is to generate the invoice and send it to the customer. +Depending on the type of business (B2B or B2C), an invoice can either be generated automatically +(B2B) or on demand of the customer (B2C). This process can be automated if (and when) the online +payment is {ref}`confirmed `. + +To automate invoicing, go to {menuselection}`Website --> Configuration --> Settings` and in the +{guilabel}`Invoicing` section, enable {guilabel}`Automatic Invoice`. + diff --git a/content/applications/websites/ecommerce/ecommerce_management/performance.md b/content/applications/websites/ecommerce/ecommerce_management/performance.md new file mode 100644 index 000000000..4eff9405a --- /dev/null +++ b/content/applications/websites/ecommerce/ecommerce_management/performance.md @@ -0,0 +1,36 @@ +# Performance monitoring + +Odoo integrates a variety of tools to analyze and improve the performance of your eCommerce +website. + +## Data monitoring + +**Website** allows monitoring and analysis of the sales performance of your eCommerce. To access the +**reporting view**, go to {menuselection}`Website --> Reporting --> eCommerce`. This dashboard helps +you monitor everything related to sales, such as sales performance per product, category, day, etc. + +```{image} performance/reporting.png +:align: center +:alt: Performance reporting of eCommerce +``` + +By clicking {guilabel}`Measures`, you can select the type of measurement used, such as: + +- {guilabel}`Margin`; + +- {guilabel}`Qty Invoiced`; + +- {guilabel}`Untaxed Total`; + +- {guilabel}`Volume`; + +- ... + +Other options include **multiple views (Pivot, etc.), comparison** by periods or years, and directly +{guilabel}`insert in spreadsheet`, etc. + +## Analytics + +It is possible to link your Odoo website with {ref}`analytics/plausible` and +{ref}`analytics/google-analytics`. + diff --git a/content/applications/websites/ecommerce/products.md b/content/applications/websites/ecommerce/products.md new file mode 100644 index 000000000..5e5f59539 --- /dev/null +++ b/content/applications/websites/ecommerce/products.md @@ -0,0 +1,416 @@ +--- +show-content: true +--- + +# 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 `. + +(ecommerce-products-add-products)= + +## Add products + +(ecommerce-products-create-products)= + +### Create products + +To create a product from the frontend, click {guilabel}`+ New` in the top-right corner, then +{guilabel}`Product`. Enter the {guilabel}`Product Name`, {guilabel}`Sales Price`, the default +{guilabel}`Customer Taxes` for local transactions, and {guilabel}`Save`. You can then update the +product's details, add an image, and {ref}`customize ` the product +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 `, + 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`. +::: + +:::{seealso} +{doc}`Create new products using the Barcode Lookup database +`. +::: + +(ecommerce-products-import-products)= + +### Import products + +To {ref}`import product data ` using XLSX or CSV files, go to +{menuselection}`Website --> eCommerce --> Products`, click the {icon}`fa-cog` ({guilabel}`gear`) +icon, then {ref}`Import records `. + +:::{tip} +To publish **large batches** of products, follow these steps: + +1. Go to {menuselection}`Website --> eCommerce --> Products`. +2. Remove the {guilabel}`Published` filter and switch to the {guilabel}`List` view. +3. Click the {icon}`fa-sliders` ({guilabel}`dropdown toggle`) icon and enable + {guilabel}`Is published`. +4. Click the {guilabel}`Is Published` column to re-order it by **published** or **unpublished** + products. +5. Select the products to publish by ticking their box. +6. 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 + +To access a product's page, go to the {guilabel}`Shop` and click on the product. Click +{guilabel}`Edit` to {ref}`customize ` the page or +{ref}`edit its images `. + +(ecommerce-products-product-form)= + +To access the backend **product form**, click the {icon}`fa-cog` {guilabel}`Product` button in the +top-right corner of the product page. Alternatively, navigate to {menuselection}`Website --> +eCommerce --> Products` and select the product. You can configure the product page from the form +by adding {ref}`variants `, {ref}`digital documents +`, or {ref}`translating ` content. + +:::{tip} +Click the {guilabel}`Go to Website` smart button to return to the frontend product's page. +::: + +(ecommerce-products-customization)= + +### Customization + +To customize a product page, click {guilabel}`Edit`. Go to the {guilabel}`Blocks` tab to add +{doc}`building blocks <../../websites/website/web_design/building_blocks>`. + +:::{tip} +- When dragging and dropping a building block on the product page, placing it above or below the + top or bottom blue lines makes it visible on all product pages. +- You can edit any text on your website simply by clicking on it while in {guilabel}`Edit` mode. +::: + +Go to the {guilabel}`Customize` tab to modify the page layout or add features: + +- {guilabel}`Terms and Conditions`: Toggle the switch to display a link to your + {doc}`terms and conditions <../../finance/accounting/customer_invoices/terms_conditions>` on the + product page. + +- {guilabel}`Customers`: + + > - {guilabel}`Rating`: Allow logged-in portal users to submit product reviews by clicking the + > stars below the product's name and sharing their experience in the {guilabel}`Customer Reviews` + > section at the bottom. Reviews are visible from the product page using the {icon}`fa-plus` + > ({guilabel}`plus`) icon next to the {guilabel}`Customer Reviews` heading or from the product + > form's chatter. To restrict visibility to internal employees, toggle the {guilabel}`Public` + > switch next to the review comment. + > - {guilabel}`Share`: Add social media and email icon buttons allowing customers to share the + > product through those channels. + +- {guilabel}`Select Quantity`: Toggle the switch to allow customers to select the product quantity + they want to purchase. + +- {guilabel}`Tax indication`: Toggle the switch to indicate if the price is + {ref}`VAT included or excluded `. + +- {guilabel}`Variants`: Show all possible product {ref}`variants ` + vertically as a {guilabel}`Products List` or horizontally as selectable {guilabel}`Options` to + compose the variant yourself. + +- {guilabel}`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. + +- {guilabel}`Cart`: + + > - {guilabel}`Buy Now`: Add a {icon}`fa-bolt` {guilabel}`Buy Now` option to take the customer to + > the checkout page. + > - {guilabel}`Wishlist`: Add an {icon}`fa-heart-o` {guilabel}`Add to wishlist` option allowing + > logged-in customers to save products in a wishlist. + > - {guilabel}`Compare`: Add a {icon}`fa-exchange` {guilabel}`Compare` option, allowing customers + > to {ref}`compare products ` based on their attributes. + +- {guilabel}`Specification`: Select {guilabel}`Bottom of Page` to display a detailed list of the + attributes and their values available for the product. This option only works for products with + {ref}`variants ` if the + {ref}`Product comparison tool ` is enabled in the Website + {guilabel}`Settings`. + +:::{note} +- {guilabel}`Variants`, {icon}`fa-heart-o` {guilabel}`Wishlist`, and {icon}`fa-exchange` + {guilabel}`Compare` options must be enabled by going to + {menuselection}`Website --> Configuration --> Settings`, in the {guilabel}`Shop - Products` + section. +- Enabled functions apply to all product pages. +- Products with single values for their attributes do not generate variants but are still + displayed in the {guilabel}`Product Specifications`. +::: + +(ecommerce-products-image-customization)= + +### Image customization + +To customize the images available on the product page, go to the {guilabel}`Customize` tab: + +- {guilabel}`Images Width`: Changes the width of the product images displayed on the page. +- {guilabel}`Layout`: The {guilabel}`Carousel` layout allows customers to navigate from one image to + the next using the {icon}`fa-angle-left` ({guilabel}`left arrow`) or {icon}`fa-angle-right` + ({guilabel}`right arrow`); whereas the {guilabel}`Grid` displays four images in a square layout. +- {guilabel}`Image Zoom`: Select the zoom effect for product images: {guilabel}`Magnifier on hover` + {guilabel}`Pop-up on Click`, {guilabel}`Both`, or {guilabel}`None`. +- {guilabel}`Thumbnails`: Align thumbnails on the {icon}`fa-long-arrow-left` ({guilabel}`Left`) or + : at the {icon}`fa-long-arrow-down` ({guilabel}`Bottom`). +- {guilabel}`Main Image`: Click {guilabel}`Replace` to change the product's main image. +- {guilabel}`Extra Images`: {guilabel}`Add` extra images or videos (including via URL) or + {guilabel}`Remove all` product images. + +:::{note} +Images must be in PNG or JPG format and with a minimum size of 1024x1024 to trigger the zoom. +::: + +(ecommerce-products-product-variants)= + +## Product variants + +{doc}`Product variants <../../sales/sales/products_prices/products/variants>` are different versions +of the same product, such as various colors or materials, with potential differences in price and +availability. + +To configure product variants for a product: + +1. Go to {menuselection}`Website --> Configuration --> Settings`. +2. Scroll down to the {guilabel}`Shop - Products` section and enable the + {guilabel}`Product Variants` feature. +3. Access the {ref}`product forms ` and go to the + {guilabel}`Attributes & Variants` tab, where you can add attributes and values, allowing customers + to configure and select product variants on the product page. For multiple attributes, + you can combine them to create specific variants. + +To display or hide an attribute on the {guilabel}`Shop` page and allow visitors to filter them, +go to {menuselection}`Website --> eCommerce --> Attributes`, click on the attribute, and select +{guilabel}`Visible` or {guilabel}`Hidden` in the {guilabel}`eCommerce Filter Visibility` field. + +:::{tip} +- To display the product attributes on {ref}`the main Shop page `, + 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 + {guilabel}`eCommerce Category` field and either select an {doc}`existing category or create a + new one <../../websites/ecommerce/products>`. +::: + +:::{note} +Two attribute values are needed to make the filter visible. +::: + +:::{seealso} +{doc}`Product variants <../../sales/sales/products_prices/products/variants>` +::: + +(ecommerce-products-digital-files)= + +## Digital files + +You can link digital files like certificates, eBooks, or user manuals to the products. These +documents are available {ref}`before payment ` on +the product page or in the customer portal {ref}`after checkout `. + +To link a digital file to a product, go to the {ref}`product form ` +and click the {guilabel}`Documents` smart button. Then, click {guilabel}`Upload` to upload a file +directly, or for additional options, click {guilabel}`New`, then {guilabel}`Upload your file`. + +:::{tip} +- You can link a URL instead of a digital file. To do so, click {guilabel}`New`, go to the + {guilabel}`Type` field, and select {guilabel}`URL`. +- To edit an existing file, click the {icon}`fa-ellipsis-v` ({guilabel}`dropdown menu`) in the + top-right corner of the document card and click {guilabel}`Edit`. +::: + +(ecommerce-products-digital-files-before-payment)= + +### Digital files available before payment + +To make the file available on the product page (before payment), leave the {guilabel}`Visibility` +field blank and toggle the {guilabel}`Show on product page` switch. + +```{image} products/digital-files.png +:alt: digital file available before payment on the product page +``` + +(ecommerce-products-digital-files-after-payment)= + +### Digital files available after payment + +To make the file available (after payment), set the {guilabel}`Visibility` field to +{guilabel}`Confirmed order` and turn off the {guilabel}`Show on product page` switch. + +(ecommerce-products-translation)= + +## Translation + +If multiple languages are available on your website, you can translate a product's information +directly on the {ref}`product form `. Fields that support multiple +languages are identifiable by their abbreviation language (e.g., EN) next to their field. + +The eCommerce-related fields to translate are: + +- {guilabel}`Product name`. +- {guilabel}`Out-of-Stock Message` (under the {guilabel}`Sales` tab). +- {guilabel}`Sales Description` (under the {guilabel}`Sales` tab). + +:::{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}`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. +::: + +(ecommerce-products-website-availability)= + +### Website availability + +To set the product's website availability, navigate to the {ref}`product form +`, go to the {guilabel}`Sales` tab, and in the +{guilabel}`eCommerce shop` section, select the {guilabel}`Website` you wish the product to be +available on. Leave the field blank to make the product available on *all* websites. + +:::{note} +You can make a product available on either *one* website or *all* websites, but selecting only +*some* websites is not possible. +::: + +(ecommerce-products-stock-management)= + +## Stock management + +To enable and configure inventory management options, go to {menuselection}`Website --> +Configuration --> Settings`, scroll down to the {guilabel}`Shop - Products` section and the +{guilabel}`Inventory Defaults` sub-section. + +:::{important} +- The **Inventory** app must be installed to see the inventory management options. +- To display the stock level on the product page, the {guilabel}`Product Type` field must be set + to {guilabel}`Storable` in the {ref}`product form `. +::: + +### Inventory + +In the {guilabel}`Inventory Defaults` sub-section, fill in those fields: + +- {doc}`Warehouse <../../inventory_and_mrp/inventory/warehouses_storage/inventory_management/warehouses>`. +- {guilabel}`Out-of-Stock`: Enable {guilabel}`Continue Selling` to allow customers to place orders + even when the product is **out of stock**. Leave the box unchecked to **prevent orders**. +- {guilabel}`Show Available Qty`: Displays the available quantity left under a specified threshold + on the product page. The available quantity is calculated based on the {guilabel}`On hand` + quantity minus the quantity already reserved for outgoing transfers. + +(ecommerce-products-product-comparison)= + +## Product comparison + +To allow website visitors to compare products based on their attributes, go to +{menuselection}`Website --> Configuration --> Settings`, scroll down to the +{guilabel}`Shop - Products` section, and enable {guilabel}`Product Comparison Tool`. + +The {icon}`fa-exchange` ({guilabel}`Compare`) icon is now available on each product card on the main +shop page when customers hover their mouse over it. To compare products, customers can click the +{icon}`fa-exchange` ({guilabel}`Compare`) option on the products they want to compare, then click +{icon}`fa-exchange` {guilabel}`Compare` in the pop-up window at the bottom of the page to reach the +comparison summary. + +```{image} products/products-compare.png +:alt: Product comparison window +``` + +:::{note} +- The {guilabel}`Product Comparison Tool` is only available for products with + {ref}`attributes `. +- Selecting the {icon}`fa-exchange` ({guilabel}`Compare`) option from a product page is also + possible. +::: + +```{toctree} +:titlesonly: true + +products/catalog +products/price_management +products/cross_upselling +``` + diff --git a/content/applications/websites/ecommerce/products/catalog.md b/content/applications/websites/ecommerce/products/catalog.md new file mode 100644 index 000000000..dfe31deb8 --- /dev/null +++ b/content/applications/websites/ecommerce/products/catalog.md @@ -0,0 +1,214 @@ +# 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. + +:::{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. +::: + +## Categorize the product catalog + +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. + +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`. + +```{image} catalog/catalog-categories.png +:align: center +:alt: eCommerce categories under the "Sales" tab +``` + +:::{note} +A single product can appear under 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. + +```{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. + +#### 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. + +:::{seealso} +- {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. +::: + +:::{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. +::: + +#### Sort-by search + +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. + +The **sorting** options are: + +- Featured +- Newest Arrivals +- Name (A-Z) +- Price - Low to High +- Price - High to Low + +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. + +```{image} catalog/catalog-reorder.png +:align: center +:alt: Product rearrangement in the catalog +``` + +## Page design + +### Category page + +You can customize the layout of the category page using the website builder. + +:::{important} +Editing the layout of the category page is global; editing one category layout affects *all* +category pages. +::: + +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. + +```{image} catalog/catalog-category-layout.png +:align: center +:alt: Layout options of the category pages. +``` + +:::{tip} +You can choose the size of the grid, but be aware that displaying too many products may affect +performance and page loading speed. +::: + +### 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: + +- Sale; +- Sold out; +- Out of stock; +- New. + +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. + +:::{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-product-highlight.png +:align: center +:alt: Ribbon highlight +``` + +## Additional features + +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. + +- {guilabel}`Add to Cart`: adds a button to + {doc}`add the product to the cart <../checkout_payment_shipping/cart>`; +- {guilabel}`Comparison List`: adds a button to **compare** products based on their price, variant, + etc.; +- {guilabel}`Wishlist Button`: adds a button to **wishlist** the product. + +```{image} catalog/catalog-buttons.png +:align: center +:alt: Feature buttons for add to cart, comparison list, and wishlist +``` + +```{image} catalog/catalog-features.png +:align: center +:alt: Appearance of buttons when hoovering over the mouse +``` + +## Add content + +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. + +```{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. + +:::{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. +::: + diff --git a/content/applications/websites/ecommerce/products/cross_upselling.md b/content/applications/websites/ecommerce/products/cross_upselling.md new file mode 100644 index 000000000..666966be6 --- /dev/null +++ b/content/applications/websites/ecommerce/products/cross_upselling.md @@ -0,0 +1,68 @@ +# Cross-selling and upselling + +{ref}`Cross-selling ` and +{ref}`upselling ` are sales techniques designed to encourage +customers to purchase additional or higher-priced products and services from your {doc}`catalog`. + +(ecommerce-cross-selling)= + +## Cross-selling + +Cross-selling can be achieved by suggesting +{ref}`optional products ` when items are added to the cart or by +recommending {ref}`accessory products ` on the checkout page. + +(ecommerce-cross-upselling-optional)= + +### Optional products + +**Optional products** are suggested when the customer selects a product and clicks +{guilabel}`Add to cart`. + +To enable **optional products**, go to {menuselection}`Website --> eCommerce --> Products`, select a +product, go to the {guilabel}`Sales` tab, and enter the products you wish to feature in the +{guilabel}`Optional Products` field. + +```{image} cross_upselling/add-to-cart.png +:alt: Optional products cross-selling +``` + +(ecommerce-cross-upselling-accessory)= + +### Accessory products + +**Accessory products** are showcased in the {guilabel}`Suggested Accessories` section during the +{guilabel}`Review Order` step, just before proceeding to checkout. + +To enable **accessory products**, go to {menuselection}`Website --> eCommerce --> Products`, select +a product, go to the {guilabel}`Sales` tab, and enter the products you wish to feature in the +{guilabel}`Accessory Products` field. + +```{image} cross_upselling/accessory-products.png +:alt: Suggested accessories at checkout during cart review +``` + +(ecommerce-cross-upselling-alternative)= + +## Upselling + +You can display **alternative products** at the bottom of the product page as an upselling +technique, encouraging customers to consider a more expensive variant or product than their +initial choice by presenting appealing alternatives. + +```{image} cross_upselling/cross_upselling-alternative.png +:alt: Alternative products on the product page +``` + +To enable alternative products, navigate to {menuselection}`Website --> eCommerce --> Products`, +select the desired product, and go to the {guilabel}`Sales` tab. In the +{guilabel}`Alternative Products` field, add the products you want to feature. + +Click {guilabel}`Go to Website` to view the alternative products displayed at the bottom of the +product page. + +To adjust the settings, click {guilabel}`Edit` and select the related +{doc}`building block <../../website/web_design/building_blocks>`. In the {guilabel}`Customize` +tab, scroll to the {guilabel}`Alternative Products` section and modify the settings as needed to +tailor the display to your preferences. + diff --git a/content/applications/websites/ecommerce/products/price_management.md b/content/applications/websites/ecommerce/products/price_management.md new file mode 100644 index 000000000..e58d8aeb6 --- /dev/null +++ b/content/applications/websites/ecommerce/products/price_management.md @@ -0,0 +1,141 @@ +# Price management + +Odoo offers multiple options to select the price displayed on your website, as well as +condition-specific prices based on set criteria. + +## Taxes + +### Tax configuration + +To add a tax on a product, you can either set a tax in the {guilabel}`Customer Taxes` field of the +**product template** or use +{doc}`fiscal positions `. + +:::{seealso} +- {doc}`/applications/finance/accounting/taxes` +- {doc}`/applications/finance/accounting/taxes/avatax` +- {doc}`/applications/finance/accounting/taxes/fiscal_positions` +::: + +(ecommerce-price-management-tax-display)= + +### Tax display + +Choosing the displayed price tax usually depends on a country's regulations or the type of customers +**(B2B vs. B2C)**. To select the type of price displayed, go to {menuselection}`Website --> +Configuration --> Settings`, scroll down to the {guilabel}`Shop - Products` category, and select +{guilabel}`Tax Excluded` or {guilabel}`Tax Included`. + +- {guilabel}`Tax Excluded`: the price displayed on the website is **tax-excluded**, and the tax is + computed at the cart-review step; +- {guilabel}`Tax Included`: the price displayed on the website is **tax-included**. + +:::{note} +This setting is **global**, and the tax-display type is the same for (all of) your website(s). It +is, therefore, not possible to select different tax displays for different websites. This may be +a significant point of consideration when implementing a database with multiple ecommerce +websites aimed at varying customer types (i.e., B2B and B2C). +::: + +You can choose to display the type of pricing next to the product price by going to +{menuselection}`Website --> Site --> Homepage --> Shop`, selecting a product, and then +{menuselection}`Edit --> Customize tab` and enabling {guilabel}`Tax Indication`. + +```{image} price_management/price-tax-display-type.png +:align: center +:alt: Tax type displayed on the product page +``` + +:::{seealso} +{doc}`/applications/finance/accounting/taxes/B2B_B2C` +::: + +## Price per unit + +It is possible to display a {doc}`price per unit +<../../../inventory_and_mrp/inventory/product_management/configure/uom>` on the product page. To do +that, go to {menuselection}`Website --> Configuration --> Settings` and enable {guilabel}`Product +Reference Price` under the {guilabel}`Shop - Products` section. When enabled, ensure an amount is +set in the {guilabel}`Base Unit Count` field of the **product template**, and in the +{guilabel}`Sales Price`. + +```{image} price_management/price-cost-per-unit.png +:align: center +:alt: Cost per unit pricing on the product template +``` + +The price per unit of measure can be found above the {guilabel}`Add to Cart` button on the product +page. + +```{image} price_management/price-cost-per-unit-page.png +:align: center +:alt: Cost per unit pricing on the product page +``` + +:::{note} +Pay attention that having the price per unit may be **mandatory** in some countries. +::: + +:::{seealso} +{doc}`../../../inventory_and_mrp/inventory/product_management/configure/uom` +::: + +(ecommerce-pricelists)= + +### Price configuration: pricelists + +Pricelists are the primary tool to manage prices on your eCommerce. They allow you to define +website-specific prices - different from the price on the product template - based on the **country +group**, **currency**, **minimum quantity**, **period**, or **variant**. You can create as many +pricelists as needed, but it is mandatory to have at least one pricelist configured per website. If +no custom pricelists are added, Odoo defaults to the **Public Pricelist** for all websites. + +:::{seealso} +{doc}`/applications/sales/sales/products_prices/prices/pricing` +::: + +#### Configuration + +Pricelists can be found under {menuselection}`Website --> eCommerce --> Pricelists`, but must first +be activated. For that, head to {menuselection}`Website --> Configuration --> Settings` and scroll +down to the {guilabel}`Shop - Products` section. There, you can find two options: + +- {guilabel}`Multiple prices per product`; +- {guilabel}`Advanced price rules (discounts, formulas)`. + +The **first** option allows you to set different prices per customer *segment*, i.e., registered +customers, gold customers, regular customers, etc. The **second** option allows you to set *price +change* rules such as **discounts**, **margins**, **roundings**, etc. + +#### Foreign currency + +If you are selling in **multiple currencies** and have pricelists in foreign currencies, customers +can select their corresponding pricelist anywhere on the {guilabel}`Shop` page from the drop-down +menu next to the **search bar**. + +```{image} price_management/price-pricelists.png +:align: center +:alt: Pricelists selection +``` + +:::{seealso} +- {doc}`/applications/sales/sales/products_prices/prices/pricing` +- {doc}`/applications/sales/sales/products_prices/prices/currencies` +::: + +### Permanent discount + +If you have permanently reduced the price of a product, a popular means to attract customers is the +**strikethrough** strategy. The strategy consists in displaying the previous price crossed out and +the **new discounted price** next to it. + +```{image} price_management/price-strikethrough.png +:align: center +:alt: Price strikethrough +``` + +To display a 'striked' price, enable the {guilabel}`Comparison Price` option under +{menuselection}`Website --> Configuration --> Settings --> Shop - Products category`. Then, head to +the product's template ({menuselection}`Website --> eCommerce --> Products`), and in the +{guilabel}`Compare to Price` field, enter the **new** price. + diff --git a/content/applications/websites/elearning.md b/content/applications/websites/elearning.md new file mode 100644 index 000000000..46c8b28e1 --- /dev/null +++ b/content/applications/websites/elearning.md @@ -0,0 +1,250 @@ +# eLearning + +The **eLearning** app allows you to easily upload content, define learning objectives, manage +attendees, assess students' progress, and even set up rewards. Engaging participants in a meaningful +learning experience enhances their attentiveness and fosters heightened productivity. + +:::{important} +You can manage your eLearning content on the **front end** or the **back end**. The **front end** +allows you to create content quickly from your website, while the **back end** provides +additional options and allows collaboration. This documentation focuses on using the back end to +create your content. +::: + +:::{seealso} +[Odoo Tutorials: eLearning](https://www.odoo.com/slides/elearning-56) +::: + +## Courses + +By going to {menuselection}`eLearning --> Courses --> Courses`, you can get an overview of all your +courses. + +Click on a course title to edit your course on the back end. Click on {guilabel}`View course` to +access your course on the front end. + +### Course creation + +Click {guilabel}`New` to create a new course. When the page pops up, you can add your +{guilabel}`Course Title` and one or more {guilabel}`Tags` to describe your course. You can add an +image to illustrate your course by hovering your mouse on the camera placeholder image and clicking +on the edit icon. Four tabs allow you to edit your course further: +{ref}`Content `, {ref}`Description `, +{ref}`Options `, and {ref}`Karma `. + +```{image} elearning/elearning-course-creation.png +:align: center +:alt: Create your elearning course. +``` + +(elearning-content)= + +#### Content tab + +This tab allows you to manage your course content. Click on {guilabel}`Add Section` to divide your +course into different sections. Click on {guilabel}`Add Content` to create +{ref}`content `. Click on {guilabel}`Add Certification` to assess the +level of understanding of your attendees, certify their skills, and motivate them. **Certification** +is part of the {doc}`Surveys <../marketing/surveys/create>` app. + +(elearning-description)= + +#### Description tab + +You can add a short description or information related to your course in the {guilabel}`Description` +tab. It appears under your course title on your website. + +```{image} elearning/course-description.png +:align: center +:alt: Add a description to your course. +``` + +(elearning-options)= + +#### Options tab + +In the {guilabel}`Options` tab, different configurations are available: +{ref}`Course `, {ref}`Communication `, +{ref}`Access rights `, and {ref}`Display `. + +```{image} elearning/options-tab.png +:align: center +:alt: Overview of the Options tab +``` + +(elearning-course)= + +##### Course + +Assign a {guilabel}`Responsible` user for your course. If you have multiple websites, use the +{guilabel}`Website` field to only display the course on the selected website. + +(elearning-communication)= + +##### Communication + +- {guilabel}`Allow Reviews`: tick the box to allow attendees to like and comment on your content and + to submit reviews on your course; +- {guilabel}`Forum`: add a dedicated forum to your course (only shown if the **Forum** feature is + enabled in the app's settings); +- {guilabel}`New Content Notification`: select an email template sent to your attendees when you + upload new content. Click on the internal link button ({guilabel}`➜`) to have access to the email + template editor; +- {guilabel}`Completion Notification`: select an email template sent to your attendees once they + reach the end of your course. Click on the internal link button ({guilabel}`➜`) to access the + email template editor; + +(elearning-access-rights)= + +##### Access rights + +- {guilabel}`Prerequisites`: set one or more courses that users are advised to complete before + : accessing your course; + +- {guilabel}`Show course to`: define who can access your course and their content between + {guilabel}`Everyone`, {guilabel}`Signed In` or {guilabel}`Course Attendees`; + +- {guilabel}`Enroll Policy`: define how people enroll in your course. Select: + + > - {guilabel}`Open`: if you want your course to be available to anyone; + > + > - {guilabel}`On Invitation`: if only people who received an invitation can enroll to your course. + > If selected, fill in the {guilabel}`Enroll Message` explaining the course's enrollment process. + > This message appears on your website under the course title; + > + > - {guilabel}`On Payment`: if only people who bought your course can attend it. The + > {guilabel}`Paid Courses` feature must be enabled to get this option. If you select + > {guilabel}`On Payment`, you must add a {guilabel}`Product` for your course. + > + > > :::{note} + > > Only products set up with {guilabel}`Course` as their {guilabel}`Product Type` are + > > displayed. + > > ::: + +(elearning-display)= + +##### Display + +- {guilabel}`Training`: the course content appears as a training program, and the courses must be + taken in the proposed order. +- {guilabel}`Documentation`: the content is available in any order. If you choose this option, you + can choose which page should be promoted on the course homepage by using the + {guilabel}`Featured Content` field. + +(elearning-karma)= + +#### Karma tab + +This tab is about gamification to make eLearning fun and interactive. + +In the {guilabel}`Rewards` section, choose how many karma points you want to grant your students +when they {guilabel}`Review` or {guilabel}`Finish` a course. + +In the {guilabel}`Access Rights` section, define the karma needed to {guilabel}`Add Review`, +{guilabel}`Add Comment`, or {guilabel}`Vote` on the course. + +:::{note} +From your course, click the {guilabel}`Contact Attendees` button to reach people who are +enrolled in the course. +::: + +(elearning-course-groups)= + +### Course groups + +Use the **Course Groups** to inform users and allow them to filter the courses from the +{guilabel}`All Courses` dashboard. + +You can manage them by going to {menuselection}`Configuration --> +Course Groups`. Click {guilabel}`New` to create a new course group. Add the {guilabel}`Course Group +Name`, tick the {guilabel}`Menu Entry` box to allow users to search by course group on the website, +and add tags in the {guilabel}`Tag Name` column. For each tag, you can select a corresponding color. + +### Settings + +You can enable different features to customize your courses by going to {menuselection}`eLearning +--> Configuration --> Settings`: + +- **Certifications**: to evaluate the knowledge of your attendees and certify their skills; +- **Paid courses**: to sell access to your courses on your website and track revenues; +- **Mailing**: to update all your attendees at once through mass mailings; +- **Forum**: to create a community and let attendees answer each other's questions. + +(elearning-create-content)= + +## Content + +Manage your content by going to {menuselection}`eLearning --> Courses --> Contents`. Click +{guilabel}`New` to create content. Add your {guilabel}`Content Title`, and if you want +{ref}`Tags `, then fill in the related information among the different tabs. + +```{image} elearning/elearning-content-tab.png +:align: center +:alt: Create your content. +``` + +### Document tab + +- {guilabel}`Course`: select the course your content belongs to; +- {guilabel}`Content Type`: select the type of your content; +- {guilabel}`Responsible`: add a responsible person for your content; +- {guilabel}`Duration`: indicate the time required to complete the course; +- {guilabel}`Allow Download`: allow users to download the content of the slide. This option is only + visible when the content is a document; +- {guilabel}`Allow Preview`: the course is accessible by anyone. +- {guilabel}`# of Public Views`: displays the number of views from non-enrolled participants; +- {guilabel}`# Total Views`: displays the total number of views (non-enrolled and enrolled + participants). + +### Description tab + +You can add a description of your content that appears front end in the {guilabel}`About` section of +your course content. + +### Additional Resources tab + +Click {guilabel}`Add a line` to add a link or a file that supports your participants' learning. +It appears in the course content on your website. + +```{image} elearning/additional-content.png +:align: center +:alt: Additional ressources +``` + +(elearning-quiz)= + +### Quiz tab + +From this tab you can create a quiz to assess your students at the end of the course. + +The {guilabel}`Points Rewards` section lets you give a specific number of karma points depending on +how many tries they need to correctly answer the question. Then, create your questions and the +possible answers by clicking on {guilabel}`Add a line`. A new window pops up, add the question by +filling in the {guilabel}`Question Name` and add multiple answers by clicking on {guilabel}`Add a +line`. Tick the {guilabel}`Is correct answer` to mark one or more answers as correct. You can also +fill in the {guilabel}`Comment` field to display additional information when the answer is chosen by +the participant. + +(elearning-tags)= + +### Content Tags + +The **Content Tags** help users to classify the content from the {guilabel}`Contents` dashboard. + +You can manage them by going to {menuselection}`eLearning --> Configuration --> Content Tags`. Click +{guilabel}`New` to create a new tag. + +## Publish your content + +Everything created on the back end needs to be published from the front end. Unpublished content is +always visible from your website but still needs to be published to be available to your audience. + +You must be on your website's front end to publish your content. To do so, click on the +{guilabel}`Go To Website` smart button, and tick the {guilabel}`Publish` option available in the +right-hand corner. + +```{image} elearning/elearning-publish-button.png +:align: center +:alt: Publish your content. +``` + diff --git a/content/applications/websites/forum.md b/content/applications/websites/forum.md new file mode 100644 index 000000000..0a2b5ac41 --- /dev/null +++ b/content/applications/websites/forum.md @@ -0,0 +1,410 @@ +# Forum + +**Odoo Forum** is a question-and-answer forum designed with providing customer support in mind. +Adding a forum to a website enables you to build a community, encourage engagement, and share +knowledge. + +(forum-create)= + +## Create a forum + +To create or edit a forum, go to {menuselection}`Website --> Configuration --> Forum: Forums`. Click +{guilabel}`New` or select an existing forum and configure the following elements. + +{guilabel}`Forum Name`: add the name of the forum. + +{guilabel}`Mode`: select {guilabel}`Questions` to enable marking an answer as best, meaning +questions then appear as *solved*, or {guilabel}`Discussions` if the feature is not needed. + +:::{note} +Regardless of the selected mode, only **one answer** per user is allowed on a single post. +Commenting multiple times is allowed, however. +::: + +{guilabel}`Default Sort`: choose how questions are sorted by default. + +> - {guilabel}`Newest`: by latest question posting date +> - {guilabel}`Last Updated`: by latest posting activity date (answers and comments included) +> - {guilabel}`Most Voted`: by highest vote tally +> - {guilabel}`Relevance`: by post relevancy (determined by a formula) +> - {guilabel}`Answered`: by likelihood to be answered (determined by a formula) + +:::{note} +Users have several sorting options (total replies, total views, last activity) on the forum +front end. +::: + +{guilabel}`Privacy`: select {guilabel}`Public` to let anyone view the forum, {guilabel}`Signed In` +to make it visible only for signed-in users, or {guilabel}`Some users` to make it visible only for a +specific user access group by selecting one {guilabel}`Authorized Group`. + +Next, configure the {ref}`karma gains ` and the {ref}`karma-related rights +`. + +(forum-karma)= + +### Karma points + +Karma points can be given to users based on different forum interactions. They can be used to +determine which forum functionalities users can access, from being able to vote on posts to +having moderator rights. They are also used to set user {ref}`ranks `. + +:::{important} +- A user's karma points are shared across all forums, courses, etc., of a single Odoo website. +- eLearning users can earn karma points through different {ref}`course interactions + ` and by {ref}`completing quizzes `. +::: + +(forum-karma-gains)= + +#### Karma gains + +Several forum interactions can give or remove karma points. + +```{eval-rst} +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - Interaction + - Description + - Default karma gain + * - :guilabel:`Asking a question` + - You post a question. + - 2 + * - :guilabel:`Question upvoted` + - Another user votes for a question you posted. + - 5 + * - :guilabel:`Question downvoted` + - Another user votes against a question you posted. + - -2 + * - :guilabel:`Answer upvoted` + - Another user votes for an answer you posted. + - 10 + * - :guilabel:`Answer downvoted` + - Another user votes against an answer you posted. + - -2 + * - :guilabel:`Accepting an answer` + - You mark an answer posted by another user as best. + - 2 + * - :guilabel:`Answer accepted` + - Another user marks an answer you posted as best. + - 15 + * - :guilabel:`Answer flagged` + - A question or an answer you posted is :ref:`marked as offensive `. + - -100 +``` + +:::{note} +New users receive **three points** upon validating their email address. +::: + +To modify the default values, go to {menuselection}`Website --> Configuration --> Forum: Forums`, +select the forum, and go to the {guilabel}`Karma Gains` tab. Select a value to edit it. + +If the value is positive (e.g., `5`), the number of points will be added to the user's tally each +time the interaction happens on the selected forum. Conversely, if the value is negative (e.g., +`-5`), the number of points will be deducted. Use `0` if an interaction should not impact a user's +tally. + +(forum-karma-related-rights)= + +#### Karma-related rights + +To configure how many karma points are required to access the different forum functionalities, go +to {menuselection}`Website --> Configuration --> Forum: Forums`, select the forum, and go to the +{guilabel}`Karma Related Rights` tab. Select a value to edit it. + +:::{warning} +Some functionalities, such as {guilabel}`Edit all posts`, {guilabel}`Close all posts`, +{guilabel}`Delete all posts`, {guilabel}`Moderate posts`, and {guilabel}`Unlink all comments`, +are rather sensitive. Make sure to understand the consequences of giving *any* user reaching the +set karma requirements access to such functionalities. +::: + +```{eval-rst} +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - Functionality + - Description + - Default karma requirement + * - :guilabel:`Ask questions` + - Post questions. + - 3 + * - :guilabel:`Answer questions` + - Post answers to questions. + - 3 + * - :guilabel:`Upvote` + - Vote for questions or answers. + - 5 + * - :guilabel:`Downvote` + - Vote against questions or answers. + - 50 + * - :guilabel:`Edit own posts` + - Edit questions or answers you posted. + - 1 + * - :guilabel:`Edit all posts` + - Edit any question or answer. + - 300 + * - :guilabel:`Close own posts` + - Close questions or answers you posted. + - 100 + * - :guilabel:`Close all posts` + - Close any question or answer. + - 500 + * - :guilabel:`Delete own posts` + - Delete questions or answers you posted. + - 500 + * - :guilabel:`Delete all posts` + - Delete any question or answer. + - 1,000 + * - :guilabel:`Nofollow links` + - If you are under the karma threshold, a *nofollow* attribute tells search engines to ignore + links you post. + - 500 + * - :guilabel:`Accept an answer on own questions` + - Mark an answer as best on questions you posted. + - 20 + * - :guilabel:`Accept an answer to all questions` + - Mark an answer as best on any question. + - 500 + * - :guilabel:`Editor Features: image and links` + - Add links and images to your posts. + - 30 + * - :guilabel:`Comment own posts` + - Post comments under questions or answers you created. + - 1 + * - :guilabel:`Comment all posts` + - Post comments under any question or answer. + - 1 + * - :guilabel:`Convert own answers to comments and vice versa` + - Convert comments you posted as answers. + - 50 + * - :guilabel:`Convert all answers to comments and vice versa` + - Convert any comment as answer. + - 500 + * - :guilabel:`Unlink own comments` + - Delete comments you posted. + - 50 + * - :guilabel:`Unlink all comments` + - Delete any comment. + - 500 + * - :guilabel:`Ask questions without validation` + - Questions you post do not require to be :ref:`validated ` first. + - 100 + * - :guilabel:`Flag a post as offensive` + - Flag a question or answer as offensive. + - 500 + * - :guilabel:`Moderate posts` + - Access all :ref:`moderation tools `. + - 1,000 + * - :guilabel:`Change question tags` + - Change posted questions' :ref:`tags ` (if you have the right to edit them). + - 75 + * - :guilabel:`Create new tags` + - Create new :ref:`tags ` when posting questions. + - 30 + * - :guilabel:`Display detailed user biography` + - When a user hovers their mouse on your avatar or username, a popover box showcases your + karma points, biography, and number of :ref:`badges ` per level. + - 750 +``` + +:::{tip} +Track all karma-related activity and add or remove karma manually by {ref}`enabling developer +mode ` and going to {menuselection}`Settings --> Gamification Tools --> Karma +Tracking`. +::: + +(forum-gamification)= + +### Gamification + +Ranks and badges can be used to encourage participation. Ranks are based on the total {ref}`karma +points `, while badges can be granted manually or automatically by completing +challenges. + +(forum-ranks)= + +#### Ranks + +To create new ranks or modify the default ones, go to {menuselection}`Website --> Configuration --> +Forum: Ranks` and click {guilabel}`New` or select an existing rank. + +Add the {guilabel}`Rank Name`, the {guilabel}`Required Karma` points to reach it, its +{guilabel}`Description`, a {guilabel}`Motivational` message to encourage users to reach it, and an +image. + +```{image} forum/ranks.png +:alt: Default forum ranks +``` + +(forum-badges)= + +#### Badges + +To create new badges or modify the default ones, go to {menuselection}`Website --> Configuration --> +Forum: Badges` and click {guilabel}`New` or select an existing badge. + +Enter the badge name and description, add an image, and configure it. + +##### Assign manually + +If the badge should be granted manually, select which users can grant them by selecting one of the +following {guilabel}`Allowance to Grant` options: + +- {guilabel}`Everyone`: all non-portal users (since badges are granted from the backend). +- {guilabel}`A selected list of users`: users selected under {guilabel}`Authorized Users`. +- {guilabel}`People having some badges`: users who have been granted the badges selected under + {guilabel}`Required Badges`. + +It is possible to restrict how many times per month each user can grant the badge by enabling +{guilabel}`Monthly Limited Sending` and entering a {guilabel}`Limitation Number`. + +##### Assign automatically + +If the badge should be granted **automatically** when certain conditions are met, select +{guilabel}`No one, assigned through challenges` under {guilabel}`Allowance to Grant`. + +Next, determine how the badge should be granted by clicking {guilabel}`Add` under the +{guilabel}`Rewards for challenges` section. Select a challenge to add it or create one by clicking +{guilabel}`New`. + +:::{tip} +It is possible to give the badge a {guilabel}`Forum Badge Level` ({guilabel}`Bronze`, +{guilabel}`Silver`, {guilabel}`Gold`) to give it more or less importance. +::: + +```{image} forum/badges.png +:alt: Default forum badges +``` + +(forum-tags)= + +### Tags + +Users can use tags to filter forum posts. + +To manage tags, go to {menuselection}`Website --> Configuration --> Forum: Tags`. Click +{guilabel}`New` to create a tag and select the related {guilabel}`Forum`. + +:::{tip} +- Use the {guilabel}`Tags` section on the forum's sidebar to filter all questions assigned to the + selected tag. Click {guilabel}`View all` to display all tags. +- New tags can be created when posting a new message, provided the user has enough {ref}`karma + points `. +::: + +(forum-use)= + +## Use a forum + +:::{note} +Access to many functionalities depends on a user's {ref}`karma points +`. +::: + +(forum-post)= + +### Post questions + +To create a new post, access the forum's front end, click {guilabel}`New Post`, and fill in the +following: + +- {guilabel}`Title`: add the question or the topic of the post. +- {guilabel}`Description`: add a description for the question. +- {guilabel}`Tags`: add up to five {ref}`tags `. + +Click {guilabel}`Post Your Question`. + +(forum-interact)= + +### Interact with posts + +Different actions are possible on a post. + +- Mark a question as **favorite** by clicking the star button ({guilabel}`☆`). +- Follow a post and get **notifications** (by email or within Odoo) when it is answered by clicking + the bell button ({guilabel}`🔔`). +- **Vote** *for* (up arrow {guilabel}`▲`) or *against* (down arrow {guilabel}`▼`) a question or + answer. +- Mark an answer as **best** by clicking the check mark button ({guilabel}`✔`). This option is only + available if the {guilabel}`Forum Mode` is set to {guilabel}`Questions`. +- {guilabel}`Answer` a question. +- **Comment** on a question or answer by clicking the speech bubble button ({guilabel}`💬`). +- **Share** a question on Facebook, Twitter, or LinkedIn by clicking the *share nodes* button. + +Click the ellipsis button ({guilabel}`...`) to: + +> - {guilabel}`Edit` a question or answer. +> - {guilabel}`Close` a question. +> - {guilabel}`Delete` a question, answer, or comment. It is possible to {guilabel}`Undelete` +> questions afterward. +> - {guilabel}`Flag` a question or answer as offensive. +> - {guilabel}`Convert` a comment into an answer. +> - {guilabel}`View` the related {ref}`Helpdesk ticket `, if any. + +```{image} forum/post-actions.png +:alt: Posts actions +``` + +:::{note} +By default, 150 karma points are required to view another user's profile. This value can be +configured when creating a new website. +::: + +(forum-moderation)= + +## Moderate a forum + +On the forum's front end, the sidebar's {guilabel}`Moderation tools` section gathers the essential +moderator functionalities. + +```{image} forum/moderation-tools.png +:alt: Forum sidebar moderation tools +``` + +{guilabel}`To Validate`: access all questions and answers waiting for validation before being +displayed to non-moderator users. + +```{image} forum/to-validate.png +:alt: Question to validate +``` + +:::{note} +A question is pending if a user does not have the required karma. The user is not able to post +questions or answers while awaiting validation. Only one pending question per user is allowed per +forum. +::: + +{guilabel}`Flagged`: access all questions and answers that have been flagged as offensive. Click +{guilabel}`Accept` to remove the offensive flag or {guilabel}`Offensive` to confirm it, then select +a reason and click {guilabel}`Mark as offensive`. The post is then hidden from users without +moderation rights, and 100 karma points are deducted from the offending user's tally. + +```{image} forum/offensive-reason.png +:alt: Offensive reason selection +``` + +{guilabel}`Closed`: access all questions that have been closed. It is possible to {guilabel}`Delete` +or {guilabel}`Reopen` them. To close a question, open it, click the ellipsis button +({guilabel}`...`), then {guilabel}`Close`, select a {guilabel}`Close Reason`, and click +{guilabel}`Close post`. The post is then hidden from users without moderation rights. + +:::{note} +When selecting {guilabel}`Spam or advertising` or {guilabel}`Contains offensive or malicious +remarks` as the reason, 100 karma points are deducted from the poster's tally. +::: + +:::{tip} +- Create and edit close reasons by going to {menuselection}`Website --> Configuration --> Forum: + Close Reasons`. Select {guilabel}`Basic` as {guilabel}`Reason Type` if the reason should be + used when closing a question, and {guilabel}`Offensive` if it should be used for flagged posts. +- Manage all posts by going to {menuselection}`Website --> Configuration --> Forum: Forums`, + selecting the forum, and clicking the {guilabel}`Posts` smart button. By clicking the + {guilabel}`Actions` button, it is possible to {guilabel}`Export`, {guilabel}`Archive`, + {guilabel}`Unarchive`, or {guilabel}`Delete` one or multiple posts. +::: + diff --git a/content/applications/websites/livechat.md b/content/applications/websites/livechat.md new file mode 100644 index 000000000..a18a915fb --- /dev/null +++ b/content/applications/websites/livechat.md @@ -0,0 +1,273 @@ +--- +show-content: true +--- + +# Live Chat + +Odoo **Live Chat** allows users to communicate with website visitors in real-time. With **Live +Chat**, leads can be qualified for their sales potential, support questions can be answered quickly, +and issues can be directed to the appropriate team for further investigation or follow up. **Live +Chat** also provides the opportunity for instant feedback from customers. + +## Enable Live Chat + +The **Live Chat** application can be installed multiple ways: + +- Go to {menuselection}`Apps application`, search `Live Chat`, and click {guilabel}`Install`. + +- Go to the {menuselection}`Helpdesk app --> Configuration --> Helpdesk Teams` list view, select a + team, and on the team's settings page, click the checkbox next to {guilabel}`Live Chat`, under the + {guilabel}`Channels` section. + +- In the {menuselection}`Website` app, go to {menuselection}`Configuration --> Settings`, scroll to + the {guilabel}`Email & Marketing` section, check the box next to {guilabel}`Livechat`, and click + {guilabel}`Save`. + + ```{image} livechat/enable-setting.png + :align: center + :alt: View of the settings page and the live chat feature for Odoo Live Chat. + ``` + +:::{note} +After the **Live Chat** application is installed, a live chat *Channel* is created, by default. +::: + +## Create live chat channels + +To create a new live chat *Channel*, go to {menuselection}`Main Odoo Dashboard --> Live Chat app --> +New`. This opens a blank channel detail form. Enter the name of the new channel in the +{guilabel}`Channel Name` field. + +```{image} livechat/open-channel.png +:align: center +:alt: View of a live chat channel form for Odoo Live Chat. +``` + +To configure the remaining tabs on the channel detail form ({ref}`Operators +`, {ref}`Options `, {ref}`Channel Rules +`, and {ref}`Widget `), follow the steps below. + +:::{tip} +The channel detail form for any channel can be accessed by navigating back to the +{guilabel}`Website Live Chat Channels` dashboard, via the breadcrumbs. Find the Kanban card for +the appropriate live chat channel, hover over it, and then click on the {icon}`fa-ellipsis-v` +{guilabel}`(vertical ellipsis)` icon to open the drop-down menu. Click {guilabel}`Configure +Channel` to open the channel detail form. +::: + +(livechat-operators-tab)= + +### Operators tab + +*Operators* are the users who act as agents and respond to live chat requests from customers. When a +user is added as an operator in a live chat channel, they can receive chats from website visitors +wherever they are in the database. Chat windows open in the bottom-right corner of the screen. + +```{image} livechat/pop-up.png +:align: center +:alt: View of a live chat pop up window in an Odoo database. +``` + +On the channel detail form, click the {guilabel}`Operators` tab. The user who originally created the +live chat channel has been added as an operator by default. + +:::{note} +Current operators can be edited, or removed, by clicking on their respective boxes in the +{guilabel}`Operators` tab, which reveals a separate {guilabel}`Open: Operators` modal. In that +modal, adjust any information, as needed. Then, click {guilabel}`Save`, or click +{guilabel}`Remove` to remove that operator from the channel. +::: + +Click {guilabel}`Add` to reveal an {guilabel}`Add: Operators` pop-up window. + +In the pop-up window, scroll to find the desired users, or enter their name in the search bar. Then, +tick the checkbox next to the users to be added, and click {guilabel}`Select`. + +New operators can be created and added to the list directly from this pop-up window, as well, by +clicking {guilabel}`New`, and filling out the {guilabel}`Create Operators` form. When the form is +complete, click {guilabel}`Save & Close`, or {guilabel}`Save & New` for multiple record creations. + +:::{danger} +Creating a new user can impact the status of an Odoo subscription, as the total number of users +in a database counts towards the billing rate. Proceed with caution before creating a new user. +If a user already exists, adding them as an operator will **not** alter the subscription or +billing rate for a database. +::: + +(livechat-options-tab)= + +### Options tab + +The {guilabel}`Options` tab on the live chat channel detail form contains the visual and text +settings for the live chat window. + +(livechat-livechat-button)= + +#### Livechat button + +The *Livechat Button* is the icon that appears in the bottom-right corner of the website. + +```{image} livechat/chat-button.png +:align: center +:alt: View of an Odoo website emphasizing the livechat button. +``` + +Change the text in the {guilabel}`Notification text` field to update the greeting displayed in the +text bubble when the live chat button appears on the website. + +The {guilabel}`Livechat Button Color` alters the color of the live chat button as it appears on the +website. To change the color, click on a color bubble to open the color selection window, then click +and drag the circle along the color gradient. Click out of the selection window once complete. Click +the {icon}`fa-refresh` {guilabel}`(refresh)` icon to the right of the color bubbles to reset the +colors to the default selection. + +:::{tip} +Color selection, for the button or header, can be made manually using a slider or through RGB, +HSL, or HEX color code entries from the pop-up color selection window that appears when either of +the color bubbles are clicked. Different options are available, depending on the operating +system. +::: + +#### Livechat Window + +The *Livechat Window* is the space where the live chat conversation with website visitors takes +place. + +Edit the {guilabel}`Welcome Message` to change the message a visitor sees when they open a new chat +session. This message appears as though it is sent by a live chat operator, and acts as both a +greeting and an invitation to continue the conversation. + +Edit the {guilabel}`Chat Input Placeholder` to alter the text that appears in the box where visitors +type their replies. This message prompts the visitor to initiate the chat. + +The *Channel Header* is the colored bar at the top of the chat window. The {guilabel}`Channel Header +Color` can be changed following the same steps as the {ref}`Livechat button +`. + +:::{figure} livechat/chat-window.png +:align: center + +The live chat window with a purple channel header and placeholder text that reads, "Say +Something..." +::: + +(livechat-channel-rules-tab)= + +### Channel Rules tab + +To configure which website user actions open the live chat window, go to the {guilabel}`Channel +Rules` tab on the live chat channel detail form. + +To create a new channel rule, click {guilabel}`Add a line`. This opens the {guilabel}`Create Rules` +pop-up window. + +```{image} livechat/create-rules.png +:align: center +:alt: View of a channel's rules form for Odoo Live Chat. +``` + +#### Create new rules + +Fill out the fields on the {guilabel}`Create Rules` pop-up window as instructed below, then click +{guilabel}`Save & Close`. + +```{eval-rst} +.. tabs:: + + .. tab:: Live Chat Button + + The *Livechat Button* is the icon that appears in the bottom-right corner of the website. + Select from one of the following display options: + + - :guilabel:`Show`: displays the chat button on the page. + - :guilabel:`Show with notification`: displays the chat button, as well as a floating text + bubble next to the button. + - :guilabel:`Open automatically`: displays the button, and automatically opens the chat window + after a specified amount of time (designated in the :guilabel:`Open automatically timer` + field, that appears when this option is selected). + - :guilabel:`Hide`: hides the chat button on the page. + + .. tab:: Chatbot + + To include a :doc:`Chatbot ` on this channel, select it from the drop-down + menu. If the chatbot should only be active when no operators are active, check the box labeled + :guilabel:`Enabled only if no operator`. + + The :guilabel:`Enabled only if no operator` field is **only** visible if a chatbot is selected + in the :guilabel:`Chatbot` field. + + .. tab:: URL Regex + + The *URL Regex* specifies the web pages where this rule should be applied. In the + :guilabel:`URL Regex` field, input the relative URL of the page where the chat button should + appear. + + For example, to apply the rule to the URL, `https://mydatabse.odoo.com/shop`, enter `/shop` + to the :guilabel:`URL Regex` field. + + To apply the rule to *all* pages on the database, enter `/` in the :guilabel:`URL Regex` + field. + + .. tab:: Open automatically timer + + This field designates the amount of time (in seconds) a page should be open before the chat + window opens. This field **only** appears if the :guilabel:`Live Chat Button` for this rule is + set to :guilabel:`Open automatically`. + + .. tab:: Country + + If this channel should **only** be available to site visitors in specific countries, add them + to the :guilabel:`Country` field. If this field is left blank, the channel is available to all + site visitors, regardless of location. +``` + +:::{note} +In order to track the geographical location of visitors, *GeoIP* **must** be installed on the +database. While this feature is installed by default on *Odoo Online* databases, *On-Premise* +databases require additional {doc}`setup steps `. +::: + +(livechat-widget-tab)= + +### Widget tab + +The {guilabel}`Widget` tab on the live chat channel detail form provides the code for a website +widget. This code can be added to a website to provide access to a live chat window. + +:::{tip} +The live chat widget can be added to websites created through Odoo by navigating to +{menuselection}`Website app --> Configuration --> Settings`. Then, scroll to the +{menuselection}`Email & Marketing` section. In the {guilabel}`Channel` field, select the channel +to add to the site. Click {guilabel}`Save` to apply. +::: + +To add the widget to a website created on a third-party platform, click the first {guilabel}`COPY` +button on the {guilabel}`Widget` tab, and paste the code into the `` tag on the site. + +Likewise, to send a live chat session to a customer, click the second {guilabel}`COPY` button on the +{guilabel}`Widget` tab. This link can be sent directly to a customer. When they click the link, they +are redirected to a new chat window. + +```{image} livechat/widget-code.png +:align: center +:alt: View of the widget tab for Odoo Live Chat. +``` + +:::{seealso} +- {doc}`../productivity/discuss` +- {doc}`livechat/responses` +- {doc}`livechat/ratings` +- {doc}`livechat/chatbots` +- {doc}`livechat/participate` +::: + +```{toctree} +:titlesonly: true + +livechat/ratings +livechat/responses +livechat/chatbots +livechat/reports +livechat/participate +``` + diff --git a/content/applications/websites/livechat/chatbots.md b/content/applications/websites/livechat/chatbots.md new file mode 100644 index 000000000..f8533b809 --- /dev/null +++ b/content/applications/websites/livechat/chatbots.md @@ -0,0 +1,264 @@ +# Chatbots + +A *Chatbot* is a program designed to mimic a conversation with a live human. Chatbots are assigned a +script of pre-written steps to follow. The scripts are designed to anticipate a visitor's potential +response, and lead them through a series of questions and answers the same way a live team member +would. + +Chatbots can be customized to fill various roles, from customer support, to creating leads, to +collecting contact information. The goal of each chatbot can vary based on several criteria, +including the webpage where it is located, and the information it captures. + +```{image} chatbots/chatbot-visitor-view.png +:align: center +:alt: View of the chat window with a helpdesk ticket created in Odoo Live Chat. +``` + +## Build a chatbot + +Before creating a new chatbot, the *Live Chat* application must first be installed on the database. +This can be done directly from the {menuselection}`Apps` application, by searching for `Live Chat` +in the {guilabel}`Search...` bar, and clicking {guilabel}`Install`. + +Once the *Live Chat* application has been installed on the database, go to {menuselection}`Live Chat +app --> Configuration --> Chatbots`. + +:::{note} +When the *Live Chat* app is installed, a sample chatbot is created, named *Welcome Bot*. This +chatbot has a preconfigured script that walks through a few basic steps, including asking for a +visitor's email address, and forwarding the conversation to an operator. + +*Welcome Bot* can be used as a starting point. The existing steps can be edited or removed, and +new steps can be added to customize the script, as needed. + +*Welcome Bot* can be deleted or archived, if necessary. + +```{image} chatbots/chatbot-welcome-bot.png +:align: center +:alt: View of the Welcome Bot script in Odoo Live Chat. +``` +::: + +To create a new chatbot, navigate to the {guilabel}`Chatbot` page ({menuselection}`Live Chat app --> +Configuration --> Chatbots`) and click {guilabel}`New`. This opens a blank chatbot details page. + +On the blank chatbot details page, enter a name in the {guilabel}`Chatbot Name` field and click on +the {guilabel}`Edit Image` icon in the upper right corner of the form to add a photo. + +### Chatbot scripts + +After the new chatbot has been created and named, the next step is to create a script. Chatbot +conversations follow an accompanying script. These scripts are comprised of lines of dialog, each +designed to deliver or capture information. + +To create a chatbot script, click {guilabel}`Add a Line` in the {guilabel}`Script` tab of the +chatbot detail page, and a {guilabel}`Create Script Steps` modal appears. + +This form must be filled out for **each** line of text (dialog) that the chatbot could deliver +during the conversation. + +First, enter the content of the message in the {guilabel}`Message` field. Then, select an option +from the {guilabel}`Step Type` and {guilabel}`Only If` drop-down menus. + +#### Step types + +The {guilabel}`Step Type` selected depends on the intended purpose of the message. The available +options in the {guilabel}`Step Type` drop-down menu are detailed below: + +##### Text + +This step is used for messages where no answer is expected or necessary. Text steps can be used for +greetings, to offer resources, such as documentation, or provide links to specific web pages. + +:::{important} +*Text* step types are only intended to deliver information, and do **not** allow for any visitor +input. As such, they **must** be followed by additional steps to continue the conversation. +::: + +##### Question + +This step asks a question and provides a set of answers. The visitor clicks on one answer, which +either leads to a new step in the conversation, or can lead to an optional link to a new webpage. + +Enter the question in the {guilabel}`Message` field. Then, under the {guilabel}`Answer` heading, +click {guilabel}`Add a Line` to create a blank answer line. + +Proceed to enter the answer as it should appear to the visitor. To turn the answer into a link that +redirects the visitor when selected, add the URL to the answer line under the {guilabel}`Optional +Link` heading. + +Repeat these steps for every answer to be included for the question. + +Click {guilabel}`Save & Close` or {guilabel}`Save & New`. + +:::{tip} +It is helpful to add a catchall answer to question steps (e.g: `Something else`). This helps +visitors continue the conversation, even if their needs do not exactly fit with any of the other +answers. +::: + +##### Email + +This step prompts visitors to provide their email address, which is stored and can be used by team +members later to follow up with additional information. + +The **only** accepted inputs for this step type are email addresses that are in a valid format. If a +visitor attempts to enter anything other than a valid email address, the chatbot responds with a +message stating it does not recognize the information submitted. + +```{image} chatbots/chatbot-invalid-email.png +:align: center +:alt: View of a chatbot responding to an invalid email. +``` + +##### Phone + +Similar to email, this step type prompts the visitor to enter their phone number, which can be used +to follow up with additional information, schedule demos, and more. + +:::{warning} +Due to the vast number of formats used for phone numbers worldwide, responses to this step type +are **not** validated for formatting, and can include both numbers and special characters. +::: + +##### Forward to Operator + +This step forwards the conversation to an active live chat operator, so they can continue +assisting the visitor. As the conversation transcript is passed on to the operator, they can pick up +where the chatbot left off. This not only saves time for all parties involved, it can also help +qualify conversations before they reach live operators. + +:::{note} +If no active operator is available on the channel, the chatbot continues the conversation with +the visitor. Therefore, additional steps should be added after this one to ensure there is no +abrupt end to the conversation. The additional steps can both inform visitors about the lack of +available operators (e.g. `Uh-oh, it looks like none of our operators are available`) and +continue the conversation (e.g. `Would you like to leave your email address?`). + +```{image} chatbots/chatbot-no-operator.png +:align: center +:alt: View of a chatbot follow up messages when no live chat operator is available. +``` +::: + +##### Free Input/Multi-Line + +The *free input* step allows visitors to respond to questions without providing pre-written +responses. Information provided in these responses is stored in the chat transcripts. + +Choose between {guilabel}`Free Input` and {guilabel}`Free Input (Multi-Line)` depending on the type +and amount of information the visitor is asked to provide. + +##### Create Lead + +This step creates a lead in the *CRM* application. Select an option from the {guilabel}`Sales Team` +drop-down field that appears to assign the created lead to a specific team. + +:::{note} +This step is **only** available if the *CRM* application is installed on the database. +::: + +##### Create Ticket + +This step creates a {doc}`ticket <../../services/helpdesk/overview/receiving_tickets>` in +the *Helpdesk* application. Select an option from the {guilabel}`Helpdesk Team` drop-down field that +appears to assign the created ticket to a specific team. + +:::{note} +This step is **only** available if the *Helpdesk* application is installed on the database. +::: + +#### Only if + +Chatbot scripts operate on an if/then basis, which means the next question presented to the visitor +is determined by the answer provided to the previous question. + +To continue the progression of the conversation, the {guilabel}`Create Script Steps` form for a new +step contains a field labeled {guilabel}`Only If`. This field is where the progression of questions +is defined. + +If a step is intended to follow all of the previous messages, this field can be left empty. However, +if a message should **only** be sent conditionally, based on a previous response, or several +previous responses, those responses **must** be added to this field. + +:::{important} +If any selections are made in the {guilabel}`Only If` field, they must **all** be selected during +the conversation *before* this step will be included. Only include selections in this field if +they are necessary for this step to be displayed. +::: + +```{eval-rst} +.. example:: + In the *Welcome Bot* script, a visitor can ask about pricing information. If the visitor selects + this response, a step is included to forward the conversation to an operator. The chatbot first + sends a message informing the visitor that it is checking to see if an operator is available to + chat. + + However, this message should **only** be delivered if the visitor requests pricing information. + In that situation, the conversation would proceed as below: + + - Welcome Bot: "*What are you looking for?*" + - Visitor: "**I have a pricing question.**" + - Welcome Bot: "*Hmmm, let me check if I can find someone that could help you with that...*" + + In the details form for the :guilabel:`Text` step, the *I have a pricing question* response has + been selected in the :guilabel:`Only If` field. As such, this step is **only** shown in + conversations where that response has been selected. + + .. image:: chatbots/chatbot-only-if.png + :align: center + :alt: View of the new message form emphasizing the Only If field. +``` + +### Script testing + +To ensure all visitors have a satisfactory experience with the chatbot, each message needs +to lead to a natural conclusion. Chatbot scripts should be tested to confirm there are no dead-ends, +and to understand what the visitor sees when they interact with the chatbot. + +:::{important} +If the visitor provides an answer, or input, that is **not** assigned a corresponding follow-up +response, the conversation stops (*dead-ends*). Since the visitor cannot re-engage the chatbot, +they must restart the conversation by refreshing the chat window, or their browser. +::: + +To test the performance of a chatbot, first click on the {guilabel}`Test` button at the top-left of +the chatbot script page. Then, upon being redirected to the testing screen, answer the chatbot +prompts the same way a potential site visitor would. + +When the script has reached an end-point, the message *Conversation ended...Restart* appears at the +bottom of the chat window. To begin the conversation at the beginning of the script, click on +{guilabel}`Restart`. To return to the script page, click {guilabel}`Back to edit mode` at the top of +the page. + +## Add chatbot to a channel + +After a chatbot has been created and tested, it needs to be added to a live chat channel. + +First, open the {menuselection}`Live Chat` application, find the Kanban card for the appropriate +live chat channel, hover over it, and click the {guilabel}`⋮ (three dots)` icon to open the +drop-down menu. Click {guilabel}`Configure Channel` to open the channel detail form. + +:::{note} +To create a new live chat channel, open the {menuselection}`Live Chat app` and click +{guilabel}`New`. See {doc}`Live Chat <../livechat>` for more information. +::: + +Click on the {guilabel}`Channel Rules` tab. Then, open an existing rule, or create a new one by +clicking {guilabel}`Add a line`. + +On the {guilabel}`Create Rules` modal, choose the appropriate chatbot in the {guilabel}`Chatbot` +field. + +If the chatbot should **only** be active if there are no live chat operators available, check the +box labeled {guilabel}`Enabled only if no operator`. + +```{image} chatbots/chatbot-add-to-channel.png +:align: center +:alt: View of the channel rules emphasizing the chatbot field. +``` + +:::{seealso} +{doc}`Live chat channel rules ` +::: + diff --git a/content/applications/websites/livechat/participate.md b/content/applications/websites/livechat/participate.md new file mode 100644 index 000000000..edc64189f --- /dev/null +++ b/content/applications/websites/livechat/participate.md @@ -0,0 +1,103 @@ +# Participate in live chat + +*Operators* are the users who respond to live chat requests from customers and website visitors. The +information below outlines the necessary steps for operators participating in live chat +conversations on an Odoo database. + +## Set an online chat name + +Before participating in a live chat, operators may choose to update their *Online Chat Name*. This +is the name displayed to site visitors in the live chat conversation. + +To update the *Online Chat Name*, click on the user avatar in the top-right corner of any page in +the database. Select {guilabel}`My Profile` from the drop-down menu to open the profile page. On the +right side of the {guilabel}`Preferences` tab, locate the {guilabel}`Online Chat Name` field, and +enter a preferred name. + +If a user's {guilabel}`Online Chat Name` is not set, the name displayed defaults to the user's name +that is designated on their profile page. + +```{eval-rst} +.. example:: + A user has their full name as their :guilabel:`User Name`, but they do not want to include their + last name in a live chat conversation. They would then set their :guilabel:`Online Chat Name` to + include only their first name. + + .. image:: participate/online-chat-name.png + :align: center + :alt: View of user profile in Odoo, emphasizing the Online Chat name field. +``` + +## Set online chat languages + +If an operator speaks multiple languages, they can add this information to their user profile. This +information can then be used to determine which conversations the operator is assigned. A visitor's +language is determined via their browser's language settings. + +:::{note} +Conversations are assigned to operators based on a number of criteria, including availability and +the number of ongoing conversations. While the operator's main language and additional languages +are taken into consideration, they do **not** supersede all other criteria. +::: + +To add *Online Chat Languages*, click on the user avatar in the top-right corner of any page in the +database. Select {guilabel}`My Profile` from the drop-down menu to open the profile page. On the +right side of the {guilabel}`Preferences` tab, click into the {guilabel}`Online Chat Language` +field, and select one or more languages from the drop-down menu. + +:::{important} +Only {doc}`languages <../../general/users/language>` that are enabled on the database can be +selected in the {guilabel}`Online Chat Language` field. +::: + +## Join or leave a channel + +To join a live chat channel, go to the {menuselection}`Live Chat app --> Channels`, and click the +{guilabel}`Join` button on the Kanban card for the appropriate channel. + +Any channel where the user is currently active shows a {guilabel}`Leave` button. Click this button +to disconnect from the channel. + +```{image} participate/leave-channel.png +:align: center +:alt: View of a channel form and the option to join a channel for Odoo Live Chat. +``` + +:::{important} +Operators that do not show any activity in Odoo for more than thirty minutes are considered +disconnected, and subsequently removed from the channel. +::: + +## Manage live chat requests + +When an operator is active in a channel, chat windows open in the bottom-right corner of the +screen, no matter where they are in the database. This allows them to access other pages and apps, +while still participating in the conversation. + +:::{tip} +Conversations can also be accessed by clicking the {icon}`fa-comments` {guilabel}`(messages)` +icon in the menu bar. + +```{image} participate/menu-bar.png +:align: center +:alt: View of the menu bar in Odoo emphasizing the comments icon. +``` +::: + +Live chat conversations can also be viewed by navigating to the {menuselection}`Discuss app`. New +conversations appear in bold under the {guilabel}`LIVECHAT` heading, located along the left panel. + +```{image} participate/managing-chat-responses.png +:align: center +:alt: View of the discuss application with a message sent through live chat in Odoo. +``` + +Click on a conversation in the left panel to select it. This opens the conversation. From this +view, an operator can participate in the chat the same as they would in the normal chat window. + +:::{seealso} +- {doc}`../../productivity/discuss` +- {doc}`../livechat` +- {doc}`../livechat/responses` +::: + diff --git a/content/applications/websites/livechat/ratings.md b/content/applications/websites/livechat/ratings.md new file mode 100644 index 000000000..b9a5099ec --- /dev/null +++ b/content/applications/websites/livechat/ratings.md @@ -0,0 +1,156 @@ +# Ratings + +At the end of a *Live Chat* conversation, customers have the opportunity to rate the quality of +support they received from the live chat *operator*. Customers provide ratings as soon as they close +the conversation. This allows operators to receive immediate feedback on their performance. It also +allows customers the chance to share any final comments before leaving the chat window. + +## Rate live chat conversations + +Customers end a *live chat* conversation by clicking the {guilabel}`X` in the upper right-hand +corner of the chat window. They are then prompted to select an icon that reflects their level of +satisfaction. The icons represent the following ratings: + +> - **Satisfied** - *green smiling face* +> - **Okay** - *yellow neutral face* +> - **Dissatisfied** - *red frowning face* + +```{image} ratings/live-chat-ratings-faces.png +:align: center +:alt: View of the chat window from a user's side for Odoo Live Chat. +``` + +:::{note} +When customers end a conversation, a field marked {guilabel}`Receive a copy of this conversation` +appears under the *ratings* icons. Customers can enter their email either before or after they +submit a rating. +::: + +If the customer selects {guilabel}`Satisfied (smile)` icon, they are presented with a thank you +message and a {guilabel}`Close Conversation` link. + +```{image} ratings/live-chat-thank-you.png +:align: center +:alt: View of customer's live chat window with thank you message. +``` + +If the customer selects either {guilabel}`Okay (neutral)` icon or {guilabel}`Dissatisfied (frown)` +icon, a text box will appear. Customers can add comments in this text box to explain why they chose +this rating. This message will be sent to the live chat operator, along with the rating icon. + +```{image} ratings/live-chat-ratings-operator-window.png +:align: center +:alt: View of a chat window from an operator's window highlighting a rating for Odoo +: Live Chat. +``` + +## Publish customer ratings + +To publish a channel's ratings on the website, first navigate to a live chat channel's record by +going to the {menuselection}`Live Chat` app and clicking on the kanban card for that team. Then +click on the {guilabel}`Go to Website` smart button. This will open the {guilabel}`Live Chat Channel +Statistics` page. + +In the upper right corner of the page, click the red {guilabel}`Unpublished` slider. The slider +changes from {guilabel}`Unpublished` to {guilabel}`Published`. + +```{image} ratings/live-chat-ratings-unpublished.png +:align: center +:alt: View of the published ratings on the portal for Odoo Live Chat. +``` + +:::{note} +The customer notes that are submitted with the rating will *not* be published on the website. +These are kept internal. Only a statistical overview of the operators' performance for the +*channel* appears on the website. +::: + +### Add ratings page to site + +Once the rating page has been published, it has to be manually added to the website. To do this, go +to the main Odoo dashboard and open the *Website* application. {menuselection}`Website app--> Site +--> Content --> Pages`, then click {guilabel}`New`. + +This will open a {guilabel}`New Page` pop-up window. In the {guilabel}`Page Title` field, enter +`livechat`. This acts as the URL for the published webpage. + +:::{important} +The URL *must* be named `livechat` in order for the database to recognize and connect the +ratings page. After the page has been published, the page title can be changed later under the +{guilabel}`Menu Editor`. +::: + +Click {guilabel}`Create`, and the newly created webpage will open. The {guilabel}`Webpage Editor` +appears in the right panel. + +The page lists the names of the {guilabel}`Live Chat Channels` whose ratings pages have been +published. On the left side of the channel name is a speech bubble icon, which users can click on to +go to the ratings' page for the respective channel. + +```{image} ratings/live-chat-published-icon.png +:align: center +:alt: View of the webpage for Live Chat ratings emphasizing the channel icon. +``` + +Make any desired changes or additions to this page, then click {guilabel}`Save` in the top right of +the webpage editor. The website editor side panel closes, and the webpage remains on the screen. + +To publish the `livechat` webpage, return to the list of webpages by navigating to +{menuselection}`Site --> Content --> Pages`. Click the checkbox to the left of `livechat` in the +list of pages to select the page and highlight the line. Then, click the checkbox under the column +labeled {guilabel}`Is Published`. The field with the checkbox is highlighted in white. Click the +checkbox a second time to activate the {guilabel}`Is Published` box. The webpage is now published. + +```{image} ratings/live-chat-is-published.png +:align: center +:alt: View of the list of pages for a website with the 'is published' box emphasized. +``` + +Once the page has been added to the site, ratings are set to be published by default. However, +individual ratings can be manually selected to be hidden from the public. The rating will still be +included in internal reports, and can still be viewed by internal teams. However, public website +visitors and portal users will not have access. + +See {ref}`Hide individual ratings ` for more information. + +## Customer ratings report + +The {guilabel}`Customer Ratings` report ({menuselection}`Live Chat --> Report --> Customer Ratings`) +displays an overview of the ratings received on individual support tickets, as well as any +additional comments submitted with the rating. + +```{image} ratings/live-chat-ratings-report.png +:align: center +:alt: View of the customer ratings report in Odoo Live Chat. +``` + +The report defaults to a kanban view, with each rating represented by a different card. To switch to +a different view, click on one of the icons in the upper-right corner of the screen. The report is +available in *list* view, *pivot* view, and *graph* view. + +Click on an individual rating to see additional details about the conversation, and the rating. + +(livechat-overview-hide-ratings)= + +### Hide individual ratings + +Ratings are set to be published by default. However, individual ratings can be manually selected to +be hidden from the public. The rating will still be included in internal reports, and can still be +viewed by internal teams. However, public website visitors and portal users will not have access. + +To hide a rating, go to {menuselection}`Live Chat app --> Reports --> Customer Ratings`. Click on +the kanban card for the rating to be hidden. On the individual rating's detail page, check the box +labeled {guilabel}`Visible Internally Only`. + +```{image} ratings/live-chat-ratings-visible-internally.png +:align: center +:alt: View of an individual rating's detail page with the visible internally setting +: checked. +``` + +:::{seealso} +- {doc}`/applications/websites/livechat` +- {doc}`responses` +- {doc}`/applications/websites/website` +::: + diff --git a/content/applications/websites/livechat/reports.md b/content/applications/websites/livechat/reports.md new file mode 100644 index 000000000..2d9647ab2 --- /dev/null +++ b/content/applications/websites/livechat/reports.md @@ -0,0 +1,189 @@ +# Reports + +Odoo *Live Chat* includes several reports that allow for the monitoring of operator performance and +the identification of trends in customer conversations. + +## Available reports + +The following reports are included in the *Live Chat* app: + +- {ref}`Sessions History ` +- {ref}`Session Statistics ` +- {ref}`Operator Analysis ` + +:::{note} +The *Live Chat Ratings Report* can also be accessed through the {guilabel}`Report` menu. For more +information on this report, and on the *Live Chat* rating process, see {doc}`Live Chat Ratings +<../livechat/ratings>`. +::: + +To access a drop-down menu of all the available reports, navigate to {menuselection}`Live Chat app +--> Report`. + +(livechat-sessions-history)= + +### Sessions History + +The *Sessions History* report displays an overview of live chat sessions, including session dates, +participant name and country, session duration, the number of messages, and the rating. It also +provides access to the complete transcripts of live chat sessions. + +To access this report, navigate to {menuselection}`Live Chat app --> Report --> Sessions History`. + +```{image} reports/sessions-history.png +:align: center +:alt: Example of the Sessions History report from the Live Chat application. +``` + +The information in this report can be exported, or inserted into a spreadsheet. + +Click the {guilabel}`⚙️ (gear)` icon to the right of the {guilabel}`History` page title, in the +top-left corner. Doing so reveals a drop-down menu. + +From the drop-down menu, click {guilabel}`Export All` to export all sessions to a spreadsheet, or +{guilabel}`Insert list in spreadsheet` to insert the information in a new, or existing, spreadsheet. + +To only export select sessions, first select the desired sessions to be exported from the list, by +clicking the checkbox to the left of each individual session. With the sessions selected, click the +{guilabel}`⚙️ (gear) Actions` icon in the top-center of the page, and click {guilabel}`Export` or +{guilabel}`Insert list in spreadsheet`. + +To view the transcript of an individual conversation, click anywhere on the entry line. This opens +the *Discuss* thread for the conversation. + +In the *Discuss* thread, the conversation view displays the entire transcript of the conversation. +At the top of the conversation, there is a list of the web pages the visitor browsed before +beginning their chat session, along with corresponding time stamps. If the visitor left a rating, it +is included at the end of the transcript. + +```{image} reports/chat-transcript.png +:align: center +:alt: View of the chat transcript in the Discuss application. +``` + +(livechat-session-statistics)= + +### Session Statistics + +The *Session Statistics* report provides a statistical overview of live chat sessions. The default +view for this report displays sessions grouped by the date of creation. + +To access this report, navigate to {menuselection}`Live Chat app --> Reports --> Session +Statistics`. + +:::{figure} reports/sessions-statistics.png +:align: center +:alt: Example of the Sessions Statistics report from the Live Chat application. + +The stacked bar graph view of the *Session Statistics* report, with results grouped by Creation +Date (hour), then by rating. +::: + +To view a different measure, click the {guilabel}`Measures` drop-down menu at the top-left of the +report. The measures available for this report include: + +- {guilabel}`# of speakers`: number of participants in the conversation. +- {guilabel}`Days of activity`: number of days since the operator's first session. +- {guilabel}`Duration of Session (min)`: the duration of a conversation, in minutes. +- {guilabel}`Is visitor anonymous`: denotes whether the conversation participant is anonymous. +- {guilabel}`Messages per session`: the total number of messages sent in a conversation. This + measure is included in the default view. +- {guilabel}`Rating`: the rating received by an operator at the end of a session, if one was + provided. +- {guilabel}`Session not rated`: denotes if a session did **not** receive a rating at the end of the + conversation. +- {guilabel}`Time to answer (sec)`: the average time, in seconds, before an operator responds to a + chat request. +- {guilabel}`Visitor is Happy`: denotes whether a positive rating was provided. If the visitor gave + either a negative or neutral rating, they are considered *unhappy*. +- {guilabel}`Count`: the total number of sessions. + +(livechat-operator-analysis)= + +### Operator Analysis + +The *Operator Analysis* report is used to monitor the performance of individual live chat operators. + +To access the report, navigate to {menuselection}`Live Chat app --> Reports --> Operator Analysis`. + +The default view for this report is a bar chart, which only displays conversations from the current +month, as indicated by the {guilabel}`This Month` default search filter. Conversations are grouped +by operator. + +To view a different measure, click the {guilabel}`Measures` drop-down menu at the top-left of the +report. The measures available for this report include: + +- {guilabel}`# of Sessions`: the number of sessions an operator participated in. This measure is + included by default. +- {guilabel}`Average duration`: the average duration of a conversation, in seconds. +- {guilabel}`Average rating`: the average rating received by the operator. +- {guilabel}`Time to answer`: the average amount of time before the operator responds to a chat + request, in seconds. +- {guilabel}`Count`: the total number of sessions. + +```{image} reports/operator-analysis.png +:align: center +:alt: Example of the Operator Analysis report from the Live Chat application. +``` + +## View and filter options + +On any Odoo report, the view and filter options vary, depending on what data is being analyzed, +measured, and grouped. See below for additional information on the available views for the *Live +Chat* reports. + +:::{note} +The {ref}`Sessions History ` report is **only** available in list +view. +::: + +### Pivot view + +The *pivot* view presents data in an interactive manner. The {ref}`Session Statistics +` and {ref}`Operator Analysis ` reports are +available in pivot view. + +The pivot view can be accessed on a report by selecting the {guilabel}`grid icon` at the top-right +of the screen. + +To add a group to a row or column, click the {guilabel}`➕ (plus sign)` icon next to +{guilabel}`Total`, and then select one of the groups from the drop-down menu that appears. To remove +one, click the {guilabel}`➖ (minus sign)` icon, and de-select the appropriate option. + +### Graph view + +The *graph* view presents data in either a *bar*, *line*, or *pie* chart. The {ref}`Session +Statistics ` and {ref}`Operator Analysis ` +reports are available in graph view. + +Switch to the graph view by selecting the {guilabel}`line chart` icon at the top-right of the +screen. To switch between the different charts, select the desired view's corresponding icon at the +top-left of the chart, while in graph view. + +:::{tip} +Both the bar chart and line chart can utilize the *stacked* view option. This presents two or +more groups of data on top of each other, instead of next to each other, making it easier to +compare data. +::: + +### Save and share a favorite search + +The *Favorites* feature found on reports allows users to save their most commonly used filters, +without having to reconstruct them every time they are needed. + +To create and save a filter to the *Favorites* section on the search bar drop-down menu, follow the +steps below: + +1. Set the necessary parameters using the {guilabel}`Filters` and {guilabel}`Group By` options + available in the {guilabel}`Search...` bar drop-down menu and the {guilabel}`Measures` drop-down + menu at the top-left of the report. +2. Click the {guilabel}`🔻(triangle pointed down)` icon next to the {guilabel}`Search...` bar to + open the drop-down menu. +3. Under the {guilabel}`Favorites` heading, click {guilabel}`Save current search`. +4. Rename the search. +5. Select {guilabel}`Default filter` to have these filter settings automatically displayed when the + report is opened. Otherwise, leave it blank. +6. Select {guilabel}`Shared` to make this filter available to all other database users. If this box + is not checked, the filter is only available to the user who creates it. +7. Click {guilabel}`Save` to preserve the configuration for future use. + diff --git a/content/applications/websites/livechat/responses.md b/content/applications/websites/livechat/responses.md new file mode 100644 index 000000000..84c63872e --- /dev/null +++ b/content/applications/websites/livechat/responses.md @@ -0,0 +1,202 @@ +# Commands and canned responses + +In the Odoo **Live Chat** application, *commands* allow the user to perform specific actions both +inside the chat window, and through other Odoo applications. The **Live Chat** app also includes +*canned responses*. These are customized, preconfigured substitutions that allow users to replace +shortcut entries in place of longer, well-thought out responses to some of the most common questions +and comments. + +Both commands and canned responses save time, and allow users to maintain a level of consistency +throughout their conversations. + +## Execute a command + +Live chat *commands* are keywords that trigger preconfigured actions. When a live chat *operator* +is participating in a conversation with a customer or website visitor, they can execute a command by +typing `/`, followed by the command. + +Commands, and the resulting actions, are only visible in the conversation window for the live chat +operator. A customer does not see any commands that an operator uses in a conversation from their +view of the chat. + +```{eval-rst} +.. example:: + During a conversation with a customer, a live chat operator executes the command to :ref:`create + a ticket `. After entering the command, `/ticket`, the system automatically + creates a ticket with the information from the conversation. It also includes a link to the new + ticket, so the operator can go there directly to add any additional information, if necessary. + + .. image:: responses/responses-ticket-link.png + :align: center + :alt: View of the chat window with a helpdesk ticket created in Odoo Live Chat. +``` + +More information about each available command can be found below. + +### Help + +If an operator types `/help` in the chat window, an informative message that includes the potential +entry types an operator can make is displayed. + +- Type `@username` to mention a user in the conversation. A notification will be sent to that user's + inbox or email, depending on their notification settings. +- Type `/command` to execute a command. +- Type `:shortcut` to insert a {ref}`canned response `. + +:::{seealso} +- {doc}`/applications/productivity/discuss` +- {doc}`/applications/productivity/discuss/team_communication` +::: + +### Ticket & search tickets + +The `/ticket` and `/search_tickets` commands allow operators to create helpdesk tickets directly +from a conversation, and search through existing tickets by keyword or ticket number. + +:::{important} +The `/ticket` and `/search_tickets` commands can **only** be used if the **Helpdesk** app has +been installed, and *Live Chat* has been activated on a *Helpdesk* team. To activate *Live Chat*, +go to {menuselection}`Helpdesk app --> Configuration --> Helpdesk Teams`, and select a team. +Scroll to the {guilabel}`Channels` section, and check the box labeled, {guilabel}`Live Chat`. +::: + +(live-chat-ticket)= + +#### Create a ticket from a live chat + +If an operator types `/ticket` in the chat window, the conversation is used to create a *Helpdesk* +ticket. + +After entering the `/ticket` command, type a title for the ticket into the chat window, then press +`Enter`. + +```{image} responses/helpdesk.png +:align: center +:alt: View of the results from a helpdesk search in a Live Chat conversation. +``` + +The newly created ticket will be added to the *Helpdesk* team that has live chat enabled. If more +than one team has live chat enabled, the ticket will automatically be assigned based on the team's +priority. + +The transcript from the conversation will be added to the new ticket, under the +{guilabel}`Description` tab. + +To access the new ticket, click on the link in the chat window, or go to the +{menuselection}`Helpdesk app` and click the {guilabel}`Tickets` button on the Kanban card for the +appropriate team. + +#### Search for a ticket from a live chat + +If an operator types `/search_tickets` in the chat window, they can search through *Helpdesk* +tickets, either by ticket number or keyword. + +After entering the `/search_tickets` command, type a keyword or ticket number, then press +{kbd}`Enter`. If one or more related tickets are found, a list of links is generated in the +conversation window. + +```{image} responses/helpdesk-search.png +:align: center +:alt: View of the results from a helpdesk search in a Live Chat conversation. +``` + +:::{note} +Results from the search command will only be seen by the operator, not the customer. +::: + +### History + +If an operator types `/history` in the chat window, it generates a list of the most recent pages the +visitor has viewed on the website (up to 15). + +```{image} responses/responses-history.png +:align: center +:alt: View of the results from a /history command in a Live Chat conversation. +``` + +### Lead + +By typing `/lead` in the chat window, an operator can create a *lead* in the **CRM** application. + +```{image} responses/responses-lead.png +:align: center +:alt: View of the results from a /lead command in a Live Chat conversation. +``` + +:::{important} +The `/lead` command can only be used if the **CRM** app has been installed. +::: + +After typing `/lead`, create a title for this new lead, then press `Enter`. A link with the lead +title appears. Click the link, or navigate to the {menuselection}`CRM` app to view the +{guilabel}`Pipeline`. + +:::{note} +The link to the new lead can only be seen and accessed by the operator, not the customer. +::: + +The transcript of that specific live chat conversation (where the lead was created) is added to the +{guilabel}`Internal Notes` tab of the lead form. + +On the {guilabel}`Extra Information` tab of the lead form, the {guilabel}`Source` will be listed as +{guilabel}`Livechat`. + +### Leave + +If an operator types `/leave` in the chat window, they can automatically exit the conversation. This +command does not cause the customer to be removed from the conversation, nor does it automatically +end the conversation. + +:::{seealso} +- {doc}`/applications/sales/crm/acquire_leads` +- {doc}`../../services/helpdesk` +::: + +(live-chat-canned-responses)= + +## Canned responses + +*Canned responses* are customizable inputs where a *shortcut* stands in for a longer response. An +operator will enter the shortcut, and it is automatically replaced by the expanded *substitution* +response in the conversation. + +### Create canned responses + +To create a new canned response, go to {menuselection}`Live Chat app --> Configuration --> Canned +Responses --> New`. + +Type a shortcut command in the {guilabel}`Shortcut` field. Next, click the {guilabel}`Substitution` +field, and type the message that should replace the shortcut. + +:::{tip} +Try to connect the shortcut to the topic of the substitution. The easier it is for the operators +to remember, the easier it is to use the canned responses in conversations. +::: + +### Use canned responses in a live chat conversation + +To use a canned response during a live chat conversation, type a colon (`:`) into the chat window, +followed by the shortcut. + +```{eval-rst} +.. example:: + An operator is chatting with a visitor. As soon as they type `:` they would see a list of + available responses. They can manually select one from the list, or continue to type. If they + want to use the canned response `'I am sorry to hear that.'`, they would type `:sorry`. +``` + +```{image} responses/canned-responses.png +:align: center +:alt: View of a chat window and the use of a canned response in Odoo Live Chat. +``` + +:::{tip} +Typing `:` into a chat window on its own will generate a list of available canned responses. +Responses can be manually selected from the list, in addition to the use of shortcuts. + +```{image} responses/response-list.png +:align: center +:alt: View of a chat window and the list of available canned responses. +``` +::: + diff --git a/content/applications/websites/website.md b/content/applications/websites/website.md new file mode 100644 index 000000000..922c05c68 --- /dev/null +++ b/content/applications/websites/website.md @@ -0,0 +1,69 @@ +--- +hide-page-toc: true +nosearch: true +show-content: true +--- + +# Website + +**Odoo Website** offers a user-friendly platform for creating and managing your website. It includes +various tools and features to help you design, publish, and maintain web pages without needing +advanced technical skills. You can easily customize layouts, add multimedia content, and integrate +with other Odoo apps to expand your website's functionality. + +```{eval-rst} +.. cards:: + + .. card:: Web design + :target: website/web_design + :large: + + Design your website using building blocks and website themes. + + .. card:: Pages + :target: website/pages + :large: + + Manage website pages, menus, and search engine optimization. + + .. card:: Configuration + :target: website/configuration + :large: + + Configure domain names, address autocompletion, Google Search Console, cookies bar, + translations, multiple websites, form spam protection, content delivery network (CDN). + + .. card:: Reporting + :target: website/reporting + + Monitor your website's traffic with website analytics and set up link trackers. + + .. card:: Mail groups + :target: website/mail_groups + + Configure mail groups to allow website visitors to participate in public discussions via + email. +``` + +:::{note} +Odoo offers a {ref}`free custom domain name ` to all Odoo Online databases +for one year. Visitors can then access your website with an address such as `www.example.com` +rather than the default `example.odoo.com`. +::: + +:::{seealso} +- [Odoo Tutorials: Website](https://www.odoo.com/slides/website-25) +- [Odoo Tutorials: eCommerce](https://www.odoo.com/slides/ecommerce-26) +- {doc}`../general/integrations/unsplash` +::: + +```{toctree} +:titlesonly: true + +website/web_design +website/pages +website/configuration +website/reporting +website/mail_groups +``` + diff --git a/content/applications/websites/website/configuration.md b/content/applications/websites/website/configuration.md new file mode 100644 index 000000000..595d0b4f3 --- /dev/null +++ b/content/applications/websites/website/configuration.md @@ -0,0 +1,19 @@ +--- +nosearch: true +--- + +# Configuration + +```{toctree} +:titlesonly: true + +configuration/domain_names +configuration/address_autocomplete +configuration/google_search_console +configuration/cookies_bar +configuration/translate +configuration/multi_website +configuration/spam_protection +configuration/cdn +``` + diff --git a/content/applications/websites/website/configuration/address_autocomplete.md b/content/applications/websites/website/configuration/address_autocomplete.md new file mode 100644 index 000000000..e018c3030 --- /dev/null +++ b/content/applications/websites/website/configuration/address_autocomplete.md @@ -0,0 +1,63 @@ +# Address autocomplete + +You can use the Google Places API on your website to ensure that your users' delivery addresses +exist and are understood by the carrier. The Google Places API allows developers to access detailed +information about places using HTTP requests. The autocompletion predicts a list of places when the +user starts typing the address. + +```{image} address_autocomplete/address-autocomplete-example.png +:alt: Address autocomplete example +``` + +:::{seealso} +- [Google Maps Platform](https://mapsplatform.google.com/maps-products) +- [Google Developers Documentation: Google Places API](https://developers.google.com/maps/documentation/places/web-service/autocomplete) +::: + +To do so, go to {menuselection}`Website --> Configuration --> Settings` and enable +{guilabel}`Address Autocomplete` in the {guilabel}`SEO` section. + +```{image} address_autocomplete/enable-address-autocomplete.png +:alt: Enable address autocomplete +``` + +Insert your {guilabel}`Google Places API key` in the {guilabel}`API Key` field. If you don't have +one, create yours on the [Google Cloud Console](https://console.cloud.google.com/getting-started) +and follow these steps. + +(address-autocomplete-generate-api-key)= + +## Step 1: Enable the Google Places API + +**Create a New Project:** +To enable the **Google Places API**, you first need to create a project. To do so, click +{guilabel}`Select a project` in the top left corner, {guilabel}`New Project`, and follow the prompts +to set up your project. + +**Enable the Google Places API:** +Go to the {guilabel}`Enabled APIs & Services` and click {guilabel}`+ ENABLE APIS AND SERVICES.` +Search for {guilabel}`"Places API"` and select it. Click on the {guilabel}`"Enable"` button. + +:::{note} +Google's pricing depends on the number of requests and their complexity. +::: + +## Step 2: Create API Credentials + +Go to [APIs & Services --> Credentials](https://console.cloud.google.com/apis/credentials). + +**Create credentials:** +To create your credentials, go to {guilabel}`Credentials`, click {guilabel}`Create Credentials`, and +select {guilabel}`API key`. + +:::{admonition} Restrict the API Key (Optional) +For security purposes, you can restrict the usage of your API key. You can go to the +{guilabel}`API restrictions` section to specify which APIs your key can access. For the Google +Places API, you can restrict it to only allow requests from specific websites or apps. +::: + +:::{important} +- Save Your API Key: copy your API key and securely store it. +- Do not share it publicly or expose it in client-side code. +::: + diff --git a/content/applications/websites/website/configuration/cdn.md b/content/applications/websites/website/configuration/cdn.md new file mode 100644 index 000000000..04abd69bb --- /dev/null +++ b/content/applications/websites/website/configuration/cdn.md @@ -0,0 +1,113 @@ +# Set up a content delivery network (CDN) + +(reference-cdn-keycdn)= + +## Deploying with KeyCDN + +A {abbr}`CDN (Content Delivery Network)` or *content distribution network*, is a geographically +distributed network of servers that provides high speed internet content. The {abbr}`CDN (Content +Delivery Network)` provides quick, high-quality content delivery for content-heavy websites. + +This document will guide you through the setup of a [KeyCDN] account with an Odoo powered website. + +### Create a pull zone in the KeyCDN dashboard + +On the KeyCDN dashboard, start by navigating to the {menuselection}`Zones` menu item on the left. On +the form, give a value to the {guilabel}`Zone Name`, which will appear as part of the {abbr}`CDN +(Content Delivery Network)`'s {abbr}`URL (Uniform Resource Locator)`. Then, set the {guilabel}`Zone +Status` to {guilabel}`active` to engage the zone. For the {guilabel}`Zone Type` set the value to +{guilabel}`Pull`, and then, finally, under the {guilabel}`Pull Settings`, enter the +{guilabel}`Origin URL`— this address should be the full Odoo database {abbr}`URL (Uniform Resource +Locator)`. + +```{eval-rst} +.. example:: + Use ``https://yourdatabase.odoo.com`` and replace the *yourdatabase* subdomain prefix with the + actual name of the database. A custom :abbr:`URL (Uniform Resource Locator)` can be used, as + well, in place of the Odoo subdomain that was provided to the database. +``` + +```{image} cdn/keycdn-zone.png +:align: center +:alt: KeyCDN's Zone configuration page. +``` + +Under the {guilabel}`General Settings` heading below the zone form, click the {guilabel}`Show all +settings` button to expand the zone options. This should be the last option on the page. After +expanding the {guilabel}`General Settings` ensure that the {guilabel}`CORS` option is +{guilabel}`enabled`. + +Next, scroll to the bottom of the zone configuration page and {guilabel}`Save` the changes. KeyCDN +will indicate that the new zone will be deployed. This can take about 10 minutes. + +```{image} cdn/zone-url.png +:align: center +:alt: KeyCDN deploying the new Zone. +``` + +:::{note} +A new {guilabel}`Zone URL` has been generated for your Zone, in this example it is +`pulltest-xxxxx.kxcdn.com`. This value will differ for each database. +::: + +Copy this {guilabel}`Zone URL` to a text editor for later, as it will be used in the next steps. + +### Configure the Odoo instance with the new zone + +In the Odoo {guilabel}`Website` app, go to the {menuselection}`Settings` and then activate the +{guilabel}`Content Delivery Network (CDN)` setting and copy/paste the {guilabel}`Zone URL` value +from the earlier step into the {guilabel}`CDN Base URL` field. This field is only visible and +configurable when the {ref}`developer mode ` is activated. + +:::{note} +Ensure that there are two *forward slashes* (`//`) before the {guilabel}`CDN Base URL` and one +forward slash (`/`) after the {guilabel}`CDN Base URL`. +::: + +{guilabel}`Save` the settings when complete. + +```{image} cdn/cdn-base-url.png +:align: center +:alt: Activate the CDN setting in Odoo. +``` + +Now the website is using the CDN for the resources matching the {guilabel}`CDN filters` regular +expressions. + +In the HTML of the Odoo website, the {abbr}`CDN (content delivery network)` integration is evidenced +as working properly by checking the {abbr}`URL (Uniform Resource Locators)` of images. The *CDN Base +URL* value can be seen by using your web browser's {guilabel}`Inspect` feature on the Odoo website. +Look for it's record by searching within the {guilabel}`Network` tab inside of devtools. + +```{image} cdn/test-pull.png +:align: center +:alt: The CDN Base URL can be seen using the inspect function on the Odoo website. +``` + +### Prevent security issues by activating cross-origin resource sharing (CORS) + +A security restriction in some browsers (such as Mozilla Firefox and Google Chrome) prevents a +remotely linked CSS file to fetch relative resources on this same external server. + +If the {abbr}`CORS (Cross-Origin Resource Sharing)` option isn't enabled in the {guilabel}`CDN +Zone`, the more obvious resulting problem on a standard Odoo website will be the lack of *Font +Awesome* icons because the font file declared in the *Font Awesome* CSS won't be loaded from the +remote server. + +When these cross-origin resource issues occur, a security error message similar to the output +below will appear in the web browser's developer console: + +`Font from origin 'http://pulltest-xxxxx.kxcdn.com' has been blocked from loading /shop:1 by +Cross-Origin Resource Sharing policy: No 'Access-Control-Allow-Origin' header is present on the +requested resource. Origin 'http://yourdatabase.odoo.com' is therefore not allowed access.` + +```{image} cdn/odoo-security-message.png +:align: center +:alt: Error message populated in the browser console. +``` + +Enabling the {abbr}`CORS (Cross-Origin Resource Sharing)` option in the {abbr}`CDN (Content Delivery +Network)` settings fixes this issue. + +[keycdn]: https://www.keycdn.com + diff --git a/content/applications/websites/website/configuration/cookies_bar.md b/content/applications/websites/website/configuration/cookies_bar.md new file mode 100644 index 000000000..184530aa8 --- /dev/null +++ b/content/applications/websites/website/configuration/cookies_bar.md @@ -0,0 +1,56 @@ +# Cookies bar + +**Cookies** are small text files sent to your device when you visit a website. They are processed +and stored by your browser and track user information like login details, preferences, and browsing +history. **Essential cookies** are necessary for the website to function, while **optional cookies** +are used to analyze behavior or display ads. + +Data protection laws require notifying users about data collection methods and purposes. +**Cookies bar** fulfill this obligation by informing users on their first visit and allowing them to +decide whether to store all or only essential cookies on their device. + +## Configuration + +To enable the cookies bar on your website, go to {menuselection}`Website --> Configuration --> +Settings` and enable {guilabel}`Cookies Bar` in the {guilabel}`Privacy` section. + +:::{note} +The {ref}`Cookies Policy ` page (/cookie-policy\`) is automatically created +when you enable the cookies bar. +::: + +(cookies-bar-customization)= + +## Customization + +To adapt the display of the cookies bar, click {guilabel}`Edit`, go to the +{guilabel}`Invisible Elements` section at the bottom of the panel, and click +{guilabel}`Cookies Bar`. You can modify the {guilabel}`Layout` and {guilabel}`Size` of the +cookies bar, and enable {guilabel}`Backdrop` to gray out the page in the background when the cookies +bar is displayed on the screen. + +Click anywhere in the building block to further customize the appearance of the cookies bar using +{guilabel}`Block`, {guilabel}`Column` and/or {guilabel}`Inline Text` customization options. + +To edit the contents of the cookies bar (i.e., the consent message), click directly in the building +block. + +(cookies-bar-policy)= + +## Cookies policy + +When you enable the cookies bar for your website, Odoo creates the **Cookie Policy** page +(`/cookie-policy`) containing a non-exhaustive list of cookies, with their purpose and examples. To +access it, click the {guilabel}`Cookie Policy` hyperlink in the cookies bar or open the page from +{menuselection}`Website --> Site --> Pages`. + +To adapt the content of the page according to your needs, click the {guilabel}`Edit` button. + +:::{tip} +You could add a link to this page in your website's footer, for example. +::: + +:::{seealso} +{doc}`Pages <../pages>` +::: + diff --git a/content/applications/websites/website/configuration/domain_names.md b/content/applications/websites/website/configuration/domain_names.md new file mode 100644 index 000000000..00a023601 --- /dev/null +++ b/content/applications/websites/website/configuration/domain_names.md @@ -0,0 +1,393 @@ +# Domain names + +Domain names are text-based addresses identifying online locations, such as websites. They provide a +more memorable and recognizable way for people to navigate the internet than numerical IP addresses. + +**Odoo Online** and **Odoo.sh** databases use a **subdomain** of the `odoo.com` **domain** by +default (e.g., `mycompany.odoo.com`). + +However, you can use a custom domain name instead by {ref}`registering a free domain name +` (only available for Odoo Online databases) or by {ref}`configuring a +domain name you already own `. + +:::{seealso} +[Odoo Tutorials: Register a free domain name [video]](https://www.odoo.com/slides/slide/register-a-free-domain-name-1663) +::: + +(domain-name-register)= + +## Register a free domain name with Odoo + +To register a one-year free domain name for your Odoo Online database, sign in to your account and +go to the [database manager](https://www.odoo.com/my/databases). Click the gear icon +({guilabel}`⚙️`) next to the database name and select {guilabel}`Domain Names`. + +```{image} domain_names/domain-names.png +:alt: Accessing a database's domain names configuration +``` + +Search for the desired domain name and check its availability. + +```{image} domain_names/domain-search.png +:alt: Searching for an available domain name +``` + +:::{tip} +Ensure the Website app is installed if the domain name registration option does not appear. +::: + +Select the desired domain name, fill in the {guilabel}`Domain Owner` form, and click +{guilabel}`Register`. The chosen domain name is directly linked to the database. + +```{image} domain_names/domain-owner.png +:alt: Filling in the domain owner information +``` + +Next, you should {ref}`map your domain name to your Odoo website `. + +:::{important} +A verification email from `noreply@domainnameverification.net` will be sent to the email address +provided in the {guilabel}`Domain Owner` form. It is essential to verify your email address to +keep the domain active and receive the renewal quote before expiration. +::: + +The domain name registration is free for the first year. After this period, Odoo will continue to +manage the domain in partnership with **Gandi.net**, the domain name registrar, and you will be +charged [Gandi.net's renewal rate](https://www.gandi.net/en/domain). Odoo sends a renewal +quotation every year to the email address mentioned in the {guilabel}`Domain Owner` form several +weeks before the expiration date of the domain. The domain is renewed automatically when the +quotation is confirmed. + +:::{note} +- The offer is only available for **Odoo Online** databases. +- The offer is limited to **one** domain name per client. +- The offer is limited to the registration of a **new** domain name. +- The offer is available to *One App Free* plans. Ensure that your website contains enough + original content for Odoo to verify that your request is legitimate and respects [Odoo's + Acceptable Use Policy](https://www.odoo.com/acceptable-use). Given the high number of + requests, it can take Odoo several days to review them. +::: + +(domain-name-register-dns)= + +### DNS records + +To manage your free domain name {abbr}`DNS (domain name system)` records, open the [database manager](https://www.odoo.com/my/databases), click the gear icon ({guilabel}`⚙️`) next to the database +name, select {guilabel}`Domain Names`, and click {guilabel}`DNS`. + +- {guilabel}`A`: the A record holds the IP address of the domain. It is automatically created and + **cannot** be edited or deleted. +- {guilabel}`CNAME`: CNAME records forward one domain or subdomain to another domain. One is + automatically created to map the `www.` subdomain to the database. If the database is renamed, the + CNAME record **must** also be renamed. +- {guilabel}`MX`: MX records instruct servers on where to deliver emails. +- {guilabel}`TXT`: TXT records can be used for different purposes (e.g., to verify domain name + ownership). + +Any modification to the DNS records can take up to **72 hours** to propagate worldwide on all +servers. + +:::{note} +[Submit a support ticket](https://www.odoo.com/help) if you need assistance to manage your +domain name. +::: + +### Mailbox + +The one-year free domain name offer does **not** include a mailbox. There are two options to link +your domain name with a mailbox. + +#### Use a subdomain + +You can create a subdomain (e.g., `subdomain.yourdomain.com`) to use as an alias domain for the +database. It allows users to create records in the database from emails received on their +`email@subdomain.yourdomain.com` alias. + +To do so, open the [database manager](https://www.odoo.com/my/databases), click the gear icon +({guilabel}`⚙️`) next to the database name, and go to {menuselection}`Domain Names --> DNS --> Add +DNS record --> CNAME`. Next, enter the desired subdomain in the {guilabel}`Name` field (e.g., +`subdomain`), the original database domain with a period at the end (e.g., `mycompany.odoo.com.`) in +the {guilabel}`Content` field, and click {guilabel}`Add record`. + +Then, add the alias domain as your *own domain* by clicking {guilabel}`Use my own domain`, entering +the alias domain (e.g., `subdomain.yourdomain.com`), clicking {guilabel}`Verify`, and then +{guilabel}`I confirm, it's done`. + +Finally, go to your database and open the {guilabel}`Settings`. Under the {guilabel}`Alias Domain` +field, enter the alias domain (e.g., `subdomain.yourdomain.com`), click {guilabel}`Create`, and then +{guilabel}`Save`. + +#### Use an external email provider + +To use an external email provider, you should configure an MX record. To do so, open the [database +manager](https://www.odoo.com/my/databases), click the gear icon ({guilabel}`⚙️`) next to the +database name, click {menuselection}`Domain Names --> DNS --> Add DNS record --> MX`. The values you +should enter for the {guilabel}`Name`, {guilabel}`Content`, and {guilabel}`Priority` fields depend +on the external email provider. + +:::{seealso} +- [Google Workspace: MX record values](https://support.google.com/a/answer/174125?hl=en) +- [Outlook and Exchange Online: Add an MX record for email](https://learn.microsoft.com/en-us/microsoft-365/admin/get-help-with-domains/create-dns-records-at-any-dns-hosting-provider?view=o365-worldwide#add-an-mx-record-for-email-outlook-exchange-online) +::: + +(domain-name-existing)= + +## Configure an existing domain name + +If you already have a domain name, you can use it for your Odoo website. + +:::{warning} +It is strongly recommended to follow **in order** these three steps to avoid any {ref}`SSL +certificate validation ` issues: + +1. {ref}`Add a CNAME record ` +2. {ref}`Map your domain name to your Odoo database ` +3. {ref}`Map your domain name to your Odoo website ` +::: + +(domain-name-cname)= + +### Add a CNAME record + +Adding a CNAME record to forward your domain name to the address of your Odoo database is required. + +```{eval-rst} +.. tabs:: + + .. group-tab:: Odoo Online + + The CNAME record's target address should be your database's address as defined at its creation + (e.g., `mycompany.odoo.com`). + + .. group-tab:: Odoo.sh + + The CNAME record's target address should be the project's main address, which can be found on + Odoo.sh by going to :menuselection:`Settings --> Project Name`, or a specific branch + (production, staging or development) by going to :menuselection:`Branches --> select the + branch --> Settings --> Custom domains`, and clicking :guilabel:`How to set up my domain?`. A + message indicates which address your CNAME record should target. +``` + +The specific instructions depend on your DNS hosting service. + +:::{seealso} +- [GoDaddy: Add a CNAME record](https://www.godaddy.com/help/add-a-cname-record-19236) +- [Namecheap: How to create a CNAME record for your domain](https://www.namecheap.com/support/knowledgebase/article.aspx/9646/2237/how-to-create-a-cname-record-for-your-domain) +- [OVHcloud: Add a new DNS record](https://docs.ovh.com/us/en/domains/web_hosting_how_to_edit_my_dns_zone/#add-a-new-dns-record) +- [Cloudflare: Manage DNS records](https://developers.cloudflare.com/dns/manage-dns-records/how-to/create-dns-records/) +::: + +:::{important} +Odoo only supports subdomains. To use your naked domain name {dfn}`(a domain name without any +subdomains or prefixes)` (`yourdomain.com`), create a redirection 301 to redirect visitors to +`www.yourdomain.com`. +::: + +```{eval-rst} +.. example:: + You own the domain name `yourdomain.com`, and your Odoo Online database's address is + `mycompany.odoo.com`. You want to access your Odoo database primarily with the domain + `www.yourdomain.com` and also with the naked domain `yourdomain.com`. + + To do so, create a CNAME record for the `www` subdomain, with `mycompany.odoo.com` as the target. + Next, create a redirect (301 permanent or visible redirect) to redirect visitors from + `yourdomain.com` to `wwww.yourdomain.com`. +``` + +#### Using Cloudflare to secure and redirect a naked domain + +To redirect a naked domain with a secure HTTPS connection, we recommend using Cloudflare, as most +DNS hosting services do not offer an easy way to do so. + +1. [Sign up and log in to Cloudflare](https://dash.cloudflare.com/sign-up). + +2. Enter your domain name on [Cloudflare's dashboard](https://dash.cloudflare.com/login) and + select {guilabel}`Quick scan for DNS records`. + +3. Choose a plan (the free plan is sufficient). + +4. Follow Cloudflare's instructions and recommendations to complete the activation. + +5. Add a CNAME record to redirect your naked domain (`yourdomain.com`) to the `www` subdomain + (e.g., `www.yourdomain.com`) by clicking {guilabel}`DNS` in the navigation menu, then clicking + the {guilabel}`Add record` button, and using the following configuration: + + - {guilabel}`Type`: CNAME + - {guilabel}`Name`: `@` (or `yourdomain.com`) + - {guilabel}`Target`: e.g., `www.yourdomain.com` + - {guilabel}`Proxy status`: Proxied + + ```{image} domain_names/cloudflare-cname-www.png + :alt: Adding a CNAME DNS record to Cloudflare to redirect a naked domain to a www subdomain + ``` + +6. Add another second CNAME record to redirect the `www` subdomain (e.g., `www.yourdomain.com`) to + your database address (e.g., `mycompany.odoo.com`) using the following configuration: + + - {guilabel}`Type`: CNAME + - {guilabel}`Name`: e.g., `www.yourdomain.com` + - {guilabel}`Target`: e.g., `mycompany.odoo.com` + - {guilabel}`Proxy status`: DNS only + + ```{image} domain_names/cloudflare-cname-db.png + :alt: Adding a CNAME DNS record to Cloudflare to redirect a www subdomain to an Odoo + : database + ``` + +7. Define a redirect rule to permanently redirect (301) your naked domain (e.g., `yourdomain.com`) + to both `http://` and `https://` by going to {menuselection}`Rules --> Create rule --> Products`, + and clicking {guilabel}`Create a Rule` under {guilabel}`Redirect Rules`: + + - Enter any {guilabel}`Rule name`. + + - Under the {guilabel}`If incoming requests match...` section, select {guilabel}`Custom filter + expression` and use the following configuration: + + - {guilabel}`Field`: Hostname + - {guilabel}`Operator`: equals + - {guilabel}`Value`: e.g., `yourdomain.com` + + - Under the {guilabel}`Then...` section, use the following configuration: + + - {guilabel}`Type`: Dynamic + - {guilabel}`Expression`: e.g., `concat("https://www.yourdomain.com", http.request.uri.path)` + - {guilabel}`Status code`: 301 + - {guilabel}`Preserve query string`: enabled + + ```{image} domain_names/cloudflare-redirect-rule.png + :alt: Defining a Cloudflare redirect rule to create a permanent redirect (301) + ``` + +8. Go to {guilabel}`SSL/TLS` and set the encryption mode to {guilabel}`Full`. + + ```{image} domain_names/cloudflare-encryption.png + :alt: Setting the encryption mode to full on Cloudflare + ``` + +(domain-name-db-map)= + +### Map a domain name to an Odoo database + +:::{warning} +Ensure you have {ref}`added a CNAME record ` to your domain name's DNS +**before** mapping your domain name to your Odoo database. + +Failing to do so may prevent the validation of the {ref}`SSL certificate ` and +could result in a *certificate name mismatch* error. Web browsers often display this as a +warning, such as *"Your connection is not private"*. + +If you encounter this error after mapping the domain name to your database, wait up to five +days, as the validation may still happen. If not, you can [submit a support ticket](https://www.odoo.com/help), including screenshots of your CNAME records. +::: + +```{eval-rst} +.. tabs:: + + .. group-tab:: Odoo Online + + Open the `database manager `_, click the gear icon + (:guilabel:`⚙️`) next to the database name, and go to :menuselection:`Domain Names --> Use my + own domain`. Then, enter the domain name (e.g., `www.yourdomain.com`), click + :guilabel:`Verify` and :guilabel:`I confirm, it's done`. + + .. image:: domain_names/map-database-online.png + :alt: Mapping a domain name to an Odoo Online database + + .. group-tab:: Odoo.sh + + On Odoo.sh, go to :menuselection:`Branches --> select your branch --> Settings --> Custom + domains`, type the domain name to add, then click :guilabel:`Add domain`. + + .. image:: domain_names/map-database-sh.png + :alt: Mapping a domain name to an Odoo.sh branch + + .. seealso:: + :ref:`Odoo.sh branches: settings tab ` +``` + +(domain-name-ssl)= + +#### SSL encryption (HTTPS protocol) + +**SSL encryption** allows visitors to navigate a website through a secure connection, which appears +as the *https://* protocol at the beginning of a web address rather than the non-secure *http://* +protocol. + +Odoo generates a separate SSL certificate for each domain {ref}`mapped to a database +` using [Let's Encrypt's certificate authority and ACME protocol](https://letsencrypt.org/how-it-works/). + +:::{note} +- Certificate generation may take up to 24 hours. +- Several attempts to validate your certificate are made for five days after you map your domain + name to your database. +- If you use another service, you can keep using it or change to Odoo's. +::: + +:::{important} +No SSL certificate is generated for naked domains {dfn}`(domain names without any subdomains +or prefixes)`. +::: + +(domain-name-web-base-url)= + +#### Web base URL of a database + +:::{note} +If the Website app is installed on your database, skip this section and continue from the +{ref}`Map a domain name to a website ` section. +::: + +The *web base URL* or root URL of a database affects your main website address and all the +links sent to your customers (e.g., quotations, portal links, etc.). + +To make your custom domain name the *web base URL* of your database, access your database using your +custom domain name and log in as an administrator {dfn}`(a user part of the Settings access right +group under Administration)`. + +:::{important} +If you access your database with the original Odoo address (e.g., `mycompany.odoo.com`), the *web +base URL* of your database will be updated accordingly. To prevent the automatic update of the +*web base URL* when an administrator logs in to the database, activate the {ref}`developer mode +`, go to {menuselection}`Settings --> Technical --> System Parameters --> New`, +and enter `web.base.url.freeze` as the {guilabel}`Key` and `True` as the {guilabel}`Value`. +::: + +:::{note} +You can also set the web base URL manually. To do so, activate the {ref}`developer mode +`, go to {menuselection}`Settings --> Technical --> System Parameters`, and +search for the `web.base.url` key (create it if necessary) and enter the full address of your +website as the value (e.g., `https://www.yourdomain.com`). The URL must include the protocol +`https://` (or `http://`) and *not* end with a slash (`/`). +::: + +(domain-name-website-map)= + +### Map a domain name to an Odoo website + +Mapping your domain name to your website is different than mapping it to your database: + +- It defines your domain name as the main one for your website, helping search engines to index your + website correctly. +- It defines your domain name as the base URL for your database, including portal links sent by + email to your customers. +- If you have multiple websites, it maps your domain name to the appropriate website. + +Go to {menuselection}`Website --> Configuration --> Settings`. If you have multiple websites, select +the one you want to configure. In the {guilabel}`Domain` field, enter the address of your website +(e.g., `https://www.yourdomain.com`) and {guilabel}`Save`. + +:::{warning} +Mapping your domain name to your Odoo website prevents Google Search from indexing your original +database address (e.g., `mycompany.odoo.com`). + +If both addresses are already indexed, it may take some time before the indexation of the second +address is removed from Google Search. You can use the [Google Search Console](https://search.google.com/search-console/welcome) to fix the issue. +::: + +:::{note} +If you have multiple websites and companies on your database, make sure to select the right +{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. +::: + diff --git a/content/applications/websites/website/configuration/google_search_console.md b/content/applications/websites/website/configuration/google_search_console.md new file mode 100644 index 000000000..ca7684e1e --- /dev/null +++ b/content/applications/websites/website/configuration/google_search_console.md @@ -0,0 +1,99 @@ +# Google Search Console + +Google Search Console is a free web service provided by Google that allows website owners to +monitor, maintain, and troubleshoot their site's presence in Google Search results. It offers +valuable insights into how Google views and interacts with your site, helping you optimize its +performance. + +To enable Google Search Console for your website, go to [Google Search Console](https://search.google.com/search-console/welcome). Then, select the property type +{ref}`GSC-Domain` or {ref}`GSC-URL prefix`. + +```{image} google_search_console/add-domain-or-url-prefix.png +:alt: Google Search Console domain or URL prefix +``` + +(gsc-domain)= + +## Domain property + +A domain property in Search Console tracks all versions of your website, including subdomains and +protocols (http/https). This comprehensive view allows you to analyze your overall website's search +performance and make informed decisions to optimize its visibility. Enter the domain, e.g., +`example.com` and click {guilabel}`Continue`. + +:::{note} +- The domain property type can only be verified via + [DNS record](https://support.google.com/webmasters/answer/9008080?hl=en#domain_name_verification&zippy=%2Chtml-tag). +- Google suggests creating at least one domain property to represent your site, as it is the most + complete view of your website information. +::: + +(gsc-url-prefix)= + +## URL prefix property + +This type of verification is usually simpler as you have multiple verification methods, such as +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`. + +## Site ownership verification + +Before using Google Search Console for your website, you must verify your site ownership. This +verification process is a security measure that protects both you and Google. It ensures that only +authorized users have access to sensitive data and that you have control over how your website is +treated in Google Search. + +Five methods are available to do this: + +(website-google-search-console)= + +1. {ref}`GSC-HTML-file-upload` +2. [DNS record](https://support.google.com/webmasters/answer/9008080?hl=en#domain_name_verification&zippy=%2Chtml-tag) +3. [HTML tag](https://support.google.com/webmasters/answer/9008080?hl=en#meta_tag_verification&zippy=%2Chtml-tag) +4. [Google Analytics tracking code](https://support.google.com/webmasters/answer/9008080?hl=en#google_analytics_verification) +5. [Google Tag Manager container snippet](https://support.google.com/webmasters/answer/9008080?hl=en#google_tag_manager_verification) + +:::{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 +verification. +::: + +(gsc-html-file-upload)= + +### HTML file upload + +This method involves uploading an HTML file provided by Google containing the verification code you +have to put in your Odoo's Website Settings. Google verifies ownership by checking for this code. + +1. Once you added your website URL under the URL prefix option and clicked {guilabel}`continue`, + expand the HTML file section where you find a download {icon}`fa-download` button. + + ```{image} google_search_console/html-file-download.png + :alt: HTML file download + ``` + +2. Download your HTML verification file and copy the verification code (e.g., `google123abc.html`). + + ```{image} google_search_console/open-copy-html-file.png + :alt: Open and copy html file + ``` + +3. In your Odoo database, go to {menuselection}`Website --> Configuration --> Settings`, + and enable {guilabel}`Google Search Console` in the {guilabel}`SEO` section. Paste the + verification code (e.g., `google123abc.html`) in the dedicated field. + + ```{image} google_search_console/paste-html-code-settings.png + :alt: Paste html code in Odoo + ``` + +4. In Google Search Console, click {guilabel}`Verify`. If you perform the steps above correctly, + verification should be done immediately. + +:::{seealso} +{doc}`domain_names` +::: + diff --git a/content/applications/websites/website/configuration/multi_website.md b/content/applications/websites/website/configuration/multi_website.md new file mode 100644 index 000000000..c60772650 --- /dev/null +++ b/content/applications/websites/website/configuration/multi_website.md @@ -0,0 +1,162 @@ +# Multiple websites + +Odoo allows you to create multiple websites from the same database. This can be useful, for example, +if you have multiple brands operating under your organization, or to create separate websites for +different products/services, or different audiences. In these cases, having different websites can +help avoid confusion and make it easier to tailor your digital outreach strategies and reach your +target audience. + +Each website can be designed and configured independently with its own {doc}`domain name +`, {doc}`theme <../web_design/themes>`, {doc}`pages <../pages>`, {doc}`menus +<../pages/menus>`, {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`. +::: + +## Website creation + +To create a new website, proceed as follows: + +1. Go to {menuselection}`Website --> Configuration --> Settings`. + +2. Click {guilabel}`+ New Website`. + + ```{image} multi_website/create-website.png + :alt: New website button + ``` + +3. Specify the {guilabel}`Website Name` and {guilabel}`Website domain`. Each website must be + published under its own {doc}`domain `. + +4. Adapt the {guilabel}`Company name`, {guilabel}`Languages` and {guilabel}`Default language` + if needed. + +5. Click the {guilabel}`Create` button. + +You can then start building your new website. + +:::{note} +By default, all website-related apps that you have installed (e.g. **eCommerce**, +**Forum**, **Blog**, etc.) and their related website pages are also available on the +new website. You can remove them by amending the website's menu. +::: + +## Switching websites + +To switch from one website to another, click the menu next to the {guilabel}`+New` button in the +top right corner and select the website you want to switch to. + +```{image} multi_website/switch-websites.png +:alt: Website selector +``` + +:::{note} +When you switch websites, you are redirected to the homepage of the other website. +::: + +## Website-specific configuration + +Most website settings are website-specific, which means they can be enabled/disabled per website. To +adapt the settings for a website, go to {menuselection}`Website --> Configuration --> Settings`. +Select the desired website in the field {guilabel}`Settings of Website` at the top of the +{guilabel}`Settings` page, in the **yellow** banner. Then, adapt the options for that specific +website. + +:::{note} +- Websites are created with the default settings; the settings are not copied from one website to + the other. +- In a {doc}`multi-company environment `, each website can be + linked to a specific company in your database so that only company-related data (e.g., + products, jobs, events, etc.) is displayed on the website. To display company-specific data, + set the desired company in the {guilabel}`Company` field. +::: + +(multi-website-website-content)= + +### Content availability + +By default, pages, products, events, etc. created from the frontend (using the +{guilabel}`+New` button) are only available on the website from which it was created. Records +created from the backend, however, are made available on all websites by default. The content's +availability can be changed in the backend, in the {guilabel}`Website` field. For example, for +products, go to {menuselection}`eCommerce --> Products`, then select the product and go to the +{guilabel}`Sales` tab. For forums, go to {menuselection}`Configuration --> Forums`, then select the +forum. + +```{image} multi_website/forum-multi-website.png +:alt: Website field in Forum form +``` + +(website-field)= + +Records and features can be made available: + +- On all websites: leave the {guilabel}`Website` field empty; +- Only on one website: set the {guilabel}`Website` field accordingly; +- On some websites: in this case, you should duplicate the item and set the {guilabel}`Website` + field. + +#### Website pages + +To modify the website on which a page is to be published, proceed as follows: + +1. Go to {menuselection}`Website --> Site --> Pages`. + +2. Open the search panel and select the website on which the page is currently published. + + ```{image} multi_website/pages-switch-websites.png + :alt: Display pages per website + ``` + +3. Tick the check box next to the page(s) you want to change. + +4. Click the {guilabel}`Website` field and select the website, or empty it to publish the page on + all websites. + +:::{note} +Each website must have its own homepage; you may not use the same homepage for several websites. +::: + +## eCommerce features + +eCommerce features such as products, eCommerce categories, pricelists, discounts, payment providers, +etc. can be restricted to {ref}`a specific website `. + +### Customer accounts + +You can {doc}`allow your customers to use the same account +<../../ecommerce/ecommerce_management/customer_accounts>` on all of your websites by enabling the +{guilabel}`Shared Customer Accounts` check box in the website settings. + +### Pricing + +Products can be priced differently based on the website using {ref}`pricelists +`. The following configuration is required: + +1. Go to {menuselection}`Website --> Configuration --> Settings`. +2. Scroll down to the {guilabel}`Shop - Products` section and select the {guilabel}`Pricelists` + option {guilabel}`Multiple prices per product`. +3. Click {guilabel}`Pricelists` to define new pricelists or edit existing ones. +4. Select the pricelist or click {guilabel}`New` to create a new one, then select the + {guilabel}`Configuration` tab and set the {guilabel}`Website` field. + +## Reporting + +### Analytics + +Each website has its own {ref}`analytics `. To switch between websites, click +the buttons in the upper right corner. + +```{image} multi_website/analytics-switch-websites.png +:alt: Switch websites in analytics +``` + +### Other reporting data + +Other reporting data such as eCommerce dashboard data, online sales analyses and visitors can be +grouped by website if necessary. Open the search panel and select {guilabel}`Group by --> Website`. + diff --git a/content/applications/websites/website/configuration/spam_protection.md b/content/applications/websites/website/configuration/spam_protection.md new file mode 100644 index 000000000..c669b7344 --- /dev/null +++ b/content/applications/websites/website/configuration/spam_protection.md @@ -0,0 +1,167 @@ +# 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. + +:::{important} +We recommend using **Cloudflare Turnstile** as reCAPTCHA v3 may not be compliant with local data +protection regulations. +::: + +:::{note} +All pages using the {guilabel}`Form`, {guilabel}`Newsletter Block`, {guilabel}`Newsletter Popup` +snippets, and the eCommerce {guilabel}`Extra Step During Checkout` form are protected by both +tools. +::: + +:::{seealso} +- [Cloudflare Turnstile's documentation](https://developers.cloudflare.com/turnstile/) +- [Google's reCAPTCHA v3 guide](https://developers.google.com/recaptcha/docs/v3) +::: + +(cloudflare-turnstile)= + +## Cloudflare Turnstile configuration + +### On Cloudflare + +- [Create](https://dash.cloudflare.com/sign-up) a Cloudflare account or use an existing one and + [log in](https://dash.cloudflare.com/login). + +- On the dashboard navigation sidebar, click {guilabel}`Turnstile`. + +- On the {guilabel}`Turnstile Sites` page, click {guilabel}`Add Site`. + +- Add a {guilabel}`Site name` to identify it easily. + +- Enter or select the website's {guilabel}`Domain` (e.g., *example.com* or *subdomain.example.com*). + +- Select a {guilabel}`Widget Mode`: + + - The {guilabel}`Managed` mode is **recommended**, as visitors can be prompted to check a box + confirming they are human if deemed necessary by Turnstile. + + ```{image} spam_protection/turnstile-human.png + :alt: Cloudflare Turnstile human verification widget + ``` + + - For the {guilabel}`Non-interactive` and {guilabel}`Invisible` modes, visitors are never + prompted to interact. In {guilabel}`Non-interactive` mode, a loading widget can be displayed to + warn visitors that Turnstile protects the form; however, the widget is not supported by Odoo. + + :::{note} + If the Turnstile check fails, visitors are not able to submit the form, and the following + error message is displayed: + + ```{image} spam_protection/turnstile-error.png + :alt: Cloudflare Turnstile verification error message + ``` + ::: + +- Click {guilabel}`Create`. + +```{image} spam_protection/turnstile-configuration.png +:alt: Adding a website to Cloudflare Turnstile +``` + +The generated keys are then displayed. Leave the page open for convenience, as copying the keys in +Odoo is required next. + +### On Odoo + +- From the database dashboard, click {guilabel}`Settings`. Under {guilabel}`Integrations`, enable + {guilabel}`Cloudflare Turnstile` and click {guilabel}`Save`. +- Open the Cloudflare Turnstile page, copy the {guilabel}`Site Key`, and paste it into the + {guilabel}`CF Site Key` field in Odoo. +- Open the Cloudflare Turnstile page, copy the {guilabel}`Secret Key`, and paste it into the + {guilabel}`CF Secret Key` field in Odoo. +- Click {guilabel}`Save`. + +:::{tip} +Navigate to Turnstile on your Cloudflare account to view the solve rates and access more +settings. +::: + +(google-recaptcha)= + +## reCAPTCHA v3 configuration + +:::{warning} +reCAPTCHA v3 may not be compliant with local data protection regulations. +::: + +### On Google + +Open [the reCAPTCHA website registration page](https://www.google.com/recaptcha/admin/create). Log +in or create a Google account if necessary. + +On the website registration page: + +- Give the website a {guilabel}`Label`. +- Leave the {guilabel}`reCAPTCHA type` on {guilabel}`Score based (v3)`. +- Enter one or more {guilabel}`Domains` (e.g., *example.com* or *subdomain.example.com*). +- Under {guilabel}`Google Cloud Platform`, a project is automatically selected if one was already + created with the logged-in Google account. If not, one is automatically created. Click + {guilabel}`Google Cloud Platform` to select a project yourself or rename the automatically created + project. +- Agree to the terms of service. +- Click {guilabel}`Submit`. + +```{image} spam_protection/recaptcha-google-configuration.png +:alt: reCAPTCHA website registration example +``` + +A new page with the generated keys is then displayed. Leave it open for convenience, as copying the +keys to Odoo is required next. + +### On Odoo + +- From the database dashboard, click {guilabel}`Settings`. Under {guilabel}`Integrations`, enable + {guilabel}`reCAPTCHA` if needed. + + :::{warning} + Do not disable the {guilabel}`reCAPTCHA` feature or uninstall the {guilabel}`Google reCAPTCHA + integration` module, as many other modules would also be removed. + ::: + +- Open the Google reCAPTCHA page, copy the {guilabel}`Site key`, and paste it into the + {guilabel}`Site Key` field in Odoo. + +- Open the Google reCAPTCHA page, copy the {guilabel}`Secret key`, and paste it into the + {guilabel}`Secret Key` field in Odoo. + +- Change the default {guilabel}`Minimum score` (`0.70`) if necessary, using a value between `1.00` + and `0.00`. The higher the threshold is, the more difficult it is to pass the reCAPTCHA, and vice + versa. Out of the 11 levels, only the following four score levels are available by default: + `0.1`, `0.3`, `0.7` and `0.9`. + +- Click {guilabel}`Save`. + +:::{seealso} +[Interpret reCAPTCHA scores - Google documentation](https://cloud.google.com/recaptcha/docs/interpret-assessment-website#interpret_scores) +::: + +You can notify visitors that reCAPTCHA protects a form. To do so, open the website editor and +navigate to the form. Then, click somewhere on the form, and on the right sidebar's +{guilabel}`Customize` tab, toggle {guilabel}`Show reCAPTCHA Policy` found under the {guilabel}`Form` +section. + +```{image} spam_protection/recaptcha-policy.png +:alt: reCAPTCHA policy message displayed on a form +``` + +:::{note} +If the reCAPTCHA check fails, the following error message is displayed: + +```{image} spam_protection/recaptcha-error.png +:alt: Google reCAPTCHA verification error message +``` +::: + +:::{tip} +Analytics and additional settings are available on [Google's reCAPTCHA administration page](https://www.google.com/recaptcha/admin/). For example, you can receive email alerts if Google +detects suspicious traffic on your website or view the percentage of suspicious requests, which +could help you determine the right minimum score. +::: + diff --git a/content/applications/websites/website/configuration/translate.md b/content/applications/websites/website/configuration/translate.md new file mode 100644 index 000000000..3e04485fd --- /dev/null +++ b/content/applications/websites/website/configuration/translate.md @@ -0,0 +1,116 @@ +# Translations + +Your website is displayed in the language that matches your visitor’s browser. If the browser’s +language has not been installed and added to your website, the content is shown in the +{ref}`default language `. When additional languages are installed, users +can choose their preferred language using the {ref}`language selector `. + +The {ref}`Translate ` feature on your website allows automatic translation of +standard terms and provides a tool for manual content translation. + +## Install languages + +To allow translation of your website, you must first {doc}`install <../../../general/users/language>` +the required languages and add them to your website. To do so, go to {menuselection}`Website --> +Configuration --> Settings` and click {icon}`fa-arrow-right` {guilabel}`Install languages` in the +{guilabel}`Website Info` section. In the dialog box that opens, select the {guilabel}`Languages` you +want from the dropdown menu, tick the required {guilabel}`Websites to translate`, and +click {guilabel}`Add`. + +To edit your website's languages, go to {menuselection}`Website -–> Configuration -–> Settings` and +add/remove the required languages in/from the {guilabel}`Languages` field in the +{guilabel}`Website info` section. + +:::{tip} +Alternatively, once the languages have been installed, you can add them from the {ref}`language +selector `. You might then need to refresh your page to see the new +language. +::: + +(translate-default-language)= + +### Default language + +When multiple languages are available on your website, you can set a default language to be used if +the visitor’s browser language is not available. To do so, go to {menuselection}`Website –-> +Configuration -–> Settings`, and select a language in the {guilabel}`Default` field. + +:::{note} +This field is only visible if multiple languages have been installed and added to your website. +::: + +(translate-language-selector)= + +## Language selector + +Your website’s visitors can switch languages using the language selector, available by default in +the {guilabel}`Copyright` section at the bottom of the page. To edit the language selector menu: + +1. Go to your website and click {guilabel}`Edit`; + +2. Click the language selector available in the {guilabel}`Copyright` block and go to the + {guilabel}`Copyright` section of the website builder; + +3. Set the {guilabel}`Language Selector` field to either {guilabel}`Dropdown` or {guilabel}`Inline`. + Click {guilabel}`None` if you do not want to display the {guilabel}`Language selector`; + + > ```{image} translate/language-selector.png + > :alt: Add a language selector menu. + > ``` + +4. Click {guilabel}`Save`. + +:::{tip} +You can also add the {guilabel}`Language Selector` to the {guilabel}`Header` of your page. To do +so, click the {guilabel}`Header` block and go to the {guilabel}`Navbar` section to edit the +{guilabel}`Language Selector`. +::: + +(translate-translate)= + +## Translate your website + +Select your desired language from the language selector to see your content in another language. +Then, click the {guilabel}`Translate` button in the top-right corner to manually activate the +translation mode so that you can translate what has not been translated automatically by Odoo. + +Translated text strings are highlighted in green; text strings that were not translated +automatically are highlighted in yellow. + +```{image} translate/translated-text.png +:alt: Entering the translation mode +``` + +In this mode, you can only translate text. To change the page's structure, you must edit the master +page, i.e., the page in the original language of the database. Any changes made to the master page +are automatically applied to all translated versions. + +To replace the original text with the translation, click the block, edit its contents, and +{guilabel}`Save`. + +:::{note} +When a website supports multiple languages, the core URL structure remains consistent across +languages, while specific elements like product names or categories are translated. For example, +`https://www.mywebsite.com/shop/product/my-product-1` is the English version of a product page, +while `https://www.mywebsite.com/fr/shop/product/mon-produit-1` is the French version of the same +page. The structure (/shop/product/) stays unchanged, but the translated elements (e.g., product +name) adapt to the selected language. +::: + +:::{tip} +Once the desired language is installed, you can translate some items from the backend (e.g., the +product's name in the product form). To do so, click the language code (e.g., {guilabel}`EN`) next +to the text you want to translate and add the translation. +::: + +### Content visibility by language + +You can hide content (such as images or videos, for example) depending on the language. To do so: + +1. Click {guilabel}`Edit` and select an element of your website; +2. Go to the {guilabel}`Text - Image` section and {guilabel}`Visibility`; +3. Click {guilabel}`No condition` and select {guilabel}`Conditionally` instead; +4. Go to {guilabel}`Languages` to configure the condition(s) to apply by selecting + {guilabel}`Visible for` or {guilabel}`Hidden for`, and click {guilabel}`Choose a record` to + decide which languages are impacted. + diff --git a/content/applications/websites/website/mail_groups.md b/content/applications/websites/website/mail_groups.md new file mode 100644 index 000000000..cf4217db9 --- /dev/null +++ b/content/applications/websites/website/mail_groups.md @@ -0,0 +1,137 @@ +# Mail groups + +The **mail groups** feature allows website visitors to have a public discussion by email. They can +join a group to receive emails from other group members (i.e., website users who have subscribed to +the group) and send new ones to all group members. + +To activate the feature, {ref}`install ` the {guilabel}`Website Mail Group` +(`website_mail_group`) module. + +:::{note} +The **mail groups** feature is not to be confused with the +{doc}`../../marketing/email_marketing/mailing_lists` in the Email Marketing app. +::: + +(website-mailing-lists-configure-groups)= + +## Configuring mail groups + +To configure mail groups, proceed as follows: + +1. Configure a custom email alias domain by accessing the **General settings**, scrolling down to + the {guilabel}`Discuss` section, enabling the {guilabel}`Custom Email Server` feature, and + entering the {guilabel}`Alias domain` (e.g., `@mycompany.com`). + +2. Go to {menuselection}`Website --> Configuration --> Mailing Lists`, then click {guilabel}`New`. + +3. Specify a {guilabel}`Group Name`, the {guilabel}`Email Alias`, and a {guilabel}`Description`. + +4. Enable {guilabel}`Moderate this group` and specify the {guilabel}`Moderators` if you wish to + {ref}`moderate messages ` from this group. Alternatively, if the + group is not moderated, you can define {guilabel}`Responsible Users` who can manage the messages + in the group. + +5. In the {guilabel}`Privacy` tab, define who can subscribe to the mail group: + + - {guilabel}`Everyone`: to make the mail group public so anyone can subscribe to it; + - {guilabel}`Members only`: to only allow users defined as members to subscribe to the mail group; + - {guilabel}`Selected group of users`: to only allow users from the {guilabel}`Authorized group` + to subscribe to the mail group. + +6. If the mail group is moderated, you can automatically notify authors when their message is + pending moderation by enabling {guilabel}`Automatic notification` in the {guilabel}`Notify + Members` tab and writing the {guilabel}`Notification message`. + +7. If you wish to send out guidelines to new subscribers, enable {guilabel}`Send guidelines to new + subscribers` and write them in the {guilabel}`Guidelines` tab. This is particularly useful when + the mail group is moderated. + +## Using mail groups + +### Subscribing/unsubscribing + +Based on the {ref}`configuration of the mail group `, +users can subscribe to and unsubscribe from mail groups from the website page (`/groups` by default). + +```{image} mail_groups/mail-group-page.png +:alt: Mail group web page. +``` + +Internal users can also do this from {menuselection}`Website --> Configuration --> Mailing Lists`, +using the {guilabel}`Join` and {guilabel}`Leave` buttons. + +### Sending messages + +To send messages to a mail group, website users can email the {ref}`mail group's email address +`. Internal users can also create messages directly from +Odoo. To do so, go to {menuselection}`Website --> Configuration --> Mailing Lists`, select the mail +group, click the {guilabel}`Emails` smart button, and click {guilabel}`New`. Then, fill in the +fields and click {guilabel}`Send`. + +:::{tip} +- The list of messages can also be accessed by selecting the group from the `/groups` website + page. + +- Group members can also unsubscribe from the group, access the mail group page, and send emails + to the group using the URLs in the footer of any group email they have received. + + ```{image} mail_groups/mail-group-URLs.png + :alt: URLs in the footer of a group email. + ``` +::: + +(website-mailing-lists-moderate)= + +## Moderating mail group messages + +If the {guilabel}`Moderate this group` feature has been enabled for the +{ref}`mail group `, one of the {guilabel}`Moderators` must +approve the group's messages before they are dispatched to the other members. + +To moderate messages, go to {menuselection}`Website --> Configuration --> Mailing Lists`, select the +mail group, and click the {guilabel}`To review` smart button. You can moderate messages using the +buttons at the end of the message line or select a message to view its content and moderate it +accordingly. + +> ```{image} mail_groups/mail-group-moderation.png +> :alt: Moderation buttons in the message line. +> ``` + +The following actions are available: + +- {guilabel}`Accept`: to accept the email and send it to the mail group members. +- {guilabel}`Reject`: to reject the email. In the pop-up window that opens, click + {guilabel}`Reject Silently` to reject the email without notifying the author, or specify an + explanation for rejecting the message, then click {guilabel}`Send & Reject` to reject the message + and send the explanation to the author. +- {guilabel}`Whitelist`: to whitelist the author, i.e. automatically accept all of their emails. As + a result, a {ref}`moderation rule ` is created for the author's + email address with the status {guilabel}`Always allow`. +- {guilabel}`Ban`: to blacklist the author, i.e. automatically discard all their emails. In the + pop-up window that opens, click {guilabel}`Ban` to ban the author without notifying them, or + specify an explanation, then click {guilabel}`Send & Ban` to ban the author and send them the + explanation. As a result, a {ref}`moderation rule ` is created for + the author's email address with the status {guilabel}`Permanent ban`. + +:::{note} +Messages can also be moderated from the group's list of messages. Go to {menuselection}`Website +--> Groups --> Mailing List Groups`, select the mail group and click the {guilabel}`Emails` smart +button. +::: + +(website-mailing-lists-moderation-rules)= + +## Whitelisting/Blacklisting authors + +You can whitelist or blacklist an author either directly {ref}`from a mail group message +`, or by creating a moderation rule. To do so, go to +{menuselection}`Website --> Configuration --> Moderation Rules` and click {guilabel}`New`. Then, +select the {guilabel}`Group`, specify the author's {guilabel}`Email` and set the {guilabel}`Status` +field. + +:::{tip} +You can also access the mail group's moderation rules by going to {menuselection}`Website --> +Configuration --> Mailing Lists`, selecting the group, then clicking the {guilabel}`Moderations` +smart button. +::: + diff --git a/content/applications/websites/website/pages.md b/content/applications/websites/website/pages.md new file mode 100644 index 000000000..115cd4d88 --- /dev/null +++ b/content/applications/websites/website/pages.md @@ -0,0 +1,211 @@ +--- +show-content: true +--- + +# 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: + +> 1. - 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`. +> 2. Enter a {guilabel}`Page Title`; this title is used in the menu and the page's URL. +> 3. Click {guilabel}`Create`. +> 4. Customize the page's content and appearance using the website builder, then click +> {guilabel}`Save`. +> 5. {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: + +1. Access the page, then go to {menuselection}`Site --> Properties` and click {guilabel}`Delete + Page`. +2. 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. +3. 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](https://developers.google.com/search/docs/crawling-indexing/301-redirects) +- {doc}`pages/seo` +::: + +```{toctree} +:titlesonly: true + +pages/menus +pages/seo +``` + diff --git a/content/applications/websites/website/pages/menus.md b/content/applications/websites/website/pages/menus.md new file mode 100644 index 000000000..e4f244ce7 --- /dev/null +++ b/content/applications/websites/website/pages/menus.md @@ -0,0 +1,99 @@ +# Menus + +Menus are used to organize your website’s content and help visitors navigate through your web pages +effectively. User-friendly and well-structured website menus also play a crucial role in improving +{doc}`search engine rankings `. + +Odoo allows you to customize the content and appearance of your website's menu to your needs. + +## Menu editor + +The menu editor allows you to edit your website's menu and add {ref}`regular menu items +` and {ref}`mega menus `. + +To edit your website's menu, go to {menuselection}`Website --> Site --> Menu Editor`. From there, +you can: + +- **rename** a menu item or change its URL using the {guilabel}`Edit Menu Item` icon; +- **delete** a menu item using the {guilabel}`Delete Menu Item` icon; +- **move** a menu item by dragging and dropping it to the desired place in the menu; +- **create a regular drop-down menu** by dragging and dropping the sub-menu items to the right, + underneath their parent menu. + +```{image} menus/menu-editor.png +:alt: Menu editor with sub-menus +``` + +:::{note} +You can also access the menu editor by clicking {guilabel}`Edit`, selecting any menu item and +clicking the {guilabel}`Edit Menu` icon. + +```{image} menus/edit-menu-icon.png +:alt: Access the Menu editor while in Edit mode. +``` +::: + +(website-regular-menus)= + +### Adding regular menu items + +By default, pages are added to the menu as regular menu items when {doc}`they are created +<../pages>`. You can also add regular menu items from the menu editor by clicking {guilabel}`Add +Menu Item`. Enter the {guilabel}`Name` and URL of the related page in the pop-up window that appears +on the screen and click {guilabel}`OK`. + +:::{tip} +In the {guilabel}`URL or Email` field, you can type `/` to search for a page on your website or +`#` to search for an existing custom anchor. +::: + +(website-mega-menus)= + +### Adding mega menus + +Mega menus are similar to drop-down menus, but instead of a simple list of sub-menus, they display a +panel divided into groups of navigation options. This makes them suitable for websites with large +amounts of content, as they can help include all of your web pages in the menu while still making +all menu items visible at once. Mega menus can also be structured more visually than regular +drop-down menus, for example, through layout, typography, and icons. + +```{image} menus/mega-menu.png +:alt: Mega menu in the navigation bar. +``` + +To create a mega menu, go to {menuselection}`Website --> Site --> Menu Editor` and click +{guilabel}`Add Mega Menu Item`. Enter the {guilabel}`Name` of the mega menu in the pop-up, click +{guilabel}`OK`, then {guilabel}`Save`. + +To adapt the options and layout of the mega menu, click it in the navigation bar, then click +{guilabel}`Edit`. Mega menus are composed of building blocks, which means you can customize each +component individually using inline formatting, as well as the options available in the +{guilabel}`Customize` tab in the website builder. For example, you can: + +- edit the text directly in the building block; + +- edit a menu item's URL by selecting the menu item, then clicking the {guilabel}`Edit link` button + in the small preview pop-up. Type `/` to search for a page on your website, or `#` to search for + an existing custom anchor. + + ```{image} menus/mega-menu-option.png + :alt: Edit a mega menu option. + ``` + +- move a menu item by dragging and dropping the related block to the desired position in the mega + menu; + +- delete a menu item by deleting the related block. + +:::{tip} +You can adapt the general layout of the mega menu by selecting the desired {guilabel}`Template` +and {guilabel}`Size` in the {guilabel}`Mega menu` section in the {guilabel}`Customize` tab in the +website builder. +::: + +## Header and navigation bar appearance + +To customize the appearance of your website's menu, click {guilabel}`Edit`, then select the +navigation bar or any menu item. You can then adapt the fields in the {guilabel}`Header` and +{guilabel}`Navbar` sections in the {guilabel}`Customize` tab in the website builder. + diff --git a/content/applications/websites/website/pages/seo.md b/content/applications/websites/website/pages/seo.md new file mode 100644 index 000000000..760d86e7f --- /dev/null +++ b/content/applications/websites/website/pages/seo.md @@ -0,0 +1,183 @@ +# Search Engine Optimization (SEO) + +Search Engine Optimization, often abbreviated as SEO, is a digital marketing strategy to improve a +website's visibility and ranking in search engine results (e.g., in Google). It involves optimizing +various elements on your website, including its content, social sharing, URLs, images, and page +speed. + +:::{note} +- Odoo provides several modules to help you build your website content, such as + {doc}`eCommerce <../../ecommerce>`, {doc}`Blog <../../blog>`, {doc}`eLearning + <../../elearning>`, and {doc}`Forum <../../forum>`. +- All Odoo {doc}`themes <../web_design/themes>` rely on the CSS Framework [Bootstrap](https://getbootstrap.com/) to render efficiently according to the device: desktop, tablet, + or mobile, which positively impacts ranking in search engines. +::: + +## Content optimization + +To optimize a webpage's SEO, access the page, then go to {menuselection}`Website --> Site --> +Optimize SEO`. + +```{image} seo/optimize-seo.png +:alt: Optimize SEO +``` + +### Meta tags + +Meta tags are HTML elements that provide information about a webpage to search engines and website +visitors. They play a crucial role in SEO by helping search engines understand the content and +context of a webpage and attract visitors with appealing content. There are two types of meta tags +in Odoo: + +- {guilabel}`Title` tags specify a webpage's title and are displayed as a clickable link in search + engine results. They should be concise, descriptive, and relevant to the page's content. You can + update the title tag of your webpage or keep it empty to use the default value based on the page’s + content. +- {guilabel}`Description` tags summarize the webpage's content, often displayed in search engine + results below the title. They are used to encourage the user to visit the page. You can update + the description tag of your webpage or keep it empty to use the default value based on the page’s + content. + +:::{note} +The {guilabel}`Preview` card displays how the title and description tags should appear in search +results. It also includes the URL of your page. +::: + +### Keywords + +Keywords are one of the main elements of SEO. A website that is well optimized for search engines +speaks the same language as potential visitors, with keywords for SEO helping them to connect to +your site. + +You can enter the keywords you consider essential in the {guilabel}`Keyword` field and click +{guilabel}`ADD` to see how they are used at different levels in your content (H1, H2, page title, +page description, page content) and the related searches in Google. The tool also suggests relevant +keywords to drive your web traffic. The more keywords are present on your webpage, the better. + +:::{tip} +It is strongly recommended to only use one H1 title per page for SEO. +::: + +### Image for social share + +When you share your page on social media, your logo image is selected, but you can upload any other +image by clicking the upward arrow. + +:::{Note} +- The {guilabel}`Social Preview` card displays how the page's information would appear when + 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. +::: + +## Images + +The size of images has a significant impact on page speed, which is an essential criterion for +search engines to optimize SEO ranking. + +:::{tip} +Compare how your website ranks using [Google Page Speed](https://pagespeed.web.dev/?utm_source=psi&utm_medium=redirect) +or [Pingdom Website Speed Test](https://tools.pingdom.com/). +::: + +Odoo automatically compresses uploaded images and converts them to `Webp`. With this file format, +photos are smaller, which increases the page loading speed and, therefore, gives a better ranking in +SEO. All images used in Odoo official {doc}`themes <../web_design/themes>` are also compressed by +default. If you are using a third-party theme, it may provide images that are not compressed +efficiently. + +**To modify an image** from your website, select the image, click {guilabel}`Edit`, then go to the +{guilabel}`Customize` tab, and adapt the {guilabel}`Format` in the {guilabel}`Image` section. + +```{image} seo/image-format.png +:alt: automated image compression +``` + +:::{important} +Alt tags are used to provide context to what an image is displaying, informing search engine +crawlers and allowing them to index an image correctly. Adding alt tags keywords in the +{guilabel}`Description` field is essential from an SEO perspective. This description is added to +the HTML code of your image, and it is shown when the image cannot be displayed. +::: + +## Advanced features + +### Structured data markup + +Structured data markup is used to generate rich snippets in search engine results. It is a way for +websites to send structured data to search engine robots, helping them understand your content and +create well-presented search results. + +By default, Google supports many [rich snippets](https://developers.google.com/search/blog/2009/05/introducing-rich-snippets) +for content types, including Reviews, People, Products, Businesses, Events, and Organizations. + +Microdata is a set of tags, introduced with HTML5, that help search engines better understand your +content and display it in a relevant way. Odoo implements microdata as defined in the schema.org +[specification](https://schema.org/docs/gs.html) for events, eCommerce products, forum posts, and +contact addresses. This allows your product pages to be displayed in Google using extra information +like the price and rating of a product: + +```{image} seo/data-markup.png +:alt: snippets in search engine results +``` + +### 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. + +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`. + +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`. + +```{eval-rst} +.. example:: + If you do not want the robots to crawl the `/about-us` page of your site, you can edit the + robots.txt file to add `Disallow: /about-us`. +``` + +### Sitemap + +The sitemap points out website pages and their relation to each other to search engine robots. Odoo +generates a `/sitemap.xml` file, including all URLs. For performance reasons, this file is cached +and updated every 12 hours. + +:::{note} +If your website has a lot of pages, Odoo automatically creates a Sitemap Index file, respecting +the [sitemaps.org protocol](http://www.sitemaps.org/protocol.html), grouping sitemap URLs in +45000 chunks per file. +::: + +Every sitemap entry has three attributes that are computed automatically: + +- ``: the URL of a page. +- ``: last modification date of the resource, computed automatically based on the related + object. For a page related to a product, this could be the last modification date of the product + or the page. +- ``: modules may implement their priority algorithm based on their content (for example, + a forum might assign a priority based on the number of votes on a specific post). The priority of + a static page is defined by its priority field, which is normalized (16 is the default). + +:::{tip} +To prevent pages from appearing in a sitemap, go to {menuselection}`Site --> Properties`, click +the {guilabel}`Publish` tab, and turn off the {guilabel}`Indexed` feature. + +> ```{image} seo/page-properties.png +> :alt: "disabling the \u201CIndexed\u201D checkbox" +> ``` +::: + +### Hreflang HTML tags + +Odoo automatically includes `hreflang` and `x-default` tags in the code of your website's +multilingual pages. These HTML attributes are crucial in informing search engines about a specific +page's language and geographical targeting. + +:::{seealso} +{doc}`../configuration/translate` +::: + diff --git a/content/applications/websites/website/reporting.md b/content/applications/websites/website/reporting.md new file mode 100644 index 000000000..bcc3b8a52 --- /dev/null +++ b/content/applications/websites/website/reporting.md @@ -0,0 +1,13 @@ +--- +nosearch: true +--- + +# Reporting + +```{toctree} +:titlesonly: true + +reporting/analytics +reporting/link_tracker +``` + diff --git a/content/applications/websites/website/reporting/analytics.md b/content/applications/websites/website/reporting/analytics.md new file mode 100644 index 000000000..bcbcdc8b5 --- /dev/null +++ b/content/applications/websites/website/reporting/analytics.md @@ -0,0 +1,189 @@ +# Website analytics + +Website analytics helps website owners monitor how people use their site. It provides data on +visitor demographics, behavior, and interactions, helping improve websites and marketing strategies. + +You can track your Odoo website's traffic using {ref}`analytics/plausible` or +{ref}`analytics/google-analytics`. We recommend using Plausible.io as it is privacy-friendly, +lightweight, and easy to use. + +The Plausible analytics dashboard is also integrated into Odoo and can be accessed +via {menuselection}`Website --> Reporting --> Analytics`. + +(analytics-plausible)= + +## Plausible.io + +Odoo hosts its own Plausible.io server and provides a free and ready-to-work Plausible.io +solution for **Odoo Online** databases. Odoo automatically creates and sets up your account. You can +start using it by going to {menuselection}`Website --> Reporting --> Analytics`. + +:::{note} +**If you already have a Plausible.io account** and you want to connect it to your Odoo Online +database, you must create two `ir.config.parameters` to use Plausible.io's servers. To do so, +enable the {ref}`developer mode ` and go to {menuselection}`General Settings --> +Technical -- System Parameters`. Click {guilabel}`New` and fill in the following {guilabel}`Key` +and {guilabel}`Value` fields: + +```{eval-rst} +.. list-table:: + :header-rows: 1 + + * - Key + - Value + * - `website.plausible_script` + - `https://plausible.io/js/plausible.js` + * - `website.plausible_server` + - `https://plausible.io` +``` + +Then, follow the steps below to connect your existing account with Plausible.io servers. +::: + +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: + +1. Create or sign in to a Plausible account using the following link: [https://plausible.io/register](https://plausible.io/register). + +2. If you are creating a new account, go through the registration and activation steps. When asked + to provide your website details, add its {guilabel}`Domain` without including `www` (e.g., + `example.odoo.com`) and change the {guilabel}`Reporting Timezone` if necessary. Click + {guilabel}`Add snippet` to proceed to the next step. Ignore the {guilabel}`Add JavaScript snippet` + instructions and click {guilabel}`Start collecting data`. + +3. Once done, click the Plausible logo in the upper-left part of the page to access your [list of + websites](https://plausible.io/sites), then click the gear icon next to the website. + + ```{image} analytics/plausible-gear-icon.png + :alt: Click the gear icon in the list of websites. + ``` + +4. In the sidebar, select {guilabel}`Visibility`, then click {guilabel}`+ New link`. + +5. Enter a {guilabel}`Name`, leave the {guilabel}`Password` field empty, as the Plausible analytics + dashboard integration in Odoo doesn't support it, then click {guilabel}`Create shared link`. + + ```{image} analytics/plausible-create-sharedlink.png + :alt: Credentials creation for the new shared link + ``` + +6. Copy the shared link. + + ```{image} analytics/plausible-copy-sharedlink.png + :alt: Copy the shared link URL from Plausible.io + ``` + +7. In Odoo, go to {menuselection}`Website --> Configuration --> Settings`. + +8. In the {guilabel}`SEO` section, enable {guilabel}`Plausible Analytics`, then paste the + {guilabel}`Shared Link` and click {guilabel}`Save`. + +:::{tip} +If you have {doc}`multiple websites <../configuration/multi_website>`, add your websites to your +Plausible.io account by going to [https://plausible.io/sites](https://plausible.io/sites) and clicking {guilabel}`+ Add +website`. In Odoo, in the **Website settings**, make sure to select the website in the +{guilabel}`Settings of Website` field before pasting the {guilabel}`Shared link`. +::: + +:::{note} +Odoo automatically pushes two custom goals: `Lead Generation` and `Shop`. +::: + +:::{seealso} +[Plausible Analytics documentation](https://plausible.io/docs) +::: + +(analytics-google-analytics)= + +## Google Analytics + +To follow your Odoo website's traffic with Google Analytics: + +1. Create or sign in to a Google account using the following link: [https://analytics.google.com](https://analytics.google.com). + +2. - 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 gear icon in the + bottom-left corner of the page to access the **Admin** page. Then, click {guilabel}`+ Create + Property`. + + ```{image} analytics/GA-add-property.png + :alt: Measurement ID in Google Analytics. + ``` + +3. Complete the next steps: [property creation](https://support.google.com/analytics/answer/9304153?hl=en/&visit_id=638278591144564289-3612494643&rd=2#property), + business details, and business objectives. + +4. When you reach the **Data collection** step, choose the {guilabel}`Web` platform. + + ```{image} analytics/GA-platform.png + :alt: Choose a platform for your Google Analytics property. + ``` + +5. Set up your data stream: Specify your {guilabel}`Website URL` and a {guilabel}`Stream name`, then + click {guilabel}`Create stream`. + +6. Copy the {guilabel}`Measurement ID`. + + ```{image} analytics/GA-measurement-id.png + :alt: Measurement ID in Google Analytics. + ``` + +7. In Odoo, go to {menuselection}`Website --> Configuration --> Settings`. + +8. In the {guilabel}`SEO` section, enable {guilabel}`Google Analytics`, then paste the + {guilabel}`Measurement ID` and click {guilabel}`Save`. + +:::{tip} +If you have {doc}`multiple websites <../configuration/multi_website>` with separate domains, it +is recommended to create [one property](https://support.google.com/analytics/answer/9304153?hl=en/&visit_id=638278591144564289-3612494643&rd=2#property) +per domain. In Odoo, in the **Website settings**, make sure to select the website in the +{guilabel}`Settings of Website` field before pasting the {guilabel}`Measurement ID`. +::: + +:::{seealso} +[Google documentation on setting up Analytics for a website](https://support.google.com/analytics/answer/1008015?hl=en/) +::: + +(analytics-google-tag-manager)= + +## Google Tag Manager + +{abbr}`GTM (Google Tag Manager)` is a tag management system that allows you to easily update +measurement codes and related code fragments, collectively known as tags on your website or mobile +app, directly through the code injector. + +:::{warning} +- Some GTM tags use data layers (e.g., advanced eCommerce tracking data layers) to retrieve + variables and send them to Google Analytics. Data layers are currently not managed in Odoo. +- Google Tag Manager may not be compliant with local data protection regulations. +::: + +To use GTM, proceed as follows: + +1. Create or sign in to a Google account by going to . + +2. In the {guilabel}`Accounts` tab, click {guilabel}`Create account`. + +3. Enter an {guilabel}`Account Name` and select the account's {guilabel}`Country`. + +4. Enter your website's URL in the {guilabel}`Container name` field and select the {guilabel}`Target + platform`. + +5. Click {guilabel}`Create` and agree to the Terms of Service. + +6. Copy the `` and `` codes from the popup window. Then, go to your website, click + {guilabel}`Edit`, go to the {guilabel}`Themes` tab, scroll down to the + {guilabel}`Website Settings` section, then click {guilabel}`` and {guilabel}`` to + paste the codes. + + ```{image} analytics/gtm-codes.png + :alt: Install Google Tag Manager + ``` + +:::{note} +The data is collected in the marketing tools used to monitor the website (e.g., Google Analytics, +Plausible, Facebook Pixel), not in Odoo. +::: + diff --git a/content/applications/websites/website/reporting/link_tracker.md b/content/applications/websites/website/reporting/link_tracker.md new file mode 100644 index 000000000..39e9e1b52 --- /dev/null +++ b/content/applications/websites/website/reporting/link_tracker.md @@ -0,0 +1,70 @@ +# Link tracker + +The link tracker allow you to create tracked links to measure your marketing campaigns' +effectiveness. They let you determine which channels bring you the most visitors and make informed +decisions. + +## Configuration + +The {guilabel}`Link Tracker` module is not installed by default. You need to enable the +{guilabel}`Email Marketing` option by going to {menuselection}`Website --> Configuration --> +Settings.` Alternatively, you can {doc}`install <../../../general/apps_modules>` the {guilabel}`Link +Tracker` module itself or one of the marketing apps. + +## Create a traceable URL + +To create and manage tracked links, navigate to {menuselection}`Website --> Site --> Link Tracker`. +Fill in the following information and click {guilabel}`Get tracked link` to generate a tracking URL. + +1. {guilabel}`URL`: The URL which is the target of the campaign. It is automatically populated with + the URL from where you access the menu. +2. {guilabel}`Campaign`: The specific campaign the link should be associated with. This parameter is + used to distinguish the different campaigns. +3. {guilabel}`Medium`: The medium describes the category or method through which the visitor arrives + at your site, such as organic search, paid search, social media ad, email, etc. +4. {guilabel}`Source`: The source identifies the precise platform or website that referred the + visitor, such as a search engine, a newsletter, or a website. + +```{image} link_tracker/create-link-tracker.png +:alt: Create a link tracker URL +``` + +The {guilabel}`Campaign`, {guilabel}`Medium`, and {guilabel}`Source` are called {abbr}`UTM (Urchin +Tracking Module)` parameters. They are incorporated in the tracked URL. + +### Website visibility + +You can use the {abbr}`UTM (Urchin Tracking Module)` parameters to hide or show building blocks for +specific audiences. To achieve this, click the {guilabel}`Edit` button on your website, select a +building block, go to the {guilabel}`Customize` tab, scroll down to {guilabel}`Visibility`, and +click {guilabel}`Conditionally`. + +```{image} link_tracker/conditional-visibility.png +:alt: Use the conditional visibility to display site elements to specific audiences. +``` + +For each parameter available in the {ref}`Visibility ` section, you can +choose {guilabel}`Visible for` or {guilabel}`Hidden for` and select the record you want from the +dropdown list. + +## Tracked links overview + +To get an overview of your tracked links, go to {menuselection}`Website --> Site --> Link Tracker` +and scroll down to {guilabel}`Your tracked links` section. + +```{image} link_tracker/your-tracked-links.png +:alt: Get an overview of all the links you track. +``` + +### Statistics + +To measure the performance of tracked links, click the {guilabel}`Stats` button. + +```{image} link_tracker/statistics.png +:alt: View the statistics related to a specific tracked link. +``` + +Scroll down to the {guilabel}`Statistics` section to get an overview of the number of clicks of your +tracked links. You can display information for a specific period by clicking the +{guilabel}`All Time`, {guilabel}`Last Month`, or {guilabel}`Last Week` options. + diff --git a/content/applications/websites/website/web_design.md b/content/applications/websites/website/web_design.md new file mode 100644 index 000000000..1430ebb0c --- /dev/null +++ b/content/applications/websites/website/web_design.md @@ -0,0 +1,13 @@ +--- +nosearch: true +--- + +# Web design + +```{toctree} +:titlesonly: true + +web_design/building_blocks +web_design/themes +``` + diff --git a/content/applications/websites/website/web_design/building_blocks.md b/content/applications/websites/website/web_design/building_blocks.md new file mode 100644 index 000000000..243919150 --- /dev/null +++ b/content/applications/websites/website/web_design/building_blocks.md @@ -0,0 +1,179 @@ +--- +show-content: true +--- + +# 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 `. + +:::{seealso} +[Odoo Tutorial: Design your first webpage](https://www.odoo.com/slides/slide/design-your-website-images-and-motion-6931?fullscreen=1) +::: + +(websites-website-web-design-building-blocks)= + +## Adding 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 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. + +## Color preset and background + +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`. + +When you modify a color preset, all elements using it are automatically updated to match the new +configuration. + +:::{seealso} +{doc}`Website themes ` +::: + +## Layout: grid and columns + +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`. + +(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. + +```{image} building_blocks/grid-layout.png +:alt: When the grid layout is selected, choose an image and drag and drop it where +: needed. +``` + +:::{tip} +Position images behind the text by using the above/below icons. + +```{image} building_blocks/superimpose-images-to-text.png +:alt: Positioning an image behind text +``` +::: + +(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 {guilabel}`Cols` {guilabel}`Layout`, and +adjust the number. + +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. + +```{image} building_blocks/cols.png +:alt: Adjust the number of images per line on mobile view. +``` + +## Duplicating a building block + +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. + +```{image} building_blocks/duplicate-container.png +:alt: Duplicating a building block +``` + +## Reordering a building block + +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. + +You can also use the drag-and-drop icon to move a block manually. + +```{image} building_blocks/reordering-blocks.png +:alt: Reordering building blocks +``` + +## Saving a custom building block + +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. + +```{image} building_blocks/saving-custom-block.png +:alt: Saving a building block +``` + +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. + +```{image} building_blocks/custom-blocks.png +:alt: Custom section with saved building blocks +``` + +(building-blocks-visibility)= + +## Visibility + +### Visibility on desktop/mobile + +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. + +```{image} building_blocks/show-hide-on-mobile.png +:alt: Click the "show/hide on mobile" icons to show or hide some elements on mobile. +``` + +:::{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. + +```{image} building_blocks/phone-icon.png +:alt: Mobile phone preview icon +``` +::: + +### Conditional visibility + +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. + +:::{seealso} +{doc}`Link Tracker <../reporting/link_tracker>` +::: + +### Invisible elements + +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. + +## Mobile view customization + +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: + +- 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. + +```{toctree} +:titlesonly: true + +building_blocks/structure +building_blocks/features +building_blocks/dynamic_content +building_blocks/inner_content +``` + diff --git a/content/applications/websites/website/web_design/building_blocks/dynamic_content.md b/content/applications/websites/website/web_design/building_blocks/dynamic_content.md new file mode 100644 index 000000000..a0c5e04cc --- /dev/null +++ b/content/applications/websites/website/web_design/building_blocks/dynamic_content.md @@ -0,0 +1,106 @@ +# 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. + +```{eval-rst} +.. 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/features.md b/content/applications/websites/website/web_design/building_blocks/features.md new file mode 100644 index 000000000..7f0ea81b8 --- /dev/null +++ b/content/applications/websites/website/web_design/building_blocks/features.md @@ -0,0 +1,40 @@ +# 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/inner_content.md b/content/applications/websites/website/web_design/building_blocks/inner_content.md new file mode 100644 index 000000000..601418257 --- /dev/null +++ b/content/applications/websites/website/web_design/building_blocks/inner_content.md @@ -0,0 +1,34 @@ +# 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/structure.md b/content/applications/websites/website/web_design/building_blocks/structure.md new file mode 100644 index 000000000..686a9a9b9 --- /dev/null +++ b/content/applications/websites/website/web_design/building_blocks/structure.md @@ -0,0 +1,63 @@ +# 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/themes.md b/content/applications/websites/website/web_design/themes.md new file mode 100644 index 000000000..516f88fd8 --- /dev/null +++ b/content/applications/websites/website/web_design/themes.md @@ -0,0 +1,87 @@ +# Website themes + +Odoo offers numerous themes to shape your website's style, including its colors, fonts, and layouts. +When setting up your site using the Odoo website configurator, you are prompted to select a theme +that aligns with your desired aesthetic. If you wish to modify the theme options later, navigate to +the website builder by clicking the {guilabel}`Edit` button and access the {guilabel}`Theme` tab. +The following sections are available: + +- {guilabel}`Colors`: The website builder relies on palettes composed of five colors: two + {guilabel}`Main` colors and three {guilabel}`Light & Dark` colors. + + You can also customize the {guilabel}`Color Presets` that have been defined automatically by the + website builder according to the five colors defined above. Click the arrow next to a color preset + to update it. Each color preset contains colors for your building block's {guilabel}`Background`, + {guilabel}`Text`, {guilabel}`Headings`, {guilabel}`Links`, {guilabel}`Primary Buttons`, and + {guilabel}`Secondary Buttons`. + + ```{image} themes/colors.png + :alt: select the colors of your website + :scale: 75% + ``` + + **To apply a color preset** to a building block of your site, select it, go to the + {guilabel}`Customize` tab, click the {guilabel}`Background` button, and select the preset. + + :::{note} + Changing a color preset automatically updates the colors of both the default preset and the + building blocks where the preset is used. + ::: + +- {guilabel}`Website`: From this section, you can {guilabel}`Switch Theme`, + {doc}`Add a Language <../configuration/translate>`, select the {guilabel}`Page Layout`, and + customize the {guilabel}`Background` by uploading your own image. + +- {guilabel}`Paragraph`: Customize the formatting of your website's paragraph `

` elements. + + :::{tip} + The {guilabel}`Font Family` field contains fonts that are hosted and served by Google servers. + To add another font, click {guilabel}`Add a Google Font`, and, in the popup window, click + {guilabel}`fonts.google.com`. + + ```{image} themes/add-a-font.png + :alt: Select the font you like + :scale: 75% + ``` + + Select a font you like, copy the address of the page, paste it in the {guilabel}`Google Font + address` field, then click {guilabel}`Save and Reload`. The new font applies to your entire + website. + ::: + +- {guilabel}`Headings`: Customize the formatting of your headings. + +- {guilabel}`Button`: Customize the {guilabel}`Primary Style` and {guilabel}`Secondary Style` + buttons. + + ```{image} themes/buttons.png + :alt: Two types of buttons in Odoo + ``` + +- {guilabel}`Link`: To edit the style of the hyperlinks available on your website. + +- {guilabel}`Input Fields`: Customize fields where you can enter data, e.g., a search bar or a form. + +- {guilabel}`Advanced`: You can hide the header bar of your website using the + {guilabel}`Show Header` button, inject {ref}`head and body code `, + enter your {guilabel}`Google Map Custom Key`, change the colors of the {guilabel}`Success`, + {guilabel}`Info`, {guilabel}`Warning`, and {guilabel}`Error` pop up messages by clicking the + related {guilabel}`Status Colors` buttons, and customize the {guilabel}`Grays` elements of your + site. + + ```{eval-rst} + .. example:: + - The :guilabel:`Status Color` of the :guilabel:`Success` messages is set to green. + + .. image:: themes/advanced.png + :alt: Status colors success message set to green. + + .. image:: themes/success.png + :alt: Success message is green + + - Customizing the gray elements of your site. + + .. image:: themes/grays.png + :alt: Customize the grays elements of your site + ``` + diff --git a/content/contributing.md b/content/contributing.md new file mode 100644 index 000000000..9d2f09d8f --- /dev/null +++ b/content/contributing.md @@ -0,0 +1,83 @@ +--- +hide-page-toc: true +show-content: true +--- + +# Contributing + +First off, **thank you** for landing here and considering contributing to Odoo! + +This documentation serves as a guide for first-timer and veteran contributors. As an open-core +project, Odoo accepts contributions from everyone, Odoo employees and members of the Odoo community +alike. The Odoo community comprises users, developers, and other interested parties who contribute +their time and expertise. + +Depending on your skill set and interest, there are many ways to contribute to Odoo. The table below +lists the most important of them. + +```{eval-rst} +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + :widths: 20 35 25 20 + + * - Contribution + - Description + - Resources + - Target Audience + * - Join the community + - Participate in discussions on the forums, help answer questions, and assist other members of + the Odoo community. + - * `Odoo forums `_ + - Anyone interested in Odoo + * - Submit bug reports + - Help improve the stability of Odoo by reporting the bugs that you discover in :doc:`supported + versions ` directly to Odoo support. Make sure to include + as many details (version, environment, test scenario...) as possible. If you don't have the + Odoo Enterprise license required for contacting the support, open a new issue on the GitHub + repository of Odoo. + - * `Odoo support `_ + * `Issue tracker on GitHub `_ + - Users of Odoo + * - Translate Odoo + - Translate the user interface and documentation of Odoo into different languages. + - * `Odoo project on Transifex `_ + - Anyone fluent in multiple languages + * - Contribute to the codebase + - Submit pull requests to the Odoo GitHub repositories to fix bugs, add new features, or + improve the performance and reliability of the product. You can also review and comment on + pull requests from other contributors. By contributing to the codebase, you can make a direct + and lasting impact on the quality and features of Odoo. + - * :doc:`Guide: Contributing to the codebase ` + * :doc:`Developer tutorials ` + * :doc:`How-to guides ` + - Developers with experience in Python and web development + * - Contribute to the documentation + - Submit corrections and improvements to the Documentation. The product evolves fast, and + it can be challenging to consistently reflect these changes in the documentation. By updating + the documentation, you can help many users find their way in Odoo. + - * :doc:`Guide: Contributing to the documentation ` + - Anyone interested in improving the Documentation + * - Create custom modules + - Develop new modules to extend the functionality of Odoo. Custom modules can be made available + for free or paid on the Odoo App Store or on any other Odoo modules library. By creating + custom modules and making them available to others, you can help grow the Odoo ecosystem and + provide additional value to users of the platform. + - * `Odoo Apps Store `_ + - Developers with experience in Python and web development +``` + +:::{important} +It is mainly Odoo employees who develop new features for the codebase and write new content for +the documentation. Be sure to discuss any idea for a new feature or page with the Odoo team so +they can give you the green light before you begin working on it. Some features may already be in +development on their side, and only approved features can be merged. +::: + +```{toctree} +:titlesonly: true + +contributing/development +contributing/documentation +``` + diff --git a/content/contributing/development.md b/content/contributing/development.md new file mode 100644 index 000000000..e09b2e683 --- /dev/null +++ b/content/contributing/development.md @@ -0,0 +1,188 @@ +--- +show-content: true +--- + +# Development + +```{toctree} +:titlesonly: true + +development/coding_guidelines +development/git_guidelines +``` + +If you are reading this, chances are that you are interested in learning how to contribute to the +codebase of Odoo. Whether that's the case or you landed here by accident, we've got you covered! + +:::{seealso} +{doc}`Discover other ways to contribute to Odoo <../contributing>` +::: + +When you feel ready, jump to the {ref}`contributing/development/setup` section to begin your journey +in contributing to the development of Odoo. + +(contributing-development-setup)= + +## Environment setup + +The instructions below help you prepare your environment for making local changes to the codebase +and then push them to GitHub. Skip this section and go to +{ref}`contributing/development/first-contribution` if you have already completed this step. + +1. First, you need to [create a GitHub account](https://github.com/join). Odoo uses GitHub to + manage the source code of its products, and this is where you will make your changes and submit + them for review. + +2. [Generate a new SSH key and register it on your GitHub account](https://docs.github.com/en/authentication/connecting-to-github-with-ssh). + +3. Go to [github.com/odoo/odoo](https://github.com/odoo/odoo) and click on the {guilabel}`Fork` + button in the top right corner to create a fork ({dfn}`your own copy`) of the repository on your + account. Do the same with [github.com/odoo/enterprise](https://github.com/odoo/enterprise) if + you have access to it. This creates a copy of the codebase to which you can make changes without + affecting the main codebase. Skip this step if you work at Odoo. + +4. ```{eval-rst} + .. include:: install_git.rst + ``` + +5. Configure Git to identify yourself as the author of your future contributions. Enter the same + email address you used to register on GitHub. + + ```console + $ git config --global user.name "Your Name" + $ git config --global user.email "youremail@example.com" + ``` + +6. {doc}`Install Odoo from the sources <../administration/on_premise/source>`. Make sure to fetch + the sources through Git with SSH. + +7. Configure Git to push changes to your fork(s) rather than to the main codebase. If you work at + Odoo, configure Git to push changes to the shared forks created on the account **odoo-dev**. + + ```{eval-rst} + .. tabs:: + + .. tab:: Link Git with your fork(s) + + In the command below, replace `` with the name of the GitHub account + on which you created the fork(s). + + .. code-block:: console + + $ cd /CommunityPath + $ git remote add dev git@github.com:/odoo.git + + If you have access to `odoo/enterprise`, configure the related remote too. + + .. code-block:: console + + $ cd /EnterprisePath + $ git remote add dev git@github.com:/enterprise.git + + .. tab:: Link Git with odoo-dev + + .. code-block:: console + + $ cd /CommunityPath + $ git remote add dev git@github.com:odoo-dev/odoo.git + $ git remote set-url --push origin you_should_not_push_on_this_repository + + $ cd /EnterprisePath + $ git remote add dev git@github.com:odoo-dev/enterprise.git + $ git remote set-url --push origin you_should_not_push_on_this_repository + ``` + +8. That's it! You are ready to {ref}`make your first contribution + `. + +(contributing-development-first-contribution)= + +## Make your first contribution + +:::{important} +- Odoo development can be challenging for beginners. We recommend you to be knowledgeable enough + to code a small module before contributing. If that is not the case, take some time to go + through the {doc}`developer tutorials ` to fill in the gaps. +- Some steps of this guide require to be comfortable with Git. Here are some [tutorials](https://www.atlassian.com/git/tutorials) and an [interactive training](https://learngitbranching.js.org/) if you are stuck at some point. +::: + +Now that your environment is set up, you can start contributing to the codebase. In a terminal, +navigate to the directory where you installed Odoo from sources and follow the guide below. + +01. Choose the version of Odoo to which you want to make changes. Keep in mind that contributions + targeting an {doc}`unsupported version of Odoo ` are not + accepted. This guide assumes that the changes target Odoo \{CURRENT_VERSION}, which corresponds to + branch `{CURRENT_BRANCH}`. + +02. Create a new branch starting from branch \{CURRENT_BRANCH}. Prefix the branch name with the base + branch: `{CURRENT_BRANCH}-...`. If you work at Odoo, suffix the branch name with your Odoo + handle: `{CURRENT_BRANCH}-...-xyz`. + + ```{eval-rst} + .. example:: + + .. code-block:: console + + $ git switch -c {CURRENT_BRANCH}-fix-invoices + + .. code-block:: console + + $ git switch -c {CURRENT_BRANCH}-fix-invoices-xyz + ``` + +03. [Sign the Odoo CLA]({GITHUB_PATH}/doc/cla/sign-cla.md) if not already done. Skip this step if + you work at Odoo. + +04. Make the desired changes to the codebase. When working on the codebase, follow these rules: + + - Keep your changes focused and specific. It is best to work on one particular feature or bug fix + at a time rather than tackle multiple unrelated changes simultaneously. + - Respect the [stable policy](https://github.com/odoo/odoo/wiki/Contributing#what-does-stable-mean) when working in + another branch than `master`. + - Follow the {doc}`coding guidelines `. + - Test your changes thoroughly and {doc}`write tests ` to + ensure that everything is working as expected and that there are no regressions or unintended + consequences. + +05. Commit your changes. Write a clear commit message as instructed in the {doc}`Git guidelines + `. + + ```console + $ git add . + $ git commit + ``` + +06. Push your change to your fork, for which we added the remote alias `dev`. + + ```{eval-rst} + .. example:: + + .. code-block:: console + + $ git push -u dev {CURRENT_BRANCH}-fix-invoices-xyz + ``` + +07. Open a {abbr}`PR (Pull Request)` on GitHub to submit your changes for review. + + 1. Go to the [compare page of the odoo/odoo codebase](https://github.com/odoo/odoo/compare), or + the [compare page of the odoo/enterprise codebase](https://github.com/odoo/enterprise/compare), depending on which codebase your changes + target. + 2. Select **\{CURRENT_BRANCH}** for the base. + 3. Click on {guilabel}`compare across forks`. + 4. Select **\/odoo** or **\/enterprise** for the head + repository. Replace `` with the name of the GitHub account on which you + created the fork or by **odoo-dev** if you work at Odoo. + 5. Review your changes and click on the {guilabel}`Create pull request` button. + 6. Tick the {guilabel}`Allow edits from maintainer` checkbox. Skip this step if you work at Odoo. + 7. Complete the description and click on the {guilabel}`Create pull request` button again. + +08. At the bottom of the page, check the mergeability status and address any issues. + +09. As soon as your {abbr}`PR (Pull Request)` is ready for merging, a member of the Odoo team + is automatically assigned for review. If the reviewer has questions or remarks, they will + post them as comments and you will be notified by email. Those comments must be resolved + for the contribution to go forward. + +10. Once your changes are approved, the review merges them and they become available for all Odoo + users after the next code update! + diff --git a/content/contributing/development/coding_guidelines.md b/content/contributing/development/coding_guidelines.md new file mode 100644 index 000000000..5c8682289 --- /dev/null +++ b/content/contributing/development/coding_guidelines.md @@ -0,0 +1,1363 @@ +```{highlight} python +``` + +# Coding guidelines + +This page introduces the Odoo Coding Guidelines. Those aim to improve the +quality of Odoo Apps code. Indeed proper code improves readability, eases +maintenance, helps debugging, lowers complexity and promotes reliability. +These guidelines should be applied to every new module and to all new development. + +:::{warning} +When modifying existing files in **stable version** the original file style +strictly supersedes any other style guidelines. In other words please never +modify existing files in order to apply these guidelines. It avoids disrupting +the revision history of code lines. Diff should be kept minimal. For more +details, see our [pull request guide](https://odoo.com/submit-pr). +::: + +:::{warning} +When modifying existing files in **master (development) version** apply those +guidelines to existing code only for modified code or if most of the file is +under revision. In other words modify existing files structure only if it is +going under major changes. In that case first do a **move** commit then apply +the changes related to the feature. +::: + +## Module structure + +### Directories + +A module is organized in important directories. Those contain the business logic; +having a look at them should make you understand the purpose of the module. + +- *data/* : demo and data xml +- *models/* : models definition +- *controllers/* : contains controllers (HTTP routes) +- *views/* : contains the views and templates +- *static/* : contains the web assets, separated into *css/, js/, img/, lib/, ...* + +Other optional directories compose the module. + +- *wizard/* : regroups the transient models (`models.TransientModel`) and their views +- *report/* : contains the printable reports and models based on SQL views. Python objects and XML views are included in this directory +- *tests/* : contains the Python tests + +### File naming + +File naming is important to quickly find information through all odoo addons. +This section explains how to name files in a standard odoo module. As an +example we use a [plant nursery](https://github.com/tivisse/odoodays-2018/tree/master/plant_nursery) application. +It holds two main models *plant.nursery* and *plant.order*. + +Concerning *models*, split the business logic by sets of models belonging to +a same main model. Each set lies in a given file named based on its main model. +If there is only one model, its name is the same as the module name. Each +inherited model should be in its own file to help understanding of impacted +models. + +```text +addons/plant_nursery/ +|-- models/ +| |-- plant_nursery.py (first main model) +| |-- plant_order.py (another main model) +| |-- res_partner.py (inherited Odoo model) +``` + +Concerning *security*, three main files should be used: + +- First one is the definition of access rights done in a {file}`ir.model.access.csv` file. +- User groups are defined in {file}`_groups.xml`. +- Record rules are defined in {file}`_security.xml`. + +```text +addons/plant_nursery/ +|-- security/ +| |-- ir.model.access.csv +| |-- plant_nursery_groups.xml +| |-- plant_nursery_security.xml +| |-- plant_order_security.xml +``` + +Concerning *views*, backend views should be split like models and suffixed +by `_views.xml`. Backend views are list, form, kanban, activity, graph, pivot, .. +views. To ease split by model in views main menus not linked to specific actions +may be extracted into an optional `_menus.xml` file. Templates (QWeb +pages used notably for portal / website display) are put in separate files named +`_templates.xml`. + +```text +addons/plant_nursery/ +|-- views/ +| | -- plant_nursery_menus.xml (optional definition of main menus) +| | -- plant_nursery_views.xml (backend views) +| | -- plant_nursery_templates.xml (portal templates) +| | -- plant_order_views.xml +| | -- plant_order_templates.xml +| | -- res_partner_views.xml +``` + +Concerning *data*, split them by purpose (demo or data) and main model. Filenames +will be the main_model name suffixed by `_demo.xml` or `_data.xml`. For instance +for an application having demo and data for its main model as well as subtypes, +activities and mail templates all related to mail module: + +```text +addons/plant_nursery/ +|-- data/ +| |-- plant_nursery_data.xml +| |-- plant_nursery_demo.xml +| |-- mail_data.xml +``` + +Concerning *controllers*, generally all controllers belong to a single controller +contained in a file named `.py`. An old convention in Odoo is to +name this file `main.py` but it is considered as outdated. If you need to inherit +an existing controller from another module do it in `.py`. +For example adding portal controller in an application is done in `portal.py`. + +```text +addons/plant_nursery/ +|-- controllers/ +| |-- plant_nursery.py +| |-- portal.py (inheriting portal/controllers/portal.py) +| |-- main.py (deprecated, replaced by plant_nursery.py) +``` + +Concerning *static files*, Javascript files follow globally the same logic as +python models. Each component should be in its own file with a meaningful name. +For instance, the activity widgets are located in `activity.js` of mail module. +Subdirectories can also be created to structure the 'package' (see web module +for more details). The same logic should be applied for the templates of JS +widgets (static XML files) and for their styles (scss files). Don't link +data (image, libraries) outside Odoo: do not use an URL to an image but copy +it in the codebase instead. + +Concerning *wizards*, naming convention is the same of for python models: +`.py` and `_views.xml`. Both are put in the wizard +directory. This naming comes from old odoo applications using the wizard +keyword for transient models. + +```text +addons/plant_nursery/ +|-- wizard/ +| |-- make_plant_order.py +| |-- make_plant_order_views.xml +``` + +Concerning *statistics reports* done with python / SQL views and classic views +naming is the following : + +```text +addons/plant_nursery/ +|-- report/ +| |-- plant_order_report.py +| |-- plant_order_report_views.xml +``` + +Concerning *printable reports* which contain mainly data preparation and Qweb +templates naming is the following : + +```text +addons/plant_nursery/ +|-- report/ +| |-- plant_order_reports.xml (report actions, paperformat, ...) +| |-- plant_order_templates.xml (xml report templates) +``` + +The complete tree of our Odoo module therefore looks like + +```text +addons/plant_nursery/ +|-- __init__.py +|-- __manifest__.py +|-- controllers/ +| |-- __init__.py +| |-- plant_nursery.py +| |-- portal.py +|-- data/ +| |-- plant_nursery_data.xml +| |-- plant_nursery_demo.xml +| |-- mail_data.xml +|-- models/ +| |-- __init__.py +| |-- plant_nursery.py +| |-- plant_order.py +| |-- res_partner.py +|-- report/ +| |-- __init__.py +| |-- plant_order_report.py +| |-- plant_order_report_views.xml +| |-- plant_order_reports.xml (report actions, paperformat, ...) +| |-- plant_order_templates.xml (xml report templates) +|-- security/ +| |-- ir.model.access.csv +| |-- plant_nursery_groups.xml +| |-- plant_nursery_security.xml +| |-- plant_order_security.xml +|-- static/ +| |-- img/ +| | |-- my_little_kitten.png +| | |-- troll.jpg +| |-- lib/ +| | |-- external_lib/ +| |-- src/ +| | |-- js/ +| | | |-- widget_a.js +| | | |-- widget_b.js +| | |-- scss/ +| | | |-- widget_a.scss +| | | |-- widget_b.scss +| | |-- xml/ +| | | |-- widget_a.xml +| | | |-- widget_a.xml +|-- views/ +| |-- plant_nursery_menus.xml +| |-- plant_nursery_views.xml +| |-- plant_nursery_templates.xml +| |-- plant_order_views.xml +| |-- plant_order_templates.xml +| |-- res_partner_views.xml +|-- wizard/ +| |--make_plant_order.py +| |--make_plant_order_views.xml +``` + +:::{note} +File names should only contain `[a-z0-9_]` (lowercase +alphanumerics and `_`) +::: + +:::{warning} +Use correct file permissions : folder 755 and file 644. +::: + +(contributing-development-xml-guidelines)= + +## XML files + +### Format + +To declare a record in XML, the **record** notation (using *\*) is recommended: + +- Place `id` attribute before `model` +- For field declaration, `name` attribute is first. Then place the + *value* either in the `field` tag, either in the `eval` + attribute, and finally other attributes (widget, options, ...) + ordered by importance. +- Try to group the record by model. In case of dependencies between + action/menu/views, this convention may not be applicable. +- Use naming convention defined at the next point +- The tag *\* is only used to set not-updatable data with `noupdate=1`. + If there is only not-updatable data in the file, the `noupdate=1` can be + set on the `` tag and do not set a `` tag. + +```xml + + view.name + object_name + + + + + + + + +``` + +Odoo supports custom tags acting as syntactic sugar: + +- menuitem: use it as a shortcut to declare a `ir.ui.menu` +- template: use it to declare a QWeb View requiring only the `arch` section of the view. + +These tags are preferred over the *record* notation. + +### XML IDs and naming + +#### Security, View and Action + +Use the following pattern : + +- For a menu: {samp}`{}_menu`, or {samp}`{}_menu_{do_stuff}` for submenus. +- For a view: {samp}`{}_view_{}`, where *view_type* is + `kanban`, `form`, `list`, `search`, ... +- For an action: the main action respects {samp}`{}_action`. + Others are suffixed with {samp}`_{}`, where *detail* is a + lowercase string briefly explaining the action. This is used only if + multiple actions are declared for the model. +- For window actions: suffix the action name by the specific view information + like {samp}`{}_action_view_{}`. +- For a group: {samp}`{}_group_{}` where *group_name* + is the name of the group, generally 'user', 'manager', ... +- For a rule: {samp}`{}_rule_{}` where + *concerned_group* is the short name of the concerned group ('user' + for the 'model_name_group_user', 'public' for public user, 'company' + for multi-company rules, ...). + +Name should be identical to xml id with dots replacing underscores. Actions +should have a real naming as it is used as display name. + +```xml + + + model.name.view.form + ... + + + + model.name.view.kanban + ... + + + + + Model Main Action + ... + + + + Model Access Children + + + + + + + + + ... + + + + ... + + + + ... + +``` + +#### Inheriting XML + +Xml Ids of inheriting views should use the same ID as the original record. +It helps finding all inheritance at a glance. As final Xml Ids are prefixed +by the module that creates them there is no overlap. + +Naming should contain an `.inherit.{details}` suffix to ease understanding +the override purpose when looking at its name. + +```xml + + model.view.form.inherit.module2 + + ... + +``` + +New primary views do not require the inherit suffix as those are new records +based upon the first one. + +```xml + + model.view.form.module2 + + primary + ... + +``` + +(contributing-development-python-guidelines)= + +## Python + +:::{warning} +Do not forget to read the {ref}`Security Pitfalls ` +section as well to write secure code. +::: + +### PEP8 options + +Using a linter can help show syntax and semantic warnings or errors. Odoo +source code tries to respect Python standard, but some of them can be ignored. + +- E501: line too long +- E301: expected 1 blank line, found 0 +- E302: expected 2 blank lines, found 1 + +### Imports + +The imports are ordered as + +1. External libraries (one per line sorted and split in python stdlib) +2. Imports of `odoo` +3. Imports from Odoo modules (rarely, and only if necessary) + +Inside these 3 groups, the imported lines are alphabetically sorted. + +```python +# 1 : imports of python lib +import base64 +import re +import time +from datetime import datetime +# 2 : imports of odoo +import odoo +from odoo import Command, _, api, fields, models # alphabetically ordered +from odoo.tools.safe_eval import safe_eval as eval +# 3 : imports from odoo addons +from odoo.addons.web.controllers.main import login_redirect +from odoo.addons.website.models.website import slug +``` + +### Idiomatics of Programming (Python) + +- Always favor *readability* over *conciseness* or using the language features or idioms. +- Don't use `.clone()` + +```python +# bad +new_dict = my_dict.clone() +new_list = old_list.clone() +# good +new_dict = dict(my_dict) +new_list = list(old_list) +``` + +- Python dictionary : creation and update + +```python +# -- creation empty dict +my_dict = {} +my_dict2 = dict() + +# -- creation with values +# bad +my_dict = {} +my_dict['foo'] = 3 +my_dict['bar'] = 4 +# good +my_dict = {'foo': 3, 'bar': 4} + +# -- update dict +# bad +my_dict['foo'] = 3 +my_dict['bar'] = 4 +my_dict['baz'] = 5 +# good +my_dict.update(foo=3, bar=4, baz=5) +my_dict = dict(my_dict, **my_dict2) +``` + +- Use meaningful variable/class/method names +- Useless variable : Temporary variables can make the code clearer by giving + names to objects, but that doesn't mean you should create temporary variables + all the time: + +```python +# pointless +schema = kw['schema'] +params = {'schema': schema} +# simpler +params = {'schema': kw['schema']} +``` + +- Multiple return points are OK, when they're simpler + +```python +# a bit complex and with a redundant temp variable +def axes(self, axis): + axes = [] + if type(axis) == type([]): + axes.extend(axis) + else: + axes.append(axis) + return axes + + # clearer +def axes(self, axis): + if type(axis) == type([]): + return list(axis) # clone the axis + else: + return [axis] # single-element list +``` + +- Know your builtins : You should at least have a basic understanding of all + the Python builtins () + +```python +value = my_dict.get('key', None) # very very redundant +value = my_dict.get('key') # good +``` + +Also, `if 'key' in my_dict` and `if my_dict.get('key')` have very different +meaning, be sure that you're using the right one. + +- Learn list comprehensions : Use list comprehension, dict comprehension, and + basic manipulation using `map`, `filter`, `sum`, ... They make the code + easier to read. + +```python +# not very good +cube = [] +for i in res: + cube.append((i['id'],i['name'])) +# better +cube = [(i['id'], i['name']) for i in res] +``` + +- Collections are booleans too : In python, many objects have "boolean-ish" value + when evaluated in a boolean context (such as an if). Among these are collections + (lists, dicts, sets, ...) which are "falsy" when empty and "truthy" when containing + items: + +```python +bool([]) is False +bool([1]) is True +bool([False]) is True +``` + +So, you can write `if some_collection:` instead of `if len(some_collection):`. + +- Iterate on iterables + +```python +# creates a temporary list and looks bar +for key in my_dict.keys(): + "do something..." +# better +for key in my_dict: + "do something..." +# accessing the key,value pair +for key, value in my_dict.items(): + "do something..." +``` + +- Use dict.setdefault + +```python +# longer.. harder to read +values = {} +for element in iterable: + if element not in values: + values[element] = [] + values[element].append(other_value) + +# better.. use dict.setdefault method +values = {} +for element in iterable: + values.setdefault(element, []).append(other_value) +``` + +- As a good developer, document your code (docstring on methods, simple + comments for tricky part of code) +- In additions to these guidelines, you may also find the following link + interesting: + (a little bit outdated, but quite relevant) + +### Programming in Odoo + +- Avoid to create generators and decorators: only use the ones provided by + the Odoo API. +- As in python, use `filtered`, `mapped`, `sorted`, ... methods to + ease code reading and performance. + +#### Propagate the context + +The context is a `frozendict` that cannot be modified. To call a method with +a different context, the `with_context` method should be used : + +```python +records.with_context(new_context).do_stuff() # all the context is replaced +records.with_context(**additionnal_context).do_other_stuff() # additionnal_context values override native context ones +``` + +:::{warning} +Passing parameter in context can have dangerous side-effects. + +Since the values are propagated automatically, some unexpected behavior may appear. +Calling `create()` method of a model with *default_my_field* key in context +will set the default value of *my_field* for the concerned model. +But if during this creation, other objects (such as sale.order.line, on sale.order creation) +having a field name *my_field* are created, their default value will be set too. +::: + +If you need to create a key context influencing the behavior of some object, +choose a good name, and eventually prefix it by the name of the module to +isolate its impact. A good example are the keys of `mail` module : +*mail_create_nosubscribe*, *mail_notrack*, *mail_notify_user_signature*, ... + +#### Think extendable + +Functions and methods should not contain too much logic: having a lot of small +and simple methods is more advisable than having few large and complex methods. +A good rule of thumb is to split a method as soon as it has more than one +responsibility (see ). + +Hardcoding a business logic in a method should be avoided as it prevents to be +easily extended by a submodule. + +```python +# do not do this +# modifying the domain or criteria implies overriding whole method +def action(self): + ... # long method + partners = self.env['res.partner'].search(complex_domain) + emails = partners.filtered(lambda r: arbitrary_criteria).mapped('email') + +# better but do not do this either +# modifying the logic forces to duplicate some parts of the code +def action(self): + ... + partners = self._get_partners() + emails = partners._get_emails() + +# better +# minimum override +def action(self): + ... + partners = self.env['res.partner'].search(self._get_partner_domain()) + emails = partners.filtered(lambda r: r._filter_partners()).mapped('email') +``` + +The above code is over extendable for the sake of example but the readability +must be taken into account and a tradeoff must be made. + +Also, name your functions accordingly: small and properly named functions are +the starting point of readable/maintainable code and tighter documentation. + +This recommendation is also relevant for classes, files, modules and packages. +(See also ) + +#### Never commit the transaction + +The Odoo framework is in charge of providing the transactional context for +all RPC calls. The principle is that a new database cursor is opened at the +beginning of each RPC call, and committed when the call has returned, just +before transmitting the answer to the RPC client, approximately like this: + +```python +def execute(self, db_name, uid, obj, method, *args, **kw): + db, pool = pooler.get_db_and_pool(db_name) + # create transaction cursor + cr = db.cursor() + try: + res = pool.execute_cr(cr, uid, obj, method, *args, **kw) + cr.commit() # all good, we commit + except Exception: + cr.rollback() # error, rollback everything atomically + raise + finally: + cr.close() # always close cursor opened manually + return res +``` + +If any error occurs during the execution of the RPC call, the transaction is +rolled back atomically, preserving the state of the system. + +Similarly, the system also provides a dedicated transaction during the execution +of tests suites, so it can be rolled back or not depending on the server +startup options. + +The consequence is that if you manually call `cr.commit()` anywhere there is +a very high chance that you will break the system in various ways, because you +will cause partial commits, and thus partial and unclean rollbacks, causing +among others: + +1. inconsistent business data, usually data loss +2. workflow desynchronization, documents stuck permanently +3. tests that can't be rolled back cleanly, and will start polluting the + database, and triggering error (this is true even if no error occurs + during the transaction) + +Here is the very simple rule: + +: You should **NEVER** call `cr.commit()` yourself, **UNLESS** you have + created your own database cursor explicitly! And the situations where you + need to do that are exceptional! + + And by the way if you did create your own cursor, then you need to handle + error cases and proper rollback, as well as properly close the cursor when + you're done with it. + +And contrary to popular belief, you do not even need to call `cr.commit()` +in the following situations: +\- in the `_auto_init()` method of an *models.Model* object: this is taken +care of by the addons initialization method, or by the ORM transaction when +creating custom models +\- in reports: the `commit()` is handled by the framework too, so you can +update the database even from within a report +\- within *models.Transient* methods: these methods are called exactly like +regular *models.Model* ones, within a transaction and with the corresponding +`cr.commit()/rollback()` at the end +\- etc. (see general rule above if you are in doubt!) + +All `cr.commit()` calls outside of the server framework from now on must +have an **explicit comment** explaining why they are absolutely necessary, why +they are indeed correct, and why they do not break the transactions. Otherwise +they can and will be removed ! + +#### Use translation method correctly + +Odoo uses a GetText-like method named "underscore" `_()` to indicate that +a static string used in the code needs to be translated at runtime. +That method is available at `self.env._` using the language of the +environment. + +A few very important rules must be followed when using it, in order for it to +work and to avoid filling the translations with useless junk. + +Basically, this method should only be used for static strings written manually +in the code, it will not work to translate field values, such as Product names, +etc. This must be done instead using the translate flag on the corresponding +field. + +The method accepts optional positional or named parameter +The rule is very simple: calls to the underscore method should always be in +the form `self.env._('literal string')` and nothing else: + +```python +_ = self.env._ + +# good: plain strings +error = _('This record is locked!') + +# good: strings with formatting patterns included +error = _('Record %s cannot be modified!', record) + +# ok too: multi-line literal strings +error = _("""This is a bad multiline example + about record %s!""", record) +error = _('Record %s cannot be modified' \ + 'after being validated!', record) + +# bad: tries to translate after string formatting +# (pay attention to brackets!) +# This does NOT work and messes up the translations! +error = _('Record %s cannot be modified!' % record) + +# bad: formatting outside of translation +# This won't benefit from fallback mechanism in case of bad translation +error = _('Record %s cannot be modified!') % record + +# bad: dynamic string, string concatenation, etc are forbidden! +# This does NOT work and messes up the translations! +error = _("'" + que_rec['question'] + "' \n") + +# bad: field values are automatically translated by the framework +# This is useless and will not work the way you think: +error = _("Product %s is out of stock!") % _(product.name) +# and the following will of course not work as already explained: +error = _("Product %s is out of stock!" % product.name) + +# Instead you can do the following and everything will be translated, +# including the product name if its field definition has the +# translate flag properly set: +error = _("Product %s is not available!", product.name) +``` + +Also, keep in mind that translators will have to work with the literal values +that are passed to the underscore function, so please try to make them easy to +understand and keep spurious characters and formatting to a minimum. Translators +must be aware that formatting patterns such as `%s` or `%d`, newlines, etc. +need to be preserved, but it's important to use these in a sensible and obvious +manner: + +```python +# Bad: makes the translations hard to work with +error = "'" + question + _("' \nPlease enter an integer value ") + +# Ok (pay attention to position of the brackets too!) +error = _("Answer to question %s is not valid.\n" \ + "Please enter an integer value.", question) + +# Better +error = _("Answer to question %(title)s is not valid.\n" \ + "Please enter an integer value.", title=question) +``` + +In general in Odoo, when manipulating strings, prefer `%` over `.format()` +(when only one variable to replace in a string), and prefer `%(varname)` instead +of position (when multiple variables have to be replaced). This makes the +translation easier for the community translators. + +### Symbols and Conventions + +- Model name (using the dot notation, prefix by the module name) : + : - When defining an Odoo Model : use singular form of the name (*res.partner* + and *sale.order* instead of *res.partnerS* and *saleS.orderS*) + - When defining an Odoo Transient (wizard) : use `.` + where *related_base_model* is the base model (defined in *models/*) related + to the transient, and *action* is the short name of what the transient do. Avoid the *wizard* word. + For instance : `account.invoice.make`, `project.task.delegate.batch`, ... + - When defining *report* model (SQL views e.i.) : use + `.report.`, based on the Transient convention. +- Odoo Python Class : use camelcase (Object-oriented style). + +```python +class AccountInvoice(models.Model): + ... +``` + +- Variable name : + : - use camelcase 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 + +```python +Partner = self.env['res.partner'] +partners = Partner.browse(ids) +partner_id = partners[0].id +``` + +- `One2Many` and `Many2Many` fields should always have *\_ids* as suffix (example: sale_order_line_ids) +- `Many2One` fields should have *\_id* as suffix (example : partner_id, user_id, ...) +- Method conventions + : - Compute Field : the compute method pattern is *\_compute\_\* + - Search method : the search method pattern is *\_search\_\* + - Default method : the default method pattern is *\_default\_\* + - Selection method: the selection method pattern is *\_selection\_\* + - Onchange method : the onchange method pattern is *\_onchange\_\* + - Constraint method : the constraint method pattern is *\_check\_\* + - Action method : an object action method is prefix with *action\_*. + Since it uses only one record, add `self.ensure_one()` + at the beginning of the method. +- In a Model attribute order should be + : 1. Private attributes (`_name`, `_description`, `_inherit`, `_sql_constraints`, ...) + 2. Default method and `default_get` + 3. Field declarations + 4. Compute, inverse and search methods in the same order as field declaration + 5. Selection method (methods used to return computed values for selection fields) + 6. Constrains methods (`@api.constrains`) and onchange methods (`@api.onchange`) + 7. CRUD methods (ORM overrides) + 8. Action methods + 9. And finally, other business methods. + +```python +class Event(models.Model): + # Private attributes + _name = 'event.event' + _description = 'Event' + + # Default methods + def _default_name(self): + ... + + # Fields declaration + name = fields.Char(string='Name', default=_default_name) + seats_reserved = fields.Integer(string='Reserved Seats', store=True + readonly=True, compute='_compute_seats') + seats_available = fields.Integer(string='Available Seats', store=True + readonly=True, compute='_compute_seats') + price = fields.Integer(string='Price') + event_type = fields.Selection(string="Type", selection='_selection_type') + + # compute and search fields, in the same order of fields declaration + @api.depends('seats_max', 'registration_ids.state', 'registration_ids.nb_register') + def _compute_seats(self): + ... + + @api.model + def _selection_type(self): + return [] + + # Constraints and onchanges + @api.constrains('seats_max', 'seats_available') + def _check_seats_limit(self): + ... + + @api.onchange('date_begin') + def _onchange_date_begin(self): + ... + + # CRUD methods (and name_search, _search, ...) overrides + def create(self, values): + ... + + # Action methods + def action_validate(self): + self.ensure_one() + ... + + # Business methods + def mail_user_confirm(self): + ... +``` + +(contributing-development-js-guidelines)= + +## Javascript + +### Static files organization + +Odoo addons have some conventions on how to structure various files. We explain +here in more details how web assets are supposed to be organized. + +The first thing to know is that the Odoo server will serve (statically) all files +located in a *static/* folder, but prefixed with the addon name. So, for example, +if a file is located in *addons/web/static/src/js/some_file.js*, then it will be +statically available at the url *your-odoo-server.com/web/static/src/js/some_file.js* + +The convention is to organize the code according to the following structure: + +- *static*: all static files in general + + - *static/lib*: this is the place where js libs should be located, in a sub folder. + So, for example, all files from the *jquery* library are in *addons/web/static/lib/jquery* + + - *static/src*: the generic static source code folder + + - *static/src/css*: all css files + + - *static/fonts* + + - *static/img* + + - *static/src/js* + + - *static/src/js/tours*: end user tour files (tutorials, not tests) + + - *static/src/scss*: scss files + + - *static/src/xml*: all qweb templates that will be rendered in JS + + - *static/tests*: this is where we put all test related files. + + - *static/tests/tours*: this is where we put all tour test files (not tutorials). + +### 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 + +More precise JS guidelines are detailed in the [github wiki](https://github.com/odoo/odoo/wiki/Javascript-coding-guidelines). +You may also have a look at existing API in Javascript by looking Javascript +References. + +(contributing-coding-guidelines-scss)= + +## CSS and SCSS + +(contributing-coding-guidelines-scss-formatting)= + +### Syntax and Formatting + +```{eval-rst} +.. tabs:: + + .. code-tab:: html SCSS + + .o_foo, .o_foo_bar, .o_baz { + height: $o-statusbar-height; + + .o_qux { + height: $o-statusbar-height * 0.5; + } + } + + .o_corge { + background: $o-list-footer-bg-color; + } + + .. code-tab:: css CSS + + .o_foo, .o_foo_bar, .o_baz { + height: 32px; + } + + .o_foo .o_quux, .o_foo_bar .o_quux, .o_baz .o_qux { + height: 16px; + } + + .o_corge { + background: #EAEAEA; + } +``` + +- four (4) space indents, no tabs; +- columns of max. 80 characters wide; +- opening brace (`{`): empty space after the last selector; +- closing brace (`}`): on its own new line; +- one line for each declaration; +- meaningful use of whitespace. + +```{eval-rst} +.. spoiler:: Suggested Stylelint settings + + .. code-block:: html + + "stylelint.config": { + "rules": { + // https://stylelint.io/user-guide/rules + + // Avoid errors + "block-no-empty": true, + "shorthand-property-no-redundant-values": true, + "declaration-block-no-shorthand-property-overrides": true, + + // Stylistic conventions + "indentation": 4, + + "function-comma-space-after": "always", + "function-parentheses-space-inside": "never", + "function-whitespace-after": "always", + + "unit-case": "lower", + + "value-list-comma-space-after": "always-single-line", + + "declaration-bang-space-after": "never", + "declaration-bang-space-before": "always", + "declaration-colon-space-after": "always", + "declaration-colon-space-before": "never", + + "block-closing-brace-empty-line-before": "never", + "block-opening-brace-space-before": "always", + + "selector-attribute-brackets-space-inside": "never", + "selector-list-comma-space-after": "always-single-line", + "selector-list-comma-space-before": "never-single-line", + } + }, +``` + +(contributing-coding-guidelines-scss-properties-order)= + +### Properties order + +Order properties from the "outside" in, starting from `position` and ending with decorative rules +(`font`, `filter`, etc.). + +{ref}`Scoped SCSS variables ` and +{ref}`CSS variables ` must be placed at the very +top, followed by an empty line separating them from other declarations. + +```html +.o_element { + $-inner-gap: $border-width + $legend-margin-bottom; + + --element-margin: 1rem; + --element-size: 3rem; + + @include o-position-absolute(1rem); + display: block; + margin: var(--element-margin); + width: calc(var(--element-size) + #{$-inner-gap}); + border: 0; + padding: 1rem; + background: blue; + font-size: 1rem; + filter: blur(2px); +} +``` + +(contributing-coding-guidelines-scss-naming-conventions)= + +### Naming Conventions + +Naming conventions in CSS are incredibly useful in making your code more strict, transparent and +informative. + +Avoid + +`id` + + selectors, and prefix your classes with + +`o_` + +, where + +`` + + is the +technical name of the module ( + +`sale` + +, + +`im_chat` + +, ...) or the main route reserved by the module +(for website modules mainly, i.e. : + +`o_forum` + + for the + +`website_forum` + + module). + +The only exception for this rule is the webclient: it simply uses the + +`o_` + + prefix. + +Avoid creating hyper-specific classes and variable names. When naming nested elements, opt for the +"Grandchild" approach. + +```{eval-rst} +.. rst-class:: bg-light +``` + +```{eval-rst} +.. example:: + + .. container:: alert alert-danger + + Don't + + .. code-block:: html + +

+
+ + Entry + +
+
+ + .. container:: alert alert-success + + Do + + .. code-block:: html + +
+
+ + Entry + +
+
+``` + +Besides being more compact, this approach eases maintenance because it limits the need of renaming +when changes occur at the DOM. + +(contributing-coding-guidelines-scss-scss-variables)= + +#### SCSS Variables + +Our standard convention is `$o-[root]-[element]-[property]-[modifier]`, with: + +- `$o-` + : The prefix. +- `[root]` + : Either the component **or** the module name (components take priority). +- `[element]` + : An optional identifier for inner elements. +- `[property]` + : The property/behavior defined by the variable. +- `[modifier]` + : An optional modifier. + +```{eval-rst} +.. example:: + + .. code-block:: scss + + $o-block-color: value; + $o-block-title-color: value; + $o-block-title-color-hover: value; +``` + +(contributing-coding-guidelines-scss-scoped-scss-variables)= + +#### SCSS Variables (scoped) + +These variables are declared within blocks and are not accessible from the outside. +Our standard convention is `$-[variable name]`. + +```{eval-rst} +.. example:: + + .. code-block:: html + + .o_element { + $-inner-gap: compute-something; + + margin-right: $-inner-gap; + + .o_element_child { + margin-right: $-inner-gap * 0.5; + } + } +``` + +:::{seealso} +[Variables scope on the SASS Documentation](https://sass-lang.com/documentation/variables#scope) +::: + +(contributing-coding-guidelines-scss-mixins)= + +#### SCSS Mixins and Functions + +Our standard convention is `o-[name]`. Use descriptive names. When naming functions, use verbs in +the imperative form (e.g.: `get`, `make`, `apply`...). + +Name optional arguments in the {ref}`scoped variables form +`, so `$-[argument]`. + +```{eval-rst} +.. example:: + + .. code-block:: html + + @mixin o-avatar($-size: 1.5em, $-radius: 100%) { + width: $-size; + height: $-size; + border-radius: $-radius; + } + + @function o-invert-color($-color, $-amount: 100%) { + $-inverse: change-color($-color, $-hue: hue($-color) + 180); + + @return mix($-inverse, $-color, $-amount); + } +``` + +:::{seealso} +- [Mixins on the SASS Documentation](https://sass-lang.com/documentation/at-rules/mixin) +- [Functions on the SASS Documentation](https://sass-lang.com/documentation/at-rules/function) +::: + +(contributing-coding-guidelines-scss-css-variables)= + +#### CSS Variables + +In Odoo, the use of CSS variables is strictly DOM-related. Use them to **contextually** adapt the +design and layout. + +Our standard convention is BEM, so `--[root]__[element]-[property]--[modifier]`, with: + +- `[root]` + : Either the component **or** the module name (components take priority). +- `[element]` + : An optional identifier for inner elements. +- `[property]` + : The property/behavior defined by the variable. +- `[modifier]` + : An optional modifier. + +```{eval-rst} +.. example:: + + .. code-block:: scss + + .o_kanban_record { + --KanbanRecord-width: value; + --KanbanRecord__picture-border: value; + --KanbanRecord__picture-border--active: value; + } + + // Adapt the component when rendered in another context. + .o_form_view { + --KanbanRecord-width: another-value; + --KanbanRecord__picture-border: another-value; + --KanbanRecord__picture-border--active: another-value; + } +``` + +(contributing-coding-guidelines-scss-variables-use)= + +### Use of CSS Variables + +In Odoo, the use of CSS variables is strictly DOM-related, meaning that are used to **contextually** +adapt the design and layout rather than to manage the global design-system. These are typically used +when a component's properties can vary in specific contexts or in other circumstances. + +We define these properties inside the component's main block, providing default fallbacks. + +```{eval-rst} +.. example:: + + .. code-block:: scss + :caption: :file:`my_component.scss` + + .o_MyComponent { + color: var(--MyComponent-color, #313131); + } + + .. code-block:: scss + :caption: :file:`my_dashboard.scss` + + .o_MyDashboard { + // Adapt the component in this context only + --MyComponent-color: #017e84; + } +``` + +:::{seealso} +[CSS variables on MDN web docs](https://developer.mozilla.org/en-US/docs/Web/CSS/Using_CSS_custom_properties) +::: + +(contributing-coding-guidelines-scss-css-scss-variables-use)= + +#### CSS and SCSS Variables + +Despite being apparently similar, `CSS` and `SCSS` variables behave very differently. The main +difference is that, while `SCSS` variables are **imperative** and compiled away, `CSS` variables are +**declarative** and included in the final output. + +:::{seealso} +[CSS/SCSS variables difference on the SASS Documentation](https://sass-lang.com/documentation/variables#:~:text=CSS%20variables%20are%20included%20in,use%20will%20stay%20the%20same) +::: + +In Odoo, we take the best of both worlds: using the `SCSS` variables to define the design-system +while opting for the `CSS` ones when it comes to contextual adaptations. + +The implementation of the previous example should be improved by adding SCSS variables in order to +gain control at the top-level and ensure consistency with other components. + +```{eval-rst} +.. example:: + + .. code-block:: scss + :caption: :file:`secondary_variables.scss` + + $o-component-color: $o-main-text-color; + $o-dashboard-color: $o-info; + // [...] + + .. code-block:: text + :caption: :file:`component.scss` + + .o_component { + color: var(--MyComponent-color, #{$o-component-color}); + } + + .. code-block:: text + :caption: :file:`dashboard.scss` + + .o_dashboard { + --MyComponent-color: #{$o-dashboard-color}; + } +``` + +(contributing-coding-guidelines-scss-root)= + +#### The `:root` pseudo-class + +Defining CSS variables on the `:root` pseudo-class is a technique we normally **don't use** in +Odoo's UI. The practice is commonly used to access and modify CSS variables globally. We perform +this using SCSS instead. + +Exceptions to this rule should be fairly apparent, such as templates shared across bundles that +require a certain level of contextual awareness in order to be rendered properly. + diff --git a/content/contributing/development/git_guidelines.md b/content/contributing/development/git_guidelines.md new file mode 100644 index 000000000..de91ce8e4 --- /dev/null +++ b/content/contributing/development/git_guidelines.md @@ -0,0 +1,139 @@ +# Git guidelines + +## Configure your git + +Based on ancestral experience and oral tradition, the following things go a long +way towards making your commits more helpful: + +- Be sure to define both the user.email and user.name in your local git config + + ```text + git config --global + ``` + +- Be sure to add your full name to your Github profile here. Please feel fancy + and add your team, avatar, your favorite quote, and whatnot ;-) + +## Commit message structure + +Commit message has four parts: tag, module, short description and full +description. Try to follow the preferred structure for your commit messages + +```text +[TAG] module: describe your change in a short sentence (ideally < 50 chars) + +Long version of the change description, including the rationale for the change, +or a summary of the feature being introduced. + +Please spend a lot more time describing WHY the change is being done rather +than WHAT is being changed. This is usually easy to grasp by actually reading +the diff. WHAT should be explained only if there are technical choices +or decision involved. In that case explain WHY this decision was taken. + +End the message with references, such as task or bug numbers, PR numbers, and +OPW tickets, following the suggested format: +task-123 (related to task) +Fixes #123 (close related issue on Github) +Closes #123 (close related PR on Github) +opw-123 (related to ticket) +``` + +## Tag and module name + +Tags are used to prefix your commit. They should be one of the following + +- **[FIX]** for bug fixes: mostly used in stable version but also valid if you + are fixing a recent bug in development version; +- **[REF]** for refactoring: when a feature is heavily rewritten; +- **[ADD]** for adding new modules; +- **[REM]** for removing resources: removing dead code, removing views, + removing modules, ...; +- **[REV]** for reverting commits: if a commit causes issues or is not wanted + reverting it is done using this tag; +- **[MOV]** for moving files: use git move and do not change content of moved file + otherwise Git may loose track and history of the file; also used when moving + code from one file to another; +- **[REL]** for release commits: new major or minor stable versions; +- **[IMP]** for improvements: most of the changes done in development version + are incremental improvements not related to another tag; +- **[MERGE]** for merge commits: used in forward port of bug fixes but also as + main commit for feature involving several separated commits; +- **[CLA]** for signing the Odoo Individual Contributor License; +- **[I18N]** for changes in translation files; +- **[PERF]** for performance patches; + +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 +various to tell it is cross-modules. Unless really required or easier avoid +modifying code across several modules in the same commit. Understanding module +history may become difficult. + +## Commit message header + +After tag and module name comes a meaningful commit message header. It should be +self explanatory and include the reason behind the change. Do not use single words +like "bugfix" or "improvements". Try to limit the header length to about 50 characters +for readability. + +Commit message header should make a valid sentence once concatenated with +`if applied, this commit will
`. For example `[IMP] base: prevent to +archive users linked to active partners` is correct as it makes a valid sentence +`if applied, this commit will prevent users to archive...`. + +## Commit message full description + +In the message description specify the part of the code impacted by your changes +(module name, lib, transversal object, ...) and a description of the changes. + +First explain WHY you are modifying code. What is important if someone goes back +to your commit in about 4 decades (or 3 days) is why you did it. It is the +purpose of the change. + +What you did can be found in the commit itself. If there was some technical choices +involved it is a good idea to explain it also in the commit message after the why. +For Odoo R&D developers "PO team asked me to do it" is not a valid why, by the way. + +Please avoid commits which simultaneously impact multiple modules. Try to split +into different commits where impacted modules are different. It will be helpful +if we need to revert changes in a given module separately. + +Don't hesitate to be a bit verbose. Most people will only see your commit message +and judge everything you did in your life just based on those few sentences. +No pressure at all. + +**You spend several hours, days or weeks working on meaningful features. Take +some time to calm down and write clear and understandable commit messages.** + +If you are an Odoo R&D developer the WHY should be the purpose of the task you +are working on. Full specifications make the core of the commit message. +**If you are working on a task that lacks purpose and specifications please +consider making them clear before continuing.** + +Finally here are some examples of correct commit messages : + +```text +[REF] models: use `parent_path` to implement parent_store + + This replaces the former modified preorder tree traversal (MPTT) with the + fields `parent_left`/`parent_right`[...] + +[FIX] account: remove frenglish + + [...] + + Closes #22793 + Fixes #22769 + +[FIX] website: remove unused alert div, fixes look of input-group-btn + + Bootstrap's CSS depends on the input-group-btn + element being the first/last child of its parent. + This was not the case because of the invisible + and useless alert. +``` + +:::{note} +Use the long description to explain the *why* not the +*what*, the *what* can be seen in the diff +::: + diff --git a/content/contributing/documentation.md b/content/contributing/documentation.md new file mode 100644 index 000000000..6ef18647d --- /dev/null +++ b/content/contributing/documentation.md @@ -0,0 +1,315 @@ +--- +show-content: true +--- + +# Documentation + +```{toctree} +:titlesonly: true + +documentation/content_guidelines +documentation/rst_guidelines +``` + +This introductory guide will help you acquire the tools and knowledge needed to contribute to the +documentation. + +Read the {ref}`introduction to the reStructuredText language ` +if you are not familiar with it. Then, there are two courses of action to start contributing to the +documentation: + +- **For minor changes**, such as adding a paragraph or fixing a typo, we recommend **using the + GitHub interface**. This is the easiest and fastest way to submit changes, and it is suitable for + non-technical people. Jump directly to the {ref}`contributing/documentation/first-contribution` + section to get started. +- **For more complex changes**, such as adding a new page, it is necessary to **use Git** and work + from a local copy of the documentation. Follow the instructions in the + {ref}`contributing/documentation/setup` section first to prepare your environment. + +:::{seealso} +{doc}`Discover other ways to contribute to Odoo <../contributing>` +::: + +(contributing-documentation-rst-intro)= + +## reStructuredText (RST) + +The documentation is written in **reStructuredText** (RST), a [lightweight markup language](https://en.wikipedia.org/wiki/Lightweight_markup_language) consisting of regular text augmented +with markup, which allows including headings, images, notes, and so on. {abbr}`RST +(reStructuredText)` is easy to use, even if you are not familiar with it. + +:::{important} +Be mindful of our {doc}`content ` and +{doc}`RST ` guidelines as you write documentation. This ensures +that the documentation stays consistent and facilitates the approval of changes by the Odoo team. +::: + +(contributing-documentation-setup)= + +## Environment setup + +The instructions below help you prepare your environment for making local changes to the +documentation and then push them to GitHub. Skip this section and go to +{ref}`contributing/documentation/first-contribution` if you have already completed this step or want +to make changes from the GitHub interface. + +01. First, [create a GitHub account](https://github.com/join). Odoo uses GitHub to manage the + source code of its products, and this is where you will submit your changes. + +02. [Generate a new SSH key and register it on your GitHub account](https://docs.github.com/en/authentication/connecting-to-github-with-ssh). + +03. Go to [github.com/odoo/documentation](https://github.com/odoo/documentation) and click on the + {guilabel}`Fork` button in the top right corner to create a fork ({dfn}`your own copy`) of the + repository on your account. This creates a copy of the codebase to which you can make changes + without affecting the main codebase. Skip this step if you work at Odoo. + +04. ```{eval-rst} + .. include:: install_git.rst + ``` + +05. Configure Git to identify yourself as the author of your future contributions. Enter the same + email address you used to register on GitHub. + + ```console + $ git config --global user.name "Your Name" + $ git config --global user.email "youremail@example.com" + ``` + +06. Clone the sources with Git and navigate into the local repository. + + ```console + $ git clone git@github.com:odoo/documentation.git + $ cd documentation + ``` + +07. Configure Git to push changes to your fork rather than to the main codebase. In the commands + below, replace `` with the name of the GitHub account on which you created + the fork. Skip this step if you work at Odoo. + + ```console + $ git remote add dev git@github.com:/documentation.git + ``` + +08. Configure Git to ease the collaboration between writers coming from different systems. + + ```{eval-rst} + .. tabs:: + + .. group-tab:: Linux and macOS + + .. code-block:: console + + $ git config --global core.autocrlf input + $ git config commit.template `pwd`/commit_template.txt + + .. group-tab:: Windows + + .. code-block:: console + + $ git config --global core.autocrlf true + $ git config commit.template %CD%\commit_template.txt + ``` + +09. Install the latest release of [Python](https://wiki.python.org/moin/BeginnersGuide/Download) + and [pip](https://pip.pypa.io/en/stable/installation/). + +10. Install the Python dependencies of the documentation with pip. + + ```console + $ pip install -r requirements.txt + ``` + + Verify that the installation directory of the Python dependencies is included in your system's + `PATH` variable. + + ```{eval-rst} + .. tabs:: + + .. group-tab:: Linux and macOS + + Follow the `guide to update the PATH variable on Linux and macOS + `_ with the installation path of the Python + dependencies (by default :file:`~/.local/bin`). + + .. group-tab:: Windows + + Follow the `guide to update the PATH variable on Windows + `_ + with the installation path of the Python dependencies. + ``` + +11. Install Make. + + ```{eval-rst} + .. tabs:: + + .. group-tab:: Linux + + .. code-block:: console + + $ sudo apt install make -y + + .. group-tab:: macOS + + Follow the `guide to install Make on macOS `_ + + .. group-tab:: Windows + + Follow the `guide to install Make on Windows + `_. + ``` + +12. [Install pngquant](https://pngquant.org/). + +13. You are now ready to {ref}`make your first contribution + ` with Git. + +(contributing-documentation-first-contribution)= + +## Contributing to the documentation + +```{eval-rst} +.. tabs:: + + .. tab:: Contribute from the GitHub interface + + #. First, `create a GitHub account `_. Odoo uses GitHub to manage the + source code of its products, and this is where you will submit your changes. + #. Verify that you are browsing the documentation in the version that you intend to change. + The version can be selected from the dropdown in the top menu. + #. Head to the page that you want to change and click on the :guilabel:`Edit on GitHub` button + in the top right corner of the page. + #. Click on the :guilabel:`Fork this repository` button to create a fork (:dfn:`your own + copy`) of the repository on your account. This creates a copy of the codebase to which you + can make changes without affecting the main codebase. Skip this step if you work at Odoo. + + .. image:: documentation/fork-repository.png + :scale: 60% + + #. Make the desired changes while taking care of following the :doc:`content + ` and :doc:`RST ` + guidelines. + + .. tip:: + Click on the :guilabel:`Preview changes` button to review your contribution in a more + human-readable format. Be aware that the preview is not able to handle all markups + correctly. Notes and tips, for instance, are shown as plain text. + + #. Scroll to the bottom of the page and fill out the small form to propose your changes. In + the first text box, write a very short summary of your changes. For instance, "Fix a typo" + or "Add documentation for invoicing of sales orders." In the second text box, explain *why* + you are proposing these changes. Then, click on the :guilabel:`Propose changes` button. + + .. image:: documentation/propose-changes.png + :scale: 60% + + #. Review your changes and click on the :guilabel:`Create pull request` button. + #. Tick the :guilabel:`Allow edits from maintainer` checkbox. Skip this step if you work at + Odoo. + #. Review the summary that you wrote about your changes and click on the :guilabel:`Create + pull request` button again. + #. At the bottom of the page, check the mergeability status and address any issues. + #. As soon as your :abbr:`PR (Pull Request)` is ready for merging, a member of the Odoo team + is automatically assigned for review. If the reviewer has questions or remarks, they will + post them as comments and you will be notified by email. Those comments must be resolved + for the contribution to go forward. + + #. Once your changes are approved, the reviewer merges them and they appear online the next + day. + + .. tab:: Contribute with Git + + .. important:: + Some steps of this guide require to be comfortable with Git. Here are some `tutorials + `_ and an `interactive training + `_ if you are stuck at some point. + + Now that your environment is set up, you can start contributing to the documentation. In a + terminal, navigate to the directory where you cloned the sources and follow the guide below. + + #. Choose the version of the documentation to which you want to make changes. Keep in mind + that contributions targeting an :doc:`unsupported version of Odoo + ` are not accepted. This guide assumes that the changes + target the documentation of Odoo {CURRENT_VERSION}, which corresponds to branch + `{CURRENT_BRANCH}`. + #. Create a new branch starting from branch {CURRENT_BRANCH}. Prefix the branch name with the + base branch: `{CURRENT_BRANCH}-...`. If you work at Odoo, suffix the branch name with your + Odoo handle: `{CURRENT_BRANCH}-...-xyz`. + + .. example:: + + .. code-block:: console + + $ git switch -c {CURRENT_BRANCH}-explain-pricelists + + .. code-block:: console + + $ git switch -c {CURRENT_BRANCH}-explain-pricelists-xyz + + #. Make the desired changes while taking care of following the :doc:`content + ` and :doc:`RST ` + guidelines. + #. Compress all PNG images that were added or modified. + + .. code-block:: console + + $ pngquant path/to/image.png + $ mv path/to/image-fs8.png path/to/image.png + + #. Write a `redirect rule + `_ for every RST + file that were renamed. + #. Build the documentation with :command:`make`. Then, open :file:`_build/index.html` in a web + browser to browse the documentation with your changes. + + .. tip:: + Use :command:`make help` to learn about other useful commands. + + #. Commit your changes. Write a clear commit message as instructed in the :doc:`Git guidelines + `. + + .. code-block:: console + + $ git add . + $ git commit + + #. Push your changes to your fork, for which we added the remote alias `dev`. + + .. example:: + + .. code-block:: console + + $ git push -u dev {CURRENT_BRANCH}-explain-pricelists + + If you work at Odoo, push your changes directly to the main codebase whose remote alias is + `origin`. + + .. example:: + + .. code-block:: console + + $ git push -u origin {CURRENT_BRANCH}-explain-pricelists-xyz + + #. Open a :abbr:`PR (Pull Request)` on GitHub to submit your changes for review. + + #. Go to the `compare page of the odoo/documentation codebase + `_. + #. Select **{CURRENT_BRANCH}** for the base. + #. Click on :guilabel:`compare across forks`. + #. Select **/odoo** for the head repository. Replace + `` with the name of the GitHub account on which you created the + fork. Skip this step if you work at Odoo. + #. Review your changes and click on the :guilabel:`Create pull request` button. + #. Tick the :guilabel:`Allow edits from maintainer` checkbox. Skip this step if you work at + Odoo. + #. Complete the description and click on the :guilabel:`Create pull request` button again. + + #. At the bottom of the page, check the mergeability status and address any issues. + #. As soon as your :abbr:`PR (Pull Request)` is ready for merging, a member of the Odoo team + is automatically assigned for review. If the reviewer has questions or remarks, they will + post them as comments and you will be notified by email. Those comments must be resolved + for the contribution to go forward. + #. Once your changes are approved, the reviewer merges them and they appear online the next + day. +``` + diff --git a/content/contributing/documentation/content_guidelines.md b/content/contributing/documentation/content_guidelines.md new file mode 100644 index 000000000..9f0b9a85f --- /dev/null +++ b/content/contributing/documentation/content_guidelines.md @@ -0,0 +1,353 @@ +# Content guidelines + +While we encourage you to adopt your own writing style, some rules still apply to maintain clarity +and ensure readers can easily understand the content. + +:::{important} +We strongly recommend to read the {doc}`rst_guidelines` and the main {doc}`../documentation` +pages before contributing. +::: + +(contributing-content-organization)= + +## Documentation organization + +When writing documentation about a given topic, keep pages within the same folder organized. + +For most topics, a single page should do the job. Place it in the appropriate section of the +documentation (e.g., content related to the CRM app goes under {menuselection}`User Docs --> Sales +--> CRM`) and follow the {ref}`document structure ` guidelines. + +For more complex topics, several pages may be needed to cover all their aspects. Usually, you will +find yourself adding documentation to a topic that is already partially covered. In that case, +either create a new page and place it at the same level as other related pages or add new sections +to an existing page. When documenting a complex topic from scratch, organize the content across +several child pages that are referenced on that directory's parent page (the {abbr}`TOC (Table Of +Contents)` page); whenever possible, write content on the parent page and not only on the child +pages. Make the parent page accessible from the navigation menu by using the +{ref}`show-content ` metadata directive. + +:::{note} +Avoid duplicating content whenever possible; if a topic is already documented on another page, +{ref}`reference ` that existing information instead of repeating it. +::: + +:::{important} +When deleting or moving a `.rst` file, update the corresponding text file in the +{file}`redirects` folder based on your branch's version (e.g., {file}`17.0.txt`). To do so, add a +new line at the bottom of the relevant section (e.g., `# applications/sales`). On this line, +first, add the redirection entry point with the old file location, followed by a space, and then +add the exit point with the new or relevant file location. For example, if moving the file +{file}`unsplash.rst` from {file}`applications/websites/website/configuration` to +{file}`applications/general/integrations`, add the following entry under the section +`# applications/websites`: + +```text +applications/websites/website/configuration/unsplash.rst applications/general/integrations/unsplash.rst +``` +::: + +(contributing-content-structure)= + +## Document structure + +Use different **heading levels** to organize text by sections and sub-sections. Headings are not +only displayed in the document but also on the navigation menu (only the H1) and on the "On this +page" sidebar (all H2 to H6). + +```{eval-rst} ++---------------------------------------------------------------------------------------+ +| | **H1: Page title** | +| | The *page title* gives readers a quick and clear understanding of what the content | +| is about. | +| | +| The *content* in this section describes the upcoming content from a **business point | +| of view**, and should not put the emphasis on Odoo, as this is documentation and not | +| marketing. | +| | +| Under the page title (H1), start with a **lead paragraph**, which helps the reader | +| make sure that they've found the right page, then explain the **business aspects of | +| this topic** in the following paragraphs. | ++-----+---------------------------------------------------------------------------------+ +| | | **H2: Section title (configuration)** | +| | | This first H2 section is about the configuration of the feature, or the | +| | prerequisites to achieve a specific goal. | ++-----+---------------------------------------------------------------------------------+ +| | | **H2: Section title (main sections)** | +| | | Create as many main sections as you have actions or features to distinguish. | ++-----+-----+---------------------------------------------------------------------------+ +| | | | **H3: Subsection** | +| | | | Subsections are perfect for assessing very specific points. | ++-----+-----+---------------------------------------------------------------------------+ +| | **H2: Next Section** | ++-----+---------------------------------------------------------------------------------+ +``` + +To write good titles and headings: + +- **Be concise**: **avoid sentences**, questions, and titles starting with "how to". + +- **Do not use pronouns** in your titles, especially 2nd person (*you/your*). + +- Use **sentence case**. This means you capitalize only: + + - the first word of the title or heading; + - the first word after a colon; + - proper nouns (brands, product and service names, etc.). + +:::{note} +- Most titles and headings generally refer to a concept and do *not* represent the name of a + feature or a model. +- Do not capitalize the words of an acronym if they do not entail a proper noun. +- Verbs in headings are fine since they often describe an action. +::: + +:::{seealso} +- {ref}`RST cheat sheet: headings ` +- {ref}`RST cheat sheet: markups ` +::: + +(contributing-content-writing-style)= + +## Writing style + +Writing for documentation is not the same as writing for a blog or another medium. Readers are +more likely to skim through content to find the information they need. Keep in mind that the +documentation is a place to **inform and describe**, not to convince and promote. + +:::{tip} +Avoid using *you* as much as possible by opting for the imperative mood where appropriate. +However, do not complicate sentences just to avoid addressing the reader directly. + +```{eval-rst} +.. example:: + | **Good example:** + | Select the appropriate option from the dropdown menu. + + | **Bad example:** + | You can select the appropriate option from the dropdown menu. +``` +::: + +(contributing-content-spelling)= + +### Spelling + +Use American English spelling and grammar throughout the documentation. + +(contributing-content-consistency)= + +### Consistency + +*Consistency is key to everything.* + +Make sure that the writing style remains **consistent**. When modifying existing content, try to +match the existing tone and presentation or rewrite it to match your own style. + +(contributing-content-capitalization)= + +### Capitalization + +- Use sentence case in {ref}`titles `. +- Capitalize app names, e.g., **Odoo Sales**, the **Sales** app, etc. +- Capitalize labels (such as fields and buttons) as they appear in Odoo. If a label is in all caps, + convert it to sentence case. +- Capitalize the first letter after a colon if it is a complete sentence. +- Avoid capitalizing common nouns, such as "sales order" and "bill of materials", unless you + reference a label or a model. + +(contributing-content-grammatical-tenses)= + +### Grammatical tenses + +In English, descriptions and instructions usually require the use of the **present tense**, while +the *future tense* is appropriate only when a specific event is to happen ulteriorly. + +```{eval-rst} +.. example:: + + | **Good example (present):** + | Screenshots are automatically resized to fit the content block's width. + + | **Bad example (future):** + | When you take a screenshot, remember that it will be automatically resized to fit the content + block's width. +``` + +(contributing-content-lists)= + +## Lists + +Lists help organize information in a clear and concise manner and improve readability. They are +used to highlight important details, guide the reader through steps in a systematic way, etc. + +Use numbered lists when the sequence matters, e.g., instructions, procedures, or steps that must be +performed in a particular order. + +Use bulleted lists when the sequence of items does not matter, e.g., lists of features, fields, +options, etc. + +:::{tip} +- Use inline text for explanations or when there are three or fewer list items. +- Combine bulleted and numbered lists using {ref}`nested lists ` + where appropriate. +- Consider grouping simple steps within the same list item, e.g.: Go to {menuselection}`Website + --> Site --> Pages` and click {guilabel}`New`. +- Only use a period at the end of the list item if it forms a complete sentence. +::: + +```{eval-rst} +.. example:: + **Bulleted list** + + The following fields are available on the :guilabel:`Replenishment` report: + + - :guilabel:`Product`: the product that requires a replenishment + - :guilabel:`Location`: the specific location where the product is stored + - :guilabel:`Warehouse`: the warehouse where the product is stored + - :guilabel:`On Hand`: the amount of product currently available + + **Numbered list** + + 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`. +``` + +:::{seealso} +{ref}`RST cheat sheet: lists ` +::: + +## Icons + +Use {ref}`icons ` in instructions to help readers identify user interface +elements and reduce the need for lengthy explanations. Accompany every icon with a descriptor +in brackets. + +```{eval-rst} +.. example:: + Once the developer mode is activated, the developer tools can be accessed by clicking the + :icon:`fa-bug` (:guilabel:`bug`) icon. +``` + +:::{seealso} +{ref}`RST cheat sheet: icons ` +::: + +(contributing-content-images)= + +## Images + +Adding a few images to illustrate text helps the readers understand and memorize the content. +However, images should never replace text: written instructions should be complete and clear on +their own, without relying on visual aids. Use images sparingly, for example, to highlight a +particular point or clarify an example. + +:::{important} +Do not forget to [compress your PNG files with pngquant](https://pngquant.org). +::: + +(contributing-content-screenshots)= + +### Screenshots + +Screenshots are automatically resized to fit the content block's width. This implies that if they +are too wide, they are not readable on lower-resolution screens. We recommend avoiding full-screen +screenshots of the app unless absolutely necessary and making sure images are no wider than a range +of 768-933 pixels. + +Here are a few tips to improve your screenshots: + +1. **Resize** your browser's width, either by *resizing the window* itself or by opening the + *browser's developer tools* and resizing the width. +2. **Select** the relevant area rather than keeping the entire window. +3. **Remove** unnecessary information and **resize** columns when applicable. + +:::{important} +Do not use markups such as rectangles or arrows on screenshots. Instead, crop the image to +highlight the most relevant information, and ensure that text instructions are clear and +self-explanatory without relying on images. +::: + +```{eval-rst} +.. example:: + **Good example (resized browser, no unnecessary columns, adjusted columns' width, cropped):** + + .. image:: content_guidelines/quotations-list-reduced.png + :alt: Cropped screenshot + + **Bad example (full-width screenshot):** + + .. image:: content_guidelines/quotations-list-full.png + :alt: Full-width screenshot +``` + +(contributing-content-media-files)= + +### Media files + +A **media filename**: + +- is written in **lower-case letters**; +- is **relevant** to the media's content. (e.g., {file}`screenshot-tips.gif`); +- separates its words with a **hyphen** `-` (e.g., {file}`awesome-filename.png`). + +Each RST file has its own folder for storing media files. The folder's name must be the same as the +RST file's name. + +For example, the document {file}`doc_filename.rst` refers to two images that are placed in the +folder `doc_filename`. + +``` +├── section +│ └── doc_filename +│ │ └── screenshot-tips.gif +│ │ └── awesome-filename.png +│ └── doc_filename.rst +``` + +:::{note} +Previously, image filenames would mostly be named with numbers (e.g., {file}`feature01.png`) and +placed in a single {file}`media` folder. While it is advised not to name your *new* images in +that fashion, it is also essential **not to rename unchanged files**, as doing this would double +the weight of renamed image files on the repository. They will eventually all be replaced as the +content referencing those images is updated. +::: + +(contributing-content-alt-tags)= + +### ALT tags + +An **ALT tag** is a *text alternative* to an image. This text is displayed if the browser fails to +render the image. It is also helpful for users who are visually impaired. Finally, it helps +search engines, such as Google, to understand what the image is about and index it correctly, which +improves {abbr}`SEO (Search Engine Optimization)`. + +Good ALT tags are: + +- **Short** (one line maximum); +- **Not a repetition** of a previous sentence or title; +- A **good description** of the action happening in the image; +- Easily **understandable** if read aloud. + +```{eval-rst} +.. example:: + + An appropriate ALT tag for the following screenshot would be *Activating the developer mode in + the Settings app*. + + .. image:: content_guidelines/settings.png + :alt: Activating the developer mode in the Settings app +``` + +:::{seealso} +{ref}`RST cheat sheet: images ` +::: + diff --git a/content/contributing/documentation/rst_guidelines.md b/content/contributing/documentation/rst_guidelines.md new file mode 100644 index 000000000..6d7ce0bf2 --- /dev/null +++ b/content/contributing/documentation/rst_guidelines.md @@ -0,0 +1,1401 @@ +--- +custom-css: showcase_tables.css +--- + +# RST guidelines and cheat sheet + +:::{important} +We strongly recommend reading the {doc}`content_guidelines` and main {doc}`../documentation` +pages before contributing. +::: + +Follow the RST guidelines below when contributing to the documentation to help maintain consistency +with the rest of the documentation and facilitate the review process for the team: + +- {ref}`Use formatting. ` +- {ref}`Be consistent with indentation. ` +- {ref}`Start a new line before the 100th character. ` + +For hyperlinks: + +- {ref}`Use relative links for internal URLs. ` +- {ref}`Do not break hyperlink targets when refactoring. ` +- {ref}`Do not use non-descriptive hyperlink labels. ` + +(contributing-rst-formatting)= + +## Formatting + +Use specific formatting to improve clarity and readability. For example, apply +{ref}`contributing/rst/menuselection` for menu paths, {ref}`contributing/rst/guilabel` +for other user interface elements, such as fields, buttons, and options, {ref}`contributing/rst/note` +for notes, {ref}`contributing/rst/example` for examples, etc. + +:::{note} +Add a blank line between different block elements, such as paragraphs, lists, and directives to +ensure proper rendering and formatting. +::: + +(contributing-rst-hyperlinks-guidelines)= + +## Hyperlinks + +(contributing-rst-relative-links)= + +### Internal URLs: relative links + +If you need to reference an {ref}`internal documentation page ` +or a {ref}`file ` that is not located in the same directory as the current +page, always use *relative file paths* instead of *absolute file paths*. This ensures that links +remain valid even with version updates, folder name changes, and directory structure +reorganizations. + +An absolute file path indicates the target's location from the root directory. A relative file path +uses smart notations (such as `../` that redirects to the parent folder) to indicate the target's +location *relative* to that of the source document. + +```{eval-rst} +.. example:: + + .. note:: + The purpose of the following example is to illustrate the difference between absolute and + relative links. Always use :ref:`contributing/rst/doc-hyperlinks` when referencing + documentation pages. + + Given the following source file tree: + :: + + documentation + ├── content + │ └── applications + │ │ └── sales + │ │ │ └── sales + │ │ │ │ └── products_prices + │ │ │ │ │ └── products + │ │ │ │ │ │ └── import.rst + │ │ │ │ │ │ └── variants.rst + │ │ │ │ │ └── prices.rst + + A reference to :file:`prices.rst` and :file:`variants.rst` could be made from :file:`import.rst` + as follows: + + #. Absolute: + + - `documentation/content/applications/sales/sales/products_prices/prices.rst` + - `documentation/content/applications/sales/sales/products_prices/products/variants.rst` + + #. Relative: + + - `../prices.rst` + - `variants.rst` +``` + +(contributing-rst-update-targets)= + +### Refactoring: hyperlink targets + +When refactoring (improving without adding new content) section headings or hyperlink targets, take +care not to break any hyperlink reference to these targets or update them accordingly. + +(contributing-rst-descriptive-labels)= + +### Hyperlink labels + +Do not use non-descriptive labels for {ref}`hyperlinks `. + +```{eval-rst} +.. example:: + + | **Good example (descriptive label):** + | Please refer to the :doc:`Accounting documentation <../../../applications/finance/accounting>`. + + | **Bad example (non-descriptive label):** + | Please refer to :doc:`this page <../../../applications/finance/accounting>`. +``` + +(contributing-rst-indentation)= + +## Indentation + +Use only spaces (never tabs). + +Use as many spaces at the beginning of an indented line as needed to align it with the first +character of the markup in the line above. This usually implies three spaces, but you only need two +for bulleted lists, for example. + +```{eval-rst} +.. example:: + The first `:` is below the `i` (three spaces): + + .. code-block:: rst + + .. image:: media/example.png + :alt: example + + The `:titlesonly:` and page references start below the `t` (three spaces): + + .. code-block:: rst + + .. toctree:: + :titlesonly: + + payables/supplier_bills + payables/pay + + Continuation lines resume below the `I`’s of "Invoice" (two spaces): + + .. code-block:: rst + + - Invoice on ordered quantity: invoice the full order as soon as the sales order is confirmed. + - Invoice on delivered quantity: invoice on what was delivered even if it is a partial + delivery. +``` + +(contributing-rst-character-limit)= + +## 100th-character limit + +In RST, it is possible to break a line without forcing a line break on the rendered HTML. Make use +of this feature to write **lines of maximum 100 characters**. It is not necessary to leave a +trailing whitespace at the end of a line to separate words. + +:::{tip} +- You can safely break a line on any space, even inside markups such as `menuselection` and + `doc`. +- Some external hyperlinks may exceed 100 characters, but leaving them on a single line is + acceptable. +::: + +```{eval-rst} +.. example:: + + .. code-block:: rst + + To register your seller account in Odoo, go to :menuselection:`Sales --> Configuration --> + Settings --> Amazon Connector --> Amazon Accounts` and click :guilabel:`Create`. You can find + the **Seller ID** under the link :guilabel:`Your Merchant Token`. +``` + +(contributing-rst-headings)= + +## Headings + +For each formatting line (e.g., `===`), write as many symbols (`=`) as there are characters in the +header. + +The symbols used for the formatting are, in fact, not important. Only the order in which they are +written matters, as it determines the size of the decorated heading. This means that you may +encounter different heading formatting and in a different order, in which case you should follow the +formatting in place in the document. In any other case, use the formatting shown below. + +| Heading size | Formatting | +| ------------ | ---------- | +| H1 | ```text +======= Heading ======= ``` | +| H2 | ```text +Heading ======= ``` | +| H3 | ```text +Heading ------- ``` | +| H4 | ```text +Heading ~~~~~~~ ``` | +| H5 | ```text +Heading ******* ``` | +| H6 | ```text +Heading ^^^^^^^ ``` | + +:::{important} +Each document must have **exactly one H1 heading**. +::: + +(contributing-rst-markups)= + +## Markups + +(contributing-rst-italic)= + +### Emphasis (italic) + +To emphasize a part of the text. The text is rendered in italic. + +```{eval-rst} +.. list-table:: + :class: o-showcase-table + + * - Fill out the information *before* saving the form. + + * - .. code-block:: text + + Fill out the information *before* saving the form. +``` + +(contributing-rst-bold)= + +### Strong emphasis (bold) + +To emphasize a part of the text. The text is rendered in bold. + +```{eval-rst} +.. list-table:: + :class: o-showcase-table + + * - A **subdomain** is a domain that is a part of another domain. + + * - .. code-block:: text + + A **subdomain** is a domain that is a part of another domain. +``` + +(contributing-rst-code-sample)= + +### Technical term (literal) + +To write a technical term or a specific value to insert. The text is rendered in literal. + +```{eval-rst} +.. list-table:: + :class: o-showcase-table + + * - Insert the IP address of your printer, for example, `192.168.1.25`. + + * - .. code-block:: text + + Insert the IP address of your printer, for example, `192.168.1.25`. +``` + +(contributing-rst-definitions)= + +### Definitions + +Use the `dfn` markup to define a term. + +```{eval-rst} +.. list-table:: + :class: o-showcase-table + + * - The documentation is written in RST and needs to be built (:dfn:`converted to HTML`) to + display nicely. + + * - .. code-block:: text + + The documentation is written in RST and needs to be built (:dfn:`converted to HTML`) to + display nicely. +``` + +(contributing-rst-abbreviations)= + +### Abbreviations + +Use the `abbr` markup to write a self-defining abbreviation that is displayed as a tooltip. + +```{eval-rst} +.. list-table:: + :class: o-showcase-table + + * - Odoo uses :abbr:`OCR (optical character recognition)` and artificial intelligence + technologies to recognize the content of the documents. + + * - .. code-block:: text + + Odoo uses :abbr:`OCR (optical character recognition)` and artificial intelligence + technologies to recognize the content of the documents. +``` + +(contributing-rst-guilabel)= + +### {abbr}`GUI (graphical user interface)` element + +Use the `guilabel` markup to identify any text of the interactive user interface (e.g., labels). + +```{eval-rst} +.. list-table:: + :class: o-showcase-table + + * - Update your credentials, then click on :guilabel:`Save`. + + * - .. code-block:: text + + Update your credentials, then click on :guilabel:`Save`. +``` + +:::{note} +Avoid using the `guilabel` markup when referring to a concept or general term. + +```{eval-rst} +.. example:: + - | **Good example:** + | To create a credit note, go to :menuselection:`Accounting --> Customers --> Invoices`, + open the invoice, and click :guilabel:`Credit Note`. + - | **Bad example:** + | To create a :guilabel:`Credit Note`, go to :menuselection:`Accounting --> Customers --> + Invoices`, open the :guilabel:`Invoice`, and click :guilabel:`Credit Note`. +``` +::: + +(contributing-rst-menuselection)= + +### Menu selection + +Use the `menuselection` markup to guide users through a sequence of menus, starting with the app's +name. + +```{eval-rst} +.. list-table:: + :class: o-showcase-table + + * - To review sales performance, go to :menuselection:`Sales --> Reporting --> Dashboard`. + + * - .. code-block:: text + + To review sales performance, go to :menuselection:`Sales --> Reporting --> Dashboard`. +``` + +:::{note} +Only include actual menu items in the `menuselection` markup: + +- Use the {ref}`contributing/rst/guilabel` markup for other user interface elements, such as + buttons and section titles: + + ```text + To configure the bill control policy, navigate to :menuselection:`Purchase --> Configuration + --> Settings`, and scroll down to the :guilabel:`Invoicing` section. Under :guilabel:`Bill + Control`, select either :guilabel:`Ordered quantities` or :guilabel:`Received quantities`. + ``` + +- Do not include menu section names. For example, in the screenshot below, `Journals` should not + be included in the menu path {menuselection}`Accounting --> Accounting --> Journal Entries`: + + ```{image} rst_guidelines/accounting-menu.png + :alt: Accounting menu showing the Journals menu section. + ``` +::: + +(contributing-rst-file)= + +### File + +Use the `file` markup to indicate a file path or name. + +```{eval-rst} +.. list-table:: + :class: o-showcase-table + + * - Create redirections using the :file:`redirects.txt` file found at the root of the repository. + + * - .. code-block:: text + + Create redirections using the :file:`redirects.txt` file found at the root of the + repository. +``` + +(contributing-rst-command)= + +### Command + +Use the `command` markup to highlight a command. + +```{eval-rst} +.. list-table:: + :class: o-showcase-table + + * - Run the command :command:`make clean html` to delete existing built files and build the + documentation to HTML. + + * - .. code-block:: text + + Run the command :command:`make clean html` to delete existing built files and build the + documentation to HTML. +``` + +(contributing-rst-icons)= + +### Icons + +Use the `icon` markup to add the class name of an icon. There are two icon sets used in Odoo: +[FontAwesome4](https://fontawesome.com/v4/icons/) and {doc}`Odoo UI +`. Follow the icon with its name as a +{ref}`contributing/rst/guilabel` in brackets as a descriptor. + +```{eval-rst} +.. list-table:: + :class: o-showcase-table + + * - The graph view is represented by the :icon:`fa-area-chart` :guilabel:`(area chart)` icon. The + pivot view is represented by the :icon:`oi-view-pivot` icon. + + * - .. code-block:: text + + The graph view is represented by the :icon:`fa-area-chart` :guilabel:`(area chart)` icon. + The pivot view is represented by the :icon:`oi-view-pivot` icon. +``` + +(contributing-rst-lists)= + +## Lists + +(contributing-rst-bulleted-list)= + +### Bulleted list + +```{eval-rst} +.. list-table:: + :class: o-showcase-table + + * - - This is a bulleted list. + - It has two items, the second + item uses two lines. + + * - .. code-block:: text + + - This is a bulleted list. + - It has two items, the second + item uses two lines. +``` + +(contributing-rst-numbered-list)= + +### Numbered list + +```{eval-rst} +.. list-table:: + :class: o-showcase-table + + * - #. This is a numbered list. + #. Numbering is automatic. + + * - .. code-block:: text + + #. This is a numbered list. + #. Numbering is automatic. +``` + +```{eval-rst} +.. list-table:: + :class: o-showcase-table + + * - 6. Use this format to start the numbering + with a number other than one. + #. The numbering is automatic from there. + + * - .. code-block:: text + + 6. Use this format to start the numbering + with a number other than one. + #. The numbering is automatic from there. +``` + +:::{tip} +Prefer the use of autonumbered lists with `#.` instead of `1.`, `2.`, etc. for better code +resilience. +::: + +(contributing-rst-nested-list)= + +### Nested lists + +:::{tip} +- Add a blank line before the nested elements in lists. +- {ref}`Indent ` nested lists properly, with sub-items aligned + under their parent item. +::: + +```{eval-rst} +.. list-table:: + :class: o-showcase-table + + * - - This is the first item of a bulleted list. + + #. It has a nested numbered list + #. with two items. + + * - .. code-block:: text + + - This is the first item of a bulleted list. + + #. It has a nested numbered list + #. with two items. +``` + +(contributing-rst-hyperlinks)= + +## Hyperlinks + +(contributing-rst-external-hyperlinks)= + +### External hyperlinks + +External hyperlinks are links to a URL with a custom label. They follow the syntax: +`` `label `_ ``. + +:::{note} +- Use {ref}`documentation page hyperlinks ` when targeting + another documentation page. +- Do not use {ref}`non-descriptive hyperlink labels `. +::: + +```{eval-rst} +.. list-table:: + :class: o-showcase-table + + * - For instance, `this is an external hyperlink to Odoo's website `_. + + * - .. code-block:: text + + For instance, `this is an external hyperlink to Odoo's website `_. +``` + +(contributing-rst-external-hyperlink-aliases)= + +### External hyperlink aliases + +External hyperlink aliases allow creating shortcuts for external hyperlinks. The definition syntax +is as follows: `.. _target: URL`. There are two ways to reference them, depending on the use case: + +1. `target_` creates a hyperlink with the target name as label and the URL as reference. Note that + the `_` moved after the target. +2. `` `label `_ `` the label replaces the name of the target, and the target is replaced by + the URL. + +```{eval-rst} +.. list-table:: + :class: o-showcase-table + + * - A `proof-of-concept `_ is a simplified + version, a prototype of what is expected to agree on the main lines of expected changes. `PoC + `_ is a common abbreviation. + + * - .. code-block:: text + + .. _proof-of-concept: https://en.wikipedia.org/wiki/Proof_of_concept + + A proof-of-concept_ is a simplified version, a prototype of what is expected to agree on + the main lines of expected changes. `PoC `_ is a common abbreviation. +``` + +(contributing-rst-custom-anchors)= + +### Custom anchors + +Custom anchors follow the same syntax as external hyperlink aliases but without any URL. They allow +referencing a specific part of a RST file by using the target as an anchor. When users click the +reference, they are taken to the part of the documentation page where the target is defined. + +The definition syntax is: `.. _target:`. There are two ways to reference them, both using the `ref` +markup: + +1. `` :ref:`target` `` creates a hyperlink to the anchor with the heading defined below as label. +2. `` :ref:`label ` `` creates a hyperlink to the anchor with the given label. + +:::{important} +As targets are visible from the entire documentation when referenced with the `ref` markup, +prefix the target name with the **app/section name** and the **file name**, separated by slashes, +e.g., `accounting/taxes/configuration`. +::: + +:::{note} +- Add custom anchors for all headings so they can be referenced from any documentation file or + within Odoo using documentation links. +- Notice that there is no `_` at the end, contrary to what is done with {ref}`external hyperlinks + `. +::: + +```{eval-rst} +.. list-table:: + :class: o-showcase-table + + * - Please refer to the :ref:`contributing/rst/hyperlinks-guidelines` section to learn more + about :ref:`relative links `. + + * - .. code-block:: text + + .. _contributing/rst/hyperlinks-guidelines: + + Hyperlinks + ========== + + .. _contributing/rst/relative-links: + + Use relative links for internal URLs + ------------------------------------ + + Please refer to the :ref:`` section to learn more + about :ref:`relative links `. +``` + +(contributing-rst-doc-hyperlinks)= + +### Documentation page hyperlinks + +The `doc` markup allows referencing a documentation page wherever it is in the file tree through a +relative file path. There are two ways to use the markup, both using the `doc` markup: + +1. `` :doc:`path_to_doc_page` `` creates a hyperlink to the documentation page with the title of the + page as label. +2. `` :doc:`label ` `` creates a hyperlink to the documentation page with the given + label. + +```{eval-rst} +.. list-table:: + :class: o-showcase-table + + * - Please refer to the :doc:`Accounting documentation + <../../../applications/finance/accounting>` to learn more about + :doc:`../../../applications/finance/accounting/customer_invoices`. + + * - .. code-block:: text + + Please refer to the :doc:`Accounting documentation <../../../applications/finance/accounting>` + to learn more about :doc:`../../../applications/finance/accounting/customer_invoices`. +``` + +:::{important} +{ref}`Use relative links ` for documentation page hyperlinks. +::: + +(contributing-rst-download)= + +### File download hyperlinks + +The `download` markup allows referencing files (that are not necessarily {abbr}`RST +(reStructuredText)` documents) within the source tree to be downloaded. + +```{eval-rst} +.. list-table:: + :class: o-showcase-table + + * - Download this :download:`module structure template ` to start + building your module. + + * - .. code-block:: text + + Download this :download:`module structure template ` to start building your module. +``` + +:::{note} +Store the file alongside other {ref}`media files ` and +reference it using a {ref}`relative link `. +::: + +(contributing-rst-images)= + +## Images + +The `image` markup allows inserting images in a document. + +```{eval-rst} +.. list-table:: + :class: o-showcase-table + + * - .. image:: rst_guidelines/create-invoice.png + :alt: Create an invoice. + + * - .. code-block:: text + + .. image:: rst_guidelines/create-invoice.png + :alt: Create an invoice. +``` + +:::{tip} +- Images should generally be aligned to the left, which is the default behavior. Use the `align` + parameter to change the alignment, e.g., `:align: center`. +- Use the `alt` parameter to add {ref}`contributing/content/alt-tags`, e.g., `:alt: Activating + the developer mode in the Settings app`. +- Use the `scale` parameter to scale the image, e.g., `:scale: 75%`. +::: + +:::{seealso} +{ref}`Content guidelines for images ` +::: + +(contributing-rst-alert-blocks)= + +## Alert blocks (admonitions) + +(contributing-rst-seealso)= + +### See also + +```{eval-rst} +.. list-table:: + :class: o-showcase-table + + * - .. seealso:: + - :doc:`Accounting documentation <../../../applications/finance/accounting>` + - :doc:`../../../applications/sales/sales/invoicing/proforma` + - `Google documentation on setting up Analytics for a website + `_ + + * - .. code-block:: text + + .. seealso:: + - :doc:`Accounting documentation <../../../applications/finance/accounting>` + - :doc:`../../../applications/sales/sales/invoicing/proforma` + - `Google documentation on setting up Analytics for a website `_ +``` + +(contributing-rst-note)= + +### Note + +```{eval-rst} +.. list-table:: + :class: o-showcase-table + + * - .. note:: + Use this alert block to draw the reader's attention and highlight important additional + information. + + * - .. code-block:: text + + .. note:: + Use this alert block to draw the reader's attention and highlight important additional information. +``` + +(contributing-rst-tip)= + +### Tip + +```{eval-rst} +.. list-table:: + :class: o-showcase-table + + * - .. tip:: + Use this alert block to inform the reader about a useful trick that requires an action. + + * - .. code-block:: text + + .. tip:: + Use this alert block to inform the reader about a useful trick that requires an action. +``` + +(contributing-rst-example)= + +### Example + +```{eval-rst} +.. list-table:: + :class: o-showcase-table + + * - .. example:: + Use this alert block to show an example. + + * - .. code-block:: text + + .. example:: + Use this alert block to show an example. +``` + +(contributing-rst-exercise)= + +### Exercise + +```{eval-rst} +.. list-table:: + :class: o-showcase-table + + * - .. exercise:: + Use this alert block to suggest an exercise to the reader. + + * - .. code-block:: text + + .. exercise:: + Use this alert block to suggest an exercise to the reader. +``` + +(contributing-rst-important)= + +### Important + +```{eval-rst} +.. list-table:: + :class: o-showcase-table + + * - .. important:: + Use this alert block to notify the reader about important information. + + * - .. code-block:: text + + .. important:: + Use this alert block to notify the reader about important information. +``` + +(contributing-rst-warning)= + +### Warning + +```{eval-rst} +.. list-table:: + :class: o-showcase-table + + * - .. warning:: + Use this alert block to require the reader to proceed with caution with what is described + in the warning. + + * - .. code-block:: text + + .. warning:: + Use this alert block to require the reader to proceed with caution with what is described in the warning. +``` + +(contributing-rst-danger)= + +### Danger + +```{eval-rst} +.. list-table:: + :class: o-showcase-table + + * - .. danger:: + Use this alert block to bring the reader's attention to a serious threat. + + * - .. code-block:: text + + .. danger:: + Use this alert block to bring the reader's attention to a serious threat. +``` + +(contributing-rst-custom-alert-blocks)= + +### Custom + +```{eval-rst} +.. list-table:: + :class: o-showcase-table + + * - .. admonition:: Title + + Customize this alert block with a **Title** of your choice. + + * - .. code-block:: text + + .. admonition:: Title + + Customize this alert block with a **Title** of your choice. +``` + +(contributing-rst-tables)= + +## Tables + +### List tables + +List tables use two-level bulleted lists to convert data into a table. The first level represents +the rows and the second level represents the columns. + +```{eval-rst} +.. list-table:: + :class: o-showcase-table + + * - .. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - Name + - Country + - Favorite color + * - Raúl + - Montenegro + - Purple + * - Mélanie + - France + - Red + + * - .. code-block:: text + + .. list-table:: + :header-rows: 1 + :stub-columns: 1 + + * - Name + - Country + - Favorite colour + * - Raúl + - Montenegro + - Purple + * - Mélanie + - France + - Turquoise +``` + +### Grid tables + +Grid tables represent the rendered table and are more visual to work with. + +```{eval-rst} +.. list-table:: + :class: o-showcase-table + + * - +-----------------------+--------------+---------------+ + | | Shirts | T-shirts | + +=======================+==============+===============+ + | **Available colours** | Purple | Green | + | +--------------+---------------+ + | | Turquoise | Orange | + +-----------------------+--------------+---------------+ + | **Sleeves length** | Long sleeves | Short sleeves | + +-----------------------+--------------+---------------+ + + * - .. code-block:: text + + +-----------------------+--------------+---------------+ + | | Shirts | T-shirts | + +=======================+==============+===============+ + | **Available colours** | Purple | Green | + | +--------------+---------------+ + | | Turquoise | Orange | + +-----------------------+--------------+---------------+ + | **Sleeves length** | Long sleeves | Short sleeves | + +-----------------------+--------------+---------------+ +``` + +:::{tip} +- Use `=` instead of `-` to define header rows. +- Remove `-` and `|` separators to merge cells. +- Make use of [this convenient table generator](https://www.tablesgenerator.com/text_tables) to + build tables. Then, copy-paste the generated formatting into your document. +::: + +(contributing-rst-code-blocks)= + +## Code blocks + +Use the `code-block` directive to show example code. Specify the language (e.g., python, xml, etc.) +to format the code according to the language's syntax rules. + +```{eval-rst} +.. list-table:: + :class: o-showcase-table + + * - .. code-block:: python + + def main(): + print("Hello world!") + + * - .. code-block:: text + + .. code-block:: python + + def main(): + print("Hello world!") +``` + +(contributing-rst-spoilers)= + +## Spoilers + +```{eval-rst} +.. list-table:: + :class: o-showcase-table + + * - .. spoiler:: Answer to the Ultimate Question of Life, the Universe, and Everything + + **42** + + * - .. code-block:: text + + .. spoiler:: Answer to the Ultimate Question of Life, the Universe, and Everything + + **42** +``` + +(contributing-rst-tabs)= + +## Content tabs + +:::{warning} +The `tabs` markup may not work well in some situations. In particular: + +- The tabs' headers cannot be translated. +- A tab cannot contain {ref}`headings `. +- An {ref}`alert block ` cannot contain tabs. +- A tab cannot contain {ref}`custom anchors `. +::: + +(contributing-rst-basic-tabs)= + +### Basic tabs + +Basic tabs are useful to split the content into multiple options. The `tabs` markup is used to +define sequence of tabs. Each tab is then defined with the `tab` markup followed by a label. + +```{eval-rst} +.. list-table:: + :class: o-showcase-table + + * - .. tabs:: + + .. tab:: Odoo Online + + Content dedicated to Odoo Online users. + + .. tab:: Odoo.sh + + Alternative for Odoo.sh users. + + .. tab:: On-premise + + Third version for On-premise users. + + * - .. code-block:: text + + .. tabs:: + + .. tab:: Odoo Online + + Content dedicated to Odoo Online users. + + .. tab:: Odoo.sh + + Alternative for Odoo.sh users. + + .. tab:: On-premise + + Third version for On-premise users. +``` + +(contributing-rst-nested-tabs)= + +### Nested tabs + +Tabs can be nested inside one another. + +```{eval-rst} +.. list-table:: + :class: o-showcase-table + + * - .. tabs:: + + .. tab:: Stars + + .. tabs:: + + .. tab:: The Sun + + The closest star to us. + + .. tab:: Proxima Centauri + + The second closest star to us. + + .. tab:: Polaris + + The North Star. + + .. tab:: Moons + + .. tabs:: + + .. tab:: The Moon + + Orbits the Earth. + + .. tab:: Titan + + Orbits Jupiter. + + * - .. code-block:: text + + .. tabs:: + + .. tab:: Stars + + .. tabs:: + + .. tab:: The Sun + + The closest star to us. + + .. tab:: Proxima Centauri + + The second closest star to us. + + .. tab:: Polaris + + The North Star. + + .. tab:: Moons + + .. tabs:: + + .. tab:: The Moon + + Orbits the Earth. + + .. tab:: Titan + + Orbits Jupiter. +``` + +(contributing-rst-group-tabs)= + +### Group tabs + +Group tabs are special tabs that synchronize based on a group label. The last selected group is +remembered and automatically selected when the user returns to the page or visits another page with +the tabs group. The `group-tab` markup is used to define group tabs. + +```{eval-rst} +.. list-table:: + :class: o-showcase-table + + * - .. tabs:: + + .. group-tab:: C++ + + C++ + + .. group-tab:: Python + + Python + + .. group-tab:: Java + + Java + + .. tabs:: + + .. group-tab:: C++ + + .. code-block:: c++ + + int main(const int argc, const char **argv) { + return 0; + } + + .. group-tab:: Python + + .. code-block:: python + + def main(): + return + + .. group-tab:: Java + + .. code-block:: java + + class Main { + public static void main(String[] args) {} + } + + * - .. code-block:: text + + .. tabs:: + + .. group-tab:: C++ + + C++ + + .. group-tab:: Python + + Python + + .. group-tab:: Java + + Java + + .. tabs:: + + .. group-tab:: C++ + + .. code-block:: c++ + + int main(const int argc, const char **argv) { + return 0; + } + + .. group-tab:: Python + + .. code-block:: python + + def main(): + return + + .. group-tab:: Java + + .. code-block:: java + + class Main { + public static void main(String[] args) {} + } +``` + +(contributing-rst-code)= + +### Code tabs + +Use the `code-tab` markup to create code tabs, which are essentially {ref}`group tabs +` that treat the tabs' content as a {ref}`code block +`. Specify the language to format the code according to the language's +syntax rules. If a label is set, it is used for grouping tabs instead of the language name. + +```{eval-rst} +.. list-table:: + :class: o-showcase-table + + * - .. tabs:: + + .. code-tab:: c++ Hello C++ + + #include + + int main() { + std::cout << "Hello World"; + return 0; + } + + .. code-tab:: python Hello Python + + print("Hello World") + + .. code-tab:: javascript Hello JavaScript + + console.log("Hello World"); + + * - .. code-block:: text + + .. tabs:: + + .. code-tab:: c++ Hello C++ + + #include + + int main() { + std::cout << "Hello World"; + return 0; + } + + .. code-tab:: python Hello Python + + print("Hello World") + + .. code-tab:: javascript Hello JavaScript + + console.log("Hello World"); +``` + +(contributing-rst-cards)= + +## Cards + +```{eval-rst} +.. list-table:: + :class: o-showcase-table + + * - .. cards:: + + .. card:: Documentation + :target: ../documentation + :tag: Step-by-step guide + :large: + + Use this guide to acquire the tools and knowledge you need to write documentation. + + .. card:: Content guidelines + :target: content_guidelines + + List of guidelines, tips, and tricks to help you create clear and effective content. + + .. card:: RST guidelines + :target: rst_guidelines + + List of technical guidelines to observe when writing with reStructuredText. + + * - .. code-block:: text + + .. cards:: + + .. card:: Documentation + :target: ../documentation + :tag: Step-by-step guide + :large: + + Use this guide to acquire the tools and knowledge you need to write documentation. + + .. card:: Content guidelines + :target: content_guidelines + + List of guidelines, tips, and tricks to help you create clear and effective content. + + .. card:: RST guidelines + :target: rst_guidelines + + List of technical guidelines to observe when writing with reStructuredText. +``` + +(contributing-rst-document-metadata)= + +## Document metadata + +[Sphinx]() supports document-wide +metadata markups that specify a behavior for the entire page. They must be placed between colons +(`:`) at the top of the source file. + +```{eval-rst} ++-----------------+--------------------------------------------------------------------------------+ +| **Metadata** | **Purpose** | ++-----------------+--------------------------------------------------------------------------------+ +| `show-content` | Make a toctree page accessible from the navigation menu. | ++-----------------+--------------------------------------------------------------------------------+ +| `show-toc` | Show the table of content on a page that has the `show-content` metadata | +| | markup. | ++-----------------+--------------------------------------------------------------------------------+ +| `hide-page-toc` | Hide the "On this page" sidebar and use full page width for the content. | ++-----------------+--------------------------------------------------------------------------------+ +| `nosearch` | Exclude the document from search results. | ++-----------------+--------------------------------------------------------------------------------+ +| `orphan` | Suppress the need to include the document in a toctree. | ++-----------------+--------------------------------------------------------------------------------+ +| `code-column` | | Show a dynamic side column that can be used to display interactive | +| | tutorials or code excerpts. | +| | | For example, see | +| | :doc:`/applications/finance/accounting/get_started/cheat_sheet`. | ++-----------------+--------------------------------------------------------------------------------+ +| `custom-css` | Link CSS files (comma-separated) to the file. | ++-----------------+--------------------------------------------------------------------------------+ +| `custom-js` | Link JS files (comma-separated) to the document. | ++-----------------+--------------------------------------------------------------------------------+ +| `classes` | Assign the specified classes to the `
` element of the file. | ++-----------------+--------------------------------------------------------------------------------+ +``` + +(contributing-rst-formatting-tips)= + +## Formatting tips + +(contributing-rst-line-break)= + +### Break the line but not the paragraph + +```{eval-rst} +.. list-table:: + :class: o-showcase-table + + * - | A first long line that you break in two + -> here <- is rendered as a single line. + | A second line that follows a line break. + + * - .. code-block:: text + + | A first long line that you break in two + -> here <- is rendered as a single line. + | A second line that follows a line break. +``` + +(contributing-rst-escaping)= + +### Escape markup symbols + +Markup symbols escaped with backslashes (`\`) are rendered normally. For instance, `this +\*\*line of text\*\* with \*markup\* symbols` is rendered as “this \*\*line of text\*\* with +\*markup\* symbols”. + +When it comes to backticks (`` ` ``), which are used in many cases such as {ref}`external hyperlinks +`, using backslashes for escaping is no longer +an option because the outer backticks interpret enclosed backslashes and thus prevent them from +escaping inner backticks. For instance, ``` `\`this formatting\`` ``` produces an +`[UNKNOWN NODE title_reference]` error. Instead, ```` ```this formatting``` ```` should be used to +produce the following result: `` `this formatting` ``. + +:::{seealso} +[Docutils documentation on reStructuredText directives and roles](https://docutils.sourceforge.io/docs/ref/rst/directives.html) +::: + diff --git a/content/contributing/install_git.md b/content/contributing/install_git.md new file mode 100644 index 000000000..8f824d5ce --- /dev/null +++ b/content/contributing/install_git.md @@ -0,0 +1,23 @@ +[Install Git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git). It is a command-line +({dfn}`a text interface`) tool that allows tracking the history of changes made to a file and, more +importantly, working on different versions of that file simultaneously. It means you do not need to +worry about overwriting someone else’s pending work when making changes. + +Verify that the installation directory of Git is included in your system's `PATH` variable. + +```{eval-rst} +.. tabs:: + + .. group-tab:: Linux and macOS + + Follow the `guide to update the PATH variable on Linux and macOS + `_ with the installation path of Git (by default + :file:`/usr/bin/git`). + + .. group-tab:: Windows + + Follow the `guide to update the PATH variable on Windows + `_ + with the installation path of Git (by default :file:`C:\\Program Files\\Git`). +``` + diff --git a/content/developer.md b/content/developer.md new file mode 100644 index 000000000..e0eb4299f --- /dev/null +++ b/content/developer.md @@ -0,0 +1,52 @@ +--- +hide-page-toc: true +show-content: true +--- + +# Developer + +```{toctree} +developer/tutorials +developer/howtos +developer/reference +``` + +Welcome to the developer documentation of Odoo! Whether you're a seasoned developer or just getting +started, you'll find here all the technical guidance and resources you need for developing Odoo +applications. Explore our extensive collection of tutorials, how-to guides, and reference materials +to achieve your development goals. + +The Odoo development ecosystem is built on a modular and extensible architecture that allows you +to extend existing applications or create new ones to meet the specific needs of modern businesses. +You can make use of the tools and frameworks provided by Odoo to focus on getting your web +application up and running quickly, without needing to reinvent the wheel and worry about the +underlying infrastructure. + +If you are new to Odoo or web application development, start with the +{doc}`developer/tutorials/server_framework_101` tutorial. + +```{eval-rst} +.. cards:: + + .. card:: Tutorials + :target: developer/tutorials + + Tutorials take you by the hand through hands-on exercises to build skills and familiarity in + Odoo development. + + .. card:: How-to guides + :target: developer/howtos + + Recipes that provide a step-by-step guide for addressing real-world problems and use-cases. + + .. card:: Reference + :target: developer/reference + + Technical descriptions and factual information on the frameworks and APIs of Odoo. +``` + +:::{seealso} +- {doc}`Guide: Contribute to the codebase ` +- [Community forums](https://www.odoo.com/forum) +::: + diff --git a/content/developer/glossary.md b/content/developer/glossary.md new file mode 100644 index 000000000..fbc1f7f1c --- /dev/null +++ b/content/developer/glossary.md @@ -0,0 +1,48 @@ +--- +orphan: 'true' +--- + +# Glossary + +:::{glossary} +external id +external identifier +external identifiers + +> string identifier stored in `ir.model.data`, can be used to refer +> to a record regardless of its database identifier during data imports +> or export/import roundtrips. +> +> External identifiers are in the form {samp}`{module}.{id}` (e.g. +> `account.invoice_graph`). From within a module, the +> {samp}`{module}.` prefix can be left out. +> +> Sometimes referred to as "xml id" or `xml_id` as XML-based +> {ref}`reference/data` make extensive use of them. + +format string + +: inspired by [jinja variables], format strings allow more easily + mixing literal content and computed content (expressions): content + between `{{` and `}}` is interpreted as an expression and + evaluated, other content is interpreted as literal strings and + displayed as-is + +GIS +Geographic Information System + +> any computer system or subsystem to capture, store, manipulate, +> analyze, manage or present spatial and geographical data. + +minified +minification + +> process of removing extraneous/non-necessary sections of files +> (comments, whitespace) and possibly recompiling them using equivalent +> but shorter structures ([ternary operator] instead of `if/else`) in +> order to reduce network traffic +::: + +[jinja variables]: http://jinja.pocoo.org/docs/dev/templates/#variables +[ternary operator]: http://en.wikipedia.org/wiki/%3F: + diff --git a/content/developer/howtos.md b/content/developer/howtos.md new file mode 100644 index 000000000..6d229a04e --- /dev/null +++ b/content/developer/howtos.md @@ -0,0 +1,117 @@ +--- +hide-page-toc: true +show-content: true +--- + +# How-to guides + +```{toctree} +howtos/scss_tips +howtos/javascript_field +howtos/javascript_view +howtos/javascript_client_action +howtos/standalone_owl_application +howtos/frontend_owl_components +howtos/website_themes + +howtos/web_services +howtos/company +howtos/create_reports +howtos/accounting_localization +howtos/translations +howtos/connect_device + +howtos/upgrade_custom_db +``` + +## Frontend development + +```{eval-rst} +.. cards:: + + .. card:: Write lean easy-to-maintain CSS + :target: howtos/scss_tips + + Follow this guide to keep the technical debt of your CSS code under control. + + .. card:: Customize a field + :target: howtos/javascript_field + + Learn how to customize field components in the web framework. + + .. card:: Customize a view type + :target: howtos/javascript_view + + Learn how to customize view types in the web framework. + + .. card:: Create a client action + :target: howtos/javascript_client_action + + Learn how to create client actions in the web framework. + + .. card:: Create a standalone Owl application + :target: howtos/standalone_owl_application + + Learn how to create a public-facing Owl application outside of the web client using a + controller and the web framework. + + .. card:: Use Owl components on the portal and website + :target: howtos/frontend_owl_components + + Learn how to use Owl components on the portal and website. + + .. card:: Website themes + :target: howtos/website_themes + + Learn how to customize your website by creating a custom theme. +``` + +## Server-side development + +```{eval-rst} +.. cards:: + + .. card:: Web services + :target: howtos/web_services + + Learn more about Odoo's web services. + + .. card:: Multi-company guidelines + :target: howtos/company + + Learn how to manage multiple companies and deal with the records-related specificities of a + multi-company environment. + + .. card:: Create customized reports + :target: howtos/create_reports + + Learn how to create customized reports with SQL Views. + + .. card:: Accounting localization + :target: howtos/accounting_localization + + Learn how to build a localization module, create bank operation models and dynamic reports. + + .. card:: Translating modules + :target: howtos/translations + + Learn how to provide translation abilities to your module. + + .. card:: Connect with a device + :target: howtos/connect_device + + Learn how to enable a module to detect and communicate with an IoT device. +``` + +## Custom development + +```{eval-rst} +.. cards:: + + .. card:: Upgrade a customized database + :target: howtos/upgrade_custom_db + + Learn how to upgrade a customized database, as well as the code and data of its custom + modules. +``` + diff --git a/content/developer/howtos/accounting_localization.md b/content/developer/howtos/accounting_localization.md new file mode 100644 index 000000000..573ecb6cf --- /dev/null +++ b/content/developer/howtos/accounting_localization.md @@ -0,0 +1,325 @@ +# Accounting localization + +:::{warning} +This tutorial requires knowledge about how to build a module in Odoo (see +{doc}`../tutorials/server_framework_101`). +::: + +## Installation procedure + +On installing the [account]({GITHUB_PATH}/addons/account) module, the localization module corresponding to the country code of the company is installed automatically. +In case of no country code set or no localization module found, the [l10n_generic_coa]({GITHUB_PATH}/addons/l10n_generic_coa) (US) localization module is installed by default. +Check [post init hook]({GITHUB_PATH}/addons/account/__init__.py) for details. + +For example, [l10n_ch]({GITHUB_PATH}/addons/l10n_ch) will be installed if the company has `Switzerland` as country. + +## Building a localization module + +The structure of a basic `l10n_XX` module may be described with the following {file}`__manifest__.py` file: + +```python +{ + "name": "COUNTRY - Accounting", + "version": "1.0.0", + "category": "Accounting/Localizations/Account Charts", + "license": "LGPL-3", + "depends": [ + "account", + ], + "data": [ + "data/other_data.xml", + "views/xxxmodel_views.xml", + ], + "demo": [ + "demo/demo_company.xml", + ] +} +``` + +Your worktree should look like this + +```bash +l10n_xx +├── data +│ ├── template +│ │ ├── account.account-xx.csv +│ │ ├── account.group-xx.csv +│ │ └── account.tax.group-xx.csv +│ └── other_data.xml +├── views +│ └── xxxmodel_views.xml +├── demo +│ └── demo_company.xml +├── models +│ ├── template_xx.py +│ └── __init__.py +├── __init__.py +└── __manifest__.py +``` + +In the first file {file}`models/template_xx.py`, we set the name for the chart of accounts along with some basic fields. + +:::{seealso} +{doc}`Chart Template References ` +::: + +```{eval-rst} +.. example:: + `addons/l10n_be/models/template_be.py <{GITHUB_PATH}/addons/l10n_be/models/template_be.py>`_ + + .. literalinclude:: {ODOO_RELPATH}/addons/l10n_be/models/template_be.py + :condition: odoo_dir_in_path + :language: python + :start-at: _get_be_template_data + :end-before: _get_be_reconcile_model + +``` + +## Chart of Accounts + +### Account tags + +:::{seealso} +{ref}`Account Tag References ` +::: + +Tags are a way to sort accounts. +For example, imagine you want to create a financial report having multiple lines but you have no way to find a rule to dispatch the accounts according to their `code`. +The solution is the usage of tags, one for each report line, to filter accounts like you want. + +Put the tags in the {file}`data/account_account_tag_data.xml` file. + +```{eval-rst} +.. example:: + `addons/l10n_lt/data/template/account.account-lt.csv <{GITHUB_PATH}/addons/l10n_lt/data/template/account.account-lt.csv>`_ + + .. literalinclude:: {ODOO_RELPATH}/addons/l10n_lt/data/template/account.account-lt.csv + :condition: odoo_dir_in_path + :language: csv + :end-at: account_account_template_1201 +``` + +### Accounts + +:::{seealso} +- {ref}`Account References ` +- {doc}`/applications/finance/accounting/get_started/chart_of_accounts` +::: + +Obviously, {guilabel}`Chart of Accounts` cannot exist without {guilabel}`Accounts`. You need to specify them in {file}`data/account.account.template.csv`. + +```{eval-rst} +.. example:: + `addons/l10n_ch/data/template/account.account-ch.csv <{GITHUB_PATH}/addons/l10n_ch/data/template/account.account-ch.csv>`_ + + .. literalinclude:: {ODOO_RELPATH}/addons/l10n_ch/data/template/account.account-ch.csv + :condition: odoo_dir_in_path + :language: csv + :end-at: ch_coa_1171 +``` + +:::{warning} +- Avoid the usage of `asset_cash` `account_type`! + Indeed, the bank & cash accounts are created directly at the installation of the localization module and then, are linked to an `account.journal`. +- Only one account of type payable/receivable is enough for the generic case. We need to define a PoS receivable account as well however. (linked in the CoA) +- Don't create too many accounts: 200-300 is enough. But mostly, we try to find a good balance where the CoA needs minimal adapting for most companies afterwards. +::: + +### Account groups + +:::{seealso} +{ref}`Account Group References ` +::: + +Account groups allow describing the hierarchical structure of the chart of accounts. The filter needs to be activated in the report and then when you decollapse into journal entries it will show the parents of the account. + +It works with the prefix *start*/*end*, so every account where the code starts with something between *start* and *end* will have this `account.group` as the parent group. Furthermore, the account groups can have a parent account group as well to form the hierarchy. + +```{eval-rst} +.. example:: + `addons/l10n_il/data/template/account.group-il.csv <{GITHUB_PATH}/addons/l10n_il/data/template/account.group-il.csv>`_ + + .. csv-table:: + :condition: odoo_dir_in_path + :file: {ODOO_RELPATH}/addons/l10n_il/data/template/account.group-il.csv + :widths: 20,20,20,20,20 + :header-rows: 1 +``` + +### Taxes + +:::{seealso} +- {ref}`Tax References ` +- {doc}`/applications/finance/accounting/taxes/` +::: + +To add taxes you first need to specify tax groups. You normally need just one tax group for every tax rate, except for the 0% as you need to often distinguish between exempt, 0%, not subject, ... taxes. +This model only has two required fields: `name` and `country`. Create the file {file}`data/template/account.tax.group-xx.csv` and list the groups. + +```{eval-rst} +.. example:: + `addons/l10n_uk/data/template/account.tax.group-uk.csv <{GITHUB_PATH}/addons/l10n_uk/data/template/account.tax.group-uk.csv>`_ + + .. literalinclude:: {ODOO_RELPATH}/addons/l10n_uk/data/template/account.tax.group-uk.csv + :condition: odoo_dir_in_path + :language: csv + +``` + +Now you can add the taxes via {file}`data/template/account.tax-xx.csv` file. The first tax you define that is purchase/sale also becomes the default purchase/sale tax for your products. + +```{eval-rst} +.. example:: + `addons/l10n_ae/data/template/account.tax-ae.csv <{GITHUB_PATH}/addons/l10n_ae/data/template/account.tax-ae.csv>`_ + + .. literalinclude:: {ODOO_RELPATH}/addons/l10n_ae/data/template/account.tax-ae.csv + :condition: odoo_dir_in_path + :language: xml + :end-at: uae_sale_tax_5_ras_al_khaima + +``` + +### Tax Report + +```{raw} html +
Enterprise feature
+``` + +The tax report is declared in the {guilabel}`Invoicing` (`account`) app, but the report is only accessible when {guilabel}`Accounting` (`account_accountant`) is installed. + +:::{seealso} +- {doc}`/developer/reference/standard_modules/account/account_report_line` +- {doc}`/applications/finance/accounting/reporting/tax_returns` +::: + +In the previous section, you noticed the fields `invoice_repartition_line_ids` or `refund_repartition_line_ids` and probably understood nothing about them. Good news: you are not alone on this incomprehension. Bad news: you have to figure it out a bit. The topic is complicated. Indeed: + +```{eval-rst} +.. graphviz:: accounting_localization/tax_report.dot + :class: overflow-auto +``` + +The simple version is that, in the tax template, you indicate in the invoice/refund repartition lines whether the base or a percentage of the tax needs to be reported in which report line (through the *minus/plus_report_line_ids* fields). +It becomes clear also when you check the tax configuration in the Odoo interface (or check the docs {ref}`Tax References `, {ref}`Tax Repartition References `). + +So, once you have properly configured taxes, you just need to add the {file}`data/account_tax_report_data.xml` file with a record for your `account.report`. For it to be considered as a tax report, you need to provide it with the right `root_report_id`. + +```xml + + + Tax Report + + + + + ... + +``` + +... followed by the declaration of its lines, as `account.report.line` records. + +```{eval-rst} +.. example:: + `addons/l10n_au/data/account_tax_report_data.xml <{GITHUB_PATH}/addons/l10n_au/data/account_tax_report_data.xml>`_ + + .. literalinclude:: {ODOO_RELPATH}/addons/l10n_au/data/account_tax_report_data.xml + :condition: odoo_dir_in_path + :language: xml + :start-at: tax_report + :end-before: account_tax_report_gstrpt_g3 + + +``` + +### Fiscal positions + +:::{seealso} +- {ref}`Fiscal Position References ` +- {doc}`/applications/finance/accounting/taxes/fiscal_positions` +::: + +Specify fiscal positions in the {file}`data/template/account.fiscal.position-xx.csv` file. + +```{eval-rst} +.. example:: + `addons/l10n_es/data/template/account.fiscal.position-es_common.csv <{GITHUB_PATH}/addons/l10n_es/data/template/account.fiscal.position-es_common.csv>`_ + + .. literalinclude:: {ODOO_RELPATH}/addons/l10n_es/data/template/account.fiscal.position-es_common.csv + :condition: odoo_dir_in_path + :language: csv + :end-at: account_tax_template_p_iva10_sp_ex +``` + +## Final steps + +Finally, you may add a demo company, so the localization can easily be tested in demo mode. + +```{eval-rst} +.. example:: + `addons/l10n_ch/demo/demo_company.xml <{GITHUB_PATH}/addons/l10n_ch/demo/demo_company.xml>`_ + + .. literalinclude:: {ODOO_RELPATH}/addons/l10n_ch/demo/demo_company.xml + :condition: odoo_dir_in_path + :language: xml + :start-after: + :end-before: +``` + +## Accounting reports + +```{raw} html +
Enterprise feature
+``` + +:::{seealso} +{doc}`/applications/finance/accounting/reporting` +::: + +Accounting reports should be added via a separate module `l10n_XX_reports` that should go to the [enterprise repository]({GITHUB_ENT_PATH}). + +Basic {file}`__manifest__.py` file for such a module looks as following: + +```python +{ + "name": "COUNTRY - Accounting Reports", + "category": "Accounting/Localizations/Reporting", + "version": "1.0.0", + "license": "OEEL-1", + "depends": [ + "l10n_XX", "account_reports" + ], + "data": [ + "data/balance_sheet.xml", + "data/profit_and_loss.xml", + ], + "auto_install": True, +} +``` + +Functional overview of financial reports is here: {doc}`/applications/finance/accounting/reporting`. + +Some good examples: + +- [l10n_ch_reports/data/account_financial_html_report_data.xml]({GITHUB_ENT_PATH}/l10n_ch_reports/data/account_financial_html_report_data.xml) +- [l10n_be_reports/data/account_financial_html_report_data.xml]({GITHUB_ENT_PATH}/l10n_be_reports/data/account_financial_html_report_data.xml) + +You can check the meaning of the fields here: + +- {doc}`/developer/reference/standard_modules/account/account_report` +- {doc}`/developer/reference/standard_modules/account/account_report_line` + +If you gave a `root_report_id` to your report, it is now available in its variant selector. If not, +you still need to add a menu item for it. A default menu item can be created from the form view of +the report by clicking on {menuselection}`Actions --> Create Menu Item`. You will then need to +refresh the page to see it. Alternatively, to create a dedicated section for a totally new report in +the {guilabel}`Reporting` menu, you need to create a new `ir.ui.menu` record (usually in the main +`l10n_XX` module) and a new `ir.actions.client` (usually in the new report XML file) that calls the +`account.report` with the new **report id**. Then, set the new menu as `parent_id` field in the +action model. + +```{eval-rst} +.. example:: + * `ir.ui.menu creation <{GITHUB_PATH}/addons/l10n_be/data/menuitem_data.xml>`_ + * `ir.actions.client and menu item creation <{GITHUB_ENT_PATH}/l10n_be_reports/data/partner_vat_listing.xml>`_ +``` + diff --git a/content/developer/howtos/company.md b/content/developer/howtos/company.md new file mode 100644 index 000000000..2117e9f4f --- /dev/null +++ b/content/developer/howtos/company.md @@ -0,0 +1,233 @@ +(reference-howtos-company)= + +# Multi-company Guidelines + +:::{warning} +This tutorial requires good knowledge of Odoo. +Please refer to the {doc}`../tutorials/server_framework_101` tutorial first if needed. +::: + +As of version 13.0, a user can be logged in to multiple companies at once. This allows the user to +access information from multiple companies, but also to create/edit records in a multi-company +environment. + +If not managed correctly, it may be the source of a lot of inconsistent multi-company behaviors. +For instance, a user logged in to both companies A and B could create a sales order in company A and +add products belonging to company B to it. It is only when the user logs out from company B that +access errors will occur for the sales order. + +To correctly manage multi-company behaviors, Odoo's ORM provides multiple features: + +- {ref}`Company-dependent fields ` +- {ref}`Multi-company consistency ` +- {ref}`Default company ` +- {ref}`Views ` +- {ref}`Security rules ` + +(howto-company-company-dependent)= + +## Company-dependent fields + +When a record is available from multiple companies, we must expect that different values will be +assigned to a given field depending on the company from which the value is set. + +For the field of the same record to support several values, it must be defined with the attribute +`company_dependent` set to `True`. + +```python +from odoo import api, fields, models + +class Record(models.Model): + _name = 'record.public' + + info = fields.Text() + company_info = fields.Text(company_dependent=True) + display_info = fields.Text(string='Infos', compute='_compute_display_info') + + @api.depends_context('company') + def _compute_display_info(self): + for record in self: + record.display_info = record.info + record.company_info +``` + +:::{note} +The `_compute_display_info` method is decorated with `depends_context('company')` +(see {attr}`~odoo.api.depends_context`) to ensure that the computed field is recomputed +depending on the current company (`self.env.company`). +::: + +When a company-dependent field is read, the current company is used to retrieve its value. In other +words, if a user is logged in to companies A and B with A as the main company and creates a record for +company B, the value of company-dependent fields will be that of company A. + +To read the values of company-dependent fields set by another company than the current one, we need +to ensure the company we are using is the correct one. This can be done with {meth}`~odoo.models.Model.with_company`, +which updates the current company. + +```python +# Accessed as the main company (self.env.company) +val = record.company_dependent_field + +# Accessed as the desired company (company_B) +val = record.with_company(company_B).company_dependent_field +# record.with_company(company_B).env.company == company_B +``` + +:::{warning} +Whenever you are computing/creating/... things that may behave differently +in different companies, you should make sure whatever you are doing is done +in the right company. It doesn't cost much to always use `with_company` to +avoid problems later. + +```python +@api.onchange('field_name') +def _onchange_field_name(self): + self = self.with_company(self.company_id) + ... + +@api.depends('field_2') +def _compute_field_3(self): + for record in self: + record = record.with_company(record.company_id) + ... +``` +::: + +(howto-company-check-company)= + +## Multi-company consistency + +When a record is made shareable between several companies by the means of a `company_id` field, we +must take care that it cannot be linked to the record of another company through a relational field. +For instance, we do not want to have a sales order and its invoice belonging to different companies. + +To ensure this multi-company consistency, you must: + +- Set the class attribute `_check_company_auto` to `True`. +- Define relational fields with the attribute `check_company` set to `True` if their model has a + `company_id` field. + +On each {meth}`~odoo.models.Model.create` and {meth}`~odoo.models.Model.write`, automatic checks +will be triggered to ensure the multi-company consistency of the record. + +```python +from odoo import fields, models + +class Record(models.Model): + _name = 'record.shareable' + _check_company_auto = True + + company_id = fields.Many2one('res.company') + other_record_id = fields.Many2one('other.record', check_company=True) +``` + +:::{note} +The field `company_id` must not be defined with `check_company=True`. +::: + +```{eval-rst} +.. currentmodule:: odoo.models +``` + +```{eval-rst} +.. automethod:: Model._check_company +``` + +:::{warning} +The `check_company` feature performs a strict check! It means that if a record has no +`company_id` (i.e., the field is not required), it cannot be linked to a record whose +`company_id` is set. +::: + +:::{note} +When no domain is defined on the field and `check_company` is set to `True`, a default domain is +added: `['|', '('company_id', '=', False), ('company_id', '=', company_id)]` +::: + +(howto-company-default-company)= + +## Default company + +When the field `company_id` is made required on a model, a good practice is to set a default +company. It eases the setup flow for the user or even guarantees its validity when the company is +hidden from view. Indeed, the company is usually hidden if the user does not have access to +multiple companies (i.e., when the user does not have the group `base.group_multi_company`). + +```python +from odoo import api, fields, models + +class Record(models.Model): + _name = 'record.restricted' + _check_company_auto = True + + company_id = fields.Many2one( + 'res.company', required=True, default=lambda self: self.env.company + ) + other_record_id = fields.Many2one('other.record', check_company=True) +``` + +(howto-company-views)= + +## Views + +As stated in {ref}`above `, the company is usually hidden +from view if the user does not have access to multiple companies. This is assessed with the group +`base.group_multi_company`. + +```xml + + record.restricted.form + record.restricted + +
+ + + + + + + + +
+
+
+``` + +(howto-company-security)= + +## Security rules + +When working with records shared across companies or restricted to a single company, we must take +care that a user does not have access to records belonging to other companies. + +This is achieved with security rules based on `company_ids`, which contain the current companies of +the user (the companies the user checked in the multi-company widget). + +```xml + + + Shared Record: multi-company + + + + ['|', ('company_id', '=', False), ('company_id', 'in', company_ids)] + + +``` + +```xml + + + Restricted Record: multi-company + + + + [('company_id', 'in', company_ids)] + + +``` + +```{eval-rst} +.. todo:: check_company on company_dependent fields. +``` + diff --git a/content/developer/howtos/connect_device.md b/content/developer/howtos/connect_device.md new file mode 100644 index 000000000..c852ef647 --- /dev/null +++ b/content/developer/howtos/connect_device.md @@ -0,0 +1,189 @@ +# Connect with a device + +IoT Drivers allow any Odoo module to communicate in real-time with any device +connected to the IoT Box. Communication with the IoT Box goes both ways, so the +Odoo client can send commands to and receive information from any of the +supported devices. + +To add support for a device, all we need is: + +- an `Interface`, to detect connected devices of a specific type +- a `Driver`, to communicate with an individual device + +At each boot, the IoT Box will load all of the Interfaces and Drivers that can +be located on the connected Odoo instance. Each module can contain an +`iot_handlers` directory that will be copied to the IoT Box. The structure of +this directory is the following + +```text +your_module +├── ... +└── iot_handlers + ├── drivers + │ ├── DriverName.py + │ └── ... + │ + └── interfaces + ├── InterfaceName.py + └── ... +``` + +## Detect Devices + +Devices connected to the IoT Box are detected through `Interfaces`. There is an +Interface for each supported connection type (USB, Bluetooth, Video, +Printers, Serial, etc.). The interface maintains a list of detected devices +and associates them with the right Driver. + +Supported devices will appear both on the IoT Box Homepage that you can access +through its IP address and in the IoT module of the connected Odoo instance. + +### Interface + +The role of the Interface is to maintain a list of devices connected through a +determined connection type. Creating a new interface requires + +- Extending the `Interface` class +- Setting the `connection_type` class attribute +- Implementing the `get_devices` method, that should return a dictionary + containing data about each detected device. This data will be given as + argument to the constructors and `supported` method of the Drivers. + +:::{note} +Setting the `_loop_delay` attribute will modify the interval between calls +to `get_devices`. By default, this interval is set to 3 seconds. +::: + +```python +from odoo.addons.hw_drivers.interface import Interface + +class InterfaceName(Interface): + connection_type = 'ConnectionType' + + def get_devices(self): + return { + 'device_identifier_1': {...}, + ... + } +``` + +### Driver + +Once the interface has retrieved the list of detected devices, it will loop +through all of the Drivers that have the same `connection_type` attribute and +test their respective `supported` method on all detected devices. If the +supported method of a Driver returns `True`, an instance of this Driver will be +created for the corresponding device. + +:::{note} +`supported` methods of drivers are given a priority order. The `supported` +method of a child class will always be tested before the one of its parent. +This priority can be adjusted by modifying the `priority` attribute of the +Driver. +::: + +Creating a new Driver requires: + +- Extending `Driver` +- Setting the `connection_type` class attribute. +- Setting the `device_type`, `device_connection` and `device_name` attributes. +- Defining the `supported` method + +```python +from odoo.addons.hw_drivers.driver import Driver + +class DriverName(Driver): + connection_type = 'ConnectionType' + + def __init__(self, identifier, device): + super(NewDriver, self).__init__(identifier, device) + self.device_type = 'DeviceType' + self.device_connection = 'DeviceConnection' + self.device_name = 'DeviceName' + + @classmethod + def supported(cls, device): + ... +``` + +## Communicate With Devices + +Once your new device is detected and appears in the IoT module, the next step +is to communicate with it. Since the box only has a local IP address, it can +only be reached from the same local network. Communication, therefore, needs to +happen on the browser-side, in JavaScript. + +The process depends on the direction of the communication: +\- From the browser to the box, through [Actions] +\- From the box to the browser, through [Longpolling] + +Both channels are accessed from the same JS object, the `DeviceProxy`, which is +instantiated using the IP of the IoT Box and the device identifier. + +```javascript +var DeviceProxy = require('iot.DeviceProxy'); + +var iot_device = new DeviceProxy({ + iot_ip: iot_ip, + identifier: device_identifier +}); +``` + +### Actions + +Actions are used to tell a selected device to execute a specific action, +such as taking a picture, printing a receipt, etc. + +:::{note} +It must be noted that no “answer” will be sent by the box on this route, +only the request status. The answer to the action, if any, has to be +retrieved via the longpolling. +::: + +An action can be performed on the DeviceProxy Object. + +```javascript +iot_device.action(data); +``` + +In your driver, define an `action` method that will be executed when called +from an Odoo module. It takes the data given during the call as argument. + +```python +def action(self, data): + ... +``` + +### Longpolling + +When any module in Odoo wants to read data from a specific device, it creates a +listener identified by the IP/domain of the box and the device identifier and +passes it a callback function to be called every time the device status +changes. The callback is called with the new data as argument. + +```javascript +iot_device.add_listener(this._onValueChange.bind(this)); + +_onValueChange: function (result) { + ... +} +``` + +In the Driver, an event is released by calling the `device_changed` function +from the `event_manager`. All callbacks set on the listener will then be called +with `self.data` as argument. + +```python +from odoo.addons.hw_drivers.event_manager import event_manager + +class DriverName(Driver): + connection_type = 'ConnectionType' + + def methodName(self): + self.data = { + 'value': 0.5, + ... + } + event_manager.device_changed(self) +``` + diff --git a/content/developer/howtos/create_reports.md b/content/developer/howtos/create_reports.md new file mode 100644 index 000000000..af06c0297 --- /dev/null +++ b/content/developer/howtos/create_reports.md @@ -0,0 +1,119 @@ +# Create customized reports + +SQL views are a technique for creating customized reports to show data that cannot be +shown with existing models' fields and views. In other words, this technique helps avoid +unnecessary creation and calculation of additional fields solely for data analysis +purposes. + +## Create a model + +A SQL view is created in a similar manner as a standard model: + +```python +from odoo import fields, models + + +class ModuleReport(models.Model): + _name = 'module.report' + _description = "Module Report" + _rec_name = 'module_field' + _auto = False +``` + +Where the attributes: + +- `_auto = False` indicates that we do not want to store the model in the database +- `_rec_name` indicates which of the model's fields represents a record's name (i.e. the + name that will be used in the navigation breadcrumb when opening a record's form view) + +and its fields are defined in the same way as a standard model, except every field is +marked as `readonly=True`. + +:::{note} +Don't forget to add your new model to your security file. +::: + +## Populate the model + +There are 2 ways to populate a SQL view's table: + +- override the `BaseModel.init()` method, +- set the `_table_query` property. + +Regardless of which way is used, a SQL query will be executed to populate the model. +Therefore, any SQL commands can be used to collect and/or calculate the data needed +and you are expected to keep in mind that you are bypassing the ORM (i.e. it is a +good idea to read through {ref}`reference/security` if you haven't already). The columns +returned from the `SELECT` will populate the model's fields, so ensure that your column +names match your field names, or use alias names that match. + +```{eval-rst} +.. tabs:: + + .. tab:: Overriding `BaseModel.init()` + + In most cases, overriding the `BaseModel.init()` method is the standard and better option to + use. It requires the import of `tools` and is typically written as follows: + + .. code-block:: python + + def init(self): + tools.drop_view_if_exists(self.env.cr, self._table) + self.env.cr.execute("""CREATE or REPLACE VIEW %s as ( + SELECT + %s + FROM + %s + )""" % (self._table, self._select(), self._from())) + + `tools.drop_view_if_exists` ensures that a conflicting view is not created when the + SQL query is executed. It is standard to separate the different parts of the query to + allow for easier model extension. Exactly how the query is split up across methods is not + standardized, but at minimum, the `_select` and `_from` methods are common, and of course, + all these methods will return strings. + + .. seealso:: + `Example: a SQL view using an override of BaseModel.init() + <{GITHUB_PATH}/addons/project/report/project_report.py>`_ + + .. tab:: Using `_table_query` + + The ``_table_query`` property is used when the view depends on the context. It is typically + written as follows: + + .. code-block:: python + + @property + def _table_query(self): + return 'SELECT %s FROM %s' % (self._select(), self._from()) + + and follows the same `_select` and `_from` methods standards as `BaseModel.init()`. + + An example of when the property should be used instead of overriding `BaseModel.init()` + is in a multi-company and multi-currency environment where currency related amounts need + to be converted using currency exchange rates when the user switches between companies. + + .. seealso:: + `Example: a SQL view using _table_query + <{GITHUB_PATH}/addons/account/report/account_invoice_report.py>`_ +``` + +## Use the model + +Views and menu items for your SQL views are created and used in the same way as any +other Odoo model. You are all set to start using your SQL view. Have fun! + +## Extra tips + +:::{tip} +A common mistake in SQL views is not considering the duplication of certain data +due to table JOINs. This can lead to miscounting when using a field's `aggregator` +and/or the pivot view. It is best to test your SQL view with sufficient data to ensure the +resulting field values are as you expect. +::: + +:::{tip} +If you have a field that you do not want as a measure (i.e., in your pivot or graph views), add +`store=False` to it, and it will not show. +::: + diff --git a/content/developer/howtos/frontend_owl_components.md b/content/developer/howtos/frontend_owl_components.md new file mode 100644 index 000000000..e2265f072 --- /dev/null +++ b/content/developer/howtos/frontend_owl_components.md @@ -0,0 +1,174 @@ +# Use Owl components on the portal and website + +In this article, you will learn how you can leverage Owl components on the portal +and website. + +## Overview + +To use Owl components on the website or portal, you will need to do a few things: + +- Create your Owl component and register it in the `public_components` registry +- Add that component to the `web.assets_frontend` bundle +- Add an `` tag to a website or portal page to use the component + +## 1. Creating the Owl component + +To keep things simple, let's start with a very straightforward component that just renders +"Hello, World!". This will let us know at a glance if our setup is working. + +First, create the template in {file}`/your_module/static/src/portal_component/your_component.xml`. + +```xml + + + + Hello, World! + + +``` + +Then create the JavaScript file for that component in {file}`/your_module/static/src/portal_component/your_component.js`, +and add it to the `public_components` registry: + +```js +import { Component } from "@odoo/owl"; +import { registry } from "@web/core/registry" + +export class YourComponent extends Component { + static template = "your_module.YourComponent"; + static props = {}; +} + +registry.category("public_components").add("your_module.YourComponent", YourComponent); +``` + +:::{seealso} +{ref}`Owl components reference`. +::: + +## 2. Adding your component to the `web.assets_frontend` bundle + +The `web.assets_frontend` bundle is the assets bundle that is used by the portal and +website, you'll want to add your component's code to that bundle so that the public +components service can find your component and mount it. In your module's manifest, +in the assets section, add an entry for `web.assets_frontend` and add your component's +files: + +```py +{ + # ... + 'assets': { + 'web.assets_frontend': [ + 'your_module/static/src/portal_component/**/*', + ], + } +} +``` + +:::{seealso} +{ref}`Module manifest reference`. +::: + +## 3. Adding an `` tag to a page + +Now we need add an `` tag that will serve as the target for the component +to be mounted. For the sake of this example, we'll add it directly to the portal's +home page with an xpath in {file}`/your_module/views/templates.xml`. + +```xml + + + + +``` + +Don't forget to add this file to the data section of your assets bundle: + +```py +{ + # ... + 'data': { + 'views/templates.xml', + } +} +``` + +And that's it! If you open the home page of the portal you should see the message +"Hello, World!" at the top of the page. + +## Points of caution + +Owl components are rendered entirely in JavaScript by the browser. This can cause +some issues: + +- Layout shift +- Poorer indexing by search engines + +For these reasons, you should only use Owl components on the portal and website for +specific use cases described below. + +### Layout shift + +When a page initially renders content, and that content subsequently moves ("shifts") +within the page, this is referred to as a layout shift. When using Owl components in +the portal or website, all of the HTML that surrounds the Owl component is rendered +by the server and is the first thing that will be displayed to the user. When JavaScript +starts running, Owl will mount your component, which will likely cause the surrounding +elements to move around on the page. This can cause poor user experience: the user sees +an element on the page that was initially rendered and with which they want to interact, +so they move their cursor or finger above that element. Just as they're about to click, +the Owl component is mounted, and the element they want to interact with is moved. +They click and interact with the Owl app instead. + +This can be a frustrating experience, so you should be careful when designing your +page that the Owl component will not move elements around. This can be achieved in +various ways, e.g. by positioning it below all other existing elements, not having +other interactive elements around, or reserving a fixed space for the Owl component +using CSS. + +:::{seealso} +[Cumulative Layout Shift on web.dev](https://web.dev/articles/cls) +::: + +### Poorer indexing by search engines + +When search engines build their index of the content of the web, they use web crawlers +to find pages and analyze their content to show these pages in their +search results. While modern search engines are generally capable of executing JavaScript +code and should generally be able to view and index content rendered in JavaScript, +they may not index the content as fast and penalize the page in search results. + +Because most search engines do not reveal the exact way that they crawl and index +web pages, it's not always easy to know the extent of the impact that client-side rendering +can have on your search engine scores. While it's unlikely to make or break your SEO +strategy, you should still only use Owl components when they are adding real value +over server-side rendering. + +## When to use Owl components on the portal and website + +As explained in the previous sections, using Owl component can slightly degrade user +experience if you're not careful and may also hinder your SEO. So when should you +choose to use Owl components in these places? Here are some general guidelines. + +### When you don't care about SEO + +If a page cannot be indexed by search engines because it's not available to the public, +e.g. anything in the user portal, SEO performance is not a concern, as web crawlers +cannot access these pages anyway. There are also some things that you do not want or +care about indexing, e.g. if you want to have a page where the user can choose a date +and time for an appointment, you probably don't want search engines to index the dates +on which an appointment is possible at a specific moment in time. + +### When you need strong interactivity + +The decision to use Owl is a trade-off between the previously mentioned disadvantages +and the effort that Owl saves you by making it easy to build richly interactive user +experiences. The main reason to use Owl is when you want to build an interface that +can react in real time to user inputs without requiring the page to reload. If you +mainly want to show static content to the user, you probably shouldn't use an Owl +component. + diff --git a/content/developer/howtos/javascript_client_action.md b/content/developer/howtos/javascript_client_action.md new file mode 100644 index 000000000..bc6dc2b8a --- /dev/null +++ b/content/developer/howtos/javascript_client_action.md @@ -0,0 +1,47 @@ +(howtos-javascript-client-action)= + +# Create a client action + +A client action triggers an action that is entirely implemented in the client side. +One of the benefits of using a client action is the ability to create highly customized interfaces +with ease. A client action is typically defined by an OWL component; we can also use the web +framework and use services, core components, hooks,... + +1. Create the {ref}`client action `, don't forget to + make it accessible. + + ```xml + + My Client Action + my_module.MyClientAction + + ``` + +2. Create a component that represents the client action. + + ```{code-block} js + :caption: :file:`my_client_action.js` + + import { registry } from "@web/core/registry"; + + import { Component } from "@odoo/owl"; + + class MyClientAction extends Component { + static template = "my_module.clientaction"; + } + + // remember the tag name we put in the first step + registry.category("actions").add("my_module.MyClientAction", MyClientAction); + ``` + + ```{code-block} xml + :caption: :file:`my_client_action.xml` + + + + + Hello world + + + ``` + diff --git a/content/developer/howtos/javascript_field.md b/content/developer/howtos/javascript_field.md new file mode 100644 index 000000000..8fe315d9a --- /dev/null +++ b/content/developer/howtos/javascript_field.md @@ -0,0 +1,102 @@ +# Customize a field + +## Subclass an existing field component + +Let's take an example where we want to extends the `BooleanField` to create a boolean field +displaying "Late!" in red whenever the checkbox is checked. + +1. Create a new widget component extending the desired field component. + + ```{code-block} javascript + :caption: :file:`late_order_boolean_field.js` + + import { registry } from "@web/core/registry"; + import { BooleanField } from "@web/views/fields/boolean/boolean_field"; + import { Component, xml } from "@odoo/owl"; + + class LateOrderBooleanField extends BooleanField { + static template = "my_module.LateOrderBooleanField"; + } + ``` + +2. Create the field template. + + The component uses a new template with the name `my_module.LateOrderBooleanField`. Create it by + inheriting the current template of the `BooleanField`. + + ```{code-block} xml + :caption: :file:`late_order_boolean_field.xml` + + + + + + Late! + + + + ``` + +3. Register the component to the fields registry. + + ```{code-block} + :caption: :file:`late_order_boolean_field.js` + + registry.category("fields").add("late_boolean", LateOrderBooleanField); + ``` + +4. Add the widget in the view arch as an attribute of the field. + + ```xml + + ``` + +## Create a new field component + +Assume that we want to create a field that displays a simple text in red. + +1. Create a new Owl component representing our new field + + ```{code-block} js + :caption: :file:`my_text_field.js` + + import { standardFieldProps } from "@web/views/fields/standard_field_props"; + import { Component, xml } from "@odoo/owl"; + import { registry } from "@web/core/registry"; + + export class MyTextField extends Component { + static template = xml` + + `; + static props = { ...standardFieldProps }; + static supportedTypes = ["char"]; + + /** + * @param {boolean} newValue + */ + onChange(newValue) { + this.props.update(newValue); + } + } + ``` + + The imported `standardFieldProps` contains the standard props passed by the `View` such as + the `update` function to update the value, the `type` of the field in the model, the + `readonly` boolean, and others. + +2. In the same file, register the component to the fields registry. + + ```{code-block} js + :caption: :file:`my_text_field.js` + + registry.category("fields").add("my_text_field", MyTextField); + ``` + + This maps the widget name in the arch to its actual component. + +3. Add the widget in the view arch as an attribute of the field. + + ```xml + + ``` + diff --git a/content/developer/howtos/javascript_view.md b/content/developer/howtos/javascript_view.md new file mode 100644 index 000000000..4ece02f52 --- /dev/null +++ b/content/developer/howtos/javascript_view.md @@ -0,0 +1,264 @@ +# Customize a view type + +## Subclass an existing view + +Assume we need to create a custom version of a generic view. For example, a kanban view with some +extra ribbon-like widget on top (to display some specific custom information). In that case, this +can be done in a few steps: + +1. Extend the kanban controller/renderer/model and register it in the view registry. + + ```{code-block} js + :caption: :file:`custom_kanban_controller.js` + + import { KanbanController } from "@web/views/kanban/kanban_controller"; + import { kanbanView } from "@web/views/kanban/kanban_view"; + import { registry } from "@web/core/registry"; + + // the controller usually contains the Layout and the renderer. + class CustomKanbanController extends KanbanController { + static template = "my_module.CustomKanbanView"; + + // Your logic here, override or insert new methods... + // if you override setup(), don't forget to call super.setup() + } + + export const customKanbanView = { + ...kanbanView, // contains the default Renderer/Controller/Model + Controller: CustomKanbanController, + }; + + // Register it to the views registry + registry.category("views").add("custom_kanban", customKanbanView); + ``` + + In our custom kanban, we defined a new template. We can either inherit the kanban controller + template and add our template pieces or we can define a completely new template. + + ```{code-block} xml + :caption: :file:`custom_kanban_controller.xml` + + + + + +
+ Hello world ! +
+
+
+
+ ``` + +2. Use the view with the `js_class` attribute in arch. + + ```xml + + + + + + + + ``` + +The possibilities for extending views are endless. While we have only extended the controller +here, you can also extend the renderer to add new buttons, modify how records are presented, or +customize the dropdown, as well as extend other components such as the model and `buttonTemplate`. + +## Create a new view from scratch + +Creating a new view is an advanced topic. This guide highlight only the essential steps. + +1. Create the controller. + + > The primary role of a controller is to facilitate the coordination between various components + > of a view, such as the Renderer, Model, and Layout. + + ```{code-block} js + :caption: :file:`beautiful_controller.js` + + import { Layout } from "@web/search/layout"; + import { useService } from "@web/core/utils/hooks"; + import { Component, onWillStart, useState} from "@odoo/owl"; + + export class BeautifulController extends Component { + static template = "my_module.View"; + static components = { Layout }; + + setup() { + this.orm = useService("orm"); + + // The controller create the model and make it reactive so whenever this.model is + // accessed and edited then it'll cause a rerendering + this.model = useState( + new this.props.Model( + this.orm, + this.props.resModel, + this.props.fields, + this.props.archInfo, + this.props.domain + ) + ); + + onWillStart(async () => { + await this.model.load(); + }); + } + } + ``` + + The template of the Controller displays the control panel with Layout and also the + renderer. + + ```{code-block} xml + :caption: :file:`beautiful_controller.xml` + + + + + + + + + + ``` + +2. Create the renderer. + + > The primary function of a renderer is to generate a visual representation of data by rendering + > the view that includes records. + + ```{code-block} js + :caption: :file:`beautiful_renderer.js` + + import { Component } from "@odoo/owl"; + export class BeautifulRenderer extends Component { + static template = "my_module.Renderer"; + } + ``` + + ```{code-block} xml + :caption: :file:`beautiful_renderer.xml` + + + + + + + // Show records + + + + ``` + +3. Create the model. + + The role of the model is to retrieve and manage all the necessary data in the view. + + ```{code-block} js + :caption: :file:`beautiful_model.js` + + import { KeepLast } from "@web/core/utils/concurrency"; + + export class BeautifulModel { + constructor(orm, resModel, fields, archInfo, domain) { + this.orm = orm; + this.resModel = resModel; + // We can access arch information parsed by the beautiful arch parser + const { fieldFromTheArch } = archInfo; + this.fieldFromTheArch = fieldFromTheArch; + this.fields = fields; + this.domain = domain; + this.keepLast = new KeepLast(); + } + + async load() { + // The keeplast protect against concurrency call + const { length, records } = await this.keepLast.add( + this.orm.webSearchRead(this.resModel, this.domain, [this.fieldsFromTheArch], {}) + ); + this.records = records; + this.recordsLength = length; + } + } + ``` + + :::{note} + For advanced cases, instead of creating a model from scratch, it is also possible to use + `RelationalModel`, which is used by other views. + ::: + +4. Create the arch parser. + + The role of the arch parser is to parse the arch view so the view has access to the information. + + ```{code-block} js + :caption: :file:`beautiful_arch_parser.js` + + import { XMLParser } from "@web/core/utils/xml"; + + export class BeautifulArchParser extends XMLParser { + parse(arch) { + const xmlDoc = this.parseXML(arch); + const fieldFromTheArch = xmlDoc.getAttribute("fieldFromTheArch"); + return { + fieldFromTheArch, + }; + } + } + ``` + +5. Create the view and combine all the pieces together, then register the view in the views + registry. + + ```{code-block} js + :caption: :file:`beautiful_view.js` + + import { registry } from "@web/core/registry"; + import { BeautifulController } from "./beautiful_controller"; + import { BeautifulArchParser } from "./beautiful_arch_parser"; + import { BeautifylModel } from "./beautiful_model"; + import { BeautifulRenderer } from "./beautiful_renderer"; + + export const beautifulView = { + type: "beautiful", + display_name: "Beautiful", + icon: "fa fa-picture-o", // the icon that will be displayed in the Layout panel + multiRecord: true, + Controller: BeautifulController, + ArchParser: BeautifulArchParser, + Model: BeautifulModel, + Renderer: BeautifulRenderer, + + props(genericProps, view) { + const { ArchParser } = view; + const { arch } = genericProps; + const archInfo = new ArchParser().parse(arch); + + return { + ...genericProps, + Model: view.Model, + Renderer: view.Renderer, + archInfo, + }; + }, + }; + + registry.category("views").add("beautifulView", beautifulView); + ``` + +6. Declare the {ref}`view ` in the arch. + + ```xml + ... + + my_view + my_model + + + + + ... + ``` + diff --git a/content/developer/howtos/scss_tips.md b/content/developer/howtos/scss_tips.md new file mode 100644 index 000000000..e0ad49e88 --- /dev/null +++ b/content/developer/howtos/scss_tips.md @@ -0,0 +1,243 @@ +# Write lean easy-to-maintain CSS + +There are many ways to lean and simplify SCSS. The first step is to establish if custom code is +needed at all. + +Odoo's webclient has been designed to be modular, meaning that (potentially all) classes can be +shared across views. Check the code before creating a new class. Chances are that there is already a +class or an HTML tag doing exactly what you're looking for. + +On top of that, Odoo relies on [Bootstrap](https://getbootstrap.com/docs/5.1/getting-started/introduction/) (BS), one of the most complete +CSS frameworks available. The framework has been customized in order to match Odoo's design (both +community and enterprise versions), meaning that you can use any BS class directly in Odoo and +achieve a visual result that is consistent with our UI. + +:::{warning} +- The fact that a class achieves the desired visual result doesn't necessarily mean that it's the + right one for the job. Be aware of classes triggering JS behaviors, for example. +- Be careful about class semantics. Applying a **button class** to a **title** is not only + semantically wrong, it may also lead to migration issues and visual inconsistencies. +::: + +The following sections describe tips to strip-down SCSS lines **when custom-code is the only way to +go**. + +(tutorials-scss-tips-browser-defaults)= + +## Browser defaults + +By default, each browser renders content using a *user agent stylesheet*. To overcome +inconsistencies between browsers, some of these rules are overridden by [Bootstrap Reboot](https://getbootstrap.com/docs/5.1/content/reboot/). + +At this stage all "browser-specific-decoration" rules have been stripped away, but a big chunk of +rules defining basic layout information is maintained (or reinforced by *Reboot* for consistency +reasons). + +You can rely on these rules. + +```{eval-rst} +.. example:: + + Applying `display: block;` to a `
` is normally not necessary. + + .. code-block:: css + + div.element { + display: block; + /* not needed 99% of the time */ + } +``` + +```{eval-rst} +.. example:: + + In this instance, you may opt to switching the HTML tag rather than adding a new CSS rule. + + .. code-block:: css + + span.element { + display: block; + /* replace with
instead + to get 'display: block' by default */ + } +``` + +Here's a non-comprehensive list of default rules: + +```{eval-rst} +.. list-table:: + :header-rows: 1 + + * - Tag / Attribute + - Defaults + * - `
`, `
`, `
`, `